Example #1
0
def get_account(provider_uuid, request_id, context={}):
    """
    Retrieve a provider's account configuration needed for processing.

    Args:
        provider_uuid (String): Provider unique identifier.
        request_id (String): Identifier associated with the payload
        context (Dict): Context for logging (account, etc)

    Returns:
        (dict) - keys: value
                 authentication: String,
                 customer_name: String,
                 billing_source: String,
                 provider_type: String,
                 schema_name: String,
                 provider_uuid: String

    """
    all_accounts = []
    try:
        all_accounts = AccountsAccessor().get_accounts(provider_uuid)
    except AccountsAccessorError as error:
        msg = f"Unable to get accounts. Error: {str(error)}"
        LOG.warning(log_json(request_id, msg, context))
        return None

    return all_accounts.pop() if all_accounts else None
Example #2
0
    def get_accounts(billing_source=None):
        """
        Prepare a list of accounts for the orchestrator to get CUR from.

        If billing_source is not provided all accounts will be returned, otherwise
        only the account for the provided billing_source will be returned.

        Still a work in progress, but works for now.

        Args:
            billing_source (String): Individual account to retrieve.

        Returns:
            [CostUsageReportAccount] (all), [CostUsageReportAccount] (polling only)

        """
        all_accounts = []
        polling_accounts = []
        try:
            all_accounts = AccountsAccessor().get_accounts()
        except AccountsAccessorError as error:
            LOG.error('Unable to get accounts. Error: %s', str(error))

        if billing_source:
            for account in all_accounts:
                if billing_source == account.get('billing_source'):
                    all_accounts = [account]

        for account in all_accounts:
            if AccountsAccessor().is_polling_account(account):
                polling_accounts.append(account)

        return all_accounts, polling_accounts
Example #3
0
def get_account(provider_uuid):
    """
    Retrieve a provider's account configuration needed for processing.

    Args:
        provider_uuid (String): Provider unique identifier.

    Returns:
        (dict) - keys: value
                 authentication: String,
                 customer_name: String,
                 billing_source: String,
                 provider_type: String,
                 schema_name: String,
                 provider_uuid: String

    """
    all_accounts = []
    try:
        all_accounts = AccountsAccessor().get_accounts(provider_uuid)
    except AccountsAccessorError as error:
        LOG.info('Unable to get accounts. Error: %s', str(error))
        return None

    return all_accounts.pop()
Example #4
0
    def test_get_ocp_override_account_is_poll(self, ocp_override):
        """Test that the OCP path returns OCP as a listen account."""
        account_objects = AccountsAccessor().get_accounts(self.ocp_test_provider_uuid)
        self.assertEqual(len(account_objects), 1)

        ocp_account = account_objects.pop()
        self.assertEqual(ocp_account.get('provider_type'), OPENSHIFT_CONTAINER_PLATFORM)
        self.assertTrue(AccountsAccessor().is_polling_account(ocp_account))
Example #5
0
    def test_get_ocp_account_is_not_poll(self):
        """Test that the OCP account is returned given a provider uuid and it's a listen account."""
        account_objects = AccountsAccessor().get_accounts(self.ocp_test_provider_uuid)
        self.assertEqual(len(account_objects), 1)

        ocp_account = account_objects.pop()
        self.assertEqual(ocp_account.get('provider_type'), OPENSHIFT_CONTAINER_PLATFORM)
        self.assertFalse(AccountsAccessor().is_polling_account(ocp_account))
Example #6
0
    def test_get_aws_account_is_poll(self):
        """Test that the AWS account is returned given a provider uuid and it's a poll account."""
        account_objects = AccountsAccessor().get_accounts(self.aws_provider_uuid)
        self.assertEqual(len(account_objects), 1)

        aws_account = account_objects.pop()
        self.assertEqual(aws_account.get('provider_type'), AMAZON_WEB_SERVICES)
        self.assertTrue(AccountsAccessor().is_polling_account(aws_account))
Example #7
0
    def test_get_ocp_account_is_not_poll(self):
        """Test that the OCP account is returned given a provider uuid and it's a listen account."""
        account_objects = AccountsAccessor().get_accounts(
            self.ocp_test_provider_uuid)
        self.assertEqual(len(account_objects), 1)

        ocp_account = account_objects.pop()
        self.assertEqual(ocp_account.get("provider_type"),
                         Provider.PROVIDER_OCP)
        self.assertFalse(AccountsAccessor().is_polling_account(ocp_account))
Example #8
0
    def test_get_ocp_override_account_is_poll(self, ocp_override):
        """Test that the OCP path returns OCP as a listen account."""
        account_objects = AccountsAccessor().get_accounts(
            self.ocp_test_provider_uuid)
        self.assertEqual(len(account_objects), 1)

        ocp_account = account_objects.pop()
        self.assertEqual(ocp_account.get("provider_type"),
                         Provider.PROVIDER_OCP)
        self.assertTrue(AccountsAccessor().is_polling_account(ocp_account))
Example #9
0
    def test_get_aws_account_is_poll(self):
        """Test that the AWS account is returned given a provider uuid and it's a poll account."""
        account_objects = AccountsAccessor().get_accounts(
            self.aws_provider_uuid)
        self.assertEqual(len(account_objects), 1)

        aws_account = account_objects.pop()
        self.assertIn(aws_account.get("provider_type"),
                      (Provider.PROVIDER_AWS, Provider.PROVIDER_AWS_LOCAL))
        self.assertTrue(AccountsAccessor().is_polling_account(aws_account))
Example #10
0
    def test_get_accounts(self):
        """Test to get_access_credential"""
        account_objects = AccountsAccessor().get_accounts()

        if len(account_objects) != 1:
            self.fail('unexpected number of accounts')

        self.assertIsInstance(account_objects.pop(), dict)

        for account in account_objects:
            self.assertEqual(account.get('access_credential'), 'arn:aws:iam::111111111111:role/CostManagement')
            self.assertEqual(account.get('billing_source'), 'test-bucket')
            self.assertEqual(account.get('customer_name'), 'Test Customer')
            self.assertEqual(account.get('provider_type'), 'Test Provider')
            self.assertEqual(account.get('schema_name'), 'testcustomer')
Example #11
0
 def test_get_accounts_exception(self):
     """Test to get accounts with an exception."""
     with patch.object(CURAccountsNetwork,
                       'get_accounts_from_source',
                       side_effect=CURAccountsInterfaceError('test')):
         with self.assertRaises(AccountsAccessorError):
             AccountsAccessor('network').get_accounts()
    def test_get_accounts(self):
        """Test to get_access_credential."""
        account_objects = AccountsAccessor().get_accounts()

        if len(account_objects) != 3:
            self.fail('unexpected number of accounts')

        for account in account_objects:
            if account.get('provider_type') == Provider.PROVIDER_AWS:
                self.assertEqual(account.get('authentication'),
                                 self.aws_provider_resource_name)
                self.assertEqual(account.get('billing_source'),
                                 self.aws_test_billing_source)
                self.assertEqual(account.get('customer_name'), self.schema)
            elif account.get('provider_type') == Provider.PROVIDER_OCP:
                self.assertEqual(account.get('authentication'),
                                 self.ocp_provider_resource_name)
                self.assertEqual(account.get('billing_source'),
                                 self.ocp_test_billing_source)
                self.assertEqual(account.get('customer_name'), self.schema)
            elif account.get('provider_type') == Provider.PROVIDER_AZURE:
                self.assertEqual(account.get('authentication'),
                                 self.azure_credentials)
                self.assertEqual(account.get('billing_source'),
                                 self.azure_data_source)
                self.assertEqual(account.get('customer_name'), self.schema)
            else:
                self.fail('Unexpected provider')
Example #13
0
    def test_get_accounts(self):
        """Test to get_access_credential"""
        account_objects = AccountsAccessor().get_accounts()

        if len(account_objects) != 3:
            self.fail('unexpected number of accounts')

        for account in account_objects:
            if account.get('provider_type') == AMAZON_WEB_SERVICES:
                self.assertEqual(account.get('authentication'),
                                 self.aws_provider_resource_name)
                self.assertEqual(account.get('billing_source'),
                                 self.aws_test_billing_source)
                self.assertEqual(account.get('customer_name'), self.schema)
            elif account.get('provider_type') == OPENSHIFT_CONTAINER_PLATFORM:
                self.assertEqual(account.get('authentication'),
                                 self.ocp_provider_resource_name)
                self.assertEqual(account.get('billing_source'),
                                 self.ocp_test_billing_source)
                self.assertEqual(account.get('customer_name'), self.schema)
            elif account.get('provider_type') == AZURE:
                self.assertEqual(account.get('authentication'),
                                 self.azure_credentials)
                self.assertEqual(account.get('billing_source'),
                                 self.azure_data_source)
                self.assertEqual(account.get('customer_name'), self.schema)
            else:
                self.fail('Unexpected provider')
Example #14
0
def update_all_summary_tables(start_date, end_date=None):
    """Populate all the summary tables for reporting.

    Args:
        start_date  (str) The date to start populating the table.
        end_date    (str) The date to end on.

    Returns
        None

    """
    # Get all providers for all schemas
    all_accounts = []
    try:
        all_accounts = AccountsAccessor().get_accounts()
        for account in all_accounts:
            log_statement = (
                f"Gathering data for for\n"
                f' schema_name: {account.get("schema_name")}\n'
                f' provider: {account.get("provider_type")}\n'
                f' account (provider uuid): {account.get("provider_uuid")}')
            LOG.info(log_statement)
            schema_name = account.get("schema_name")
            provider = account.get("provider_type")
            provider_uuid = account.get("provider_uuid")
            update_summary_tables.delay(schema_name, provider, provider_uuid,
                                        str(start_date), end_date)
    except AccountsAccessorError as error:
        LOG.error("Unable to get accounts. Error: %s", str(error))
Example #15
0
def update_all_summary_tables(start_date, end_date=None):
    """Populate all the summary tables for reporting.

    Args:
        start_date  (str) The date to start populating the table.
        end_date    (str) The date to end on.

    Returns
        None

    """
    # Get all providers for all schemas
    all_accounts = []
    try:
        all_accounts = AccountsAccessor().get_accounts()
        for account in all_accounts:
            log_statement = (
                f"Gathering data for for\n"
                f' schema_name: {account.get("schema_name")}\n'
                f' provider: {account.get("provider_type")}\n'
                f' account (provider uuid): {account.get("provider_uuid")}'
            )
            LOG.info(log_statement)
            schema_name = account.get("schema_name")
            provider = account.get("provider_type")
            provider_uuid = account.get("provider_uuid")
            queue_name = OCP_QUEUE if provider and provider.lower() == "ocp" else None
            update_summary_tables.s(
                schema_name, provider, provider_uuid, str(start_date), end_date, queue_name=queue_name
            ).apply_async(queue=queue_name or UPDATE_SUMMARY_TABLES_QUEUE)
    except AccountsAccessorError as error:
        LOG.error("Unable to get accounts. Error: %s", str(error))
    def test_get_accounts(self):
        """Test to get_access_credential."""
        account_objects = AccountsAccessor().get_accounts()
        expected_count = Provider.objects.count()

        self.assertEqual(len(account_objects), expected_count)

        for account in account_objects:
            with self.subTest(account=account):
                if account.get("provider_type") in (
                        Provider.PROVIDER_AWS, Provider.PROVIDER_AWS_LOCAL):
                    self.assertEqual(
                        account.get("credentials"),
                        self.aws_provider.authentication.credentials)
                    self.assertEqual(
                        account.get("data_source"),
                        self.aws_provider.billing_source.data_source)
                    self.assertEqual(account.get("customer_name"), self.schema)
                elif account.get("provider_type") == Provider.PROVIDER_OCP:
                    self.assertIn(
                        account.get("credentials"),
                        [
                            self.ocp_provider.authentication.
                            credentials,  # OCP-on-Prem
                            self.ocp_on_aws_ocp_provider.authentication.
                            credentials,
                            self.ocp_on_azure_ocp_provider.authentication.
                            credentials,
                            self.ocp_on_gcp_ocp_provider.authentication.
                            credentials,
                        ],
                    )
                    self.assertTrue(
                        (account.get("data_source")
                         == self.ocp_provider.billing_source.data_source)
                        or account.get("data_source") is None)
                    self.assertEqual(account.get("customer_name"), self.schema)
                elif account.get("provider_type") in (
                        Provider.PROVIDER_AZURE,
                        Provider.PROVIDER_AZURE_LOCAL):
                    self.assertEqual(
                        account.get("credentials"),
                        self.azure_provider.authentication.credentials)
                    self.assertEqual(
                        account.get("data_source"),
                        self.azure_provider.billing_source.data_source)
                    self.assertEqual(account.get("customer_name"), self.schema)
                elif account.get("provider_type") in (
                        Provider.PROVIDER_GCP, Provider.PROVIDER_GCP_LOCAL):
                    self.assertEqual(
                        account.get("credentials"),
                        self.gcp_provider.authentication.credentials)
                    self.assertEqual(
                        account.get("data_source"),
                        self.gcp_provider.billing_source.data_source)
                    self.assertEqual(account.get("customer_name"), self.schema)
                else:
                    self.fail("Unexpected provider")
Example #17
0
def update_all_summary_tables(start_date, end_date=None):
    """Populate all the summary tables for reporting.

    Args:
        start_date  (str) The date to start populating the table.
        end_date    (str) The date to end on.

    Returns
        None

    """
    # Get all providers for all schemas
    all_accounts = []
    try:
        all_accounts = AccountsAccessor().get_accounts()
        for account in all_accounts:
            LOG.info('Gathering data for account=%s.', account)
            schema_name = account.get('schema_name')
            provider = account.get('provider_type')
            provider_uuid = account.get('provider_uuid')
            update_summary_tables.delay(schema_name, provider,
                                        provider_uuid, str(start_date), end_date)
    except AccountsAccessorError as error:
        LOG.error('Unable to get accounts. Error: %s', str(error))
Example #18
0
 def test_invalid_source_specification(self):
     """Test that error is thrown with invalid account source."""
     with self.assertRaises(AccountsAccessorError):
         AccountsAccessor("bad")