示例#1
0
    def test_get_tacc_username_api_problem(self, cassette):
        """Make sure we don't return the Atmosphere username when we have trouble connecting to the TAS API.
        It should fail.

        TODO: Figure out how to handle it gracefully.
        """
        from jetstream.allocation import TASAPIDriver
        tas_driver = TASAPIDriver()
        tas_driver.clear_cache()
        self.assertDictEqual(tas_driver.username_map, {})
        user = UserFactory.create(username='******')
        tacc_username = tas_driver.get_tacc_username(user)
        self.assertIsNone(tacc_username)
        self.assertDictEqual(tas_driver.username_map, {})
        assert_cassette_playback_length(cassette, 1)
示例#2
0
    def test_get_tacc_username_api_problem(self, cassette):
        """Make sure we don't return the Atmosphere username when we have trouble connecting to the TAS API.
        It should fail.

        TODO: Figure out how to handle it gracefully.
        """
        from jetstream.allocation import TASAPIDriver
        tas_driver = TASAPIDriver()
        tas_driver.clear_cache()
        self.assertDictEqual(tas_driver.username_map, {})
        user = UserFactory.create(username='******')
        tacc_username = tas_driver.get_tacc_username(user)
        self.assertIsNone(tacc_username)
        self.assertDictEqual(tas_driver.username_map, {})
        assert_cassette_playback_length(cassette, 1)
示例#3
0
 def validate_user(self, user):
     """
     Validates an account based on the business logic assigned by jetstream.
     In this example:
     * Accounts are *ONLY* valid if they have 1+ 'jetstream' allocations.
     * All other allocations are ignored.
     """
     driver = TASAPIDriver()
     try:
         project_allocations = fill_user_allocation_source_for(driver, user)
         if not project_allocations:
             return False
         return True
     except (NoTaccUserForXsedeException, NoAccountForUsernameException):
         logger.exception('User is invalid: %s', user)
         return False
     except TASAPIException:
         logger.exception(
             'Some other error happened while trying to validate user: %s',
             user)
         active_allocation_count = UserAllocationSource.objects.filter(
             only_current_user_allocations() & Q(user=user)).count()
         logger.debug('user: %s, active_allocation_count: %d', user,
                      active_allocation_count)
         return active_allocation_count > 0
示例#4
0
    def test_get_all_projects(self, cassette):
        """Test retrieving projects for a Jetstream user"""
        from jetstream.allocation import TASAPIDriver
        tas_driver = TASAPIDriver()
        projects = tas_driver.get_all_projects()

        self.assertEquals(len(projects), 2)
        self.assertEquals(projects[0]['chargeCode'], u'CH-916862')
        self.assertEquals(projects[-1]['chargeCode'], u'TG-MCB960139')
        self.maxDiff = None
        response = json.loads(cassette.data[0][1]['body']['string'])
        result = response['result']
        self.assertEquals(len(projects), len(result))
        self.assertEquals(projects[0], result[0])
        self.assertEquals(projects[-1], result[-1])

        assert_cassette_playback_length(cassette, 1)
示例#5
0
class XsedeGroup(AtmosphereAccountCreationPlugin):
    """
    For Jetstream, AccountCreation respects the "Directory"
    between User and Project.

    NOTE: This requires some communication with the TAS API Driver
    and can take some time to generate a list...
    Due to memoization, it is best to "Batch" these requests.

    For Each project listed for tacc_username(user.username):
    - 'username' == tacc_username(user.username)
    - 'project_name' == tacc_project_name
    """

    def __init__(self):
        self.tas_driver = TASAPIDriver()
        if not self.tas_driver.tacc_api:
            raise Exception(
                "Attempting to use the XsedeGroup CreationPlugin without TAS driver. Fix your configuration to continue"
            )

    def get_credentials_list(self, provider, username):
        credentials_list = []
        tacc_username = self.tas_driver._xsede_to_tacc_username(username)
        if not tacc_username:
            logger.warn(
                "TAS Driver found no TACC Username for XUP User %s" % username
            )
            tacc_username = username
        tacc_projects = self.tas_driver.find_projects_for(tacc_username)
        for tacc_project in tacc_projects:
            tacc_projectname = tacc_project['chargeCode']
            # TODO: should is_leader be used in the dict created below?
            # tacc_leader_username = tacc_project.get('pi', {})\
            #     .get('username', '')
            # is_leader = tacc_leader_username == tacc_username
            credentials_list.append(
                {
                    'account_user': username,
                    'username': tacc_username,
                    'project_name': tacc_projectname,
                    'group_name': tacc_projectname,
                    'is_leader': False,
                }
            )
        return credentials_list
示例#6
0
    def test_get_all_projects(self, cassette):
        """Test retrieving projects for a Jetstream user"""
        from jetstream.allocation import TASAPIDriver
        tas_driver = TASAPIDriver()
        projects = tas_driver.get_all_projects()

        self.assertEquals(len(projects), 2)
        self.assertEquals(projects[0]['chargeCode'], u'CH-916862')
        self.assertEquals(projects[-1]['chargeCode'], u'TG-MCB960139')
        self.maxDiff = None
        response = json.loads(cassette.data[0][1]['body']['string'])
        result = response['result']
        self.assertEquals(len(projects), len(result))
        self.assertEquals(projects[0], result[0])
        self.assertEquals(projects[-1], result[-1])

        assert_cassette_playback_length(cassette, 1)
示例#7
0
 def validate_user(self, user):
     """
     Validates an account based on the business logic assigned by jetstream.
     In this example:
     * Accounts are *ONLY* valid if they have 1+ 'jetstream' allocations.
     * All other allocations are ignored.
     """
     tas_driver = TASAPIDriver()
     try:
         tacc_username = tas_driver.get_tacc_username(user)
         project_allocations = tas_driver.get_user_allocations(
             tacc_username)
         if not project_allocations:
             return False
         return True
     except TASAPIException:
         logger.exception("Could not validate user: %s" % user)
         return False
def _create_reports_for(user, allocation_name, end_date):
    driver = TASAPIDriver()
    tacc_username = user.username  # driver.get_tacc_username(user)
    if not tacc_username:
        logger.error(
            "No TACC username for user: '******' which came from allocation id: {}"
            .format(user, allocation_name))
        return
    project_name = allocation_name  # driver.get_allocation_project_name(allocation_name)
    try:
        project_report = _create_tas_report_for(user, tacc_username,
                                                project_name, end_date)
        return project_report
    except TASPluginException:
        logger.exception(
            "Could not create the report because of the error below")
        return
示例#9
0
 def get_default_quota(self, user, provider):
     """
     If a user is only in a special allocation, then give them a reduced quota
     """
     driver = TASAPIDriver()
     special_allocation_sources = getattr(django.conf.settings,
                                          'SPECIAL_ALLOCATION_SOURCES', {})
     default_quota = None
     try:
         project_allocations = fill_user_allocation_source_for(driver, user)
         if project_allocations and len(
                 project_allocations) == 1 and project_allocations[
                     0].name in special_allocation_sources:
             import core.models
             sub_allocation_quota = special_allocation_sources[
                 project_allocations[0].name].get('default_quota')
             if sub_allocation_quota:
                 default_quota = core.models.Quota.objects.get_or_create(
                     **sub_allocation_quota)[0]
         return default_quota
     except TASAPIException:
         logger.exception('Could not validate user: %s' % user)
         return None
示例#10
0
 def validate_user(self, user):
     """
     Validates an account based on the business logic assigned by jetstream.
     In this example:
     * Accounts are *ONLY* valid if they have 1+ 'jetstream' allocations.
     * All other allocations are ignored.
     """
     driver = TASAPIDriver()
     try:
         project_allocations = fill_user_allocation_source_for(driver, user)
         if not project_allocations:
             return False
         return True
     except (NoTaccUserForXsedeException, NoAccountForUsernameException) as e:
         logger.exception('User is invalid: %s', user)
         return False
     except TASAPIException:
         logger.exception('Some other error happened while trying to validate user: %s', user)
         active_allocation_count = core.models.UserAllocationSource.objects.filter(user=user).count()
         # TODO: Also check that:
         # - the start date of the allocation source is in the past, and
         # - the end date of the allocation source is not set, or is in the future.
         logger.debug('user: %s, active_allocation_count: %d', active_allocation_count, user)
         return active_allocation_count > 0
示例#11
0
 def __init__(self):
     self.tas_driver = TASAPIDriver()
     if not self.tas_driver.tacc_api:
         raise Exception("Attempting to use the XsedeGroup CreationPlugin without TAS driver. Fix your configuration to continue")