summaryrefslogtreecommitdiff
path: root/trove/tests/unittests/instance/test_service.py
diff options
context:
space:
mode:
Diffstat (limited to 'trove/tests/unittests/instance/test_service.py')
-rw-r--r--trove/tests/unittests/instance/test_service.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/trove/tests/unittests/instance/test_service.py b/trove/tests/unittests/instance/test_service.py
new file mode 100644
index 00000000..aa0af8de
--- /dev/null
+++ b/trove/tests/unittests/instance/test_service.py
@@ -0,0 +1,129 @@
+# Copyright 2020 Catalyst Cloud
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from datetime import timedelta
+from unittest import mock
+
+from trove.common import cfg
+from trove.common import timeutils
+from trove.datastore import models as ds_models
+from trove.instance import models as ins_models
+from trove.instance import service
+from trove.instance import service_status as srvstatus
+from trove.tests.unittests import trove_testtools
+from trove.tests.unittests.util import util
+
+CONF = cfg.CONF
+
+
+class TestInstanceController(trove_testtools.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ util.init_db()
+
+ cls.ds_name = cls.random_name('datastore',
+ prefix='TestInstanceController')
+ ds_models.update_datastore(name=cls.ds_name, default_version=None)
+ cls.ds = ds_models.Datastore.load(cls.ds_name)
+
+ ds_models.update_datastore_version(
+ cls.ds_name, 'test_image_id', 'mysql', cls.random_uuid(), '', 1)
+
+ cls.ds_version_imageid = ds_models.DatastoreVersion.load(
+ cls.ds, 'test_image_id')
+
+ cls.controller = service.InstanceController()
+
+ super(TestInstanceController, cls).setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ util.cleanup_db()
+
+ super(TestInstanceController, cls).tearDownClass()
+
+ def setUp(self):
+ trove_testtools.patch_notifier(self)
+ super(TestInstanceController, self).setUp()
+
+ @mock.patch('trove.instance.models.load_server_group_info')
+ @mock.patch('trove.instance.models.load_guest_info')
+ @mock.patch('trove.instance.models.load_simple_instance_addresses')
+ @mock.patch('trove.instance.models.load_simple_instance_server_status')
+ def test_show_with_restart_required(self, load_server_mock,
+ load_addr_mock, load_guest_mock,
+ load_server_grp_mock):
+ # Create an instance in db.
+ instance = ins_models.DBInstance.create(
+ name=self.random_name('instance'),
+ flavor_id=self.random_uuid(),
+ tenant_id=self.random_uuid(),
+ volume_size=1,
+ datastore_version_id=self.ds_version_imageid.id,
+ task_status=ins_models.InstanceTasks.NONE,
+ compute_instance_id=self.random_uuid(),
+ server_status='ACTIVE'
+ )
+ ins_models.InstanceServiceStatus.create(
+ instance_id=instance.id,
+ status=srvstatus.ServiceStatuses.RESTART_REQUIRED,
+ )
+
+ # workaround to reset updated_at field.
+ service_status = ins_models.InstanceServiceStatus.find_by(
+ instance_id=instance.id)
+ service_status.updated_at = timeutils.utcnow() - timedelta(
+ seconds=(CONF.agent_heartbeat_expiry + 60))
+ ins_models.get_db_api().save(service_status)
+
+ ret = self.controller.show(mock.MagicMock(), mock.ANY, instance.id)
+ self.assertEqual(200, ret.status)
+
+ ret_instance = ret.data(None)['instance']
+ self.assertEqual('RESTART_REQUIRED', ret_instance.get('status'))
+
+ @mock.patch('trove.instance.models.load_server_group_info')
+ @mock.patch('trove.instance.models.load_guest_info')
+ @mock.patch('trove.instance.models.load_simple_instance_addresses')
+ @mock.patch('trove.instance.models.load_simple_instance_server_status')
+ def test_show_without_restart_required(self, load_server_mock,
+ load_addr_mock, load_guest_mock,
+ load_server_grp_mock):
+ # Create an instance in db.
+ instance = ins_models.DBInstance.create(
+ name=self.random_name('instance'),
+ flavor_id=self.random_uuid(),
+ tenant_id=self.random_uuid(),
+ volume_size=1,
+ datastore_version_id=self.ds_version_imageid.id,
+ task_status=ins_models.InstanceTasks.NONE,
+ compute_instance_id=self.random_uuid(),
+ server_status='ACTIVE'
+ )
+ ins_models.InstanceServiceStatus.create(
+ instance_id=instance.id,
+ status=srvstatus.ServiceStatuses.HEALTHY,
+ )
+
+ # workaround to reset updated_at field.
+ service_status = ins_models.InstanceServiceStatus.find_by(
+ instance_id=instance.id)
+ service_status.updated_at = timeutils.utcnow() - timedelta(
+ seconds=(CONF.agent_heartbeat_expiry + 60))
+ ins_models.get_db_api().save(service_status)
+
+ ret = self.controller.show(mock.MagicMock(), mock.ANY, instance.id)
+ self.assertEqual(200, ret.status)
+
+ ret_instance = ret.data(None)['instance']
+ self.assertEqual('ERROR', ret_instance.get('status'))