/*
 * 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.common.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_ALL = "--all";
  String ARG_APPLICATION = "--application";
  String ARG_APP_HOME = "--apphome";
  String ARG_BASE_PATH = "--basepath";
  String ARG_CLIENT = "--client";
  String ARG_CONFDIR = "--appconf";
  String ARG_COMPONENT = "--component";
  String ARG_COMPONENT_SHORT = "--comp";
  String ARG_COMP_OPT= "--compopt";
  String ARG_COMP_OPT_SHORT = "--co";
  String ARG_CREDENTIALS = "--credentials";

  String ARG_DEBUG = "--debug";
  String ARG_DEFINE = "-D";
  String ARG_DEST = "--dest";
  String ARG_DESTDIR = "--destdir";
  String ARG_DESTFILE = "--destfile";
  String ARG_EXITCODE = "--exitcode";
  /**
   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_GETCONF = "--getconf";
  String ARG_GETEXP = "--getexp";
  String ARG_GETFILES = "--getfiles";
  String ARG_HELP = "--help";
  String ARG_ID = "--id";
  String ARG_IMAGE = "--image";
  String ARG_INTERNAL = "--internal";
  String ARG_KEYTAB = "--keytab";
  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_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_PATH = "--path";
  String ARG_PROVIDER = "--provider";
  String ARG_QUEUE = "--queue";
  String ARG_REPLACE_PKG = "--replacepkg";
  String ARG_RESOURCES = "--resources";
  String ARG_RES_COMP_OPT = "--rescompopt";
  String ARG_RES_COMP_OPT_SHORT = "--rco";
  String ARG_RESOURCE_MANAGER = "--rm";
  String ARG_RESOURCE_OPT = "--resopt";
  String ARG_RESOURCE_OPT_SHORT = "-ro";
  String ARG_SERVICETYPE = "--servicetype";
  String ARG_SLIDER = "--slider";
  String ARG_STATE = "--state";
  String ARG_SYSPROP = "-S";
  String ARG_TEMPLATE = "--template";
  String ARG_USER = "--user";
  String ARG_VERBOSE = "--verbose";
  String ARG_WAIT = "--wait";
  String ARG_YARN = "--yarn";
  String ARG_ZKHOSTS = "--zkhosts";
  String ARG_ZKPATH = "--zkpath";
  String ARG_ZKPORT = "--zkport";


  /**
   * Deprecated
   */
  @Deprecated
  String ARG_ROLE = "--role";
  @Deprecated
  String ARG_ROLEOPT = "--roleopt";

  /**
   * server: URI for the cluster
   */
  String ARG_CLUSTER_URI = "-cluster-uri";


  /**
   * server: Path for the resource manager instance (required)
   */
  String ARG_RM_ADDR = "--rm";

  String FORMAT_XML = "xml";
  String FORMAT_PROPERTIES = "properties";

}
