PageRenderTime 60ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/1.0RC3/www/farms_control.php

http://scalr.googlecode.com/
PHP | 222 lines | 174 code | 41 blank | 7 comment | 33 complexity | 74b859fd4666004ad8a70876765d4d4f MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, GPL-3.0
  1. <?
  2. require("src/prepend.inc.php");
  3. if ($_SESSION['uid'] == 0)
  4. $farminfo = $db->GetRow("SELECT * FROM farms WHERE id=?", array($req_farmid));
  5. else
  6. $farminfo = $db->GetRow("SELECT * FROM farms WHERE id=? AND clientid=?", array($req_farmid, $_SESSION['uid']));
  7. if (!$farminfo || $post_cancel)
  8. UI::Redirect("farms_view.php");
  9. if ($req_action == "Launch")
  10. {
  11. if ($post_cbtn_3)
  12. UI::Redirect("farms_add.php?id={$farminfo['id']}");
  13. Scalr::FireEvent($farminfo['id'], new FarmLaunchedEvent($req_mark_active));
  14. $okmsg = sprintf(_("Farm %s is now launching. It will take few minutes to start all instances."), $farminfo['name']);
  15. UI::Redirect("farms_view.php");
  16. }
  17. elseif ($req_action == "Terminate")
  18. {
  19. if ($req_term_step == 2 && $farminfo['status'] == FARM_STATUS::RUNNING)
  20. {
  21. $_SESSION['term_post'] = $_POST;
  22. $_SESSION['issync'] = isset($_POST['cbtn_2']) ? true : false;
  23. $display["term_step"] = 2;
  24. }
  25. else
  26. {
  27. $Logger->info("Terminating farm ID {$farminfo["id"]}");
  28. if ($_SESSION['issync'])
  29. {
  30. $db->BeginTrans();
  31. $SNMP = new SNMP();
  32. $Logger->debug("Checking and execute sync routines...");
  33. $sync_instances = $db->GetAll("SELECT * FROM farm_instances WHERE farmid=?
  34. AND instance_id IN (SELECT prototype_iid FROM ami_roles WHERE iscompleted = '0')",
  35. array($farminfo['id'])
  36. );
  37. foreach ($sync_instances as $sync_instance)
  38. {
  39. $db->Execute("UPDATE farm_instances SET state=? WHERE id=?",
  40. array(INSTANCE_STATE::PENDING_TERMINATE, $sync_instance['id'])
  41. );
  42. $Logger->debug("Synchronize for role with ami {$sync_instance['ami_id']} already running on instance: {$sync_instance['instance_id']}");
  43. continue;
  44. }
  45. foreach ($_SESSION['term_post']["sync"] as $ami_id)
  46. {
  47. if (!$_SESSION['term_post']["sync_i"][$ami_id])
  48. continue;
  49. $Logger->debug("Synchronize for role with ami {$ami_id} will be executed on {$_SESSION['term_post']["sync_i"][$ami_id]}");
  50. $instance = $db->GetRow("SELECT * FROM farm_instances WHERE instance_id=?",
  51. array($_SESSION['term_post']["sync_i"][$ami_id])
  52. );
  53. if (!$instance)
  54. {
  55. $Logger->debug("Instance {$_SESSION['term_post']["sync_i"][$ami_id]} not found in database.");
  56. $err[] = "Instance {$_SESSION['term_post']["sync_i"][$ami_id]} not found in database.";
  57. continue;
  58. }
  59. $roleinfo = $db->GetRow("SELECT * FROM ami_roles WHERE ami_id=?",
  60. array($instance['ami_id'])
  61. );
  62. // Select role name
  63. if ($roleinfo["roletype"] == ROLE_TYPE::SHARED)
  64. {
  65. $i = 1;
  66. $name = "{$roleinfo["name"]}-".date("Ymd")."01";
  67. $role = $db->GetOne("SELECT id FROM ami_roles WHERE name=? AND iscompleted='1' AND clientid='{$farminfo['clientid']}'", array($name));
  68. if ($role)
  69. {
  70. while ($role)
  71. {
  72. $name = $roleinfo["name"];
  73. if ($i > 0)
  74. {
  75. $istring = ($i < 10) ? "0{$i}" : $i;
  76. $name .= "-".date("Ymd")."{$istring}";
  77. }
  78. $role = $db->GetOne("SELECT id FROM ami_roles WHERE name=? AND iscompleted='1' AND clientid='{$farminfo['clientid']}'", array($name));
  79. $i++;
  80. }
  81. }
  82. $rolename = $name;
  83. }
  84. else
  85. $rolename = $roleinfo["name"];
  86. $Logger->debug("New role name {$rolename}");
  87. try
  88. {
  89. // Add record for new ami to database
  90. $db->Execute("INSERT INTO
  91. ami_roles (
  92. `ami_id`, `name`, `roletype`, `clientid`, `prototype_iid`, `iscompleted`,
  93. `replace`, `default_minLA`, `default_maxLA`, `alias`, `instance_type`,
  94. `architecture`, `dtbuildstarted`, `rebundle_trap_received`)
  95. SELECT
  96. '', ?, ?, ?, ?, '0', ?, default_minLA, default_maxLA,
  97. alias, instance_type, architecture, NOW(), '0' FROM ami_roles WHERE ami_id=?",
  98. array($rolename, ROLE_TYPE::CUSTOM, $farminfo['clientid'], $instance['instance_id'], $ami_id, $ami_id)
  99. );
  100. // Set instance state = PENDING_TEMINATE
  101. $db->Execute("UPDATE farm_instances SET state=? WHERE id=?",
  102. array(INSTANCE_STATE::PENDING_TERMINATE, $instance['id'])
  103. );
  104. // Send rebundle trap
  105. $SNMP->Connect($instance['external_ip'], null, $farminfo['hash']);
  106. $trap = vsprintf(SNMP_TRAP::START_REBUNDLE, array($rolename));
  107. $res = $SNMP->SendTrap($trap);
  108. $Logger->info("[FarmID: {$farminfo['id']}] Sending SNMP Trap startRebundle ({$trap}) to '{$instance['instance_id']}' ('{$instance['external_ip']}') complete ({$res})");
  109. }
  110. catch(Exception $e)
  111. {
  112. $db->RollbackTrans();
  113. $Logger->fatal(new FarmLogMessage($farminfo["id"], "Exception thrown during role synchronization: {$e->getMessage()}"));
  114. }
  115. }
  116. if (count($err) == 0)
  117. $db->CommitTrans();
  118. }
  119. if (count($err) == 0)
  120. {
  121. $remove_zone_from_DNS = ($post_deleteDNS) ? 1 : 0;
  122. $term_on_sync_fail = ($_SESSION['term_post']["untermonfail"]) ? 0 : 1;
  123. $event = new FarmTerminatedEvent($remove_zone_from_DNS, $post_keep_elastic_ips, $term_on_sync_fail, $post_keep_ebs);
  124. Scalr::FireEvent($farminfo['id'], $event);
  125. $okmsg = _("Farm successfully terminated");
  126. UI::Redirect("farms_view.php");
  127. }
  128. }
  129. }
  130. if ($farminfo["status"] == 0)
  131. {
  132. $display["action"] = "Launch";
  133. $display["show_dns"] = $db->GetOne("SELECT COUNT(*) FROM zones WHERE farmid=?", $farminfo['id']);
  134. $display["num"] = $db->GetOne("SELECT COUNT(*) FROM farm_amis WHERE farmid=?", $farminfo['id']);
  135. }
  136. else
  137. {
  138. if (!$display["term_step"])
  139. $display["term_step"] = 1;
  140. $display["action"] = "Terminate";
  141. $display["num"] = $db->GetOne("SELECT COUNT(*) FROM farm_instances WHERE farmid=?", $farminfo['id']);
  142. $display["sync_count"] = $db->GetOne("SELECT COUNT(*) FROM farm_instances WHERE farmid=? AND instance_id IN (SELECT prototype_iid FROM ami_roles WHERE iscompleted = '0')", array($farminfo['id']));
  143. $display["elastic_ips"] = $db->GetOne("SELECT COUNT(*) FROM elastic_ips WHERE farmid=?", array($farminfo['id']));
  144. $display["ebs"] = $db->GetOne("SELECT COUNT(*) FROM farm_ebs WHERE farmid=?", array($farminfo['id']));
  145. //
  146. // Synchronize before termination
  147. //
  148. $farm_launch_time = strtotime($farminfo['dtlaunched']);
  149. $outdated_farm_amis = $db->GetAll("SELECT * FROM farm_amis WHERE (UNIX_TIMESTAMP(dtlastsync) < ? OR dtlastsync IS NULL) AND farmid=?",
  150. array($farm_launch_time, $farminfo['id'])
  151. );
  152. foreach ($outdated_farm_amis as &$farm_ami)
  153. {
  154. $farm_ami['name'] = $db->GetOne("SELECT name FROM ami_roles WHERE ami_id=?",
  155. array($farm_ami['ami_id'])
  156. );
  157. $farm_ami['alias'] = $db->GetOne("SELECT alias FROM ami_roles WHERE ami_id=?",
  158. array($farm_ami['ami_id'])
  159. );
  160. if ($farm_ami['dtlastsync'])
  161. $farm_ami['dtlastsync'] = Formater::FuzzyTimeString(strtotime($farm_ami['dtlastsync']), false);
  162. else
  163. $farm_ami['dtlastsync'] = false;
  164. $farm_ami['instances'] = $db->GetAll("SELECT * FROM farm_instances WHERE farmid=? AND ami_id=? AND state=?",
  165. array($farminfo['id'], $farm_ami['ami_id'], INSTANCE_STATE::RUNNING)
  166. );
  167. $farm_ami['running'] = $db->GetRow("SELECT * FROM farm_instances WHERE farmid=? AND ami_id=?
  168. AND instance_id IN (SELECT prototype_iid FROM ami_roles WHERE iscompleted = '0')",
  169. array($farminfo['id'], $farm_ami['ami_id'])
  170. );
  171. }
  172. $display['outdated_farm_amis'] = $outdated_farm_amis;
  173. if (count($outdated_farm_amis) == 0)
  174. $display["term_step"] = 2;
  175. }
  176. $display["title"] = sprintf(_("Farms&nbsp;&raquo;&nbsp; %s"), $display["action"]);
  177. $display["new"] = ($req_new) ? "1" : "0";
  178. $display["iswiz"] = ($req_iswiz) ? "1" : "0";
  179. $display["farminfo"] = $farminfo;
  180. require_once("src/append.inc.php");
  181. ?>