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
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
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()