def _validate_reservation_params(self, values): if 'amount' in values: try: values['amount'] = strutils.validate_integer( values['amount'], "amount", 1, db_api.DB_MAX_INT) except ValueError as e: raise mgr_exceptions.MalformedParameter(six.text_type(e)) if 'affinity' in values: if (values['affinity'] not in NONE_VALUES and not strutils.is_valid_boolstr(values['affinity'])): raise mgr_exceptions.MalformedParameter( param='affinity (must be a bool value or None)')
def _convert_int_param(self, param, name): """Checks that the parameter is present and can be converted to int.""" if param is None: raise manager_ex.MissingParameter(param=name) if strutils.is_int_like(param): param = int(param) else: raise manager_ex.MalformedParameter(param=name) return param
def _validate_min_max_range(self, values, min_hosts, max_hosts): self._convert_int_param(min_hosts, 'min') self._convert_int_param(max_hosts, 'max') if min_hosts <= 0 or max_hosts <= 0: raise manager_ex.MalformedParameter( param='min and max (must be greater than or equal to 1)') if max_hosts < min_hosts: raise manager_ex.InvalidRange() values['count_range'] = str(min_hosts) + '-' + str(max_hosts)
def check_params(self, values): if 'network_id' not in values: raise manager_ex.MissingParameter(param='network_id') if 'amount' not in values: raise manager_ex.MissingParameter(param='amount') if not strutils.is_int_like(values['amount']): raise manager_ex.MalformedParameter(param='amount') # required_floatingips param is an optional parameter fips = values.get('required_floatingips', []) if not isinstance(fips, list): manager_ex.MalformedParameter(param='required_floatingips') for ip in fips: if not (netutils.is_valid_ipv4(ip) or netutils.is_valid_ipv6(ip)): raise manager_ex.InvalidIPFormat(ip=ip)
def _check_params(self, values): self._validate_min_max_range(values, values.get('min'), values.get('max')) if 'hypervisor_properties' not in values: raise manager_ex.MissingParameter(param='hypervisor_properties') if 'resource_properties' not in values: raise manager_ex.MissingParameter(param='resource_properties') if 'before_end' not in values: values['before_end'] = 'default' if values['before_end'] not in before_end_options: raise manager_ex.MalformedParameter(param='before_end')
def reserve_resource(self, reservation_id, values): self.validate_reservation_param(values) # TODO(masahito) the instance reservation plugin only supports # anti-affinity rule in short-term goal. if bool_from_string(values['affinity']): raise mgr_exceptions.MalformedParameter( param='affinity (only affinity = False is supported)') hosts = self.pickup_hosts(reservation_id, values) if len(hosts['added']) < values['amount']: raise mgr_exceptions.HostNotFound("The reservation can't be " "accommodate because of less " "capacity.") instance_reservation_val = { 'reservation_id': reservation_id, 'vcpus': values['vcpus'], 'memory_mb': values['memory_mb'], 'disk_gb': values['disk_gb'], 'amount': values['amount'], 'affinity': bool_from_string(values['affinity']), 'resource_properties': values['resource_properties'] } instance_reservation = db_api.instance_reservation_create( instance_reservation_val) for host_id in hosts['added']: db_api.host_allocation_create({'compute_host_id': host_id, 'reservation_id': reservation_id}) try: flavor, group, pool = self._create_resources(instance_reservation) except nova_exceptions.ClientException: LOG.exception("Failed to create Nova resources " "for reservation %s", reservation_id) self.cleanup_resources(instance_reservation) raise mgr_exceptions.NovaClientError() db_api.instance_reservation_update(instance_reservation['id'], {'flavor_id': flavor.id, 'server_group_id': group.id, 'aggregate_id': pool.id}) return instance_reservation['id']
def _check_params(self, values): min_hosts = self._convert_int_param(values.get('min'), 'min') max_hosts = self._convert_int_param(values.get('max'), 'max') if 0 <= min_hosts and min_hosts <= max_hosts: values['count_range'] = str(min_hosts) + '-' + str(max_hosts) else: raise manager_ex.InvalidRange() if 'hypervisor_properties' not in values: raise manager_ex.MissingParameter(param='hypervisor_properties') if 'resource_properties' not in values: raise manager_ex.MissingParameter(param='resource_properties') if 'before_end' not in values: values['before_end'] = 'default' if values['before_end'] not in before_end_options: raise manager_ex.MalformedParameter(param='before_end')
def update_reservation(self, reservation_id, new_values): """Updates an instance reservation with requested parameters. This method allows users to update an instance reservation under the following conditions. - If an instance reservation has not started yet - vcpus, memory_mb disk_gb and amount can be updateable unless Blazar can accommodate the new request. - If an instance reservation has already started - only amount is increasable. """ # TODO(masahito) the instance reservation plugin only supports # anti-affinity rule in short-term goal. if bool_from_string(new_values.get('affinity', None)): raise mgr_exceptions.MalformedParameter( param='affinity (only affinity = False is supported)') reservation = db_api.reservation_get(reservation_id) lease = db_api.lease_get(reservation['lease_id']) updatable = ['vcpus', 'memory_mb', 'disk_gb', 'affinity', 'amount', 'resource_properties'] if (not any([k in updatable for k in new_values.keys()]) and new_values['start_date'] >= lease['start_date'] and new_values['end_date'] <= lease['end_date']): # no update because of just shortening the reservation time return if (reservation['status'] == 'active' and any([k in updatable[:-1] for k in new_values.keys()])): msg = "An active reservation only accepts to update amount." raise mgr_exceptions.InvalidStateUpdate(msg) if reservation['status'] == 'error': msg = "An error reservation doesn't accept an updating request." raise mgr_exceptions.InvalidStateUpdate(msg) for key in updatable: if key not in new_values: new_values[key] = reservation[key] changed_hosts = self.pickup_hosts(reservation_id, new_values) if (reservation['status'] == 'active' and len(changed_hosts['removed']) > 0): err_msg = ("Instance reservation doesn't allow to reduce/replace " "reserved instance slots when the reservation is in " "active status.") raise mgr_exceptions.CantUpdateParameter(err_msg) if (new_values['amount'] - reservation['amount'] != (len(changed_hosts['added']) - len(changed_hosts['removed']))): raise mgr_exceptions.NotEnoughHostsAvailable() db_api.instance_reservation_update( reservation['resource_id'], {key: new_values[key] for key in updatable}) self.update_host_allocations(changed_hosts['added'], changed_hosts['removed'], reservation_id) try: self.update_resources(reservation_id) except mgr_exceptions.NovaClientError: raise