Merge "Add availability_zone to service"

This commit is contained in:
Zuul 2018-02-27 03:00:54 +00:00 committed by Gerrit Code Review
commit 464e18b2e8
10 changed files with 108 additions and 7 deletions

View File

@ -21,9 +21,13 @@ from zun.api import servicegroup as svcgrp_api
from zun.common import exception from zun.common import exception
from zun.common import policy from zun.common import policy
from zun.common import validation from zun.common import validation
import zun.conf
from zun import objects from zun import objects
CONF = zun.conf.CONF
class ZunServiceCollection(collection.Collection): class ZunServiceCollection(collection.Collection):
fields = { fields = {
@ -41,11 +45,13 @@ class ZunServiceCollection(collection.Collection):
collection = ZunServiceCollection() collection = ZunServiceCollection()
collection.services = [] collection.services = []
for p in rpc_hsvcs: for p in rpc_hsvcs:
hsvc = p.as_dict() service = p.as_dict()
alive = servicegroup_api.service_is_up(p) alive = servicegroup_api.service_is_up(p)
state = 'up' if alive else 'down' state = 'up' if alive else 'down'
hsvc['state'] = state service['state'] = state
collection.services.append(hsvc) collection.services.append(service)
if not service['availability_zone']:
service['availability_zone'] = CONF.default_availability_zone
next = collection.get_next(limit=None, url=None, **kwargs) next = collection.get_next(limit=None, url=None, **kwargs)
if next is not None: if next is not None:
collection.next = next collection.next = next

View File

@ -15,6 +15,7 @@
from oslo_config import cfg from oslo_config import cfg
from zun.conf import api from zun.conf import api
from zun.conf import availability_zone
from zun.conf import cinder_client from zun.conf import cinder_client
from zun.conf import compute from zun.conf import compute
from zun.conf import container_driver from zun.conf import container_driver
@ -61,3 +62,4 @@ pci.register_opts(CONF)
volume.register_opts(CONF) volume.register_opts(CONF)
cinder_client.register_opts(CONF) cinder_client.register_opts(CONF)
netconf.register_opts(CONF) netconf.register_opts(CONF)
availability_zone.register_opts(CONF)

View File

@ -0,0 +1,36 @@
# 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 oslo_config import cfg
availability_zone_opts = [
cfg.StrOpt('default_availability_zone',
default='nova',
help="""
Default availability zone for compute services.
This option determines the default availability zone for 'zun-compute'
services.
Possible values:
* Any string representing an existing availability zone name.
"""),
]
def register_opts(conf):
conf.register_opts(availability_zone_opts)
def list_opts():
return {'DEFAULT': availability_zone_opts}

View File

@ -0,0 +1,34 @@
# 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.
"""add availability_zone to service
Revision ID: 3f49fa520409
Revises: 50829990c965
Create Date: 2018-02-10 22:33:22.890723
"""
# revision identifiers, used by Alembic.
revision = '3f49fa520409'
down_revision = '50829990c965'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column('zun_service',
sa.Column('availability_zone', sa.String(255),
nullable=True))

View File

@ -122,6 +122,7 @@ class ZunService(Base):
last_seen_up = Column(DateTime, nullable=True) last_seen_up = Column(DateTime, nullable=True)
forced_down = Column(Boolean, default=False) forced_down = Column(Boolean, default=False)
report_count = Column(Integer, nullable=False, default=0) report_count = Column(Integer, nullable=False, default=0)
availability_zone = Column(String(255), nullable=True)
class Container(Base): class Container(Base):

View File

@ -21,7 +21,8 @@ class ZunService(base.ZunPersistentObject, base.ZunObject):
# Version 1.0: Initial version # Version 1.0: Initial version
# Version 1.1: Add update method # Version 1.1: Add update method
VERSION = '1.1' # Version 1.2: Add availability_zone field
VERSION = '1.2'
fields = { fields = {
'id': fields.IntegerField(), 'id': fields.IntegerField(),
@ -32,6 +33,7 @@ class ZunService(base.ZunPersistentObject, base.ZunObject):
'last_seen_up': fields.DateTimeField(nullable=True), 'last_seen_up': fields.DateTimeField(nullable=True),
'forced_down': fields.BooleanField(), 'forced_down': fields.BooleanField(),
'report_count': fields.IntegerField(), 'report_count': fields.IntegerField(),
'availability_zone': fields.StringField(nullable=True),
} }
@staticmethod @staticmethod

View File

@ -11,6 +11,7 @@
# limitations under the License. # limitations under the License.
import mock import mock
from oslo_config import cfg
from zun.api import servicegroup from zun.api import servicegroup
from zun import objects from zun import objects
@ -35,10 +36,10 @@ class TestZunServiceController(api_base.FunctionalTest):
response = self.get_json('/services') response = self.get_json('/services')
self.assertEqual([], response['services']) self.assertEqual([], response['services'])
def _rpc_api_reply(self, count=1): def _rpc_api_reply(self, count=1, **kwarg):
reclist = [] reclist = []
for i in range(count): for i in range(count):
elem = api_utils.zservice_get_data() elem = api_utils.zservice_get_data(**kwarg)
elem['id'] = i + 1 elem['id'] = i + 1
rec = DbRec(elem) rec = DbRec(elem)
reclist.append(rec) reclist.append(rec)
@ -55,6 +56,8 @@ class TestZunServiceController(api_base.FunctionalTest):
response = self.get_json('/services') response = self.get_json('/services')
self.assertEqual(1, len(response['services'])) self.assertEqual(1, len(response['services']))
self.assertEqual(1, response['services'][0]['id']) self.assertEqual(1, response['services'][0]['id'])
self.assertEqual('fake-zone',
response['services'][0]['availability_zone'])
@mock.patch('zun.common.policy.enforce') @mock.patch('zun.common.policy.enforce')
@mock.patch.object(objects.ZunService, 'list') @mock.patch.object(objects.ZunService, 'list')
@ -71,6 +74,21 @@ class TestZunServiceController(api_base.FunctionalTest):
elem = response['services'][i] elem = response['services'][i]
self.assertEqual(elem['id'], i + 1) self.assertEqual(elem['id'], i + 1)
@mock.patch('zun.common.policy.enforce')
@mock.patch.object(objects.ZunService, 'list')
@mock.patch.object(servicegroup.ServiceGroup, 'service_is_up')
def test_default_availability_zone(self, svc_up, mock_list, mock_policy):
cfg.CONF.set_override("default_availability_zone", "default-zone")
mock_policy.return_value = True
mock_list.return_value = self._rpc_api_reply(availability_zone=None)
svc_up.return_value = "up"
response = self.get_json('/services')
self.assertEqual(1, len(response['services']))
self.assertEqual(1, response['services'][0]['id'])
self.assertEqual('default-zone',
response['services'][0]['availability_zone'])
@mock.patch('zun.common.policy.enforce') @mock.patch('zun.common.policy.enforce')
@mock.patch.object(objects.ZunService, 'get_by_host_and_binary') @mock.patch.object(objects.ZunService, 'get_by_host_and_binary')
@mock.patch.object(objects.ZunService, 'update') @mock.patch.object(objects.ZunService, 'update')

View File

@ -31,4 +31,5 @@ def zservice_get_data(**kwargs):
'last_seen_up': kwargs.get('last_seen_up', faketime), 'last_seen_up': kwargs.get('last_seen_up', faketime),
'created_at': kwargs.get('created_at', faketime), 'created_at': kwargs.get('created_at', faketime),
'updated_at': kwargs.get('updated_at', faketime), 'updated_at': kwargs.get('updated_at', faketime),
'availability_zone': kwargs.get('availability_zone', 'fake-zone'),
} }

View File

@ -198,6 +198,7 @@ def get_test_zun_service(**kwargs):
'report_count': kwargs.get('report_count', 13), 'report_count': kwargs.get('report_count', 13),
'created_at': kwargs.get('created_at'), 'created_at': kwargs.get('created_at'),
'updated_at': kwargs.get('updated_at'), 'updated_at': kwargs.get('updated_at'),
'availability_zone': kwargs.get('availability_zone', 'fake-zone'),
} }

View File

@ -352,7 +352,7 @@ object_data = {
'NUMATopology': '1.0-b54086eda7e4b2e6145ecb6ee2c925ab', 'NUMATopology': '1.0-b54086eda7e4b2e6145ecb6ee2c925ab',
'ResourceClass': '1.1-d661c7675b3cd5b8c3618b68ba64324e', 'ResourceClass': '1.1-d661c7675b3cd5b8c3618b68ba64324e',
'ResourceProvider': '1.0-92b427359d5a4cf9ec6c72cbe630ee24', 'ResourceProvider': '1.0-92b427359d5a4cf9ec6c72cbe630ee24',
'ZunService': '1.1-b1549134bfd5271daec417ca8cabc77e', 'ZunService': '1.2-deff2a74a9ce23baa231ae12f39a6189',
'Capsule': '1.5-cbdaffa78fa68c26cf4a61d8f75dd32d', 'Capsule': '1.5-cbdaffa78fa68c26cf4a61d8f75dd32d',
'PciDevice': '1.1-6e3f0851ad1cf12583e6af4df1883979', 'PciDevice': '1.1-6e3f0851ad1cf12583e6af4df1883979',
'ComputeNode': '1.9-e8536102d3b28cb3378e9e26f508cd72', 'ComputeNode': '1.9-e8536102d3b28cb3378e9e26f508cd72',