Scalr\Observer\MessagingEventObserver::OnHostInit PHP Метод

OnHostInit() публичный Метод

См. также: Scalr\Observer\AbstractEventObserver::OnHostInit()
public OnHostInit ( HostInitEvent $event )
$event HostInitEvent
    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++;
            }
        }
    }