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)
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
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)
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)
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
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(), )
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()
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)
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)