You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by st...@apache.org on 2014/12/18 22:32:45 UTC

[37/50] incubator-slider git commit: SLIDER-724 don't serve web content until AM is fully configured: tests to iterate until happy or timed out. Includes creation of better exceptions on failures

SLIDER-724 don't serve web content until AM is fully configured: tests to iterate until happy or timed out. Includes creation of better exceptions on failures


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/e654a0f2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/e654a0f2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/e654a0f2

Branch: refs/heads/feature/SLIDER-151_REST_API
Commit: e654a0f27e1a53ed713745305f4dd446b8ef2cf8
Parents: bfc20d7
Author: Steve Loughran <st...@apache.org>
Authored: Tue Dec 16 20:24:29 2014 +0000
Committer: Steve Loughran <st...@apache.org>
Committed: Tue Dec 16 20:25:40 2014 +0000

----------------------------------------------------------------------
 .../standalone/TestStandaloneAgentWeb.groovy    | 31 ++++---
 .../apache/slider/test/SliderTestUtils.groovy   | 89 ++++++++++++++++----
 2 files changed, 92 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/e654a0f2/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy
index b2d29f3..577ad73 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentWeb.groovy
@@ -25,6 +25,7 @@ import org.apache.slider.agent.AgentMiniClusterTestBase
 import org.apache.slider.client.SliderClient
 import org.apache.slider.core.main.ServiceLauncher
 import org.apache.slider.server.appmaster.web.rest.RestPaths
+import static org.apache.slider.server.appmaster.web.rest.RestPaths.*;
 import org.junit.Test
 
 import static org.apache.slider.server.appmaster.management.MetricsKeys.*
@@ -52,8 +53,10 @@ class TestStandaloneAgentWeb extends AgentMiniClusterTestBase {
 
     ApplicationReport report = waitForClusterLive(client)
     def realappmaster = report.originalTrackingUrl
-    GET(realappmaster)
-    def metrics = GET(realappmaster, RestPaths.SYSTEM_METRICS)
+    execHttpRequest(30000) {
+      GET(realappmaster)
+    } 
+    def metrics = GET(realappmaster, SYSTEM_METRICS)
     log.info metrics
     
     sleep(5000)
@@ -61,21 +64,27 @@ class TestStandaloneAgentWeb extends AgentMiniClusterTestBase {
 
     GET(appmaster)
 
-    log.info GET(appmaster, RestPaths.SYSTEM_PING)
-    log.info GET(appmaster, RestPaths.SYSTEM_THREADS)
-    log.info GET(appmaster, RestPaths.SYSTEM_HEALTHCHECK)
-    log.info GET(appmaster, RestPaths.SYSTEM_METRICS_JSON)
+    log.info GET(appmaster, SYSTEM_PING)
+    log.info GET(appmaster, SYSTEM_THREADS)
+    log.info GET(appmaster, SYSTEM_HEALTHCHECK)
+    log.info GET(appmaster, SYSTEM_METRICS_JSON)
     
-    describe "Hadoop HTTP operations"
+    describe "Codahale operations"
     // now switch to the Hadoop URL connection, with SPNEGO escalation
     getWebPage(conf, appmaster)
-    getWebPage(conf, appmaster, RestPaths.SYSTEM_THREADS)
-    getWebPage(conf, appmaster, RestPaths.SYSTEM_HEALTHCHECK)
-    getWebPage(conf, appmaster, RestPaths.SYSTEM_METRICS_JSON)
+    getWebPage(conf, appmaster, SYSTEM_THREADS)
+    getWebPage(conf, appmaster, SYSTEM_HEALTHCHECK)
+    getWebPage(conf, appmaster, SYSTEM_METRICS_JSON)
     
-    log.info getWebPage(conf, realappmaster, RestPaths.SYSTEM_METRICS_JSON)
+    log.info getWebPage(conf, realappmaster, SYSTEM_METRICS_JSON)
 
     
+    // now some REST gets
+    describe "Application REST GETs"
+
+    getWebPage(conf, appmaster, SLIDER_PATH_APPLICATION + LIVE_RESOURCES)
+
+
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/e654a0f2/slider-core/src/test/groovy/org/apache/slider/test/SliderTestUtils.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/test/SliderTestUtils.groovy b/slider-core/src/test/groovy/org/apache/slider/test/SliderTestUtils.groovy
index e612aa3..d3cbae0 100644
--- a/slider-core/src/test/groovy/org/apache/slider/test/SliderTestUtils.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/test/SliderTestUtils.groovy
@@ -23,18 +23,21 @@ import groovy.transform.CompileStatic
 import groovy.util.logging.Slf4j
 import org.apache.commons.httpclient.HttpClient
 import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager
+import org.apache.commons.httpclient.URI
 import org.apache.commons.httpclient.methods.GetMethod
 import org.apache.hadoop.conf.Configuration
 import org.apache.hadoop.fs.FileStatus
 import org.apache.hadoop.fs.FileSystem as HadoopFS
 import org.apache.hadoop.fs.Path
 import org.apache.hadoop.hdfs.web.URLConnectionFactory
-import org.apache.hadoop.io.IOUtils
+import org.apache.hadoop.net.NetUtils
 import org.apache.hadoop.service.ServiceStateException
 import org.apache.hadoop.util.Shell
 import org.apache.hadoop.yarn.api.records.ApplicationReport
 import org.apache.hadoop.yarn.conf.YarnConfiguration
 import org.apache.hadoop.registry.client.types.ServiceRecord
+import org.apache.hadoop.yarn.webapp.ForbiddenException
+import org.apache.hadoop.yarn.webapp.NotFoundException
 import org.apache.slider.api.ClusterDescription
 import org.apache.slider.api.ClusterNode
 import org.apache.slider.api.RoleKeys
@@ -480,17 +483,44 @@ class SliderTestUtils extends Assert {
     def client = new HttpClient(new MultiThreadedHttpConnectionManager());
     client.httpConnectionManager.params.connectionTimeout = 10000;
     GetMethod get = new GetMethod(url);
+    URI destURI = get.getURI()
+    assert destURI.port != 0
+    assert destURI.host
+
 
     get.followRedirects = true;
-    int resultCode = client.executeMethod(get);
+    int resultCode
+    try {
+      resultCode = client.executeMethod(get);
+    } catch (IOException e) {
+      throw NetUtils.wrapException(url, 0, null, 0, e)
+    }
 
     def body = get.responseBodyAsString
+
+    uprateFaults(url, resultCode, body)
+    return body;
+  }
+
+  /**
+   *  uprate some faults
+   * @param url
+   * @param resultCode
+   * @param body
+   */
+  public static void uprateFaults(String url, int resultCode, String body) {
+
+    if (resultCode == 404) {
+      throw new NotFoundException(url)
+    }
+    if (resultCode == 401) {
+      throw new ForbiddenException(url)
+    }
     if (!(resultCode >= 200 && resultCode < 400)) {
       def message = "Request to $url failed with exit code $resultCode, body length ${body?.length()}:\n$body"
       log.error(message)
-      fail(message)
+      throw new IOException(message)
     }
-    return body;
   }
 
   /**
@@ -508,7 +538,30 @@ class SliderTestUtils extends Assert {
     return getWebPage(conf, s)
   }
 
-    /**
+  /**
+   * Execute any of the http requests, swallowing exceptions until
+   * eventually they time out
+   * @param timeout
+   * @param operation
+   * @return
+   */
+  public static String execHttpRequest(int timeout, Closure operation) {
+    Duration duration = new Duration(timeout).start()
+    Exception ex = new IOException("limit exceeded before starting");
+    while (!duration.limitExceeded) {
+      try {
+        String result = operation();
+        return result;
+      } catch (Exception e) {
+        ex = e;
+        sleep(1000)
+      }
+    }
+    // timeout
+    throw ex;
+  } 
+
+  /**
    * Fetches a web page asserting that the response code is between 200 and 400.
    * Will error on 400 and 500 series response codes and let 200 and 300 through.
    * 
@@ -523,32 +576,34 @@ class SliderTestUtils extends Assert {
     URLConnectionFactory connectionFactory = URLConnectionFactory
         .newDefaultURLConnectionFactory(conf);
     URL url = new URL(page)
-    HttpURLConnection conn =
-        (HttpURLConnection) connectionFactory.openConnection(url);
+    assert url.port != 0
+    HttpURLConnection conn = null;
+    int resultCode = 0
+    def body = ""
     try {
+      conn = (HttpURLConnection) connectionFactory.openConnection(url);
       conn.instanceFollowRedirects = true;
       conn.connect()
 
-      int resultCode = conn.responseCode
+      resultCode = conn.responseCode
       InputStream stream = conn.errorStream;
       if (stream == null) {
         stream = conn.inputStream;
       }
 
-      def body = stream ? stream.text : "(no body)"
-      if (!(resultCode >= 200 && resultCode < 400)) {
-        def message = "Request to $url failed with ${conn.responseMessage}, body length ${body?.length()}:\n$body"
-        log.error(message)
-        fail(message)
-      }
-      return body;
+      body = stream ? stream.text : "(no body)"
+    } catch (IOException e) {
+      throw NetUtils.wrapException(url.toString(), 0, null, 0, e)
     } finally {
       conn?.disconnect()
-      
     }
+    uprateFaults(page, resultCode, body)
+    return body;
   }
+  
+  
 
-  /**
+/**
    * Assert that a service operation succeeded
    * @param service service
    */