summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Washenberger <mark.washenberger@rackspace.com>2011-03-09 16:51:05 -0500
committerMark Washenberger <mark.washenberger@rackspace.com>2011-03-09 16:51:05 -0500
commit355870e732f11ee21642a9ce0568fa30ef7b16bb (patch)
tree29b283bd6bcb33ab960afcf85f817b70e8112ab8
parent95d25ba3f4cd3345355922018295f3789d5ddb7c (diff)
parentf93e424c0c722f5607086349787a95517f31d79b (diff)
downloadnova-355870e732f11ee21642a9ce0568fa30ef7b16bb.tar.gz
nova-355870e732f11ee21642a9ce0568fa30ef7b16bb.tar.xz
nova-355870e732f11ee21642a9ce0568fa30ef7b16bb.zip
merge lp:nova, fix conflicts, fix tests
-rwxr-xr-xbin/nova-manage9
-rw-r--r--nova/api/openstack/servers.py11
-rw-r--r--nova/compute/api.py5
-rw-r--r--nova/db/api.py12
-rw-r--r--nova/db/sqlalchemy/api.py21
-rw-r--r--nova/network/manager.py10
-rw-r--r--nova/tests/api/openstack/test_servers.py11
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