Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
 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()
Esempio n. 4
0
 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)
Esempio n. 5
0
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}")
Esempio n. 6
0
    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()
Esempio n. 7
0
    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()
Esempio n. 8
0
    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())