def _create_instance(self, context): server = self._build_server(context) image_id = context.get("image", None) flavor_id = context.get("flavor", None) net_ids = context.get("networks") image = self.get_image(identifier=image_id) flavor = self.get_flavor(identifier=flavor_id) networks = self.get_networks(net_ids) if image is None: raise a10_ex.ImageNotFoundError( MISSING_ERR_FORMAT.format("Image", image_id)) if flavor is None: raise a10_ex.FlavorNotFoundError( MISSING_ERR_FORMAT.format("Flavor", flavor_id)) if networks is None: msg = map(lambda x: MISSING_ERR_FORMAT.format("Network", x), net_ids) raise a10_ex.NetworksNotFoundError(msg) server["image"] = image.id server["flavor"] = flavor.id server["nics"] = [{'net-id': x['id']} for x in networks] created_instance = self._nova_api.servers.create(**server) # Next 6 lines - Added due to insane API on the other side if hasattr(created_instance.manager, 'client'): # This craziness works around a bug in Liberty. created_instance.manager.client.last_request_id = None self._create_server_spinlock(created_instance) # Get the IP address of the first interface (should be management) ip_address = self._get_ip_addresses_from_instance( created_instance.addresses, networks[0]['name']) return { 'name': server['name'], 'instance': created_instance, 'ip_address': ip_address, 'nova_instance_id': created_instance.id }
def get_image(self, identifier=None): result = None images = [] if identifier is None: raise a10_ex.IdentifierUnspecifiedError( "Parameter identifier must specify image id or name") img_filter = (lambda x: x is not None and ( (hasattr(x, "name") and x.name is not None and identifier in x.name ) or (hasattr(x, "id") and x.id == identifier))) try: images = self._nova_api.glance.list() except Exception as ex: raise a10_ex.ImageNotFoundError( "Unable to retrieve images from nova. Error %s" % (ex)) filtered = filter(img_filter, images) if filtered: result = filtered[0] return result