Esempio n. 1
0
    def handle(self, *args, **options):
        agg = Role.objects.filter(is_valid=True,
                                  active=True).aggregate(Max('id'))
        max_id = agg['id__max']
        size = ceil(max_id / float(len(settings.GITHUB_TASK_USERS)))
        in_list = []
        print 'Refresh Role Counts'
        for i in range(len(settings.GITHUB_TASK_USERS)):
            start = size * i
            end = size * (i + 1)
            print 'User: %s' % settings.GITHUB_TASK_USERS[i]['username']
            print 'Range: %d - %d' % (start, end)
            r = RefreshRoleCount.objects.create(
                state='PENDING',
                description='User: %s Range: %s-%s' %
                (settings.GITHUB_TASK_USERS[i]['username'], start, end))
            in_list.append(r.id)
            gh_api = Github(settings.GITHUB_TASK_USERS[i]['username'],
                            settings.GITHUB_TASK_USERS[i]['password'])
            refresh_role_counts.delay(start, end, gh_api, r)
        print "Request submitted to Celery."

        finished = False
        started = time.time()
        while not finished:
            finished = True
            for obj in RefreshRoleCount.objects.filter(Q(pk__in=in_list),
                                                       ~Q(state='COMPLETED')):
                if not obj.state == 'FINISHED':
                    finished = False
                else:
                    print '%s Total: %s Passed: %s Failed: %s' % (
                        obj.description, obj.failed + obj.passed, obj.passed,
                        obj.failed)
                    obj.state = 'COMPLETED'
                    obj.save()
            time.sleep(60)

        elapsed = time.time() - started
        hours = floor(elapsed / 3600) if elapsed >= 3600 else 0
        minutes = floor((elapsed - (hours * 3600)) /
                        60) if (elapsed - (hours * 3600)) >= 60 else 0
        seconds = elapsed - (hours * 3600) - (minutes * 60)
        print 'Elapsed time %02d.%02d.%02d' % (hours, minutes, seconds)
Esempio n. 2
0
    def handle(self, *args, **options):

        # Users should already be authenticated to Galaxy via GitHub and have a valid token.
        task_users = []
        for task_user in settings.GITHUB_TASK_USERS:
            try:
                user = User.objects.get(username=task_user)
            except ObjectDoesNotExist:
                logger.info(u"USER NOT FOUND: {0}".format(task_user))
                continue
            try:
                token = SocialToken.objects.get(account__user=user, account__provider='github')
            except ObjectDoesNotExist:
                logger.info(u"GITHUB TOKEN NOT FOUND: for user {0}".format(task_user))
                continue
            task_users.append({
                u'username': task_user,
                u'token': token.token
            })

        if len(task_users) == 0:
            raise Exception(u"No task workers found with valid GitHub tokens. "
                            u"Make sure your task workers are configured properly.")

        agg = Role.objects.filter(is_valid=True, active=True).aggregate(Max('id'))
        max_id = agg['id__max']
        size = ceil(max_id / float(len(settings.GITHUB_TASK_USERS)))
        in_list = []

        logger.info(u"Refresh Role Counts")
        for i in range(len(task_users)):
            start = size * i
            end = size * (i + 1)
            logger.info(u"User: {0} Range: {1} - {2}".format(task_users[i]['username'], start, end))
            role_count = RefreshRoleCount.objects.create(
                state='PENDING',
                description='User: %s Range: %s-%s' % (task_users[i]['username'], start, end)
            )
            in_list.append(role_count.id)
            refresh_role_counts.delay(start, end, task_users[i]['token'], role_count)

        logger.info(u"Requests submitted to Celery. Waiting for task completion...")
        finished = False
        started = time.time()
        while not finished:
            finished = True
            for obj in RefreshRoleCount.objects.filter(Q(pk__in=in_list), ~Q(state='COMPLETED')):
                if not obj.state == 'FINISHED':
                    finished = False
                else:
                    print u"{0} Total: {1} Passed: {2} Failed: {3} Deleted: {4} Updated: {5}".format(
                        obj.description,
                        obj.failed + obj.passed + obj.deleted + obj.updated,
                        obj.passed,
                        obj.failed,
                        obj.deleted,
                        obj.updated
                    )
                    obj.state = 'COMPLETED'
                    obj.save()
            time.sleep(60)

        elapsed = time.time() - started
        hours = floor(elapsed / 3600) if elapsed >= 3600 else 0
        minutes = floor((elapsed - (hours * 3600)) / 60) if (elapsed - (hours * 3600)) >= 60 else 0
        seconds = elapsed - (hours * 3600) - (minutes * 60)
        logger.info(u"Elapsed time %02d.%02d.%02d" % (hours, minutes, seconds))