def update_computehost(self, host_id, values): if values: cant_update_extra_capability = [] for value in values: capabilities = db_api.host_extra_capability_get_all_per_name( host_id, value, ) if capabilities: for raw_capability in capabilities: capability = { 'capability_name': value, 'capability_value': values[value], } try: db_api.host_extra_capability_update( raw_capability['id'], capability) except (db_ex.BlazarDBException, RuntimeError): cant_update_extra_capability.append( raw_capability['capability_name']) else: new_capability = { 'computehost_id': host_id, 'capability_name': value, 'capability_value': values[value], } try: db_api.host_extra_capability_create(new_capability) except (db_ex.BlazarDBException, RuntimeError): cant_update_extra_capability.append( new_capability['capability_name']) if cant_update_extra_capability: raise manager_ex.CantAddExtraCapability( host=host_id, keys=cant_update_extra_capability) return self.get_computehost(host_id)
def update_computehost(self, host_id, values): # nothing to update if not values: return self.get_computehost(host_id) cant_update_extra_capability = [] previous_capabilities = self._get_extra_capabilities(host_id) updated_keys = set(values.keys()) & set(previous_capabilities.keys()) new_keys = set(values.keys()) - set(previous_capabilities.keys()) for key in updated_keys: raw_capability = next( iter( db_api.host_extra_capability_get_all_per_name( host_id, key))) capability = { 'capability_name': key, 'capability_value': values[key], } if self.is_updatable_extra_capability(raw_capability): try: db_api.host_extra_capability_update( raw_capability['id'], capability) except (db_ex.BlazarDBException, RuntimeError): cant_update_extra_capability.append( raw_capability['capability_name']) else: LOG.info( "Capability %s can't be updated because " "existing reservations require it.", raw_capability['capability_name']) cant_update_extra_capability.append( raw_capability['capability_name']) for key in new_keys: new_capability = { 'computehost_id': host_id, 'capability_name': key, 'capability_value': values[key], } try: db_api.host_extra_capability_create(new_capability) except (db_ex.BlazarDBException, RuntimeError): cant_update_extra_capability.append( new_capability['capability_name']) if cant_update_extra_capability: raise manager_ex.CantAddExtraCapability( host=host_id, keys=cant_update_extra_capability) LOG.info('Extra capabilities on compute host %s updated with %s', host_id, values) return self.get_computehost(host_id)
def create_computehost(self, host_values): # TODO(sbauza): # - Exception handling for HostNotFound host_id = host_values.pop('id', None) host_name = host_values.pop('name', None) try: trust_id = host_values.pop('trust_id') except KeyError: raise manager_ex.MissingTrustId() host_ref = host_id or host_name if host_ref is None: raise manager_ex.InvalidHost(host=host_values) with trusts.create_ctx_from_trust(trust_id): inventory = nova.NovaInventory() servers = inventory.get_servers_per_host(host_ref) if servers: raise manager_ex.HostHavingServers(host=host_ref, servers=servers) host_details = inventory.get_host_details(host_ref) # NOTE(sbauza): Only last duplicate name for same extra capability # will be stored to_store = set(host_values.keys()) - set(host_details.keys()) extra_capabilities_keys = to_store extra_capabilities = dict( (key, host_values[key]) for key in extra_capabilities_keys ) if any([len(key) > 64 for key in extra_capabilities_keys]): raise manager_ex.ExtraCapabilityTooLong() self.placement_client.create_reservation_provider( host_details['hypervisor_hostname']) pool = nova.ReservationPool() pool.add_computehost(self.freepool_name, host_details['service_name']) host = None cantaddextracapability = [] try: if trust_id: host_details.update({'trust_id': trust_id}) host = db_api.host_create(host_details) except db_ex.BlazarDBException as e: # We need to rollback # TODO(sbauza): Investigate use of Taskflow for atomic # transactions pool.remove_computehost(self.freepool_name, host_details['service_name']) self.placement_client.delete_reservation_provider( host_details['hypervisor_hostname']) raise e for key in extra_capabilities: values = {'computehost_id': host['id'], 'capability_name': key, 'capability_value': extra_capabilities[key], } try: db_api.host_extra_capability_create(values) except db_ex.BlazarDBException: cantaddextracapability.append(key) if cantaddextracapability: raise manager_ex.CantAddExtraCapability( keys=cantaddextracapability, host=host['id']) return self.get_computehost(host['id'])