From 65c63a9351bf78db40f4797b064c7d21fca3ac35 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Mon, 5 Jun 2017 11:40:05 +0800
Subject: [PATCH] fix multinode tempest test failure
fix all five tempest tests:
watcher_tempest_plugin.tests.api.admin.test_service.
TestShowListService.test_show_service
watcher_tempest_plugin.tests.api.admin.test_service.
TestShowListService.test_show_service_with_links
tearDownClass (watcher_tempest_plugin.tests.api.admin.
test_action_plan.TestCreateDeleteExecuteActionPlan)
watcher_tempest_plugin.tests.scenario.test_execute_basic_optim
.TestExecuteBasicStrategy.test_execute_basic_action_plan
watcher_tempest_plugin.tests.scenario.test_execute_workload_balancing
.TestExecuteWorkloadBalancingStrategy
.test_execute_workload_stabilization
Change-Id: I4d8945cf2dedea3fa32029d6c07d24a411c1f2e4
Closes-Bug: #1695225
---
watcher/common/utils.py | 5 ++++-
.../strategies/workload_stabilization.py | 18 +++++++++-------
.../tests/api/admin/base.py | 16 ++++++++------
.../tests/api/admin/test_action_plan.py | 3 ++-
.../tests/api/admin/test_service.py | 21 +++++++++++++++++--
5 files changed, 46 insertions(+), 17 deletions(-)
diff --git a/watcher/common/utils.py b/watcher/common/utils.py
index ff9cdc110..ae4438f39 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 9621d79a3..7e3e96f40 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 d5910352a..75e57b9e2 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 532221ef6..b31b5df66 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 3d1d8316e..948d8b1a2 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']),