def test_post_status_provider_unavailable(self): """Test that the provider active flag is set to true when source is unavailable.""" request = self.request_context.get("request") source_id = 1 source_name = "New AWS Mock Test Source" with patch.object(ProviderAccessor, "cost_usage_source_ready", side_effect=ValidationError("test error")): provider = Provider.objects.create(name=source_name, created_by=request.user, customer=request.user.customer, active=True) Sources.objects.create( source_id=1, name=source_name, source_type=Provider.PROVIDER_AWS, authentication={"credentials": { "role_arn": "fake-iam" }}, billing_source={"data_source": { "bucket": "my-bucket" }}, koku_uuid=str(provider.uuid), offset=1, ) status_obj = SourceStatus(request, source_id) status_obj.status() self.assertFalse(Provider.objects.get(uuid=provider.uuid).active)
def test_post_status_wrong_provider(self): """Test for logs when provider mismatch is detected while setting status.""" request = self.request_context.get("request") source_id = 1 source_name = "New AWS Mock Test Source" with patch.object(ProviderAccessor, "cost_usage_source_ready", returns=True): Sources.objects.create( source_id=source_id, name=source_name, source_type=Provider.PROVIDER_AWS, authentication={"credentials": { "role_arn": "fake-iam" }}, billing_source={"data_source": { "bucket": "my-bucket" }}, koku_uuid=str(uuid4()), offset=1, ) status_obj = SourceStatus(request, source_id) with self.assertLogs("sources.api.source_status", level="INFO") as logger: status_obj.status() expected = f"INFO:sources.api.source_status:No provider found for Source ID: {source_id}" self.assertIn(expected, logger.output)
def test_update_source_name_no_change(self, mock_get_source_details, mock_update_account): """Test that the source name is not queued for update when out of sync with platform.""" mock_status = { "availability_status": "available", "availability_status_error": "" } source_name = "AWS source" with patch.object(SourcesHTTPClient, "build_source_status", return_value=mock_status): # Insert a source with ID 1 test_source_id = 1 Sources.objects.create( source_id=test_source_id, name=source_name, source_type=Provider.PROVIDER_AWS, authentication={"authentication": { "rolearn": "myarn" }}, billing_source={"bucket": "my-bucket"}, koku_uuid="uuid", offset=1, ) request = self.request_context.get("request") status_obj = SourceStatus(request, test_source_id) with patch.object(SourcesHTTPClient, "get_source_details", return_value={ "name": source_name, "source_type_id": "1" }): status_obj.update_source_name() mock_update_account.assert_not_called()
def status(self, request, *args, **kwargs): """Get source availability status.""" source_id = kwargs.get('source_id') try: source_status_obj = SourceStatus(source_id) availability_status = source_status_obj.status() return Response(availability_status, status=status.HTTP_200_OK) except Sources.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND)
def source_status_beat(): """Source Status push.""" sources_query = Sources.objects.filter(source_id__isnull=False).all() for source in sources_query: try: status_pusher = SourceStatus(source.source_id) LOG.info("Delivering source status for Source ID: %s", source.source_id) status_pusher.push_status() except ObjectDoesNotExist: LOG.info(f"Source status not pushed. Unable to find Source ID: {source.source_id}")
def test_push_status_gcp_table_discovery_completed(self, mock_set_source_status): """Test that push_status for when GCP BigQuery table id is already known.""" mock_status = { "availability_status": "available", "availability_status_error": "" } with patch.object(SourcesHTTPClient, "build_source_status", return_value=mock_status): test_source_id = 1 # Insert a source with ID 1 Sources.objects.create( source_id=test_source_id, name="New GCP Mock Test Source", source_type=Provider.PROVIDER_GCP, koku_uuid=faker.uuid4(), authentication={ "credentials": { "project_id": "test_project_id" } }, billing_source={ "data_source": { "dataset": "test_dataset", "table_id": "billtable" } }, status={ "availability_status": "available", "availability_status_error": "" }, offset=1, ) with patch.object(ProviderAccessor, "cost_usage_source_ready", returns=True): with patch.object(SourceStatus, "update_source_name", returns=True): with patch.object(SourcesProviderCoordinator, "update_account", returns=True): status_obj = SourceStatus(test_source_id) status_obj.push_status() mock_set_source_status.assert_called()
def test_push_status_first_gcp_table_discovery(self, mock_set_source_status, mock_update_account, mock_create_account): """Test that push_status for initial discovery of GCP BigQuery table id.""" mock_status = { "availability_status": "available", "availability_status_error": "" } with patch.object(SourcesHTTPClient, "build_source_status", return_value=mock_status): test_source_id = 1 # Insert a source with ID 1 Sources.objects.create( source_id=test_source_id, name="New GCP Mock Test Source", source_type=Provider.PROVIDER_GCP, authentication={ "credentials": { "project_id": "test_project_id" } }, billing_source={ "data_source": { "dataset": "test_dataset", "table_id": "cost_table" } }, status={}, offset=1, ) with patch.object(ProviderAccessor, "cost_usage_source_ready", returns=True): with patch.object(SourceStatus, "update_source_name", returns=True): status_obj = SourceStatus(test_source_id) status_obj.push_status() mock_set_source_status.assert_called() mock_create_account.assert_called() mock_update_account.assert_not_called()
def test_gcp_bigquery_table_found(self): """Test helper method _gcp_bigquery_table_found.""" request = self.request_context.get("request") aws_source_id = 1 Sources.objects.create( source_id=aws_source_id, name="AWS Source", source_type=Provider.PROVIDER_AWS, authentication={"credentials": { "role_arn": "fake-iam" }}, billing_source={"data_source": { "bucket": "my-bucket" }}, koku_uuid=str(uuid4()), offset=1, ) aws_status_obj = SourceStatus(request, aws_source_id) self.assertFalse(aws_status_obj._gcp_bigquery_table_found()) gcp_source_id = 2 Sources.objects.create( source_id=gcp_source_id, name="GCP Source", source_type=Provider.PROVIDER_GCP, authentication={"credentials": { "project_id": "test_project_id" }}, billing_source={"data_source": { "dataset": "test_dataset" }}, koku_uuid=str(uuid4()), offset=1, ) aws_status_obj = SourceStatus(request, gcp_source_id) self.assertTrue(aws_status_obj._gcp_bigquery_table_found())