101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
# Copyright 2016 Tesora, Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# 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_log import log as logging
|
|
|
|
from trove.common.clients import create_nova_client
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class ServerGroup(object):
|
|
|
|
@classmethod
|
|
def load(cls, context, instance_id):
|
|
client = create_nova_client(context)
|
|
server_group = None
|
|
expected_name = "locality_%s" % instance_id
|
|
try:
|
|
for sg in client.server_groups.list():
|
|
if sg.name == expected_name:
|
|
server_group = sg
|
|
except Exception:
|
|
LOG.exception("Could not load server group for instance %s",
|
|
instance_id)
|
|
|
|
if not server_group:
|
|
LOG.info('No server group found for instance %s', instance_id)
|
|
|
|
return server_group
|
|
|
|
@classmethod
|
|
def create(cls, context, locality, name_suffix):
|
|
client = create_nova_client(context)
|
|
server_group_name = "%s_%s" % ('locality', name_suffix)
|
|
server_group = client.server_groups.create(
|
|
name=server_group_name, policies=[locality])
|
|
LOG.debug("Created '%(locality)s' server group called %(group_name)s "
|
|
"(id: %(group_id)s).",
|
|
{'locality': locality, 'group_name': server_group_name,
|
|
'group_id': server_group.id})
|
|
|
|
return server_group
|
|
|
|
@classmethod
|
|
def delete(cls, context, server_group, force=False):
|
|
# Only delete the server group if we're the last member in it, or if
|
|
# it has no members
|
|
if server_group:
|
|
if force or len(server_group.members) <= 1:
|
|
LOG.info("Deleting server group %s", server_group.id)
|
|
client = create_nova_client(context)
|
|
client.server_groups.delete(server_group.id)
|
|
else:
|
|
LOG.debug("Skipping delete of server group %(id)s "
|
|
"(members: %(members)s).",
|
|
{'id': server_group.id,
|
|
'members': server_group.members})
|
|
|
|
@classmethod
|
|
def convert_to_hint(cls, server_group, hints=None):
|
|
if server_group:
|
|
hints = hints or {}
|
|
hints["group"] = server_group.id
|
|
return hints
|
|
|
|
@classmethod
|
|
def build_scheduler_hint(cls, context, locality, name_suffix):
|
|
scheduler_hint = None
|
|
if locality:
|
|
# Build the scheduler hint, but only if locality's a string
|
|
if isinstance(locality, str):
|
|
server_group = cls.create(
|
|
context, locality, name_suffix)
|
|
scheduler_hint = cls.convert_to_hint(
|
|
server_group)
|
|
else:
|
|
# otherwise assume it's already in hint form (i.e. a dict)
|
|
scheduler_hint = locality
|
|
return scheduler_hint
|
|
|
|
@classmethod
|
|
def get_locality(cls, server_group):
|
|
locality = None
|
|
if server_group:
|
|
locality = server_group.policies[0]
|
|
return locality
|