def reserve_resource(self, reservation_id, values): """Create reservation.""" self._check_params(values) host_ids = self._matching_hosts( values['hypervisor_properties'], values['resource_properties'], values['count_range'], values['start_date'], values['end_date'], ) if not host_ids: raise manager_ex.NotEnoughHostsAvailable() pool = nova.ReservationPool() pool_name = reservation_id az_name = "%s%s" % (CONF[self.resource_type].blazar_az_prefix, pool_name) pool_instance = pool.create(name=pool_name, az=az_name) host_rsrv_values = { 'reservation_id': reservation_id, 'aggregate_id': pool_instance.id, 'resource_properties': values['resource_properties'], 'hypervisor_properties': values['hypervisor_properties'], 'count_range': values['count_range'], 'status': 'pending', 'before_end': values['before_end'] } host_reservation = db_api.host_reservation_create(host_rsrv_values) for host_id in host_ids: db_api.host_allocation_create({'compute_host_id': host_id, 'reservation_id': reservation_id}) return host_reservation['id']
def reserve_resource(self, reservation_id, values): self.validate_reservation_param(values) hosts = self.pickup_hosts(reservation_id, values) 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'], default=None), '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 _update_allocations(self, dates_before, dates_after, reservation_id, reservation_status, host_reservation, values): min_hosts = self._convert_int_param( values.get('min', host_reservation['count_range'].split('-')[0]), 'min') max_hosts = self._convert_int_param( values.get('max', host_reservation['count_range'].split('-')[1]), 'max') if min_hosts < 0 or max_hosts < min_hosts: raise manager_ex.InvalidRange() hypervisor_properties = values.get( 'hypervisor_properties', host_reservation['hypervisor_properties']) resource_properties = values.get( 'resource_properties', host_reservation['resource_properties']) allocs = db_api.host_allocation_get_all_by_values( reservation_id=reservation_id) allocs_to_remove = self._allocations_to_remove(dates_before, dates_after, max_hosts, hypervisor_properties, resource_properties, allocs) if (allocs_to_remove and reservation_status == status.reservation.ACTIVE): raise manager_ex.NotEnoughHostsAvailable() kept_hosts = len(allocs) - len(allocs_to_remove) if kept_hosts < max_hosts: min_hosts = min_hosts - kept_hosts \ if (min_hosts - kept_hosts) > 0 else 0 max_hosts = max_hosts - kept_hosts host_ids = self._matching_hosts( hypervisor_properties, resource_properties, str(min_hosts) + '-' + str(max_hosts), dates_after['start_date'], dates_after['end_date']) if len(host_ids) >= min_hosts: pool = nova.ReservationPool() for host_id in host_ids: db_api.host_allocation_create({ 'compute_host_id': host_id, 'reservation_id': reservation_id }) if reservation_status == status.reservation.ACTIVE: # Add new host into the aggregate. new_host = db_api.host_get(host_id) pool.add_computehost(host_reservation['aggregate_id'], new_host['service_name']) else: raise manager_ex.NotEnoughHostsAvailable() for allocation in allocs_to_remove: db_api.host_allocation_destroy(allocation['id'])
def update_host_allocations(self, added, removed, reservation_id): allocations = db_api.host_allocation_get_all_by_values( reservation_id=reservation_id) removed_allocs = [a for a in allocations if a['compute_host_id'] in removed] for alloc in removed_allocs: db_api.host_allocation_destroy(alloc['id']) for added_host in added: db_api.host_allocation_create({'compute_host_id': added_host, 'reservation_id': reservation_id})
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 exceptions.BlazarException('affinity = True is not ' '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']), } 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 update_host_allocations(self, added, removed, reservation_id): allocations = db_api.host_allocation_get_all_by_values( reservation_id=reservation_id) removed_allocs = [] for host_id in removed: for allocation in allocations: if allocation['compute_host_id'] == host_id: removed_allocs.append(allocation['id']) break # TODO(tetsuro): It would be nice to have something like # db_api.host_allocation_replace() to process the following # deletion and addition in *one* DB transaction. for alloc_id in removed_allocs: db_api.host_allocation_destroy(alloc_id) for added_host in added: db_api.host_allocation_create({'compute_host_id': added_host, 'reservation_id': reservation_id})