public function OnHostInit(HostInitEvent $event)
{
$msg = new Scalr_Messaging_Msg_HostInitResponse($event->DBServer->GetFarmObject()->GetSetting(Entity\FarmSetting::CRYPTO_KEY), $event->DBServer->index);
$msg->cloudLocation = $event->DBServer->GetCloudLocation();
$msg->eventId = $event->GetEventID();
$msg->serverId = $event->DBServer->serverId;
$dbServer = $event->DBServer;
$dbFarmRole = $dbServer->GetFarmRoleObject();
if ($dbFarmRole) {
foreach (Scalr_Role_Behavior::getListForFarmRole($dbFarmRole) as $behavior) {
$msg = $behavior->extendMessage($msg, $dbServer);
}
}
$msg->setGlobalVariables($dbServer, true, $event);
if ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL)) {
$isMaster = (int) $dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER);
$msg->mysql = (object) ["replicationMaster" => $isMaster, "rootPassword" => $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_ROOT_PASSWORD), "replPassword" => $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_REPL_PASSWORD), "statPassword" => $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_STAT_PASSWORD), "logFile" => $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_LOG_FILE), "logPos" => $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_LOG_POS)];
if ($event->DBServer->IsSupported("0.7")) {
if ($dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_SCALR_VOLUME_ID) && $isMaster) {
try {
$volume = Scalr_Storage_Volume::init()->loadById($dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_SCALR_VOLUME_ID));
$msg->mysql->volumeConfig = $volume->getConfig();
} catch (Exception $e) {
}
}
//For Rackspace we always need snapsjot_config for mysql
if ($dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_SCALR_SNAPSHOT_ID)) {
try {
$snapshotConfig = Scalr_Storage_Snapshot::init()->loadById($dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_SCALR_SNAPSHOT_ID));
$msg->mysql->snapshotConfig = $snapshotConfig->getConfig();
} catch (Exception $e) {
$this->Logger->error(new FarmLogMessage($event->DBServer, "Cannot get snaphotConfig for hostInit message: {$e->getMessage()}"));
}
}
if (!$msg->mysql->snapshotConfig && $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_SNAPSHOT_ID)) {
$msg->mysql->snapshotConfig = new stdClass();
$msg->mysql->snapshotConfig->type = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_DATA_STORAGE_ENGINE);
$msg->mysql->snapshotConfig->id = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_SNAPSHOT_ID);
}
if ($isMaster && !$msg->mysql->volumeConfig) {
$msg->mysql->volumeConfig = new stdClass();
$msg->mysql->volumeConfig->type = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_DATA_STORAGE_ENGINE);
if (!$dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_MASTER_EBS_VOLUME_ID)) {
if (in_array($dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_DATA_STORAGE_ENGINE), [MYSQL_STORAGE_ENGINE::EBS, MYSQL_STORAGE_ENGINE::CSVOL])) {
$msg->mysql->volumeConfig->size = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_EBS_VOLUME_SIZE);
if ($dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_DATA_STORAGE_ENGINE) == MYSQL_STORAGE_ENGINE::EBS) {
$msg->mysql->volumeConfig->volumeType = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_EBS_TYPE);
if ($msg->mysql->volumeConfig->volumeType == 'io1') {
$msg->mysql->volumeConfig->iops = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_EBS_IOPS);
}
}
} elseif ($dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_DATA_STORAGE_ENGINE) == MYSQL_STORAGE_ENGINE::EPH) {
$msg->mysql->volumeConfig->snap_backend = sprintf("cf://scalr-%s-%s/data-bundles/%s/mysql/", $event->DBServer->envId, $event->DBServer->GetCloudLocation(), $event->DBServer->farmId);
$msg->mysql->volumeConfig->vg = 'mysql';
$msg->mysql->volumeConfig->disk = new stdClass();
$msg->mysql->volumeConfig->disk->type = 'loop';
$msg->mysql->volumeConfig->disk->size = '75%root';
}
} else {
$msg->mysql->volumeConfig->id = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_MASTER_EBS_VOLUME_ID);
}
}
} else {
if ($isMaster) {
$msg->mysql->volumeId = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_MASTER_EBS_VOLUME_ID);
}
$msg->mysql->snapshotId = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_SNAPSHOT_ID);
}
}
// Create ssh keypair for rackspace
if ($event->DBServer->IsSupported("0.7")) {
$authSshKey = $event->DBServer->platform == SERVER_PLATFORMS::AZURE || $event->DBServer->isCloudstack();
if ($event->DBServer->isOpenstack()) {
$isKeyPairsSupported = $event->DBServer->GetEnvironmentObject()->keychain($event->DBServer->platform)->properties[Entity\CloudCredentialsProperty::OPENSTACK_EXT_KEYPAIRS_ENABLED];
if ($isKeyPairsSupported != 1) {
$authSshKey = true;
}
}
if ($authSshKey && $dbServer->osType == 'linux') {
$sshKey = (new SshKey())->loadGlobalByFarmId($event->DBServer->envId, $event->DBServer->platform, $event->DBServer->GetFarmRoleObject()->CloudLocation, $event->DBServer->farmId);
if (!$sshKey) {
$keyName = "FARM-{$event->DBServer->farmId}-" . SCALR_ID;
$sshKey = new SshKey();
$sshKey->generateKeypair();
$sshKey->farmId = $event->DBServer->farmId;
$sshKey->envId = $event->DBServer->envId;
$sshKey->type = SshKey::TYPE_GLOBAL;
$sshKey->platform = $event->DBServer->platform;
$sshKey->cloudLocation = $event->DBServer->isCloudstack() || $event->DBServer->platform == SERVER_PLATFORMS::AZURE || $event->DBServer->platform == SERVER_PLATFORMS::GCE ? "" : $event->DBServer->GetFarmRoleObject()->CloudLocation;
$sshKey->cloudKeyName = $keyName;
$sshKey->save();
}
$sshKeysMsg = new Scalr_Messaging_Msg_UpdateSshAuthorizedKeys(array($sshKey->publicKey), array());
$event->DBServer->SendMessage($sshKeysMsg, false, true);
}
}
// Send HostInitResponse to target server
$event->DBServer->SendMessage($msg);
// Send broadcast HostInit
$servers = DBFarm::LoadByID($this->FarmID)->GetServersByFilter(['status' => [SERVER_STATUS::INIT, SERVER_STATUS::RUNNING]]);
$event->msgExpected = count($servers);
foreach ((array) $servers as $DBServer) {
if (!$DBServer->IsSupported('0.5') || !$DBServer->isScalarized) {
$event->msgExpected--;
continue;
}
if ($DBServer->status == SERVER_STATUS::INIT && $DBServer->serverId != $event->DBServer->serverId) {
$event->msgExpected--;
continue;
}
$hiMsg = new Scalr_Messaging_Msg_HostInit();
$hiMsg->setServerMetaData($event->DBServer);
$hiMsg = Scalr_Scripting_Manager::extendMessage($hiMsg, $event, $event->DBServer, $DBServer);
if ($event->DBServer->farmRoleId != 0) {
foreach (Scalr_Role_Behavior::getListForFarmRole($event->DBServer->GetFarmRoleObject()) as $behavior) {
$hiMsg = $behavior->extendMessage($hiMsg, $event->DBServer);
}
}
$hiMsg = $DBServer->SendMessage($hiMsg, false, true);
if (!empty($hiMsg->dbMessageId)) {
$event->msgCreated++;
}
}
}