http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ArgOps.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ArgOps.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ArgOps.java new file mode 100644 index 0000000..f7b7349 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ArgOps.java @@ -0,0 +1,156 @@ +/* + * 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.hadoop.yarn.service.client.params; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.slider.core.exceptions.BadCommandArgumentsException; +import org.apache.slider.core.exceptions.ErrorStrings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Static argument manipulation operations + */ +public class ArgOps { + + private static final Logger + log = LoggerFactory.getLogger(ArgOps.class); + + /** + * create a 3-tuple + */ + public static List<Object> triple(String msg, int min, int max) { + List<Object> l = new ArrayList<>(3); + l.add(msg); + l.add(min); + l.add(max); + return l; + } + + public static void applyFileSystemBinding(String filesystemBinding, + Configuration conf) { + if (filesystemBinding != null) { + //filesystem argument was set -this overwrites any defaults in the + //configuration + FileSystem.setDefaultUri(conf, filesystemBinding); + } + } + + public static void splitPairs(Collection<String> pairs, + Map<String, String> dest) { + for (String prop : pairs) { + String[] keyval = prop.split("=", 2); + if (keyval.length == 2) { + dest.put(keyval[0], keyval[1]); + } + } + } + + + public static void applyDefinitions(Map<String, String> definitionMap, + Configuration conf) { + for (Map.Entry<String, String> entry : definitionMap.entrySet()) { + String key = entry.getKey(); + String val = entry.getValue(); + log.debug("configuration[{}]<=\"{}\"", key, val); + conf.set(key, val, "command line"); + } + } + + /** + * Create a map from a tuple list like ['worker','2','master','1] into a map + * ['worker':'2',"master":'1']; + * Duplicate entries also trigger errors + * @param description description for errors + * @param list list to conver to tuples + * @return the map of key value pairs -unordered. + * @throws BadCommandArgumentsException odd #of arguments received + */ + public static Map<String, String> convertTupleListToMap(String description, + List<String> list) throws + BadCommandArgumentsException { + Map<String, String> results = new HashMap<>(); + if (list != null && !list.isEmpty()) { + int size = list.size(); + if (size % 2 != 0) { + //odd number of elements, not permitted + throw new BadCommandArgumentsException( + ErrorStrings.ERROR_PARSE_FAILURE + description); + } + for (int count = 0; count < size; count += 2) { + String key = list.get(count); + String val = list.get(count + 1); + if (results.get(key) != null) { + throw new BadCommandArgumentsException( + ErrorStrings.ERROR_DUPLICATE_ENTRY + description + + ": " + key); + } + results.put(key, val); + } + } + return results; + } + + /** + * Create a map from a tuple list like + * ['worker','heapsize','5G','master','heapsize','2M'] into a map + * ['worker':'2',"master":'1']; + * Duplicate entries also trigger errors + + * @throws BadCommandArgumentsException odd #of arguments received + */ + public static Map<String, Map<String, String>> convertTripleListToMaps(String description, + List<String> list) throws BadCommandArgumentsException { + + Map<String, Map<String, String>> results = new HashMap<>(); + if (list != null && !list.isEmpty()) { + int size = list.size(); + if (size % 3 != 0) { + //wrong number of elements, not permitted + throw new BadCommandArgumentsException( + ErrorStrings.ERROR_PARSE_FAILURE + description); + } + for (int count = 0; count < size; count += 3) { + String role = list.get(count); + String key = list.get(count + 1); + String val = list.get(count + 2); + Map<String, String> roleMap = results.get(role); + if (roleMap == null) { + //demand create new role map + roleMap = new HashMap<>(); + results.put(role, roleMap); + } + if (roleMap.get(key) != null) { + throw new BadCommandArgumentsException( + ErrorStrings.ERROR_DUPLICATE_ENTRY + description + + ": for key " + key + " under " + role); + } + roleMap.put(key, val); + } + } + return results; + } +}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/Arguments.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/Arguments.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/Arguments.java new file mode 100644 index 0000000..d8d8ab4 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/Arguments.java @@ -0,0 +1,138 @@ +/* + * 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.hadoop.yarn.service.client.params; + +/** + * Here are all the arguments that may be parsed by the client or server + * command lines. + * + * Important: Please keep the main list in alphabetical order + * so it is easier to see what arguments are there + */ +public interface Arguments { + String ARG_ADDON = "--addon"; + String ARG_ALL = "--all"; + String ARG_ALIAS = "--alias"; + String ARG_APPLICATION = "--application"; + String ARG_APPDEF = "--appdef"; + String ARG_APP_HOME = "--apphome"; + String ARG_BASE_PATH = "--basepath"; + String ARG_CLIENT = "--client"; + String ARG_CONFDIR = "--appconf"; + String ARG_COMPONENT = "--component"; + String ARG_COUNT = "--count"; + String ARG_COMPONENT_SHORT = "--comp"; + String ARG_COMPONENTS = "--components"; + String ARG_COMP_OPT= "--compopt"; + String ARG_COMP_OPT_SHORT = "--co"; + String ARG_CONFIG = "--config"; + String ARG_CONTAINERS = "--containers"; + String ARG_CREDENTIALS = "--credentials"; + String ARG_DEBUG = "--debug"; + String ARG_DEFINE = "-D"; + String ARG_DELETE = "--delete"; + String ARG_DEST = "--dest"; + String ARG_DESTDIR = "--destdir"; + String ARG_DESTFILE = "--destfile"; + String ARG_EXITCODE = "--exitcode"; + String ARG_FAIL = "--fail"; + /** + filesystem-uri: {@value} + */ + String ARG_FILESYSTEM = "--fs"; + String ARG_FILESYSTEM_LONG = "--filesystem"; + String ARG_FOLDER = "--folder"; + String ARG_FORCE = "--force"; + String ARG_FORMAT = "--format"; + String ARG_GETCERTSTORE = "--getcertstore"; + String ARG_GETCONF = "--getconf"; + String ARG_GETEXP = "--getexp"; + String ARG_GETFILES = "--getfiles"; + String ARG_HEALTHY= "--healthy"; + String ARG_HELP = "--help"; + String ARG_HOSTNAME = "--hostname"; + String ARG_ID = "--id"; + String ARG_IMAGE = "--image"; + String ARG_INSTALL = "--install"; + String ARG_INTERNAL = "--internal"; + String ARG_KEYLEN = "--keylen"; + String ARG_KEYTAB = "--keytab"; + String ARG_KEYSTORE = "--keystore"; + String ARG_KEYTABINSTALL = ARG_INSTALL; + String ARG_KEYTABDELETE = ARG_DELETE; + String ARG_KEYTABLIST = "--list"; + String ARG_LABEL = "--label"; + String ARG_LEVEL = "--level"; + String ARG_LIST = "--list"; + String ARG_LISTCONF = "--listconf"; + String ARG_LISTEXP = "--listexp"; + String ARG_LISTFILES = "--listfiles"; + String ARG_LIVE = "--live"; + String ARG_MANAGER = "--manager"; + String ARG_MANAGER_SHORT = "--m"; + String ARG_MESSAGE = "--message"; + String ARG_METAINFO = "--metainfo"; + String ARG_METAINFO_JSON = "--metainfojson"; + String ARG_NAME = "--name"; + String ARG_OPTION = "--option"; + String ARG_OPTION_SHORT = "-O"; + String ARG_OUTPUT = "--out"; + String ARG_OUTPUT_SHORT = "-o"; + String ARG_OVERWRITE = "--overwrite"; + String ARG_PACKAGE = "--package"; + String ARG_PASSWORD = "--password"; + String ARG_PATH = "--path"; + String ARG_PKGDELETE = ARG_DELETE; + String ARG_PKGINSTANCES = "--instances"; + String ARG_PKGLIST = ARG_LIST; + String ARG_PRINCIPAL = "--principal"; + String ARG_PROVIDER = "--provider"; + String ARG_QUEUE = "--queue"; + String ARG_LIFETIME = "--lifetime"; + String ARG_REPLACE_PKG = "--replacepkg"; + String ARG_RESOURCE = "--resource"; + String ARG_RESOURCE_MANAGER = "--rm"; + String ARG_SECURE = "--secure"; + String ARG_SERVICETYPE = "--servicetype"; + String ARG_SERVICES = "--services"; + String ARG_SLIDER = "--slider"; + String ARG_SOURCE = "--source"; + String ARG_STATE = "--state"; + String ARG_SYSPROP = "-S"; + String ARG_TRUSTSTORE = "--truststore"; + String ARG_USER = "--user"; + String ARG_UPLOAD = "--upload"; + String ARG_VERBOSE = "--verbose"; + String ARG_VERSION = "--version"; + String ARG_WAIT = "--wait"; + String ARG_YARN = "--yarn"; + String ARG_ZKHOSTS = "--zkhosts"; + String ARG_ZKPATH = "--zkpath"; + String ARG_ZKPORT = "--zkport"; +/* + STOP: DO NOT ADD YOUR ARGUMENTS HERE. GO BACK AND INSERT THEM IN THE + RIGHT PLACE IN THE LIST + */ + + /** + * server: URI for the cluster + */ + String ARG_CLUSTER_URI = "-cluster-uri"; + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ClientArgs.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ClientArgs.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ClientArgs.java new file mode 100644 index 0000000..e85db58 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ClientArgs.java @@ -0,0 +1,383 @@ +/* + * 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.hadoop.yarn.service.client.params; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.service.conf.SliderXmlConfKeys; +import org.apache.slider.common.params.AbstractClusterBuildingActionArgs; +import org.apache.slider.common.params.ActionAMSuicideArgs; +import org.apache.slider.common.params.ActionClientArgs; +import org.apache.slider.common.params.ActionDiagnosticArgs; +import org.apache.slider.common.params.ActionExistsArgs; +import org.apache.slider.common.params.ActionFreezeArgs; +import org.apache.slider.common.params.ActionHelpArgs; +import org.apache.slider.common.params.ActionKDiagArgs; +import org.apache.slider.common.params.ActionKeytabArgs; +import org.apache.slider.common.params.ActionKillContainerArgs; +import org.apache.slider.common.params.ActionListArgs; +import org.apache.slider.common.params.ActionLookupArgs; +import org.apache.slider.common.params.ActionNodesArgs; +import org.apache.slider.common.params.ActionRegistryArgs; +import org.apache.slider.common.params.ActionResolveArgs; +import org.apache.slider.common.params.ActionResourceArgs; +import org.apache.slider.common.params.ActionStatusArgs; +import org.apache.slider.common.params.ActionThawArgs; +import org.apache.slider.common.params.ActionTokensArgs; +import org.apache.slider.common.params.ActionUpdateArgs; +import org.apache.slider.common.params.ActionUpgradeArgs; +import org.apache.slider.common.params.ActionVersionArgs; +import org.apache.slider.common.tools.SliderUtils; +import org.apache.slider.core.exceptions.BadCommandArgumentsException; +import org.apache.slider.core.exceptions.ErrorStrings; +import org.apache.slider.core.exceptions.SliderException; + +import java.util.Collection; + +/** + * Slider Client CLI Args + */ + +public class ClientArgs extends CommonArgs { + + /* + + All the arguments for specific actions + + */ + /** + * This is not bonded to jcommander, it is set up + * after the construction to point to the relevant + * entry + * + * KEEP IN ALPHABETICAL ORDER + */ + private AbstractClusterBuildingActionArgs buildingActionArgs; + + // ========================================================= + // Keep all of these in alphabetical order. Thanks. + // ========================================================= + + private final ActionAMSuicideArgs actionAMSuicideArgs = new ActionAMSuicideArgs(); + private final ActionBuildArgs actionBuildArgs = new ActionBuildArgs(); + private final ActionClientArgs actionClientArgs = new ActionClientArgs(); + private final ActionCreateArgs actionCreateArgs = new ActionCreateArgs(); + private final ActionDependencyArgs actionDependencyArgs = new ActionDependencyArgs(); + private final ActionDestroyArgs actionDestroyArgs = new ActionDestroyArgs(); + private final ActionDiagnosticArgs actionDiagnosticArgs = new ActionDiagnosticArgs(); + private final ActionExistsArgs actionExistsArgs = new ActionExistsArgs(); + private final ActionFlexArgs actionFlexArgs = new ActionFlexArgs(); + private final ActionFreezeArgs actionFreezeArgs = new ActionFreezeArgs(); + private final ActionHelpArgs actionHelpArgs = new ActionHelpArgs(); + private final ActionKDiagArgs actionKDiagArgs = new ActionKDiagArgs(); + private final ActionKeytabArgs actionKeytabArgs = new ActionKeytabArgs(); + private final ActionKillContainerArgs actionKillContainerArgs = + new ActionKillContainerArgs(); + private final ActionListArgs actionListArgs = new ActionListArgs(); + private final ActionLookupArgs actionLookupArgs = new ActionLookupArgs(); + private final ActionNodesArgs actionNodesArgs = new ActionNodesArgs(); + private final ActionRegistryArgs actionRegistryArgs = new ActionRegistryArgs(); + private final ActionResolveArgs actionResolveArgs = new ActionResolveArgs(); + private final ActionResourceArgs actionResourceArgs = new ActionResourceArgs(); + private final ActionStatusArgs actionStatusArgs = new ActionStatusArgs(); + private final ActionThawArgs actionThawArgs = new ActionThawArgs(); + private final ActionTokensArgs actionTokenArgs = new ActionTokensArgs(); + private final ActionUpdateArgs actionUpdateArgs = new ActionUpdateArgs(); + private final ActionUpgradeArgs actionUpgradeArgs = new ActionUpgradeArgs(); + private final ActionVersionArgs actionVersionArgs = new ActionVersionArgs(); + + public ClientArgs(String[] args) { + super(args); + } + + public ClientArgs(Collection args) { + super(args); + } + + @Override + protected void addActionArguments() { + + addActions( + actionAMSuicideArgs, + actionBuildArgs, + actionClientArgs, + actionCreateArgs, + actionDependencyArgs, + actionDestroyArgs, + actionDiagnosticArgs, + actionExistsArgs, + actionFlexArgs, + actionFreezeArgs, + actionHelpArgs, + actionKDiagArgs, + actionKeytabArgs, + actionKillContainerArgs, + actionListArgs, + actionLookupArgs, + actionNodesArgs, + actionRegistryArgs, + actionResolveArgs, + actionResourceArgs, + actionStatusArgs, + actionThawArgs, + actionTokenArgs, + actionUpdateArgs, + actionUpgradeArgs, + actionVersionArgs + ); + } + + @Override + public void applyDefinitions(Configuration conf) throws + BadCommandArgumentsException { + super.applyDefinitions(conf); + //RM + if (getManager() != null) { + log.debug("Setting RM to {}", getManager()); + conf.set(YarnConfiguration.RM_ADDRESS, getManager()); + } + if (getBasePath() != null) { + log.debug("Setting basePath to {}", getBasePath()); + conf.set(SliderXmlConfKeys.KEY_SLIDER_BASE_PATH, + getBasePath().toString()); + } + } + + public ActionDiagnosticArgs getActionDiagnosticArgs() { + return actionDiagnosticArgs; + } + + public AbstractClusterBuildingActionArgs getBuildingActionArgs() { + return buildingActionArgs; + } + + public ActionAMSuicideArgs getActionAMSuicideArgs() { + return actionAMSuicideArgs; + } + + public ActionBuildArgs getActionBuildArgs() { + return actionBuildArgs; + } + + public ActionClientArgs getActionClientArgs() { return actionClientArgs; } + + public ActionKDiagArgs getActionKDiagArgs() { + return actionKDiagArgs; + } + + public ActionKeytabArgs getActionKeytabArgs() { return actionKeytabArgs; } + + public ActionUpdateArgs getActionUpdateArgs() { + return actionUpdateArgs; + } + + public ActionUpgradeArgs getActionUpgradeArgs() { + return actionUpgradeArgs; + } + + public ActionCreateArgs getActionCreateArgs() { + return actionCreateArgs; + } + + public ActionDependencyArgs getActionDependencyArgs() { + return actionDependencyArgs; + } + + public ActionDestroyArgs getActionDestroyArgs() { + return actionDestroyArgs; + } + + public ActionExistsArgs getActionExistsArgs() { + return actionExistsArgs; + } + + public ActionFlexArgs getActionFlexArgs() { + return actionFlexArgs; + } + + public ActionFreezeArgs getActionFreezeArgs() { + return actionFreezeArgs; + } + + public ActionKillContainerArgs getActionKillContainerArgs() { + return actionKillContainerArgs; + } + + public ActionListArgs getActionListArgs() { + return actionListArgs; + } + + public ActionNodesArgs getActionNodesArgs() { + return actionNodesArgs; + } + + public ActionLookupArgs getActionLookupArgs() { + return actionLookupArgs; + } + + public ActionRegistryArgs getActionRegistryArgs() { + return actionRegistryArgs; + } + + public ActionResolveArgs getActionResolveArgs() { + return actionResolveArgs; + } + + public ActionResourceArgs getActionResourceArgs() { + return actionResourceArgs; + } + + public ActionStatusArgs getActionStatusArgs() { + return actionStatusArgs; + } + + public ActionThawArgs getActionThawArgs() { + return actionThawArgs; + } + + public ActionTokensArgs getActionTokenArgs() { + return actionTokenArgs; + } + + /** + * Look at the chosen action and bind it as the core action for the operation. + * @throws SliderException bad argument or similar + */ + @Override + public void applyAction() throws SliderException { + String action = getAction(); + if (SliderUtils.isUnset(action)) { + action = ACTION_HELP; + } + switch (action) { + case ACTION_BUILD: + bindCoreAction(actionBuildArgs); + //its a builder, so set those actions too + buildingActionArgs = actionBuildArgs; + break; + + case ACTION_CREATE: + bindCoreAction(actionCreateArgs); + //its a builder, so set those actions too + buildingActionArgs = actionCreateArgs; + break; + + case ACTION_STOP: + bindCoreAction(actionFreezeArgs); + break; + + case ACTION_START: + bindCoreAction(actionThawArgs); + break; + + case ACTION_AM_SUICIDE: + bindCoreAction(actionAMSuicideArgs); + break; + + case ACTION_CLIENT: + bindCoreAction(actionClientArgs); + break; + + case ACTION_DEPENDENCY: + bindCoreAction(actionDependencyArgs); + break; + + case ACTION_DESTROY: + bindCoreAction(actionDestroyArgs); + break; + + case ACTION_DIAGNOSTICS: + bindCoreAction(actionDiagnosticArgs); + break; + + case ACTION_EXISTS: + bindCoreAction(actionExistsArgs); + break; + + case ACTION_FLEX: + bindCoreAction(actionFlexArgs); + break; + + case ACTION_HELP: + bindCoreAction(actionHelpArgs); + break; + + case ACTION_KDIAG: + bindCoreAction(actionKDiagArgs); + break; + + case ACTION_KEYTAB: + bindCoreAction(actionKeytabArgs); + break; + + case ACTION_KILL_CONTAINER: + bindCoreAction(actionKillContainerArgs); + break; + + case ACTION_LIST: + bindCoreAction(actionListArgs); + break; + + case ACTION_LOOKUP: + bindCoreAction(actionLookupArgs); + break; + + case ACTION_NODES: + bindCoreAction(actionNodesArgs); + break; + + case ACTION_REGISTRY: + bindCoreAction(actionRegistryArgs); + break; + + case ACTION_RESOLVE: + bindCoreAction(actionResolveArgs); + break; + + case ACTION_RESOURCE: + bindCoreAction(actionResourceArgs); + break; + + case ACTION_STATUS: + bindCoreAction(actionStatusArgs); + break; + + case ACTION_TOKENS: + bindCoreAction(actionTokenArgs); + break; + + case ACTION_UPDATE: + bindCoreAction(actionUpdateArgs); + break; + + case ACTION_UPGRADE: + bindCoreAction(actionUpgradeArgs); + break; + + case ACTION_VERSION: + bindCoreAction(actionVersionArgs); + break; + + default: + throw new BadCommandArgumentsException(ErrorStrings.ERROR_UNKNOWN_ACTION + + " " + action); + } + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/CommonArgs.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/CommonArgs.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/CommonArgs.java new file mode 100644 index 0000000..3160512 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/CommonArgs.java @@ -0,0 +1,294 @@ +/* + * 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.hadoop.yarn.service.client.params; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.ParameterDescription; +import com.beust.jcommander.ParameterException; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.Path; +import org.apache.slider.common.tools.SliderUtils; +import org.apache.slider.core.exceptions.BadCommandArgumentsException; +import org.apache.slider.core.exceptions.ErrorStrings; +import org.apache.slider.core.exceptions.SliderException; +import org.apache.slider.core.exceptions.UsageException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This class contains the common argument set for all tne entry points, + * and the core parsing logic to verify that the action is on the list + * of allowed actions -and that the remaining number of arguments is + * in the range allowed + */ + +public abstract class CommonArgs extends ArgOps implements SliderActions, + Arguments { + + protected static final Logger log = LoggerFactory.getLogger(CommonArgs.class); + + + private static final int DIFF_BETWEEN_DESCIPTION_AND_COMMAND_NAME = 30; + + + @Parameter(names = ARG_HELP, help = true) + public boolean help; + + + /** + -D name=value + + Define an HBase configuration option which overrides any options in + the configuration XML files of the image or in the image configuration + directory. The values will be persisted. + Configuration options are only passed to the cluster when creating or reconfiguring a cluster. + + */ + + public Map<String, String> definitionMap = new HashMap<String, String>(); + /** + * System properties + */ + public Map<String, String> syspropsMap = new HashMap<String, String>(); + + + /** + * fields + */ + public final JCommander commander; + private final String[] args; + + private AbstractActionArgs coreAction; + + /** + * get the name: relies on arg 1 being the cluster name in all operations + * @return the name argument, null if there is none + */ + public String getClusterName() { + return coreAction.getClusterName(); + } + + protected CommonArgs(String[] args) { + this.args = args; + commander = new JCommander(this); + } + + protected CommonArgs(Collection args) { + List<String> argsAsStrings = SliderUtils.collectionToStringList(args); + this.args = argsAsStrings.toArray(new String[argsAsStrings.size()]); + commander = new JCommander(this); + } + + public String usage() { + return usage(this, null); + } + + public static String usage(CommonArgs serviceArgs, String commandOfInterest) { + String result = null; + StringBuilder helperMessage = new StringBuilder(); + if (commandOfInterest == null) { + // JCommander.usage is too verbose for a command with many options like + // slider no short version of that is found Instead, we compose our msg by + helperMessage.append("\nUsage: slider COMMAND [options]\n"); + helperMessage.append("where COMMAND is one of\n"); + for (String jcommand : serviceArgs.commander.getCommands().keySet()) { + helperMessage.append(String.format("\t%-" + + DIFF_BETWEEN_DESCIPTION_AND_COMMAND_NAME + "s%s", jcommand, + serviceArgs.commander.getCommandDescription(jcommand) + "\n")); + } + helperMessage + .append("Most commands print help when invoked without parameters or with --help"); + result = helperMessage.toString(); + } else { + helperMessage.append("\nUsage: slider ").append(commandOfInterest); + helperMessage.append(serviceArgs.coreAction.getMinParams() > 0 ? " <application>" : ""); + helperMessage.append("\n"); + for (ParameterDescription paramDesc : serviceArgs.commander.getCommands() + .get(commandOfInterest).getParameters()) { + String optional = paramDesc.getParameter().required() ? " (required)" + : " (optional)"; + String paramName = paramDesc.getParameterized().getType() == Boolean.TYPE ? paramDesc + .getLongestName() : paramDesc.getLongestName() + " <" + + paramDesc.getParameterized().getName() + ">"; + helperMessage.append(String.format("\t%-" + + DIFF_BETWEEN_DESCIPTION_AND_COMMAND_NAME + "s%s", paramName, + paramDesc.getDescription() + optional + "\n")); + result = helperMessage.toString(); + } + } + return result; + } + + public static String usage(CommonArgs serviceArgs) { + return usage(serviceArgs, null); + } + + /** + * Parse routine -includes registering the action-specific argument classes + * and postprocess it + * @throws SliderException on any problem + */ + public void parse() throws SliderException { + addActionArguments(); + try { + commander.parse(args); + } catch (ParameterException e) { + throw new BadCommandArgumentsException(e, "%s in %s", + e.toString(), + (args != null + ? (SliderUtils.join(args, + " ", false)) + : "[]")); + } + //now copy back to this class some of the attributes that are common to all + //actions + postProcess(); + } + + /** + * Add a command + * @param name action + * @param arg value + */ + protected void addAction(String name, Object arg) { + commander.addCommand(name, arg); + } + + protected void addActions(Object... actions) { + for (Object action : actions) { + commander.addCommand(action); + } + } + + /** + * Override point to add a set of actions + */ + protected void addActionArguments() { + + } + + /** + * validate args via {@link #validate()} + * then postprocess the arguments + */ + public void postProcess() throws SliderException { + applyAction(); + validate(); + + //apply entry set + for (Map.Entry<String, String> entry : syspropsMap.entrySet()) { + System.setProperty(entry.getKey(), entry.getValue()); + } + } + + + /** + * Implementors must implement their action apply routine here + */ + public abstract void applyAction() throws SliderException; + + + /** + * Bind the core action; this extracts any attributes that are used + * across routines + * @param action action to bind + */ + protected void bindCoreAction(AbstractActionArgs action) { + coreAction = action; + + splitPairs(coreAction.definitions, definitionMap); + splitPairs(coreAction.sysprops, syspropsMap); + } + + /** + * Get the core action -type depends on the action + * @return the action class + */ + public AbstractActionArgs getCoreAction() { + return coreAction; + } + + /** + * Validate the arguments against the action requested + */ + public void validate() throws BadCommandArgumentsException, UsageException { + if (coreAction == null) { + throw new UsageException(ErrorStrings.ERROR_NO_ACTION + usage()); + } + log.debug("action={}", getAction()); + // let the action validate itself + try { + coreAction.validate(); + } catch (BadCommandArgumentsException e) { + String badArgMsgBuilder = + e.toString() + "\n" + usage(this, coreAction.getActionName()); + throw new BadCommandArgumentsException(badArgMsgBuilder); + } + } + + /** + * Apply all the definitions on the command line to the configuration + * @param conf config + */ + public void applyDefinitions(Configuration conf) throws + BadCommandArgumentsException { + applyDefinitions(definitionMap, conf); + } + + + /** + * If the Filesystem binding was provided, it overrides anything in + * the configuration + * @param conf configuration + */ + public void applyFileSystemBinding(Configuration conf) { + ArgOps.applyFileSystemBinding(getFilesystemBinding(), conf); + } + + public boolean isDebug() { + return coreAction.debug; + } + + + public String getFilesystemBinding() { + return coreAction.filesystemBinding; + } + + public Path getBasePath() { return coreAction.basePath; } + + public String getManager() { + return coreAction.manager; + } + + public String getAction() { + return commander.getParsedCommand(); + } + + public List<String> getActionArgs() { + return coreAction.parameters; + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ComponentArgsDelegate.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ComponentArgsDelegate.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ComponentArgsDelegate.java new file mode 100644 index 0000000..0bdf58e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/ComponentArgsDelegate.java @@ -0,0 +1,54 @@ +/* + * 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.hadoop.yarn.service.client.params; + +import com.beust.jcommander.Parameter; +import org.apache.slider.common.params.AbstractArgsDelegate; +import org.apache.slider.common.params.DontSplitArguments; +import org.apache.slider.core.exceptions.BadCommandArgumentsException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ComponentArgsDelegate extends AbstractArgsDelegate { + + /** + * This is a listing of the roles to create + */ + @Parameter(names = {ARG_COMPONENT, ARG_COMPONENT_SHORT}, + arity = 2, + description = "--component <name> <count> e.g. +1 incr by 1, -2 decr by 2, and 3 makes final count 3", + splitter = DontSplitArguments.class) + public List<String> componentTuples = new ArrayList<>(0); + + + /** + * Get the role mapping (may be empty, but never null) + * @return role mapping + * @throws BadCommandArgumentsException parse problem + */ + public Map<String, String> getComponentMap() throws BadCommandArgumentsException { + return convertTupleListToMap("component", componentTuples); + } + + public List<String> getComponentTuples() { + return componentTuples; + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMArgs.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMArgs.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMArgs.java new file mode 100644 index 0000000..1c38213 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMArgs.java @@ -0,0 +1,57 @@ +/* + * 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.hadoop.yarn.service.client.params; + +/** + * Parameters sent by the Client to the AM + */ +public class SliderAMArgs extends CommonArgs { + + SliderAMCreateAction createAction = new SliderAMCreateAction(); + + public SliderAMArgs(String[] args) { + super(args); + } + + @Override + protected void addActionArguments() { + addActions(createAction); + } + + public String getImage() { + return createAction.image; + } + + /** + * This is the URI in the FS to the Slider cluster; the conf file (and any + * other cluster-specifics) can be picked up here + */ + public String getAppDefPath() { + return createAction.sliderClusterURI; + } + + /** + * Am binding is simple: there is only one action + */ + @Override + public void applyAction() { + bindCoreAction(createAction); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMCreateAction.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMCreateAction.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMCreateAction.java new file mode 100644 index 0000000..1853229 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderAMCreateAction.java @@ -0,0 +1,77 @@ +/* + * 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.hadoop.yarn.service.client.params; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.ParametersDelegate; +import org.apache.hadoop.yarn.service.client.params.AbstractActionArgs; +import org.apache.hadoop.yarn.service.client.params.SliderActions; +import org.apache.slider.common.params.LaunchArgsAccessor; +import org.apache.slider.common.params.LaunchArgsDelegate; + +import java.io.File; + + +@Parameters(commandNames = { SliderActions.ACTION_CREATE}, + commandDescription = SliderActions.DESCRIBE_ACTION_CREATE) + +public class SliderAMCreateAction extends AbstractActionArgs implements + LaunchArgsAccessor { + + + @Override + public String getActionName() { + return SliderActions.ACTION_CREATE; + } + + @Parameter(names = ARG_IMAGE, description = "image", required = false) + public String image; + + /** + * This is the URI in the FS to the Slider cluster; the conf file (and any + * other cluster-specifics) can be picked up here + */ + @Parameter(names = ARG_CLUSTER_URI, + description = "URI to the Slider cluster", required = true) + public String sliderClusterURI; + + @ParametersDelegate LaunchArgsDelegate launchArgs = new LaunchArgsDelegate(); + + @Override + public String getRmAddress() { + return launchArgs.getRmAddress(); + } + + @Override + public int getWaittime() { + return launchArgs.getWaittime(); + } + + @Override + public void setWaittime(int waittime) { + launchArgs.setWaittime(waittime); + } + + @Override + public File getOutputFile() { + return launchArgs.getOutputFile(); + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderActions.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderActions.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderActions.java new file mode 100644 index 0000000..3ea6f67 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/client/params/SliderActions.java @@ -0,0 +1,106 @@ +/* + * 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.hadoop.yarn.service.client.params; + +/** + * Actions. + * Only some of these are supported by specific Slider Services; they + * are listed here to ensure the names are consistent + */ +public interface SliderActions { + String ACTION_AM_SUICIDE = "am-suicide"; + String ACTION_BUILD = "build"; + String ACTION_CLIENT = "client"; + String ACTION_CREATE = "create"; + String ACTION_DIAGNOSTICS = "diagnostics"; + String ACTION_DEPENDENCY = "dependency"; + String ACTION_UPDATE = "update"; + String ACTION_UPGRADE = "upgrade"; + String ACTION_DESTROY = "destroy"; + String ACTION_ECHO = "echo"; + String ACTION_EXISTS = "exists"; + String ACTION_FLEX = "flex"; + String ACTION_STOP = "stop"; + String ACTION_HELP = "help"; + String ACTION_INSTALL_KEYTAB = "install-keytab"; + String ACTION_KDIAG = "kdiag"; + String ACTION_KEYTAB = "keytab"; + String ACTION_KILL_CONTAINER = "kill-container"; + String ACTION_LIST = "list"; + String ACTION_LOOKUP = "lookup"; + String ACTION_NODES = "nodes"; + String ACTION_PREFLIGHT = "preflight"; + String ACTION_RECONFIGURE = "reconfigure"; + String ACTION_REGISTRY = "registry"; + String ACTION_RESOLVE = "resolve"; + String ACTION_RESOURCE = "resource"; + String ACTION_STATUS = "status"; + String ACTION_START = "start"; + String ACTION_TOKENS = "tokens"; + + String ACTION_VERSION = "version"; + String DESCRIBE_ACTION_AM_SUICIDE = + "Tell the Slider Application Master to simulate a process failure by terminating itself"; + String DESCRIBE_ACTION_BUILD = + "Build a Slider cluster specification, but do not start it"; + String DESCRIBE_ACTION_CREATE = + "Create a live Slider application"; + String DESCRIBE_ACTION_DEPENDENCY = + "Slider AM and agent dependency (libraries) management"; + String DESCRIBE_ACTION_UPDATE = + "Update template for a Slider application"; + String DESCRIBE_ACTION_UPGRADE = + "Rolling upgrade/downgrade the component/containerto a newer/previous version"; + String DESCRIBE_ACTION_DESTROY = + "Destroy a stopped Slider application"; + String DESCRIBE_ACTION_EXISTS = + "Probe for an application running"; + String DESCRIBE_ACTION_FLEX = "Flex a Slider application"; + String DESCRIBE_ACTION_FREEZE = + "Stop a running application"; + String DESCRIBE_ACTION_GETCONF = + "Get the configuration of an application"; + String DESCRIBE_ACTION_KDIAG = "Diagnose Kerberos problems"; + String DESCRIBE_ACTION_KILL_CONTAINER = + "Kill a container in the application"; + String DESCRIBE_ACTION_HELP = "Print help information"; + String DESCRIBE_ACTION_LIST = + "List running Slider applications"; + String DESCRIBE_ACTION_LOOKUP = + "look up a YARN application"; + String DESCRIBE_ACTION_NODES = "List the node information for the YARN cluster or a running application"; + String DESCRIBE_ACTION_MONITOR = + "Monitor a running application"; + String DESCRIBE_ACTION_REGISTRY = + "Query the registry of a YARN application"; + String DESCRIBE_ACTION_RESOLVE = + "Resolve or list records in the YARN registry"; + String DESCRIBE_ACTION_STATUS = + "Get the status of an application"; + String DESCRIBE_ACTION_THAW = + "Start a stopped application"; + String DESCRIBE_ACTION_VERSION = + "Print the Slider version information"; + String DESCRIBE_ACTION_CLIENT = "Install the application client in the specified directory or obtain a client keystore or truststore"; + String DESCRIBE_ACTION_KEYTAB = "Manage a Kerberos keytab file (install, delete, list) in the sub-folder 'keytabs' of the user's Slider base directory"; + String DESCRIBE_ACTION_DIAGNOSTIC = "Diagnose the configuration of the running slider application and slider client"; + String DESCRIBE_ACTION_RESOURCE = "Manage a file (install, delete, list) in the 'resources' sub-folder of the user's Slider base directory"; + +} + http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstance.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstance.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstance.java new file mode 100644 index 0000000..aeef4fc --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstance.java @@ -0,0 +1,493 @@ +/** + * 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.hadoop.yarn.service.compinstance; + +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.registry.client.binding.RegistryPathUtils; +import org.apache.hadoop.registry.client.types.ServiceRecord; +import org.apache.hadoop.registry.client.types.yarn.PersistencePolicies; +import org.apache.hadoop.registry.client.types.yarn.YarnRegistryAttributes; +import org.apache.hadoop.util.ExitUtil; +import org.apache.hadoop.util.StringUtils; +import org.apache.hadoop.yarn.api.records.Container; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.ContainerStatus; +import org.apache.hadoop.yarn.api.records.NodeId; +import org.apache.hadoop.yarn.client.api.NMClient; +import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.event.EventHandler; +import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; +import org.apache.hadoop.yarn.service.ServiceScheduler; +import org.apache.hadoop.yarn.service.component.Component; +import org.apache.hadoop.yarn.state.InvalidStateTransitionException; +import org.apache.hadoop.yarn.state.SingleArcTransition; +import org.apache.hadoop.yarn.state.StateMachine; +import org.apache.hadoop.yarn.state.StateMachineFactory; +import org.apache.hadoop.yarn.util.BoundedAppender; +import org.apache.slider.api.resource.ContainerState; +import org.apache.slider.common.tools.SliderUtils; +import org.apache.hadoop.yarn.service.timelineservice.ServiceTimelinePublisher; +import org.apache.slider.server.servicemonitor.ProbeStatus; +import org.apache.slider.server.services.yarnregistry.YarnRegistryViewForProviders; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.text.MessageFormat; +import java.util.Date; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; + +import static org.apache.hadoop.yarn.api.records.ContainerExitStatus.KILLED_BY_APPMASTER; +import static org.apache.hadoop.yarn.api.records.ContainerState.COMPLETE; +import static org.apache.hadoop.yarn.service.compinstance.ComponentInstanceEventType.*; +import static org.apache.hadoop.yarn.service.compinstance.ComponentInstanceState.*; + +public class ComponentInstance implements EventHandler<ComponentInstanceEvent>, + Comparable<ComponentInstance> { + private static final Logger LOG = + LoggerFactory.getLogger(ComponentInstance.class); + + private StateMachine<ComponentInstanceState, ComponentInstanceEventType, + ComponentInstanceEvent> stateMachine; + private Component component; + private final ReadLock readLock; + private final WriteLock writeLock; + + private ComponentInstanceId compInstanceId = null; + private Path compInstanceDir; + private Container container; + private YarnRegistryViewForProviders yarnRegistryOperations; + private FileSystem fs; + private boolean timelineServiceEnabled = false; + private ServiceTimelinePublisher serviceTimelinePublisher; + private ServiceScheduler scheduler; + private BoundedAppender diagnostics = new BoundedAppender(64 * 1024); + private volatile ScheduledFuture containerStatusFuture; + private volatile ContainerStatus status; + private long containerStartedTime = 0; + // This container object is used for rest API query + private org.apache.slider.api.resource.Container containerSpec; + + private static final StateMachineFactory<ComponentInstance, + ComponentInstanceState, ComponentInstanceEventType, ComponentInstanceEvent> + stateMachineFactory = + new StateMachineFactory<ComponentInstance, ComponentInstanceState, + ComponentInstanceEventType, ComponentInstanceEvent>(INIT) + .addTransition(INIT, RUNNING_BUT_UNREADY, STARTED, + new ContainerStartedTransition()) + + //From Running + .addTransition(RUNNING_BUT_UNREADY, INIT, STOP, + new ContainerStoppedTransition()) + .addTransition(RUNNING_BUT_UNREADY, READY, BECOME_READY, + new ContainerBecomeReadyTransition()) + + // FROM READY + .addTransition(READY, RUNNING_BUT_UNREADY, BECOME_NOT_READY, + new ContainerBecomeNotReadyTransition()) + .addTransition(READY, INIT, STOP, new ContainerStoppedTransition()) + .installTopology(); + + + + public ComponentInstance(Component component, + ComponentInstanceId compInstanceId) { + this.stateMachine = stateMachineFactory.make(this); + this.component = component; + this.compInstanceId = compInstanceId; + this.scheduler = component.getScheduler(); + this.yarnRegistryOperations = + component.getScheduler().getYarnRegistryOperations(); + this.serviceTimelinePublisher = + component.getScheduler().getServiceTimelinePublisher(); + if (YarnConfiguration + .timelineServiceV2Enabled(component.getScheduler().getConfig())) { + this.timelineServiceEnabled = true; + } + ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + this.readLock = lock.readLock(); + this.writeLock = lock.writeLock(); + this.fs = scheduler.getContext().fs.getFileSystem(); + } + + private static class ContainerStartedTransition extends BaseTransition { + @Override public void transition(ComponentInstance compInstance, + ComponentInstanceEvent event) { + // Query container status for ip and host + compInstance.containerStatusFuture = + compInstance.scheduler.executorService.scheduleAtFixedRate( + new ContainerStatusRetriever(compInstance.scheduler, + compInstance.getContainerId(), compInstance), 0, 1, + TimeUnit.SECONDS); + + org.apache.slider.api.resource.Container container = + new org.apache.slider.api.resource.Container(); + container.setId(compInstance.getContainerId().toString()); + container.setLaunchTime(new Date()); + container.setState(org.apache.slider.api.resource.ContainerState.RUNNING_BUT_UNREADY); + container.setBareHost(compInstance.container.getNodeId().getHost()); + container.setComponentName(compInstance.getCompInstanceName()); + if (compInstance.containerSpec != null) { + // remove the previous container. + compInstance.getCompSpec().removeContainer(compInstance.containerSpec); + } + compInstance.containerSpec = container; + compInstance.getCompSpec().addContainer(container); + compInstance.containerStartedTime = System.currentTimeMillis(); + + if (compInstance.timelineServiceEnabled) { + compInstance.serviceTimelinePublisher + .componentInstanceStarted(container, compInstance); + } + } + } + + private static class ContainerBecomeReadyTransition extends BaseTransition { + @Override + public void transition(ComponentInstance compInstance, + ComponentInstanceEvent event) { + compInstance.component.incContainersReady(); + compInstance.containerSpec.setState(ContainerState.READY); + } + } + + private static class ContainerBecomeNotReadyTransition extends BaseTransition { + @Override + public void transition(ComponentInstance compInstance, + ComponentInstanceEvent event) { + compInstance.component.decContainersReady(); + compInstance.containerSpec.setState(ContainerState.RUNNING_BUT_UNREADY); + } + } + + private static class ContainerStoppedTransition extends BaseTransition { + @Override + public void transition(ComponentInstance compInstance, + ComponentInstanceEvent event) { + // re-ask the failed container. + Component comp = compInstance.component; + comp.requestContainers(1); + LOG.info(compInstance.getCompInstanceId() + + ": Container completed. Requested a new container." + System + .lineSeparator() + " exitStatus={}, diagnostics={}.", + event.getStatus().getExitStatus(), + event.getStatus().getDiagnostics()); + String containerDiag = + compInstance.getCompInstanceId() + ": " + event.getStatus() + .getDiagnostics(); + compInstance.diagnostics.append(containerDiag + System.lineSeparator()); + + boolean shouldExit = false; + // check if it exceeds the failure threshold + if (comp.currentContainerFailure > comp.maxContainerFailurePerComp) { + String exitDiag = MessageFormat.format( + "[COMPONENT {0}]: Failed {1} times, exceeded the limit - {2}. Shutting down now... " + + System.lineSeparator(), + comp.getName(), comp.currentContainerFailure, comp.maxContainerFailurePerComp); + compInstance.diagnostics.append(exitDiag); + // append to global diagnostics that will be reported to RM. + comp.getScheduler().getDiagnostics().append(containerDiag); + comp.getScheduler().getDiagnostics().append(exitDiag); + LOG.warn(exitDiag); + shouldExit = true; + } + + // clean up registry + // hdfs dir content will be overwritten when a new container gets started, + // so no need remove. + compInstance.scheduler.executorService + .submit(compInstance::cleanupRegistry); + + // remove the failed ContainerId -> CompInstance mapping + comp.getScheduler().removeLiveCompInstance(event.getContainerId()); + + if (compInstance.timelineServiceEnabled) { + // record in ATS + compInstance.serviceTimelinePublisher + .componentInstanceFinished(compInstance, + event.getStatus().getExitStatus(), event.getStatus().getState(), + containerDiag); + } + + compInstance.containerSpec.setState(ContainerState.STOPPED); + if (shouldExit) { + // Sleep for 5 seconds in hope that the state can be recorded in ATS. + // in case there's a client polling the comp state, it can be notified. + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + LOG.error("Interrupted on sleep while exiting.", e); + } + ExitUtil.terminate(-1); + } + } + } + + public ComponentInstanceState getState() { + this.readLock.lock(); + + try { + return this.stateMachine.getCurrentState(); + } finally { + this.readLock.unlock(); + } + } + + @Override + public void handle(ComponentInstanceEvent event) { + try { + writeLock.lock(); + ComponentInstanceState oldState = getState(); + try { + stateMachine.doTransition(event.getType(), event); + } catch (InvalidStateTransitionException e) { + LOG.error("Invalid event " + event.getType() + + " at " + oldState + " for component instance " + compInstanceId, e); + } + if (oldState != getState()) { + LOG.info(getCompInstanceId() + " Transitioned from " + oldState + " to " + + getState() + " on " + event.getType() + " event"); + } + } finally { + writeLock.unlock(); + } + } + + public void setContainer(Container container) { + this.container = container; + this.compInstanceId.setContainerId(container.getId()); + } + + public String getCompInstanceName() { + return compInstanceId.getCompInstanceName(); + } + + public ContainerStatus getContainerStatus() { + return status; + } + + public void updateContainerStatus(ContainerStatus status) { + this.status = status; + org.apache.slider.api.resource.Container container = + getCompSpec().getContainer(getContainerId().toString()); + if (container != null) { + container.setIp(StringUtils.join(",", status.getIPs())); + container.setHostname(status.getHost()); + if (timelineServiceEnabled) { + serviceTimelinePublisher.componentInstanceUpdated(container); + } + } + updateServiceRecord(yarnRegistryOperations, status); + } + + public ContainerId getContainerId() { + return container.getId(); + } + + public String getCompName() { + return compInstanceId.getCompName(); + } + + public void setCompInstanceDir(Path dir) { + this.compInstanceDir = dir; + } + + public Component getComponent() { + return component; + } + + public Container getContainer() { + return container; + } + + public ComponentInstanceId getCompInstanceId() { + return compInstanceId; + } + + public NodeId getNodeId() { + return this.container.getNodeId(); + } + + public org.apache.slider.api.resource.Component getCompSpec() { + return component.getComponentSpec(); + } + + private static class BaseTransition implements + SingleArcTransition<ComponentInstance, ComponentInstanceEvent> { + + @Override public void transition(ComponentInstance compInstance, + ComponentInstanceEvent event) { + } + } + + public ProbeStatus ping() { + if (component.getProbe() == null) { + ProbeStatus status = new ProbeStatus(); + status.setSuccess(true); + return status; + } + return component.getProbe().ping(this); + } + + // Write service record into registry + private void updateServiceRecord( + YarnRegistryViewForProviders yarnRegistry, ContainerStatus status) { + ServiceRecord record = new ServiceRecord(); + String containerId = status.getContainerId().toString(); + record.set(YarnRegistryAttributes.YARN_ID, containerId); + record.description = getCompInstanceName(); + record.set(YarnRegistryAttributes.YARN_PERSISTENCE, + PersistencePolicies.CONTAINER); + record.set("yarn:ip", status.getIPs()); + record.set("yarn:hostname", status.getHost()); + try { + yarnRegistry + .putComponent(RegistryPathUtils.encodeYarnID(containerId), record); + } catch (IOException e) { + LOG.error( + "Failed to update service record in registry: " + containerId + ""); + } + } + + // Release the container , cleanup registry, hdfs dir, and record in ATS + public void destroy() { + LOG.info(getCompInstanceId() + ": Flexed down by user, destroying."); + diagnostics.append(getCompInstanceId() + ": Flexed down by user"); + if (container != null) { + scheduler.removeLiveCompInstance(container.getId()); + component.getScheduler().getAmRMClient() + .releaseAssignedContainer(container.getId()); + getCompSpec().removeContainer(containerSpec); + } + if (timelineServiceEnabled) { + serviceTimelinePublisher + .componentInstanceFinished(this, KILLED_BY_APPMASTER, COMPLETE, + diagnostics.toString()); + } + scheduler.executorService.submit(this::cleanupRegistryAndCompHdfsDir); + } + + private void cleanupRegistry() { + ContainerId containerId = getContainerId(); + String cid = RegistryPathUtils.encodeYarnID(containerId.toString()); + try { + yarnRegistryOperations.deleteComponent(getCompInstanceId(), cid); + } catch (IOException e) { + LOG.error(getCompInstanceId() + ": Failed to delete registry", e); + } + } + + //TODO Maybe have a dedicated cleanup service. + public void cleanupRegistryAndCompHdfsDir() { + cleanupRegistry(); + try { + if (compInstanceDir != null && fs.exists(compInstanceDir)) { + boolean deleted = fs.delete(compInstanceDir, true); + if (!deleted) { + LOG.error(getCompInstanceId() + + ": Failed to delete component instance dir: " + + compInstanceDir); + } else { + LOG.info(getCompInstanceId() + ": Deleted component instance dir: " + + compInstanceDir); + } + } + } catch (IOException e) { + LOG.warn(getCompInstanceId() + ": Failed to delete directory", e); + } + } + + // Query container status until ip and hostname are available and update + // the service record into registry service + private static class ContainerStatusRetriever implements Runnable { + private ContainerId containerId; + private NodeId nodeId; + private NMClient nmClient; + private ComponentInstance instance; + ContainerStatusRetriever(ServiceScheduler scheduler, + ContainerId containerId, ComponentInstance instance) { + this.containerId = containerId; + this.nodeId = instance.getNodeId(); + this.nmClient = scheduler.getNmClient().getClient(); + this.instance = instance; + } + @Override public void run() { + ContainerStatus status = null; + try { + status = nmClient.getContainerStatus(containerId, nodeId); + } catch (Exception e) { + if (e instanceof YarnException) { + throw new YarnRuntimeException( + instance.compInstanceId + " Failed to get container status on " + + nodeId + " , cancelling.", e); + } + LOG.error(instance.compInstanceId + " Failed to get container status on " + + nodeId + ", will try again", e); + return; + } + if (SliderUtils.isEmpty(status.getIPs()) || SliderUtils + .isUnset(status.getHost())) { + return; + } + instance.updateContainerStatus(status); + LOG.info( + instance.compInstanceId + " IP = " + status.getIPs() + ", host = " + + status.getHost() + ", cancel container status retriever"); + instance.containerStatusFuture.cancel(false); + } + } + + @Override + public int compareTo(ComponentInstance to) { + long delta = containerStartedTime - to.containerStartedTime; + if (delta == 0) { + return getCompInstanceId().compareTo(to.getCompInstanceId()); + } else if (delta < 0) { + return -1; + } else { + return 1; + } + } + + @Override public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + ComponentInstance instance = (ComponentInstance) o; + + if (containerStartedTime != instance.containerStartedTime) + return false; + return compInstanceId.equals(instance.compInstanceId); + } + + @Override public int hashCode() { + int result = compInstanceId.hashCode(); + result = 31 * result + (int) (containerStartedTime ^ (containerStartedTime + >>> 32)); + return result; + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEvent.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEvent.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEvent.java new file mode 100644 index 0000000..14a9e09 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEvent.java @@ -0,0 +1,58 @@ +/** + * 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.hadoop.yarn.service.compinstance; + +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.ContainerStatus; +import org.apache.hadoop.yarn.event.AbstractEvent; + +public class ComponentInstanceEvent + extends AbstractEvent<ComponentInstanceEventType> { + + private ContainerId id; + private ContainerStatus status; + private boolean shouldDestroy = false; + + public ComponentInstanceEvent(ContainerId containerId, + ComponentInstanceEventType componentInstanceEventType) { + super(componentInstanceEventType); + this.id = containerId; + } + + public ContainerId getContainerId() { + return id; + } + + public ContainerStatus getStatus() { + return this.status; + } + + public ComponentInstanceEvent setStatus(ContainerStatus status) { + this.status = status; + return this; + } + + public void setShouldDestroy() { + shouldDestroy = true; + } + + public boolean shouldDestroy() { + return shouldDestroy; + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEventType.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEventType.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEventType.java new file mode 100644 index 0000000..b3fe1e6 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceEventType.java @@ -0,0 +1,27 @@ +/** + * 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.hadoop.yarn.service.compinstance; + +public enum ComponentInstanceEventType { + + STARTED, + STOP, + BECOME_READY, + BECOME_NOT_READY +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceId.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceId.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceId.java new file mode 100644 index 0000000..c3c55d9 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceId.java @@ -0,0 +1,91 @@ +/** + * 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.hadoop.yarn.service.compinstance; + +import org.apache.hadoop.yarn.api.records.ContainerId; + +public class ComponentInstanceId implements Comparable<ComponentInstanceId> { + + private long Id; + private String name; + private ContainerId containerId; + + public ComponentInstanceId(long id, String name) { + Id = id; + this.name = name; + } + + public long getId() { + return Id; + } + + public String getCompName() { + return name; + } + + public String getCompInstanceName() { + return getCompName() + "-" + getId(); + } + + public void setContainerId(ContainerId containerId) { + this.containerId = containerId; + } + + @Override + public String toString() { + if (containerId == null) { + return "[COMPINSTANCE " + getCompInstanceName() + "]"; + } else { + return "[COMPINSTANCE " + getCompInstanceName() + " : " + containerId + "]"; + } + } + + @Override public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + ComponentInstanceId that = (ComponentInstanceId) o; + + if (getId() != that.getId()) + return false; + return getCompName() != null ? getCompName().equals(that.getCompName()) : + that.getCompName() == null; + + } + + @Override public int hashCode() { + int result = (int) (getId() ^ (getId() >>> 32)); + result = 31 * result + (getCompName() != null ? getCompName().hashCode() : 0); + return result; + } + + @Override + public int compareTo(ComponentInstanceId to) { + int delta = this.getCompName().compareTo(to.getCompName()); + if (delta == 0) { + return Long.compare(this.getId(), to.getId()); + } else if (delta < 0) { + return -1; + } else { + return 1; + } + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/164c0c4c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceState.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceState.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceState.java new file mode 100644 index 0000000..f2d8cea --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/hadoop/yarn/service/compinstance/ComponentInstanceState.java @@ -0,0 +1,26 @@ +/** + * 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.hadoop.yarn.service.compinstance; + +public enum ComponentInstanceState { + INIT, + RUNNING_BUT_UNREADY, + READY, + UPGRADING +} --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org