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) host_ref = host_id or host_name if host_ref is None: raise manager_exceptions.InvalidHost(host=host_values) servers = self.inventory.get_servers_per_host(host_ref) if servers: raise manager_exceptions.HostHavingServers(host=host_ref, servers=servers) host_details = self.inventory.get_host_details(host_ref) # NOTE(sbauza): Only last duplicate name for same extra capability will # be stored extra_capabilities_keys = \ set(host_values.keys()) - set(host_details.keys()) extra_capabilities = \ dict((key, host_values[key]) for key in extra_capabilities_keys) self.pool.add_computehost(self.freepool_name, host_ref) host = None cantaddextracapability = [] try: host = db_api.host_create(host_details) except RuntimeError: #We need to rollback # TODO(sbauza): Investigate use of Taskflow for atomic transactions self.pool.remove_computehost(self.freepool_name, host_ref) if host: 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 RuntimeError: cantaddextracapability.append(key) if cantaddextracapability: raise manager_exceptions.CantAddExtraCapability( keys=cantaddextracapability, host=host['id']) if host: return self.get_computehost(host['id']) else: return None
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_inventory.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 ) pool = rp.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.ClimateDBException: # We need to rollback # TODO(sbauza): Investigate use of Taskflow for atomic # transactions pool.remove_computehost(self.freepool_name, host_details['service_name']) if host: 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.ClimateDBException: cantaddextracapability.append(key) if cantaddextracapability: raise manager_ex.CantAddExtraCapability( keys=cantaddextracapability, host=host['id']) if host: return self.get_computehost(host['id']) else: return None