def test_removing_tenant(self): """Remove the tenant object for a customer.""" # Create customer. customer_name = 'test_customer_tenant' customer_json = {'name': customer_name, 'owner': self.gen_user_data()} customer = None serializer = CustomerSerializer(data=customer_json) if serializer.is_valid(raise_exception=True): customer = serializer.save() customer_uuid = customer.uuid # Create tenant customer_obj = Customer.objects.filter(name=customer_name).get() tenant = Tenant(schema_name=customer_obj.schema_name) tenant.save() # Get manager manager = CustomerManager(customer_uuid) customer_obj = manager.get_model() customer_schema_name = customer_obj.schema_name # Verify tenant is returned from manager tenant_obj = Tenant.objects.filter(schema_name=customer_schema_name).get() self.assertEqual(manager.get_tenant(), tenant_obj) # Attempt to remove as customer owner with self.assertRaises(CustomerManagerPermissionError): manager.remove_tenant(customer_obj.owner) # Attempt to remove tenant as super user superuser = User.objects.filter(is_superuser=True).first() manager.remove_tenant(superuser)
def _create_customer(account): """Create a customer. Args: account (str): The account identifier Returns: (Customer) The created customer """ try: with transaction.atomic(): schema_name = create_schema_name(account) customer = Customer(account_id=account, schema_name=schema_name) customer.save() tenant = Tenant(schema_name=schema_name) tenant.save() unique_account_counter.inc() logger.info('Created new customer from account_id %s.', account) except IntegrityError: customer = Customer.objects.filter(account_id=account).get() return customer
def test_get_tenant(self): """Get the tenant object for a customer.""" # Create customer. customer_name = 'test_customer_tenant' customer_json = {'name': customer_name, 'owner': self.gen_user_data()} customer = None serializer = CustomerSerializer(data=customer_json) if serializer.is_valid(raise_exception=True): customer = serializer.save() customer_uuid = customer.uuid # Create tenant customer_obj = Customer.objects.filter(name=customer_name).get() tenant = Tenant(schema_name=customer_obj.schema_name) tenant.save() # Get manager manager = CustomerManager(customer_uuid) customer_obj = manager.get_model() customer_schema_name = customer_obj.schema_name # Verify tenant is returned from manager tenant_obj = Tenant.objects.filter(schema_name=customer_schema_name).get() self.assertEqual(manager.get_tenant(), tenant_obj)
def test_cascade_delete_immediate_constraint(self): """Test that cascade_delete can set constraints to execute immediately""" action_ts = datetime.now().replace(tzinfo=UTC) # Add a bogus customer c = Customer( date_created=action_ts, date_updated=action_ts, uuid=uuid.uuid4(), account_id="918273", schema_name="acct918273", ) c.save() # Create a customer tenant t = Tenant(schema_name=c.schema_name) t.save() t.create_schema() # Add some bogus providers paws = Provider( uuid=uuid.uuid4(), name="eek_aws_provider_4", type=Provider.PROVIDER_AWS, setup_complete=False, active=True, customer=c, ) paws.save() # Create billing period stuff for each provider period_start = datetime(2020, 1, 1, tzinfo=UTC) period_end = datetime(2020, 2, 1, tzinfo=UTC) awsceb = AWSCostEntryBill( billing_resource="6846351687354184651", billing_period_start=period_start, billing_period_end=period_end, provider=paws, ) with schema_context(c.schema_name): awsceb.save() expected = "DEBUG:koku.database:Setting constaints to execute immediately" with self.assertLogs("koku.database", level="DEBUG") as _logger: paws.delete() self.assertIn(expected, _logger.output) with schema_context(c.schema_name): self.assertEqual( AWSCostEntryBill.objects.filter(pk=awsceb.pk).count(), 0) self.assertEqual(Provider.objects.filter(pk=paws.pk).count(), 0)
def test_cascade_delete_with_skip(self): """Test that cascade_delete can walk relations abd skip specified relations""" action_ts = datetime.now().replace(tzinfo=UTC) # Add a bogus customer c = Customer( date_created=action_ts, date_updated=action_ts, uuid=uuid.uuid4(), account_id="68461385", schema_name="acct68461385", ) c.save() # Create a customer tenant t = Tenant(schema_name=c.schema_name) t.save() t.create_schema() # Add some bogus providers pocp = Provider( uuid=uuid.uuid4(), name="eek_ocp_provider_30", type=Provider.PROVIDER_OCP, setup_complete=False, active=True, customer=c, ) pocp.save() expected1 = "DEBUG:koku.database:Level 1: delete records from OCPUsageReportPeriod" expected2 = "DEBUG:koku.database:SKIPPING RELATION OCPUsageLineItemDailySummary by directive" expected3 = "DEBUG:koku.database:SKIPPING RELATION OCPUsageLineItem by directive" skip_models = [ kdb.get_model("OCPUsageLineItemDailySummary"), kdb.get_model("OCPUsageLineItem") ] query = Provider.objects.filter(pk=pocp.pk) with self.assertLogs("koku.database", level="DEBUG") as _logger: with schema_context(c.schema_name): kdb.cascade_delete(Provider, query, skip_relations=skip_models) self.assertIn(expected1, _logger.output) self.assertIn(expected2, _logger.output) self.assertIn(expected3, _logger.output) with schema_context(c.schema_name): self.assertEqual( OCPUsageReportPeriod.objects.filter(pk=pocp.pk).count(), 0) self.assertEqual(Provider.objects.filter(pk=pocp.pk).count(), 0)
def _create_customer(account): """Create a customer. Args: account (str): The account identifier Returns: (Customer) The created customer """ schema_name = create_schema_name(account) customer = Customer(account_id=account, schema_name=schema_name) customer.save() tenant = Tenant(schema_name=schema_name) tenant.save() unique_account_counter.inc() logger.info('Created new customer from account_id %s.', account) return customer
def create_customer(account): """Create a customer. Args: account (str): The account identifier Returns: (Customer) The created customer """ try: with transaction.atomic(): schema_name = create_schema_name(account) customer = Customer(account_id=account, schema_name=schema_name) customer.save() tenant = Tenant(schema_name=schema_name) tenant.save() UNIQUE_ACCOUNT_COUNTER.inc() LOG.info("Created new customer from account_id %s.", account) except IntegrityError: customer = Customer.objects.filter(account_id=account).get() return customer
def test_cascade_delete(self): """Test that cascade_delete can walk relations to delete FK constraint matched records""" action_ts = datetime.now().replace(tzinfo=UTC) # Add a bogus customer c = Customer( date_created=action_ts, date_updated=action_ts, uuid=uuid.uuid4(), account_id="918273", schema_name="acct918273", ) c.save() # Create a customer tenant t = Tenant(schema_name=c.schema_name) t.save() t.create_schema() # Add some bogus providers paws = Provider( uuid=uuid.uuid4(), name="eek_aws_provider_3", type=Provider.PROVIDER_AWS, setup_complete=False, active=True, customer=c, ) paws.save() pazure = Provider( uuid=uuid.uuid4(), name="eek_azure_provider_3", type=Provider.PROVIDER_AZURE, setup_complete=False, active=True, customer=c, ) pazure.save() pgcp = Provider( uuid=uuid.uuid4(), name="eek_gcp_provider_3", type=Provider.PROVIDER_GCP, setup_complete=False, active=True, customer=c, ) pgcp.save() pocp = Provider( uuid=uuid.uuid4(), name="eek_ocp_provider_3", type=Provider.PROVIDER_OCP, setup_complete=False, active=True, customer=c, ) pocp.save() # Create billing period stuff for each provider period_start = datetime(2020, 1, 1, tzinfo=UTC) period_end = datetime(2020, 2, 1, tzinfo=UTC) awsceb = AWSCostEntryBill( billing_resource="6846351687354184651", billing_period_start=period_start, billing_period_end=period_end, provider=paws, ) azureceb = AzureCostEntryBill( billing_period_start=period_start, billing_period_end=period_end, provider=pazure ) gcpceb = GCPCostEntryBill(billing_period_start=period_start, billing_period_end=period_end, provider=pgcp) ocpurp = OCPUsageReportPeriod( cluster_id="584634154687685", report_period_start=period_start, report_period_end=period_end, provider=pocp ) with schema_context(c.schema_name): awsceb.save() azureceb.save() gcpceb.save() ocpurp.save() expected = "INFO:koku.database:Level 1: delete records from AWSCostEntryBill" with self.assertLogs("koku.database", level="INFO") as _logger: paws.delete() self.assertIn(expected, _logger.output) expected = "INFO:koku.database:Level 1: delete records from AzureCostEntryBill" with self.assertLogs("koku.database", level="INFO") as _logger: pazure.delete() self.assertIn(expected, _logger.output) expected = "INFO:koku.database:Level 1: delete records from GCPCostEntryBill" with self.assertLogs("koku.database", level="INFO") as _logger: pgcp.delete() self.assertIn(expected, _logger.output) expected = "INFO:koku.database:Level 1: delete records from OCPUsageReportPeriod" with self.assertLogs("koku.database", level="INFO") as _logger: pocp.delete() self.assertIn(expected, _logger.output) with schema_context(c.schema_name): self.assertEqual(AWSCostEntryBill.objects.filter(pk=awsceb.pk).count(), 0) self.assertEqual(AzureCostEntryBill.objects.filter(pk=azureceb.pk).count(), 0) self.assertEqual(GCPCostEntryBill.objects.filter(pk=gcpceb.pk).count(), 0) self.assertEqual(OCPUsageReportPeriod.objects.filter(pk=ocpurp.pk).count(), 0) self.assertEqual(Provider.objects.filter(pk__in=(paws.pk, pazure.pk, pgcp.pk, pocp.pk)).count(), 0)
def test_cascade_delete_skip(self): """Test that cascade_delete can skip relations""" action_ts = datetime.now().replace(tzinfo=UTC) # Add a bogus customer c = Customer( date_created=action_ts, date_updated=action_ts, uuid=uuid.uuid4(), account_id="918273", schema_name="acct918273", ) c.save() # Create a customer tenant t = Tenant(schema_name=c.schema_name) t.save() t.create_schema() # Add some bogus providers paws = Provider( uuid=uuid.uuid4(), name="eek_aws_provider_4", type=Provider.PROVIDER_AWS, setup_complete=False, active=True, customer=c, ) paws.save() # Create billing period stuff for each provider period_start = datetime(2020, 1, 1, tzinfo=UTC) period_end = datetime(2020, 2, 1, tzinfo=UTC) AWSCostEntry = kdb.get_model("AWSCostEntry") AWSCostEntryLineItem = kdb.get_model("AWSCostEntryLineItem") with schema_context(c.schema_name): awsceb = AWSCostEntryBill( billing_resource="6846351687354184651", billing_period_start=period_start, billing_period_end=period_end, provider=paws, ) awsceb.save() awsce = AWSCostEntry(interval_start=period_start, interval_end=period_end, bill=awsceb) awsce.save() awsceli = AWSCostEntryLineItem( line_item_type="test", usage_account_id="test", usage_start=period_start, usage_end=period_start, product_code="test", currency_code="USD", cost_entry=awsce, cost_entry_bill=awsceb, ) awsceli.save() expected = "DEBUG:koku.database:SKIPPING RELATION AWSCostEntryLineItem by directive" expected2 = "DEBUG:koku.database:SKIPPING RELATION GCPCostEntryLineItem by directive" expected3 = "DEBUG:koku.database:SKIPPING RELATION OCPUsageLineItem by directive" expected4 = "DEBUG:koku.database:SKIPPING RELATION OCPStorageLineItem by directive" expected5 = "DEBUG:koku.database:SKIPPING RELATION OCPNodeLabelLineItem by directive" with self.assertLogs("koku.database", level="DEBUG") as _logger: paws.delete() self.assertIn(expected, _logger.output) self.assertIn(expected2, _logger.output) self.assertIn(expected3, _logger.output) self.assertIn(expected4, _logger.output) self.assertIn(expected5, _logger.output) with schema_context(c.schema_name): self.assertEqual( AWSCostEntryBill.objects.filter(pk=awsceb.pk).count(), 0) self.assertEqual( AWSCostEntry.objects.filter(pk=awsce.pk).count(), 0) self.assertNotEqual( AWSCostEntryLineItem.objects.filter(pk=awsceli.pk).count(), 0) self.assertEqual(Provider.objects.filter(pk=paws.pk).count(), 0)