def update_all(self, req, image_id, body): context = req.environ['engine.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['engine.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.""" context = req.environ['engine.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 update(self, req, image_id, id, body): context = req.environ['engine.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, 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["engine.context"] try: entity = input_dict["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) # 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) try: instance = self.compute_api.get(context, instance_id) except exception.NotFound: raise exc.HTTPNotFound(_("Instance not found")) image = self.compute_api.backup(context, instance, 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