public static function farmUpdateRoleSettings(DBFarmRole $DBFarmRole, $oldSettings, $newSettings) { $db = \Scalr::getDb(); if (!$newSettings[DBFarmRole::SETTING_AWS_USE_EBS] && $oldSettings[DBFarmRole::SETTING_AWS_USE_EBS]) { $db->Execute("DELETE FROM ec2_ebs WHERE farm_roleid = ? AND ismanual='0'", array($DBFarmRole->ID)); //TODO: Remove Volume? } $DBFarm = $DBFarmRole->GetFarmObject(); if ($newSettings[DBFarmRole::SETTING_AWS_USE_EBS] && !$oldSettings[DBFarmRole::SETTING_AWS_USE_EBS]) { $servers = $DBFarmRole->GetServersByFilter(array('status' => array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING))); foreach ($servers as $DBServer) { if (!$db->GetRow("SELECT id FROM ec2_ebs WHERE server_id=? AND ismanual='0' LIMIT 1", array($DBServer->serverId))) { if (in_array($DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_TYPE), array('standard', 'io1'))) { $type = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_TYPE); } else { $type = 'standard'; } $DBEBSVolume = new DBEBSVolume(); $DBEBSVolume->attachmentStatus = EC2_EBS_ATTACH_STATUS::CREATING; $DBEBSVolume->isManual = false; $DBEBSVolume->ec2AvailZone = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_AVAIL_ZONE); $DBEBSVolume->ec2Region = $DBFarmRole->CloudLocation; $DBEBSVolume->farmId = $DBFarmRole->FarmID; $DBEBSVolume->farmRoleId = $DBFarmRole->ID; $DBEBSVolume->serverId = $DBServer->serverId; $DBEBSVolume->serverIndex = $DBServer->index; $DBEBSVolume->type = $type; $DBEBSVolume->iops = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_IOPS); $DBEBSVolume->size = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_SIZE); $DBEBSVolume->snapId = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_SNAPID); $DBEBSVolume->mount = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_MOUNT); $DBEBSVolume->mountPoint = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_MOUNTPOINT); $DBEBSVolume->mountStatus = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_MOUNT) ? EC2_EBS_MOUNT_STATUS::AWAITING_ATTACHMENT : EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $DBEBSVolume->clientId = $DBFarm->ClientID; $DBEBSVolume->envId = $DBFarm->EnvID; $DBEBSVolume->Save(); } } if ($newSettings[DBFarmRole::SETTING_AWS_EBS_MOUNTPOINT] != $oldSettings[DBFarmRole::SETTING_AWS_EBS_MOUNTPOINT]) { $db->Execute("UPDATE ec2_ebs SET mountpoint=? WHERE farm_roleid=? AND ismanual='0'", array($DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_MOUNTPOINT), $DBFarmRole->ID)); } } }
public function xAttachAction() { $this->request->defineParams(array('cloudLocation', 'serverId', 'volumeId', 'mount', 'mountPoint')); try { $dBEbsVolume = DBEBSVolume::loadByVolumeId($this->getParam('volumeId')); if ($DBEBSVolume->isManual == 0) { $errmsg = sprintf(_("This volume was automatically created for role '%s' on farm '%s' and cannot be re-attahced manually."), $this->db->GetOne("SELECT name FROM roles INNER JOIN farm_roles ON farm_roles.role_id = roles.id WHERE farm_roles.id=?", array($dBEbsVolume->farmRoleId)), $this->db->GetOne("SELECT name FROM farms WHERE id=?", array($dBEbsVolume->farmId))); } } catch (Exception $e) { } if ($errmsg) { throw new Exception($errmsg); } $amazonEC2Client = Scalr_Service_Cloud_Aws::newEc2($this->getParam('cloudLocation'), $this->getEnvironment()->getPlatformConfigValue(Modules_Platforms_Ec2::PRIVATE_KEY), $this->getEnvironment()->getPlatformConfigValue(Modules_Platforms_Ec2::CERTIFICATE)); $r = $amazonEC2Client->DescribeVolumes($this->getParam('volumeId')); $info = $r->volumeSet->item; $dBServer = DBServer::LoadByID($this->getParam('serverId')); $attachVolumeType = new AttachVolumeType($this->getParam('volumeId'), $dBServer->GetProperty(EC2_SERVER_PROPERTIES::INSTANCE_ID), $dBServer->GetFreeDeviceName()); $res = $amazonEC2Client->AttachVolume($attachVolumeType); if ($this->getParam('attachOnBoot') == 'on') { $dBEbsVolume = new DBEBSVolume(); $dBEbsVolume->attachmentStatus = EC2_EBS_ATTACH_STATUS::ATTACHING; $dBEbsVolume->isManual = true; $dBEbsVolume->volumeId = $this->getParam('volumeId'); $dBEbsVolume->ec2AvailZone = $info->availabilityZone; $dBEbsVolume->ec2Region = $this->getParam('cloudLocation'); $dBEbsVolume->deviceName = $attachVolumeType->device; $dBEbsVolume->farmId = $dBServer->farmId; $dBEbsVolume->farmRoleId = $dBServer->farmRoleId; $dBEbsVolume->serverId = $dBServer->serverId; $dBEbsVolume->serverIndex = $dBServer->index; $dBEbsVolume->size = $info->size; $dBEbsVolume->snapId = $info->snapshotId; $dBEbsVolume->mount = $this->getParam('mount') == 1 ? true : false; $dBEbsVolume->mountPoint = $this->getParam('mountPoint'); $dBEbsVolume->mountStatus = $this->getParam('mount') == 1 ? EC2_EBS_MOUNT_STATUS::AWAITING_ATTACHMENT : EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $dBEbsVolume->clientId = $this->user->getAccountId(); $dBEbsVolume->envId = $this->getEnvironmentId(); $dBEbsVolume->Save(); } $this->response->success('EBS volume successfully attached'); }
/** * {@inheritdoc} * @see EventObserver::OnHostInit() */ public function OnHostInit(\HostInitEvent $event) { if ($event->DBServer->platform != \SERVER_PLATFORMS::EC2) { return; } $DBFarmRole = $event->DBServer->GetFarmRoleObject(); if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_USE_EBS)) { if (!$this->DB->GetOne("\n SELECT id FROM ec2_ebs\n WHERE farm_roleid=? AND server_index=? AND ismanual='0'\n LIMIT 1\n ", array($event->DBServer->farmRoleId, $event->DBServer->index))) { if (in_array($DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_TYPE), array('standard', 'io1', 'gp2'))) { $type = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_TYPE); } else { $type = 'standard'; } $DBEBSVolume = new \DBEBSVolume(); $DBEBSVolume->attachmentStatus = \EC2_EBS_ATTACH_STATUS::CREATING; $DBEBSVolume->isManual = 0; $DBEBSVolume->ec2AvailZone = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_AVAIL_ZONE); $DBEBSVolume->ec2Region = $event->DBServer->GetProperty(\EC2_SERVER_PROPERTIES::REGION); $DBEBSVolume->farmId = $DBFarmRole->FarmID; $DBEBSVolume->farmRoleId = $DBFarmRole->ID; $DBEBSVolume->serverId = $event->DBServer->serverId; $DBEBSVolume->serverIndex = $event->DBServer->index; $DBEBSVolume->size = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_SIZE); $DBEBSVolume->type = $type; $DBEBSVolume->iops = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_IOPS); $DBEBSVolume->snapId = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_SNAPID); $DBEBSVolume->isFsExists = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_SNAPID) ? 1 : 0; $DBEBSVolume->mount = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_MOUNT); $DBEBSVolume->mountPoint = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_MOUNTPOINT); $DBEBSVolume->mountStatus = $DBFarmRole->GetSetting(DBFarmRole::SETTING_AWS_EBS_MOUNT) ? \EC2_EBS_MOUNT_STATUS::AWAITING_ATTACHMENT : \EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $DBEBSVolume->clientId = $event->DBServer->GetFarmObject()->ClientID; $DBEBSVolume->envId = $event->DBServer->envId; $DBEBSVolume->Save(); } } }
/** * Attaches volume to server * * It uses request params and can't be used without UI request * * @param VolumeData $info AWS EBS Volume info * @throws Exception */ protected function attachVolumeToServer(VolumeData $info) { $dBServer = DBServer::LoadByID($this->getParam('serverId')); //Check access permission to specified server $this->request->checkPermissions($dBServer->GetFarmObject()->__getNewFarmObject(), Acl::PERM_FARMS_SERVERS); $errmsg = null; try { $dbEbsVolume = DBEBSVolume::loadByVolumeId($this->getParam('volumeId')); if ($dbEbsVolume->isManual == 0) { $errmsg = sprintf(_("This volume was automatically created for role '%s' on farm '%s' and cannot be re-attahced manually."), $this->db->GetOne("\n SELECT name FROM roles\n JOIN farm_roles ON farm_roles.role_id = roles.id\n WHERE farm_roles.id=?\n LIMIT 1\n ", array($dbEbsVolume->farmRoleId)), $this->db->GetOne("SELECT name FROM farms WHERE id=? LIMIT 1", array($dbEbsVolume->farmId))); } } catch (Exception $e) { } if (!empty($errmsg)) { throw new Exception($errmsg); } $image = Image::findOne([['platform' => $dBServer->platform], ['id' => $dBServer->imageId], ['cloudLocation' => $dBServer->GetCloudLocation()]]); $device = $dBServer->GetFreeDeviceName($image->isEc2HvmImage()); $res = $info->attach($dBServer->GetProperty(EC2_SERVER_PROPERTIES::INSTANCE_ID), $device); if ($this->getParam('attachOnBoot') == 'on') { $dbEbsVolume = new DBEBSVolume(); $dbEbsVolume->attachmentStatus = EC2_EBS_ATTACH_STATUS::ATTACHING; $dbEbsVolume->isManual = true; $dbEbsVolume->volumeId = $info->volumeId; $dbEbsVolume->ec2AvailZone = $info->availabilityZone; $dbEbsVolume->ec2Region = $this->getParam('cloudLocation'); $dbEbsVolume->deviceName = $device; $dbEbsVolume->farmId = $dBServer->farmId; $dbEbsVolume->farmRoleId = $dBServer->farmRoleId; $dbEbsVolume->serverId = $dBServer->serverId; $dbEbsVolume->serverIndex = $dBServer->index; $dbEbsVolume->size = $info->size; $dbEbsVolume->snapId = $info->snapshotId; $dbEbsVolume->mount = $this->getParam('mount') == 1; $dbEbsVolume->mountPoint = $this->getParam('mountPoint'); $dbEbsVolume->mountStatus = $this->getParam('mount') == 1 ? EC2_EBS_MOUNT_STATUS::AWAITING_ATTACHMENT : EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $dbEbsVolume->clientId = $this->user->getAccountId(); $dbEbsVolume->envId = $this->getEnvironmentId(); $dbEbsVolume->Save(); } //Updates/Creates AWS Tags of Volume $tags = []; foreach ($dBServer->getAwsTags() as $k => $v) { $tags[] = ['key' => $k, 'value' => $v]; } if (!empty($tags)) { $info->createTags($tags); } }
public function xAttachAction() { $aws = $this->getEnvironment()->aws($this->getParam('cloudLocation')); $this->request->defineParams(array('cloudLocation', 'serverId', 'volumeId', 'mount', 'mountPoint')); $errmsg = null; try { $dbEbsVolume = DBEBSVolume::loadByVolumeId($this->getParam('volumeId')); if ($dbEbsVolume->isManual == 0) { $errmsg = sprintf(_("This volume was automatically created for role '%s' on farm '%s' and cannot be re-attahced manually."), $this->db->GetOne("\n SELECT name FROM roles\n JOIN farm_roles ON farm_roles.role_id = roles.id\n WHERE farm_roles.id=?\n LIMIT 1\n ", array($dbEbsVolume->farmRoleId)), $this->db->GetOne("SELECT name FROM farms WHERE id=? LIMIT 1", array($dbEbsVolume->farmId))); } } catch (Exception $e) { } if (!empty($errmsg)) { throw new Exception($errmsg); } /* @var $info VolumeData */ $info = $aws->ec2->volume->describe($this->getParam('volumeId'))->get(0); $dBServer = DBServer::LoadByID($this->getParam('serverId')); $device = $dBServer->GetFreeDeviceName(); $res = $info->attach($dBServer->GetProperty(EC2_SERVER_PROPERTIES::INSTANCE_ID), $device); if ($this->getParam('attachOnBoot') == 'on') { $dbEbsVolume = new DBEBSVolume(); $dbEbsVolume->attachmentStatus = EC2_EBS_ATTACH_STATUS::ATTACHING; $dbEbsVolume->isManual = true; $dbEbsVolume->volumeId = $info->volumeId; $dbEbsVolume->ec2AvailZone = $info->availabilityZone; $dbEbsVolume->ec2Region = $this->getParam('cloudLocation'); $dbEbsVolume->deviceName = $device; $dbEbsVolume->farmId = $dBServer->farmId; $dbEbsVolume->farmRoleId = $dBServer->farmRoleId; $dbEbsVolume->serverId = $dBServer->serverId; $dbEbsVolume->serverIndex = $dBServer->index; $dbEbsVolume->size = $info->size; $dbEbsVolume->snapId = $info->snapshotId; $dbEbsVolume->mount = $this->getParam('mount') == 1; $dbEbsVolume->mountPoint = $this->getParam('mountPoint'); $dbEbsVolume->mountStatus = $this->getParam('mount') == 1 ? EC2_EBS_MOUNT_STATUS::AWAITING_ATTACHMENT : EC2_EBS_MOUNT_STATUS::NOT_MOUNTED; $dbEbsVolume->clientId = $this->user->getAccountId(); $dbEbsVolume->envId = $this->getEnvironmentId(); $dbEbsVolume->Save(); } $this->response->success('EBS volume has been successfully attached'); }