Exemple #1
0
def openstack(**kwargs):
    if settings.OPENSTACK_URL is None:
        return False, 'not configured.', kwargs
    stack = OpenStack(
                settings.OPENSTACK_URL,
                settings.OPENSTACK_USER,
                settings.OPENSTACK_PASS,
            )
    end = kwargs.get('end') or datetime.datetime.today().replace(
                hour=0, minute=0, second=0, microsecond=0)
    start = kwargs.get('start') or end - datetime.timedelta(days=1)
    tenants = collections.defaultdict(dict)
    for data in stack.simple_tenant_usage(start, end):
        tenants[data['tenant_id']].update(data)
    for url, query in getattr(settings, 'OPENSTACK_EXTRA_QUERIES', []):
        for data in stack.query(query, url=url,
                start=start.strftime('%Y-%m-%dT%H:%M:%S'),
                end=end.strftime('%Y-%m-%dT%H:%M:%S'),
            ):
            tenants[data['tenant_id']].update(data)
    for tenant_id, data in tenants.iteritems():
        dev, cost = make_tenant(data)
        dev.historycost_set.filter(start=start).delete()
        margin_in_percent = dev.get_margin() or 0
        total_cost = cost * (1 + margin_in_percent / 100)
        hc = HistoryCost(
            device=dev,
            venture=dev.venture,
            start=start,
            end=end,
            daily_cost=total_cost,
        )
        hc.save()
    return True, 'loaded from %s to %s.' % (start, end), kwargs
Exemple #2
0
def openstack(**kwargs):
    if settings.OPENSTACK_URL is None:
        return False, 'not configured.', kwargs
    tenants = collections.defaultdict(lambda: collections.defaultdict(dict))
    end = kwargs.get('end') or datetime.datetime.today().replace(
        hour=0, minute=0, second=0, microsecond=0)
    start = kwargs.get('start') or end - datetime.timedelta(days=1)
    for region in getattr(settings, 'OPENSTACK_REGIONS', ['']):
        stack = OpenStack(
            settings.OPENSTACK_URL,
            settings.OPENSTACK_USER,
            settings.OPENSTACK_PASS,
            region=region,
        )
        for data in stack.simple_tenant_usage(start, end):
            tenants[data['tenant_id']][region].update(data)
    for url, query in getattr(settings, 'OPENSTACK_EXTRA_QUERIES', []):
        for data in stack.query(
                query,
                url=url,
                start=start.strftime('%Y-%m-%dT%H:%M:%S'),
                end=end.strftime('%Y-%m-%dT%H:%M:%S'),
        ):
            tenants[data['tenant_id']][url].update(data)
    for tenant_id, regions in tenants.iteritems():
        dev = make_tenant(tenant_id)
        dev.historycost_set.filter(start=start).delete()
        margin_in_percent = dev.get_margin() or 0
        total_cost = 0
        for region, data in regions.iteritems():
            cost = make_components(data, dev, region)
            total_cost += cost * (1 + margin_in_percent / 100)
        hc = HistoryCost(
            device=dev,
            venture=dev.venture,
            start=start,
            end=end,
            daily_cost=total_cost,
        )
        hc.save()
    return True, 'loaded from %s to %s.' % (start, end), kwargs
Exemple #3
0
 def handle(self, *args, **options):
     stack = OpenStack(
                 settings.OPENSTACK_URL,
                 settings.OPENSTACK_USER,
                 settings.OPENSTACK_PASS,
             )
     end = datetime.datetime.today().replace(hour=0,minute=0,second=0)
     start = end - datetime.timedelta(days=1)
     print('start=%r, end=%r' % (start, end))
     for tenant in stack.simple_tenant_usage(start, end):
         print('tenant_id=%r' % tenant['tenant_id'])
         dev = Device.create(
                 name='OpenStack',
                 model_name = 'OpenStack Tenant',
                 model_type = DeviceType.cloud_server,
                 sn='openstack-%s' % tenant['tenant_id']
             )
         dev.save()
         total_daily_cost = [0]
         def make_component(name, symbol, key, multiplier, unit):
             if key not in tenant:
                 return
             model, created = ComponentModel.concurrent_get_or_create(
                     type=ComponentType.unknown.id,
                     speed=0, cores=0, size=0, family=symbol, extra_hash=''
                 )
             if created:
                 model.name = name
                 model.save()
             res, created = GenericComponent.concurrent_get_or_create(
                     model=model, device=dev,
                     sn='%s-%s' % (symbol, tenant['tenant_id']))
             if created:
                 res.label = unit
             res.save()
             if model.group and model.group.price:
                 print('name=%r' % name)
                 value = tenant[key] / multiplier
                 print('value=%r' % value)
                 cost = value * model.group.price / 10000
                 print('cost=%r' % cost)
                 total_daily_cost[0] += cost
                 print('total cost=%r' % total_daily_cost[0])
         make_component('OpenStack 10000 Memory GiB Hours', 'openstackmem',
                        'total_memory_mb_usage', 1024, 'Memory')
         make_component('OpenStack 10000 CPU Hours', 'openstackcpu',
                        'total_vcpus_usage', 1, 'CPU')
         make_component('OpenStack 10000 Disk GiB Hours', 'openstackdisk',
                        'total_local_gb_usage', 1, 'Disk')
         make_component('OpenStack 10000 Volume GiB Hours', 'openstackvolume',
                        'total_volume_gb_usage', 1, 'Volume')
         yesterday = datetime.date.today() - datetime.timedelta(days=1)
         today = datetime.date.today()
         dev.historycost_set.filter(start=yesterday).delete()
         hc = HistoryCost(
             device=dev,
             venture=dev.venture,
             start=yesterday,
             end=today,
             daily_cost=total_daily_cost[0],
         )
         hc.save()