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:
Michael Basnight 2013-07-11 11:49:30 -07:00
parent 563c274b48
commit 0a44fc273c
7 changed files with 58 additions and 50 deletions

View File

@ -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

View File

@ -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():

View File

@ -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)

View File

@ -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)

View File

@ -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):

View File

@ -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)\

View File

@ -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):