From 3ebc518e1fa8e3149132764d0aaeced5fd1d8c23 Mon Sep 17 00:00:00 2001 From: Hostea dashboard Date: Sun, 4 Sep 2022 14:31:28 +0530 Subject: [PATCH] fix: don't send emails to VMs that were requested but not created SUMMARY dash.models.Instance is created upon request and infrastructure.models.InstanceCreated when the instance is created. Using data from InstanceCreated to send invoices should solve this issue. --- .../management/commands/generate_invoice.py | 13 ++++--- billing/tests.py | 38 +++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/billing/management/commands/generate_invoice.py b/billing/management/commands/generate_invoice.py index 76983e4..a8b1ca8 100644 --- a/billing/management/commands/generate_invoice.py +++ b/billing/management/commands/generate_invoice.py @@ -22,6 +22,7 @@ from oauth2_provider.generators import generate_client_id, generate_client_secre from accounts.utils import gen_secret from dash.models import Instance +from infrastructure.models import InstanceCreated from billing.utils import generate_invoice, payment_fullfilled Application = get_application_model() @@ -33,10 +34,12 @@ class Command(BaseCommand): def handle(self, *args, **options): instances = Instance.objects.all() if instances: - for instance in Instance.objects.all(): - self.stdout.write(f"Found instance: {instance}") - if not payment_fullfilled(instance=instance): - self.stdout.write(f"Payment not fulfilled for instance: {instance}") - payment = generate_invoice(instance=instance) + for paid_instance in InstanceCreated.objects.all(): + self.stdout.write(f"Found instance: {paid_instance.instance}") + if not payment_fullfilled(instance=paid_instance.instance): + self.stdout.write( + f"Payment not fulfilled for instance: {paid_instance.instance}" + ) + payment = generate_invoice(instance=paid_instance.instance) else: self.stdout.write("No instances available") diff --git a/billing/tests.py b/billing/tests.py index 2499571..b165506 100644 --- a/billing/tests.py +++ b/billing/tests.py @@ -148,6 +148,44 @@ class GenerateInvoiceCommand(TestCase): register_util(t=self, username=self.username) create_configurations(t=self) + @override_settings( + HOSTEA=infra_custom_config( + test_name="test_dont_send_invoices_to_not_created_vms" + ) + ) + def test_dont_send_invoices_to_not_created_vms(self): + + c = Client() + login_util(self, c, "accounts.home") + + instance_name = "tnoinvonocrevm" + + payload = {"name": instance_name, "configuration": self.instance_config[0].name} + + resp = c.post(reverse("dash.instances.new"), payload) + self.assertEqual(resp.status_code, 302) + self.assertEqual( + resp.headers["location"], + reverse("billing.invoice.generate", args=(instance_name,)), + ) + + stdout = StringIO() + stderr = StringIO() + + instance = Instance.objects.get(name=instance_name) + self.assertEqual(payment_fullfilled(instance=instance), False) + prev_len = len(mail.outbox) + + # username exists + call_command( + "generate_invoice", + stdout=stdout, + stderr=stderr, + ) + out = stdout.getvalue() + print(out) + self.assertEqual(instance_name not in out, True) + @override_settings( HOSTEA=infra_custom_config(test_name="test_generate_invoice_cmd") )