diff --git a/watcher/common/utils.py b/watcher/common/utils.py index ff9cdc1..ae4438f 100644 --- a/watcher/common/utils.py +++ b/watcher/common/utils.py @@ -111,7 +111,7 @@ def extend_with_default(validator_class): def set_defaults(validator, properties, instance, schema): for prop, subschema in properties.items(): - if "default" in subschema: + if "default" in subschema and instance is not None: instance.setdefault(prop, subschema["default"]) for error in validate_properties( @@ -128,6 +128,9 @@ def extend_with_strict_schema(validator_class): validate_properties = validator_class.VALIDATORS["properties"] def strict_schema(validator, properties, instance, schema): + if instance is None: + return + for para in instance.keys(): if para not in properties.keys(): raise exception.AuditParameterNotAllowed(parameter=para) diff --git a/watcher/decision_engine/strategy/strategies/workload_stabilization.py b/watcher/decision_engine/strategy/strategies/workload_stabilization.py index 9621d79..7e3e96f 100644 --- a/watcher/decision_engine/strategy/strategies/workload_stabilization.py +++ b/watcher/decision_engine/strategy/strategies/workload_stabilization.py @@ -308,13 +308,17 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy): ) if avg_meter is None: - raise exception.NoSuchMetricForHost( - metric=meter_name, - host=node_id) - if meter_name == 'hardware.memory.used': - avg_meter /= oslo_utils.units.Ki - if meter_name == 'compute.node.cpu.percent': - avg_meter /= 100 + if meter_name == 'hardware.memory.used': + avg_meter = node.memory + if meter_name == 'compute.node.cpu.percent': + avg_meter = 1 + LOG.warning('No values returned by node %s for %s', + node_id, meter_name) + else: + if meter_name == 'hardware.memory.used': + avg_meter /= oslo_utils.units.Ki + if meter_name == 'compute.node.cpu.percent': + avg_meter /= 100 hosts_load[node_id][metric] = avg_meter return hosts_load diff --git a/watcher_tempest_plugin/tests/api/admin/base.py b/watcher_tempest_plugin/tests/api/admin/base.py index d591035..75e57b9 100644 --- a/watcher_tempest_plugin/tests/api/admin/base.py +++ b/watcher_tempest_plugin/tests/api/admin/base.py @@ -81,12 +81,16 @@ class BaseInfraOptimTest(test.BaseTestCase): ap['uuid'] for ap in action_plans['action_plans']) for action_plan in action_plans['action_plans']: - test_utils.call_until_true( - func=functools.partial( - cls.is_action_plan_idle, action_plan['uuid']), - duration=30, - sleep_for=.5 - ) + try: + test_utils.call_until_true( + func=functools.partial( + cls.is_action_plan_idle, action_plan['uuid']), + duration=30, + sleep_for=.5 + ) + except Exception: + action_plans_to_be_deleted.remove( + action_plan['uuid']) # Phase 2: Delete them all for action_plan_uuid in action_plans_to_be_deleted: diff --git a/watcher_tempest_plugin/tests/api/admin/test_action_plan.py b/watcher_tempest_plugin/tests/api/admin/test_action_plan.py index 532221e..b31b5df 100644 --- a/watcher_tempest_plugin/tests/api/admin/test_action_plan.py +++ b/watcher_tempest_plugin/tests/api/admin/test_action_plan.py @@ -124,7 +124,8 @@ class TestShowListActionPlan(base.BaseInfraOptimTest): ) _, action_plans = cls.client.list_action_plans( audit_uuid=cls.audit['uuid']) - cls.action_plan = action_plans['action_plans'][0] + if len(action_plans['action_plans']) > 0: + cls.action_plan = action_plans['action_plans'][0] @decorators.attr(type='smoke') def test_show_action_plan(self): diff --git a/watcher_tempest_plugin/tests/api/admin/test_service.py b/watcher_tempest_plugin/tests/api/admin/test_service.py index 3d1d831..948d8b1 100644 --- a/watcher_tempest_plugin/tests/api/admin/test_service.py +++ b/watcher_tempest_plugin/tests/api/admin/test_service.py @@ -38,7 +38,15 @@ class TestShowListService(base.BaseInfraOptimTest): @decorators.attr(type='smoke') def test_show_service(self): - _, service = self.client.show_service(self.DECISION_ENGINE) + _, body = self.client.list_services() + self.assertIn('services', body) + services = body['services'] + self.assertIn(self.DECISION_ENGINE, + [i['name'] for i in body['services']]) + + service_id = filter(lambda x: self.DECISION_ENGINE == x['name'], + services)[0]['id'] + _, service = self.client.show_service(service_id) self.assertEqual(self.DECISION_ENGINE, service['name']) self.assertIn("host", service.keys()) @@ -47,7 +55,16 @@ class TestShowListService(base.BaseInfraOptimTest): @decorators.attr(type='smoke') def test_show_service_with_links(self): - _, service = self.client.show_service(self.DECISION_ENGINE) + _, body = self.client.list_services() + self.assertIn('services', body) + services = body['services'] + self.assertIn(self.DECISION_ENGINE, + [i['name'] for i in body['services']]) + + service_id = filter(lambda x: self.DECISION_ENGINE == x['name'], + services)[0]['id'] + _, service = self.client.show_service(service_id) + self.assertIn('links', service.keys()) self.assertEqual(2, len(service['links'])) self.assertIn(str(service['id']),