5 2) Create sliver1 on slice1
18 HOUR_SECONDS = MINUTE_SECONDS * 60
19 DAY_SECONDS = HOUR_SECONDS * 24
20 MONTH_SECONDS = DAY_SECONDS * 30
23 sys.path.append("/opt/planetstack")
24 #sys.path.append("/home/smbaker/projects/vicci/plstackapi/planetstack")
26 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
27 #from openstack.manager import OpenStackManager
28 from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice
29 from core.models import Invoice, Charge, Account, UsableObject, Payment
31 def delete_all(model):
32 for item in model.objects.all():
35 def get_usable_object(name):
36 objs = UsableObject.objects.filter(name=name)
39 obj = UsableObject(name=name)
43 def generate_invoice(account, batch):
44 invoice = Invoice(date=batch[-1].date, account=account)
47 charge.invoice = invoice
48 charge.state = "invoiced"
51 def generate_invoices(account):
52 invoices = sorted(Invoice.objects.filter(account=account), key=operator.attrgetter('date'))
53 charges = sorted(Charge.objects.filter(account=account, state="pending"), key=operator.attrgetter('date'))
56 latest_invoice_date = invoices[-1].date()
58 latest_invoice_date = None
62 for charge in charges:
63 # check to see if we crossed a week boundary. If we did, then generate
64 # an invoice for the last week's batch of charges
65 week = charge.date.isocalendar()[1]
66 if (week != last_week) and (batch):
67 generate_invoice(account, batch)
72 # we might still have last week's data batched up, and no data for this week
73 # if so, invoice the batch
74 this_week = datetime.datetime.now().isocalendar()[1]
75 if (this_week != last_week) and (batch):
76 generate_invoice(account, batch)
78 def generate_payments(account):
79 invoices = Invoice.objects.filter(account=account)
80 for invoice in invoices:
81 # let's be optomistic and assume everyone pays exactly two weeks after
82 # receiving an invoice
83 payment_time = int(invoice.date.strftime("%s")) + 14 * DAY_SECONDS
84 if payment_time < time.time():
85 payment_time = datetime.datetime.utcfromtimestamp(payment_time).replace(tzinfo=pytz.utc)
86 payment = Payment(account=account, amount=invoice.amount, date=payment_time)
93 delete_all(UsableObject)
95 for site in Site.objects.all():
96 # only create accounts for sites where some slices exist
97 if len(site.slices.all()) > 0:
98 account = Account(site=site)
101 for slice in Slice.objects.all():
103 account = site.accounts.all()[0]
104 serviceClass =slice.serviceClass
106 if not (slice.name in ["DnsRedir", "DnsDemux", "HyperCache"]):
109 now = int(time.time())/HOUR_SECONDS*HOUR_SECONDS
112 for resource in slice.serviceClass.resources.all():
113 if resource.name == "cpu.cores":
114 charge_kind = "reservation"
116 elif (resource.name == "cycles") or (resource.name == "Cycles"):
117 charge_kind = "besteffort"
121 print "failed to find resource for", slice.serviceClass
124 for sliver in slice.slivers.all():
125 hostname = sliver.node.name
126 for i in range(now-MONTH_SECONDS, now, HOUR_SECONDS):
127 if charge_kind == "besteffort":
128 core_hours = random.randint(1,60)/100.0
132 amount = core_hours * cost
134 object = get_usable_object(hostname)
136 date = datetime.datetime.utcfromtimestamp(i).replace(tzinfo=pytz.utc)
138 charge = Charge(account=account, slice=slice, kind=charge_kind, state="pending", date=date, object=object, coreHours=core_hours, amount=amount)
141 for account in Account.objects.all():
142 generate_invoices(account)
143 generate_payments(account)