public static function farmUpdateRoleSettings(DBFarmRole $DBFarmRole, $oldSettings, $newSettings)
{
$db = \Scalr::getDb();
$DBFarm = $DBFarmRole->GetFarmObject();
$DBFarmRole->SetSetting(Entity\FarmRoleSetting::AWS_ELASIC_IPS_MAP, null, Entity\FarmRoleSetting::TYPE_LCL);
$aws = $DBFarm->GetEnvironmentObject()->aws($DBFarmRole->CloudLocation);
$isVPC = $DBFarm->GetSetting(Entity\FarmSetting::EC2_VPC_ID);
// Disassociate IP addresses if checkbox was unchecked
if (empty($newSettings[Entity\FarmRoleSetting::AWS_USE_ELASIC_IPS]) && !empty($oldSettings[Entity\FarmRoleSetting::AWS_USE_ELASIC_IPS])) {
$eips = $db->Execute("\n SELECT * FROM elastic_ips WHERE farm_roleid = ?\n ", array($DBFarmRole->ID));
while ($eip = $eips->FetchRow()) {
try {
$aws->ec2->address->disassociate($eip['ipaddress']);
} catch (Exception $e) {
}
}
$db->Execute("\n DELETE FROM elastic_ips WHERE farm_roleid = ?\n ", array($DBFarmRole->ID));
}
//TODO: Handle situation when tab was not opened, but max instances setting was changed.
if (!empty($newSettings[Entity\FarmRoleSetting::AWS_ELASIC_IPS_MAP]) && !empty($newSettings[Entity\FarmRoleSetting::AWS_USE_ELASIC_IPS])) {
$map = explode(";", $newSettings[Entity\FarmRoleSetting::AWS_ELASIC_IPS_MAP]);
$maxIndex = 0;
foreach ($map as $ipconfig) {
list($serverIndex, $ipAddress) = explode("=", $ipconfig);
if (!$serverIndex) {
continue;
}
if ($serverIndex > $maxIndex) {
$maxIndex = $serverIndex;
}
$allocationId = null;
try {
$dbServer = DBServer::LoadByFarmRoleIDAndIndex($DBFarmRole->ID, $serverIndex);
} catch (Exception $e) {
}
// Allocate new IP if needed
if ((!$ipAddress || $ipAddress == '0.0.0.0') && $dbServer) {
$domain = $isVPC ? 'vpc' : null;
$address = $aws->ec2->address->allocate($domain);
$ipAddress = $address->publicIp;
$allocationId = $address->allocationId;
}
// Remove old association
$db->Execute("\n DELETE FROM elastic_ips\n WHERE farm_roleid = ? AND instance_index=?\n ", array($DBFarmRole->ID, $serverIndex));
if ((!$ipAddress || $ipAddress == '0.0.0.0') && !$dbServer) {
continue;
}
if ($ipAddress) {
//Remove old IP association
$db->Execute("\n DELETE FROM elastic_ips\n WHERE ipaddress=?\n ", array($ipAddress));
if (!$allocationId && $isVPC) {
$allocationId = $aws->ec2->address->describe($ipAddress)->get(0)->allocationId;
}
// Associate IP with server in our db
$db->Execute("\n INSERT INTO elastic_ips\n SET env_id=?,\n farmid=?,\n farm_roleid=?,\n ipaddress=?,\n state='0',\n instance_id='',\n clientid=?,\n instance_index=?,\n allocation_id=?\n ", array($DBFarm->EnvID, $DBFarmRole->FarmID, $DBFarmRole->ID, $ipAddress, $DBFarm->ClientID, $serverIndex, $allocationId));
// Associate IP on AWS with running server
try {
$dbServer = DBServer::LoadByFarmRoleIDAndIndex($DBFarmRole->ID, $serverIndex);
$db->Execute("\n UPDATE elastic_ips\n SET state='1',\n server_id = ?\n WHERE ipaddress = ?\n ", array($dbServer->serverId, $ipAddress));
$update = false;
if ($dbServer->remoteIp != $ipAddress) {
if ($dbServer && $dbServer->status == \SERVER_STATUS::RUNNING) {
$fireEvent = self::associateIpAddress($dbServer, $ipAddress, $isVPC ? $allocationId : null);
}
}
if ($fireEvent) {
$event = new \IPAddressChangedEvent($dbServer, $ipAddress, $dbServer->localIp);
\Scalr::FireEvent($dbServer->farmId, $event);
}
} catch (Exception $e) {
}
} else {
\Scalr::getContainer()->logger(\LOG_CATEGORY::FARM)->fatal(sprintf(_("Cannot allocate elastic ip address for instance %s on farm %s (2)"), $dbServer->serverId, $DBFarm->Name));
}
}
// Remove extra definitions
$db->Execute("DELETE FROM elastic_ips WHERE instance_index > ? AND farm_roleid = ?", array($maxIndex, $DBFarmRole->ID));
}
}