PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/1.0RC2/www/client_roles_add.php

http://scalr.googlecode.com/
PHP | 172 lines | 133 code | 35 blank | 4 comment | 35 complexity | 270195bc0ba85d1c085f960772173313 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, GPL-3.0
  1. <?
  2. require("src/prepend.inc.php");
  3. $display["title"] = "Custom roles&nbsp;&raquo;&nbsp;Add";
  4. if ($_SESSION["uid"] == 0)
  5. {
  6. $errmsg = "Requested page cannot be viewed from admin account";
  7. UI::Redirect("index.php");
  8. }
  9. $AmazonEC2Client = new AmazonEC2($_SESSION["aws_private_key"], $_SESSION["aws_certificate"]);
  10. $SNMP = new SNMP();
  11. if ($_POST)
  12. {
  13. $Validator = new Validator();
  14. if (!preg_match("/^[A-Za-z0-9-]+$/", $post_name))
  15. $err[] = "Allowed chars for role name is [A-Za-z0-9-]";
  16. elseif ($db->GetOne("SELECT * FROM ami_roles WHERE name=? AND (clientid='0' OR clientid='{$_SESSION['uid']}') AND id != ? AND iscompleted!=2", array($post_name, $post_id)))
  17. $err[] = "Role with name {$post_name} already exists";
  18. if (!$Validator->IsNumeric($post_default_minLA) || $post_default_minLA < 0)
  19. $err[] = "Invalid value for minimum LA";
  20. if (!$Validator->IsNumeric($post_default_maxLA) || $post_default_maxLA > 99)
  21. $err[] = "Invalid value for maximum LA";
  22. if (!$post_id)
  23. {
  24. $instance_info = $db->GetRow("SELECT * FROM farm_instances WHERE instance_id=?", array($post_instance_id));
  25. if (!$instance_info)
  26. $err[] = "Instance not found";
  27. $farminfo = $db->GetRow("SELECT * FROM farms WHERE id=? AND clientid=?", array($instance_info["farmid"], $_SESSION['uid']));
  28. if (!$farminfo)
  29. $err[] = "Instance not found";
  30. if (count($err) == 0)
  31. {
  32. $security_group_name = CONFIG::$SECGROUP_PREFIX.$post_name;
  33. if (!$errmsg)
  34. {
  35. $db->BeginTrans();
  36. try
  37. {
  38. $instance_ami_info = $db->GetRow("SELECT * FROM ami_roles WHERE ami_id=?", array($instance_info["ami_id"]));
  39. $alias = $instance_ami_info["alias"];
  40. $architecture = $instance_ami_info["architecture"];
  41. $instance_type = $instance_ami_info["instance_type"];
  42. $ami_info = $instance_ami_info;
  43. $old_roleid = $db->GetOne("SELECT id FROM ami_roles WHERE ami_id=?", array($instance_info["ami_id"]));
  44. $farm_ami_info = $db->GetRow("SELECT * FROM farm_amis WHERE ami_id=? AND farmid=?",
  45. array($instance_info["ami_id"], $instance_info['farmid'])
  46. );
  47. if ($farm_ami_info)
  48. $instance_type = $farm_ami_info["instance_type"];
  49. if (!$instance_type)
  50. $instance_type = $db->GetOne("SELECT instance_type FROM ami_roles WHERE ami_id=?", array($instance_info["ami_id"]));
  51. // Update last synchronization date
  52. $db->Execute("UPDATE farm_instances SET dtlastsync=? WHERE id=?", array(time(), $instance_info['id']));
  53. $db->Execute("INSERT INTO ami_roles SET name=?, roletype=?, clientid=?, prototype_iid=?,
  54. iscompleted='0', default_minLA=?, default_maxLA=?, alias=?, architecture=?,
  55. instance_type=?, dtbuildstarted=NOW()",
  56. array($post_name, ROLE_TYPE::CUSTOM, $_SESSION['uid'], $instance_info['instance_id'],
  57. $post_default_minLA, $post_default_maxLA, $alias, $architecture, $instance_type)
  58. );
  59. $roleid = $db->Insert_ID();
  60. if ($addSecGroup)
  61. {
  62. $res = $AmazonEC2Client->CreateSecurityGroup($security_group_name, $post_name);
  63. if (!$res)
  64. throw new Exception("Cannot create security group", E_USER_ERROR);
  65. $db->Execute("INSERT INTO security_rules (id, roleid, rule) SELECT NULL, '{$roleid}', rule FROM security_rules WHERE roleid='{$ami_info['id']}'");
  66. // Set permissions for group
  67. $group_rules = $db->GetAll("SELECT * FROM security_rules WHERE roleid='{$ami_info['id']}'");
  68. $IpPermissionSet = new IpPermissionSetType();
  69. foreach ($group_rules as $rule)
  70. {
  71. $group_rule = explode(":", $rule["rule"]);
  72. $IpPermissionSet->AddItem($group_rule[0], $group_rule[1], $group_rule[2], null, array($group_rule[3]));
  73. }
  74. $AmazonEC2Client->AuthorizeSecurityGroupIngress($_SESSION['aws_accountid'], $security_group_name, $IpPermissionSet);
  75. }
  76. $SNMP->Connect($instance_info['external_ip'], null, $farminfo['hash']);
  77. $trap = vsprintf(SNMP_TRAP::START_REBUNDLE, array($post_name));
  78. $res = $SNMP->SendTrap($trap);
  79. $Logger->info("[FarmID: {$farminfo['id']}] Sending SNMP Trap startRebundle ({$trap}) to '{$instance_info['instance_id']}' ('{$instance_info['external_ip']}') complete ({$res})");
  80. }
  81. catch(Exception $e)
  82. {
  83. $db->RollbackTrans();
  84. $Logger->fatal("Exception thrown client role creation: {$e->getMessage()}");
  85. $errmsg = "Cannot create custom role. Please try again later.";
  86. }
  87. }
  88. if (!$errmsg)
  89. {
  90. $db->CommitTrans();
  91. $okmsg = "An image for new role {$post_name} is being bundled. It can take up to 10 minutes.";
  92. UI::Redirect("client_roles_view.php");
  93. }
  94. }
  95. }
  96. else
  97. {
  98. //
  99. }
  100. }
  101. $response = $AmazonEC2Client->DescribeInstances();
  102. $rowz = $response->reservationSet->item;
  103. if ($rowz instanceof stdClass)
  104. $rowz = array($rowz);
  105. // Custom properties
  106. foreach ($rowz as $pk=>$pv)
  107. {
  108. if ($pv->instancesSet->item->instanceState->name == 'running')
  109. {
  110. $instance_info = $db->GetRow("SELECT * FROM farm_instances WHERE instance_id=?", array($rowz[$pk]->instancesSet->item->instanceId));
  111. if ($instance_info)
  112. {
  113. $farm_role_info = $db->GetRow("SELECT * FROM farm_amis WHERE ami_id=? AND farmid=?",
  114. array($rowz[$pk]->instancesSet->item->imageId, $instance_info['farmid'])
  115. );
  116. if ($farm_role_info)
  117. $rowz[$pk]->LA = array('min' => $farm_role_info['min_LA'], 'max' => $farm_role_info['max_LA']);
  118. }
  119. $rowz[$pk]->Role = $db->GetOne("SELECT name FROM ami_roles WHERE ami_id=?", array($rowz[$pk]->instancesSet->item->imageId));
  120. if ($rowz[$pk]->Role && !$db->GetOne("SELECT id FROM ami_roles WHERE iscompleted='0' AND prototype_iid='{$rowz[$pk]->instancesSet->item->instanceId}'"))
  121. $display["rows"][] = $rowz[$pk];
  122. }
  123. }
  124. if (count($display["rows"]) == 0)
  125. {
  126. $errmsg = "You must have at least one running instance";
  127. UI::Redirect("client_roles_view.php");
  128. }
  129. if ($get_id)
  130. {
  131. UI::Redirect("client_roles_view.php");
  132. }
  133. else
  134. $display = array_merge($display, $_POST);
  135. $display["form_action"] = $_SERVER['PHP_SELF'];
  136. require("src/append.inc.php");
  137. ?>