public function xListVolumesAction() { $aws = $this->getEnvironment()->aws($this->getParam('cloudLocation')); $this->request->defineParams(array('sort' => array('type' => 'json', 'default' => array('property' => 'volumeId', 'direction' => 'DESC')), 'volumeId')); if ($this->getParam('volumeId')) { $filter = array(array('name' => VolumeFilterNameType::volumeId(), 'value' => $this->getParam('volumeId'))); } else { $filter = null; } // Rows $volumeList = $aws->ec2->volume->describe(null, $filter); $vols = array(); /* @var $pv VolumeData */ foreach ($volumeList as $pv) { /* @var $att AttachmentSetResponseData */ if (count($pv->attachmentSet)) { $att = $pv->attachmentSet[0]; } else { $att = null; } $item = array('volumeId' => $pv->volumeId, 'size' => (int) $pv->size, 'snapshotId' => $pv->snapshotId, 'availZone' => $pv->availabilityZone, 'type' => $pv->volumeType, 'status' => $pv->status, 'attachmentStatus' => $att !== null ? $att->status : null, 'device' => $att !== null ? $att->device : null, 'instanceId' => $att !== null ? $att->instanceId : null); $item['autoSnaps'] = $this->db->GetOne("SELECT id FROM autosnap_settings WHERE objectid=? AND object_type=? LIMIT 1", array($pv->volumeId, AUTOSNAPSHOT_TYPE::EBSSnap)) ? true : false; $dbEbsVolume = false; try { $dbEbsVolume = DBEBSVolume::loadByVolumeId($pv->volumeId); $item['farmId'] = $dbEbsVolume->farmId; $item['farmRoleId'] = $dbEbsVolume->farmRoleId; $item['serverIndex'] = $dbEbsVolume->serverIndex; $item['serverId'] = $dbEbsVolume->serverId; $item['mountStatus'] = $dbEbsVolume->mountStatus; $item['farmName'] = DBFarm::LoadByID($dbEbsVolume->farmId)->Name; $item['roleName'] = DBFarmRole::LoadByID($dbEbsVolume->farmRoleId)->GetRoleObject()->name; $item['autoAttach'] = true; } catch (\Exception $e) { } if (!$dbEbsVolume && !empty($item['instanceId'])) { try { $dbServer = DBServer::LoadByPropertyValue(EC2_SERVER_PROPERTIES::INSTANCE_ID, $item['instanceId']); $item['farmId'] = $dbServer->farmId; $item['farmRoleId'] = $dbServer->farmRoleId; $item['serverIndex'] = $dbServer->index; $item['serverId'] = $dbServer->serverId; $item['farmName'] = $dbServer->GetFarmObject()->Name; $item['mountStatus'] = false; $item['roleName'] = $dbServer->GetFarmRoleObject()->GetRoleObject()->name; } catch (\Exception $e) { } } $vols[] = $item; } $response = $this->buildResponseFromData($vols, array('instanceId', 'volumeId', 'snapshotId', 'farmId', 'farmRoleId', 'availZone', 'type')); $this->response->data($response); }
/** * List volumes * * @param string $cloudLocation The location of a cloud * @param string $volumeId optional Volume ID * @param int $farmId optional Farm ID * @param int $farmRoleId optional Role ID tied to the farm */ public function xListVolumesAction($cloudLocation, $volumeId = null, $farmId = null, $farmRoleId = null) { $filter = []; $filterFields = ["instanceId", "volumeId", "snapshotId", "availZone", "type"]; $env = $this->getEnvironment(); $aws = $env->aws($cloudLocation); if (!empty($volumeId)) { $filter = [["name" => VolumeFilterNameType::volumeId(), "value" => $volumeId]]; } $filteringDecision = $this->request->getCloudResourceFilteringDecision(Acl::RESOURCE_AWS_VOLUMES, SERVER_PLATFORMS::EC2, !empty($farmId) ? $farmId : null); if ($filteringDecision->emptySet) { //This user hasn't any managed Farm. We should return empty result set. $response = $this->buildResponseFromData([], $filterFields); return $this->response->data($response); } elseif (!empty($filteringDecision->filter)) { $filter = array_merge($filter, $filteringDecision->filter); } // Rows $startTime = microtime(true); $volumeList = $aws->ec2->volume->describe(null, empty($filter) ? null : $filter); $describeTime = round(microtime(true) - $startTime) * 1000; $startTime = microtime(true); $vols = []; $needFilter = !empty($farmId) || !empty($farmRoleId); foreach ($volumeList as $pv) { /* @var $pv VolumeData */ /* @var $att AttachmentSetResponseData */ $att = count($pv->attachmentSet) ? $pv->attachmentSet[0] : null; $tags = []; $scalrMetaTag = null; foreach ($pv->tagSet as $tag) { /* @var $tag ResourceTagSetData */ $tg = "{$tag->key}"; if ($tag->value) { $tg .= "={$tag->value}"; } if ($tag->key == Scalr_Governance::SCALR_META_TAG_NAME) { $scalrMetaTag = $tag->value; } $tags[] = $tg; } if (!$filteringDecision->matchScalrMetaTag($scalrMetaTag)) { continue; } $item = ["volumeId" => $pv->volumeId, "size" => (int) $pv->size, "snapshotId" => $pv->snapshotId, "availZone" => $pv->availabilityZone, "type" => $pv->volumeType, "status" => $pv->status, "attachmentStatus" => $att !== null ? $att->status : null, "device" => $att !== null ? $att->device : null, "instanceId" => $att !== null ? $att->instanceId : null, "tags" => implode(",", $tags), "encrypted" => $pv->encrypted, "kmsKeyId" => $pv->kmsKeyId]; if (!empty($item["instanceId"])) { try { if (isset($this->listCache["instances"][$item["instanceId"]])) { $dbServer = $this->listCache["instances"][$item["instanceId"]]; } else { $dbServer = DBServer::LoadByPropertyValue(EC2_SERVER_PROPERTIES::INSTANCE_ID, $item["instanceId"]); $this->listCache["instances"][$item["instanceId"]] = $dbServer; } if ($dbServer) { $item["farmId"] = $dbServer->farmId; $item["farmRoleId"] = $dbServer->farmRoleId; $item["serverIndex"] = $dbServer->index; $item["serverId"] = $dbServer->serverId; $item["mountStatus"] = false; if (isset($this->listCache["farms"][$item["farmId"]])) { $item["farmName"] = $this->listCache["farms"][$item["farmId"]]; } else { $item["farmName"] = $dbServer->GetFarmObject()->Name; $this->listCache["farms"][$item["farmId"]] = $item["farmName"]; } if (isset($this->listCache["farmRoles"][$item["farmRoleId"]])) { $item["roleName"] = $this->listCache["farmRoles"][$item["farmRoleId"]]; } else { $item["roleName"] = $dbServer->GetFarmRoleObject()->GetRoleObject()->name; $this->listCache["farmRoles"][$item["farmRoleId"]] = $item["roleName"]; } /* Waiting for bugfix on scalarizr side if ($dbServer->IsSupported("2.5.4")) { $item["mounts"] = $dbServer->scalarizr->system->mounts(); } */ } } catch (\Exception $e) { } } if ($needFilter === true) { foreach (["farmId", "farmRoleId"] as $var) { if (!empty(${$var}) && (!isset($item[$var]) || $item[$var] != ${$var})) { continue 2; } } } $vols[] = $item; } $volumesTime = round(microtime(true) - $startTime) * 1000; $startTime = microtime(true); $response = $this->buildResponseFromData($vols, $filterFields); foreach ($response["data"] as &$item) { $item["autoSnaps"] = (bool) $this->db->GetOne("SELECT id FROM autosnap_settings WHERE objectid=? AND object_type=? LIMIT 1", [$item["volumeId"], \AUTOSNAPSHOT_TYPE::EBSSnap]); } $responseTime = round(microtime(true) - $startTime) * 1000; $response["performanceMeasurements"] = ["describe" => $describeTime, "volumes" => $volumesTime, "response" => $responseTime]; $this->response->data($response); }
public function xListVolumesAction() { $aws = $this->getEnvironment()->aws($this->getParam('cloudLocation')); $this->request->defineParams(array('sort' => array('type' => 'json', 'default' => array('property' => 'volumeId', 'direction' => 'DESC')), 'volumeId')); if ($this->getParam('volumeId')) { $filter = array(array('name' => VolumeFilterNameType::volumeId(), 'value' => $this->getParam('volumeId'))); } else { $filter = null; } // Rows $volumeList = $aws->ec2->volume->describe(null, $filter); $vols = array(); /* @var $pv VolumeData */ foreach ($volumeList as $pv) { /* @var $att AttachmentSetResponseData */ if (count($pv->attachmentSet)) { $att = $pv->attachmentSet[0]; } else { $att = null; } $tags = array(); foreach ($pv->tagSet as $tag) { /* @var $tag ResourceTagSetData */ $tg = "{$tag->key}"; if ($tag->value) { $tg .= "={$tag->value}"; } $tags[] = $tg; } $item = array('volumeId' => $pv->volumeId, 'size' => (int) $pv->size, 'snapshotId' => $pv->snapshotId, 'availZone' => $pv->availabilityZone, 'type' => $pv->volumeType, 'status' => $pv->status, 'attachmentStatus' => $att !== null ? $att->status : null, 'device' => $att !== null ? $att->device : null, 'instanceId' => $att !== null ? $att->instanceId : null, 'tags' => implode(',', $tags)); $item['autoSnaps'] = $this->db->GetOne("SELECT id FROM autosnap_settings WHERE objectid=? AND object_type=? LIMIT 1", array($pv->volumeId, AUTOSNAPSHOT_TYPE::EBSSnap)) ? true : false; if (!empty($item['instanceId'])) { try { $dbServer = DBServer::LoadByPropertyValue(EC2_SERVER_PROPERTIES::INSTANCE_ID, $item['instanceId']); if ($dbServer) { $item['farmId'] = $dbServer->farmId; $item['farmRoleId'] = $dbServer->farmRoleId; $item['serverIndex'] = $dbServer->index; $item['serverId'] = $dbServer->serverId; $item['farmName'] = $dbServer->GetFarmObject()->Name; $item['mountStatus'] = false; $item['roleName'] = $dbServer->GetFarmRoleObject()->GetRoleObject()->name; /* Waiting for bugfix on scalarizr side if ($dbServer->IsSupported('2.5.4')) { $item['mounts'] = $dbServer->scalarizr->system->mounts(); } */ } } catch (\Exception $e) { } } $vols[] = $item; } $response = $this->buildResponseFromData($vols, array('instanceId', 'volumeId', 'snapshotId', 'farmId', 'farmRoleId', 'availZone', 'type')); $this->response->data($response); }