You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chukwa.apache.org by sh...@apache.org on 2015/02/26 07:16:33 UTC

svn commit: r1662360 - in /chukwa/trunk: ./ src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/ src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ src/test/java/org/apache/hadoop/chukwa/datacollection/agent/

Author: shreyas
Date: Thu Feb 26 06:16:33 2015
New Revision: 1662360

URL: http://svn.apache.org/r1662360
Log:
CHUKWA-736. SSL support for chukwa

Added:
    chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaConstants.java
    chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaRestServer.java
    chukwa/trunk/src/test/java/org/apache/hadoop/chukwa/datacollection/agent/TestChukwaSsl.java
Modified:
    chukwa/trunk/CHANGES.txt
    chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/RestAdaptor.java
    chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaAgent.java

Modified: chukwa/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/chukwa/trunk/CHANGES.txt?rev=1662360&r1=1662359&r2=1662360&view=diff
==============================================================================
--- chukwa/trunk/CHANGES.txt (original)
+++ chukwa/trunk/CHANGES.txt Thu Feb 26 06:16:33 2015
@@ -4,6 +4,8 @@ Trunk (unreleased changes)
 
   NEW FEATURES
 
+    CHUKWA-736. SSL support for chukwa. (Shreyas Subramanya)
+
   IMPROVEMENTS
 
   CHUKWA-723. Update Chukwa code to use new HBase HConnection API.  (Sreepathi Prasanna via Eric Yang)

Modified: chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/RestAdaptor.java
URL: http://svn.apache.org/viewvc/chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/RestAdaptor.java?rev=1662360&r1=1662359&r2=1662360&view=diff
==============================================================================
--- chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/RestAdaptor.java (original)
+++ chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/RestAdaptor.java Thu Feb 26 06:16:33 2015
@@ -18,6 +18,10 @@
 
 package org.apache.hadoop.chukwa.datacollection.adaptor;
 
+import java.io.FileInputStream;
+import java.security.KeyStore;
+import java.security.SecureRandom;
+
 import java.util.Calendar;
 import java.util.TimeZone;
 import java.util.Timer;
@@ -25,11 +29,21 @@ import java.util.TimerTask;
 
 import org.apache.hadoop.chukwa.ChunkImpl;
 import org.apache.hadoop.chukwa.datacollection.ChunkReceiver;
+import org.apache.hadoop.chukwa.datacollection.agent.ChukwaAgent;
 import org.apache.log4j.Logger;
 import org.apache.hadoop.chukwa.util.ExceptionUtil;
+import org.apache.hadoop.conf.Configuration;
+import static org.apache.hadoop.chukwa.datacollection.agent.ChukwaConstants.*;
 
 import com.sun.jersey.api.client.Client;
 import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.client.urlconnection.HTTPSProperties;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
 
 import javax.ws.rs.core.MediaType;
 
@@ -128,8 +142,53 @@ public class RestAdaptor extends Abstrac
       log.warn("bad syntax in RestAdaptor args");
       return null;
     }
-    c = Client.create();
+    try {
+      initClient();
+    } catch (Exception e) {
+      log.error(ExceptionUtil.getStackTrace(e));
+      return null;
+    }    
     return s;
   }
+  
+  private void initClient() throws Exception {
+    if (uri.contains("https")) {
+      Configuration conf = ChukwaAgent.getAgent().getConfiguration();
+      String trustStoreFile = conf.get(TRUSTSTORE_STORE);
+      String trustStorePw = conf.get(TRUST_PASSWORD);
+      if (trustStoreFile == null || trustStorePw == null) {
+        throw new Exception(
+            "Cannot instantiate RestAdaptor to uri "
+                + uri
+                + " due to missing trust store configurations chukwa.ssl.truststore.store and chukwa.ssl.trust.password");
+      }
+      String trustStoreType = conf.get(TRUSTSTORE_TYPE, DEFAULT_STORE_TYPE);
+      KeyStore trustStore = KeyStore.getInstance(trustStoreType);
+      FileInputStream fis = null;
+      try {
+        fis = new FileInputStream(trustStoreFile);
+        trustStore.load(fis, trustStorePw.toCharArray());
+      } finally {
+        if (fis != null) {
+          fis.close();
+        }
+      }
+      TrustManagerFactory tmf = TrustManagerFactory
+          .getInstance(TrustManagerFactory.getDefaultAlgorithm());
+      tmf.init(trustStore);
+      TrustManager[] trustManagers = tmf.getTrustManagers();
+
+      SSLContext ctx = null;
+      String protocol = conf.get(SSL_PROTOCOL, DEFAULT_SSL_PROTOCOL);
+      ctx = SSLContext.getInstance(protocol);
+      ctx.init(null, trustManagers, new SecureRandom());
+      ClientConfig cc = new DefaultClientConfig();
+      HTTPSProperties props = new HTTPSProperties(null, ctx);
+      cc.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, props);
+      c = Client.create(cc);
+    } else {
+      c = Client.create();
+    }
+  }
 
 }

Modified: chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaAgent.java
URL: http://svn.apache.org/viewvc/chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaAgent.java?rev=1662360&r1=1662359&r2=1662360&view=diff
==============================================================================
--- chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaAgent.java (original)
+++ chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaAgent.java Thu Feb 26 06:16:33 2015
@@ -46,24 +46,13 @@ import org.apache.hadoop.chukwa.datacoll
 import org.apache.hadoop.chukwa.datacollection.agent.metrics.AgentMetrics;
 import org.apache.hadoop.chukwa.datacollection.connector.Connector;
 import org.apache.hadoop.chukwa.datacollection.connector.http.HttpConnector;
-import org.apache.hadoop.chukwa.datacollection.connector.PipelineConnector;
 import org.apache.hadoop.chukwa.datacollection.test.ConsoleOutConnector;
 import org.apache.hadoop.chukwa.util.AdaptorNamingUtils;
 import org.apache.hadoop.chukwa.util.ChukwaUtil;
 import org.apache.hadoop.chukwa.util.DaemonWatcher;
 import org.apache.hadoop.chukwa.util.ExceptionUtil;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.Path;
 import org.apache.log4j.Logger;
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.servlet.Context;
-import org.mortbay.jetty.servlet.ServletHolder;
-import org.mortbay.jetty.nio.SelectChannelConnector;
-import org.mortbay.thread.BoundedThreadPool;
-
-import com.sun.jersey.spi.container.servlet.ServletContainer;
-
-import edu.berkeley.confspell.*;
 
 /**
  * The local agent daemon that runs on each machine. This class is designed to
@@ -83,9 +72,7 @@ public class ChukwaAgent implements Adap
   // boolean WRITE_CHECKPOINTS = true;
   static AgentMetrics agentMetrics = new AgentMetrics("ChukwaAgent", "metrics");
 
-  private static Logger log = Logger.getLogger(ChukwaAgent.class);
-  private static final int HTTP_SERVER_THREADS = 120;
-  private static Server jettyServer = null;
+  private static Logger log = Logger.getLogger(ChukwaAgent.class);  
   private OffsetStatsManager adaptorStatsManager = null;
   private Timer statsCollector = null;
   private static volatile Configuration conf = null;
@@ -98,7 +85,7 @@ public class ChukwaAgent implements Adap
 
   public ChukwaAgent(Configuration conf) throws AlreadyRunningException {
     ChukwaAgent.agent = this;
-    this.conf = conf;
+    ChukwaAgent.conf = conf;
     
     // almost always just reading this; so use a ConcurrentHM.
     // since we wrapped the offset, it's not a structural mod.
@@ -335,49 +322,13 @@ public class ChukwaAgent implements Adap
   }
 
   private void startHttpServer(Configuration conf) throws Exception {
-    int portNum = conf.getInt("chukwaAgent.http.port", 9090);
-    String jaxRsAddlPackages = conf.get("chukwaAgent.http.rest.controller.packages");
-    StringBuilder jaxRsPackages = new StringBuilder(
-            "org.apache.hadoop.chukwa.datacollection.agent.rest");
-
-    // Allow the ability to add additional servlets to the server
-    if (jaxRsAddlPackages != null)
-      jaxRsPackages.append(';').append(jaxRsAddlPackages);
-
-    // Set up jetty connector
-    SelectChannelConnector jettyConnector = new SelectChannelConnector();
-    jettyConnector.setLowResourcesConnections(HTTP_SERVER_THREADS - 10);
-    jettyConnector.setLowResourceMaxIdleTime(1500);
-    jettyConnector.setPort(portNum);
-    jettyConnector.setReuseAddress(true);
-
-    // Set up jetty server, using connector
-    jettyServer = new Server(portNum);
-    jettyServer.setConnectors(new org.mortbay.jetty.Connector[] { jettyConnector });
-    BoundedThreadPool pool = new BoundedThreadPool();
-    pool.setMaxThreads(HTTP_SERVER_THREADS);
-    jettyServer.setThreadPool(pool);
-
-    // Create the controller servlets
-    ServletHolder servletHolder = new ServletHolder(ServletContainer.class);
-    servletHolder.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
-            "com.sun.jersey.api.core.PackagesResourceConfig");
-    servletHolder.setInitParameter("com.sun.jersey.config.property.packages",
-            jaxRsPackages.toString());
-
-    // Create the server context and add the servlet
-    Context root = new Context(jettyServer, "/rest/v2", Context.SESSIONS);
-    root.setAttribute("ChukwaAgent", this);
-    root.addServlet(servletHolder, "/*");
-    root.setAllowNullPathInfo(false);
-
-    // And finally, fire up the server
-    jettyServer.start();
-    jettyServer.setStopAtShutdown(true);
-
-    log.info("started Chukwa http agent interface on port " + portNum);
+    ChukwaRestServer.startInstance(conf);
   }
-
+  
+  private void stopHttpServer() throws Exception {
+    ChukwaRestServer.stopInstance();
+  }
+  
   /**
    * Take snapshots of offset data so we can report flow rate stats.
    */
@@ -753,7 +704,7 @@ public class ChukwaAgent implements Adap
     }
 
     try {
-      jettyServer.stop();
+      stopHttpServer();
     } catch (Exception e) {
       log.error("Couldn't stop jetty server.", e);
     }

Added: chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaConstants.java
URL: http://svn.apache.org/viewvc/chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaConstants.java?rev=1662360&view=auto
==============================================================================
--- chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaConstants.java (added)
+++ chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaConstants.java Thu Feb 26 06:16:33 2015
@@ -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.chukwa.datacollection.agent;
+
+public class ChukwaConstants {
+  public static final String SSL_ENABLE = "chukwa.ssl.enable";
+  public static final String KEYSTORE_STORE = "chukwa.ssl.keystore.store";
+  public static final String KEYSTORE_PASSWORD = "chukwa.ssl.keystore.password";
+  public static final String KEYSTORE_KEY_PASSWORD = "chukwa.ssl.keystore.key.password";
+  public static final String KEYSTORE_TYPE = "chukwa.ssl.keystore.type";
+  public static final String TRUSTSTORE_STORE = "chukwa.ssl.truststore.store";
+  public static final String TRUST_PASSWORD = "chukwa.ssl.trust.password";
+  public static final String TRUSTSTORE_TYPE = "chukwa.ssl.truststore.type";
+  public static final String SSL_PROTOCOL = "chukwa.ssl.protocol";
+  public static final String DEFAULT_SSL_PROTOCOL = "TLS";
+  public static final String DEFAULT_STORE_TYPE = "JKS";
+}

Added: chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaRestServer.java
URL: http://svn.apache.org/viewvc/chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaRestServer.java?rev=1662360&view=auto
==============================================================================
--- chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaRestServer.java (added)
+++ chukwa/trunk/src/main/java/org/apache/hadoop/chukwa/datacollection/agent/ChukwaRestServer.java Thu Feb 26 06:16:33 2015
@@ -0,0 +1,135 @@
+/*
+ * 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.chukwa.datacollection.agent;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.log4j.Logger;
+import org.mortbay.jetty.AbstractConnector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.servlet.Context;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.thread.QueuedThreadPool;
+
+import com.sun.jersey.spi.container.servlet.ServletContainer;
+import static org.apache.hadoop.chukwa.datacollection.agent.ChukwaConstants.*;
+
+public class ChukwaRestServer {
+  private Configuration conf;
+  private Server jettyServer;  
+  private final Logger log = Logger.getLogger(ChukwaRestServer.class);  
+  private final String AGENT_HTTP_PORT = "chukwaAgent.http.port";
+  private final String AGENT_REST_CONTROLLER_PACKAGES = "chukwaAgent.http.rest.controller.packages";
+  private final int HTTP_SERVER_THREADS = 120;
+  
+  private static ChukwaRestServer instance = null;
+  
+  public static void startInstance(Configuration conf) throws Exception{
+    if(instance == null){
+      synchronized(ChukwaRestServer.class) {
+        if(instance == null){
+          instance = new ChukwaRestServer(conf);
+          instance.start();
+        }        
+      }
+    }
+  }
+  
+  public static void stopInstance() throws Exception {
+    if(instance != null) {
+      synchronized(ChukwaRestServer.class) {
+        if(instance != null){
+          instance.stop();
+          instance = null;
+        }
+      }
+    }
+    
+  }
+  
+  private ChukwaRestServer(Configuration conf){
+    this.conf = conf;
+  }
+  
+  private void start() throws Exception{
+    int portNum = conf.getInt(AGENT_HTTP_PORT, 9090);
+    String jaxRsAddlPackages = conf.get(AGENT_REST_CONTROLLER_PACKAGES);
+    StringBuilder jaxRsPackages = new StringBuilder(
+            "org.apache.hadoop.chukwa.datacollection.agent.rest");
+  
+    // Allow the ability to add additional servlets to the server
+    if (jaxRsAddlPackages != null)
+      jaxRsPackages.append(';').append(jaxRsAddlPackages);
+  
+    // Set up jetty connector
+    AbstractConnector jettyConnector;
+    if("true".equals(conf.get(SSL_ENABLE))){
+      SslSocketConnector sslConnector = new SslSocketConnector();
+      sslConnector.setKeystore(conf.get(KEYSTORE_STORE));
+      sslConnector.setPassword(conf.get(KEYSTORE_PASSWORD));
+      sslConnector.setKeyPassword(conf.get(KEYSTORE_KEY_PASSWORD));
+      sslConnector.setKeystoreType(conf.get(KEYSTORE_TYPE, DEFAULT_STORE_TYPE));
+      String trustStore = conf.get(TRUSTSTORE_STORE);
+      if(trustStore != null){
+        sslConnector.setTruststore(trustStore);
+        sslConnector.setTrustPassword(conf.get(TRUST_PASSWORD));
+        sslConnector.setTruststoreType(conf.get(TRUSTSTORE_TYPE, DEFAULT_STORE_TYPE));
+        sslConnector.setNeedClientAuth(false);
+      }
+      jettyConnector = sslConnector;
+    } else {
+      jettyConnector = new SelectChannelConnector();
+    }
+    //jettyConnector.setLowResourcesConnections(HTTP_SERVER_THREADS - 10);
+    jettyConnector.setLowResourceMaxIdleTime(1500);
+    jettyConnector.setPort(portNum);
+    jettyConnector.setReuseAddress(true);
+    // Set up jetty server, using connector
+    jettyServer = new Server(portNum);
+    jettyServer.setConnectors(new org.mortbay.jetty.Connector[] { jettyConnector });
+    QueuedThreadPool pool = new QueuedThreadPool();
+    pool.setMaxThreads(HTTP_SERVER_THREADS);
+    jettyServer.setThreadPool(pool);
+  
+    // Create the controller servlets
+    ServletHolder servletHolder = new ServletHolder(ServletContainer.class);
+    servletHolder.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
+            "com.sun.jersey.api.core.PackagesResourceConfig");
+    servletHolder.setInitParameter("com.sun.jersey.config.property.packages",
+            jaxRsPackages.toString());
+  
+    // Create the server context and add the servlet
+    Context root = new Context(jettyServer, "/rest/v2", Context.SESSIONS);
+    root.setAttribute("ChukwaAgent", ChukwaAgent.getAgent());
+    root.addServlet(servletHolder, "/*");
+    root.setAllowNullPathInfo(false);
+  
+    // And finally, fire up the server
+    jettyServer.start();
+    jettyServer.setStopAtShutdown(true);
+  
+    log.info("started Chukwa http agent interface on port " + portNum);
+  }
+  
+  private void stop() throws Exception{
+    jettyServer.stop();
+    log.info("Successfully stopped Chukwa http agent interface");
+  }
+}

Added: chukwa/trunk/src/test/java/org/apache/hadoop/chukwa/datacollection/agent/TestChukwaSsl.java
URL: http://svn.apache.org/viewvc/chukwa/trunk/src/test/java/org/apache/hadoop/chukwa/datacollection/agent/TestChukwaSsl.java?rev=1662360&view=auto
==============================================================================
--- chukwa/trunk/src/test/java/org/apache/hadoop/chukwa/datacollection/agent/TestChukwaSsl.java (added)
+++ chukwa/trunk/src/test/java/org/apache/hadoop/chukwa/datacollection/agent/TestChukwaSsl.java Thu Feb 26 06:16:33 2015
@@ -0,0 +1,127 @@
+/*
+ * 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.chukwa.datacollection.agent;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.hadoop.chukwa.Chunk;
+import org.apache.hadoop.chukwa.datacollection.ChunkQueue;
+import org.apache.hadoop.chukwa.datacollection.DataFactory;
+import org.apache.hadoop.conf.Configuration;
+
+import static org.apache.hadoop.chukwa.datacollection.agent.ChukwaConstants.*;
+import junit.framework.TestCase;
+
+public class TestChukwaSsl extends TestCase{
+  String keyStoreFile = "../../test-classes/chukwa.store";
+  @Override
+  protected void setUp() throws IOException, InterruptedException{
+    String[] cmd = new String[]{System.getenv("JAVA_HOME")+"/bin/keytool", "-genkeypair", "-keyalg", "RSA",
+        "-alias", "monitoring", "-validity", "36500", "-keystore", keyStoreFile, "-keysize", "1024",
+        "-keypass", "chukwa", "-storepass", "chukwa", "-dname", "cn=*,ou=chukwa,o=apache,c=US", "-storetype", "jks"
+    };
+    Process p = Runtime.getRuntime().exec(cmd);
+    p.waitFor();
+    if(p.exitValue() != 0){
+      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+      String line;
+      while((line = reader.readLine()) != null){
+        System.out.println("Output:"+line);
+      }
+      reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
+      while((line = reader.readLine()) != null){
+        System.out.println("Error:"+line);
+      }
+    }
+    System.out.println("keytool exit value:" + p.exitValue());
+  }
+  
+  @Override
+  protected void tearDown(){
+    new File(keyStoreFile).delete();
+  }
+    
+
+  public void testRestServer() throws Exception{
+    //keystore generated using the following command
+    //keytool -genkeypair -keyalg RSA -alias monitoring -validity 36500 -keystore src/test/resources/chukwa.store -keysize 1024 -keypass chukwa -storepass chukwa -dname "cn=*, ou=chukwa, o=apache, c=US" -storetype jks
+    Configuration conf = new Configuration();
+    conf.set(SSL_ENABLE, "true");
+    String keystore = new File(ClassLoader.getSystemResource("chukwa.store").getFile()).getAbsolutePath();
+    System.out.println("keystore = "+keystore);
+    String commonPassword = "chukwa";
+    
+    conf.set(KEYSTORE_STORE, keystore);
+    conf.set(KEYSTORE_PASSWORD, commonPassword);
+    conf.set(KEYSTORE_KEY_PASSWORD, commonPassword);
+    conf.set(TRUSTSTORE_STORE, keystore);    
+    conf.set(TRUST_PASSWORD, commonPassword);
+    /*
+    //optional properties     
+    String storeType = "pkcs12";
+    String sslProtocol = "TLS";   
+    conf.set(KEYSTORE_TYPE, storeType);
+    conf.set(TRUSTSTORE_TYPE, storeType);
+    conf.set(SSL_PROTOCOL, sslProtocol);
+    */
+    //start agent, which starts chukwa rest server
+    ChukwaAgent agent = new ChukwaAgent(conf);
+    System.out.println("Started ChukwaRestServer");
+    testSecureRestAdaptor(agent);
+    agent.shutdown();
+    System.out.println("Stopped ChukwaRestServer");
+  }
+  
+  private void testSecureRestAdaptor(ChukwaAgent agent) {
+    //add rest adaptor to collect the agent adaptor info through https
+    agent.processAddCommand("add RestAdaptor DebugProcessor https://localhost:9090/rest/v2/adaptor 5 0");
+    assertEquals(1, agent.adaptorCount());
+    final ChunkQueue eventQueue = DataFactory.getInstance().getEventQueue();
+    final List<Chunk> chunks = new ArrayList<Chunk>();
+    Thread collector = new Thread(){
+      @Override
+      public void run(){
+        try {
+          eventQueue.collect(chunks, 1);
+        } catch (InterruptedException e) {
+        }
+      }
+    };
+    
+    //wait 10s and interrupt the collector
+    collector.start();
+    try {
+      collector.join(10000);
+    } catch (InterruptedException e) {
+    }
+    collector.interrupt();    
+    
+    //make sure we collected atleast 1 chunk
+    assertTrue(chunks.size() > 0);
+    for(Chunk chunk: chunks){
+      String data = new String(chunk.getData());
+      System.out.println("Collected chunk - " + data);
+    }
+  }
+}