distil/artifice/models/billing.py

79 lines
2.3 KiB
Python

from . import Tenant as TenantModel
from . import Resource as ResourceModel
import json
class Tenant(object):
"""Billable object representing a tenant,
and all the resources inside it."""
def __init__(self, name, tenant_id):
self.name = name
self.id = tenant_id
self.resources = {}
class Resource(object):
""""""
def __init__(self, metadata, resource_id):
self.metadata = metadata
self.id = resource_id
self.services = {}
class Service(object):
def __init__(self, name, volume):
self.name = name
self.volume = volume
def build_billable(entries, session):
"""Builds a Tenant object and its resources.
Assumes that all entries are for the same tenant."""
tenant = None
for entry in entries:
service = Service(entry.service, entry.volume)
# does this tenant exist yet?
if tenant is None:
# build resource:
info = session.query(ResourceModel.info).\
filter(ResourceModel.id == entry.resource_id)
metadata = json.loads(info[0].info)
resource = Resource(metadata, entry.resource_id)
# add strat to resource:
resource.services[entry.service] = service
# build tenant:
name = session.query(TenantModel.name).\
filter(TenantModel.id == entry.tenant_id)
tenant = Tenant(name[0].name, entry.tenant_id)
# add resource to tenant:
tenant.resources[entry.resource_id] = resource
# tenant exists, but does the resource?
elif (entry.resource_id not in tenant.resources):
# build resource
info = session.query(ResourceModel.info).\
filter(ResourceModel.id == entry.resource_id)
metadata = json.loads(info[0].info)
resource = Resource(metadata, entry.resource_id)
# add strat to resource:
resource.services[entry.service] = service
# add resource to tenant
tenant.resources[entry.resource_id] = resource
# both seem to exist!
else:
resource = tenant.resources[entry.resource_id]
# add strat to resource:
resource.services[entry.service] = service
return tenant