http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/ClusterDescription.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/ClusterDescription.java b/slider-core/src/main/java/org/apache/slider/api/ClusterDescription.java deleted file mode 100644 index f8e5e7c..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/ClusterDescription.java +++ /dev/null @@ -1,795 +0,0 @@ -/* - * 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.slider.api; - -import org.apache.hadoop.fs.FSDataInputStream; -import org.apache.hadoop.fs.FSDataOutputStream; -import org.apache.hadoop.fs.FileStatus; -import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.Path; -import org.apache.slider.api.types.ApplicationLivenessInformation; -import org.apache.slider.common.tools.SliderUtils; -import org.apache.slider.core.exceptions.BadConfigException; -import org.apache.slider.providers.SliderProviderFactory; -import org.codehaus.jackson.JsonGenerationException; -import org.codehaus.jackson.JsonParseException; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.JsonMappingException; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.SerializationConfig; -import org.codehaus.jackson.map.annotate.JsonSerialize; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.apache.slider.api.OptionKeys.INTERNAL_APPLICATION_HOME; -import static org.apache.slider.api.OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH; -import static org.apache.slider.api.OptionKeys.ZOOKEEPER_PATH; -import static org.apache.slider.api.OptionKeys.ZOOKEEPER_QUORUM; - -/** - * Represents a cluster specification; designed to be sendable over the wire - * and persisted in JSON by way of Jackson. - * - * When used in cluster status operations the <code>info</code> - * and <code>statistics</code> maps contain information about the cluster. - * - * As a wire format it is less efficient in both xfer and ser/deser than - * a binary format, but by having one unified format for wire and persistence, - * the code paths are simplified. - * - * This was the original single-file specification/model used in the Hoya - * precursor to Slider. Its now retained primarily as a way to publish - * the current state of the application, or at least a fraction thereof ... - * the larger set of information from the REST API is beyond the scope of - * this structure. - */ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - -public class ClusterDescription implements Cloneable { - protected static final Logger - log = LoggerFactory.getLogger(ClusterDescription.class); - - private static final String UTF_8 = "UTF-8"; - - /** - * version counter - */ - public String version = "1.0"; - - /** - * Name of the cluster - */ - public String name; - - /** - * Type of cluster - */ - public String type = SliderProviderFactory.DEFAULT_CLUSTER_TYPE; - - /** - * State of the cluster - */ - public int state; - - /* - State list for both clusters and nodes in them. Ordered so that destroyed follows - stopped. - - Some of the states are only used for recording - the persistent state of the cluster and are not - seen in node descriptions - */ - - /** - * Specification is incomplete & cannot - * be used: {@value} - */ - public static final int STATE_INCOMPLETE = StateValues.STATE_INCOMPLETE; - - /** - * Spec has been submitted: {@value} - */ - public static final int STATE_SUBMITTED = StateValues.STATE_SUBMITTED; - /** - * Cluster created: {@value} - */ - public static final int STATE_CREATED = StateValues.STATE_CREATED; - /** - * Live: {@value} - */ - public static final int STATE_LIVE = StateValues.STATE_LIVE; - /** - * Stopped - */ - public static final int STATE_STOPPED = StateValues.STATE_STOPPED; - /** - * destroyed - */ - public static final int STATE_DESTROYED = StateValues.STATE_DESTROYED; - - /** - * When was the cluster specification created? - * This is not the time a cluster was thawed; that will - * be in the <code>info</code> section. - */ - public long createTime; - - /** - * When was the cluster specification last updated - */ - public long updateTime; - - /** - * URL path to the original configuration - * files; these are re-read when - * restoring a cluster - */ - - public String originConfigurationPath; - - /** - * URL path to the generated configuration - */ - public String generatedConfigurationPath; - - /** - * This is where the data goes - */ - public String dataPath; - - /** - * cluster-specific options -to control both - * the Slider AM and the application that it deploys - */ - public Map<String, String> options = new HashMap<>(); - - /** - * cluster information - * This is only valid when querying the cluster status. - */ - public Map<String, String> info = new HashMap<>(); - - /** - * Statistics. This is only relevant when querying the cluster status - */ - public Map<String, Map<String, Integer>> statistics = new HashMap<>(); - - /** - * Instances: role->count - */ - public Map<String, List<String>> instances = new HashMap<>(); - - /** - * Role options, - * role -> option -> value - */ - public Map<String, Map<String, String>> roles = new HashMap<>(); - - - /** - * List of key-value pairs to add to a client config to set up the client - */ - public Map<String, String> clientProperties = new HashMap<>(); - - /** - * Status information - */ - public Map<String, Object> status; - - /** - * Liveness information; the same as returned - * on the <code>live/liveness/</code> URL - */ - public ApplicationLivenessInformation liveness; - - /** - * Creator. - */ - public ClusterDescription() { - } - - @Override - public String toString() { - try { - return toJsonString(); - } catch (Exception e) { - log.debug("Failed to convert CD to JSON ", e); - return super.toString(); - } - } - - /** - * Shallow clone - * @return a shallow clone - * @throws CloneNotSupportedException - */ - @Override - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - /** - * A deep clone of the spec. This is done inefficiently with a ser/derser - * @return the cluster description - */ - public ClusterDescription deepClone() { - try { - return fromJson(toJsonString()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - - /** - * Save a cluster description to a hadoop filesystem - * @param fs filesystem - * @param path path - * @param overwrite should any existing file be overwritten - * @throws IOException IO exception - */ - public void save(FileSystem fs, Path path, boolean overwrite) throws - IOException { - FSDataOutputStream dataOutputStream = fs.create(path, overwrite); - writeJsonAsBytes(dataOutputStream); - } - - /** - * Save a cluster description to the local filesystem - * @param file file - * @throws IOException IO excpetion - */ - public void save(File file) throws IOException { - log.debug("Saving to {}", file.getAbsolutePath()); - if (!file.getParentFile().mkdirs()) { - log.warn("Failed to mkdirs for {}", file.getParentFile()); - } - DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(file)); - writeJsonAsBytes(dataOutputStream); - } - - /** - * Write the json as bytes -then close the file - * @param dataOutputStream an outout stream that will always be closed - * @throws IOException any failure - */ - private void writeJsonAsBytes(DataOutputStream dataOutputStream) - throws IOException { - try { - String json = toJsonString(); - byte[] b = json.getBytes(UTF_8); - dataOutputStream.write(b); - } finally { - dataOutputStream.close(); - } - } - - /** - * Load from the filesystem - * @param fs filesystem - * @param path path - * @return a loaded CD - * @throws IOException IO problems - */ - public static ClusterDescription load(FileSystem fs, Path path) - throws IOException, JsonParseException, JsonMappingException { - FileStatus status = fs.getFileStatus(path); - byte[] b = new byte[(int) status.getLen()]; - FSDataInputStream dataInputStream = fs.open(path); - int count = dataInputStream.read(b); - String json = new String(b, 0, count, UTF_8); - return fromJson(json); - } - - /** - * Make a deep copy of the class - * @param source source - * @return the copy - */ - public static ClusterDescription copy(ClusterDescription source) { - //currently the copy is done by a generate/save. Inefficient but it goes - //down the tree nicely - try { - return fromJson(source.toJsonString()); - } catch (IOException e) { - throw new RuntimeException("ClusterDescription copy failed " + e, e); - } - } - - /** - * Convert to a JSON string - * @return a JSON string description - * @throws IOException Problems mapping/writing the object - */ - public String toJsonString() throws IOException, - JsonGenerationException, - JsonMappingException { - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); - return mapper.writeValueAsString(this); - } - - /** - * Convert from JSON - * @param json input - * @return the parsed JSON - * @throws IOException IO - * @throws JsonMappingException failure to map from the JSON to this class - */ - public static ClusterDescription fromJson(String json) - throws IOException, JsonParseException, JsonMappingException { - ObjectMapper mapper = new ObjectMapper(); - try { - return mapper.readValue(json, ClusterDescription.class); - } catch (IOException e) { - log.error("Exception while parsing json : " + e + "\n" + json, e); - throw e; - } - } - - /** - * Convert from input stream - * @param is input stream of cluster description - * @return the parsed JSON - * @throws IOException IO - * @throws JsonMappingException failure to map from the JSON to this class - */ - public static ClusterDescription fromStream(InputStream is) - throws IOException, JsonParseException, JsonMappingException { - if (is==null) { - throw new FileNotFoundException("Empty Stream"); - } - ObjectMapper mapper = new ObjectMapper(); - try { - return mapper.readValue(is, ClusterDescription.class); - } catch (IOException e) { - log.error("Exception while parsing input stream : {}", e, e); - throw e; - } - } - - /** - * Convert from a JSON file - * @param jsonFile input file - * @return the parsed JSON - * @throws IOException IO problems - * @throws JsonMappingException failure to map from the JSON to this class - */ - public static ClusterDescription fromFile(File jsonFile) - throws IOException, JsonParseException, JsonMappingException { - ObjectMapper mapper = new ObjectMapper(); - try { - return mapper.readValue(jsonFile, ClusterDescription.class); - } catch (IOException e) { - log.error("Exception while parsing json file {}" , jsonFile, e); - throw e; - } - } - - /** - * Set a cluster option: a key val pair in the options {} section - * @param key key option name - * @param val value option value - */ - public void setOption(String key, String val) { - options.put(key, val); - } - - /** - * Set a cluster option if it is unset. If it is already set, - * in the Cluster Description, it is left alone - * @param key key key to query/set - * @param val value value - */ - - public void setOptionifUnset(String key, String val) { - if (options.get(key) == null) { - options.put(key, val); - } - } - - /** - * Set an integer option -it's converted to a string before saving - * @param option option name - * @param val integer value - */ - public void setOption(String option, int val) { - setOption(option, Integer.toString(val)); - } - - /** - * Set a boolean option - * @param option option name - * @param val bool value - */ - public void setOption(String option, boolean val) { - setOption(option, Boolean.toString(val)); - } - - /** - * Get a cluster option or value - * - * @param key option key - * @param defVal option val - * @return resolved value or default - */ - public String getOption(String key, String defVal) { - String val = options.get(key); - return val != null ? val : defVal; - } - - /** - * Get a cluster option or value - * - * @param key mandatory key - * @return the value - * @throws BadConfigException if the option is missing - */ - public String getMandatoryOption(String key) throws BadConfigException { - String val = options.get(key); - if (val == null) { - throw new BadConfigException("Missing option " + key); - } - return val; - } - - /** - * Get an integer option; use {@link Integer#decode(String)} so as to take hex - * oct and bin values too. - * - * @param option option name - * @param defVal default value - * @return parsed value - * @throws NumberFormatException if the role could not be parsed. - */ - public int getOptionInt(String option, int defVal) { - String val = getOption(option, Integer.toString(defVal)); - return Integer.decode(val); - } - - /** - * Verify that an option is set: that is defined AND non-empty - * @param key key to verify - * @throws BadConfigException - */ - public void verifyOptionSet(String key) throws BadConfigException { - if (SliderUtils.isUnset(getOption(key, null))) { - throw new BadConfigException("Unset cluster option %s", key); - } - } - - /** - * Get an option as a boolean. Note that {@link Boolean#valueOf(String)} - * is used for parsing -its policy of what is true vs false applies. - * @param option name - * @param defVal default - * @return the option. - */ - public boolean getOptionBool(String option, boolean defVal) { - return Boolean.valueOf(getOption(option, Boolean.toString(defVal))); - } - - /** - * Get a role option - * @param role role to get from - * @param option option name - * @param defVal default value - * @return resolved value - */ - public String getRoleOpt(String role, String option, String defVal) { - Map<String, String> roleopts = getRole(role); - if (roleopts == null) { - return defVal; - } - String val = roleopts.get(option); - return val != null ? val : defVal; - } - - /** - * Get a mandatory role option - * @param role role to get from - * @param option option name - * @return resolved value - * @throws BadConfigException if the option is not defined - */ - public String getMandatoryRoleOpt(String role, String option) throws - BadConfigException { - Map<String, String> roleopts = getRole(role); - if (roleopts == null) { - throw new BadConfigException("Missing role %s ", role); - } - String val = roleopts.get(option); - if (val == null) { - throw new BadConfigException("Missing option '%s' in role %s ", option, role); - } - return val; - } - - /** - * Get a mandatory integer role option - * @param role role to get from - * @param option option name - * @return resolved value - * @throws BadConfigException if the option is not defined - */ - public int getMandatoryRoleOptInt(String role, String option) - throws BadConfigException { - getMandatoryRoleOpt(role, option); - return getRoleOptInt(role, option, 0); - } - - /** - * look up a role and return its options - * @param role role - * @return role mapping or null - */ - public Map<String, String> getRole(String role) { - return roles.get(role); - } - - /** - * Get a role -adding it to the roleopts map if - * none with that name exists - * @param role role - * @return role mapping - */ - public Map<String, String> getOrAddRole(String role) { - Map<String, String> map = getRole(role); - if (map == null) { - map = new HashMap<>(); - } - roles.put(role, map); - return map; - } - - /* - * return the Set of role names - */ - @JsonIgnore - public Set<String> getRoleNames() { - return new HashSet<>(roles.keySet()); - } - - /** - * Get a role whose presence is mandatory - * @param role role name - * @return the mapping - * @throws BadConfigException if the role is not there - */ - public Map<String, String> getMandatoryRole(String role) throws - BadConfigException { - Map<String, String> roleOptions = getRole(role); - if (roleOptions == null) { - throw new BadConfigException("Missing role " + role); - } - return roleOptions; - } - - /** - * Get an integer role option; use {@link Integer#decode(String)} so as to take hex - * oct and bin values too. - * - * @param role role to get from - * @param option option name - * @param defVal default value - * @return parsed value - * @throws NumberFormatException if the role could not be parsed. - */ - public int getRoleOptInt(String role, String option, int defVal) { - String val = getRoleOpt(role, option, Integer.toString(defVal)); - return Integer.decode(val); - } - - /** - * Get an integer role option; use {@link Integer#decode(String)} so as to take hex - * oct and bin values too. - * - * @param role role to get from - * @param option option name - * @param defVal default value - * @return parsed value - * @throws NumberFormatException if the role could not be parsed. - */ - public long getRoleOptLong(String role, String option, long defVal) { - String val = getRoleOpt(role, option, Long.toString(defVal)); - return Long.decode(val); - } - - /** - * Set a role option, creating the role if necessary - * @param role role name - * @param option option name - * @param val value - */ - public void setRoleOpt(String role, String option, String val) { - Map<String, String> roleopts = getOrAddRole(role); - roleopts.put(option, val); - } - - /** - * Set an integer role option, creating the role if necessary - * @param role role name - * @param option option name - * @param val integer value - */ - public void setRoleOpt(String role, String option, int val) { - setRoleOpt(role, option, Integer.toString(val)); - } - - /** - * Set a role option of any object, using its string value. - * This works for (Boxed) numeric values as well as other objects - * @param role role name - * @param option option name - * @param val non-null value - */ - public void setRoleOpt(String role, String option, Object val) { - setRoleOpt(role, option, val.toString()); - } - - /** - * Get the value of a role requirement (cores, RAM, etc). - * These are returned as integers, but there is special handling of the - * string {@link ResourceKeys#YARN_RESOURCE_MAX}, which triggers - * the return of the maximum value. - * @param role role to get from - * @param option option name - * @param defVal default value - * @param maxVal value to return if the max val is requested - * @return parsed value - * @throws NumberFormatException if the role could not be parsed. - */ - public int getRoleResourceRequirement(String role, String option, int defVal, int maxVal) { - String val = getRoleOpt(role, option, Integer.toString(defVal)); - Integer intVal; - if (ResourceKeys.YARN_RESOURCE_MAX.equals(val)) { - intVal = maxVal; - } else { - intVal = Integer.decode(val); - } - return intVal; - } - - - /** - * Set the time for an information (human, machine) timestamp pair of fields. - * The human time is the time in millis converted via the {@link Date} class. - * @param keyHumanTime name of human time key - * @param keyMachineTime name of machine time - * @param time timestamp - */ - - public void setInfoTime(String keyHumanTime, String keyMachineTime, long time) { - SliderUtils.setInfoTime(info, keyHumanTime, keyMachineTime, time); - } - - /** - * Set an information string. This is content that is only valid in status - * reports. - * @param key key - * @param value string value - */ - @JsonIgnore - public void setInfo(String key, String value) { - info.put(key, value); - } - - /** - * Get an information string. This is content that is only valid in status - * reports. - * @param key key - * @return the value or null - */ - @JsonIgnore - public String getInfo(String key) { - return info.get(key); - } - - /** - * Get an information string. This is content that is only valid in status - * reports. - * @param key key - * @return the value or null - */ - @JsonIgnore - public boolean getInfoBool(String key) { - String val = info.get(key); - if (val != null) { - return Boolean.valueOf(val); - } - return false; - } - - @JsonIgnore - public String getZkHosts() throws BadConfigException { - return getMandatoryOption(ZOOKEEPER_QUORUM); - } - - /** - * Set the hosts for the ZK quorum - * @param zkHosts a comma separated list of hosts - */ - @JsonIgnore - public void setZkHosts(String zkHosts) { - setOption(ZOOKEEPER_QUORUM, zkHosts); - } - - @JsonIgnore - public String getZkPath() throws BadConfigException { - return getMandatoryOption(ZOOKEEPER_PATH); - } - - @JsonIgnore - public void setZkPath(String zkPath) { - setOption(ZOOKEEPER_PATH, zkPath); - } - - /** - * HBase home: if non-empty defines where a copy of HBase is preinstalled - */ - @JsonIgnore - public String getApplicationHome() { - return getOption(INTERNAL_APPLICATION_HOME, ""); - } - - @JsonIgnore - public void setApplicationHome(String applicationHome) { - setOption(INTERNAL_APPLICATION_HOME, applicationHome); - } - - /** - * The path in HDFS where the HBase image is - */ - @JsonIgnore - public String getImagePath() { - return getOption(INTERNAL_APPLICATION_IMAGE_PATH, ""); - } - - /** - * Set the path in HDFS where the HBase image is - */ - @JsonIgnore - public void setImagePath(String imagePath) { - setOption(INTERNAL_APPLICATION_IMAGE_PATH, imagePath); - } - - /** - * Query for the image path being set (non null/non empty) - * @return true if there is a path in the image path option - */ - @JsonIgnore - public boolean isImagePathSet() { - return SliderUtils.isSet(getImagePath()); - } -}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionKeys.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionKeys.java b/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionKeys.java deleted file mode 100644 index 5b7a92a..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionKeys.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.slider.api; - -public class ClusterDescriptionKeys { - - public static final String KEY_CLUSTER_LIVE = "live"; - public static final String KEY_CLUSTER_FAILED = "failed"; -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java b/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java deleted file mode 100644 index 5b95414..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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.slider.api; - -import org.apache.slider.common.tools.SliderUtils; -import org.apache.slider.core.conf.AggregateConf; -import org.apache.slider.core.conf.ConfTree; -import org.apache.slider.core.conf.MapOperations; -import org.apache.slider.core.exceptions.BadConfigException; -import org.apache.slider.providers.SliderProviderFactory; - -import java.util.Map; - -import static org.apache.slider.api.OptionKeys.ZOOKEEPER_PATH; -import static org.apache.slider.api.OptionKeys.ZOOKEEPER_QUORUM; - -/** - * Operations on Cluster Descriptions - */ -public class ClusterDescriptionOperations { - - - public static ClusterDescription buildFromInstanceDefinition(AggregateConf aggregateConf) throws - BadConfigException { - - ClusterDescription cd = new ClusterDescription(); - - aggregateConf.resolve(); - - //options are a merge of all globals - Map<String, String> options = cd.options; - SliderUtils.mergeMapsIgnoreDuplicateKeys(options, - aggregateConf.getInternal().global); - SliderUtils.mergeMapsIgnoreDuplicateKeys(options, - aggregateConf.getAppConf().global); - SliderUtils.mergeMapsIgnoreDuplicateKeys(options, - aggregateConf.getResources().global); - - //roles are the role values merged in the same order - mergeInComponentMap(cd, aggregateConf.getInternal()); - mergeInComponentMap(cd, aggregateConf.getAppConf()); - mergeInComponentMap(cd, aggregateConf.getResources()); - - //now add the extra bits - cd.state = ClusterDescription.STATE_LIVE; - MapOperations internalOptions = - aggregateConf.getInternalOperations().getGlobalOptions(); - MapOperations appOptions = - aggregateConf.getAppConfOperations().getGlobalOptions(); - - cd.type = internalOptions.getOption(InternalKeys.INTERNAL_PROVIDER_NAME, - SliderProviderFactory.DEFAULT_CLUSTER_TYPE); - - cd.dataPath = internalOptions.get(InternalKeys.INTERNAL_DATA_DIR_PATH); - cd.name = internalOptions.get(OptionKeys.APPLICATION_NAME); - cd.originConfigurationPath = internalOptions.get(InternalKeys.INTERNAL_SNAPSHOT_CONF_PATH); - cd.generatedConfigurationPath = internalOptions.get(InternalKeys.INTERNAL_GENERATED_CONF_PATH); - cd.setImagePath(internalOptions.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH)); - cd.setApplicationHome(internalOptions.get(InternalKeys.INTERNAL_APPLICATION_HOME)); - cd.setZkPath(appOptions.get(ZOOKEEPER_PATH)); - cd.setZkHosts(appOptions.get(ZOOKEEPER_QUORUM)); - - return cd; - } - - private static void mergeInComponentMap(ClusterDescription cd, - ConfTree confTree) { - - Map<String, Map<String, String>> components = confTree.components; - for (Map.Entry<String, Map<String, String>> compEntry : components.entrySet()) { - String name = compEntry.getKey(); - Map<String, String> destRole = cd.getOrAddRole(name); - Map<String, String> sourceComponent = compEntry.getValue(); - SliderUtils.mergeMapsIgnoreDuplicateKeys(destRole, sourceComponent); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java b/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java deleted file mode 100644 index 8b0a563..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * 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.slider.api; - -import org.apache.hadoop.yarn.api.records.ContainerId; -import org.apache.slider.api.proto.Messages; -import org.codehaus.jackson.JsonParseException; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.map.JsonMappingException; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.annotate.JsonSerialize; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; - -/** - * Describe a specific node in the cluster - */ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL ) -public final class ClusterNode implements Cloneable { - protected static final Logger - LOG = LoggerFactory.getLogger(ClusterNode.class); - - @JsonIgnore - public ContainerId containerId; - - /** - * server name - */ - public String name; - - - /** - * UUID of container used in Slider RPC to refer to instances - */ - public String id; - - public String role; - - public int roleId; - - public long createTime; - public long startTime; - /** - * flag set when it is released, to know if it has - * already been targeted for termination - */ - public boolean released; - public String host; - public String ip; - public String hostname; - public String hostUrl; - - /** - * state from {@link ClusterDescription} - */ - public int state; - - /** - * Exit code: only valid if the state >= STOPPED - */ - public int exitCode; - - /** - * what was the command executed? - */ - public String command; - - /** - * Any diagnostics - */ - public String diagnostics; - - /** - * What is the tail output from the executed process (or [] if not started - * or the log cannot be picked up - */ - public String[] output; - - /** - * Any environment details - */ - public String[] environment; - - /** - * server-side ctor takes the container ID and builds the name from it - * @param containerId container ID; can be null - */ - public ClusterNode(ContainerId containerId) { - if (containerId != null) { - this.containerId = containerId; - this.name = containerId.toString(); - } - } - - /** - * ctor for deserialization - */ - public ClusterNode() { - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append(name).append(": "); - builder.append(state).append("\n"); - builder.append("state: ").append(state).append("\n"); - builder.append("role: ").append(role).append("\n"); - append(builder, "host", host); - append(builder, "hostURL", hostUrl); - append(builder, "command", command); - if (output != null) { - for (String line : output) { - builder.append(line).append("\n"); - } - } - append(builder, "diagnostics", diagnostics); - return builder.toString(); - } - - private void append(StringBuilder builder, String key, Object val) { - if (val != null) { - builder.append(key).append(": ").append(val.toString()).append("\n"); - } - } - - /** - * Convert to a JSON string - * @return a JSON string description - * @throws IOException Problems mapping/writing the object - */ - public String toJsonString() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(this); - } - - - /** - * Convert from JSON - * @param json input - * @return the parsed JSON - * @throws IOException IO - */ - public static ClusterNode fromJson(String json) - throws IOException, JsonParseException, JsonMappingException { - ObjectMapper mapper = new ObjectMapper(); - try { - return mapper.readValue(json, ClusterNode.class); - } catch (IOException e) { - LOG.error("Exception while parsing json : {}\n{}", e , json, e); - throw e; - } - } - - /** - * Build from a protobuf response - * @param message - * @return the deserialized node - */ - public static ClusterNode fromProtobuf(Messages.RoleInstanceState message) { - ClusterNode node = new ClusterNode(); - node.name = message.getName(); - node.command = message.getCommand(); - node.diagnostics = message.getDiagnostics(); - String[] arr; - int environmentCount = message.getEnvironmentCount(); - if (environmentCount > 0) { - arr = new String[environmentCount]; - node.environment = message.getEnvironmentList().toArray(arr); - } - node.exitCode = message.getExitCode(); - int outputCount = message.getOutputCount(); - if (outputCount > 0) { - arr = new String[outputCount]; - node.output = message.getOutputList().toArray(arr); - } - node.role = message.getRole(); - node.roleId = message.getRoleId(); - node.state = message.getState(); - node.host = message.getHost(); - node.hostUrl = message.getHostURL(); - node.createTime = message.getCreateTime(); - node.startTime = message.getStartTime(); - node.released = message.getReleased(); - return node; - } - - @Override - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - public ClusterNode doClone() { - try { - return (ClusterNode)clone(); - } catch (CloneNotSupportedException e) { - //not going to happen. This is a final class - return null; - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java deleted file mode 100644 index fcaaf0e..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * 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.slider.api; - -/** - * Keys for internal use, go into `internal.json` and not intended for normal - * use except when tuning Slider AM operations - */ -public interface InternalKeys { - - - /** - * Home dir of the app: {@value} - * If set, implies there is a home dir to use - */ - String INTERNAL_APPLICATION_HOME = "internal.application.home"; - /** - * Path to an image file containing the app: {@value} - */ - String INTERNAL_APPLICATION_IMAGE_PATH = "internal.application.image.path"; - /** - * Time in milliseconds to wait after forking any in-AM - * process before attempting to start up the containers: {@value} - * - * A shorter value brings the cluster up faster, but means that if the - * in AM process fails (due to a bad configuration), then time - * is wasted starting containers on a cluster that isn't going to come - * up - */ - String INTERNAL_CONTAINER_STARTUP_DELAY = "internal.container.startup.delay"; - /** - * internal temp directory: {@value} - */ - String INTERNAL_AM_TMP_DIR = "internal.am.tmp.dir"; - /** - * internal temp directory: {@value} - */ - String INTERNAL_TMP_DIR = "internal.tmp.dir"; - /** - * where a snapshot of the original conf dir is: {@value} - */ - String INTERNAL_SNAPSHOT_CONF_PATH = "internal.snapshot.conf.path"; - /** - * where a snapshot of the original conf dir is: {@value} - */ - String INTERNAL_GENERATED_CONF_PATH = "internal.generated.conf.path"; - /** - * where a snapshot of the original conf dir is: {@value} - */ - String INTERNAL_PROVIDER_NAME = "internal.provider.name"; - /** - * where a snapshot of the original conf dir is: {@value} - */ - String INTERNAL_DATA_DIR_PATH = "internal.data.dir.path"; - /** - * where the app def is stored - */ - String INTERNAL_APPDEF_DIR_PATH = "internal.appdef.dir.path"; - /** - * where addons for the app are stored - */ - String INTERNAL_ADDONS_DIR_PATH = "internal.addons.dir.path"; - /** - * Time in milliseconds to wait after forking any in-AM - * process before attempting to start up the containers: {@value} - * - * A shorter value brings the cluster up faster, but means that if the - * in AM process fails (due to a bad configuration), then time - * is wasted starting containers on a cluster that isn't going to come - * up - */ - int DEFAULT_INTERNAL_CONTAINER_STARTUP_DELAY = 5000; - /** - * Time in seconds before a container is considered long-lived. - * Shortlived containers are interpreted as a problem with the role - * and/or the host: {@value} - */ - String INTERNAL_CONTAINER_FAILURE_SHORTLIFE = - "internal.container.failure.shortlife"; - /** - * Default short life threshold: {@value} - */ - int DEFAULT_INTERNAL_CONTAINER_FAILURE_SHORTLIFE = 60; - - /** - * Version of the app: {@value} - */ - String KEYTAB_LOCATION = "internal.keytab.location"; - - /** - * Queue used to deploy the app: {@value} - */ - String INTERNAL_QUEUE = "internal.queue"; - - /** - * Flag to indicate whether or not the chaos monkey is enabled: - * {@value} - */ - String CHAOS_MONKEY_ENABLED = "internal.chaos.monkey.enabled"; - boolean DEFAULT_CHAOS_MONKEY_ENABLED = false; - - - /** - * Rate - */ - - String CHAOS_MONKEY_INTERVAL = "internal.chaos.monkey.interval"; - String CHAOS_MONKEY_INTERVAL_DAYS = CHAOS_MONKEY_INTERVAL + ".days"; - String CHAOS_MONKEY_INTERVAL_HOURS = CHAOS_MONKEY_INTERVAL + ".hours"; - String CHAOS_MONKEY_INTERVAL_MINUTES = CHAOS_MONKEY_INTERVAL + ".minutes"; - String CHAOS_MONKEY_INTERVAL_SECONDS = CHAOS_MONKEY_INTERVAL + ".seconds"; - - int DEFAULT_CHAOS_MONKEY_INTERVAL_DAYS = 0; - int DEFAULT_CHAOS_MONKEY_INTERVAL_HOURS = 0; - int DEFAULT_CHAOS_MONKEY_INTERVAL_MINUTES = 0; - - String CHAOS_MONKEY_DELAY = "internal.chaos.monkey.delay"; - String CHAOS_MONKEY_DELAY_DAYS = CHAOS_MONKEY_DELAY + ".days"; - String CHAOS_MONKEY_DELAY_HOURS = CHAOS_MONKEY_DELAY + ".hours"; - String CHAOS_MONKEY_DELAY_MINUTES = CHAOS_MONKEY_DELAY + ".minutes"; - String CHAOS_MONKEY_DELAY_SECONDS = CHAOS_MONKEY_DELAY + ".seconds"; - - int DEFAULT_CHAOS_MONKEY_STARTUP_DELAY = 0; - - /** - * Prefix for all chaos monkey probabilities - */ - String CHAOS_MONKEY_PROBABILITY = - "internal.chaos.monkey.probability"; - /** - * Probabilies are out of 10000 ; 100==1% - */ - - /** - * Probability of a monkey check killing the AM: {@value} - */ - String CHAOS_MONKEY_PROBABILITY_AM_FAILURE = - CHAOS_MONKEY_PROBABILITY + ".amfailure"; - - /** - * Default probability of a monkey check killing the AM: {@value} - */ - int DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = 0; - - /** - * Probability of a monkey check killing the AM: {@value} - */ - String CHAOS_MONKEY_PROBABILITY_AM_LAUNCH_FAILURE = - CHAOS_MONKEY_PROBABILITY + ".amlaunchfailure"; - - /** - * Probability of a monkey check killing a container: {@value} - */ - - String CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = - CHAOS_MONKEY_PROBABILITY + ".containerfailure"; - - /** - * Default probability of a monkey check killing the a container: {@value} - */ - int DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = 0; - - - /** - * 1% of chaos - */ - int PROBABILITY_PERCENT_1 = 100; - - /** - * 100% for chaos values - */ - int PROBABILITY_PERCENT_100 = 100 * PROBABILITY_PERCENT_1; - - /** - * interval between checks for escalation: {@value} - */ - String ESCALATION_CHECK_INTERVAL = "escalation.check.interval.seconds"; - - /** - * default value: {@value} - */ - int DEFAULT_ESCALATION_CHECK_INTERVAL = 30; -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java b/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java deleted file mode 100644 index a035a99..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.slider.api; - -/** - * Keys for entries in the <code>options</code> section - * of a cluster description. - */ -public interface OptionKeys extends InternalKeys { - - /** - * Time in milliseconds to wait after forking any in-AM - * process before attempting to start up the containers: {@value} - * - * A shorter value brings the cluster up faster, but means that if the - * in AM process fails (due to a bad configuration), then time - * is wasted starting containers on a cluster that isn't going to come - * up - */ - String APPLICATION_TYPE = "application.type"; - - String APPLICATION_NAME = "application.name"; - - /** - * Prefix for site.xml options: {@value} - */ - String SITE_XML_PREFIX = "site."; - - - /** - * Zookeeper quorum host list: {@value} - */ - String ZOOKEEPER_QUORUM = "zookeeper.quorum"; - String ZOOKEEPER_HOSTS = "zookeeper.hosts"; - String ZOOKEEPER_PORT = "zookeeper.port"; - - /** - * Zookeeper path value (string): {@value} - */ - String ZOOKEEPER_PATH = "zookeeper.path"; - -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java b/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java deleted file mode 100644 index 92890be..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * 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.slider.api; - -/** - * These are the keys valid in resource options - * - /* - - Container failure window. - - The window is calculated in minutes as as (days * 24 *60 + hours* 24 + minutes) - - Every interval of this period after the AM is started/restarted becomes - the time period in which the CONTAINER_FAILURE_THRESHOLD value is calculated. - - After the window limit is reached, the failure counts are reset. This - is not a sliding window/moving average policy, simply a rule such as - "every six hours the failure count is reset" - - - <pre> - =========================================================================== - </pre> - - */ -public interface ResourceKeys { - - - /** - * #of instances of a component: {@value} - * - */ - String COMPONENT_INSTANCES = "yarn.component.instances"; - - /** - * Whether to use unique names for each instance of a component: {@value} - */ - String UNIQUE_NAMES = "component.unique.names"; - - /** - * Amount of memory to ask YARN for in MB. - * <i>Important:</i> this may be a hard limit on the - * amount of RAM that the service can use - * {@value} - */ - String YARN_MEMORY = "yarn.memory"; - - /** {@value} */ - int DEF_YARN_MEMORY = 256; - - /** - * Number of cores/virtual cores to ask YARN for - * {@value} - */ - String YARN_CORES = "yarn.vcores"; - - /** - * Number of disks per instance to ask YARN for - * {@value} - */ - String YARN_DISKS = "yarn.disks.count-per-instance"; - - /** - * Disk size per disk to ask YARN for - * {@value} - */ - String YARN_DISK_SIZE = "yarn.disk.size"; - - /** {@value} */ - int DEF_YARN_CORES = 1; - - - /** - * Label expression that this container must satisfy - * {@value} - */ - String YARN_LABEL_EXPRESSION = "yarn.label.expression"; - - /** default label expression: */ - String DEF_YARN_LABEL_EXPRESSION = null; - - - /** - * Constant to indicate that the requirements of a YARN resource limit - * (cores, memory, ...) should be set to the maximum allowed by - * the queue into which the YARN container requests are placed. - */ - String YARN_RESOURCE_MAX = "max"; - - /** - * Mandatory property for all roles - * 1. this must be defined. - * 2. this must be >= 1 - * 3. this must not match any other role priority in the cluster. - */ - String COMPONENT_PRIORITY = "yarn.role.priority"; - - /** - * placement policy - */ - String COMPONENT_PLACEMENT_POLICY = "yarn.component.placement.policy"; - - /** - * Maximum number of node failures that can be tolerated by a component on a specific node - */ - String NODE_FAILURE_THRESHOLD = - "yarn.node.failure.threshold"; - - /** - * maximum number of failed containers (in a single role) - * before the cluster is deemed to have failed {@value} - */ - String CONTAINER_FAILURE_THRESHOLD = - "yarn.container.failure.threshold"; - - /** - * prefix for the time of the container failure reset window. - * {@value} - */ - - String CONTAINER_FAILURE_WINDOW = - "yarn.container.failure.window"; - - - - int DEFAULT_CONTAINER_FAILURE_WINDOW_DAYS = 0; - int DEFAULT_CONTAINER_FAILURE_WINDOW_HOURS = 6; - int DEFAULT_CONTAINER_FAILURE_WINDOW_MINUTES = 0; - - - /** - * Default failure threshold: {@value} - */ - int DEFAULT_CONTAINER_FAILURE_THRESHOLD = 5; - - /** - * Default node failure threshold for a component instance: {@value} - * Should to be lower than default component failure threshold to allow - * the component to start elsewhere - */ - int DEFAULT_NODE_FAILURE_THRESHOLD = 3; - - /** - * Failure threshold is unlimited: {@value} - */ - int NODE_FAILURE_THRESHOLD_UNLIMITED = -1; - - /** - * Time in seconds to escalate placement delay - */ - String PLACEMENT_ESCALATE_DELAY = - "yarn.placement.escalate.seconds"; - - /** - * Time to have a strict placement policy outstanding before - * downgrading to a lax placement (for those components which permit that). - * <ol> - * <li>For strictly placed components, there's no relaxation.</li> - * <li>For components with no locality, there's no need to relax</li> - * </ol> - * - */ - int DEFAULT_PLACEMENT_ESCALATE_DELAY_SECONDS = 30; - - /** - * Log aggregation include, exclude patterns - */ - String YARN_LOG_INCLUDE_PATTERNS = "yarn.log.include.patterns"; - String YARN_LOG_EXCLUDE_PATTERNS = "yarn.log.exclude.patterns"; - - String YARN_PROFILE_NAME = "yarn.resource-profile-name"; - - /** - * Window of time where application master's failure count - * can be reset to 0. - */ - String YARN_RESOURCEMANAGER_AM_RETRY_COUNT_WINDOW_MS = - "yarn.resourcemanager.am.retry-count-window-ms"; - - /** - * The default window for Slider. - */ - long DEFAULT_AM_RETRY_COUNT_WINDOW_MS = 300000; -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java b/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java deleted file mode 100644 index ce413ff..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * 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.slider.api; - -/** - * Standard options for roles - */ -public interface RoleKeys { - - - /** - * The name of a role: {@value} - */ - String ROLE_NAME = "role.name"; - - /** - * The group of a role: {@value} - */ - String ROLE_GROUP = "role.group"; - - /** - * The prefix of a role: {@value} - */ - String ROLE_PREFIX = "role.prefix"; - - /** - * Status report: number actually granted : {@value} - */ - String ROLE_ACTUAL_INSTANCES = "role.actual.instances"; - - /** - * Status report: number currently requested: {@value} - */ - String ROLE_REQUESTED_INSTANCES = "role.requested.instances"; - - /** - * Status report: number currently being released: {@value} - */ - String ROLE_RELEASING_INSTANCES = "role.releasing.instances"; - - /** - * Status report: total number that have failed: {@value} - */ - String ROLE_FAILED_INSTANCES = "role.failed.instances"; - - /** - * Status report: number that have failed recently: {@value} - */ - String ROLE_FAILED_RECENTLY_INSTANCES = "role.failed.recently.instances"; - - /** - * Status report: number that have failed for node-related issues: {@value} - */ - String ROLE_NODE_FAILED_INSTANCES = "role.failed.node.instances"; - - /** - * Status report: number that been pre-empted: {@value} - */ - String ROLE_PREEMPTED_INSTANCES = "role.failed.preempted.instances"; - - /** - * Number of pending anti-affine instances: {@value} - */ - String ROLE_PENDING_AA_INSTANCES = "role.pending.aa.instances"; - - /** - * Status report: number currently being released: {@value} - */ - String ROLE_FAILED_STARTING_INSTANCES = "role.failed.starting.instances"; - - /** - * Extra arguments (non-JVM) to use when starting this role - */ - String ROLE_ADDITIONAL_ARGS = "role.additional.args"; - - /** - * JVM heap size for Java applications in MB. Only relevant for Java applications. - * This MUST be less than or equal to the {@link ResourceKeys#YARN_MEMORY} option - * {@value} - */ - String JVM_HEAP = "jvm.heapsize"; - - /* - * GC options for Java applications. - */ - String GC_OPTS = "gc.opts"; - - /** - * JVM options other than heap size. Only relevant for Java applications. - * {@value} - */ - String JVM_OPTS = "jvm.opts"; - - - /** - * All keys w/ env. are converted into env variables and passed down - */ - String ENV_PREFIX = "env."; - - /** - * Container service record attribute prefix. - */ - String SERVICE_RECORD_ATTRIBUTE_PREFIX = "service.record.attribute"; - -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/SliderApplicationApi.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/SliderApplicationApi.java b/slider-core/src/main/java/org/apache/slider/api/SliderApplicationApi.java deleted file mode 100644 index d21785f..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/SliderApplicationApi.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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.slider.api; - -import org.apache.slider.api.types.ApplicationLivenessInformation; -import org.apache.slider.api.types.ComponentInformation; -import org.apache.slider.api.types.ContainerInformation; -import org.apache.slider.api.types.NodeInformation; -import org.apache.slider.api.types.NodeInformationList; -import org.apache.slider.api.types.PingInformation; -import org.apache.slider.core.conf.AggregateConf; -import org.apache.slider.core.conf.ConfTree; -import org.apache.slider.core.conf.ConfTreeOperations; - -import java.io.IOException; -import java.util.Map; - -/** - * API exported by the slider remote REST/IPC endpoints. - */ -public interface SliderApplicationApi { - /** - * Get the aggregate desired model - * @return the aggregate configuration of what was asked for - * -before resolution has taken place - * @throws IOException on any failure - */ - AggregateConf getDesiredModel() throws IOException; - - /** - * Get the desired application configuration - * @return the application configuration asked for - * -before resolution has taken place - * @throws IOException on any failure - */ - ConfTreeOperations getDesiredAppconf() throws IOException; - - /** - * Get the desired YARN resources - * @return the resources asked for - * -before resolution has taken place - * @throws IOException on any failure - */ - ConfTreeOperations getDesiredResources() throws IOException; - - /** - * Put an updated resources structure. This triggers a cluster flex - * operation - * @param updated updated resources - * @throws IOException on any problem. - */ - void putDesiredResources(ConfTree updated) throws IOException; - - /** - * Get the aggregate resolved model - * @return the aggregate configuration of what was asked for - * -after resolution has taken place - * @throws IOException on any failure - */ - AggregateConf getResolvedModel() throws IOException; - - /** - * Get the resolved application configuration - * @return the application configuration asked for - * -after resolution has taken place - * @throws IOException on any failure - */ - ConfTreeOperations getResolvedAppconf() throws IOException; - - /** - * Get the resolved YARN resources - * @return the resources asked for - * -after resolution has taken place - * @throws IOException on any failure - */ - ConfTreeOperations getResolvedResources() throws IOException; - - /** - * Get the live YARN resources - * @return the live set of resources in the cluster - * @throws IOException on any failure - */ - ConfTreeOperations getLiveResources() throws IOException; - - /** - * Get a map of live containers [containerId:info] - * @return a possibly empty list of serialized containers - * @throws IOException on any failure - */ - Map<String, ContainerInformation> enumContainers() throws IOException; - - /** - * Get a container from the container Id - * @param containerId YARN container ID - * @return the container information - * @throws IOException on any failure - */ - ContainerInformation getContainer(String containerId) throws IOException; - - /** - * List all components into a map of [name:info] - * @return a possibly empty map of components - * @throws IOException on any failure - */ - Map<String, ComponentInformation> enumComponents() throws IOException; - - /** - * Get information about a component - * @param componentName name of the component - * @return the component details - * @throws IOException on any failure - */ - ComponentInformation getComponent(String componentName) throws IOException; - - /** - * List all nodes into a map of [name:info] - * @return a possibly empty list of nodes - * @throws IOException on any failure - */ - NodeInformationList getLiveNodes() throws IOException; - - /** - * Get information about a node - * @param hostname name of the node - * @return the node details - * @throws IOException on any failure - */ - NodeInformation getLiveNode(String hostname) throws IOException; - - /** - * Ping as a GET - * @param text text to include - * @return the response - * @throws IOException on any failure - */ - PingInformation ping(String text) throws IOException; - - /** - * Stop the AM (async operation) - * @param text text to include - * @throws IOException on any failure - */ - void stop(String text) throws IOException; - - /** - * Get the application liveness - * @return current liveness information - * @throws IOException - */ - ApplicationLivenessInformation getApplicationLiveness() throws IOException; -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/SliderClusterProtocol.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/SliderClusterProtocol.java b/slider-core/src/main/java/org/apache/slider/api/SliderClusterProtocol.java deleted file mode 100644 index 33fce22..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/SliderClusterProtocol.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * 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") throws IOException, YarnException; 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.slider.api; - -import org.apache.hadoop.ipc.VersionedProtocol; -import org.apache.hadoop.security.KerberosInfo; -import org.apache.hadoop.yarn.exceptions.YarnException; -import org.apache.slider.api.proto.Messages; -import org.apache.slider.common.SliderXmlConfKeys; - -import java.io.IOException; - -/** - * Cluster protocol. This can currently act as a versioned IPC - * endpoint or be relayed via protobuf - */ -@KerberosInfo(serverPrincipal = SliderXmlConfKeys.KEY_KERBEROS_PRINCIPAL) -public interface SliderClusterProtocol extends VersionedProtocol { - long versionID = 0x01; - - /** - * Stop the cluster - */ - - Messages.StopClusterResponseProto stopCluster(Messages.StopClusterRequestProto request) throws - IOException, YarnException; - /** - * Upgrade the application containers - * - * @param request upgrade containers request object - * @return upgrade containers response object - * @throws IOException - * @throws YarnException - */ - Messages.UpgradeContainersResponseProto upgradeContainers( - Messages.UpgradeContainersRequestProto request) throws IOException, - YarnException; - - /** - * Flex the cluster. - */ - Messages.FlexClusterResponseProto flexCluster(Messages.FlexClusterRequestProto request) - throws IOException; - - - /** - * Get the current cluster status - */ - Messages.GetJSONClusterStatusResponseProto getJSONClusterStatus(Messages.GetJSONClusterStatusRequestProto request) - throws IOException, YarnException; - - - /** - * List all running nodes in a role - */ - Messages.ListNodeUUIDsByRoleResponseProto listNodeUUIDsByRole(Messages.ListNodeUUIDsByRoleRequestProto request) - throws IOException, YarnException; - - - /** - * Get the details on a node - */ - Messages.GetNodeResponseProto getNode(Messages.GetNodeRequestProto request) - throws IOException, YarnException; - - /** - * Get the - * details on a list of nodes. - * Unknown nodes are not returned - * <i>Important: the order of the results are undefined</i> - */ - Messages.GetClusterNodesResponseProto getClusterNodes(Messages.GetClusterNodesRequestProto request) - throws IOException, YarnException; - - /** - * Echo back the submitted text (after logging it). - * Useful for adding information to the log, and for testing round trip - * operations of the protocol - * @param request request - * @return response - * @throws IOException - * @throws YarnException - */ - Messages.EchoResponseProto echo(Messages.EchoRequestProto request) throws IOException, YarnException; - - /** - * Kill an identified container - * @param request request containing the container to kill - * @return the response - * @throws IOException - * @throws YarnException - */ - Messages.KillContainerResponseProto killContainer(Messages.KillContainerRequestProto request) - throws IOException, YarnException; - - /** - * AM to commit suicide. If the Hadoop halt entry point has not been disabled, - * this will fail rather than return with a response. - * @param request request - * @return response (this is not the expected outcome) - * @throws IOException - * @throws YarnException - */ - Messages.AMSuicideResponseProto amSuicide(Messages.AMSuicideRequestProto request) - throws IOException; - - /** - * Get the instance definition - */ - Messages.GetInstanceDefinitionResponseProto getInstanceDefinition( - Messages.GetInstanceDefinitionRequestProto request) - throws IOException, YarnException; - - /** - * Get the application liveness - * @return current liveness information - * @throws IOException - */ - Messages.ApplicationLivenessInformationProto getLivenessInformation( - Messages.GetApplicationLivenessRequestProto request - ) throws IOException; - - Messages.GetLiveContainersResponseProto getLiveContainers( - Messages.GetLiveContainersRequestProto request - ) throws IOException; - - Messages.ContainerInformationProto getLiveContainer( - Messages.GetLiveContainerRequestProto request - ) throws IOException; - - Messages.GetLiveComponentsResponseProto getLiveComponents( - Messages.GetLiveComponentsRequestProto request - ) throws IOException; - - Messages.ComponentInformationProto getLiveComponent( - Messages.GetLiveComponentRequestProto request - ) throws IOException; - - Messages.GetLiveNodesResponseProto getLiveNodes( - Messages.GetLiveNodesRequestProto request - ) throws IOException; - - Messages.NodeInformationProto getLiveNode( - Messages.GetLiveNodeRequestProto request - ) throws IOException; - - Messages.WrappedJsonProto getModelDesired(Messages.EmptyPayloadProto request) throws IOException; - - Messages.WrappedJsonProto getModelDesiredAppconf(Messages.EmptyPayloadProto request) throws IOException; - - Messages.WrappedJsonProto getModelDesiredResources(Messages.EmptyPayloadProto request) throws IOException; - - Messages.WrappedJsonProto getModelResolved(Messages.EmptyPayloadProto request) throws IOException; - - Messages.WrappedJsonProto getModelResolvedAppconf(Messages.EmptyPayloadProto request) throws IOException; - - Messages.WrappedJsonProto getModelResolvedResources(Messages.EmptyPayloadProto request) throws IOException; - - Messages.WrappedJsonProto getLiveResources(Messages.EmptyPayloadProto request) throws IOException; - - Messages.GetCertificateStoreResponseProto getClientCertificateStore(Messages.GetCertificateStoreRequestProto request) - throws IOException; -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/StateValues.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/StateValues.java b/slider-core/src/main/java/org/apache/slider/api/StateValues.java deleted file mode 100644 index 03751e1..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/StateValues.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.slider.api; - -/** - * Enumeration of state values - */ -public class StateValues { - - /** - * Specification is incomplete & cannot - * be used: {@value} - */ - public static final int STATE_INCOMPLETE = 0; - - /** - * Spec has been submitted: {@value} - */ - public static final int STATE_SUBMITTED = 1; - /** - * Cluster created: {@value} - */ - public static final int STATE_CREATED = 2; - /** - * Live: {@value} - */ - public static final int STATE_LIVE = 3; - /** - * Stopped - */ - public static final int STATE_STOPPED = 4; - /** - * destroyed - */ - public static final int STATE_DESTROYED = 5; - -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/api/StatusKeys.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/StatusKeys.java b/slider-core/src/main/java/org/apache/slider/api/StatusKeys.java deleted file mode 100644 index 8a2c4bb..0000000 --- a/slider-core/src/main/java/org/apache/slider/api/StatusKeys.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * 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.slider.api; -import static org.apache.slider.api.ResourceKeys.COMPONENT_INSTANCES; -/** - * Contains status and statistics keys - */ -public interface StatusKeys { - - String STATISTICS_CONTAINERS_ACTIVE_REQUESTS = "containers.active.requests"; - String STATISTICS_CONTAINERS_COMPLETED = "containers.completed"; - String STATISTICS_CONTAINERS_DESIRED = "containers.desired"; - String STATISTICS_CONTAINERS_FAILED = "containers.failed"; - String STATISTICS_CONTAINERS_FAILED_RECENTLY = "containers.failed.recently"; - String STATISTICS_CONTAINERS_FAILED_NODE = "containers.failed.node"; - String STATISTICS_CONTAINERS_PREEMPTED = "containers.failed.preempted"; - String STATISTICS_CONTAINERS_LIVE = "containers.live"; - String STATISTICS_CONTAINERS_REQUESTED = "containers.requested"; - String STATISTICS_CONTAINERS_ANTI_AFFINE_PENDING = "containers.anti-affine.pending"; - String STATISTICS_CONTAINERS_STARTED = "containers.start.started"; - String STATISTICS_CONTAINERS_START_FAILED = - "containers.start.failed"; - String STATISTICS_CONTAINERS_SURPLUS = - "containers.surplus"; - String STATISTICS_CONTAINERS_UNKNOWN_COMPLETED = - "containers.unknown.completed"; - /** - * No of containers provided on AM restart - */ - String INFO_CONTAINERS_AM_RESTART = "containers.at.am-restart"; - - String INFO_CREATE_TIME_MILLIS = "create.time.millis"; - String INFO_CREATE_TIME_HUMAN = "create.time"; - String INFO_LIVE_TIME_MILLIS = "live.time.millis"; - String INFO_LIVE_TIME_HUMAN = "live.time"; - String INFO_FLEX_TIME_MILLIS = "flex.time.millis"; - String INFO_FLEX_TIME_HUMAN = "flex.time"; - - String INFO_MASTER_ADDRESS = "info.master.address"; - - /** - * System time in millis when the status report was generated - */ - String INFO_STATUS_TIME_MILLIS = "status.time.millis"; - - /** - * System time in human form when the status report was generated - */ - String INFO_STATUS_TIME_HUMAN = "status.time"; - - String INFO_AM_APP_ID = "info.am.app.id"; - String INFO_AM_ATTEMPT_ID = "info.am.attempt.id"; - String INFO_AM_CONTAINER_ID = "info.am.container.id"; - String INFO_AM_HOSTNAME = "info.am.hostname"; - String INFO_AM_RPC_PORT = "info.am.rpc.port"; - String INFO_AM_WEB_PORT = "info.am.web.port"; - String INFO_AM_WEB_URL = "info.am.web.url"; - String INFO_AM_AGENT_STATUS_PORT = "info.am.agent.status.port"; - String INFO_AM_AGENT_OPS_PORT = "info.am.agent.ops.port"; - String INFO_AM_AGENT_OPS_URL = "info.am.agent.ops.url"; - String INFO_AM_AGENT_STATUS_URL = "info.am.agent.status.url"; - - /** - * info: #of instances of a component requested: {@value} - * - */ - String COMPONENT_INSTANCES_ACTUAL = COMPONENT_INSTANCES + ".actual"; - - /** - * info: #of instances of a component requested: {@value} - * - */ - String COMPONENT_INSTANCES_REQUESTING = COMPONENT_INSTANCES + ".requesting"; - - /** - * info: #of instances of a component being released: {@value} - * - */ - String COMPONENT_INSTANCES_RELEASING = COMPONENT_INSTANCES + ".releasing"; - - /** - * info: #of instances of a component failed: {@value} - * - */ - String COMPONENT_INSTANCES_FAILED = COMPONENT_INSTANCES + ".failed"; - - /** - * info: #of instances of a component started: {@value} - * - */ - String COMPONENT_INSTANCES_STARTED = COMPONENT_INSTANCES + ".started"; - - - /** - * info: #of instances of a component completed: {@value} - * - */ - String COMPONENT_INSTANCES_COMPLETED = COMPONENT_INSTANCES + ".completed"; - - -}