From b03183dd209d9fddcb4fa1d50753fc5eda37fe04 Mon Sep 17 00:00:00 2001 From: Craig Vyvial Date: Sat, 16 Jun 2012 16:32:46 -0500 Subject: [PATCH] modify prepare call to create the users given on a create instance --- reddwarf/extensions/mysql/common.py | 52 ++++++++++++++++++++++++++++ reddwarf/extensions/mysql/models.py | 36 ------------------- reddwarf/extensions/mysql/service.py | 6 ++-- reddwarf/instance/models.py | 25 ++----------- reddwarf/instance/service.py | 9 ++--- reddwarf/taskmanager/api.py | 4 +-- reddwarf/taskmanager/manager.py | 6 ++-- reddwarf/taskmanager/models.py | 17 ++++----- 8 files changed, 78 insertions(+), 77 deletions(-) create mode 100644 reddwarf/extensions/mysql/common.py diff --git a/reddwarf/extensions/mysql/common.py b/reddwarf/extensions/mysql/common.py new file mode 100644 index 0000000000..8b6d85864e --- /dev/null +++ b/reddwarf/extensions/mysql/common.py @@ -0,0 +1,52 @@ +# Copyright 2012 OpenStack LLC +# +# 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 reddwarf.common import exception +from reddwarf.guestagent.db import models as guest_models + + +def populate_databases(dbs): + """ + Create a serializable request with user provided data + for creating new databases. + """ + try: + databases = [] + for database in dbs: + mydb = guest_models.MySQLDatabase() + mydb.name = database.get('name', '') + mydb.character_set = database.get('character_set', '') + mydb.collate = database.get('collate', '') + databases.append(mydb.serialize()) + return databases + except ValueError as ve: + raise exception.BadRequest(ve.message) + + +def populate_users(users): + """Create a serializable request containing users""" + try: + users_data = [] + for user in users: + u = guest_models.MySQLUser() + u.name = user.get('name', '') + u.password = user.get('password', '') + dbs = user.get('databases', '') + if dbs: + for db in dbs: + u.databases = db.get('name', '') + users_data.append(u.serialize()) + return users_data + except ValueError as ve: + raise exception.BadRequest(ve.message) diff --git a/reddwarf/extensions/mysql/models.py b/reddwarf/extensions/mysql/models.py index 3a3bcfa192..b976d6f83a 100644 --- a/reddwarf/extensions/mysql/models.py +++ b/reddwarf/extensions/mysql/models.py @@ -50,42 +50,6 @@ def load_and_verify(context, instance_id): return instance -def populate_databases(dbs): - """ - Create a serializable request with user provided data - for creating new databases. - """ - try: - databases = [] - for database in dbs: - mydb = guest_models.MySQLDatabase() - mydb.name = database.get('name', '') - mydb.character_set = database.get('character_set', '') - mydb.collate = database.get('collate', '') - databases.append(mydb.serialize()) - return databases - except ValueError as ve: - raise exception.BadRequest(ve.message) - - -def populate_users(users): - """Create a serializable request containing users""" - try: - users_data = [] - for user in users: - u = guest_models.MySQLUser() - u.name = user.get('name', '') - u.password = user.get('password', '') - dbs = user.get('databases', '') - if dbs: - for db in dbs: - u.databases = db.get('name', '') - users_data.append(u.serialize()) - return users_data - except ValueError as ve: - raise exception.BadRequest(ve.message) - - class User(object): _data_fields = ['name', 'password', 'databases'] diff --git a/reddwarf/extensions/mysql/service.py b/reddwarf/extensions/mysql/service.py index b36d8b0720..f921434f67 100644 --- a/reddwarf/extensions/mysql/service.py +++ b/reddwarf/extensions/mysql/service.py @@ -22,6 +22,8 @@ from reddwarf.common import exception from reddwarf.common import pagination from reddwarf.common import wsgi from reddwarf.guestagent.db import models as guest_models +from reddwarf.extensions.mysql.common import populate_databases +from reddwarf.extensions.mysql.common import populate_users from reddwarf.extensions.mysql import models from reddwarf.extensions.mysql import views @@ -121,7 +123,7 @@ class UserController(BaseController): context = req.environ[wsgi.CONTEXT_KEY] self.validate(body) users = body['users'] - model_users = models.populate_users(users) + model_users = populate_users(users) models.User.create(context, instance_id, model_users) return wsgi.Result(None, 202) @@ -168,7 +170,7 @@ class SchemaController(BaseController): context = req.environ[wsgi.CONTEXT_KEY] self.validate(body) schemas = body['databases'] - model_schemas = models.populate_databases(schemas) + model_schemas = populate_databases(schemas) models.Schema.create(context, instance_id, model_schemas) return wsgi.Result(None, 202) diff --git a/reddwarf/instance/models.py b/reddwarf/instance/models.py index 3966dc4580..9712053f3c 100644 --- a/reddwarf/instance/models.py +++ b/reddwarf/instance/models.py @@ -56,27 +56,6 @@ def load_server(context, instance_id, server_id): return server -# This probably should not happen here. Seems like it should -# be in an extension instead -def populate_databases(dbs): - """ - Create a serializable request with user provided data - for creating new databases. - """ - from reddwarf.guestagent.db import models as guest_models - try: - databases = [] - for database in dbs: - mydb = guest_models.MySQLDatabase() - mydb.name = database.get('name', '') - mydb.character_set = database.get('character_set', '') - mydb.collate = database.get('collate', '') - databases.append(mydb.serialize()) - return databases - except ValueError as ve: - raise exception.BadRequest(ve.message) - - class InstanceStatus(object): ACTIVE = "ACTIVE" @@ -371,7 +350,7 @@ class Instance(BuiltInstance): @classmethod def create(cls, context, name, flavor_id, image_id, - databases, service_type, volume_size): + databases, users, service_type, volume_size): client = create_nova_client(context) try: flavor = client.flavors.get(flavor_id) @@ -390,7 +369,7 @@ class Instance(BuiltInstance): dns_client = create_dns_client(context) dns_client.update_hostname(db_info) task_api.API(context).create_instance(db_info.id, name, flavor_id, - flavor.ram, image_id, databases, service_type, volume_size) + flavor.ram, image_id, databases, users, service_type, volume_size) return SimpleInstance(context, db_info, service_status) diff --git a/reddwarf/instance/service.py b/reddwarf/instance/service.py index 03aeaf1bdb..bc85cd9328 100644 --- a/reddwarf/instance/service.py +++ b/reddwarf/instance/service.py @@ -24,6 +24,8 @@ from reddwarf.common import exception from reddwarf.common import pagination from reddwarf.common import utils from reddwarf.common import wsgi +from reddwarf.extensions.mysql.common import populate_databases +from reddwarf.extensions.mysql.common import populate_users from reddwarf.instance import models, views @@ -235,9 +237,8 @@ class InstanceController(BaseController): name = body['instance']['name'] flavor_ref = body['instance']['flavorRef'] flavor_id = utils.get_id_from_href(flavor_ref) - databases = body['instance'].get('databases') - if databases is None: - databases = [] + databases = populate_databases(body['instance'].get('databases')) + users = populate_users(body['instance'].get('users')) if body['instance'].get('volume', None) is not None: try: volume_size = int(body['instance']['volume']['size']) @@ -246,7 +247,7 @@ class InstanceController(BaseController): else: volume_size = None instance = models.Instance.create(context, name, flavor_id, - image_id, databases, + image_id, databases, users, service_type, volume_size) return wsgi.Result(views.InstanceDetailView(instance, req=req, diff --git a/reddwarf/taskmanager/api.py b/reddwarf/taskmanager/api.py index b44a31afc6..9b11d592ce 100644 --- a/reddwarf/taskmanager/api.py +++ b/reddwarf/taskmanager/api.py @@ -96,9 +96,9 @@ class API(object): self._cast("delete_instance", instance_id=instance_id) def create_instance(self, instance_id, name, flavor_id, flavor_ram, - image_id, databases, service_type, volume_size): + image_id, databases, users, service_type, volume_size): 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, + image_id=image_id, databases=databases, users=users, service_type=service_type, volume_size=volume_size) diff --git a/reddwarf/taskmanager/manager.py b/reddwarf/taskmanager/manager.py index 7324b85c5c..de3844c91d 100644 --- a/reddwarf/taskmanager/manager.py +++ b/reddwarf/taskmanager/manager.py @@ -74,8 +74,10 @@ class TaskManager(service.Manager): instance_tasks.delete_instance() def create_instance(self, context, instance_id, name, flavor_id, - flavor_ram, image_id, databases, service_type, + flavor_ram, image_id, databases, users, service_type, volume_size): instance_tasks = FreshInstanceTasks.load(context, instance_id) instance_tasks.create_instance(flavor_id, flavor_ram, image_id, - databases, service_type, volume_size) + databases, users, service_type, + volume_size) + diff --git a/reddwarf/taskmanager/models.py b/reddwarf/taskmanager/models.py index e281e259dd..b53e2a3b8d 100644 --- a/reddwarf/taskmanager/models.py +++ b/reddwarf/taskmanager/models.py @@ -30,13 +30,14 @@ from reddwarf.common.remote import create_nova_client from reddwarf.common.remote import create_nova_volume_client from reddwarf.common.remote import create_guest_client from reddwarf.common.utils import poll_until +from reddwarf.extensions.mysql.common import populate_databases +from reddwarf.extensions.mysql.common import populate_users from reddwarf.instance import models as inst_models from reddwarf.instance.models import DBInstance from reddwarf.instance.models import BuiltInstance from reddwarf.instance.models import FreshInstance from reddwarf.instance.models import InstanceStatus from reddwarf.instance.models import InstanceServiceStatus -from reddwarf.instance.models import populate_databases from reddwarf.instance.models import ServiceStatuses from reddwarf.instance.views import get_ip_address @@ -46,8 +47,8 @@ LOG = logging.getLogger(__name__) class FreshInstanceTasks(FreshInstance): - def create_instance(self, flavor_id, flavor_ram, - image_id, databases, service_type, volume_size): + def create_instance(self, flavor_id, flavor_ram, image_id, + databases, users, service_type, volume_size): try: volume_info = self._create_volume(volume_size) block_device_mapping = volume_info['block_device'] @@ -57,7 +58,8 @@ class FreshInstanceTasks(FreshInstance): # Save server ID. self.update_db(compute_instance_id=server_id) self._create_dns_entry() - self._guest_prepare(server, flavor_ram, volume_info, databases) + self._guest_prepare(server, flavor_ram, volume_info, + databases, users) finally: self.update_db(task_status=inst_models.InstanceTasks.NONE) @@ -127,12 +129,11 @@ class FreshInstanceTasks(FreshInstance): LOG.debug(_("Created new compute instance %s.") % server.id) return server - def _guest_prepare(self, server, flavor_ram, volume_info, databases): + def _guest_prepare(self, server, flavor_ram, volume_info, + databases, users): LOG.info("Entering guest_prepare.") # Now wait for the response from the create to do additional work - # populate the databases - model_schemas = populate_databases(databases) - self.guest.prepare(flavor_ram, model_schemas, users=[], + self.guest.prepare(flavor_ram, databases, users, device_path=volume_info['device_path'], mount_point=volume_info['mount_point'])