/** * Execute the console command. * * @return mixed */ public function fire() { // // $siteCfg = SiteConfig::all()->makeKVArray(); $siteCfg = ['domainId' => SiteConfig::whereParameter('domainId')->first()->data, 'apiKey' => Config::get('cloud.mgmtServer.apiKey'), 'secretKey' => Config::get('cloud.mgmtServer.secretKey'), 'lastBillRecordDate' => SiteConfig::whereParameter('lastBillRecordDate')->first()->data]; // Setup HTTP request for the records $url = SiteConfig::whereParameter('recordsUrl')->first()->data; $client = new Client(['base_uri' => $url]); $data = $client->get("api/getRecords/domainid/{$siteCfg['domainId']}/apiKey/{$siteCfg['apiKey']}/secretKey/{$siteCfg['secretKey']}/lastDate/{$siteCfg['lastBillRecordDate']}"); $records = json_decode($data->getBody()); foreach ($records->instances as $instanceRecord) { $keys = ['zoneId', 'accountId', 'vm_name', 'usage', 'vmInstanceId', 'serviceOfferingId', 'templateId', 'cpuNumber', 'cpuSpeed', 'memory', 'startDate', 'endDate']; $data = []; foreach ($keys as $key) { $data[$key] = $instanceRecord->{$key}; } UsageInstance::create($data); unset($data); } foreach ($records->general as $generalRecord) { $keys = ['zoneId', 'accountId', 'type', 'usage', 'vmInstanceId', 'templateId', 'startDate', 'endDate']; $data = []; foreach ($keys as $key) { $data[$key] = $generalRecord->{$key}; } UsageGeneral::create($data); unset($data); } foreach ($records->disk as $diskRecord) { $keys = ['zoneId', 'accountId', 'volumeId', 'size', 'type', 'tags', 'usage', 'vmInstanceId', 'startDate', 'endDate']; $data = []; foreach ($keys as $key) { $data[$key] = $diskRecord->{$key}; } UsageDisk::create($data); unset($data); } // Set last bill record date to today. // SiteConfig::where('parameter', '=', 'lastBillRecordDate')->update(['data' => date('Y-m-d')]); }
/** * Execute the console command. * * @return mixed */ public function fire() { // Setup lists to look up ACS IDs. // We need: zones, accounts, domains, instances, service offerings and templates. $dataTypes = ['cloud.data_center' => 'zones', 'cloud.domain' => 'domains', 'cloud.account' => 'accounts', 'cloud.vm_instance' => 'instances', 'cloud.service_offering_view' => 'serviceofferings', 'cloud.template_view' => 'templates']; $uuidLookup = []; foreach ($dataTypes as $table => $type) { $dbInfo = DB::table($table)->get(); $uuidLookup[$type] = []; foreach ($dbInfo as $info) { $uuidLookup[$type][$info->id] = $info->uuid; } } $diskInfo = DB::table('cloud.disk_offering')->get(); $diskOfferings = []; foreach ($diskInfo as $do) { $diskOfferings[$do->id] = $do->tags; } // Grab yesterday's records $yesterday = date('Y-m-d', time() - 84600); $records = App\CloudUsage::like('start_date', $yesterday . '%')->billable()->get()->each(function ($record) use($uuidLookup, $diskOfferings) { $recordType = ''; switch ($record->usage_type) { case 2: $recordType = 'VM Instance'; // Grab the service offering of the VM $serviceOffering = App\ServiceOffering::find($record->offering_id); if (null == $serviceOffering->cpu && null == $serviceOffering->speed && null == $serviceOffering->ram_size) { // Our service offering is Custom. Grab its resources from our custom table. $resources = App\VmResources::find($record->vm_instance_id); $cpuNumber = $resources->cpuNumber; $cpuSpeed = $resources->cpuSpeed; $memory = $resources->memory; } else { $cpuNumber = $serviceOffering->cpu; $cpuSpeed = $serviceOffering->speed; $memory = $serviceOffering->ram_size; } App\UsageVm::create(['zoneId' => $uuidLookup['zones'][$record->zone_id], 'accountId' => $uuidLookup['accounts'][$record->account_id], 'domainId' => $uuidLookup['domains'][$record->domain_id], 'vm_name' => $record->vm_name, 'type' => 'VM', 'usage' => $record->raw_usage, 'vmInstanceId' => $uuidLookup['instances'][$record->vm_instance_id], 'serviceOfferingId' => $uuidLookup['serviceofferings'][$record->offering_id], 'templateId' => $uuidLookup['templates'][$record->template_id], 'cpuNumber' => $cpuNumber, 'cpuSpeed' => $cpuSpeed, 'memory' => $memory, 'startDate' => $record->start_date, 'endDate' => $record->end_date]); break; case 4: case 5: $recordType = 'Network Usage'; App\UsageGeneral::create(['zoneId' => $uuidLookup['zones'][$record->zone_id], 'accountId' => $uuidLookup['accounts'][$record->account_id], 'domainId' => $uuidLookup['domains'][$record->domain_id], 'type' => stripos($record->usage_display, 'Received') === false ? 'Network Sent' : 'Network Received', 'usage' => $record->raw_usage, 'startDate' => $record->start_date, 'endDate' => $record->end_date]); break; case 6: $recordType = 'Disk/Volume'; // Fetch the VM instance this volume belongs to. $vol = App\Volume::find($record->usage_id); try { $instance = App\VmInstance::find($vol->instance_id); } catch (\Exception $e) { continue; // Ignored bad record. } if (!$instance instanceof App\VmInstance) { continue; } // Ignore this record, its bad for some reason. App\UsageDisk::create(['zoneId' => $uuidLookup['zones'][$record->zone_id], 'accountId' => $uuidLookup['accounts'][$record->account_id], 'domainId' => $uuidLookup['domains'][$record->domain_id], 'volumeId' => $vol->uuid, 'type' => $vol->volume_type == 'ROOT' ? 'Root Volume' : 'Volume', 'tags' => $diskOfferings[$vol->disk_offering_id], 'usage' => $record->raw_usage, 'size' => $record->size, 'vmInstanceId' => $uuidLookup['instances'][$instance->id], 'startDate' => $record->start_date, 'endDate' => $record->end_date]); break; case 9: $recordType = 'Snapshot'; App\UsageDisk::create(['zoneId' => $uuidLookup['zones'][$record->zone_id], 'accountId' => $uuidLookup['accounts'][$record->account_id], 'domainId' => $uuidLookup['domains'][$record->domain_id], 'type' => 'Snapshot', 'usage' => $record->raw_usage, 'size' => $record->size, 'startDate' => $record->start_date, 'endDate' => $record->end_date]); break; case 11: $recordType = 'Load Balancer'; App\UsageGeneral::create(['zoneId' => $uuidLookup['zones'][$record->zone_id], 'accountId' => $uuidLookup['accounts'][$record->account_id], 'domainId' => $uuidLookup['domains'][$record->domain_id], 'type' => 'LB', 'usage' => $record->raw_usage, 'vmInstanceId' => $uuidLookup['instances'][$record->vm_instance_id], 'templateId' => $uuidLookup['templates'][$record->template_id], 'startDate' => $record->start_date, 'endDate' => $record->end_date]); break; case 12: $recordType = 'Port Forward'; App\UsageGeneral::create(['zoneId' => $uuidLookup['zones'][$record->zone_id], 'accountId' => $uuidLookup['accounts'][$record->account_id], 'domainId' => $uuidLookup['domains'][$record->domain_id], 'type' => 'PF', 'usage' => $record->raw_usage, 'vmInstanceId' => $uuidLookup['instances'][$record->vm_instance_id], 'templateId' => $uuidLookup['templates'][$record->template_id], 'startDate' => $record->start_date, 'endDate' => $record->end_date]); break; case 14: $recordType = 'VPN'; App\UsageGeneral::create(['zoneId' => $uuidLookup['zones'][$record->zone_id], 'accountId' => $uuidLookup['accounts'][$record->account_id], 'domainId' => $uuidLookup['domains'][$record->domain_id], 'type' => 'VPN', 'usage' => $record->raw_usage, 'vmInstanceId' => $uuidLookup['instances'][$record->vm_instance_id], 'templateId' => $uuidLookup['templates'][$record->template_id], 'startDate' => $record->start_date, 'endDate' => $record->end_date]); break; default: $recordType = 'Unknown (' . $record->usage_type . ')'; break; } $this->info('Found a record of type ' . $recordType); }); }