diff options
author | Mark Washenberger <mark.washenberger@rackspace.com> | 2011-03-09 16:51:05 -0500 |
---|---|---|
committer | Mark Washenberger <mark.washenberger@rackspace.com> | 2011-03-09 16:51:05 -0500 |
commit | 355870e732f11ee21642a9ce0568fa30ef7b16bb (patch) | |
tree | 29b283bd6bcb33ab960afcf85f817b70e8112ab8 | |
parent | 95d25ba3f4cd3345355922018295f3789d5ddb7c (diff) | |
parent | f93e424c0c722f5607086349787a95517f31d79b (diff) | |
download | nova-355870e732f11ee21642a9ce0568fa30ef7b16bb.tar.gz nova-355870e732f11ee21642a9ce0568fa30ef7b16bb.tar.xz nova-355870e732f11ee21642a9ce0568fa30ef7b16bb.zip |
merge lp:nova, fix conflicts, fix tests
-rwxr-xr-x | bin/nova-manage | 9 | ||||
-rw-r--r-- | nova/api/openstack/servers.py | 11 | ||||
-rw-r--r-- | nova/compute/api.py | 5 | ||||
-rw-r--r-- | nova/db/api.py | 12 | ||||
-rw-r--r-- | nova/db/sqlalchemy/api.py | 21 | ||||
-rw-r--r-- | nova/network/manager.py | 10 | ||||
-rw-r--r-- | nova/tests/api/openstack/test_servers.py | 11 |
7 files changed, 74 insertions, 5 deletions
diff --git a/bin/nova-manage b/bin/nova-manage index 9bf3a1bb3..7dfc3c045 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -545,6 +545,15 @@ class NetworkCommands(object): network.dhcp_start, network.dns) + def delete(self, fixed_range): + """Deletes a network""" + network = db.network_get_by_cidr(context.get_admin_context(), \ + fixed_range) + if network.project_id is not None: + raise ValueError(_('Network must be disassociated from project %s' + ' before delete' % network.project_id)) + db.network_delete_safe(context.get_admin_context(), network.id) + class ServiceCommands(object): """Enable and disable running services""" diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 419a001fb..248d764ce 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -100,7 +100,7 @@ class Controller(wsgi.Controller): 'application/xml': { "attributes": { "server": ["id", "imageId", "name", "flavorId", "hostId", - "status", "progress"]}}} + "status", "progress", "adminPass"]}}} def __init__(self): self.compute_api = compute.API() @@ -183,7 +183,14 @@ class Controller(wsgi.Controller): key_data=key_pair['public_key'], metadata=metadata, personality_files=personality_files) - return _translate_keys(instances[0]) + + server = _translate_keys(instances[0]) + password = "%s%s" % (server['server']['name'][:4], + utils.generate_password(12)) + server['server']['adminPass'] = password + self.compute_api.set_admin_password(context, server['server']['id'], + password) + return server def _deserialize_create(self, request): """ diff --git a/nova/compute/api.py b/nova/compute/api.py index 45791b6bd..3a622ecbe 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -522,9 +522,10 @@ class API(base.Base): """Unrescue the given instance.""" self._cast_compute_message('unrescue_instance', context, instance_id) - def set_admin_password(self, context, instance_id): + def set_admin_password(self, context, instance_id, password=None): """Set the root/admin password for the given instance.""" - self._cast_compute_message('set_admin_password', context, instance_id) + self._cast_compute_message('set_admin_password', context, instance_id, + password) def inject_file(self, context, instance_id): """Write a file to the given instance.""" diff --git a/nova/db/api.py b/nova/db/api.py index 2ecfc0211..aa86f0af1 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -517,6 +517,13 @@ def network_create_safe(context, values): return IMPL.network_create_safe(context, values) +def network_delete_safe(context, network_id): + """Delete network with key network_id. + This method assumes that the network is not associated with any project + """ + return IMPL.network_delete_safe(context, network_id) + + def network_create_fixed_ips(context, network_id, num_vpn_clients): """Create the ips for the network, reserving sepecified ips.""" return IMPL.network_create_fixed_ips(context, network_id, num_vpn_clients) @@ -553,6 +560,11 @@ def network_get_by_bridge(context, bridge): return IMPL.network_get_by_bridge(context, bridge) +def network_get_by_cidr(context, cidr): + """Get a network by cidr or raise if it does not exist""" + return IMPL.network_get_by_cidr(context, cidr) + + def network_get_by_instance(context, instance_id): """Get a network by instance id or raise if it does not exist.""" return IMPL.network_get_by_instance(context, instance_id) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 5e498fc6f..3e94082df 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1055,6 +1055,15 @@ def network_create_safe(context, values): @require_admin_context +def network_delete_safe(context, network_id): + session = get_session() + with session.begin(): + network_ref = network_get(context, network_id=network_id, \ + session=session) + session.delete(network_ref) + + +@require_admin_context def network_disassociate(context, network_id): network_update(context, network_id, {'project_id': None, 'host': None}) @@ -1128,6 +1137,18 @@ def network_get_by_bridge(context, bridge): @require_admin_context +def network_get_by_cidr(context, cidr): + session = get_session() + result = session.query(models.Network).\ + filter_by(cidr=cidr).first() + + if not result: + raise exception.NotFound(_('Network with cidr %s does not exist') % + cidr) + return result + + +@require_admin_context def network_get_by_instance(_context, instance_id): session = get_session() rv = session.query(models.Network).\ diff --git a/nova/network/manager.py b/nova/network/manager.py index b36dd59cf..3dfc48934 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -563,6 +563,16 @@ class VlanManager(NetworkManager): # NOTE(vish): This makes ports unique accross the cloud, a more # robust solution would be to make them unique per ip net['vpn_public_port'] = vpn_start + index + network_ref = None + try: + network_ref = db.network_get_by_cidr(context, cidr) + except exception.NotFound: + pass + + if network_ref is not None: + raise ValueError(_('Network with cidr %s already exists' % + cidr)) + network_ref = self.db.network_create_safe(context, net) if network_ref: self._create_fixed_ips(context, network_ref['id']) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 156c24d88..356eaae46 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -220,7 +220,7 @@ class ServersTest(test.TestCase): def test_create_instance(self): def instance_create(context, inst): - return {'id': '1', 'display_name': ''} + return {'id': '1', 'display_name': 'server_test'} def server_update(context, id, params): return instance_create(context, id) @@ -264,6 +264,12 @@ class ServersTest(test.TestCase): res = req.get_response(fakes.wsgi_app()) + server = json.loads(res.body)['server'] + self.assertEqual('serv', server['adminPass'][:4]) + self.assertEqual(16, len(server['adminPass'])) + self.assertEqual('server_test', server['name']) + self.assertEqual('1', server['id']) + self.assertEqual(res.status_int, 200) def test_update_no_body(self): @@ -834,6 +840,9 @@ class TestServerInstanceCreation(test.TestCase): self.personality_files = None return [{'id': '1234', 'display_name': 'fakeinstance'}] + def set_admin_password(self, *args, **kwargs): + pass + def make_stub_method(canned_return): def stub_method(*args, **kwargs): return canned_return |