Пример #1
0
def get_all(contxt):
    """get all non-deleted storage pool usage as a dict"""
    if contxt is None:
        contxt = context.get_admin_context()
    try:
        uses = db.get_storage_pool_usage(contxt)
        return uses
    except db_exc.DBError as e:
        LOG.exception(_("DB Error on getting Storage Pool Usage %s" % e))
        raise exception.StoragePoolUsageFailure()
    def detail(self, req):

        """Get storage_group list."""
        context = req.environ['vsm.context']
        storage_groups = self.conductor_api.storage_group_get_all(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed storage_groups:%s' % storage_groups)
        osds = self.conductor_api.osd_state_get_all(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed osds:%s' % osds)
        sp_usages = db.get_storage_pool_usage(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed sp usage:%s' % sp_usages)
        pools = self.conductor_api.list_storage_pool(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed pools:%s' % pools)
        LOG.info('vsm/api/v1/storage_groups.py detailed pools:%s' % type(pools))
        for sp_usage in sp_usages:
            pool_id = str(sp_usage['pool_id'])
            if pool_id in pools:
                pools[pool_id]['attach_status'] = sp_usage['attach_status']

        for storage_group in storage_groups:
            storage_group['capacity_total'] = sum([osd["device"]['total_capacity_kb'] for osd in osds
                                               if osd['storage_group']['id'] == storage_group["id"]])
            storage_group['capacity_used'] = sum([osd["device"]['used_capacity_kb'] for osd in osds
                                                   if osd['storage_group']['id'] == storage_group["id"]])
            storage_group['capacity_avail'] = sum([osd["device"]['avail_capacity_kb'] for osd in osds
                                                   if osd['storage_group']['id'] == storage_group["id"]])

            # largest
            nodes = {}
            osd_cnt = 0
            for osd in osds:
                if not osd['storage_group']['id'] == storage_group["id"] or osd['state'] == FLAGS.vsm_status_uninitialized:
                    continue
                osd_cnt = osd_cnt + 1
                k = osd['service']['host']
                if k not in osd:
                    nodes.setdefault(k, 0)
                nodes[k] += osd["device"]['used_capacity_kb']
            if not nodes:
                storage_group['largest_node_capacity_used'] = 0
            else:
                storage_group['largest_node_capacity_used'] = max(nodes.values())

            storage_group["attached_osds"] = osd_cnt
            # attached pools
            storage_group["attached_pools"] = len([pool for pool in pools.values()
                                                    if (pool['primary_storage_group_id'] == storage_group["id"])])
            try:
                storage_group['updated_at'] = osds[0]['updated_at']
            except:
                pass
            LOG.info("vsm/api/v1/storage_groups.py %s" % storage_group)

        return self._view_builder.index(req, storage_groups)
Пример #3
0
    def detail(self, req):
        """Get storage_group list."""
        context = req.environ['vsm.context']
        storage_groups = self.conductor_api.storage_group_get_all(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed storage_groups:%s' %
                 storage_groups)
        osds = self.conductor_api.osd_state_get_all(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed osds:%s' % osds)
        sp_usages = db.get_storage_pool_usage(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed sp usage:%s' %
                 sp_usages)
        pools = self.conductor_api.list_storage_pool(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed pools:%s' % pools)
        LOG.info('vsm/api/v1/storage_groups.py detailed pools:%s' %
                 type(pools))
        for sp_usage in sp_usages:
            pool_id = str(sp_usage['pool_id'])
            if pool_id in pools:
                pools[pool_id]['attach_status'] = sp_usage['attach_status']

        for storage_group in storage_groups:
            storage_group['capacity_total'] = sum([
                osd["device"]['total_capacity_kb'] for osd in osds
                if osd['storage_group']['id'] == storage_group["id"]
            ])
            storage_group['capacity_used'] = sum([
                osd["device"]['used_capacity_kb'] for osd in osds
                if osd['storage_group']['id'] == storage_group["id"]
            ])
            storage_group['capacity_avail'] = sum([
                osd["device"]['avail_capacity_kb'] for osd in osds
                if osd['storage_group']['id'] == storage_group["id"]
            ])

            # largest
            nodes = {}
            for osd in osds:
                if not osd['storage_group']['id'] == storage_group["id"]:
                    continue
                k = osd['service']['host']
                if k not in osd:
                    nodes.setdefault(k, 0)
                nodes[k] += osd["device"]['used_capacity_kb']
            if not nodes:
                storage_group['largest_node_capacity_used'] = 0
            else:
                storage_group['largest_node_capacity_used'] = max(
                    nodes.values())

            # attached pools
            storage_group["attached_pools"] = len([
                pool for pool in pools.values()
                if (pool['primary_storage_group_id'] == storage_group["id"])
            ])
            try:
                storage_group['updated_at'] = osds[0]['updated_at']
            except:
                pass
            LOG.info("vsm/api/v1/storage_groups.py %s" % storage_group)

        return self._view_builder.index(req, storage_groups)
    def detail(self, req):

        """Get storage_group list."""
        context = req.environ['vsm.context']
        storage_groups_db = self.conductor_api.storage_group_get_all(context)
        storage_groups = {}
        storage_group_name_list = []
        for storage_group_db in storage_groups_db:
            take_dict = {
                "id":storage_group_db['take_id'],
                "name":"",
                "order":storage_group_db['take_order'],
                "choose_type":storage_group_db['choose_type'],
                "choose_num":storage_group_db['choose_num']
            }
            if storage_group_db['take_id']:
                try:
                    take_dict['name'] = db.zone_get(context,storage_group_db['take_id'])['name']
                except:
                    self.scheduler_api.update_zones_from_crushmap_to_db(context)
                    take_dict['name'] = db.zone_get(context,storage_group_db['take_id'])['name']

            if storage_group_db['name'] in storage_group_name_list:
                storage_groups[storage_group_db['name']]['take_list'].append(take_dict)
            else:
                storage_group_name_list.append(storage_group_db['name'])
                storage_group_dict = {
                    'id':storage_group_db['id'],
                    'name':storage_group_db['name'],
                    'storage_class':storage_group_db['storage_class'],
                    'friendly_name':storage_group_db['friendly_name'],
                    'marker':storage_group_db['marker'],
                    'rule_id':storage_group_db['rule_id'],
                    'take_list':[take_dict],
                    'status': storage_group_db["status"],
                }
                storage_groups[storage_group_db['name']] = storage_group_dict

        storage_groups = storage_groups.values()

        LOG.info('vsm/api/v1/storage_groups.py detailed storage_groups:%s' % storage_groups)
        osds = self.conductor_api.osd_state_get_all(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed osds:%s' % osds)
        sp_usages = db.get_storage_pool_usage(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed sp usage:%s' % sp_usages)
        pools = self.conductor_api.list_storage_pool(context)
        LOG.info('vsm/api/v1/storage_groups.py detailed pools:%s' % pools)
        LOG.info('vsm/api/v1/storage_groups.py detailed pools:%s' % type(pools))
        for sp_usage in sp_usages:
            pool_id = str(sp_usage['pool_id'])
            if pool_id in pools:
                pools[pool_id]['attach_status'] = sp_usage['attach_status']

        rules = [storage_group['name'] for storage_group in storage_groups]
        rules_dict = {'rules':list(set(rules))}
        rule_osds = self.scheduler_api.get_osds_by_rules(context,rules_dict )
        for storage_group in storage_groups:
            osds_in_storage_group = rule_osds.get(storage_group['name'])#osd['storage_group']['id'] == storage_group["id"]]
            storage_group['capacity_total'] = sum([osd["device"]['total_capacity_kb'] for osd in osds
                                               if osd['osd_name'] in osds_in_storage_group])
            storage_group['capacity_used'] = sum([osd["device"]['used_capacity_kb'] for osd in osds
                                               if osd['osd_name'] in osds_in_storage_group])
            storage_group['capacity_avail'] = sum([osd["device"]['avail_capacity_kb'] for osd in osds
                                               if osd['osd_name'] in osds_in_storage_group])

            nodes = {}
            osd_cnt = 0
            for osd in osds:
                if not osd['storage_group']['id'] == storage_group["id"] or osd['state'] == FLAGS.vsm_status_uninitialized:
                    continue
                osd_cnt = osd_cnt + 1
                k = osd['service']['host']
                if k not in osd:
                    nodes.setdefault(k, 0)
                nodes[k] += osd["device"]['used_capacity_kb']
            if not nodes:
                storage_group['largest_node_capacity_used'] = 0
            else:
                storage_group['largest_node_capacity_used'] = max(nodes.values())

            storage_group["attached_osds"] = osd_cnt
            # attached pools
            storage_group["attached_pools"] = len([pool for pool in pools.values()
                                                    if (pool['primary_storage_group_id'] == storage_group["id"])])
            try:
                storage_group['updated_at'] = osds[0]['updated_at']
            except:
                pass
            LOG.info("vsm/api/v1/storage_groups.py %s" % storage_group)

        return self._view_builder.index(req, storage_groups)