From 38a3cbc84a59bca4516358a788de50aca17f7cb5 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Mon, 20 Mar 2017 12:17:34 +0800
Subject: [PATCH] exception when running 'watcher service list'
We have two controllers as HA in our OpenStack environment.
There are watcher-applier and watcher-decision-engine in each
controller. So there are two same name in the services table.
In this case, the objects.Service.get_by_name(context, name)
will trigger exception of MultipleResultsFound.
We should use objects.Service.get(context, id) replace of
objects.Service.get_by_name(context, name).
Change-Id: Ic3ce784590d6c2a648cb3b28299744deed281332
Closes-Bug: #1674196
---
watcher/api/controllers/v1/service.py | 6 +++---
watcher/tests/api/v1/test_services.py | 11 ++++++++---
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/watcher/api/controllers/v1/service.py b/watcher/api/controllers/v1/service.py
index 9933704ee..b843af160 100644
--- a/watcher/api/controllers/v1/service.py
+++ b/watcher/api/controllers/v1/service.py
@@ -56,8 +56,8 @@ class Service(base.APIBase):
def _get_status(self):
return self._status
- def _set_status(self, name):
- service = objects.Service.get_by_name(pecan.request.context, name)
+ def _set_status(self, id):
+ service = objects.Service.get(pecan.request.context, id)
last_heartbeat = (service.last_seen_up or service.updated_at
or service.created_at)
if isinstance(last_heartbeat, six.string_types):
@@ -108,7 +108,7 @@ class Service(base.APIBase):
for field in fields:
self.fields.append(field)
setattr(self, field, kwargs.get(
- field if field != 'status' else 'name', wtypes.Unset))
+ field if field != 'status' else 'id', wtypes.Unset))
@staticmethod
def _convert_with_links(service, url, expand=True):
diff --git a/watcher/tests/api/v1/test_services.py b/watcher/tests/api/v1/test_services.py
index fa5fd9159..ccbd45ff8 100644
--- a/watcher/tests/api/v1/test_services.py
+++ b/watcher/tests/api/v1/test_services.py
@@ -78,13 +78,18 @@ class TestListService(api_base.FunctionalTest):
def test_many(self):
service_list = []
- for idx in range(1, 6):
+ for idx in range(1, 4):
service = obj_utils.create_test_service(
- self.context, id=idx, host='CONTROLLER',
+ self.context, id=idx, host='CONTROLLER1',
+ name='SERVICE_{0}'.format(idx))
+ service_list.append(service.id)
+ for idx in range(1, 4):
+ service = obj_utils.create_test_service(
+ self.context, id=3+idx, host='CONTROLLER2',
name='SERVICE_{0}'.format(idx))
service_list.append(service.id)
response = self.get_json('/services')
- self.assertEqual(5, len(response['services']))
+ self.assertEqual(6, len(response['services']))
for service in response['services']:
self.assertTrue(
all(val is not None for key, val in service.items()