From 0a44fc273c4feac944de17a2a1993f0d2baad4e0 Mon Sep 17 00:00:00 2001 From: Michael Basnight Date: Thu, 11 Jul 2013 11:49:30 -0700 Subject: [PATCH] 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 --- etc/trove/trove.conf.test | 3 ++ trove/instance/models.py | 10 +++---- trove/taskmanager/api.py | 24 ++++++++++------ trove/taskmanager/manager.py | 12 ++++---- trove/taskmanager/models.py | 44 ++++++++++++++--------------- trove/tests/api/instances_resize.py | 10 +++++-- trove/tests/fakes/nova.py | 5 +--- 7 files changed, 58 insertions(+), 50 deletions(-) diff --git a/etc/trove/trove.conf.test b/etc/trove/trove.conf.test index 966980332c..3ecbe67df6 100644 --- a/etc/trove/trove.conf.test +++ b/etc/trove/trove.conf.test @@ -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 diff --git a/trove/instance/models.py b/trove/instance/models.py index f1157f1519..adcdbbcc4e 100644 --- a/trove/instance/models.py +++ b/trove/instance/models.py @@ -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(): diff --git a/trove/taskmanager/api.py b/trove/taskmanager/api.py index a347fed187..8553d99465 100644 --- a/trove/taskmanager/api.py +++ b/trove/taskmanager/api.py @@ -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) diff --git a/trove/taskmanager/manager.py b/trove/taskmanager/manager.py index 34a19d6aad..d79a0b4c7a 100644 --- a/trove/taskmanager/manager.py +++ b/trove/taskmanager/manager.py @@ -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) diff --git a/trove/taskmanager/models.py b/trove/taskmanager/models.py index fc294261ef..f5bfb8058c 100644 --- a/trove/taskmanager/models.py +++ b/trove/taskmanager/models.py @@ -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): diff --git a/trove/tests/api/instances_resize.py b/trove/tests/api/instances_resize.py index 521a402a55..90caa61b31 100644 --- a/trove/tests/api/instances_resize.py +++ b/trove/tests/api/instances_resize.py @@ -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)\ diff --git a/trove/tests/fakes/nova.py b/trove/tests/fakes/nova.py index b6210da506..d55b7536d0 100644 --- a/trove/tests/fakes/nova.py +++ b/trove/tests/fakes/nova.py @@ -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):