blob: b9cba99f43dee8af50acf6c3905ea082314aa7be [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 org.apache.ignite.mesos;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.ignite.mesos.resource.IgniteProvider;
import org.apache.ignite.mesos.resource.JettyServer;
import org.apache.ignite.mesos.resource.ResourceHandler;
import org.apache.ignite.mesos.resource.ResourceProvider;
import org.apache.mesos.MesosSchedulerDriver;
import org.apache.mesos.Protos;
import org.apache.mesos.Scheduler;
/**
* Ignite mesos framework.
*/
public class IgniteFramework {
/** */
private static final Logger log = Logger.getLogger(IgniteFramework.class.getSimpleName());
/** Framework name. */
private static final String IGNITE_FRAMEWORK_NAME = "Ignite";
/** MESOS system environment name */
private static final String MESOS_USER_NAME = "MESOS_USER";
/** MESOS system environment role */
private static final String MESOS_ROLE = "MESOS_ROLE";
/** */
private static final String MESOS_AUTHENTICATE = "MESOS_AUTHENTICATE";
/** */
private static final String DEFAULT_PRINCIPAL = "DEFAULT_PRINCIPAL";
/** */
private static final String DEFAULT_SECRET = "DEFAULT_SECRET";
/** */
private static final String MESOS_CHECKPOINT = "MESOS_CHECKPOINT";
/**
* Main methods has only one optional parameter - path to properties files.
*
* @param args Args.
* @throws Exception If failed.
*/
public static void main(String[] args) throws Exception {
IgniteFramework igniteFramework = new IgniteFramework();
ClusterProperties clusterProps = ClusterProperties.from(args.length >= 1 ? args[0] : null);
String baseUrl = String.format("http://%s:%d", clusterProps.httpServerHost(), clusterProps.httpServerPort());
JettyServer httpSrv = new JettyServer();
httpSrv.start(
new ResourceHandler(clusterProps.userLibs(), clusterProps.igniteCfg(), clusterProps.igniteWorkDir()),
clusterProps
);
ResourceProvider provider = new ResourceProvider();
IgniteProvider igniteProvider = new IgniteProvider(clusterProps.igniteWorkDir());
provider.init(clusterProps, igniteProvider, baseUrl);
// Create the scheduler.
Scheduler scheduler = new IgniteScheduler(clusterProps, provider);
// Create the driver.
MesosSchedulerDriver driver;
if (System.getenv(MESOS_AUTHENTICATE) != null) {
log.info("Enabling authentication for the framework");
if (System.getenv(DEFAULT_PRINCIPAL) == null) {
log.log(Level.SEVERE, "Expecting authentication principal in the environment");
System.exit(1);
}
if (System.getenv(DEFAULT_SECRET) == null) {
log.log(Level.SEVERE, "Expecting authentication secret in the environment");
System.exit(1);
}
Protos.Credential cred = Protos.Credential.newBuilder()
.setPrincipal(System.getenv(DEFAULT_PRINCIPAL))
.setSecret(System.getenv(DEFAULT_SECRET))
.build();
driver = new MesosSchedulerDriver(scheduler, igniteFramework.getFrameworkInfo(), clusterProps.masterUrl(),
cred);
}
else
driver = new MesosSchedulerDriver(scheduler, igniteFramework.getFrameworkInfo(), clusterProps.masterUrl());
int status = driver.run() == Protos.Status.DRIVER_STOPPED ? 0 : 1;
httpSrv.stop();
// Ensure that the driver process terminates.
driver.stop();
System.exit(status);
}
/**
* @return Mesos Protos FrameworkInfo.
*/
public Protos.FrameworkInfo getFrameworkInfo() throws Exception {
final int frameworkFailoverTimeout = 0;
Protos.FrameworkInfo.Builder frameworkBuilder = Protos.FrameworkInfo.newBuilder()
.setName(IGNITE_FRAMEWORK_NAME)
.setUser(getUser())
.setRole(getRole())
.setFailoverTimeout(frameworkFailoverTimeout);
if (System.getenv(MESOS_CHECKPOINT) != null) {
log.info("Enabling checkpoint for the framework");
frameworkBuilder.setCheckpoint(true);
}
if (System.getenv(MESOS_AUTHENTICATE) != null)
frameworkBuilder.setPrincipal(System.getenv(DEFAULT_PRINCIPAL));
else
frameworkBuilder.setPrincipal("ignite-framework-java");
return frameworkBuilder.build();
}
/**
* @return Mesos user name value.
*/
protected String getUser() {
String userName = System.getenv(MESOS_USER_NAME);
return userName != null ? userName : "";
}
/**
* @return Mesos role value.
*/
protected String getRole() {
String mesosRole = System.getenv(MESOS_ROLE);
return isRoleValid(mesosRole) ? mesosRole : "*";
}
/**
* @return Result of Mesos role validation.
*/
static boolean isRoleValid(String mRole) {
if (mRole == null || mRole.isEmpty() || mRole.equals(".") || mRole.equals("..") ||
mRole.startsWith("-") || mRole.contains("/") || mRole.contains("\\") || mRole.contains(" ")) {
log.severe("Provided mesos role is not valid: [" + mRole +
"]. Mesos role should be a valid directory name.");
return false;
}
return true;
}
}