コード例 #1
0
    def test_get_billing_source_for_provider_error(self):
        """Test to build Koku Provider billing_source json obj with errors."""
        test_matrix = [
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {
                    "data_source": "test-bucket"
                },
                "expected_response": ProviderBuilderError,
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "bucket": {
                        "foo": "bar"
                    }
                },
                "expected_response": ProviderBuilderError,
            },
        ]
        client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)

        for test in test_matrix:
            with self.assertRaises(test.get("expected_response")):
                client.get_billing_source_for_provider(
                    test.get("provider_type"), test.get("billing_source"))
コード例 #2
0
    def test__build_credentials_auth_errors(self):
        """Test to build Koku Provider authentication json obj with errors."""
        test_matrix = [
            {
                "provider_type": Provider.PROVIDER_AWS,
                "authentication": {
                    "credentialz": {
                        "role_arn": "arn:fake"
                    }
                },
                "expected_response": ProviderBuilderError,
            },
            {
                "provider_type": Provider.PROVIDER_OCP,
                "authentication": {
                    "credentialz": "test-cluster-id"
                },
                "expected_response": ProviderBuilderError,
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "authentication": {
                    "credentialz": {
                        "foo": "bar"
                    }
                },
                "expected_response": ProviderBuilderError,
            },
        ]
        client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)

        for test in test_matrix:
            with self.assertRaises(test.get("expected_response")):
                client._build_credentials_auth(test.get("authentication"))
コード例 #3
0
 def test_create_provider_exceptions(self):
     """Test to create a provider with a non-recoverable error."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with self.assertRaises(ValidationError):
         source_uuid = faker.uuid4()
         client.create_provider(self.name, self.provider_type,
                                self.authentication, self.billing_source,
                                source_uuid)
コード例 #4
0
 def test_create_provider_with_source_uuid(self):
     """Test to create a provider with source uuid ."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         provider = client.create_provider_from_source(self.mock_source)
         self.assertEqual(provider.name, self.name)
         self.assertEqual(str(provider.uuid), self.source_uuid)
コード例 #5
0
 def test_update_provider_exception(self):
     """Test to update a provider with a connection error."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     expected_uuid = faker.uuid4()
     with self.assertRaises(Provider.DoesNotExist):
         client.update_provider(expected_uuid, "Aws Test",
                                Provider.PROVIDER_AWS,
                                {"resource_name": "arn:test"},
                                {"bucket": "bucket"})
コード例 #6
0
 def test_create_provider(self):
     """Test to create a provider."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         provider = client.create_provider(self.name, self.provider_type,
                                           self.authentication,
                                           self.billing_source)
         self.assertEqual(provider.name, self.name)
コード例 #7
0
 def test_create_provider_no_tenant(self):
     """Test to create a provider after tenant was removed."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         mock_source = MockSourceObject(self.name, self.provider_type,
                                        self.authentication,
                                        self.billing_source)
         provider = client.create_provider_from_source(mock_source)
         self.assertEqual(provider.name, self.name)
コード例 #8
0
 def create(self, validated_data):
     """Create a source from validated data."""
     auth_header = get_auth_header(self.context.get("request"))
     manager = ProviderBuilder(auth_header)
     validated_data["auth_header"] = auth_header
     source = Sources.objects.create(**validated_data)
     provider = manager.create_provider_from_source(source)
     source.koku_uuid = provider.uuid
     source.save()
     LOG.info("Admin created Source and Provider.")
     return source
コード例 #9
0
    def test_destroy_provider(self):
        """Test to destroy a provider."""
        client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)

        with patch.object(ProviderAccessor,
                          "cost_usage_source_ready",
                          returns=True):
            provider = client.create_provider_from_source(self.mock_source)
            self.assertEqual(provider.name, self.name)
            self.assertEqual(str(provider.uuid), self.source_uuid)
            client.destroy_provider(self.source_uuid)
            with self.assertRaises(Provider.DoesNotExist):
                Provider.objects.get(uuid=self.source_uuid)
コード例 #10
0
 def test_destroy_provider_exception(self):
     """Test to destroy a provider with a connection error."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         provider = client.create_provider_from_source(self.mock_source)
         self.assertEqual(provider.name, self.name)
         self.assertEqual(str(provider.uuid), self.source_uuid)
         logging.disable(logging.NOTSET)
         with self.assertLogs(logger="api.provider.provider_builder",
                              level=logging.INFO):
             client.destroy_provider(faker.uuid4())
コード例 #11
0
 def test_update_provider(self):
     """Test to update a provider."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         provider = client.create_provider_from_source(self.mock_source)
         new_name = "Aws Test"
         self.mock_source.name = new_name
         updated_provider = client.update_provider_from_source(
             self.mock_source)
         self.assertEqual(updated_provider.uuid, provider.uuid)
         self.assertEqual(updated_provider.name, new_name)
コード例 #12
0
 def test_update_provider_pause(self):
     """Test to update a provider for pause/unpause."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         provider = client.create_provider_from_source(self.mock_source)
         self.assertFalse(provider.paused)
         for test in [True, False]:
             with self.subTest(paused=test):
                 self.mock_source.paused = test
                 updated_provider = client.update_provider_from_source(
                     self.mock_source)
                 self.assertEqual(updated_provider.paused, test)
コード例 #13
0
ファイル: serializers.py プロジェクト: xJustin/koku
 def create(self, validated_data):
     """Create a source from validated data."""
     auth_header = get_auth_header(self.context.get("request"))
     manager = ProviderBuilder(auth_header)
     validated_data["auth_header"] = auth_header
     source = Sources.objects.create(**validated_data)
     try:
         provider = manager.create_provider_from_source(source)
     except SkipStatusPush:
         raise serializers.ValidationError("GCP billing table not ready")
     source.koku_uuid = provider.uuid
     source.save()
     LOG.info("Admin created Source and Provider.")
     return source
コード例 #14
0
 def test_create_provider(self):
     """Test to create a provider."""
     # Delete tenants
     Tenant.objects.filter(schema_name="acct12345").delete(
     )  # filtering avoids migrating the template0 again
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         mock_source = MockSourceObject(self.name, self.provider_type,
                                        self.authentication,
                                        self.billing_source)
         provider = client.create_provider_from_source(mock_source)
         self.assertEqual(provider.name, self.name)
コード例 #15
0
 def test_update_provider(self):
     """Test to update a provider."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     source_uuid = faker.uuid4()
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         provider = client.create_provider(self.name, self.provider_type,
                                           self.authentication,
                                           self.billing_source, source_uuid)
         new_name = "Aws Test"
         updated_provider = client.update_provider(
             source_uuid, new_name, Provider.PROVIDER_AWS,
             {"resource_name": "arn:test"}, {"bucket": "bucket"})
         self.assertEqual(updated_provider.uuid, provider.uuid)
         self.assertEqual(updated_provider.name, new_name)
コード例 #16
0
 def destroy(self, request, *args, **kwargs):
     """Delete a source."""
     source = self.get_object()
     manager = ProviderBuilder(request.user.identity_header.get("encoded"))
     for _ in range(5):
         try:
             manager.destroy_provider(source.koku_uuid)
         except IntegrityError as error:
             LOG.warning(f"Retrying Source delete due to error: {error}")
         except Exception as error:  # catch everything else. return immediately
             msg = f"Source removal resulted in UNKNOWN error: {type(error).__name__}: {error}"
             LOG.error(msg)
             return Response(msg, status=500)
         else:
             return super().destroy(request, *args, **kwargs)
     LOG.error("Failed to remove Source")
     return Response("Failed to remove Source", status=500)
コード例 #17
0
 def test_create_provider_ocp_cluster_register(self):
     """Test to create an OCP provider with a System identity."""
     # Delete tenants
     Tenant.objects.all().delete()
     client = ProviderBuilder(
         auth_header=Config.SOURCES_FAKE_CLUSTER_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         mock_source_auth = {
             "credentials": {
                 "cluster_id": "0bb29135-d6d1-478b-b5b6-6bd129cb6d5d1001"
             }
         }
         mock_source = MockSourceObject(self.name, Provider.PROVIDER_OCP,
                                        mock_source_auth, None)
         provider = client.create_provider_from_source(mock_source)
         self.assertEqual(provider.name, self.name)
コード例 #18
0
class SourcesProviderCoordinator:
    """Coordinator to control source and provider operations."""
    def __init__(self, source_id, auth_header):
        """Initialize the client."""
        header = {"x-rh-identity": auth_header, "sources-client": "True"}
        self._source_id = source_id
        self._identity_header = header
        self._provider_builder = ProviderBuilder(self._identity_header)

    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

    def update_account(self, provider_uuid, name, provider_type,
                       authentication, billing_source):
        """Call to update provider."""
        try:
            provider = self._provider_builder.update_provider(
                provider_uuid, name, provider_type, authentication,
                billing_source)
            clear_update_flag(self._source_id)
        except ProviderBuilderError as provider_err:
            raise SourcesProviderCoordinatorError(str(provider_err))
        return provider

    def destroy_account(self, provider_uuid):
        """Call to destroy provider."""
        try:
            self._provider_builder.destroy_provider(provider_uuid)
            destroy_source_event(self._source_id)
        except ProviderBuilderError as provider_err:
            LOG.error(f"Failed to remove provider. Error: {str(provider_err)}")
コード例 #19
0
    def test_get_billing_source_for_provider(self):
        """Test to build Koku Provider billing_source json obj."""
        test_matrix = [
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {
                    "data_source": {
                        "bucket": "test-bucket"
                    }
                },
                "expected_response": {
                    "data_source": {
                        "bucket": "test-bucket"
                    }
                },
            },
            {
                "provider_type": Provider.PROVIDER_OCP,
                "billing_source": {},
                "expected_response": {}
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "data_source": {
                        "foo": "bar"
                    }
                },
                "expected_response": {
                    "data_source": {
                        "foo": "bar"
                    }
                },
            },
        ]
        client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)

        for test in test_matrix:
            with self.subTest(test=test):
                response = client.get_billing_source_for_provider(
                    test.get("provider_type"), test.get("billing_source"))
                self.assertEqual(response, test.get("expected_response"))
コード例 #20
0
    def test_get_authentication_for_provider(self):
        """Test to build Koku Provider authentication json obj."""
        test_matrix = [
            {
                "provider_type": Provider.PROVIDER_AWS,
                "authentication": {
                    "resource_name": "arn:fake"
                },
                "expected_response": {
                    "provider_resource_name": "arn:fake"
                },
            },
            {
                "provider_type": Provider.PROVIDER_OCP,
                "authentication": {
                    "resource_name": "test-cluster-id"
                },
                "expected_response": {
                    "provider_resource_name": "test-cluster-id"
                },
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "authentication": {
                    "credentials": {
                        "foo": "bar"
                    }
                },
                "expected_response": {
                    "credentials": {
                        "foo": "bar"
                    }
                },
            },
        ]
        client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)

        for test in test_matrix:
            response = client.get_authentication_for_provider(
                test.get("provider_type"), test.get("authentication"))
            self.assertEqual(response, test.get("expected_response"))
コード例 #21
0
class SourcesProviderCoordinator:
    """Coordinator to control source and provider operations."""
    def __init__(self, source_id, auth_header):
        """Initialize the client."""
        header = {"x-rh-identity": auth_header, "sources-client": "True"}
        self._source_id = source_id
        self._identity_header = header
        self._provider_builder = ProviderBuilder(self._identity_header)

    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 update_account(self, source):
        """Call to update provider."""
        try:
            LOG.info(
                f"Updating Provider for Source ID: {str(self._source_id)}")
            provider = self._provider_builder.update_provider_from_source(
                source)
        except ProviderBuilderError as provider_err:
            raise SourcesProviderCoordinatorError(str(provider_err))
        return provider

    def destroy_account(self, koku_uuid):
        """Call to destroy provider."""
        try:
            self._provider_builder.destroy_provider(koku_uuid)
            destroy_source_event(self._source_id)
        except ProviderBuilderError as provider_err:
            LOG.error(f"Failed to remove provider. Error: {str(provider_err)}")
コード例 #22
0
 def test_update_provider_error(self):
     """Test to update a provider with a koku server error."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         client.create_provider_from_source(self.mock_source)
     with self.assertRaises(ValidationError):
         new_name = "Aws Test"
         self.mock_source.name = new_name
         client.update_provider_from_source(self.mock_source)
コード例 #23
0
 def test_update_provider_error(self):
     """Test to update a provider with a koku server error."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     source_uuid = faker.uuid4()
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         client.create_provider(self.name, self.provider_type,
                                self.authentication, self.billing_source,
                                source_uuid)
     with self.assertRaises(ValidationError):
         client.update_provider(source_uuid, "Aws Test",
                                Provider.PROVIDER_AWS,
                                {"resource_name": "arn:test"},
                                {"bucket": "bucket"})
コード例 #24
0
ファイル: view.py プロジェクト: dccurtis/koku
 def destroy(self, request, *args, **kwargs):
     """Delete a source."""
     source = self.get_object()
     manager = ProviderBuilder(request.user.identity_header.get("encoded"))
     manager.destroy_provider(source.koku_uuid)
     return super().destroy(request, *args, **kwargs)
コード例 #25
0
 def __init__(self, source_id, auth_header):
     """Initialize the client."""
     header = {"x-rh-identity": auth_header, "sources-client": "True"}
     self._source_id = source_id
     self._identity_header = header
     self._provider_builder = ProviderBuilder(self._identity_header)
コード例 #26
0
 def test_create_provider_exceptions(self):
     """Test to create a provider with a non-recoverable error."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with self.assertRaises(ValidationError):
         client.create_provider_from_source(self.mock_source)
コード例 #27
0
 def test_update_provider_exception(self):
     """Test to update a provider with a connection error."""
     client = ProviderBuilder(auth_header=Config.SOURCES_FAKE_HEADER)
     with self.assertRaises(Provider.DoesNotExist):
         client.update_provider_from_source(self.mock_source)