SLIDER-35 providers to publish registry information -start to build a specific interface to access the registry, one that hides curator at work

git-svn-id: https://svn.apache.org/repos/asf/incubator/slider/trunk@1593334 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
index 22697d7..4477942 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
@@ -100,6 +100,7 @@
 import org.apache.slider.server.appmaster.rpc.RpcBinder;
 import org.apache.slider.server.services.curator.CuratorServiceInstance;
 import org.apache.slider.server.services.curator.RegistryBinderService;
+import org.apache.slider.server.services.registry.SliderRegistryService;
 import org.apache.slider.server.services.utility.AbstractSliderLaunchedService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -143,7 +144,7 @@
   private SliderYarnClientImpl yarnClient;
   private YARNRegistryClient YARNRegistryClient;
   private AggregateConf launchedInstanceDefinition;
-  private RegistryBinderService<ServiceInstanceData> registry;
+  private SliderRegistryService registry;
 
   /**
    * Constructor
@@ -2151,7 +2152,7 @@
    * @throws SliderException
    * @throws IOException
    */
-  private synchronized RegistryBinderService<ServiceInstanceData> maybeStartRegistry() throws
+  private synchronized SliderRegistryService maybeStartRegistry() throws
       SliderException,
       IOException {
 
@@ -2170,7 +2171,7 @@
    */
   @VisibleForTesting
 
-  public RegistryBinderService<ServiceInstanceData> getRegistry() throws
+  public SliderRegistryService getRegistry() throws
       SliderException,
       IOException {
     return maybeStartRegistry();
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryNaming.java b/slider-core/src/main/java/org/apache/slider/core/registry/info/RegistryNaming.java
similarity index 84%
rename from slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryNaming.java
rename to slider-core/src/main/java/org/apache/slider/core/registry/info/RegistryNaming.java
index e5c8b1a..e55a2a9 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryNaming.java
+++ b/slider-core/src/main/java/org/apache/slider/core/registry/info/RegistryNaming.java
@@ -16,12 +16,18 @@
  * limitations under the License.
  */
 
-package org.apache.slider.server.services.curator;
+package org.apache.slider.core.registry.info;
 
 import java.util.Locale;
 
+/**
+ * Logic for greating names from registry entries; lets the policy be changed
+ * later
+ */
 public class RegistryNaming {
 
+  public static String SLIDER_INSTANCE_NAME_FORMAT = "%s-%s";
+
   public static String createRegistryServiceType(String instanceName,
       String userName,
       String serviceName) {
@@ -33,7 +39,7 @@
                                               String serviceName,
                                               int appId) {
     return String.format(Locale.ENGLISH,
-        RegistryConsts.SLIDER_INSTANCE_NAME_FORMAT, userName,
+        SLIDER_INSTANCE_NAME_FORMAT, userName,
         instanceName,
         serviceName,
         appId);
diff --git a/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java
index 146cf64..a1cdff7 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/AbstractProviderService.java
@@ -32,6 +32,7 @@
 import org.apache.slider.server.appmaster.state.StateAccessForProviders;
 import org.apache.slider.server.appmaster.web.rest.agent.AgentRestOperations;
 import org.apache.slider.server.services.curator.RegistryBinderService;
+import org.apache.slider.server.services.registry.RegistryViewForProviders;
 import org.apache.slider.server.services.utility.ForkedProcessService;
 import org.apache.slider.server.services.utility.Parent;
 import org.apache.slider.server.services.utility.SequenceService;
@@ -53,17 +54,17 @@
  * upstream
  */
 public abstract class AbstractProviderService
-                          extends SequenceService
-                          implements
-                            ProviderCore,
+    extends SequenceService
+    implements
+    ProviderCore,
     SliderKeys,
-                            ProviderService {
+    ProviderService {
   private static final Logger log =
     LoggerFactory.getLogger(AbstractProviderService.class);
   protected  AggregateConf instanceDefinition;
   protected StateAccessForProviders stateAccessor;
   protected AgentRestOperations restOps;
-  protected RegistryBinderService<ServiceInstanceData> registry;
+  protected RegistryViewForProviders registry;
 
   public AbstractProviderService(String name) {
     super(name);
@@ -84,7 +85,7 @@
 
   @Override
   public void bind(StateAccessForProviders stateAccessor,
-      RegistryBinderService<ServiceInstanceData> registry) {
+      RegistryViewForProviders registry) {
     this.stateAccessor = stateAccessor;
     this.registry = registry;
   }
diff --git a/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java
index e3cad9b..42be05f 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/ProviderService.java
@@ -34,6 +34,7 @@
 import org.apache.slider.server.appmaster.state.StateAccessForProviders;
 import org.apache.slider.server.appmaster.web.rest.agent.AgentRestOperations;
 import org.apache.slider.server.services.curator.RegistryBinderService;
+import org.apache.slider.server.services.registry.RegistryViewForProviders;
 import org.apache.slider.server.services.utility.EventCallback;
 
 import java.io.File;
@@ -140,7 +141,7 @@
    * @param registry
    */
   void bind(StateAccessForProviders stateAccessor,
-      RegistryBinderService<ServiceInstanceData> registry);
+      RegistryViewForProviders registry);
 
   /**
    * Returns the agent rest operations interface.
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
index 1506568..b183840 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
@@ -38,6 +38,7 @@
 import org.apache.slider.core.exceptions.SliderException;
 import org.apache.slider.core.launch.CommandLineBuilder;
 import org.apache.slider.core.launch.ContainerLauncher;
+import org.apache.slider.core.registry.info.RegisteredEndpoint;
 import org.apache.slider.core.registry.info.ServiceInstanceData;
 import org.apache.slider.providers.AbstractProviderService;
 import org.apache.slider.providers.ProviderCore;
@@ -56,7 +57,6 @@
 import org.apache.slider.server.appmaster.web.rest.agent.RegistrationResponse;
 import org.apache.slider.server.appmaster.web.rest.agent.RegistrationStatus;
 import org.apache.slider.server.appmaster.web.rest.agent.StatusCommand;
-import org.apache.slider.server.services.curator.CuratorServiceInstance;
 import org.apache.slider.server.services.utility.EventCallback;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -77,12 +77,6 @@
 import java.util.TreeMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import static org.apache.slider.core.registry.info.RegistryFields.DESCRIPTION;
-import static org.apache.slider.core.registry.info.RegistryFields.ENDPOINTS;
-import static org.apache.slider.core.registry.info.RegistryFields.EXTERNAL_VIEW;
-import static org.apache.slider.core.registry.info.RegistryFields.PROTOCOL;
-import static org.apache.slider.core.registry.info.RegistryFields.VALUE;
-
 /** This class implements the server-side aspects of an agent deployment */
 public class AgentProviderService extends AbstractProviderService implements
     ProviderCore,
@@ -619,18 +613,18 @@
 
   private void buildEndpointDetails(Map<String, URL> details) {
     try {
-      List<CuratorServiceInstance<ServiceInstanceData>> services =
-          registry.listInstances(SliderKeys.APP_TYPE);
-      assert services.size() == 1;
-      CuratorServiceInstance<ServiceInstanceData> service = services.get(0);
-      Map payload = (Map) service.getPayload();
-      Map<String, Map<String, String>> endpoints =
-          (Map) ((Map) payload.get(EXTERNAL_VIEW)).get(ENDPOINTS);
-      for (Map.Entry<String, Map<String, String>> endpoint : endpoints.entrySet()) {
-        if ("http".equals(endpoint.getValue().get(PROTOCOL))) {
-          URL url = new URL(endpoint.getValue().get(VALUE));
-          details.put(endpoint.getValue().get(DESCRIPTION),
-                      url);
+      List<ServiceInstanceData> services =
+          registry.listInstancesByType(SliderKeys.APP_TYPE);
+      assert services.size() >= 1;
+      ServiceInstanceData payload = services.get(0);
+      Map<String, RegisteredEndpoint> endpointMap =
+          payload.externalView.endpoints;
+      for (Map.Entry<String, RegisteredEndpoint> endpoint : endpointMap
+          .entrySet()) {
+        RegisteredEndpoint val = endpoint.getValue();
+        if ("http".equals(val.protocol)) {
+          URL url = new URL(val.value);
+          details.put(val.description, url);
         }
       }
     } catch (IOException e) {
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/PublishedArtifacts.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/PublishedArtifacts.java
index b0b6961..fdc386f 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/PublishedArtifacts.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/PublishedArtifacts.java
@@ -27,4 +27,5 @@
   String CORE_SITE_CONFIG = "core-site";
   String HDFS_SITE_CONFIG = "hdfs-site";
   String YARN_SITE_CONFIG = "yarn-site";
+  String LOG4J = "log4j";
 }
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index 9efab25..f2b55c6 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -80,6 +80,7 @@
 import org.apache.slider.core.exceptions.SliderException;
 import org.apache.slider.core.exceptions.SliderInternalStateException;
 import org.apache.slider.core.exceptions.TriggerClusterTeardownException;
+import org.apache.slider.core.main.LauncherExitCodes;
 import org.apache.slider.core.main.RunService;
 import org.apache.slider.core.main.ServiceLauncher;
 import org.apache.slider.core.persist.ConfTreeSerDeser;
@@ -108,9 +109,9 @@
 import org.apache.slider.server.appmaster.web.SliderAmIpFilter;
 import org.apache.slider.server.appmaster.web.WebAppApi;
 import org.apache.slider.server.appmaster.web.WebAppApiImpl;
-import org.apache.slider.server.services.curator.RegistryBinderService;
-import org.apache.slider.server.services.curator.RegistryConsts;
-import org.apache.slider.server.services.curator.RegistryNaming;
+import org.apache.slider.server.appmaster.web.rest.RestPaths;
+import org.apache.slider.core.registry.info.RegistryNaming;
+import org.apache.slider.server.services.registry.SliderRegistryService;
 import org.apache.slider.server.services.utility.AbstractSliderLaunchedService;
 import org.apache.slider.server.services.utility.EventCallback;
 import org.apache.slider.server.services.utility.RpcService;
@@ -131,6 +132,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
@@ -145,15 +147,15 @@
  */
 public class SliderAppMaster extends AbstractSliderLaunchedService 
   implements AMRMClientAsync.CallbackHandler,
-             NMClientAsync.CallbackHandler,
-             RunService,
+    NMClientAsync.CallbackHandler,
+    RunService,
     SliderExitCodes,
     SliderKeys,
     SliderClusterProtocol,
-             ServiceStateChangeListener,
-             RoleKeys,
-             EventCallback,
-             ContainerStartOperation {
+    ServiceStateChangeListener,
+    RoleKeys,
+    EventCallback,
+    ContainerStartOperation {
   protected static final Logger log =
     LoggerFactory.getLogger(SliderAppMaster.class);
 
@@ -262,7 +264,7 @@
    */
   private ProviderService providerService;
 
-  private RegistryBinderService<ServiceInstanceData> registry;
+  private SliderRegistryService registry;
   
   /**
    * Record of the max no. of cores allowed in this cluster
@@ -348,7 +350,7 @@
 
   /**
    * pick up the args from the service launcher
-   * @param config
+   * @param config configuration
    * @param args argument list
    */
   @Override // RunService
@@ -381,10 +383,10 @@
     //choose the action
     String action = serviceArgs.getAction();
     List<String> actionArgs = serviceArgs.getActionArgs();
-    int exitCode = EXIT_SUCCESS;
+    int exitCode;
     if (action.equals(SliderActions.ACTION_HELP)) {
       log.info(getName() + serviceArgs.usage());
-      exitCode = SliderExitCodes.EXIT_USAGE;
+      exitCode = LauncherExitCodes.EXIT_USAGE;
     } else if (action.equals(SliderActions.ACTION_CREATE)) {
       exitCode = createAndRunCluster(actionArgs.get(0));
     } else {
@@ -563,12 +565,13 @@
       // Start up the WebApp and track the URL for it
       webApp = new SliderAMWebApp(registry);
       WebApps.$for(SliderAMWebApp.BASE_PATH, WebAppApi.class,
-                            new WebAppApiImpl(this, appState, providerService), "ws")
+          new WebAppApiImpl(this, appState, providerService),
+          RestPaths.WS_CONTEXT)
                       .with(serviceConf)
                       .start(webApp);
       appMasterTrackingUrl = "http://" + appMasterHostname + ":" + webApp.port();
       WebAppService<SliderAMWebApp> webAppService =
-        new WebAppService<SliderAMWebApp>("slider", webApp);
+        new WebAppService<>("slider", webApp);
 
       webAppService.init(conf);
       webAppService.start();
@@ -639,7 +642,7 @@
 
       // build up environment variables that the AM wants set in every container
       // irrespective of provider and role.
-      envVars = new HashMap<String, String>();
+      envVars = new HashMap<>();
       if (hadoop_user_name != null) {
         envVars.put(HADOOP_USER_NAME, hadoop_user_name);
       }
@@ -732,7 +735,8 @@
         new PublishedConfiguration(
             "HDFS site settings",
             ConfigHelper.loadFromResource("hdfs-site.xml")));
-
+    
+    
     ServiceInstanceData instanceData = new ServiceInstanceData();
     instanceData.id = registryId;
     instanceData.serviceType = appServiceType;
@@ -756,7 +760,7 @@
     externalView.endpoints.put(
         CustomRegistryConstants.REGISTRY_REST_API,
       new RegisteredEndpoint(
-        new URL(amWeb, RegistryConsts.REGISTRY_RESOURCE_PATH),
+        new URL(amWeb, RestPaths.SLIDER_PATH_REGISTRY),
         "Registry Web Service" )
     );
 
@@ -791,11 +795,11 @@
     );
 
 
-    registry.register(
-      appServiceType,
-      registryId,
-      amWeb,
-      instanceData);
+    registry.registerSelf(
+        appServiceType,
+        registryId,
+        amWeb,
+        instanceData);
   }
 
   /**
@@ -931,9 +935,7 @@
     try {
       log.info("Unregistering AM status={} message={}", appStatus, appMessage);
       asyncRMClient.unregisterApplicationMaster(appStatus, appMessage, null);
-    } catch (YarnException e) {
-      log.info("Failed to unregister application: " + e, e);
-    } catch (IOException e) {
+    } catch (YarnException | IOException e) {
       log.info("Failed to unregister application: " + e, e);
     }
   }
@@ -991,8 +993,8 @@
   @Override //AMRMClientAsync
   public void onContainersAllocated(List<Container> allocatedContainers) {
     LOG_YARN.info("onContainersAllocated({})", allocatedContainers.size());
-    List<ContainerAssignment> assignments = new ArrayList<ContainerAssignment>();
-    List<AbstractRMOperation> operations = new ArrayList<AbstractRMOperation>();
+    List<ContainerAssignment> assignments = new ArrayList<>();
+    List<AbstractRMOperation> operations = new ArrayList<>();
     
     //app state makes all the decisions
     appState.onContainersAllocated(allocatedContainers, assignments, operations);
@@ -1309,7 +1311,7 @@
     RoleInstance instance =
       appState.getLiveInstanceByContainerID(containerID);
     List<AbstractRMOperation> opsList =
-      new LinkedList<AbstractRMOperation>();
+      new LinkedList<>();
     ContainerReleaseOperation release =
       new ContainerReleaseOperation(instance.getId());
     opsList.add(release);
@@ -1351,15 +1353,15 @@
   /**
    * Launch the provider service
    *
-   * @param cd
-   * @param confDir
+   * @param instanceDefinition definition of the service
+   * @param confDir directory of config data
    * @throws IOException
    * @throws SliderException
    */
   protected synchronized void launchProviderService(AggregateConf instanceDefinition,
                                                     File confDir)
     throws IOException, SliderException {
-    Map<String, String> env = new HashMap<String, String>();
+    Map<String, String> env = new HashMap<>();
     boolean execStarted = providerService.exec(instanceDefinition, confDir, env, this);
     if (execStarted) {
       providerService.registerServiceListener(this);
@@ -1409,8 +1411,6 @@
         AMUtils.mapProcessExitCodeToYarnExitCode(exitCode);
       boolean shouldTriggerFailure = !amCompletionFlag.get()
          && (AMUtils.isMappedExitAFailure(mappedProcessExitCode));
-                                     
-     
       
       if (shouldTriggerFailure) {
         //this wasn't expected: the process finished early
@@ -1556,7 +1556,7 @@
     //turn the args to a list
     List<String> argsList = Arrays.asList(args);
     //create a new list, as the ArrayList type doesn't push() on an insert
-    List<String> extendedArgs = new ArrayList<String>(argsList);
+    List<String> extendedArgs = new ArrayList<>(argsList);
     //insert the service name
     extendedArgs.add(0, SERVICE_CLASSNAME);
     //now have the service launcher do its work
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMWebApp.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMWebApp.java
index 6e75d80..30b02d3 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMWebApp.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMWebApp.java
@@ -32,8 +32,9 @@
 import org.apache.slider.server.appmaster.web.rest.SliderJacksonJaxbJsonProvider;
 import org.apache.slider.server.services.curator.CuratorHelper;
 import org.apache.slider.server.services.curator.RegistryBinderService;
-import org.apache.slider.server.services.curator.RegistryDiscoveryContext;
-import org.apache.slider.server.services.curator.RegistryRestResources;
+import org.apache.slider.server.services.registry.RegistryDiscoveryContext;
+import org.apache.slider.server.services.registry.RegistryRestResources;
+import org.apache.slider.server.services.registry.SliderRegistryService;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -48,9 +49,9 @@
   public static final String CONTAINER_STATS = "/stats";
   public static final String CLUSTER_SPEC = "/spec";
 
-  public final RegistryBinderService<ServiceInstanceData> registry;
+  public final SliderRegistryService registry;
 
-  public SliderAMWebApp(RegistryBinderService<ServiceInstanceData> registry) {
+  public SliderAMWebApp(SliderRegistryService registry) {
     Preconditions.checkNotNull(registry);
     this.registry = registry;
   }
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java
index 29f4c5a..6d02e60 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/RestPaths.java
@@ -23,7 +23,8 @@
  */
 public class RestPaths {
 
-  public static final String WS_CONTEXT_ROOT = "/ws";
+  public static final String WS_CONTEXT = "ws";
+  public static final String WS_CONTEXT_ROOT = "/" + WS_CONTEXT;
   public static final String SLIDER_CONTEXT_ROOT = WS_CONTEXT_ROOT +"/v1/slider";
   public static final String SLIDER_SUBPATH_MANAGEMENT = "/mgmt";
   public static final String SLIDER_SUBPATH_AGENTS = "/agents";
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/curator/CuratorHelper.java b/slider-core/src/main/java/org/apache/slider/server/services/curator/CuratorHelper.java
index 8c44aea..a6316d5 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/curator/CuratorHelper.java
+++ b/slider-core/src/main/java/org/apache/slider/server/services/curator/CuratorHelper.java
@@ -29,6 +29,9 @@
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.slider.core.registry.info.ServiceInstanceData;
+import org.apache.slider.server.services.registry.RegistryServiceConstants;
+import org.apache.slider.server.services.registry.RegistryDiscoveryContext;
+import org.apache.slider.server.services.registry.SliderRegistryService;
 
 /**
  * This class creates a curator -but does not start or close it. That
@@ -98,13 +101,13 @@
    * @param discoveryBuilder builder to create the discovery from
    */
 
-  public RegistryBinderService<ServiceInstanceData> createRegistryBinderService(
-    String basePath,
-    ServiceDiscoveryBuilder<ServiceInstanceData> discoveryBuilder) {
+  public SliderRegistryService createRegistryBinderService(
+      String basePath,
+      ServiceDiscoveryBuilder<ServiceInstanceData> discoveryBuilder) {
     discoveryBuilder.basePath(basePath);
-    return new RegistryBinderService<ServiceInstanceData>(curator,
-                                                          basePath,
-                                                          discoveryBuilder.build());
+    return new SliderRegistryService(curator,
+        basePath,
+        discoveryBuilder.build());
   }
 
 
@@ -113,12 +116,12 @@
    * @param basePath base path
    * @return the binder service
    */
-  public RegistryBinderService<ServiceInstanceData> createRegistryBinderService(
+  public SliderRegistryService createRegistryBinderService(
     String basePath) {
     ServiceDiscoveryBuilder<ServiceInstanceData> discoveryBuilder =
       createDiscoveryBuilder();
     //registry will start curator as well as the binder, in the correct order
-    RegistryBinderService<ServiceInstanceData> registryBinderService =
+    SliderRegistryService registryBinderService =
       createRegistryBinderService(basePath, discoveryBuilder);
     return registryBinderService;
   }
@@ -128,7 +131,7 @@
     Preconditions.checkNotNull(discovery);
     return new RegistryDiscoveryContext(discovery,
                                         new RandomStrategy<ServiceInstanceData>(),
-                                        RegistryConsts.INSTANCE_REFRESH_MS,
+                                        RegistryServiceConstants.INSTANCE_REFRESH_MS,
                                         ServiceInstanceData.class);
 
   }
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryBinderService.java b/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryBinderService.java
index 1cade1c..3472575 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryBinderService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryBinderService.java
@@ -28,6 +28,7 @@
 import org.apache.curator.x.discovery.UriSpec;
 import org.apache.slider.core.exceptions.BadClusterStateException;
 import org.apache.slider.core.persist.JsonSerDeser;
+import org.apache.slider.server.services.registry.RegistryViewForProviders;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,11 +53,10 @@
   private final ServiceDiscovery<Payload> discovery;
 
   private final Map<String, ServiceInstance<Payload>> entries =
-    new HashMap<String, ServiceInstance<Payload>>();
+    new HashMap<>();
 
   JsonSerDeser<CuratorServiceInstance<Payload>> deser =
-    new JsonSerDeser<CuratorServiceInstance<Payload>>(
-      CuratorServiceInstance.class);
+    new JsonSerDeser<>(CuratorServiceInstance.class);
 
   /**
    * Create an instance
@@ -206,8 +206,7 @@
     try {
       List<String> instanceIDs = instanceIDs(name);
       List<CuratorServiceInstance<Payload>> instances =
-        new ArrayList<CuratorServiceInstance<Payload>>(
-          instanceIDs.size());
+        new ArrayList<>(instanceIDs.size());
       for (String instanceID : instanceIDs) {
         CuratorServiceInstance<Payload> instance =
           queryForInstance(name, instanceID);
@@ -231,6 +230,5 @@
       throw new IOException(e);
     }
   }
-  
-  
+
 }
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryDiscoveryContext.java b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryDiscoveryContext.java
similarity index 96%
rename from slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryDiscoveryContext.java
rename to slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryDiscoveryContext.java
index 3979163..a7c35e8 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryDiscoveryContext.java
+++ b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryDiscoveryContext.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.slider.server.services.curator;
+package org.apache.slider.server.services.registry;
 
 import org.apache.curator.x.discovery.ProviderStrategy;
 import org.apache.curator.x.discovery.ServiceDiscovery;
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryRestResources.java b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryRestResources.java
similarity index 92%
rename from slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryRestResources.java
rename to slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryRestResources.java
index d897370..39e9875 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryRestResources.java
+++ b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryRestResources.java
@@ -16,13 +16,17 @@
  * limitations under the License.
  */
 
-package org.apache.slider.server.services.curator;
+package org.apache.slider.server.services.registry;
 
 import com.google.inject.Singleton;
 import org.apache.curator.x.discovery.ServiceInstance;
 import org.apache.curator.x.discovery.server.rest.DiscoveryContext;
 import org.apache.curator.x.discovery.server.rest.DiscoveryResource;
 import org.apache.slider.core.registry.info.ServiceInstanceData;
+import org.apache.slider.server.appmaster.web.rest.RestPaths;
+import org.apache.slider.server.services.curator.CuratorServiceInstance;
+import org.apache.slider.server.services.curator.CuratorServiceInstances;
+import org.apache.slider.server.services.curator.RegistryBinderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,16 +47,16 @@
 import java.util.Random;
 
 @Singleton
-@Path(RegistryConsts.REGISTRY_RESOURCE_PATH)
+@Path(RestPaths.SLIDER_PATH_REGISTRY)
 public class RegistryRestResources extends DiscoveryResource<ServiceInstanceData> {
   protected static final Logger log =
       LoggerFactory.getLogger(RegistryRestResources.class);
-  private final RegistryBinderService<ServiceInstanceData> registry;
+  private final SliderRegistryService registry;
   private DiscoveryContext<ServiceInstanceData> context;
   private Random randomizer = new Random();
 
   public RegistryRestResources(@Context DiscoveryContext<ServiceInstanceData> context,
-                               RegistryBinderService<ServiceInstanceData> registry) {
+      SliderRegistryService registry) {
     super(context);
     this.context = context;
     this.registry = registry;
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryConsts.java b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryServiceConstants.java
similarity index 79%
rename from slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryConsts.java
rename to slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryServiceConstants.java
index 37c09ff..ee24dc1 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryConsts.java
+++ b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryServiceConstants.java
@@ -16,10 +16,11 @@
  * limitations under the License.
  */
 
-package org.apache.slider.server.services.curator;
+package org.apache.slider.server.services.registry;
 
-public class RegistryConsts {
-  public static final String REGISTRY_RESOURCE_PATH = "/ws/registry";
+/**
+ * These constants are unique to the slider registry service itself
+ */
+public class RegistryServiceConstants {
   public static final int INSTANCE_REFRESH_MS = 1000;
-  public static String SLIDER_INSTANCE_NAME_FORMAT = "%s-%s";
 }
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryConsts.java b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryViewForProviders.java
similarity index 67%
copy from slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryConsts.java
copy to slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryViewForProviders.java
index 37c09ff..a4e2e9b 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/curator/RegistryConsts.java
+++ b/slider-core/src/main/java/org/apache/slider/server/services/registry/RegistryViewForProviders.java
@@ -16,10 +16,17 @@
  * limitations under the License.
  */
 
-package org.apache.slider.server.services.curator;
+package org.apache.slider.server.services.registry;
 
-public class RegistryConsts {
-  public static final String REGISTRY_RESOURCE_PATH = "/ws/registry";
-  public static final int INSTANCE_REFRESH_MS = 1000;
-  public static String SLIDER_INSTANCE_NAME_FORMAT = "%s-%s";
+import org.apache.slider.core.registry.info.ServiceInstanceData;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * This offers restricted access to the registry for providers
+ */
+public interface RegistryViewForProviders {
+  List<ServiceInstanceData> listInstancesByType(String serviceType) throws
+      IOException;
 }
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/registry/SliderRegistryService.java b/slider-core/src/main/java/org/apache/slider/server/services/registry/SliderRegistryService.java
new file mode 100644
index 0000000..21b751d
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/services/registry/SliderRegistryService.java
@@ -0,0 +1,94 @@
+/*
+ * 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.server.services.registry;
+
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.x.discovery.ServiceDiscovery;
+import org.apache.curator.x.discovery.ServiceInstance;
+import org.apache.slider.core.registry.info.ServiceInstanceData;
+import org.apache.slider.server.services.curator.CuratorServiceInstance;
+import org.apache.slider.server.services.curator.RegistryBinderService;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This is the registry service, which tries to hide exactly how the
+ * registry is implemented
+ */
+
+public class SliderRegistryService
+    extends RegistryBinderService<ServiceInstanceData>
+    implements RegistryViewForProviders {
+  
+  private ServiceInstanceData selfRegistration;
+
+  public SliderRegistryService(CuratorFramework curator,
+      String basePath,
+      ServiceDiscovery<ServiceInstanceData> discovery) {
+    super(curator, basePath, discovery);
+  }
+
+
+  @Override
+  public List<ServiceInstanceData> listInstancesByType(String serviceType) throws
+      IOException {
+    List<CuratorServiceInstance<ServiceInstanceData>> services =
+        listInstances(serviceType);
+    List<ServiceInstanceData> payloads = new ArrayList<>(services.size());
+    for (CuratorServiceInstance<ServiceInstanceData> instance : services) {
+      payloads.add(instance.payload);
+    }
+    return payloads;
+  }
+
+  public ServiceInstanceData getSelfRegistration() {
+    return selfRegistration;
+  }
+
+  private void setSelfRegistration(ServiceInstanceData selfRegistration) {
+    this.selfRegistration = selfRegistration;
+  }
+
+  /**
+   * register an instance -only valid once the service is started.
+   * This sets the selfRegistration field
+   * @param id ID -must be unique
+   * @param name name
+   * @param url URL
+   * @param payload payload (may be null)
+   * @return the instance
+   * @throws IOException on registration problems
+   */
+  public void registerSelf(String name,
+      String id,
+      URL url,
+      ServiceInstanceData instanceData) throws IOException {
+    try {
+      register(name, id, url, instanceData);
+      setSelfRegistration(instanceData);
+    } catch (IOException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new IOException(e);
+    }
+  }
+}
diff --git a/slider-core/src/main/java/org/apache/slider/server/services/utility/AbstractSliderLaunchedService.java b/slider-core/src/main/java/org/apache/slider/server/services/utility/AbstractSliderLaunchedService.java
index 3e0f687..aa594b3 100644
--- a/slider-core/src/main/java/org/apache/slider/server/services/utility/AbstractSliderLaunchedService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/services/utility/AbstractSliderLaunchedService.java
@@ -23,10 +23,9 @@
 import org.apache.slider.common.SliderXmlConfKeys;
 import org.apache.slider.common.tools.SliderUtils;
 import org.apache.slider.core.exceptions.BadConfigException;
-import org.apache.slider.core.registry.info.ServiceInstanceData;
 import org.apache.slider.core.registry.zk.ZookeeperUtils;
 import org.apache.slider.server.services.curator.CuratorHelper;
-import org.apache.slider.server.services.curator.RegistryBinderService;
+import org.apache.slider.server.services.registry.SliderRegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,7 +51,7 @@
    * @return the instance
    * @throws BadConfigException
    */
-  protected RegistryBinderService<ServiceInstanceData> startRegistrationService()
+  protected SliderRegistryService startRegistrationService()
       throws BadConfigException {
 
     String registryQuorum = lookupZKQuorum();
@@ -83,15 +82,15 @@
    * @param zkPath
    * @return
    */
-  public RegistryBinderService<ServiceInstanceData> startRegistrationService(
+  public SliderRegistryService startRegistrationService(
     String zkConnection, String zkPath) {
     CuratorHelper curatorHelper =
       new CuratorHelper(getConfig(), zkConnection);
 
     //registry will start curator as well as the binder, in the correct order
-    RegistryBinderService<ServiceInstanceData> registryBinderService =
+    SliderRegistryService registryBinderService =
       curatorHelper.createRegistryBinderService(zkPath);
-    boolean started = deployChildService(registryBinderService);
+    deployChildService(registryBinderService);
     return registryBinderService;
   }
 
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
index 9cc4931..fee3b99 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
@@ -32,6 +32,7 @@
 import org.apache.slider.core.registry.info.ServiceInstanceData
 import org.apache.slider.server.services.curator.CuratorServiceInstance
 import org.apache.slider.server.services.curator.RegistryBinderService
+import org.apache.slider.server.services.registry.SliderRegistryService
 import org.junit.Test
 
 @CompileStatic
@@ -96,7 +97,7 @@
     //switch to the ZK-based registry
 
     describe "service registry names"
-    RegistryBinderService<ServiceInstanceData> registry = client.registry
+    SliderRegistryService registry = client.registry
     def names = registry.queryForNames();
     dumpRegistryNames(names)
     describe "service registry instance IDs"
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy
index 9eda3be..7cbdaea 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy
@@ -39,6 +39,7 @@
 import org.apache.slider.server.appmaster.web.rest.RestPaths
 import org.apache.slider.server.services.curator.CuratorServiceInstance
 import org.apache.slider.server.services.curator.RegistryBinderService
+import org.apache.slider.server.services.registry.SliderRegistryService
 import org.junit.Test
 
 /**
@@ -111,7 +112,7 @@
     //switch to the ZK-based registry
 
     describe "service registry names"
-    RegistryBinderService<ServiceInstanceData> registry = client.registry
+    SliderRegistryService registry = client.registry
     def names = registry.queryForNames();
     dumpRegistryNames(names)
 
diff --git a/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestLocalRegistry.groovy b/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestLocalRegistry.groovy
index 5d13018..9b15903 100644
--- a/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestLocalRegistry.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestLocalRegistry.groovy
@@ -24,7 +24,7 @@
 import org.apache.slider.core.registry.retrieve.RegistryRetriever
 import org.apache.slider.server.services.curator.CuratorHelper
 import org.apache.slider.server.services.curator.RegistryBinderService
-import org.apache.slider.server.services.curator.RegistryNaming
+import org.apache.slider.core.registry.info.RegistryNaming
 import org.apache.slider.test.MicroZKCluster
 import org.apache.slider.test.SliderTestUtils
 import org.junit.After
diff --git a/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestRegistryRestResources.groovy b/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestRegistryRestResources.groovy
index d631a62..804080f 100644
--- a/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestRegistryRestResources.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/registry/curator/TestRegistryRestResources.groovy
@@ -35,7 +35,7 @@
 import org.apache.slider.server.appmaster.web.rest.RestPaths
 import org.apache.slider.server.services.curator.CuratorServiceInstance
 import org.apache.slider.server.services.curator.CuratorServiceInstances
-import org.apache.slider.server.services.curator.RegistryNaming
+import org.apache.slider.core.registry.info.RegistryNaming
 import org.junit.Test
 
 import javax.ws.rs.core.MediaType
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
index 8f399f0..862da23 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
@@ -38,6 +38,8 @@
 import org.apache.slider.server.appmaster.state.StateAccessForProviders
 import org.apache.slider.server.appmaster.web.rest.agent.*
 import org.apache.slider.server.services.curator.RegistryBinderService
+import org.apache.slider.server.services.registry.RegistryViewForProviders
+import org.apache.slider.server.services.registry.SliderRegistryService
 import org.apache.slider.server.services.utility.EventCallback
 
 class MockProviderService implements ProviderService {
@@ -195,11 +197,11 @@
   @Override
   void bind(
       StateAccessForProviders stateAccessor,
-      RegistryBinderService<ServiceInstanceData> registry) {
+      RegistryViewForProviders registry) {
 
   }
 
-    @Override
+  @Override
     AgentRestOperations getAgentRestOperations() {
         return new AgentRestOperations() {
             @Override
diff --git a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/live/TestTwoLiveClusters.groovy b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/live/TestTwoLiveClusters.groovy
index face330..fad2392 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/live/TestTwoLiveClusters.groovy
+++ b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/live/TestTwoLiveClusters.groovy
@@ -27,6 +27,7 @@
 import org.apache.slider.core.registry.info.ServiceInstanceData
 import org.apache.slider.server.services.curator.CuratorServiceInstance
 import org.apache.slider.server.services.curator.RegistryBinderService
+import org.apache.slider.server.services.registry.SliderRegistryService
 import org.junit.Test
 
 @CompileStatic
@@ -81,7 +82,7 @@
 
     // registry instances    def names = client.listRegistryNames(clustername)
     describe "service registry names"
-    RegistryBinderService<ServiceInstanceData> registry = cluster2Client.registry
+    SliderRegistryService registry = cluster2Client.registry
     def names = registry.queryForNames();
     dumpRegistryNames(names)