Пример #1
0
    def test_azure_source_billing_source_update(self, _):
        """Test the updating azure billing_source."""
        serializer = SourcesSerializer(context=self.request_context)
        test_resource_group = "TESTRG"
        test_storage_account = "testsa"
        validated_data = {
            "billing_source": {
                "data_source": {
                    "resource_group": test_resource_group,
                    "storage_account": test_storage_account
                }
            }
        }
        with patch("sources.api.serializers.ServerProxy") as mock_client:
            mock_sources_client = MockSourcesClient(
                "http://mock-soures-client")
            mock_client.return_value.__enter__.return_value = mock_sources_client
            instance = serializer.update(self.azure_obj, validated_data)

        self.assertIn("data_source", instance.billing_source.keys())
        self.assertEqual(
            test_resource_group,
            instance.billing_source.get("data_source").get("resource_group"))
        self.assertEqual(
            test_storage_account,
            instance.billing_source.get("data_source").get("storage_account"))
Пример #2
0
 def test_aws_source_billing_source_update_missing_bucket(self):
     """Test the updating aws billing_source."""
     serializer = SourcesSerializer(context=self.request_context)
     test_bucket = None
     validated_data = {'billing_source': {'bucket': test_bucket}}
     with self.assertRaises(SourcesStorageError):
         serializer.update(self.aws_obj, validated_data)
Пример #3
0
    def test_azure_source_update_missing_credential(self, _):
        """Test the update azure source with missing credentials."""
        self.azure_obj.authentication = {}
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {
            "authentication": {
                "credentials": {
                    "subscription_id": "subscription-uuid"
                }
            }
        }
        with patch("sources.api.serializers.ServerProxy") as mock_client:
            mock_sources_client = MockSourcesClient(
                "http://mock-soures-client")
            mock_client.return_value.__enter__.return_value = mock_sources_client
            instance = serializer.update(self.azure_obj, validated_data)
            self.assertEqual(
                "subscription-uuid",
                instance.authentication.get("credentials").get(
                    "subscription_id"))

        for field in ("client_id", "tenant_id", "client_secret"):
            self.assertNotIn(field,
                             instance.authentication.get("credentials").keys())
Пример #4
0
 def test_azure_source_billing_source_update_missing_resource_group(self, _):
     """Test the updating azure billing_source with missing resource group."""
     serializer = SourcesSerializer(context=self.request_context)
     test_storage_account = "testsa"
     validated_data = {"billing_source": {"data_source": {"storage_account": test_storage_account}}}
     with self.assertRaises(SourcesStorageError):
         serializer.update(self.azure_obj, validated_data)
Пример #5
0
 def test_azure_source_billing_source_update_missing_storage_account(self):
     """Test the updating azure billing_source with missing storage account."""
     serializer = SourcesSerializer(context=self.request_context)
     test_resource_group = 'TESTRG'
     validated_data = {'billing_source': {'data_source': {'resource_group': test_resource_group}}}
     with self.assertRaises(SourcesStorageError):
         serializer.update(self.azure_obj, validated_data)
Пример #6
0
 def test_aws_source_billing_source_update(self):
     """Test the updating aws billing_source."""
     serializer = SourcesSerializer(context=self.request_context)
     test_bucket = 'test-bucket'
     validated_data = {'billing_source': {'bucket': test_bucket}}
     instance = serializer.update(self.aws_obj, validated_data)
     self.assertIn('bucket', instance.billing_source.keys())
     self.assertEqual(test_bucket, instance.billing_source.get('bucket'))
Пример #7
0
 def test_aws_source_billing_source_update(self):
     """Test the updating aws billing_source."""
     serializer = SourcesSerializer(context=self.request_context)
     test_bucket = "test-bucket"
     validated_data = {"billing_source": {"bucket": test_bucket}}
     instance = serializer.update(self.aws_obj, validated_data)
     self.assertIn("bucket", instance.billing_source.keys())
     self.assertEqual(test_bucket, instance.billing_source.get("bucket"))
Пример #8
0
    def test_azure_source_update_wrong_type(self):
        """Test the updating azure source with wrong source type."""
        self.azure_obj.source_type = Provider.PROVIDER_AWS
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {'authentication': {'credentials': {'subscription_id': 'subscription-uuid'}}}
        with self.assertRaises(SourcesStorageError):
            serializer.update(self.azure_obj, validated_data)
Пример #9
0
 def test_ocp_source_billing_source_update(self):
     """Test the updating billing_source for invalid OCP source."""
     self.aws_obj.instance_type = Provider.PROVIDER_OCP
     self.aws_obj.save()
     test_bucket = 'test-bucket'
     serializer = SourcesSerializer(context=self.request_context)
     test_bucket = None
     validated_data = {'billing_source': {'bucket': test_bucket}}
     with self.assertRaises(SourcesStorageError):
         serializer.update(self.aws_obj, validated_data)
Пример #10
0
 def test_azure_source_authentication_update(self):
     """Test the updating azure subscription id."""
     serializer = SourcesSerializer(context=self.request_context)
     validated_data = {'authentication': {'credentials': {'subscription_id': 'subscription-uuid'}}}
     instance = serializer.update(self.azure_obj, validated_data)
     self.assertIn('credentials', instance.authentication.keys())
     self.assertIn('client_id', instance.authentication.get('credentials').keys())
     self.assertIn('tenant_id', instance.authentication.get('credentials').keys())
     self.assertIn('subscription_id', instance.authentication.get('credentials').keys())
     self.assertEqual('subscription-uuid', instance.authentication.get('credentials').get('subscription_id'))
Пример #11
0
    def test_azure_source_update_with_koku_uuid(self):
        """Test the updating azure subscription id with a koku_uuid."""
        self.azure_obj.koku_uuid = fake.uuid4()
        self.azure_obj.pending_update = False
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {'authentication': {'credentials': {'subscription_id': 'subscription-uuid'}}}
        instance = serializer.update(self.azure_obj, validated_data)
        self.assertTrue(instance.pending_update)
Пример #12
0
 def test_azure_source_billing_source_update(self):
     """Test the updating azure billing_source."""
     serializer = SourcesSerializer(context=self.request_context)
     test_resource_group = 'TESTRG'
     test_storage_account = 'testsa'
     validated_data = {'billing_source': {'data_source': {'resource_group': test_resource_group,
                                                          'storage_account': test_storage_account}}}
     instance = serializer.update(self.azure_obj, validated_data)
     self.assertIn('data_source', instance.billing_source.keys())
     self.assertEqual(test_resource_group, instance.billing_source.get('data_source').get('resource_group'))
     self.assertEqual(test_storage_account, instance.billing_source.get('data_source').get('storage_account'))
Пример #13
0
 def test_aws_source_billing_source_update(self, mock_delay):
     """Test the updating aws billing_source."""
     serializer = SourcesSerializer(context=self.request_context)
     test_bucket = "some-new-bucket"
     validated_data = {"billing_source": {"bucket": test_bucket}}
     with patch.object(ProviderAccessor,
                       "cost_usage_source_ready",
                       returns=True):
         instance = serializer.update(self.aws_obj, validated_data)
     self.assertIn("bucket", instance.billing_source.keys())
     self.assertEqual(test_bucket, instance.billing_source.get("bucket"))
Пример #14
0
    def test_azure_source_update_missing_credential(self):
        """Test the updating azure source with invalid authentication."""
        self.azure_obj.authentication = {}
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {'authentication': {'credentials': {'subscription_id': 'subscription-uuid'}}}
        instance = serializer.update(self.azure_obj, validated_data)
        self.assertEqual('subscription-uuid', instance.authentication.get('credentials').get('subscription_id'))
        for field in ('client_id', 'tenant_id', 'client_secret'):
            self.assertNotIn(field, instance.authentication.get('credentials').keys())
Пример #15
0
    def test_azure_source_update_wrong_type(self, _):
        """Test the updating azure source with wrong source type."""
        self.azure_obj.source_type = Provider.PROVIDER_AWS
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {"authentication": {"credentials": {"subscription_id": "subscription-uuid"}}}
        with self.assertRaises(SourcesStorageError):
            with patch("sources.api.serializers.ServerProxy") as mock_client:
                mock_sources_client = MockSourcesClient("http://mock-soures-client")
                mock_client.return_value.__enter__.return_value = mock_sources_client
                serializer.update(self.azure_obj, validated_data)
Пример #16
0
    def test_aws_source_billing_source_update(self, _):
        """Test the updating aws billing_source."""
        serializer = SourcesSerializer(context=self.request_context)
        test_bucket = "some-new-bucket"
        validated_data = {"billing_source": {"bucket": test_bucket}}
        with patch("sources.api.serializers.ServerProxy") as mock_client:
            with patch.object(ProviderAccessor, "cost_usage_source_ready", returns=True):
                mock_sources_client = MockSourcesClient("http://mock-soures-client")
                mock_client.return_value.__enter__.return_value = mock_sources_client
                instance = serializer.update(self.aws_obj, validated_data)

        self.assertIn("bucket", instance.billing_source.keys())
        self.assertEqual(test_bucket, instance.billing_source.get("bucket"))
Пример #17
0
    def test_azure_source_billing_source_update_with_koku_uuid(self):
        """Test the updating azure billing_source with koku_uuid."""
        self.azure_obj.koku_uuid = fake.uuid4()
        self.azure_obj.pending_update = False
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        test_resource_group = 'TESTRG'
        test_storage_account = 'testsa'
        validated_data = {'billing_source': {'data_source': {'resource_group': test_resource_group,
                                                             'storage_account': test_storage_account}}}
        instance = serializer.update(self.azure_obj, validated_data)
        self.assertTrue(instance.pending_update)
Пример #18
0
    def test_patch_unavailable_sources_client(self, _):
        serializer = SourcesSerializer(context=self.request_context)
        with patch("sources.api.serializers.ServerProxy") as mock_client:
            mock_client.side_effect = ConnectionRefusedError
            with self.assertRaises(SourcesDependencyError):
                validated_data = {
                    "billing_source": {
                        "data_source": {
                            "bucket": "some-new-bucket"
                        }
                    }
                }
                serializer.update(self.aws_obj, validated_data)

            mock_client.side_effect = gaierror
            with self.assertRaises(SourcesDependencyError):
                validated_data = {
                    "billing_source": {
                        "data_source": {
                            "bucket": "some-new-bucket"
                        }
                    }
                }
                serializer.update(self.aws_obj, validated_data)

        # catch ProtocolError
        with self.assertRaises(SourcesDependencyError):
            validated_data = {
                "billing_source": {
                    "data_source": {
                        "bucket": "some-new-bucket"
                    }
                }
            }
            serializer.update(self.aws_obj, validated_data)
Пример #19
0
    def test_azure_source_update_missing_credential(self):
        """Test the updating azure source with invalid authentication."""
        self.azure_obj.authentication = {}
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {
            'authentication': {
                'credentials': {
                    'subscription_id': 'subscription-uuid'
                }
            }
        }
        with self.assertRaises(SourcesStorageError):
            serializer.update(self.azure_obj, validated_data)
Пример #20
0
    def test_provider_create(self, mock_header, mock_request_info, mock_delay):
        mock_request_info.return_value = self.User, self.Customer

        serializer = AdminSourcesSerializer(context=self.request_context)
        source = {
            "source_id": 10,
            "name": "ProviderAWS",
            "source_type": "AWS",
            "authentication": {
                "resource_name":
                "arn:aws:iam::111111111111:role/CostManagement"
            },
            "billing_source": {
                "bucket": "first-bucket"
            },
            "auth_header": Config.SOURCES_FAKE_HEADER,
            "account_id": "acct10001",
            "offset": 10,
        }
        with patch.object(ProviderAccessor,
                          "cost_usage_source_ready",
                          returns=True):
            instance = serializer.create(source)
        self.assertEqual(instance.billing_source.get("bucket"), "first-bucket")

        serializer = SourcesSerializer(context=self.request_context)
        validated = {"billing_source": {"bucket": "second-bucket"}}
        with patch.object(ProviderAccessor,
                          "cost_usage_source_ready",
                          returns=True):
            instance2 = serializer.update(instance, validated)
        self.assertEqual(instance2.billing_source.get("bucket"),
                         "second-bucket")
Пример #21
0
    def test_source_update_rabbit_down(self, mock_delay):
        """Test the updating a source with rabbit down."""
        self.azure_obj.source_type = Provider.PROVIDER_AZURE
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {
            "authentication": {
                "credentials": {
                    "subscription_id": "subscription-uuid"
                }
            }
        }
        mock_side_effect = SourcesDependencyError("Where's Rabbit")
        mock_delay.side_effect = mock_side_effect
        with self.assertRaises(SourcesDependencyError):
            serializer.update(self.azure_obj, validated_data)
Пример #22
0
    def test_azure_source_billing_source_update_with_koku_uuid(self, _):
        """Test the updating azure billing_source with source_uuid."""
        self.azure_obj.source_uuid = fake.uuid4()
        self.azure_obj.pending_update = False
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        test_resource_group = "TESTRG"
        test_storage_account = "testsa"
        validated_data = {
            "billing_source": {
                "data_source": {"resource_group": test_resource_group, "storage_account": test_storage_account}
            }
        }
        with patch("sources.api.serializers.ServerProxy") as mock_client:
            mock_sources_client = MockSourcesClient("http://mock-soures-client")
            mock_client.return_value.__enter__.return_value = mock_sources_client
            instance = serializer.update(self.azure_obj, validated_data)
        self.assertTrue(instance.pending_update)
Пример #23
0
    def test_azure_source_update_missing_credential(self):
        """Test the updating azure source with invalid authentication."""
        self.azure_obj.authentication = {}
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        validated_data = {
            "authentication": {
                "credentials": {
                    "subscription_id": "subscription-uuid"
                }
            }
        }
        instance = serializer.update(self.azure_obj, validated_data)
        self.assertEqual(
            "subscription-uuid",
            instance.authentication.get("credentials").get("subscription_id"))
        for field in ("client_id", "tenant_id", "client_secret"):
            self.assertNotIn(field,
                             instance.authentication.get("credentials").keys())
Пример #24
0
    def test_azure_source_billing_source_update_with_koku_uuid(
            self, mock_delay):
        """Test the updating azure billing_source with source_uuid."""
        self.azure_obj.source_uuid = fake.uuid4()
        self.azure_obj.pending_update = False
        self.azure_obj.save()

        serializer = SourcesSerializer(context=self.request_context)
        test_resource_group = "TESTRG"
        test_storage_account = "testsa"
        validated_data = {
            "billing_source": {
                "data_source": {
                    "resource_group": test_resource_group,
                    "storage_account": test_storage_account
                }
            }
        }
        instance = serializer.update(self.azure_obj, validated_data)
        self.assertTrue(instance.pending_update)
Пример #25
0
 def test_azure_source_authentication_update(self):
     """Test the updating azure subscription id."""
     serializer = SourcesSerializer(context=self.request_context)
     validated_data = {
         "authentication": {
             "credentials": {
                 "subscription_id": "subscription-uuid"
             }
         }
     }
     instance = serializer.update(self.azure_obj, validated_data)
     self.assertIn("credentials", instance.authentication.keys())
     self.assertIn("client_id",
                   instance.authentication.get("credentials").keys())
     self.assertIn("tenant_id",
                   instance.authentication.get("credentials").keys())
     self.assertIn("subscription_id",
                   instance.authentication.get("credentials").keys())
     self.assertEqual(
         "subscription-uuid",
         instance.authentication.get("credentials").get("subscription_id"))
Пример #26
0
 def test_azure_source_billing_source_update(self, mock_delay):
     """Test the updating azure billing_source."""
     serializer = SourcesSerializer(context=self.request_context)
     test_resource_group = "TESTRG"
     test_storage_account = "testsa"
     validated_data = {
         "billing_source": {
             "data_source": {
                 "resource_group": test_resource_group,
                 "storage_account": test_storage_account
             }
         }
     }
     instance = serializer.update(self.azure_obj, validated_data)
     self.assertIn("data_source", instance.billing_source.keys())
     self.assertEqual(
         test_resource_group,
         instance.billing_source.get("data_source").get("resource_group"))
     self.assertEqual(
         test_storage_account,
         instance.billing_source.get("data_source").get("storage_account"))
Пример #27
0
    def test_provider_create(self, mock_header, mock_request_info, _):
        mock_request_info.return_value = self.User, self.Customer

        serializer = AdminSourcesSerializer(context=self.request_context)
        source = {
            "source_id": 10,
            "name": "ProviderAWS",
            "source_type": "AWS",
            "authentication": {
                "credentials": {
                    "role_arn": "arn:aws:iam::111111111111:role/CostManagement"
                }
            },
            "billing_source": {
                "data_source": {
                    "bucket": "first-bucket"
                }
            },
            "auth_header": Config.SOURCES_FAKE_HEADER,
            "account_id": "acct10001",
            "offset": 10,
        }
        with patch.object(ProviderAccessor,
                          "cost_usage_source_ready",
                          returns=True):
            instance = serializer.create(source)
        self.assertEqual(
            instance.billing_source.get("data_source", {}).get("bucket"),
            "first-bucket")

        serializer = SourcesSerializer(context=self.request_context)
        validated = {
            "billing_source": {
                "data_source": {
                    "bucket": "second-bucket"
                }
            }
        }
        with patch.object(ProviderAccessor,
                          "cost_usage_source_ready",
                          returns=True):
            with patch("sources.api.serializers.ServerProxy") as mock_client:
                mock_sources_client = MockSourcesClient(
                    "http://mock-soures-client")
                mock_client.return_value.__enter__.return_value = mock_sources_client
                instance2 = serializer.update(instance, validated)

        self.assertEqual(
            instance2.billing_source.get("data_source", {}).get("bucket"),
            "second-bucket")
Пример #28
0
    def test_update_aws_billing_source(self, _):
        """Test to validate that the billing source dictionary is updated."""
        aws_instance = self.aws_obj
        aws_instance.billing_source = PROVIDERS[Provider.PROVIDER_AWS].get(
            "billing_source")
        aws_instance.save()
        test_matrix = [
            {
                "instance": aws_instance,
                "billing_source": {
                    "bucket": "test-bucket"
                },
                "expected": {
                    "data_source": {
                        "bucket": "test-bucket"
                    }
                },
            },
            {
                "instance": aws_instance,
                "billing_source": {
                    "data_source": {
                        "bucket": "test-bucket"
                    }
                },
                "expected": {
                    "data_source": {
                        "bucket": "test-bucket"
                    }
                },
            },
        ]

        for test in test_matrix:
            with self.subTest(test=test):
                try:
                    new_billing = SourcesSerializer()._update_billing_source(
                        aws_instance, test.get("billing_source"))
                    self.assertEqual(new_billing, test.get("expected"))
                except Exception as error:
                    self.fail(str(error))
Пример #29
0
    def test_update_azure_billing_source(self, _):
        """Test to validate that the billing source dictionary is updated."""
        azure_instance = self.azure_obj
        azure_instance.billing_source = {
            "data_source": {
                "resource_group": "original-1",
                "storage_account": "original-2"
            }
        }
        azure_instance.save()
        test_matrix = [
            {
                "instance": azure_instance,
                "billing_source": {
                    "data_source": {
                        "resource_group": "foo",
                        "storage_account": "bar"
                    }
                },
                "expected": {
                    "data_source": {
                        "resource_group": "foo",
                        "storage_account": "bar"
                    }
                },
            },
            {
                "instance": azure_instance,
                "billing_source": {
                    "data_source": {
                        "resource_group": "foo"
                    }
                },
                "expected": {
                    "data_source": {
                        "resource_group": "foo",
                        "storage_account": "original-2"
                    }
                },
            },
            {
                "instance": azure_instance,
                "billing_source": {
                    "data_source": {
                        "storage_account": "bar"
                    }
                },
                "expected": {
                    "data_source": {
                        "resource_group": "original-1",
                        "storage_account": "bar"
                    }
                },
            },
        ]

        for test in test_matrix:
            with self.subTest(test=test):
                try:
                    new_billing = SourcesSerializer()._update_billing_source(
                        azure_instance, test.get("billing_source"))
                    self.assertEqual(new_billing, test.get("expected"))
                except Exception as error:
                    self.fail(str(error))
Пример #30
0
    def test_validate_billing_source(self, _):
        """Test to validate that the billing source dictionary is valid."""
        test_matrix = [
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {
                    "bucket": "test-bucket"
                },
                "exception": False
            },
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {
                    "data_source": {
                        "bucket": "test-bucket"
                    }
                },
                "exception": False,
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "data_source": {
                        "resource_group": "foo",
                        "storage_account": "bar"
                    }
                },
                "exception": False,
            },
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {
                    "data_source": {
                        "nobucket": "test-bucket"
                    }
                },
                "exception": True,
            },
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {
                    "nobucket": "test-bucket"
                },
                "exception": True
            },
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {
                    "data_source": {}
                },
                "exception": True
            },
            {
                "provider_type": Provider.PROVIDER_AWS,
                "billing_source": {},
                "exception": True
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {},
                "exception": True
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "nodata_source": {
                        "resource_group": "foo",
                        "storage_account": "bar"
                    }
                },
                "exception": True,
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "data_source": {
                        "noresource_group": "foo",
                        "storage_account": "bar"
                    }
                },
                "exception": True,
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "data_source": {
                        "resource_group": "foo",
                        "nostorage_account": "bar"
                    }
                },
                "exception": True,
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "data_source": {
                        "resource_group": "foo"
                    }
                },
                "exception": True,
            },
            {
                "provider_type": Provider.PROVIDER_AZURE,
                "billing_source": {
                    "data_source": {
                        "storage_account": "bar"
                    }
                },
                "exception": True,
            },
            {
                "provider_type": Provider.PROVIDER_GCP,
                "billing_source": {
                    "data_source": {
                        "dataset": "test_dataset",
                        "table_id": "test_table_id"
                    }
                },
                "exception": False,
            },
            {
                "provider_type": Provider.PROVIDER_GCP,
                "billing_source": {
                    "data_source": {
                        "dataset": "test_dataset"
                    }
                },
                "exception": False,
            },
            {
                "provider_type": Provider.PROVIDER_GCP,
                "billing_source": {
                    "data_source": {
                        "table_id": "test_table_id"
                    }
                },
                "exception": True,
            },
            {
                "provider_type": Provider.PROVIDER_GCP,
                "billing_source": {},
                "exception": True
            },
        ]

        for test in test_matrix:
            with self.subTest(test=test):
                if test.get("exception"):
                    with self.assertRaises(SourcesStorageError):
                        SourcesSerializer()._validate_billing_source(
                            test.get("provider_type"),
                            test.get("billing_source"))
                else:
                    try:
                        SourcesSerializer()._validate_billing_source(
                            test.get("provider_type"),
                            test.get("billing_source"))
                    except Exception as error:
                        self.fail(str(error))