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

/scalr-2/tags/scalr-2.1.0/app/src/Modules/Platforms/Ec2/Helpers/Elb.php

http://scalr.googlecode.com/
PHP | 175 lines | 141 code | 29 blank | 5 comment | 28 complexity | c283092542f86975c151683ce6253bf9 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, GPL-3.0
  1. <?php
  2. class Modules_Platforms_Ec2_Helpers_Elb
  3. {
  4. public static function farmValidateRoleSettings($settings, $rolename)
  5. {
  6. }
  7. public static function farmUpdateRoleSettings(DBFarmRole $DBFarmRole, $oldSettings, $newSettings)
  8. {
  9. $DBFarm = $DBFarmRole->GetFarmObject();
  10. $Client = Client::Load($DBFarm->ClientID);
  11. $AmazonELB = Scalr_Service_Cloud_Aws::newElb(
  12. $DBFarmRole->GetSetting(DBFarmRole::SETTING_CLOUD_LOCATION),
  13. $DBFarm->GetEnvironmentObject()->getPlatformConfigValue(Modules_Platforms_Ec2::ACCESS_KEY),
  14. $DBFarm->GetEnvironmentObject()->getPlatformConfigValue(Modules_Platforms_Ec2::SECRET_KEY)
  15. );
  16. // Load balancer settings
  17. if ($newSettings[DBFarmRole::SETTING_BALANCING_USE_ELB] == 1)
  18. {
  19. // Listeners
  20. $DBFarmRole->ClearSettings("lb.role.listener");
  21. $ELBListenersList = new ELBListenersList();
  22. $li = 0;
  23. foreach ($newSettings as $sk=>$sv)
  24. {
  25. if (stristr($sk, "lb.role.listener"))
  26. {
  27. $li++;
  28. $listener_chunks = explode("#", $sv);
  29. $ELBListenersList->AddListener($listener_chunks[0], $listener_chunks[1], $listener_chunks[2]);
  30. $DBFarmRole->SetSetting("lb.role.listener.{$li}", $sv);
  31. }
  32. }
  33. $avail_zones = array();
  34. $avail_zones_setting_hash = "";
  35. foreach ($newSettings as $skey => $sval)
  36. {
  37. if (preg_match("/^lb.avail_zone.(.*)?$/", $skey, $macthes))
  38. {
  39. if ($sval == 1)
  40. array_push($avail_zones, $macthes[1]);
  41. $avail_zones_setting_hash .= "[{$macthes[1]}:{$sval}]";
  42. }
  43. }
  44. if (!$DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_HOSTNAME))
  45. {
  46. $elb_name = sprintf("scalr-%s-%s", $DBFarm->Hash, rand(100,999));
  47. //CREATE NEW ELB
  48. $elb_dns_name = $AmazonELB->CreateLoadBalancer($elb_name, $avail_zones, $ELBListenersList);
  49. if ($elb_dns_name)
  50. {
  51. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_HOSTNAME, $elb_dns_name);
  52. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_NAME, $elb_name);
  53. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_AZ_HASH, $avail_zones_setting_hash);
  54. $register_servers = true;
  55. }
  56. }
  57. if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_NAME))
  58. {
  59. $ELBHealthCheckType = new ELBHealthCheckType(
  60. $newSettings[DBFarmRole::SETTING_BALANCING_HC_TARGET],
  61. $newSettings[DBFarmRole::SETTING_BALANCING_HC_HTH],
  62. $newSettings[DBFarmRole::SETTING_BALANCING_HC_INTERVAL],
  63. $newSettings[DBFarmRole::SETTING_BALANCING_HC_TIMEOUT],
  64. $newSettings[DBFarmRole::SETTING_BALANCING_HC_UTH]
  65. );
  66. $hash = md5(serialize($ELBHealthCheckType));
  67. if ($elb_name || ($hash != $DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_HC_HASH)))
  68. {
  69. //UPDATE CURRENT ELB
  70. $AmazonELB->ConfigureHealthCheck(
  71. $DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_NAME),
  72. $ELBHealthCheckType
  73. );
  74. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_HC_HASH, $hash);
  75. }
  76. // Configure AVAIL zones for the LB
  77. if (!$elb_name && $avail_zones_setting_hash != $DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_AZ_HASH))
  78. {
  79. $info = $AmazonELB->DescribeLoadBalancers(array($DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_NAME)));
  80. $elb = $info->DescribeLoadBalancersResult->LoadBalancerDescriptions->member;
  81. $c = (array)$elb->AvailabilityZones;
  82. if (!is_array($c['member']))
  83. $c_zones = array($c['member']);
  84. else
  85. $c_zones = $c['member'];
  86. $add_avail_zones = array();
  87. $rem_avail_zones = array();
  88. foreach ($newSettings as $skey => $sval)
  89. {
  90. if (preg_match("/^lb.avail_zone.(.*)?$/", $skey, $m))
  91. {
  92. if ($sval == 1 && !in_array($m[1], $c_zones))
  93. array_push($add_avail_zones, $m[1]);
  94. if ($sval == 0 && in_array($m[1], $c_zones))
  95. array_push($rem_avail_zones, $m[1]);
  96. }
  97. }
  98. if (count($add_avail_zones) > 0)
  99. {
  100. $AmazonELB->EnableAvailabilityZonesForLoadBalancer(
  101. $DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_NAME),
  102. $add_avail_zones
  103. );
  104. }
  105. if (count($rem_avail_zones) > 0)
  106. {
  107. $AmazonELB->DisableAvailabilityZonesForLoadBalancer(
  108. $DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_NAME),
  109. $rem_avail_zones
  110. );
  111. }
  112. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_AZ_HASH, $avail_zones_setting_hash);
  113. }
  114. }
  115. if ($register_servers)
  116. {
  117. $servers = $DBFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::RUNNING));
  118. $instances = array();
  119. foreach ($servers as $DBServer)
  120. $instances[] = $DBServer->GetProperty(EC2_SERVER_PROPERTIES::INSTANCE_ID);
  121. if (count($instances) > 0)
  122. {
  123. $AmazonELB->RegisterInstancesWithLoadBalancer(
  124. $DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_NAME),
  125. $instances
  126. );
  127. }
  128. }
  129. }
  130. else
  131. {
  132. if ($oldSettings[DBFarmRole::SETTING_BALANCING_HOSTNAME])
  133. {
  134. $AmazonELB->DeleteLoadBalancer($DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_NAME));
  135. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_NAME, "");
  136. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_HOSTNAME, "");
  137. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_USE_ELB, "0");
  138. $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_HC_HASH, "");
  139. $DBFarmRole->ClearSettings("lb.avail_zone");
  140. $DBFarmRole->ClearSettings("lb.healthcheck");
  141. $DBFarmRole->ClearSettings("lb.role.listener");
  142. }
  143. }
  144. }
  145. }
  146. ?>