/**
* Copyright 2017 Netflix, Inc.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.netflix.raigad.startup;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.netflix.raigad.aws.SetVPCSecurityGroupID;
import com.netflix.raigad.aws.UpdateSecuritySettings;
import com.netflix.raigad.aws.UpdateTribeSecuritySettings;
import com.netflix.raigad.backup.RestoreBackupManager;
import com.netflix.raigad.backup.SnapshotBackupManager;
import com.netflix.raigad.configuration.IConfiguration;
import com.netflix.raigad.defaultimpl.IElasticsearchProcess;
import com.netflix.raigad.identity.InstanceManager;
import com.netflix.raigad.indexmanagement.ElasticsearchIndexManager;
import com.netflix.raigad.monitoring.*;
import com.netflix.raigad.scheduler.RaigadScheduler;
import com.netflix.raigad.utils.ElasticsearchProcessMonitor;
import com.netflix.raigad.utils.HttpModule;
import com.netflix.raigad.utils.Sleeper;
import com.netflix.raigad.utils.TuneElasticsearch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Start all tasks here: Property update task, Backup task, Restore task, Incremental backup
*/
@Singleton
public class RaigadServer {
private static final Logger logger = LoggerFactory.getLogger(RaigadServer.class);
private static final int ES_MONITORING_INITIAL_DELAY = 10;
private static final int ES_SNAPSHOT_INITIAL_DELAY = 100;
private static final int ES_HEALTH_MONITOR_DELAY = 600;
private static final int ES_NODE_HEALTH_MONITOR_DELAY = 10;
private final RaigadScheduler scheduler;
private final IConfiguration config;
private final Sleeper sleeper;
private final IElasticsearchProcess esProcess;
private final InstanceManager instanceManager;
private final ElasticsearchIndexManager esIndexManager;
private final SnapshotBackupManager snapshotBackupManager;
private final HttpModule httpModule;
private final SetVPCSecurityGroupID setVPCSecurityGroupID;
@Inject
public RaigadServer(IConfiguration config,
RaigadScheduler scheduler,
HttpModule httpModule,
IElasticsearchProcess esProcess,
Sleeper sleeper,
InstanceManager instanceManager,
ElasticsearchIndexManager esIndexManager,
SnapshotBackupManager snapshotBackupManager,
SetVPCSecurityGroupID setVPCSecurityGroupID) {
this.config = config;
this.scheduler = scheduler;
this.httpModule = httpModule;
this.esProcess = esProcess;
this.sleeper = sleeper;
this.instanceManager = instanceManager;
this.esIndexManager = esIndexManager;
this.snapshotBackupManager = snapshotBackupManager;
this.setVPCSecurityGroupID = setVPCSecurityGroupID;
}
public void initialize() throws Exception {
// Check if it's really needed
if (instanceManager.getInstance().isOutOfService()) {
return;
}
logger.info("Initializing Raigad server now...");
// Start to schedule jobs
scheduler.start();
if (!config.isLocalModeEnabled()) {
if (config.amITribeNode()) {
logger.info("Updating security setting for the tribe node");
if (config.isDeployedInVPC()) {
logger.info("Setting Security Group ID (VPC)");
setVPCSecurityGroupID.execute();
}
// Update security settings
scheduler.runTaskNow(UpdateTribeSecuritySettings.class);
// Sleep for 60 seconds for the SG update to happen
if (UpdateTribeSecuritySettings.firstTimeUpdated) {
sleeper.sleep(60 * 1000);
}
scheduler.addTask(UpdateTribeSecuritySettings.JOB_NAME,
UpdateTribeSecuritySettings.class,
UpdateTribeSecuritySettings.getTimer(instanceManager));
} else {
if (config.isSecutrityGroupInMultiDC()) {
logger.info("Updating security setting");
if (config.isDeployedInVPC()) {
/*
if (config.isVPCMigrationModeEnabled()) {
logger.info("VPC migration mode: updating security settings");
// Update security settings
scheduler.runTaskNow(UpdateSecuritySettings.class);
// Sleep for 60 seconds for the SG update to happen
if (UpdateSecuritySettings.firstTimeUpdated) {
sleeper.sleep(60 * 1000);
}
scheduler.addTask(UpdateSecuritySettings.JOB_NAME,
UpdateSecuritySettings.class,
UpdateSecuritySettings.getTimer(instanceManager));
}
*/
logger.info("Setting Security Group ID (VPC)");
setVPCSecurityGroupID.execute();
}
// Update security settings
scheduler.runTaskNow(UpdateSecuritySettings.class);
// Sleep for 60 seconds for the SG update to happen
if (UpdateSecuritySettings.firstTimeUpdated) {
sleeper.sleep(60 * 1000);
}
scheduler.addTask(UpdateSecuritySettings.JOB_NAME,
UpdateSecuritySettings.class,
UpdateSecuritySettings.getTimer(instanceManager));
}
}
}
// Tune Elasticsearch
scheduler.runTaskNow(TuneElasticsearch.class);
logger.info("Trying to start Elasticsearch now...");
if (!config.doesElasticsearchStartManually()) {
// Start Elasticsearch
esProcess.start(true);
if (config.isRestoreEnabled()) {
scheduler.addTaskWithDelay(RestoreBackupManager.JOBNAME,
RestoreBackupManager.class,
RestoreBackupManager.getTimer(config),
config.getRestoreTaskInitialDelayInSeconds());
}
} else {
logger.info("config.doesElasticsearchStartManually() is set to True," +
"hence Elasticsearch needs to be started manually. " +
"Restore task needs to be started manually as well (if needed).");
}
/*
* Run the delayed task (after 10 seconds) to Monitor Elasticsearch Running Process
*/
scheduler.addTaskWithDelay(ElasticsearchProcessMonitor.JOBNAME, ElasticsearchProcessMonitor.class, ElasticsearchProcessMonitor.getTimer(), ES_MONITORING_INITIAL_DELAY);
/*
* Run Snapshot Backup task
*/
if (config.isAsgBasedDedicatedDeployment()) {
if (config.getASGName().toLowerCase().contains("master")) {
// Run Snapshot task only on Master Nodes
scheduler.addTaskWithDelay(SnapshotBackupManager.JOBNAME, SnapshotBackupManager.class, SnapshotBackupManager.getTimer(config), ES_SNAPSHOT_INITIAL_DELAY);
// Run Index Management task only on Master Nodes
scheduler.addTaskWithDelay(ElasticsearchIndexManager.JOB_NAME, ElasticsearchIndexManager.class, ElasticsearchIndexManager.getTimer(config), config.getAutoCreateIndexInitialStartDelaySeconds());
scheduler.addTaskWithDelay(HealthMonitor.METRIC_NAME, HealthMonitor.class, HealthMonitor.getTimer("HealthMonitor"), ES_HEALTH_MONITOR_DELAY);
} else if (!config.reportMetricsFromMasterOnly()) {
scheduler.addTaskWithDelay(HealthMonitor.METRIC_NAME, HealthMonitor.class, HealthMonitor.getTimer("HealthMonitor"), ES_HEALTH_MONITOR_DELAY);
}
} else {
scheduler.addTaskWithDelay(SnapshotBackupManager.JOBNAME, SnapshotBackupManager.class, SnapshotBackupManager.getTimer(config), ES_SNAPSHOT_INITIAL_DELAY);
scheduler.addTaskWithDelay(ElasticsearchIndexManager.JOB_NAME, ElasticsearchIndexManager.class, ElasticsearchIndexManager.getTimer(config), config.getAutoCreateIndexInitialStartDelaySeconds());
scheduler.addTaskWithDelay(HealthMonitor.METRIC_NAME, HealthMonitor.class, HealthMonitor.getTimer("HealthMonitor"), ES_HEALTH_MONITOR_DELAY);
}
/*
* Starting Monitoring Jobs
*/
scheduler.addTask(ThreadPoolStatsMonitor.METRIC_NAME, ThreadPoolStatsMonitor.class, ThreadPoolStatsMonitor.getTimer("ThreadPoolStatsMonitor"));
scheduler.addTask(TransportStatsMonitor.METRIC_NAME, TransportStatsMonitor.class, TransportStatsMonitor.getTimer("TransportStatsMonitor"));
scheduler.addTask(NodeIndicesStatsMonitor.METRIC_NAME, NodeIndicesStatsMonitor.class, NodeIndicesStatsMonitor.getTimer("NodeIndicesStatsMonitor"));
scheduler.addTask(FsStatsMonitor.METRIC_NAME, FsStatsMonitor.class, FsStatsMonitor.getTimer("FsStatsMonitor"));
// TODO: 2X: Determine if this is necessary and if yes find an alternative
//scheduler.addTask(NetworkStatsMonitor.METRIC_NAME, NetworkStatsMonitor.class, NetworkStatsMonitor.getTimer("NetworkStatsMonitor"));
scheduler.addTask(JvmStatsMonitor.METRIC_NAME, JvmStatsMonitor.class, JvmStatsMonitor.getTimer("JvmStatsMonitor"));
scheduler.addTask(OsStatsMonitor.METRIC_NAME, OsStatsMonitor.class, OsStatsMonitor.getTimer("OsStatsMonitor"));
scheduler.addTask(ProcessStatsMonitor.METRIC_NAME, ProcessStatsMonitor.class, ProcessStatsMonitor.getTimer("ProcessStatsMonitor"));
scheduler.addTask(HttpStatsMonitor.METRIC_NAME, HttpStatsMonitor.class, HttpStatsMonitor.getTimer("HttpStatsMonitor"));
scheduler.addTask(AllCircuitBreakerStatsMonitor.METRIC_NAME, AllCircuitBreakerStatsMonitor.class, AllCircuitBreakerStatsMonitor.getTimer("AllCircuitBreakerStatsMonitor"));
scheduler.addTask(SnapshotBackupMonitor.METRIC_NAME, SnapshotBackupMonitor.class, SnapshotBackupMonitor.getTimer("SnapshotBackupMonitor"));
scheduler.addTaskWithDelay(NodeHealthMonitor.METRIC_NAME, NodeHealthMonitor.class, NodeHealthMonitor.getTimer("NodeHealthMonitor"), ES_NODE_HEALTH_MONITOR_DELAY);
}
public InstanceManager getInstanceManager() {
return instanceManager;
}
public RaigadScheduler getScheduler() {
return scheduler;
}
public IConfiguration getConfiguration() {
return config;
}
}