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))
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)
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
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)
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