Esempio n. 1
0
 def test_add_provider_uuid_does_not_exist(self):
     """Tests that add a koku provider uuid to a non-existent source."""
     test_uuid = faker.uuid4()
     try:
         storage.add_provider_koku_uuid(self.test_source_id + 1, test_uuid)
     except Exception as error:
         self.fail(str(error))
Esempio n. 2
0
 def test_add_provider_koku_uuid(self):
     """Tests that add a koku provider uuid to a source."""
     test_uuid = faker.uuid4()
     storage.add_provider_koku_uuid(self.test_source_id, test_uuid)
     self.assertEqual(
         Sources.objects.get(source_id=self.test_source_id).koku_uuid,
         test_uuid)
Esempio n. 3
0
 def test_destroy_provider_event(self):
     """Tests that a source can be destroyed."""
     test_uuid = faker.uuid4()
     self.assertIsNotNone(self.test_obj)
     storage.add_provider_koku_uuid(self.test_source_id, test_uuid)
     response = storage.destroy_provider_event(self.test_source_id)
     self.assertFalse(Sources.objects.filter(source_id=self.test_source_id).exists())
     self.assertEqual(response, test_uuid)
 def create_account(self, source):
     """Call to create provider."""
     try:
         LOG.info(f"Creating Provider for Source ID: {str(self._source_id)}")
         provider = self._provider_builder.create_provider_from_source(source)
         add_provider_koku_uuid(self._source_id, provider.uuid)
     except ProviderBuilderError as provider_err:
         raise SourcesProviderCoordinatorError(str(provider_err))
     return provider
Esempio n. 5
0
def execute_koku_provider_op(msg, cost_management_type_id):
    """
    Execute the 'create' or 'destroy Koku-Provider operations.

    'create' operations:
        Koku POST /providers is executed along with updating the Sources database table with
        the Koku Provider uuid.
    'destroy' operations:
        Koku DELETE /providers is executed along with removing the Sources database entry.

    Two types of exceptions are handled for Koku HTTP operations.  Recoverable client and
    Non-Recoverable client errors.  If the error is recoverable the calling function
    (synchronize_sources) will re-queue the operation.

    Args:
        msg (Asyncio msg): Dictionary messages containing operation,
                                       provider and offset.
            example: {'operation': 'create', 'provider': SourcesModelObj, 'offset': 3}
        cost_management_type_id (Integer): Cost Management Type Identifier

    Returns:
        None

    """
    provider = msg.get('provider')
    operation = msg.get('operation')
    koku_client = KokuHTTPClient(provider.auth_header)
    sources_client = SourcesHTTPClient(provider.auth_header, provider.source_id)
    try:
        if operation == 'create':
            LOG.info(f'Creating Koku Provider for Source ID: {str(provider.source_id)}')
            koku_details = koku_client.create_provider(provider.name, provider.source_type, provider.authentication,
                                                       provider.billing_source, provider.source_uuid)
            LOG.info(f'Koku Provider UUID {koku_details.get("uuid")} assigned to Source ID {str(provider.source_id)}.')
            storage.add_provider_koku_uuid(provider.source_id, koku_details.get('uuid'))
        elif operation == 'destroy':
            if provider.koku_uuid:
                try:
                    response = koku_client.destroy_provider(provider.koku_uuid)
                    LOG.info(
                        f'Koku Provider UUID ({provider.koku_uuid}) Removal Status Code: {str(response.status_code)}')
                except KokuHTTPClientNonRecoverableError:
                    LOG.info(f'Koku Provider already removed.  Remove Source ID: {str(provider.source_id)}.')
            storage.destroy_provider_event(provider.source_id)
        elif operation == 'update':
            koku_details = koku_client.update_provider(provider.koku_uuid, provider.name, provider.source_type,
                                                       provider.authentication, provider.billing_source)
            storage.clear_update_flag(provider.source_id)
            LOG.info(f'Koku Provider UUID {koku_details.get("uuid")} with Source ID {str(provider.source_id)} updated.')
        sources_client.set_source_status(None, cost_management_type_id)

    except KokuHTTPClientError as koku_error:
        raise SourcesIntegrationError('Koku provider error: ', str(koku_error))
    except KokuHTTPClientNonRecoverableError as koku_error:
        err_msg = f'Unable to {operation} provider for Source ID: {str(provider.source_id)}. Reason: {str(koku_error)}'
        LOG.error(err_msg)
        sources_client.set_source_status(str(koku_error), cost_management_type_id)
Esempio n. 6
0
 def create_account(self,
                    name,
                    provider_type,
                    authentication,
                    billing_source,
                    source_uuid=None):
     """Call to create provider."""
     try:
         provider = self._provider_builder.create_provider(
             name, provider_type, authentication, billing_source,
             source_uuid)
         add_provider_koku_uuid(self._source_id, provider.uuid)
     except ProviderBuilderError as provider_err:
         raise SourcesProviderCoordinatorError(str(provider_err))
     return provider