コード例 #1
0
 def destroy(self, request, *args, **kwargs):
     """Delete a rate."""
     uuid = kwargs.get("uuid")
     try:
         manager = CostModelManager(cost_model_uuid=uuid)
     except CostModel.DoesNotExist:
         LOG.info("CostModel does not exist.")
     else:
         manager.update_provider_uuids([])
     return super().destroy(request=request, args=args, kwargs=kwargs)
コード例 #2
0
ファイル: serializers.py プロジェクト: prasadanvekar/koku
    def update(self, instance, validated_data, *args, **kwargs):
        """Update the rate object in the database."""
        provider_uuids = validated_data.pop('provider_uuids', [])
        new_providers_for_instance = []
        for uuid in provider_uuids:
            new_providers_for_instance.append(str(Provider.objects.filter(uuid=uuid).first().uuid))
        manager = CostModelManager(cost_model_uuid=instance.uuid)
        manager.update_provider_uuids(new_providers_for_instance)
        manager.update(**validated_data)

        return manager.instance
コード例 #3
0
ファイル: view.py プロジェクト: project-koku/koku
 def destroy(self, request, *args, **kwargs):
     """Delete a rate."""
     uuidParam = kwargs.get("uuid")
     try:
         manager = CostModelManager(cost_model_uuid=uuidParam)
     except CostModel.DoesNotExist:
         LOG.info("CostModel does not exist.")
     except ValidationError as err:
         raise CostModelQueryException(err)
     else:
         manager.update_provider_uuids([])
     return super().destroy(request=request, args=args, kwargs=kwargs)
コード例 #4
0
 def destroy(self, request, *args, **kwargs):
     """Delete a rate."""
     uuid = kwargs.get("uuid")
     invalidate_view_cache_for_tenant_and_cache_key(
         request.tenant.schema_name, cache_key_prefix=SOURCES_PREFIX)
     try:
         manager = CostModelManager(cost_model_uuid=uuid)
     except CostModel.DoesNotExist:
         LOG.info("CostModel does not exist.")
     else:
         manager.update_provider_uuids([])
     return super().destroy(request=request, args=args, kwargs=kwargs)
コード例 #5
0
 def update(self, instance, validated_data, *args, **kwargs):
     """Update the rate object in the database."""
     source_uuids = validated_data.pop("source_uuids", [])
     new_providers_for_instance = []
     for uuid in source_uuids:
         new_providers_for_instance.append(str(Provider.objects.filter(uuid=uuid).first().uuid))
     try:
         manager = CostModelManager(cost_model_uuid=instance.uuid)
         manager.update_provider_uuids(new_providers_for_instance)
         manager.update(**validated_data)
     except CostModelException as error:
         raise serializers.ValidationError(error_obj("cost-models", str(error)))
     return manager.instance
コード例 #6
0
    def test_deleting_cost_model_refreshes_materialized_views(
            self, mock_chain, mock_update, mock_refresh):
        """Test deleting a cost model refreshes the materialized views."""
        provider_name = "sample_provider"
        with patch("masu.celery.tasks.check_report_updates"):
            provider = Provider.objects.create(name=provider_name,
                                               created_by=self.user,
                                               customer=self.customer)

        # Get Provider UUID
        provider_uuid = provider.uuid

        data = {
            "name": "Test Cost Model",
            "description": "Test",
            "provider_uuids": [provider_uuid],
            "markup": {
                "value": 10,
                "unit": "percent"
            },
        }

        with tenant_context(self.tenant):
            manager = CostModelManager()
            with patch("cost_models.cost_model_manager.chain"):
                cost_model_obj = manager.create(**data)
            self.assertIsNotNone(cost_model_obj.uuid)

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertIsNotNone(cost_model_map)

            start_date = DateHelper().this_month_start.strftime("%Y-%m-%d")
            end_date = DateHelper().today.strftime("%Y-%m-%d")

            # simulates deleting a cost_model
            manager.update_provider_uuids(provider_uuids=[])
            mock_chain.assert_called_once_with(
                mock_update.s(self.schema_name, provider_uuid, start_date,
                              end_date).set(),
                mock_refresh.si(self.schema_name,
                                provider.type,
                                provider_uuid=provider_uuid).set(),
            )
コード例 #7
0
    def test_deleting_cost_model_not_triggers_tasks(self, mock_chain,
                                                    mock_update, mock_refresh):
        """Test deleting a cost model with an inactive provider does not trigger tasks."""
        provider_name = "sample_provider"
        with patch("masu.celery.tasks.check_report_updates"):
            provider = Provider.objects.create(name=provider_name,
                                               created_by=self.user,
                                               customer=self.customer)

        # Get Provider UUID
        provider_uuid = provider.uuid
        provider.active = False
        provider.save()

        data = {
            "name": "Test Cost Model",
            "description": "Test",
            "provider_uuids": [provider_uuid],
            "markup": {
                "value": 10,
                "unit": "percent"
            },
        }

        with tenant_context(self.tenant):
            manager = CostModelManager()
            with patch("cost_models.cost_model_manager.chain"):
                cost_model_obj = manager.create(**data)
            self.assertIsNotNone(cost_model_obj.uuid)

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertIsNotNone(cost_model_map)

            # simulates deleting a cost_model
            manager.update_provider_uuids(provider_uuids=[])
            mock_chain.assert_not_called()
コード例 #8
0
    def test_update_provider_uuids(self):
        """Test creating a cost model then update with a provider uuid."""
        metric = CostModelMetricsMap.OCP_METRIC_CPU_CORE_USAGE_HOUR
        source_type = 'OCP'
        tiered_rates = [{'unit': 'USD', 'value': 0.22}]
        data = {
            'name':
            'Test Cost Model',
            'description':
            'Test',
            'rates': [{
                'metric': {
                    'name': metric
                },
                'source_type': source_type,
                'tiered_rates': tiered_rates
            }]
        }
        cost_model_obj = None
        with tenant_context(self.tenant):
            manager = CostModelManager()
            cost_model_obj = manager.create(**data)

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertEqual(len(cost_model_map), 0)

        provider_name = 'sample_provider'
        provider = Provider.objects.create(name=provider_name,
                                           created_by=self.user,
                                           customer=self.customer)

        # Get Provider UUID
        provider_uuid = provider.uuid

        # Add provider to existing cost model
        with tenant_context(self.tenant):
            manager = CostModelManager(cost_model_uuid=cost_model_obj.uuid)
            manager.update_provider_uuids(provider_uuids=[provider_uuid])

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertIsNotNone(cost_model_map)
            self.assertEqual(cost_model_map.first().provider_uuid,
                             provider_uuid)
            self.assertEqual(len(cost_model_map), 1)

        # Add provider again to existing cost model.  Verify there is still only 1 item in map
        with tenant_context(self.tenant):
            manager = CostModelManager(cost_model_uuid=cost_model_obj.uuid)
            manager.update_provider_uuids(provider_uuids=[provider_uuid])

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertIsNotNone(cost_model_map)
            self.assertEqual(cost_model_map.first().provider_uuid,
                             provider_uuid)
            self.assertEqual(len(cost_model_map), 1)

        # Remove provider from existing rate
        with tenant_context(self.tenant):
            manager = CostModelManager(cost_model_uuid=cost_model_obj.uuid)
            manager.update_provider_uuids(provider_uuids=[])

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertEqual(len(cost_model_map), 0)
コード例 #9
0
    def test_update_provider_uuids(self):
        """Test creating a cost model then update with a provider uuid."""
        metric = metric_constants.OCP_METRIC_CPU_CORE_USAGE_HOUR
        source_type = Provider.PROVIDER_OCP
        tiered_rates = [{"unit": "USD", "value": 0.22}]
        data = {
            "name":
            "Test Cost Model",
            "description":
            "Test",
            "rates": [{
                "metric": {
                    "name": metric
                },
                "source_type": source_type,
                "tiered_rates": tiered_rates
            }],
        }
        cost_model_obj = None
        with tenant_context(self.tenant):
            manager = CostModelManager()
            with patch("cost_models.cost_model_manager.chain") as mock_chain:
                cost_model_obj = manager.create(**data)
                mock_chain.return_value.apply_async.assert_not_called()

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertEqual(len(cost_model_map), 0)

        provider_name = "sample_provider"
        with patch("masu.celery.tasks.check_report_updates"):
            provider = Provider.objects.create(name=provider_name,
                                               created_by=self.user,
                                               customer=self.customer)

        # Get Provider UUID
        provider_uuid = provider.uuid

        # Add provider to existing cost model
        with tenant_context(self.tenant):
            manager = CostModelManager(cost_model_uuid=cost_model_obj.uuid)
            with patch("cost_models.cost_model_manager.chain") as mock_chain:
                manager.update_provider_uuids(provider_uuids=[provider_uuid])
                mock_chain.return_value.apply_async.assert_called()

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertIsNotNone(cost_model_map)
            self.assertEqual(cost_model_map.first().provider_uuid,
                             provider_uuid)
            self.assertEqual(len(cost_model_map), 1)

        # Add provider again to existing cost model.  Verify there is still only 1 item in map
        with tenant_context(self.tenant):
            manager = CostModelManager(cost_model_uuid=cost_model_obj.uuid)
            with patch("cost_models.cost_model_manager.chain") as mock_chain:
                manager.update_provider_uuids(provider_uuids=[provider_uuid])
                mock_chain.return_value.apply_async.assert_called()

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertIsNotNone(cost_model_map)
            self.assertEqual(cost_model_map.first().provider_uuid,
                             provider_uuid)
            self.assertEqual(len(cost_model_map), 1)

        # Remove provider from existing rate
        with tenant_context(self.tenant):
            manager = CostModelManager(cost_model_uuid=cost_model_obj.uuid)
            with patch("cost_models.cost_model_manager.chain") as mock_chain:
                manager.update_provider_uuids(provider_uuids=[])
                mock_chain.return_value.apply_async.assert_called()

            cost_model_map = CostModelMap.objects.filter(
                cost_model=cost_model_obj)
            self.assertEqual(len(cost_model_map), 0)