/** * {@inheritdoc} * @see EventObserver::OnHostUp() */ public function OnHostUp(\HostUpEvent $event) { if ($event->DBServer->platform != \SERVER_PLATFORMS::EC2) { return; } // Scalarizr will attach and mount volumes by itself if ($event->DBServer->IsSupported("0.7.36")) { return; } $volumes = $this->DB->GetAll("SELECT volume_id FROM ec2_ebs WHERE farm_roleid=? AND server_index=?", array($event->DBServer->farmRoleId, $event->DBServer->index)); $this->Logger->info(new \FarmLogMessage($this->FarmID, sprintf(_("Found %s volumes for server: %s"), count($volumes), $event->DBServer->serverId))); foreach ($volumes as $volume) { if ($volume['volume_id']) { $this->Logger->info(new \FarmLogMessage($this->FarmID, sprintf(_("Preparing volume #%s for attaching to server: %s."), $volume['volume_id'], $event->DBServer->serverId))); try { $DBEBSVolume = \DBEBSVolume::loadByVolumeId($volume['volume_id']); $DBEBSVolume->serverId = $event->DBServer->serverId; $DBEBSVolume->attachmentStatus = \EC2_EBS_ATTACH_STATUS::ATTACHING; $DBEBSVolume->mountStatus = $DBEBSVolume->mount ? \EC2_EBS_MOUNT_STATUS::AWAITING_ATTACHMENT : \EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $DBEBSVolume->save(); } catch (\Exception $e) { $this->Logger->fatal($e->getMessage()); } } } }
public function xDetachAction() { $this->request->restrictAccess(Acl::RESOURCE_AWS_VOLUMES, Acl::PERM_AWS_VOLUMES_MANAGE); $aws = $this->getEnvironment()->aws($this->getParam('cloudLocation')); $this->request->defineParams(array('cloudLocation', 'volumeId', 'forceDetach')); $isForce = $this->getParam('forceDetach') == 1; //Describes if the volume exists and checks user access permissions $decision = $this->getFilteringDecision(); //We should check permissions to this volume $this->describeVolume($this->getParam('cloudLocation'), $this->getParam('volumeId')); /* @var $att AttachmentSetResponseData */ $att = $aws->ec2->volume->detach($this->getParam('volumeId'), null, null, $isForce); if ($att->volumeId && ($att->status == AttachmentSetResponseData::STATUS_DETACHING || $att->status == AttachmentSetResponseData::STATUS_DETACHED)) { $dbEbsVolume = null; try { $dbEbsVolume = DBEBSVolume::loadByVolumeId($this->getParam('volumeId')); } catch (\Exception $e) { } if (!empty($dbEbsVolume)) { if ($dbEbsVolume->isManual) { $dbEbsVolume->delete(); } else { if (!$dbEbsVolume->isManual) { $dbEbsVolume->attachmentStatus = EC2_EBS_ATTACH_STATUS::AVAILABLE; $dbEbsVolume->mountStatus = EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $dbEbsVolume->serverId = ''; $dbEbsVolume->deviceName = ''; $dbEbsVolume->save(); } } } } $this->response->success('Volume has been successfully detached'); }
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); }
public function xListVolumesAction() { $this->request->defineParams(array('sort' => array('type' => 'json', 'default' => array('property' => 'volumeId', 'direction' => 'DESC')), 'volumeId')); $amazonEC2Client = Scalr_Service_Cloud_Aws::newEc2($this->getParam('cloudLocation'), $this->getEnvironment()->getPlatformConfigValue(Modules_Platforms_Ec2::PRIVATE_KEY), $this->getEnvironment()->getPlatformConfigValue(Modules_Platforms_Ec2::CERTIFICATE)); // Rows $aws_response = $amazonEC2Client->DescribeVolumes(); $rowz = $aws_response->volumeSet->item; if ($rowz instanceof stdClass) { $rowz = array($rowz); } $vols = array(); foreach ($rowz as $pk => $pv) { if ($pv->attachmentSet && $pv->attachmentSet->item) { $pv->attachmentSet = $pv->attachmentSet->item; } if ($this->getParam('volumeId') && $this->getParam('volumeId') != $pv->volumeId) { continue; } $item = array('volumeId' => $pv->volumeId, 'size' => $pv->size, 'snapshotId' => $pv->snapshotId, 'availZone' => $pv->availabilityZone, 'status' => $pv->status, 'attachmentStatus' => $pv->attachmentSet->status, 'device' => $pv->attachmentSet->device, 'instanceId' => $pv->attachmentSet->instanceId); $item['autoSnaps'] = $this->db->GetOne("SELECT id FROM autosnap_settings WHERE objectid=? AND object_type=?", array($pv->volumeId, AUTOSNAPSHOT_TYPE::EBSSnap)) ? true : false; $DBEBSVolume = false; try { $DBEBSVolume = DBEBSVolume::loadByVolumeId($pv->volumeId); //$sort_key = "{$DBEBSVolume->farmId}_{$DBEBSVolume->farmRoleId}_{$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 && $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')); $this->response->data($response); }
public function xDetachAction() { $aws = $this->getEnvironment()->aws($this->getParam('cloudLocation')); $this->request->defineParams(array('cloudLocation', 'volumeId', 'forceDetach')); $isForce = $this->getParam('forceDetach') == 1; /* @var $att AttachmentSetResponseData */ $att = $aws->ec2->volume->detach($this->getParam('volumeId'), null, null, $isForce); if ($att->volumeId && ($att->status == AttachmentSetResponseData::STATUS_DETACHING || $att->status == AttachmentSetResponseData::STATUS_DETACHED)) { $dbEbsVolume = null; try { $dbEbsVolume = DBEBSVolume::loadByVolumeId($this->getParam('volumeId')); } catch (\Exception $e) { } if (!empty($dbEbsVolume)) { if ($dbEbsVolume->isManual) { $dbEbsVolume->delete(); } else { if (!$dbEbsVolume->isManual) { $dbEbsVolume->attachmentStatus = EC2_EBS_ATTACH_STATUS::AVAILABLE; $dbEbsVolume->mountStatus = EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $dbEbsVolume->serverId = ''; $dbEbsVolume->deviceName = ''; $dbEbsVolume->save(); } } } } $this->response->success('Volume has been successfully detached'); }