You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by in...@apache.org on 2017/05/02 21:54:17 UTC

[21/50] [abbrv] hadoop git commit: YARN-679. Add an entry point that can start any Yarn service. Contributed by Steve Loughran.

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/ExceptionInExecuteLaunchableService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/ExceptionInExecuteLaunchableService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/ExceptionInExecuteLaunchableService.java
new file mode 100644
index 0000000..405544f
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/ExceptionInExecuteLaunchableService.java
@@ -0,0 +1,96 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.launcher.AbstractLaunchableService;
+import org.apache.hadoop.service.launcher.LauncherExitCodes;
+import org.apache.hadoop.service.launcher.ServiceLaunchException;
+import org.apache.hadoop.util.ExitCodeProvider;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Raise an exception in the execute() method; the exception type can
+ * be configured from the CLI.
+ */
+public class ExceptionInExecuteLaunchableService extends
+    AbstractLaunchableService {
+
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.ExceptionInExecuteLaunchableService";
+  public static final String ARG_THROW_SLE = "--SLE";
+  public static final String ARG_THROW_IOE = "--IOE";
+  public static final String ARG_THROWABLE = "--throwable";
+  public static final String SLE_TEXT = "SLE raised in execute()";
+  public static final String OTHER_EXCEPTION_TEXT = "Other exception";
+
+  public static final String EXIT_IN_IOE_TEXT = "Exit in IOE";
+  public static final int IOE_EXIT_CODE = 64;
+  private ExType exceptionType = ExType.EX;
+
+  public ExceptionInExecuteLaunchableService() {
+    super("ExceptionInExecuteLaunchedService");
+  }
+
+  @Override
+  public Configuration bindArgs(Configuration config, List<String> args) throws
+      Exception {
+    if (args.contains(ARG_THROW_SLE)) {
+      exceptionType = ExType.SLE;
+    } else if (args.contains(ARG_THROW_IOE)) {
+      exceptionType = ExType.IOE;
+    } else if (args.contains(ARG_THROWABLE)) {
+      exceptionType = ExType.THROWABLE;
+    }
+    return super.bindArgs(config, args);
+  }
+
+  @Override
+  public int execute() throws Exception {
+    switch (exceptionType) {
+    case SLE:
+      throw new ServiceLaunchException(LauncherExitCodes.EXIT_OTHER_FAILURE,
+          SLE_TEXT);
+    case IOE:
+      throw new IOECodedException();
+    case THROWABLE:
+      throw new OutOfMemoryError("OOM");
+    case EX:
+    default:
+      throw new Exception(OTHER_EXCEPTION_TEXT);
+    }
+  }
+
+  enum ExType {EX, SLE, IOE, THROWABLE}
+
+  public static class IOECodedException extends IOException implements
+      ExitCodeProvider {
+
+    public IOECodedException() {
+      super(EXIT_IN_IOE_TEXT);
+    }
+
+    @Override
+    public int getExitCode() {
+      return IOE_EXIT_CODE;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInConstructorService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInConstructorService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInConstructorService.java
new file mode 100644
index 0000000..9fde1b3
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInConstructorService.java
@@ -0,0 +1,33 @@
+/*
+ * 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.service.launcher.testservices;
+
+/**
+ * Service which fails in its constructor.
+ */
+public class FailInConstructorService extends FailureTestService {
+
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.FailInConstructorService";
+
+  public FailInConstructorService() {
+    super(false, false, false, 0);
+    throw new NullPointerException("oops");
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInInitService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInInitService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInInitService.java
new file mode 100644
index 0000000..e4f93c4
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInInitService.java
@@ -0,0 +1,38 @@
+/*
+ * 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.service.launcher.testservices;
+
+/**
+ * Service which fails in its init() operation.
+ */
+public class FailInInitService extends FailureTestService {
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.FailInInitService";
+  public static final int EXIT_CODE = -1;
+
+  public FailInInitService() {
+    super(true, false, false, 0
+    );
+  }
+
+  @Override
+  int getExitCode() {
+    return EXIT_CODE;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInStartService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInStartService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInStartService.java
new file mode 100644
index 0000000..32049f2
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailInStartService.java
@@ -0,0 +1,37 @@
+/*
+ * 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.service.launcher.testservices;
+
+/**
+ * Service which fails in its start() operation.
+ */
+public class FailInStartService extends FailureTestService {
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.FailInStartService";
+  public static final int EXIT_CODE = -2;
+
+  public FailInStartService() {
+    super(false, true, false, 0);
+  }
+
+  @Override
+  int getExitCode() {
+    return EXIT_CODE;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailingStopInStartService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailingStopInStartService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailingStopInStartService.java
new file mode 100644
index 0000000..6b8b07a
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailingStopInStartService.java
@@ -0,0 +1,47 @@
+/*
+ * 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.service.launcher.testservices;
+
+/**
+ * This service stops during its start operation.
+ */
+public class FailingStopInStartService extends FailureTestService {
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.FailingStopInStartService";
+  public static final int EXIT_CODE = -4;
+
+  public FailingStopInStartService() {
+    super(false, false, true, 0);
+  }
+
+  @Override
+  protected void serviceStart() throws Exception {
+    super.serviceStart();
+    try {
+      stop();
+    } catch (Exception e) {
+      //this is secretly swallowed
+    }
+  }
+
+  @Override
+  int getExitCode() {
+    return EXIT_CODE;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailureTestService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailureTestService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailureTestService.java
new file mode 100644
index 0000000..8faf620
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/FailureTestService.java
@@ -0,0 +1,55 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.service.BreakableService;
+import org.apache.hadoop.service.launcher.ServiceLaunchException;
+
+/**
+ * Launcher test service that does not take CLI arguments.
+ */
+public class FailureTestService extends BreakableService {
+
+  private final int delay;
+
+  public FailureTestService(boolean failOnInit,
+      boolean failOnStart,
+      boolean failOnStop,
+      int delay) {
+    super(failOnInit, failOnStart, failOnStop);
+    this.delay = delay;
+  }
+
+  @Override
+  protected void serviceStop() throws Exception {
+    if (delay > 0) {
+      Thread.sleep(delay);
+    }
+    super.serviceStop();
+  }
+
+  @Override
+  protected Exception createFailureException(String action) {
+    return new ServiceLaunchException(getExitCode(), toString());
+  }
+
+  int getExitCode() {
+    return -1;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/InitInConstructorLaunchableService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/InitInConstructorLaunchableService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/InitInConstructorLaunchableService.java
new file mode 100644
index 0000000..541ac68
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/InitInConstructorLaunchableService.java
@@ -0,0 +1,63 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.launcher.AbstractLaunchableService;
+import org.junit.Assert;
+
+import java.util.List;
+
+/**
+ * Init in the constructor and make sure that it isn't inited again.
+ */
+public class InitInConstructorLaunchableService extends
+    AbstractLaunchableService {
+
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.InitInConstructorLaunchableService";
+  private final Configuration originalConf = new Configuration();
+
+  public InitInConstructorLaunchableService() {
+    super("InitInConstructorLaunchableService");
+    init(originalConf);
+  }
+
+  @Override
+  public void init(Configuration conf) {
+    Assert.assertEquals(STATE.NOTINITED, getServiceState());
+    super.init(conf);
+  }
+
+  @Override
+  public Configuration bindArgs(Configuration config, List<String> args)
+      throws Exception {
+    Assert.assertEquals(STATE.INITED, getServiceState());
+    Assert.assertTrue(isInState(STATE.INITED));
+    Assert.assertNotSame(getConfig(), config);
+    return null;
+  }
+
+  @Override
+  public int execute() throws Exception {
+    Assert.assertEquals(STATE.STARTED, getServiceState());
+    Assert.assertSame(originalConf, getConfig());
+    return super.execute();
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/LaunchableRunningService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/LaunchableRunningService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/LaunchableRunningService.java
new file mode 100644
index 0000000..91d0f2e
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/LaunchableRunningService.java
@@ -0,0 +1,111 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.launcher.LaunchableService;
+import org.apache.hadoop.service.launcher.LauncherExitCodes;
+import org.junit.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * A service which implements {@link LaunchableService}.
+ * It
+ * <ol>
+ *   <li>does nothing in its {@link #serviceStart()}</li>
+ *   <li>does its sleep+ maybe fail operation in its {@link #execute()}
+ *   method</li>
+ *   <li>gets the failing flag from the argument {@link #ARG_FAILING} first,
+ *   the config file second.</li>
+ *   <li>returns 0 for a successful execute</li>
+ *   <li>returns a configurable exit code for a failing execute</li>
+ *   <li>generates a new configuration in {@link #bindArgs(Configuration, List)}
+ *   to verify that these propagate.</li>
+ * </ol>
+ */
+public class LaunchableRunningService extends RunningService implements
+    LaunchableService {
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.LaunchableRunningService";
+  public static final String ARG_FAILING = "--failing";
+  public static final String EXIT_CODE_PROP = "exit.code";
+  private static final Logger LOG =
+      LoggerFactory.getLogger(LaunchableRunningService.class);
+  private int exitCode = 0;
+
+  public LaunchableRunningService() {
+    this("LaunchableRunningService");
+  }
+
+  public LaunchableRunningService(String name) {
+    super(name);
+  }
+
+  @Override
+  public Configuration bindArgs(Configuration config, List<String> args) throws
+      Exception {
+    Assert.assertEquals(STATE.NOTINITED, getServiceState());
+    for (String arg : args) {
+      LOG.info(arg);
+    }
+    Configuration newConf = new Configuration(config);
+    if (args.contains(ARG_FAILING)) {
+      LOG.info("CLI contains " + ARG_FAILING);
+      failInRun = true;
+      newConf.setInt(EXIT_CODE_PROP, LauncherExitCodes.EXIT_OTHER_FAILURE);
+    }
+    return newConf;
+  }
+
+  @Override
+  protected void serviceInit(Configuration conf) throws Exception {
+    super.serviceInit(conf);
+    if (conf.getBoolean(FAIL_IN_RUN, false)) {
+      //if the conf value says fail, the exit code goes to it too
+      exitCode = LauncherExitCodes.EXIT_FAIL;
+    }
+    // the exit code can be read off the property
+    exitCode = conf.getInt(EXIT_CODE_PROP, exitCode);
+  }
+
+  @Override
+  protected void serviceStart() throws Exception {
+    // no-op
+  }
+
+  @Override
+  public int execute() throws Exception {
+    Thread.sleep(delayTime);
+    if (failInRun) {
+      return exitCode;
+    }
+    return 0;
+  }
+
+  public int getExitCode() {
+    return exitCode;
+  }
+
+  public void setExitCode(int exitCode) {
+    this.exitCode = exitCode;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NoArgsAllowedService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NoArgsAllowedService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NoArgsAllowedService.java
new file mode 100644
index 0000000..602cb15
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NoArgsAllowedService.java
@@ -0,0 +1,64 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.launcher.AbstractLaunchableService;
+import org.apache.hadoop.service.launcher.LauncherExitCodes;
+import org.apache.hadoop.service.launcher.ServiceLaunchException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * service that does not allow any arguments.
+ */
+public class NoArgsAllowedService extends AbstractLaunchableService {
+
+  private static final Logger LOG =
+      LoggerFactory.getLogger(NoArgsAllowedService.class);
+
+  public NoArgsAllowedService() {
+    super("NoArgsAllowedService");
+  }
+
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.NoArgsAllowedService";
+  
+  @Override
+  public Configuration bindArgs(Configuration config, List<String> args)
+      throws Exception {
+    Configuration configuration = super.bindArgs(config, args);
+    if (!args.isEmpty()) {
+      StringBuilder argsList = new StringBuilder();
+      for (String arg : args) {
+        argsList.append('"').append(arg).append("\" ");
+      }
+      LOG.error("Got {} arguments: {}", args.size(), argsList);
+      throw new ServiceLaunchException(
+          LauncherExitCodes.EXIT_COMMAND_ARGUMENT_ERROR,
+          "Expected 0 arguments but got %d: %s",
+          args.size(),
+          argsList);
+    }
+    return configuration;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NullBindLaunchableService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NullBindLaunchableService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NullBindLaunchableService.java
new file mode 100644
index 0000000..6aeebf4
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/NullBindLaunchableService.java
@@ -0,0 +1,46 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.conf.Configuration;
+
+import java.util.List;
+
+/**
+ * An extension of {@link LaunchableRunningService} which returns null from
+ * the {@link #bindArgs(Configuration, List)} method.
+ */
+public class NullBindLaunchableService extends LaunchableRunningService {
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.NullBindLaunchableService";
+
+  public NullBindLaunchableService() {
+    this("NullBindLaunchableService");
+  }
+
+  public NullBindLaunchableService(String name) {
+    super(name);
+  }
+
+  @Override
+  public Configuration bindArgs(Configuration config, List<String> args)
+      throws Exception {
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/RunningService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/RunningService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/RunningService.java
new file mode 100644
index 0000000..3093aa1
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/RunningService.java
@@ -0,0 +1,84 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.AbstractService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RunningService extends AbstractService implements Runnable {
+  private static final Logger LOG =
+      LoggerFactory.getLogger(RunningService.class);
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.RunningService";
+  public static final int DELAY = 100;
+
+  /**
+   * Property on delay times.
+   */
+  public static final String DELAY_TIME = "delay.time";
+  public static final String FAIL_IN_RUN = "fail.runnable";
+  public static final String FAILURE_MESSAGE = "FAIL_IN_RUN";
+  private boolean interrupted;
+
+  public int delayTime = DELAY;
+  public boolean failInRun;
+
+  public RunningService() {
+    super("RunningService");
+  }
+
+  public RunningService(String name) {
+    super(name);
+  }
+
+  @Override
+  protected void serviceInit(Configuration conf) throws Exception {
+    super.serviceInit(conf);
+    delayTime = getConfig().getInt(DELAY_TIME, delayTime);
+    failInRun = getConfig().getBoolean(FAIL_IN_RUN, failInRun);
+  }
+
+  @Override
+  protected void serviceStart() throws Exception {
+    Thread thread = new Thread(this);
+    thread.setName(getName());
+    thread.start();
+  }
+
+  @Override
+  public void run() {
+    try {
+      Thread.sleep(delayTime);
+      if (failInRun) {
+        noteFailure(new Exception(FAILURE_MESSAGE));
+      }
+    } catch (InterruptedException e) {
+      interrupted = true;
+      LOG.info("Interrupted");
+    }
+    stop();
+  }
+
+  public boolean isInterrupted() {
+    return interrupted;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StoppingInStartLaunchableService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StoppingInStartLaunchableService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StoppingInStartLaunchableService.java
new file mode 100644
index 0000000..49593b1
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StoppingInStartLaunchableService.java
@@ -0,0 +1,49 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.service.launcher.AbstractLaunchableService;
+import org.apache.hadoop.service.launcher.LauncherExitCodes;
+import org.apache.hadoop.service.launcher.ServiceLaunchException;
+
+/**
+ * Try to stop() in service start; in execute() raise an exception.
+ */
+public class StoppingInStartLaunchableService
+    extends AbstractLaunchableService {
+
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.StoppingInStartLaunchableService";
+  public StoppingInStartLaunchableService(String name) {
+    super(name);
+  }
+
+  @Override
+  protected void serviceStart() throws Exception {
+    super.serviceStart();
+    stop();
+    }
+
+  @Override
+  public int execute() throws Exception {
+    throw new ServiceLaunchException(
+        LauncherExitCodes.EXIT_SERVICE_LIFECYCLE_EXCEPTION,
+        "Should not have been executed");
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StringConstructorOnlyService.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StringConstructorOnlyService.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StringConstructorOnlyService.java
new file mode 100644
index 0000000..4f243c5
--- /dev/null
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/testservices/StringConstructorOnlyService.java
@@ -0,0 +1,39 @@
+/*
+ * 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.service.launcher.testservices;
+
+import org.apache.hadoop.service.launcher.AbstractLaunchableService;
+
+/**
+ * Service that only has one constructor that takes a string.
+ * This is the standard base class of a YARN service, so handle it
+ * in the launch
+ */
+public class StringConstructorOnlyService extends AbstractLaunchableService {
+  
+
+  public StringConstructorOnlyService(String name) {
+    super(name);
+  }
+
+  public static final String NAME =
+      "org.apache.hadoop.service.launcher.testservices.StringConstructorOnlyService";
+  
+
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/55b59b8e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
index 96ba123..7b94784 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
@@ -31,6 +31,7 @@ import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
+import java.util.Locale;
 import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
@@ -692,4 +693,37 @@ public abstract class GenericTestUtils {
       bld.append(" + ").append(l).append("\n");
     }
   }
+
+  /**
+   * Formatted fail, via {@link String#format(String, Object...)}.
+   * @param format format string
+   * @param args argument list. If the last argument is a throwable, it
+   * is used as the inner cause of the exception
+   * @throws AssertionError with the formatted message
+   */
+  public static void failf(String format, Object... args) {
+    String message = String.format(Locale.ENGLISH, format, args);
+    AssertionError error = new AssertionError(message);
+    int len = args.length;
+    if (len > 0 && args[len - 1] instanceof Throwable) {
+      error.initCause((Throwable) args[len - 1]);
+    }
+    throw error;
+  }
+
+  /**
+   * Conditional formatted fail, via {@link String#format(String, Object...)}.
+   * @param condition condition: if true the method fails
+   * @param format format string
+   * @param args argument list. If the last argument is a throwable, it
+   * is used as the inner cause of the exception
+   * @throws AssertionError with the formatted message
+   */
+  public static void failif(boolean condition,
+      String format,
+      Object... args) {
+    if (condition) {
+      failf(format, args);
+    }
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org