def _action_create_image(self, req, id, body): """Snapshot a server instance.""" context = req.environ["nova.context"] entity = body.get("createImage", {}) image_name = entity.get("name") if not image_name: msg = _("createImage entity requires name attribute") raise exc.HTTPBadRequest(explanation=msg) props = {} metadata = entity.get("metadata", {}) common.check_img_metadata_quota_limit(context, metadata) try: props.update(metadata) except ValueError: msg = _("Invalid metadata") raise exc.HTTPBadRequest(explanation=msg) instance = self._get_server(context, id) try: image = self.compute_api.snapshot(context, instance, image_name, extra_properties=props) except exception.InstanceInvalidState as state_error: common.raise_http_conflict_for_instance_invalid_state(state_error, "createImage") # build location of newly-created image entity image_id = str(image["id"]) image_ref = os.path.join(req.application_url, context.project_id, "images", image_id) resp = webob.Response(status_int=202) resp.headers["Location"] = image_ref return resp
def _action_create_backup(self, input_dict, req, instance_id): """Backup a server instance. Images now have an `image_type` associated with them, which can be 'snapshot' or the backup type, like 'daily' or 'weekly'. If the image_type is backup-like, then the rotation factor can be included and that will cause the oldest backups that exceed the rotation factor to be deleted. """ context = req.environ["nova.context"] entity = input_dict["createBackup"] try: image_name = entity["name"] backup_type = entity["backup_type"] rotation = entity["rotation"] except KeyError as missing_key: msg = _("createBackup entity requires %s attribute") % missing_key raise exc.HTTPBadRequest(explanation=msg) except TypeError: msg = _("Malformed createBackup entity") raise exc.HTTPBadRequest(explanation=msg) try: rotation = int(rotation) except ValueError: msg = _("createBackup attribute 'rotation' must be an integer") raise exc.HTTPBadRequest(explanation=msg) # preserve link to server in image properties server_ref = os.path.join(req.application_url, 'servers', instance_id) props = {'instance_ref': server_ref} metadata = entity.get('metadata', {}) common.check_img_metadata_quota_limit(context, metadata) try: props.update(metadata) except ValueError: msg = _("Invalid metadata") raise exc.HTTPBadRequest(explanation=msg) image = self.compute_api.backup(context, instance_id, image_name, backup_type, rotation, extra_properties=props) # build location of newly-created image entity image_id = str(image['id']) image_ref = os.path.join(req.application_url, 'images', image_id) resp = webob.Response(status_int=202) resp.headers['Location'] = image_ref return resp
def update_all(self, req, image_id, body): context = req.environ['nova.context'] image = self._get_image(context, image_id) metadata = body.get('metadata', {}) common.check_img_metadata_quota_limit(context, metadata) image['properties'] = metadata self.image_service.update(context, image_id, image, None) return dict(metadata=metadata)
def create(self, req, image_id, body): context = req.environ['nova.context'] image = self._get_image(context, image_id) if 'metadata' in body: for key, value in body['metadata'].iteritems(): image['properties'][key] = value common.check_img_metadata_quota_limit(context, image['properties']) self.image_service.update(context, image_id, image, None) return dict(metadata=image['properties'])
def _action_create_image(self, input_dict, req, instance_id): """Snapshot a server instance.""" entity = input_dict.get("createImage", {}) try: image_name = entity["name"] force_snapshot = entity.get("force_snapshot", False) except KeyError: msg = _("createImage entity requires name attribute") raise webob.exc.HTTPBadRequest(explanation=msg) except TypeError: msg = _("Malformed createImage entity") raise webob.exc.HTTPBadRequest(explanation=msg) # preserve link to server in image properties server_ref = os.path.join(req.application_url, 'servers', str(instance_id)) props = {'instance_ref': server_ref} metadata = entity.get('metadata', {}) context = req.environ['nova.context'] common.check_img_metadata_quota_limit(context, metadata) try: props.update(metadata) except ValueError: msg = _("Invalid metadata") raise webob.exc.HTTPBadRequest(explanation=msg) try: extra_options = { 'force_snapshot' : force_snapshot } image = self.compute_api.snapshot(context, instance_id, image_name, extra_properties=props, extra_options=extra_options) except exception.InstanceBusy: msg = _("Server is currently creating an image. Please wait.") raise webob.exc.HTTPConflict(explanation=msg) # build location of newly-created image entity image_id = str(image['id']) image_ref = os.path.join(req.application_url, context.project_id, 'images', image_id) resp = webob.Response(status_int=202) resp.headers['Location'] = image_ref return resp
def create(self, req, image_id, body): context = req.environ['nova.context'] img = self.image_service.show(context, image_id) metadata = self._get_metadata(context, image_id, img) if 'metadata' in body: for key, value in body['metadata'].iteritems(): metadata[key] = value common.check_img_metadata_quota_limit(context, metadata) img['properties'] = metadata self.image_service.update(context, image_id, img, None) return dict(metadata=metadata)
def _action_create_image(self, input_dict, req, instance_id): """Snapshot a server instance.""" context = req.environ["nova.context"] entity = input_dict.get("createImage", {}) try: image_name = entity["name"] except KeyError: msg = _("createImage entity requires name attribute") raise exc.HTTPBadRequest(explanation=msg) except TypeError: msg = _("Malformed createImage entity") raise exc.HTTPBadRequest(explanation=msg) # preserve link to server in image properties server_ref = os.path.join(req.application_url, "servers", instance_id) props = {"instance_ref": server_ref} metadata = entity.get("metadata", {}) common.check_img_metadata_quota_limit(context, metadata) try: props.update(metadata) except ValueError: msg = _("Invalid metadata") raise exc.HTTPBadRequest(explanation=msg) instance = self._get_server(context, instance_id) try: image = self.compute_api.snapshot(context, instance, image_name, extra_properties=props) except exception.InstanceBusy: msg = _("Server is currently creating an image. Please wait.") raise webob.exc.HTTPConflict(explanation=msg) # build location of newly-created image entity image_id = str(image["id"]) image_ref = os.path.join(req.application_url, context.project_id, "images", image_id) resp = webob.Response(status_int=202) resp.headers["Location"] = image_ref return resp
def _action_create_image(self, req, id, body): """Snapshot a server instance.""" context = req.environ['nova.context'] entity = body.get("createImage", {}) image_name = entity.get("name") if not image_name: msg = _("createImage entity requires name attribute") raise exc.HTTPBadRequest(explanation=msg) props = {} metadata = entity.get('metadata', {}) common.check_img_metadata_quota_limit(context, metadata) try: props.update(metadata) except ValueError: msg = _("Invalid metadata") raise exc.HTTPBadRequest(explanation=msg) instance = self._get_server(context, id) try: image = self.compute_api.snapshot(context, instance, image_name, extra_properties=props) except exception.InstanceInvalidState as state_error: common.raise_http_conflict_for_instance_invalid_state(state_error, 'createImage') # build location of newly-created image entity image_id = str(image['id']) image_ref = os.path.join(req.application_url, context.project_id, 'images', image_id) resp = webob.Response(status_int=202) resp.headers['Location'] = image_ref return resp
def _action_create_image(self, input_dict, req, instance_id): """Snapshot a server instance.""" entity = input_dict.get("createImage", {}) try: image_name = entity["name"] except KeyError: msg = _("createImage entity requires name attribute") raise webob.exc.HTTPBadRequest(explanation=msg) except TypeError: msg = _("Malformed createImage entity") raise webob.exc.HTTPBadRequest(explanation=msg) # preserve link to server in image properties server_ref = os.path.join(req.application_url, 'servers', str(instance_id)) props = {'instance_ref': server_ref} metadata = entity.get('metadata', {}) context = req.environ['nova.context'] common.check_img_metadata_quota_limit(context, metadata) try: props.update(metadata) except ValueError: msg = _("Invalid metadata") raise webob.exc.HTTPBadRequest(explanation=msg) image = self.compute_api.snapshot(context, instance_id, image_name, extra_properties=props) # build location of newly-created image entity image_id = str(image['id']) image_ref = os.path.join(req.application_url, 'images', image_id) resp = webob.Response(status_int=202) resp.headers['Location'] = image_ref return resp
def update(self, req, image_id, id, body): context = req.environ['nova.context'] try: meta = body['meta'] except KeyError: expl = _('Incorrect request body format') raise exc.HTTPBadRequest(explanation=expl) if not id in meta: expl = _('Request body and URI mismatch') raise exc.HTTPBadRequest(explanation=expl) if len(meta) > 1: expl = _('Request body contains too many items') raise exc.HTTPBadRequest(explanation=expl) image = self._get_image(context, image_id) image['properties'][id] = meta[id] common.check_img_metadata_quota_limit(context, image['properties']) self.image_service.update(context, image_id, image, None) return dict(meta=meta)
def _create_backup(self, req, id, body): """Backup a server instance. Images now have an `image_type` associated with them, which can be 'snapshot' or the backup type, like 'daily' or 'weekly'. If the image_type is backup-like, then the rotation factor can be included and that will cause the oldest backups that exceed the rotation factor to be deleted. """ context = req.environ["nova.context"] try: entity = body["createBackup"] except (KeyError, TypeError): raise exc.HTTPBadRequest(_("Malformed request body")) try: image_name = entity["name"] backup_type = entity["backup_type"] rotation = entity["rotation"] except KeyError as missing_key: msg = _("createBackup entity requires %s attribute") % missing_key raise exc.HTTPBadRequest(explanation=msg) except TypeError: msg = _("Malformed createBackup entity") raise exc.HTTPBadRequest(explanation=msg) try: rotation = int(rotation) except ValueError: msg = _("createBackup attribute 'rotation' must be an integer") raise exc.HTTPBadRequest(explanation=msg) props = {} metadata = entity.get('metadata', {}) common.check_img_metadata_quota_limit(context, metadata) try: props.update(metadata) except ValueError: msg = _("Invalid metadata") raise exc.HTTPBadRequest(explanation=msg) try: instance = self.compute_api.get(context, id) except exception.NotFound: raise exc.HTTPNotFound(_("Instance not found")) try: image = self.compute_api.backup(context, instance, image_name, backup_type, rotation, extra_properties=props) except exception.InstanceInvalidState as state_error: common.raise_http_conflict_for_instance_invalid_state( state_error, 'createBackup') # build location of newly-created image entity image_id = str(image['id']) image_ref = os.path.join(req.application_url, 'images', image_id) resp = webob.Response(status_int=202) resp.headers['Location'] = image_ref return resp