summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorTushar Patil <tushar.vitthal.patil@gmail.com>2011-07-11 13:34:39 -0700
committerTushar Patil <tushar.vitthal.patil@gmail.com>2011-07-11 13:34:39 -0700
commit2a6f97940f71c056b4bfb0cd9a86f5d676abc4e1 (patch)
treeacfae7cd5239939dd59dd8b9f766c489a725ae9d /nova/api
parent6843421be9cdef1fc12d3480889bdcfd96821e1b (diff)
downloadnova-2a6f97940f71c056b4bfb0cd9a86f5d676abc4e1.tar.gz
nova-2a6f97940f71c056b4bfb0cd9a86f5d676abc4e1.tar.xz
nova-2a6f97940f71c056b4bfb0cd9a86f5d676abc4e1.zip
add optional parameter networks to the Create server OS API
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/create_instance_helper.py55
1 files changed, 53 insertions, 2 deletions
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index 1066713a3..839aa9fb9 100644
--- a/nova/api/openstack/create_instance_helper.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -32,7 +32,6 @@ from nova.api.openstack import faults
from nova.api.openstack import wsgi
from nova.auth import manager as auth_manager
-
LOG = logging.getLogger('nova.api.openstack.create_instance_helper')
FLAGS = flags.FLAGS
@@ -102,6 +101,15 @@ class CreateInstanceHelper(object):
if personality:
injected_files = self._get_injected_files(personality)
+ requested_networks = body['server'].get('networks')
+
+ if requested_networks is not None:
+ if len(requested_networks) == 0:
+ msg = _("No networks found")
+ raise faults.Fault(exc.HTTPBadRequest(explanation=msg))
+ requested_networks = self._get_requested_networks(
+ requested_networks)
+
flavor_id = self.controller._flavor_id_from_req_data(body)
if not 'name' in body['server']:
@@ -148,12 +156,17 @@ class CreateInstanceHelper(object):
zone_blob=zone_blob,
reservation_id=reservation_id,
min_count=min_count,
- max_count=max_count))
+ max_count=max_count,
+ requested_networks=requested_networks))
except quota.QuotaError as error:
self._handle_quota_error(error)
except exception.ImageNotFound as error:
msg = _("Can not find requested image")
raise faults.Fault(exc.HTTPBadRequest(explanation=msg))
+ except exception.NovaException as ex:
+ LOG.error(ex)
+ msg = _("Failed to create server: %s") % ex
+ raise faults.Fault(exc.HTTPBadRequest(explanation=msg))
# Let the caller deal with unhandled exceptions.
@@ -276,6 +289,44 @@ class CreateInstanceHelper(object):
raise exc.HTTPBadRequest(explanation=msg)
return password
+ def _get_requested_networks(self, requested_networks):
+ """
+ Create a list of requested networks from the networks attribute
+ """
+ networks = []
+ for network in requested_networks:
+ try:
+ network_id = network['id']
+ network_id = int(network_id)
+ #fixed IP address is optional
+ #if the fixed IP address is not provided then
+ #it will used one of the available IP address from the network
+ fixed_ip = network.get('fixed_ip', None)
+
+ # check if the network id is already present in the list,
+ # we don't want duplicate networks to be passed
+ # at the boot time
+ for id, ip in networks:
+ if id == network_id:
+ expl = _("Duplicate networks (%s) are not allowed")\
+ % network_id
+ raise faults.Fault(exc.HTTPBadRequest(
+ explanation=expl))
+
+ networks.append((network_id, fixed_ip))
+ except KeyError as key:
+ expl = _('Bad network format: missing %s') % key
+ raise faults.Fault(exc.HTTPBadRequest(explanation=expl))
+ except ValueError:
+ expl = _("Bad networks format: network id should "
+ "be integer (%s)") % network_id
+ raise faults.Fault(exc.HTTPBadRequest(explanation=expl))
+ except TypeError:
+ expl = _('Bad networks format')
+ raise faults.Fault(exc.HTTPBadRequest(explanation=expl))
+
+ return networks
+
class ServerXMLDeserializer(wsgi.XMLDeserializer):
"""