예제 #1
0
 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)
예제 #2
0
    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)
예제 #3
0
    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'])