Exemplo n.º 1
0
Arquivo: Ebs.php Projeto: recipe/scalr
 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));
         }
     }
 }
Exemplo n.º 2
0
 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');
 }
Exemplo n.º 3
0
 /**
  * {@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();
         }
     }
 }
Exemplo n.º 4
0
 /**
  * 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);
     }
 }
Exemplo n.º 5
0
 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');
 }