Exemple #1
0
    def _check_project_to_project(self):
        _k_projects = keystone.get_projects_by_project_ids()
        _g_projects = self.gclient.get_projects(type='simple')

        k_projects = []
        g_projects = []
        for kp in _k_projects:
            billing_owner = kp['users']['billing_owner']
            k_projects.append(
                keystone.Project(
                    kp['id'],
                    billing_owner.get('id') if billing_owner else None,
                    kp['domain_id']))
        for gp in _g_projects:
            g_projects.append(
                keystone.Project(gp['project_id'],
                                 gp['billing_owner'],
                                 gp['domain_id']))

        # projects in keystone but not in gringotts
        creating_projects = list(set(k_projects) - set(g_projects))

        # projects in gringotts but not in keystone
        deleting_projects = []
        _deleted_projects = list(set(g_projects) - set(k_projects))
        for p in _deleted_projects:
            if self.gclient.get_resources(p.project_id):
                deleting_projects.append(p)

        # projects whose billing owner is not equal to each other
        billing_projects = []  # changing billing owner
        projects_k = sorted(set(g_projects) & set(k_projects),
                            key=lambda p: p.project_id)
        projects_g = sorted(set(k_projects) & set(g_projects),
                            key=lambda p: p.project_id)

        for k, g in zip(projects_k, projects_g):
            if k.billing_owner_id != g.billing_owner_id:
                billing_projects.append(k)

        return (creating_projects, deleting_projects, billing_projects)
Exemple #2
0
    def _check_project_to_project(self):
        _k_projects = keystone.get_projects_by_project_ids()
        _g_projects = self.gclient.get_projects(type='simple')

        k_projects = []
        g_projects = []
        for kp in _k_projects:
            billing_owner = kp['users']['billing_owner']
            k_projects.append(
                keystone.Project(
                    kp['id'],
                    billing_owner.get('id') if billing_owner else None,
                    kp['domain_id']))
        for gp in _g_projects:
            g_projects.append(
                keystone.Project(gp['project_id'],
                                 gp['billing_owner'],
                                 gp['domain_id']))

        # projects in keystone but not in gringotts
        creating_projects = list(set(k_projects) - set(g_projects))

        # projects in gringotts but not in keystone
        deleting_projects = []
        _deleted_projects = list(set(g_projects) - set(k_projects))
        for p in _deleted_projects:
            if self.gclient.get_resources(p.project_id):
                deleting_projects.append(p)

        # projects whose billing owner is not equal to each other
        billing_projects = []  # changing billing owner
        projects_k = sorted(set(g_projects) & set(k_projects),
                            key=lambda p: p.project_id)
        projects_g = sorted(set(k_projects) & set(g_projects),
                            key=lambda p: p.project_id)

        for k, g in zip(projects_k, projects_g):
            if k.billing_owner_id != g.billing_owner_id:
                billing_projects.append(k)

        return (creating_projects, deleting_projects, billing_projects)
Exemple #3
0
    def get_all(self, user_id=None, type=None, duration=None):
        """Get all projects."""
        user_id = acl.get_limited_to_user(request.headers,
                                          'projects_get') or user_id
        self.conn = pecan.request.db_conn
        result = []

        if not type or type.lower() == 'pay':
            # if admin call this api, limit to admin's user_id
            if not user_id:
                user_id = request.context.user_id

            try:
                user_projects = self.conn.get_user_projects(request.context,
                                                            user_id=user_id)
            except Exception as e:
                LOG.exception('Fail to get all projects')
                raise exception.DBError(reason=e)

            project_ids = [up.project_id for up in user_projects]

            if not project_ids:
                LOG.warn('User %s has no payed projects' % user_id)
                return []

            projects = keystone.get_projects_by_project_ids(project_ids)

            for u, p in itertools.product(user_projects, projects):
                if u.project_id == p['id']:
                    billing_owner = p['users']['billing_owner']
                    project_owner = p['users']['project_owner']
                    project_creator = p['users']['project_creator']
                    up = models.UserProject(user_id=user_id,
                                            project_id=u.project_id,
                                            project_name=p['name'],
                                            user_consumption=u.user_consumption,
                                            project_consumption=u.project_consumption,
                                            billing_owner=dict(user_id=billing_owner.get('id') if billing_owner else None,
                                                               user_name=billing_owner.get('name') if billing_owner else None),
                                            project_owner=dict(user_id=project_owner.get('id') if project_owner else None,
                                                               user_name=project_owner.get('name') if project_owner else None),
                                            project_creator=dict(user_id=project_creator.get('id') if project_creator else None,
                                                                 user_name=project_creator.get('name') if project_creator else None),
                                            is_historical=u.is_historical,
                                            created_at=timeutils.parse_isotime(p['created_at']) if p['created_at'] else None)
                    result.append(up)
        elif type.lower() == 'all':
            # if admin call this api, limit to admin's user_id
            if not user_id:
                user_id = request.context.user_id

            k_projects = keystone.get_projects_by_user(user_id)
            project_ids = [p['id'] for p in k_projects]

            if not project_ids:
                LOG.warn('User %s has no projects' % user_id)
                return []

            try:
                g_projects = self.conn.get_projects_by_project_ids(request.context,
                                                                   project_ids)
            except Exception as e:
                LOG.exception('Fail to get all projects')
                raise exception.DBError(reason=e)
            for k, g in itertools.product(k_projects, g_projects):
                if k['id'] == g.project_id:
                    billing_owner = k['users']['billing_owner']
                    project_owner = k['users']['project_owner']
                    project_creator = k['users']['project_creator']
                    up = models.UserProject(user_id=user_id,
                                            project_id=g.project_id,
                                            project_name=k['name'],
                                            project_consumption=g.consumption,
                                            billing_owner=dict(user_id=billing_owner.get('id') if billing_owner else None,
                                                               user_name=billing_owner.get('name') if billing_owner else None),
                                            project_owner=dict(user_id=project_owner.get('id') if project_owner else None,
                                                               user_name=project_owner.get('name') if project_owner else None),
                                            project_creator=dict(user_id=project_creator.get('id') if project_creator else None,
                                                                 user_name=project_creator.get('name') if project_creator else None),
                                            is_historical=False,
                                            created_at=timeutils.parse_isotime(k['created_at']) if k['created_at'] else None)
                    result.append(up)

        elif type.lower() == 'simple':
            duration = gringutils.normalize_timedelta(duration)
            if duration:
                active_from = datetime.datetime.utcnow() - duration
            else:
                active_from = None
            g_projects = list(self.conn.get_projects(request.context,
                                                     user_id=user_id,
                                                     active_from=active_from))
            project_ids = [p.project_id for p in g_projects]

            if not project_ids:
                LOG.warn('User %s has no payed projects' % user_id)
                return []

            k_projects = keystone.get_projects_by_project_ids(project_ids)

            for k, g in itertools.product(k_projects, g_projects):
                if k['id'] == g.project_id:
                    up = models.UserProject(project_id=g.project_id,
                                            project_name=k['name'],
                                            domain_id=g.domain_id,
                                            billing_owner=dict(user_id=g.user_id))
                    result.append(up)

        return result