Migrating the create/resize code to use flavor obj
The flavor objects used to use memory_ram and flavor_id. The change now passes around objects so any other flavor properties can be used. implements blueprint refactor-flavor-taskmanager Change-Id: I2520e4e4eba430338445bff4d358eef9fb16f0d5
This commit is contained in:
parent
563c274b48
commit
0a44fc273c
@ -7,6 +7,9 @@ remote_nova_volume_client = trove.tests.fakes.nova.fake_create_nova_volume_clien
|
||||
remote_guest_client = trove.tests.fakes.guestagent.fake_create_guest_client
|
||||
remote_swift_client = trove.tests.fakes.swift.fake_create_swift_client
|
||||
|
||||
# This will remove some of the verbose logging when trying to diagnose tox issues
|
||||
#default_log_levels=routes.middleware=ERROR,trove.common.auth=WARN
|
||||
|
||||
fake_mode_events = eventlet
|
||||
|
||||
log_file = rdtest.log
|
||||
|
@ -468,9 +468,8 @@ class Instance(BuiltInstance):
|
||||
context)
|
||||
security_groups = [security_group["name"]]
|
||||
|
||||
task_api.API(context).create_instance(db_info.id, name, flavor_id,
|
||||
flavor.ram, image_id,
|
||||
databases, users,
|
||||
task_api.API(context).create_instance(db_info.id, name, flavor,
|
||||
image_id, databases, users,
|
||||
service_type, volume_size,
|
||||
security_groups, backup_id)
|
||||
|
||||
@ -510,9 +509,8 @@ class Instance(BuiltInstance):
|
||||
# Set the task to RESIZING and begin the async call before returning.
|
||||
self.update_db(task_status=InstanceTasks.RESIZING)
|
||||
LOG.debug("Instance %s set to RESIZING." % self.id)
|
||||
task_api.API(self.context).resize_flavor(self.id, new_flavor_id,
|
||||
old_flavor_size,
|
||||
new_flavor_size)
|
||||
task_api.API(self.context).resize_flavor(self.id, old_flavor,
|
||||
new_flavor)
|
||||
|
||||
def resize_volume(self, new_size):
|
||||
def _resize_resources():
|
||||
|
@ -38,6 +38,16 @@ LOG = logging.getLogger(__name__)
|
||||
class API(ManagerAPI):
|
||||
"""API for interacting with the task manager."""
|
||||
|
||||
def _transform_obj(self, obj_ref):
|
||||
# Turn the object into a dictionary and remove the mgr
|
||||
if "__dict__" in dir(obj_ref):
|
||||
obj_dict = obj_ref.__dict__
|
||||
# We assume manager contains a object due to the *clients
|
||||
if obj_dict.get('manager'):
|
||||
del obj_dict['manager']
|
||||
return obj_dict
|
||||
raise ValueError("Could not transform %s" % obj_ref)
|
||||
|
||||
def _fake_cast(self, method_name, **kwargs):
|
||||
from trove.tests.fakes.common import get_event_spawer
|
||||
from trove.taskmanager.manager import Manager
|
||||
@ -63,14 +73,12 @@ class API(ManagerAPI):
|
||||
% instance_id)
|
||||
self._cast("resize_volume", new_size=new_size, instance_id=instance_id)
|
||||
|
||||
def resize_flavor(self, instance_id, new_flavor_id, old_memory_size,
|
||||
new_memory_size):
|
||||
def resize_flavor(self, instance_id, old_flavor, new_flavor):
|
||||
LOG.debug("Making async call to resize flavor for instance: %s" %
|
||||
instance_id)
|
||||
self._cast("resize_flavor", instance_id=instance_id,
|
||||
new_flavor_id=new_flavor_id,
|
||||
old_memory_size=old_memory_size,
|
||||
new_memory_size=new_memory_size)
|
||||
old_flavor=self._transform_obj(old_flavor),
|
||||
new_flavor=self._transform_obj(new_flavor))
|
||||
|
||||
def reboot(self, instance_id):
|
||||
LOG.debug("Making async call to reboot instance: %s" % instance_id)
|
||||
@ -99,12 +107,12 @@ class API(ManagerAPI):
|
||||
LOG.debug("Making async call to delete backup: %s" % backup_id)
|
||||
self._cast("delete_backup", backup_id=backup_id)
|
||||
|
||||
def create_instance(self, instance_id, name, flavor_id, flavor_ram,
|
||||
def create_instance(self, instance_id, name, flavor,
|
||||
image_id, databases, users, service_type,
|
||||
volume_size, security_groups, backup_id=None):
|
||||
LOG.debug("Making async call to create instance %s " % instance_id)
|
||||
self._cast("create_instance", instance_id=instance_id, name=name,
|
||||
flavor_id=flavor_id, flavor_ram=flavor_ram,
|
||||
image_id=image_id, databases=databases, users=users,
|
||||
flavor=self._transform_obj(flavor), image_id=image_id,
|
||||
databases=databases, users=users,
|
||||
service_type=service_type, volume_size=volume_size,
|
||||
security_groups=security_groups, backup_id=backup_id)
|
||||
|
@ -47,11 +47,9 @@ class Manager(periodic_task.PeriodicTasks):
|
||||
instance_tasks = models.BuiltInstanceTasks.load(context, instance_id)
|
||||
instance_tasks.resize_volume(new_size)
|
||||
|
||||
def resize_flavor(self, context, instance_id, new_flavor_id,
|
||||
old_memory_size, new_memory_size):
|
||||
def resize_flavor(self, context, instance_id, old_flavor, new_flavor):
|
||||
instance_tasks = models.BuiltInstanceTasks.load(context, instance_id)
|
||||
instance_tasks.resize_flavor(new_flavor_id, old_memory_size,
|
||||
new_memory_size)
|
||||
instance_tasks.resize_flavor(old_flavor, new_flavor)
|
||||
|
||||
def reboot(self, context, instance_id):
|
||||
instance_tasks = models.BuiltInstanceTasks.load(context, instance_id)
|
||||
@ -82,11 +80,11 @@ class Manager(periodic_task.PeriodicTasks):
|
||||
instance_tasks = models.BuiltInstanceTasks.load(context, instance_id)
|
||||
instance_tasks.create_backup(backup_id)
|
||||
|
||||
def create_instance(self, context, instance_id, name, flavor_id,
|
||||
flavor_ram, image_id, databases, users, service_type,
|
||||
def create_instance(self, context, instance_id, name, flavor,
|
||||
image_id, databases, users, service_type,
|
||||
volume_size, security_groups, backup_id):
|
||||
instance_tasks = FreshInstanceTasks.load(context, instance_id)
|
||||
instance_tasks.create_instance(flavor_id, flavor_ram, image_id,
|
||||
instance_tasks.create_instance(flavor, image_id,
|
||||
databases, users, service_type,
|
||||
volume_size, security_groups,
|
||||
backup_id)
|
||||
|
@ -112,19 +112,19 @@ class NotifyMixin(object):
|
||||
|
||||
class FreshInstanceTasks(FreshInstance, NotifyMixin):
|
||||
|
||||
def create_instance(self, flavor_id, flavor_ram, image_id,
|
||||
databases, users, service_type, volume_size,
|
||||
security_groups, backup_id):
|
||||
def create_instance(self, flavor, image_id, databases, users,
|
||||
service_type, volume_size, security_groups,
|
||||
backup_id):
|
||||
if use_nova_server_volume:
|
||||
server, volume_info = self._create_server_volume(
|
||||
flavor_id,
|
||||
flavor['id'],
|
||||
image_id,
|
||||
security_groups,
|
||||
service_type,
|
||||
volume_size)
|
||||
else:
|
||||
server, volume_info = self._create_server_volume_individually(
|
||||
flavor_id,
|
||||
flavor['id'],
|
||||
image_id,
|
||||
security_groups,
|
||||
service_type,
|
||||
@ -137,7 +137,7 @@ class FreshInstanceTasks(FreshInstance, NotifyMixin):
|
||||
self._log_and_raise(e, msg, err)
|
||||
|
||||
if server:
|
||||
self._guest_prepare(server, flavor_ram, volume_info,
|
||||
self._guest_prepare(server, flavor['ram'], volume_info,
|
||||
databases, users, backup_id)
|
||||
|
||||
if not self.db_info.task_status.is_error:
|
||||
@ -150,7 +150,7 @@ class FreshInstanceTasks(FreshInstance, NotifyMixin):
|
||||
utils.poll_until(self._service_is_active,
|
||||
sleep_time=USAGE_SLEEP_TIME,
|
||||
time_out=USAGE_TIMEOUT)
|
||||
self.send_usage_event('create', instance_size=flavor_ram)
|
||||
self.send_usage_event('create', instance_size=flavor['ram'])
|
||||
except PollTimeOut:
|
||||
LOG.error("Timeout for service changing to active. "
|
||||
"No usage create-event sent.")
|
||||
@ -460,10 +460,8 @@ class BuiltInstanceTasks(BuiltInstance, NotifyMixin):
|
||||
finally:
|
||||
self.update_db(task_status=inst_models.InstanceTasks.NONE)
|
||||
|
||||
def resize_flavor(self, new_flavor_id, old_memory_size,
|
||||
new_memory_size):
|
||||
action = ResizeAction(self, new_flavor_id,
|
||||
new_memory_size, old_memory_size)
|
||||
def resize_flavor(self, old_flavor, new_flavor):
|
||||
action = ResizeAction(self, old_flavor, new_flavor)
|
||||
action.execute()
|
||||
|
||||
def migrate(self):
|
||||
@ -692,12 +690,11 @@ class ResizeActionBase(object):
|
||||
|
||||
class ResizeAction(ResizeActionBase):
|
||||
|
||||
def __init__(self, instance, new_flavor_id=None,
|
||||
new_memory_size=None, old_memory_size=None):
|
||||
def __init__(self, instance, old_flavor, new_flavor):
|
||||
self.instance = instance
|
||||
self.old_memory_size = old_memory_size
|
||||
self.new_flavor_id = new_flavor_id
|
||||
self.new_memory_size = new_memory_size
|
||||
self.old_flavor = old_flavor
|
||||
self.new_flavor = new_flavor
|
||||
self.new_flavor_id = new_flavor['id']
|
||||
|
||||
def _assert_nova_action_was_successful(self):
|
||||
# Do check to make sure the status and flavor id are correct.
|
||||
@ -714,7 +711,7 @@ class ResizeAction(ResizeActionBase):
|
||||
% self.instance.id)
|
||||
LOG.debug("Repairing config.")
|
||||
try:
|
||||
config = {'memory_mb': self.old_memory_size}
|
||||
config = {'memory_mb': self.old_flavor['ram']}
|
||||
self.instance.guest.reset_configuration(config)
|
||||
except GuestTimeout as gt:
|
||||
LOG.exception("Error sending reset_configuration call.")
|
||||
@ -725,14 +722,15 @@ class ResizeAction(ResizeActionBase):
|
||||
LOG.debug("Updating instance %s to flavor_id %s."
|
||||
% (self.instance.id, self.new_flavor_id))
|
||||
self.instance.update_db(flavor_id=self.new_flavor_id)
|
||||
self.instance.send_usage_event('modify_flavor',
|
||||
old_instance_size=self.old_memory_size,
|
||||
instance_size=self.new_memory_size,
|
||||
launched_at=timeutils.isotime(),
|
||||
modify_at=timeutils.isotime())
|
||||
self.instance.send_usage_event(
|
||||
'modify_flavor',
|
||||
old_instance_size=self.old_flavor['ram'],
|
||||
instance_size=self.new_flavor['ram'],
|
||||
launched_at=timeutils.isotime(),
|
||||
modify_at=timeutils.isotime())
|
||||
|
||||
def _start_mysql(self):
|
||||
self.instance.guest.start_db_with_conf_changes(self.new_memory_size)
|
||||
self.instance.guest.start_db_with_conf_changes(self.new_flavor['ram'])
|
||||
|
||||
|
||||
class MigrateAction(ResizeActionBase):
|
||||
|
@ -29,11 +29,14 @@ from trove.instance.models import ServiceStatuses
|
||||
from trove.instance.tasks import InstanceTasks
|
||||
from trove.openstack.common.rpc.common import RPCException
|
||||
from trove.taskmanager import models as models
|
||||
from trove.tests.fakes import nova
|
||||
|
||||
GROUP = 'dbaas.api.instances.resize'
|
||||
|
||||
OLD_FLAVOR_ID = 1
|
||||
NEW_FLAVOR_ID = 2
|
||||
OLD_FLAVOR = nova.FLAVORS.get(OLD_FLAVOR_ID)
|
||||
NEW_FLAVOR = nova.FLAVORS.get(NEW_FLAVOR_ID)
|
||||
|
||||
|
||||
class ResizeTestBase(TestCase):
|
||||
@ -99,15 +102,18 @@ class ResizeTests(ResizeTestBase):
|
||||
def setUp(self):
|
||||
super(ResizeTests, self).setUp()
|
||||
self._init()
|
||||
# By the time flavor objects pass over amqp to the
|
||||
# resize action they have been turned into dicts
|
||||
self.action = models.ResizeAction(self.instance,
|
||||
new_flavor_id=NEW_FLAVOR_ID)
|
||||
OLD_FLAVOR.__dict__,
|
||||
NEW_FLAVOR.__dict__)
|
||||
|
||||
def tearDown(self):
|
||||
super(ResizeTests, self).tearDown()
|
||||
self._teardown()
|
||||
|
||||
def _start_mysql(self):
|
||||
self.instance.guest.start_db_with_conf_changes(None)
|
||||
self.instance.guest.start_db_with_conf_changes(NEW_FLAVOR.ram)
|
||||
|
||||
def test_guest_wont_stop_mysql(self):
|
||||
self.guest.stop_db(do_not_start_on_reboot=True)\
|
||||
|
@ -51,9 +51,6 @@ class FakeFlavor(object):
|
||||
def href_suffix(self):
|
||||
return "flavors/%s" % self.id
|
||||
|
||||
def to_dict(self):
|
||||
return {"id": self.id, "links": self.links}
|
||||
|
||||
|
||||
class FakeFlavors(object):
|
||||
|
||||
@ -169,7 +166,7 @@ class FakeServer(object):
|
||||
|
||||
@property
|
||||
def flavor(self):
|
||||
return FLAVORS.get_by_href(self.flavor_ref).to_dict()
|
||||
return FLAVORS.get_by_href(self.flavor_ref).__dict__
|
||||
|
||||
@property
|
||||
def links(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user