Ejemplo n.º 1
0
    def _storage_exist(self, context, access_info):
        access_info_dict = copy.deepcopy(access_info)

        # Remove unrelated query fields
        unrelated_fields = ['username', 'password']
        for access in constants.ACCESS_TYPE:
            if access_info_dict.get(access):
                for key in unrelated_fields:
                    access_info_dict[access].pop(key)

        # Check if storage is registered
        access_info_list = db.access_info_get_all(context,
                                                  filters=access_info_dict)
        for _access_info in access_info_list:
            try:
                storage = db.storage_get(context, _access_info['storage_id'])
                if storage:
                    LOG.error("Storage %s has same access "
                              "information." % storage['id'])
                    return True
            except exception.StorageNotFound:
                # Suppose storage was not saved successfully after access
                # information was saved in database when registering storage.
                # Therefore, removing access info if storage doesn't exist to
                # ensure the database has no residual data.
                LOG.debug("Remove residual access information.")
                db.access_info_delete(context, _access_info['storage_id'])

        return False
Ejemplo n.º 2
0
    def _cm_access_info_update(self, ctxt, access_info, body):
        access_info_dict = copy.deepcopy(access_info)
        unused = [
            'created_at', 'updated_at', 'storage_name', 'storage_id',
            'extra_attributes'
        ]
        access_info_dict = AccessInfo.to_dict(access_info_dict)
        for field in unused:
            if access_info_dict.get(field):
                access_info_dict.pop(field)
        for access in constants.ACCESS_TYPE:
            if access_info_dict.get(access):
                access_info_dict.pop(access)

        access_info_list = db.access_info_get_all(ctxt,
                                                  filters=access_info_dict)

        for cm_access_info in access_info_list:
            if cm_access_info['storage_id'] == access_info['storage_id']:
                continue
            for access in constants.ACCESS_TYPE:
                if cm_access_info.get(access):
                    cm_access_info[access]['password'] = cryptor.decode(
                        cm_access_info[access]['password'])
                if body.get(access):
                    cm_access_info[access].update(body[access])
            self.driver_api.update_access_info(ctxt, cm_access_info)
Ejemplo n.º 3
0
def access_info_filter(context, access_info):
    access_info_dict = copy.deepcopy(access_info)

    for access in constants.ACCESS_TYPE:
        if access_info_dict.get(access):
            access_info_dict.pop(access)

    # Check if storage is registered
    access_info_list = db.access_info_get_all(context,
                                              filters=access_info_dict)
    filtered_list = []
    for access_info_db in access_info_list:
        match = True
        for access in constants.ACCESS_TYPE:
            access_filter = access_info.get(access)
            access_db = access_info_db.get(access)
            if match and access_filter:
                if not access_db or\
                        access_filter['host'] != access_db['host'] or\
                        access_filter['port'] != access_db['port']:
                    match = False
                    break
        if match:
            filtered_list.append(access_info_db)

    return filtered_list
Ejemplo n.º 4
0
    def _get_driver_obj(self, context, cache_on_load=True, **kwargs):
        if not cache_on_load or not kwargs.get('storage_id'):
            if kwargs['verify']:
                ssl_utils.reload_certificate(kwargs['verify'])
            cls = self._get_driver_cls(**kwargs)
            return cls(**kwargs)

        if kwargs['storage_id'] in self.driver_factory:
            return self.driver_factory[kwargs['storage_id']]

        with self._instance_lock:
            if kwargs['storage_id'] in self.driver_factory:
                return self.driver_factory[kwargs['storage_id']]

            if kwargs['verify']:
                ssl_utils.reload_certificate(kwargs['verify'])

            access_info = copy.deepcopy(kwargs)
            storage_id = access_info.pop('storage_id')
            access_info.pop('verify')
            if access_info:
                cls = self._get_driver_cls(**kwargs)
                driver = cls(**kwargs)
            else:
                access_info = db.access_info_get(context, storage_id).to_dict()

                access_info_dict = copy.deepcopy(access_info)
                remove_fields = [
                    'created_at', 'updated_at', 'storage_id', 'storage_name',
                    'extra_attributes'
                ]
                # Remove unrelated query fields
                for field in remove_fields:
                    if access_info_dict.get(field):
                        access_info_dict.pop(field)
                for access in constants.ACCESS_TYPE:
                    if access_info_dict.get(access):
                        access_info_dict.pop(access)

                access_info_list = db.access_info_get_all(
                    context, filters=access_info_dict)
                for _access_info in access_info_list:
                    if _access_info['storage_id'] in self.driver_factory:
                        driver = self.driver_factory[
                            _access_info['storage_id']]
                        driver.add_storage(access_info)
                        self.driver_factory[storage_id] = driver
                        return driver
                access_info['verify'] = kwargs.get('verify')
                cls = self._get_driver_cls(**access_info)
                driver = cls(**access_info)

            self.driver_factory[storage_id] = driver
            return driver
Ejemplo n.º 5
0
 def show_all(self, req):
     """Show all access information."""
     ctxt = req.environ.get('delfin.context')
     access_infos = db.access_info_get_all(ctxt)
     return self._view_builder.show_all(access_infos)