def on_start(self, resource_id): ctx = context.current() instance_reservation = db_api.instance_reservation_get(resource_id) reservation_id = instance_reservation['reservation_id'] try: self.nova.flavor_access.add_tenant_access(reservation_id, ctx.project_id) except nova_exceptions.ClientException: LOG.info( 'Failed to associate flavor %(reservation_id)s ' 'to project %(project_id)s', { 'reservation_id': reservation_id, 'project_id': ctx.project_id }) raise mgr_exceptions.EventError() pool = nova.ReservationPool() # Dict of number of instances to reserve on a host keyed by the # host id allocation_map = collections.defaultdict(lambda: 0) for allocation in db_api.host_allocation_get_all_by_values( reservation_id=reservation_id): host_id = allocation['compute_host_id'] allocation_map[host_id] += 1 for host_id, num in allocation_map.items(): host = db_api.host_get(host_id) pool.add_computehost(instance_reservation['aggregate_id'], host['service_name'], stay_in=True) self.placement_client.update_reservation_inventory( host['hypervisor_hostname'], reservation_id, num)
def on_end(self, resource_id): instance_reservation = db_api.instance_reservation_get(resource_id) ctx = context.current() try: self.nova.flavor_access.remove_tenant_access( instance_reservation['reservation_id'], ctx.project_id) except nova_exceptions.NotFound: pass allocations = db_api.host_allocation_get_all_by_values( reservation_id=instance_reservation['reservation_id']) for allocation in allocations: db_api.host_allocation_destroy(allocation['id']) for server in self.nova.servers.list(search_opts={ 'flavor': instance_reservation['reservation_id'], 'all_tenants': 1 }, detailed=False): server.delete() self.cleanup_resources(instance_reservation)
def on_end(self, resource_id): instance_reservation = db_api.instance_reservation_get(resource_id) reservation_id = instance_reservation['reservation_id'] ctx = context.current() try: self.nova.flavor_access.remove_tenant_access( reservation_id, ctx.project_id) except nova_exceptions.NotFound: pass allocations = db_api.host_allocation_get_all_by_values( reservation_id=reservation_id) for allocation in allocations: host = db_api.host_get(allocation['compute_host_id']) db_api.host_allocation_destroy(allocation['id']) try: self.placement_client.delete_reservation_inventory( host['service_name'], reservation_id) except openstack_ex.ResourceProviderNotFound: pass for server in self.nova.servers.list(search_opts={ 'flavor': reservation_id, 'all_tenants': 1}, detailed=False): server.delete() self.cleanup_resources(instance_reservation) self.placement_client.delete_reservation_class(reservation_id)
def on_end(self, resource_id): instance_reservation = db_api.instance_reservation_get(resource_id) reservation_id = instance_reservation['reservation_id'] ctx = context.current() try: self.nova.flavor_access.remove_tenant_access( reservation_id, ctx.project_id) except nova_exceptions.NotFound: pass hostnames = [] allocations = db_api.host_allocation_get_all_by_values( reservation_id=reservation_id) for allocation in allocations: host = db_api.host_get(allocation['compute_host_id']) db_api.host_allocation_destroy(allocation['id']) hostnames.append(host['hypervisor_hostname']) for server in self.nova.servers.list(search_opts={ 'flavor': reservation_id, 'all_tenants': 1 }, detailed=False): try: self.nova.servers.delete(server=server) except nova_exceptions.NotFound: LOG.info( "Could not find server '%s', may have been deleted " "concurrently.", server.id) except Exception as e: LOG.exception("Failed to delete server '%s': %s.", server.id, str(e)) # We need to check the deletion is complete before deleting the # reservation inventory. See the bug #1813252 for details. if not self._check_server_deletion(reservation_id): LOG.error('Timed out while deleting servers on reservation %s', reservation_id) raise mgr_exceptions.ServerDeletionTimeout() self.cleanup_resources(instance_reservation) for host_name in hostnames: try: self.placement_client.delete_reservation_inventory( host_name, reservation_id) except openstack_ex.ResourceProviderNotFound: pass self.placement_client.delete_reservation_class(reservation_id)
def on_start(self, resource_id): ctx = context.current() instance_reservation = db_api.instance_reservation_get(resource_id) reservation_id = instance_reservation['reservation_id'] try: self.nova.flavor_access.add_tenant_access(reservation_id, ctx.project_id) except nova_exceptions.ClientException: LOG.info('Failed to associate flavor %(reservation_id)s ' 'to project %(project_id)s', {'reservation_id': reservation_id, 'project_id': ctx.project_id}) raise mgr_exceptions.EventError() pool = nova.ReservationPool() for allocation in db_api.host_allocation_get_all_by_values( reservation_id=reservation_id): host = db_api.host_get(allocation['compute_host_id']) pool.add_computehost(instance_reservation['aggregate_id'], host['service_name'], stay_in=True)