def GET(self, req, *parts): """ Handle GET Container (List Objects) request """ env = self._fresh_env(req) env['SERVER_PORT'] = self.conf.get('volume_endpoint_port') env['SCRIPT_NAME'] = '/v1' env['HTTP_HOST'] = '%s:%s' % \ (self.conf.get('volume_endpoint_host'), self.conf.get('volume_endpoint_port')) env['CONTENT_LENGTH'] = 0 status, headers, body, status_code = access_resource(env, 'GET', '/v1' + self.os_path, True, None, None) if status: data = json.loads(body).get('volume') body = {} body['id'] = '/'.join([self.tenant_id, 'Volume', parts[0]]) match_up(body, data, 'name', 'display_name') match_up(body, data, 'description', 'display_description') match_up(body, data, 'created', 'created_at') match_up(body, data, 'capacity', 'size') body['capacity'] = int(body['capacity']) * 1000000 body['state'] = map_volume_state(data['status']) body['bootable'] = 'false' body['type'] = 'http://schemas.dmtf.org/cimi/1/mapped' operations = [] operations.append(self._create_op('delete', '/'.join([self.tenant_id, 'volume', parts[0]]))) body['operations'] = operations if self.res_content_type == 'application/xml': response_data = {'Volume': body} else: body['resourceURI'] = '/'.join([self.uri_prefix, self.entity_uri]) response_data = body new_content = make_response_data(response_data, self.res_content_type, self.metadata, self.uri_prefix) resp = Response() self._fixup_cimi_header(resp) resp.headers['Content-Type'] = self.res_content_type resp.status = status_code resp.body = new_content return resp else: resp = Response() resp.status = status_code resp.body = 'Volume could not be found' return resp
def GET(self, req, *parts): """ Handle GET machine request """ env = self._fresh_env(req) env['SERVER_PORT'] = self.conf.get('volume_endpoint_port') env['SCRIPT_NAME'] = '/v1' env['HTTP_HOST'] = '%s:%s'%(self.conf.get('volume_endpoint_host'), self.conf.get('volume_endpoint_port')) status, headers, body = access_resource(env, 'GET', '/v1/' + self.os_path, True, None) if status: content = json.loads(body) body = {} body['resourceURI'] = '/'.join([self.uri_prefix.rstrip('/'), self.entity_uri]) body['id'] = '/'.join([self.tenant_id, self.entity_uri]) body['volumes'] = [] volumes = content.get('volumes', []) for volume in volumes: entry = {} entry['resourceURI'] = '/'.join([self.uri_prefix.rstrip('/'), 'Volume']) entry['id'] = '/'.join([self.tenant_id, 'Volume', volume['id']]) body['volumes'].append(entry) body['count'] = len(body['volumes']) if self.res_content_type == 'application/xml': response_data = {'Collection': body} else: response_data = body new_content = make_response_data(response_data, self.res_content_type, self.metadata, self.uri_prefix) resp = Response() self._fixup_cimi_header(resp) resp.headers['Content-Type'] = self.res_content_type resp.status = 200 resp.body = new_content return resp else: resp = Response() resp.status = 404 return resp
def DELETE(self, req, *parts): """ Handle the delete volume request """ env = self._fresh_env(req) env['SERVER_PORT'] = self.conf.get('volume_endpoint_port') env['SCRIPT_NAME'] = '/v1' env['HTTP_HOST'] = '%s:%s' % \ (self.conf.get('volume_endpoint_host'), self.conf.get('volume_endpoint_port')) env['CONTENT_LENGTH'] = 0 status, headers, body, status_code = access_resource(env, 'DELETE', '/v1' + self.os_path, True, None, None) resp = Response() resp.status = status_code return resp
def POST(self, req, *parts): """ Handle Machine operations """ try: request_data = get_request_data(req.body, self.req_content_type) except Exception as error: return get_err_response('MalformedBody') request_data = request_data.get('body', {}) if request_data.get('Action'): request_data = request_data.get('Action') action = request_data.get('action', 'notexist') resp = None if action in Consts.MACHINE_ACTIONS: # Need to get the current machine state env = self._fresh_env(req) env['SCRIPT_NAME'] = '/v2' env['CONTENT_LENGTH'] = 0 action = action.split('/')[-1] access_path = '/'.join(['/v2', self.tenant_id, 'servers', parts[0]]) status, headers, body, status_code = access_resource(env, 'GET', access_path, True, None, None) if status: body = json.loads(body) key = ''.join([body['server']['status'].lower(), '_', action]) method = Consts.MACHINE_ACTION_MAPS.get(key) if method: resp = self._run_method(req, request_data, method, *parts) else: resp = get_err_response('NotFound') if resp: return resp else: return get_err_response('NotImplemented')
def GET(self, req, *parts): """ Handle GET Container (List Objects) request """ env = self._fresh_env(req) env['PATH_INFO'] = concat(self.os_path, '/', parts[0], '/os-volume_attachments/', parts[1]) new_req = Request(env) res = new_req.get_response(self.app) if res.status_int == 200: data = json.loads(res.body).get('volumeAttachment') body = {} body['id'] = concat(self.tenant_id, '/MachineVolume/', data['serverId'], '/', data['id']) match_up(body, data, 'initialLocation', 'device') body['volume'] = {'href': concat(self.tenant_id, '/Volume/', data['volumeId'])} # deal with machinevolume operations operations = [] operations.append(self._create_op('edit', body['id'])) operations.append(self._create_op('delete', body['id'])) body['operations'] = operations # Try to get the volume state env = self._fresh_env(req) env['SERVER_PORT'] = self.conf.get('volume_endpoint_port') env['SCRIPT_NAME'] = '/v1' env['HTTP_HOST'] = '%s:%s' % \ (self.conf.get('volume_endpoint_host'), self.conf.get('volume_endpoint_port')) env['CONTENT_LENGTH'] = 0 volume_path = '/'.join(['/v1', self.tenant_id, 'volumes', data['volumeId']]) status, headers, volume_body, status_code = \ access_resource(env, 'GET', volume_path, True, None, None) if status: volume_data = json.loads(volume_body).get('volume') body['state'] = map_volume_state(volume_data['status']) if self.res_content_type == 'application/xml': response_data = {'MachineVolume': body} else: body['resourceURI'] = concat(self.uri_prefix, '/', self.entity_uri) response_data = body new_content = make_response_data(response_data, self.res_content_type, self.metadata, self.uri_prefix) resp = Response() self._fixup_cimi_header(resp) resp.headers['Content-Type'] = self.res_content_type resp.status = 200 resp.body = new_content return resp else: return res
def POST(self, req, *parts): """ Handle POST machine request which will create a machine """ try: request_data = get_request_data(req.body, self.req_content_type) except Exception as error: return get_err_response('MalformedBody') if request_data: data = request_data.get('body').get('VolumeCreate') if not data: data = request_data.get('body') if data: action = data.get('resourceURI') # this is to ensure that the json format contains # the right indicator for volume create if not action or action != '/'.join([self.uri_prefix, 'VolumeCreate']): data = None if data: new_body = {} match_up(new_body, data, 'display_name', 'name') match_up(new_body, data, 'display_description', 'description') match_up(new_body, data, 'size', 'volumeTemplate/volumeConfig/capacity') # map the properties to metadata match_up(new_body, data, 'metadata', 'properties') # check if there are some extra things """ if has_extra(data, {'resourceURI': None, 'xmlns': None, 'name': None, 'description': None, 'properties': None, 'volumeTemplate': {'volumeConfig': {'capacity': None}}}): return get_err_response('BadRequest') """ self.os_path = '/%s/volumes' % (self.tenant_id) env = self._fresh_env(req) env['SERVER_PORT'] = self.conf.get('volume_endpoint_port') env['SCRIPT_NAME'] = '/v1' env['HTTP_HOST'] = '%s:%s' % \ (self.conf.get('volume_endpoint_host'), self.conf.get('volume_endpoint_port')) new_body_json = json.dumps({'volume': new_body}) env['CONTENT_LENGTH'] = len(new_body_json) status, headers, body, status_code = access_resource(env, 'POST', '/v1' + self.os_path, True, None, new_body_json) if status: # resource created successfully, we redirect the request # to query machine resp_data = json.loads(body) data = resp_data.get('volume') resp_data = {} match_up(resp_data, data, 'name', 'display_name') match_up(resp_data, data, 'description', 'display_description') match_up(resp_data, data, 'capacity', 'size') match_up(resp_data, data, 'created', 'created_at') resp_data['id'] = ''.join([self.tenant_id, '/volume/', data.get('id')]) location = resp_data['id'] if self.res_content_type == 'application/xml': response_data = {'Volume': resp_data} else: resp_data['resourceURI'] = '/'.join([self.uri_prefix, 'Volume']) response_data = resp_data new_content = make_response_data(response_data, self.res_content_type, self.volume_metadata, self.uri_prefix) resp = Response() self._fixup_cimi_header(resp) resp.headers['Content-Type'] = self.res_content_type resp.headers['Location'] = \ '/'.join([self.request_prefix, location]) resp.status = 201 resp.body = new_content return resp else: return get_err_response('BadRequest') else: return get_err_response('BadRequest') else: return get_err_response('BadRequest')
def GET(self, req, *parts): """ Handle GET machine request """ env = self._fresh_env(req) env['SERVER_PORT'] = self.conf.get('volume_endpoint_port') env['SCRIPT_NAME'] = '/v1' env['HTTP_HOST'] = '%s:%s' % (self.conf.get('volume_endpoint_host'), self.conf.get('volume_endpoint_port')) status, headers, body, status_code = access_resource(env, 'GET', '/v1/' + self.os_path, True, None) if status: content = json.loads(body) body = {} body['resourceURI'] = '/'.join([self.uri_prefix, self.entity_uri]) body['id'] = '/'.join([self.tenant_id, self.entity_uri]) body['volumes'] = [] volumes = content.get('volumes', []) for volume in volumes: entry = {} if self.res_content_type != 'application/xml': entry['resourceURI'] = '/'.join([self.uri_prefix, 'Volume']) entry['id'] = '/'.join([self.tenant_id, 'Volume', volume['id']]) entry['name'] = volume['display_name'] entry['description'] = volume['display_description'] entry['created'] = volume['created_at'] entry['state'] = map_volume_state(volume['status']) entry['capacity'] = int(volume['size']) * 1000000 entry['bootable'] = 'false' entry['type'] = 'http://schemas.dmtf.org/cimi/1/mapped' body['volumes'].append(entry) operations = [] operations.append(self._create_op('add', '/'.join([self.tenant_id, 'volumeCollection']))) body['operations'] = operations body['count'] = len(body['volumes']) if self.res_content_type == 'application/xml': response_data = {'Collection': body} else: response_data = body new_content = make_response_data(response_data, self.res_content_type, self.metadata, self.uri_prefix) resp = Response() self._fixup_cimi_header(resp) resp.headers['Content-Type'] = self.res_content_type resp.status = 200 resp.body = new_content return resp else: resp = Response() resp.status = 404 return resp