def resize(server_id, flavor_id, credentials=None, atomic_context=None): vm = util.get_vm(server_id, credentials, for_update=True, non_deleted=True, non_suspended=True) flavor = util.get_flavor(flavor_id, credentials, include_deleted=False, for_project=vm.project) action_fields = {"beparams": {"vcpus": flavor.cpu, "maxmem": flavor.ram}} with commands.ServerCommand("RESIZE", server_id, credentials, atomic_context, action_fields=action_fields) as vm: old_flavor = vm.flavor # User requested the same flavor if old_flavor.id == flavor.id: raise faults.BadRequest("Server '%s' flavor is already '%s'." % (vm, flavor)) # Check that resize can be performed if old_flavor.disk != flavor.disk: raise faults.BadRequest("Cannot change instance's disk size.") if old_flavor.volume_type_id != flavor.volume_type_id: raise faults.BadRequest("Cannot change instance's volume type.") log.info("Resizing VM from flavor '%s' to '%s", old_flavor, flavor) job_id = backend.resize_instance(vm, vcpus=flavor.cpu, memory=flavor.ram) vm.record_job(job_id) return vm
def resize(server_id, flavor_id, credentials=None, atomic_context=None): vm = util.get_vm(server_id, credentials, for_update=True, non_deleted=True, non_suspended=True) flavor = util.get_flavor(flavor_id, credentials, include_deleted=False, for_project=vm.project) action_fields = {"beparams": {"vcpus": flavor.cpu, "maxmem": flavor.ram}} with commands.ServerCommand( "RESIZE", server_id, credentials, atomic_context, action_fields=action_fields) as vm: old_flavor = vm.flavor # User requested the same flavor if old_flavor.id == flavor.id: raise faults.BadRequest("Server '%s' flavor is already '%s'." % (vm, flavor)) # Check that resize can be performed if old_flavor.disk != flavor.disk: raise faults.BadRequest("Cannot change instance's disk size.") if old_flavor.volume_type_id != flavor.volume_type_id: raise faults.BadRequest("Cannot change instance's volume type.") log.info("Resizing VM from flavor '%s' to '%s", old_flavor, flavor) job_id = backend.resize_instance( vm, vcpus=flavor.cpu, memory=flavor.ram) vm.record_job(job_id) return vm
def get_flavor_details(request, flavor_id): # Normal Response Codes: 200, 203 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badRequest (400), # itemNotFound (404), # overLimit (413) log.debug('get_flavor_details %s', flavor_id) credentials = request.credentials flavor = util.get_flavor(flavor_id, credentials, include_deleted=True, include_for_user=True) flavordict = flavor_to_dict(flavor, detail=True, projects=request.user_projects) if request.serialization == 'xml': data = render_to_string('flavor.xml', {'flavor': flavordict}) else: data = json.dumps({'flavor': flavordict}) return HttpResponse(data, status=200)
def create_server(request): # Normal Response Code: 202 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badMediaType(415), # itemNotFound (404), # badRequest (400), # serverCapacityUnavailable (503), # overLimit (413) req = utils.get_json_body(request) user_id = request.user_uniq log.info('create_server user: %s request: %s', user_id, req) try: server = req['server'] name = server['name'] metadata = server.get('metadata', {}) assert isinstance(metadata, dict) image_id = server['imageRef'] flavor_id = server['flavorRef'] personality = server.get('personality', []) assert isinstance(personality, list) networks = server.get("networks") if networks is not None: assert isinstance(networks, list) project = server.get("project") except (KeyError, AssertionError): raise faults.BadRequest("Malformed request") volumes = None dev_map = server.get("block_device_mapping_v2") if dev_map is not None: volumes = parse_block_device_mapping(dev_map) # Verify that personalities are well-formed util.verify_personality(personality) # Get flavor (ensure it is active) flavor = util.get_flavor(flavor_id, include_deleted=False) if not flavor.allow_create: msg = ("It is not allowed to create a server from flavor with id '%d'," " see 'allow_create' flavor attribute") raise faults.Forbidden(msg % flavor.id) # Generate password password = util.random_password() vm = servers.create(user_id, name, password, flavor, image_id, metadata=metadata, personality=personality, project=project, networks=networks, volumes=volumes) server = vm_to_dict(vm, detail=True) server['status'] = 'BUILD' server['adminPass'] = password response = render_server(request, server, status=202) return response
def create_server(request): # Normal Response Code: 202 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badMediaType(415), # itemNotFound (404), # badRequest (400), # serverCapacityUnavailable (503), # overLimit (413) req = utils.get_request_dict(request) user_id = request.user_uniq log.info('create_server user: %s request: %s', user_id, req) try: server = req['server'] name = server['name'] metadata = server.get('metadata', {}) assert isinstance(metadata, dict) image_id = server['imageRef'] flavor_id = server['flavorRef'] personality = server.get('personality', []) assert isinstance(personality, list) networks = server.get("networks") if networks is not None: assert isinstance(networks, list) except (KeyError, AssertionError): raise faults.BadRequest("Malformed request") # Verify that personalities are well-formed util.verify_personality(personality) # Get image information image = util.get_image_dict(image_id, user_id) # Get flavor (ensure it is active) flavor = util.get_flavor(flavor_id, include_deleted=False) if not flavor.allow_create: msg = ("It is not allowed to create a server from flavor with id '%d'," " see 'allow_create' flavor attribute") raise faults.Forbidden(msg % flavor.id) # Generate password password = util.random_password() vm = servers.create(user_id, name, password, flavor, image, metadata=metadata, personality=personality, networks=networks) server = vm_to_dict(vm, detail=True) server['status'] = 'BUILD' server['adminPass'] = password response = render_server(request, server, status=202) return response
def create_server(request): # Normal Response Code: 202 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badMediaType(415), # itemNotFound (404), # badRequest (400), # serverCapacityUnavailable (503), # overLimit (413) req = utils.get_request_dict(request) log.info('create_server %s', req) user_id = request.user_uniq try: server = req['server'] name = server['name'] metadata = server.get('metadata', {}) assert isinstance(metadata, dict) image_id = server['imageRef'] flavor_id = server['flavorRef'] personality = server.get('personality', []) assert isinstance(personality, list) except (KeyError, AssertionError): raise faults.BadRequest("Malformed request") # Verify that personalities are well-formed util.verify_personality(personality) # Get image information image = util.get_image_dict(image_id, user_id) # Get flavor (ensure it is active) flavor = util.get_flavor(flavor_id, include_deleted=False) # Generate password password = util.random_password() vm = do_create_server(user_id, name, password, flavor, image, metadata=metadata, personality=personality) server = vm_to_dict(vm, detail=True) server['status'] = 'BUILD' server['adminPass'] = password response = render_server(request, server, status=202) return response
def resize(request, vm, args): # Normal Response Code: 202 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badRequest (400), # badMediaType(415), # itemNotFound (404), # buildInProgress (409), # serverCapacityUnavailable (503), # overLimit (413), # resizeNotAllowed (403) flavor_id = args.get("flavorRef") if flavor_id is None: raise faults.BadRequest("Missing 'flavorRef' attribute.") flavor = util.get_flavor(flavor_id=flavor_id, include_deleted=False) servers.resize(vm, flavor=flavor) return HttpResponse(status=202)
def resize(request, vm, args): # Normal Response Code: 202 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badRequest (400), # badMediaType(415), # itemNotFound (404), # buildInProgress (409), # serverCapacityUnavailable (503), # overLimit (413), # resizeNotAllowed (403) flavorRef = args.get("flavorRef") if flavorRef is None: raise faults.BadRequest("Missing 'flavorRef' attribute.") flavor = util.get_flavor(flavor_id=flavorRef, include_deleted=False) servers.resize(vm, flavor=flavor) return HttpResponse(status=202)
def get_flavor_details(request, flavor_id): # Normal Response Codes: 200, 203 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badRequest (400), # itemNotFound (404), # overLimit (413) log.debug('get_flavor_details %s', flavor_id) flavor = util.get_flavor(flavor_id, include_deleted=True) flavordict = flavor_to_dict(flavor, detail=True) if request.serialization == 'xml': data = render_to_string('flavor.xml', {'flavor': flavordict}) else: data = json.dumps({'flavor': flavordict}) return HttpResponse(data, status=200)
def create_server(request): # Normal Response Code: 202 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # badMediaType(415), # itemNotFound (404), # badRequest (400), # serverCapacityUnavailable (503), # overLimit (413) req = utils.get_json_body(request) credentials = request.credentials user_id = credentials.userid log.info("User: %s, Action: create_server, Request: %s", user_id, req) try: server = req['server'] name = server['name'] metadata = server.get('metadata', {}) assert isinstance(metadata, dict) image_id = server['imageRef'] flavor_id = server['flavorRef'] personality = server.get('personality', []) assert isinstance(personality, list) networks = server.get("networks") if networks is not None: assert isinstance(networks, list) project = server.get("project") shared_to_project = server.get("shared_to_project", False) key_name = server.get('key_name') user_data = server.get('user_data', "") SNF_key_names = server.get('SNF:key_names', []) assert isinstance(SNF_key_names, list) except (KeyError, AssertionError): raise faults.BadRequest("Malformed request") volumes = None dev_map = server.get("block_device_mapping_v2") if dev_map is not None: allowed_types = VOLUME_SOURCE_TYPES[:] if snapshots_enabled_for_user(request.user): allowed_types.append('snapshot') volumes = parse_block_device_mapping(dev_map, allowed_types) # If no project is provided, use the user's system project as default. if project is None: project = user_id # Verify that personalities are well-formed util.verify_personality(personality) # Verify that user_data are well-formed util.verify_user_data(user_data) # Get flavor (ensure it is active and project has access) flavor = util.get_flavor(flavor_id, credentials, include_deleted=False, for_project=project) if not util.can_create_flavor(flavor, request.user): msg = ("It is not allowed to create a server from flavor with id '%d'," " see 'allow_create' flavor attribute") raise faults.Forbidden(msg % flavor.id) # Generate password password = util.random_password() if key_name is not None: # If both key_name and SNF:key_names are provided we should # raise an error if len(SNF_key_names) > 0: raise faults.BadRequest('Only one of the SNF:key_names and' 'key_name can be set') # If only key_name is provided then we will set key_names as # a list with only one element else: key_names = [key_name] else: # In case key_name is not provided we will set key_names to the # value of SNF:key_names. We don't need to check if it is provided # since even if it is not, its value will be [] # Remove duplicate key names key_names = list(set(SNF_key_names)) vm = servers.create(credentials, name, password, flavor, image_id, metadata=metadata, personality=personality, user_data=user_data, project=project, networks=networks, volumes=volumes, shared_to_project=shared_to_project, key_names=key_names) log.info("User %s created VM %s, shared: %s", user_id, vm.id, shared_to_project) server = vm_to_dict(vm, detail=True) server['status'] = 'BUILD' server['adminPass'] = password set_password_in_cache(server['id'], password) response = render_server(request, server, status=202) return response