Exemplo n.º 1
0
 /**
  * {@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());
             }
         }
     }
 }
Exemplo n.º 2
0
 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');
 }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
 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');
 }