PageRenderTime 53ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/scalr-2/tags/scalr-2.1.0/app/src/Modules/Platforms/Rds/Rds.php

http://scalr.googlecode.com/
PHP | 378 lines | 304 code | 59 blank | 15 comment | 15 complexity | 33e52d1c9026b433b00e71843fd61726 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, GPL-3.0
  1. <?php
  2. class Modules_Platforms_Rds extends Modules_Platforms_Aws implements IPlatformModule
  3. {
  4. private $db;
  5. /** Properties **/
  6. const ACCOUNT_ID = 'rds.account_id';
  7. const ACCESS_KEY = 'rds.access_key';
  8. const SECRET_KEY = 'rds.secret_key';
  9. const PRIVATE_KEY = 'rds.private_key';
  10. const CERTIFICATE = 'rds.certificate';
  11. /**
  12. *
  13. * @var AmazonRDS
  14. */
  15. private $instancesListCache;
  16. public function __construct()
  17. {
  18. $this->db = Core::GetDBInstance();
  19. }
  20. public function getPropsList()
  21. {
  22. return array(
  23. self::ACCOUNT_ID => 'AWS Account ID',
  24. self::ACCESS_KEY => 'AWS Access Key',
  25. self::SECRET_KEY => 'AWS Secret Key',
  26. self::CERTIFICATE => 'AWS x.509 Certificate',
  27. self::PRIVATE_KEY => 'AWS x.509 Private Key'
  28. );
  29. }
  30. public function GetServerCloudLocation(DBServer $DBServer)
  31. {
  32. return $DBServer->GetProperty(EC2_SERVER_PROPERTIES::REGION);
  33. }
  34. public function GetServerID(DBServer $DBServer)
  35. {
  36. return $DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID);
  37. }
  38. public function IsServerExists(DBServer $DBServer)
  39. {
  40. return in_array(
  41. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID),
  42. array_keys($this->GetServersList($DBServer->GetEnvironmentObject(), $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)))
  43. );
  44. }
  45. public function getRdsClient(Scalr_Environment $environment, $region)
  46. {
  47. return Scalr_Service_Cloud_Aws::newRds(
  48. $environment->getPlatformConfigValue(self::ACCESS_KEY),
  49. $environment->getPlatformConfigValue(self::SECRET_KEY),
  50. $region
  51. );
  52. }
  53. public function GetServerIPAddresses(DBServer $DBServer)
  54. {
  55. $Client = $DBServer->GetClient();
  56. $RDSClient = $this->getRdsClient(
  57. $DBServer->GetEnvironmentObject(),
  58. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  59. );
  60. $iinfo = $RDSClient->DescribeDBInstances($DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID));
  61. $iinfo = $iinfo->DescribeDBInstancesResult->DBInstances->DBInstance;
  62. $hostname = (string)$iinfo->Endpoint->Address;
  63. $ip = @gethostbyname($hostname);
  64. if ($ip != $hostname)
  65. {
  66. return array(
  67. 'localIp' => $ip,
  68. 'remoteIp' => $ip
  69. );
  70. }
  71. }
  72. private function GetServersList(Scalr_Environment $environment, $region, $skipCache = false)
  73. {
  74. if (!isset($this->instancesListCache[$environment->id][$region]))
  75. {
  76. $RDSClient = $this->getRdsClient(
  77. $environment,
  78. $region
  79. );
  80. try
  81. {
  82. $results = $RDSClient->DescribeDBInstances();
  83. $results = $results->DescribeDBInstancesResult;
  84. }
  85. catch(Exception $e)
  86. {
  87. throw new Exception(sprintf("Cannot get list of servers for platfrom rds: %s", $e->getMessage()));
  88. }
  89. if ($results->DBInstances)
  90. foreach ($results->DBInstances->children() as $item)
  91. $this->instancesListCache[$environment->id][$region][(string)$item->DBInstanceIdentifier] = (string)$item->DBInstanceStatus;
  92. }
  93. return $this->instancesListCache[$environment->id][$region];
  94. }
  95. public function GetServerRealStatus(DBServer $DBServer)
  96. {
  97. $region = $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION);
  98. $RDSClient = $this->getRdsClient(
  99. $DBServer->GetEnvironmentObject(),
  100. $region
  101. );
  102. if (!$this->instancesListCache[$DBServer->GetEnvironmentObject()->id][$region][$DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID)])
  103. {
  104. try {
  105. $iinfo = $RDSClient->DescribeDBInstances($DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID));
  106. $iinfo = $iinfo->DescribeDBInstancesResult->DBInstances->DBInstance;
  107. $status = (string)$iinfo->DBInstanceStatus;
  108. }
  109. catch(Exception $e)
  110. {
  111. if (stristr($e->getMessage(), "not found"))
  112. $status = 'not-found';
  113. else
  114. throw $e;
  115. }
  116. }
  117. else
  118. {
  119. $status = $this->instancesListCache[$DBServer->GetEnvironmentObject()->id][$region][$DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID)];
  120. }
  121. return Modules_Platforms_Rds_Adapters_Status::load($status);
  122. }
  123. public function TerminateServer(DBServer $DBServer)
  124. {
  125. $RDSClient = $this->getRdsClient(
  126. $DBServer->GetEnvironmentObject(),
  127. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  128. );
  129. //TODO: Snapshot
  130. $RDSClient->DeleteDBInstance($DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID));
  131. return true;
  132. }
  133. public function RebootServer(DBServer $DBServer)
  134. {
  135. $RDSClient = $this->getRdsClient(
  136. $DBServer->GetEnvironmentObject(),
  137. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  138. );
  139. $RDSClient->RebootDBInstance($DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID));
  140. return true;
  141. }
  142. public function RemoveServerSnapshot(DBRole $DBRole)
  143. {
  144. /*
  145. $RDSClient = $this->getRdsClient(
  146. $DBServer->GetEnvironmentObject(),
  147. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  148. );
  149. $RDSClient->DeleteDBSnapshot($DBRole->getImageId(SERVER_PLATFORMS::RDS));
  150. */
  151. //TODO:
  152. }
  153. public function CheckServerSnapshotStatus(BundleTask $BundleTask)
  154. {
  155. $DBServer = DBServer::LoadByID($BundleTask->serverId);
  156. $RDSClient = $this->getRdsClient(
  157. $DBServer->GetEnvironmentObject(),
  158. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  159. );
  160. try
  161. {
  162. $info = $RDSClient->DescribeDBSnapshots(null, $BundleTask->snapshotId);
  163. $info = $info->DescribeDBSnapshotsResult->DBSnapshots->DBSnapshot;
  164. if ($info->Status == 'available')
  165. {
  166. $BundleTask->SnapshotCreationComplete($BundleTask->snapshotId);
  167. }
  168. elseif ($info->Status == 'creating')
  169. {
  170. return;
  171. }
  172. else
  173. {
  174. Logger::getLogger(__CLASS__)->error("CheckServerSnapshotStatus ({$BundleTask->id}) status = {$info->Status}");
  175. }
  176. }
  177. catch(Exception $e)
  178. {
  179. Logger::getLogger(__CLASS__)->fatal("CheckServerSnapshotStatus ({$BundleTask->id}): {$e->getMessage()}");
  180. }
  181. }
  182. public function CreateServerSnapshot(BundleTask $BundleTask)
  183. {
  184. $DBServer = DBServer::LoadByID($BundleTask->serverId);
  185. $RDSClient = $this->getRdsClient(
  186. $DBServer->GetEnvironmentObject(),
  187. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  188. );
  189. try
  190. {
  191. $RDSClient->CreateDBSnapshot($BundleTask->roleName, $DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID));
  192. $BundleTask->status = SERVER_SNAPSHOT_CREATION_STATUS::IN_PROGRESS;
  193. $BundleTask->bundleType = SERVER_SNAPSHOT_CREATION_TYPE::RDS_SPT;
  194. $BundleTask->snapshotId = $BundleTask->roleName;
  195. $BundleTask->Log(sprintf(_("Snapshot creation initialized. SnapshotID: %s"), $BundleTask->snapshotId));
  196. $BundleTask->setDate('started');
  197. $BundleTask->Save();
  198. }
  199. catch(Exception $e)
  200. {
  201. $BundleTask->SnapshotCreationFailed($e->getMessage());
  202. }
  203. }
  204. public function GetServerConsoleOutput(DBServer $DBServer)
  205. {
  206. throw new Exception("Not supported by RDS platform module");
  207. }
  208. public function GetServerExtendedInformation(DBServer $DBServer)
  209. {
  210. try
  211. {
  212. $RDSClient = $this->getRdsClient(
  213. $DBServer->GetEnvironmentObject(),
  214. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  215. );
  216. $iinfo = $RDSClient->DescribeDBInstances($DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID));
  217. $iinfo = $iinfo->DescribeDBInstancesResult->DBInstances->DBInstance;
  218. if ($iinfo)
  219. {
  220. $groups = array();
  221. if ($iinfo->DBParameterGroups->DBParameterGroup->DBParameterGroupName)
  222. $groups[] = $iinfo->DBParameterGroups->DBParameterGroup->DBParameterGroupName;
  223. else
  224. {
  225. foreach ($iinfo->DBParameterGroups->DBParameterGroup as $item)
  226. $groups[] = $item->DBParameterGroupName;
  227. }
  228. $sgroups = array();
  229. if ($iinfo->DBSecurityGroups->DBSecurityGroup->DBParameterGroupName)
  230. $sgroups[] = $iinfo->DBSecurityGroups->DBSecurityGroup->DBSecurityGroupName;
  231. else
  232. {
  233. foreach ($iinfo->DBSecurityGroups->DBSecurityGroup as $item)
  234. $sgroups[] = $item->DBSecurityGroupName;
  235. }
  236. return array(
  237. 'Instance ID' => $DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID),
  238. 'Engine' => $iinfo->Engine,
  239. 'Image ID (Snapshot)' => $DBServer->GetProperty(RDS_SERVER_PROPERTIES::SNAPSHOT_ID),
  240. 'Backup Retention Period' => $iinfo->BackupRetentionPeriod,
  241. 'Status' => $iinfo->DBInstanceStatus,
  242. 'Preferred Backup Window' => $iinfo->PreferredBackupWindow,
  243. 'Preferred Maintenance Window' => $iinfo->PreferredMaintenanceWindow,
  244. 'Availability Zone' => $iinfo->AvailabilityZone,
  245. 'Allocated Storage' => $iinfo->AllocatedStorage,
  246. 'Instance Class' => $iinfo->DBInstanceClass,
  247. 'Master Username' => $iinfo->MasterUsername,
  248. 'Port' => $iinfo->Endpoint->Port,
  249. 'Hostname' => $iinfo->Endpoint->Address,
  250. 'Create Time' => $iinfo->InstanceCreateTime,
  251. 'Parameter groups' => implode(", ", $groups),
  252. 'Security groups' => implode(", ", $sgroups)
  253. );
  254. }
  255. }
  256. catch(Excpetion $e)
  257. {
  258. }
  259. return false;
  260. }
  261. public function LaunchServer(DBServer $DBServer)
  262. {
  263. $RDSClient = $this->getRdsClient(
  264. $DBServer->GetEnvironmentObject(),
  265. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)
  266. );
  267. $DBRole = DBRole::loadById($DBServer->roleId);
  268. $server_id = "scalr-{$DBServer->serverId}";
  269. $avail_zone = $DBServer->GetProperty(RDS_SERVER_PROPERTIES::AVAIL_ZONE) ? $DBServer->GetProperty(RDS_SERVER_PROPERTIES::AVAIL_ZONE) : $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)."a";
  270. try
  271. {
  272. if ($DBRole->getImageId(SERVER_PLATFORMS::RDS, $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)) == 'ScalrEmpty')
  273. {
  274. $RDSClient->CreateDBInstance(
  275. $server_id,
  276. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::STORAGE),
  277. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_CLASS),
  278. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ENGINE),
  279. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::MASTER_USER),
  280. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::MASTER_PASS),
  281. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::PORT),
  282. null, //DBName
  283. null, //DBParameterGroup
  284. null, //$DBSecurityGroups
  285. $avail_zone,
  286. null, //$PreferredMaintenanceWindow = null,
  287. null, //$BackupRetentionPeriod = null ,
  288. null //$PreferredBackupWindow = null
  289. );
  290. }
  291. else
  292. {
  293. $RDSClient->RestoreDBInstanceFromDBSnapshot(
  294. $DBRole->getImageId(SERVER_PLATFORMS::RDS, $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)),
  295. $server_id,
  296. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::INSTANCE_CLASS),
  297. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::PORT),
  298. $DBServer->GetProperty(RDS_SERVER_PROPERTIES::AVAIL_ZONE)
  299. );
  300. }
  301. $DBServer->SetProperty(RDS_SERVER_PROPERTIES::INSTANCE_ID, $server_id);
  302. $DBServer->SetProperty(RDS_SERVER_PROPERTIES::SNAPSHOT_ID, $DBRole->getImageId(SERVER_PLATFORMS::RDS, $DBServer->GetProperty(RDS_SERVER_PROPERTIES::REGION)));
  303. return $DBServer;
  304. }
  305. catch(Exception $e)
  306. {
  307. throw new Exception(sprintf(_("Cannot launch new instance. %s"), $e->getMessage()));
  308. }
  309. }
  310. public function PutAccessData(DBServer $DBServer, Scalr_Messaging_Msg $message)
  311. {
  312. }
  313. public function ClearCache()
  314. {
  315. $this->instancesListCache = array();
  316. }
  317. }
  318. ?>