Skip to content

Commit

Permalink
Create capabilities rest endpoints
Browse files Browse the repository at this point in the history
(cherry picked from commit af4299b)
  • Loading branch information
jakubhava authored and mmalohlava committed May 22, 2017
1 parent 6595e19 commit 2ba113a
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 17 deletions.
42 changes: 26 additions & 16 deletions h2o-core/src/main/java/water/H2O.java
Expand Up @@ -176,7 +176,7 @@ public static void printHelp() {

System.out.print(s);

for (AbstractH2OExtension e : H2O.getExtensions()) {
for (AbstractH2OExtension e : H2O.getCoreExtensions()) {
e.printHelp();
}
}
Expand Down Expand Up @@ -408,7 +408,7 @@ public int parseInt(String a) {
* Dead stupid argument parser.
*/
private static void parseArguments(String[] args) {
for (AbstractH2OExtension e : H2O.getExtensions()) {
for (AbstractH2OExtension e : H2O.getCoreExtensions()) {
args = e.parseArguments(args);
}

Expand Down Expand Up @@ -613,7 +613,7 @@ private static void validateArguments() {
}

// Validate extension arguments
for (AbstractH2OExtension e : H2O.getExtensions()) {
for (AbstractH2OExtension e : H2O.getCoreExtensions()) {
e.validateArguments();
}
}
Expand Down Expand Up @@ -771,7 +771,7 @@ public static void configureLogging() {
* Register H2O extensions.
* <p/>
* Use SPI to find all classes that extends water.AbstractH2OExtension
* and call H2O.addExtension() for each.
* and call H2O.addCoreExtension() for each.
*/
public static void registerExtensions() {
if (extensionsRegistered) {
Expand All @@ -783,22 +783,31 @@ public static void registerExtensions() {
for (AbstractH2OExtension ext : extensionsLoader) {
if (ext.isEnabled()) {
ext.init();
addExtension(ext);
addCoreExtension(ext);
}
}
extensionsRegistered = true;

registerExtensionsMillis = System.currentTimeMillis() - before;
}

private static ArrayList<AbstractH2OExtension> extensions = new ArrayList<>();
private static ArrayList<AbstractH2OExtension> coreExtensions = new ArrayList<>();

public static void addExtension(AbstractH2OExtension e) {
extensions.add(e);
public static void addCoreExtension(AbstractH2OExtension e) {
coreExtensions.add(e);
}

public static ArrayList<AbstractH2OExtension> getExtensions() {
return extensions;
private static ArrayList<RestApiExtension> restApiExtensions = new ArrayList<>();

public static void addRestAPIExtension(RestApiExtension e){
restApiExtensions.add(e);
}
public static ArrayList<AbstractH2OExtension> getCoreExtensions() {
return coreExtensions;
}

public static ArrayList<RestApiExtension> getRestApiExtensions(){
return restApiExtensions;
}

//-------------------------------------------------------------------------------------------------------------------
Expand All @@ -821,12 +830,12 @@ public static void registerRestApis(String relativeResourcePath) {

// Log extension registrations here so the message is grouped in the right spot.
List<String> registeredH2OExts = new ArrayList<>();
for (AbstractH2OExtension e : H2O.getExtensions()) {
for (AbstractH2OExtension e : H2O.getCoreExtensions()) {
e.printInitialized();
registeredH2OExts.add(e.getExtensionName());
}
Log.info("Registered " + H2O.getExtensions().size() + " extensions in: " + registerExtensionsMillis + "ms");
Log.info("Registered H2O extensions: " + Arrays.toString(registeredH2OExts.toArray()));
Log.info("Registered " + H2O.getCoreExtensions().size() + " core extensions in: " + registerExtensionsMillis + "ms");
Log.info("Registered H2O core extensions: " + Arrays.toString(registeredH2OExts.toArray()));

long before = System.currentTimeMillis();
RequestServer.DummyRestApiContext dummyRestApiContext = new RequestServer.DummyRestApiContext();
Expand All @@ -838,6 +847,7 @@ public static void registerRestApis(String relativeResourcePath) {
r.registerEndPoints(dummyRestApiContext);
r.registerSchemas(dummyRestApiContext);
registeredRestApiExts.add(r.getName());
H2O.addRestAPIExtension(r);
} catch (Exception e) {
Log.info("Cannot register extension: " + r + ". Skipping it...");
}
Expand Down Expand Up @@ -1488,7 +1498,7 @@ private static void printAndLogVersion(String[] arguments) {
Log.warn("");
}

for (AbstractH2OExtension e : H2O.getExtensions()) {
for (AbstractH2OExtension e : H2O.getCoreExtensions()) {
String n = e.getExtensionName() + " ";
AbstractBuildVersion abv = e.getBuildVersion();
Log.info(n + "Build git branch: ", abv.branchName());
Expand Down Expand Up @@ -2018,9 +2028,9 @@ public static void main( String[] args ) {
long time5 = System.currentTimeMillis();
startLocalNode();

// Allow extensions to perform initialization that requires the network.
// Allow core extensions to perform initialization that requires the network.
long time6 = System.currentTimeMillis();
for (AbstractH2OExtension ext: extensions) {
for (AbstractH2OExtension ext: coreExtensions) {
ext.onLocalNodeStarted();
}

Expand Down
54 changes: 54 additions & 0 deletions h2o-core/src/main/java/water/api/CapabilitiesHandler.java
@@ -0,0 +1,54 @@
package water.api;

import water.AbstractH2OExtension;
import water.H2O;
import water.api.schemas3.CapabilitiesV3;
import water.api.schemas3.CapabilityEntryV3;

import java.util.ArrayList;


public class CapabilitiesHandler extends Handler{

private ArrayList<CapabilityEntryV3> getCoreExtensionEntries(){
ArrayList<CapabilityEntryV3> entries = new ArrayList<>();
for(AbstractH2OExtension ext: H2O.getCoreExtensions()){
entries.add(new CapabilityEntryV3(ext.getExtensionName()));
}
return entries;
}

private ArrayList<CapabilityEntryV3> getRestAPIExtensionEntries(){
ArrayList<CapabilityEntryV3> entries = new ArrayList<>();
for(RestApiExtension ext: H2O.getRestApiExtensions()){
entries.add(new CapabilityEntryV3(ext.getName()));
}
return entries;
}


@SuppressWarnings("unused") // called through reflection by RequestServer
public CapabilitiesV3 listAll(int version, CapabilitiesV3 s) {
ArrayList<CapabilityEntryV3> entries = new ArrayList<>();
entries.addAll(getCoreExtensionEntries());
entries.addAll(getRestAPIExtensionEntries());
s.capabilities = entries.toArray(new CapabilityEntryV3[entries.size()]);
return s;
}

@SuppressWarnings("unused") // called through reflection by RequestServer
public CapabilitiesV3 listCore(int version, CapabilitiesV3 s) {
ArrayList<CapabilityEntryV3> entries = new ArrayList<>();
entries.addAll(getCoreExtensionEntries());
s.capabilities = entries.toArray(new CapabilityEntryV3[entries.size()]);
return s;
}

@SuppressWarnings("unused") // called through reflection by RequestServer
public CapabilitiesV3 listRest(int version, CapabilitiesV3 s) {
ArrayList<CapabilityEntryV3> entries = new ArrayList<>();
entries.addAll(getRestAPIExtensionEntries());
s.capabilities = entries.toArray(new CapabilityEntryV3[entries.size()]);
return s;
}
}
12 changes: 12 additions & 0 deletions h2o-core/src/main/java/water/api/RegisterV3Api.java
Expand Up @@ -436,6 +436,18 @@ public void register(String relativeResourcePath) {
RequestServer.registerEndpoint("steamMetrics",
"GET /3/SteamMetrics", SteamMetricsHandler.class, "fetch",
"Get metrics for Steam from H2O.");

RequestServer.registerEndpoint("list_all_capabilities",
"GET /3/Capabilities", CapabilitiesHandler.class, "listAll",
"List of all registered capabilities");

RequestServer.registerEndpoint("list_core_capabilities",
"GET /3/Capabilities/Core", CapabilitiesHandler.class, "listCore",
"List registered core capabilities");

RequestServer.registerEndpoint("list_rest_capabilities",
"GET /3/Capabilities/API", CapabilitiesHandler.class, "listRest",
"List of all registered Rest API capabilities");
}

@Override
Expand Down
11 changes: 11 additions & 0 deletions h2o-core/src/main/java/water/api/schemas3/CapabilitiesV3.java
@@ -0,0 +1,11 @@
package water.api.schemas3;


import water.Iced;
import water.api.API;

public class CapabilitiesV3 extends RequestSchemaV3<Iced, CapabilitiesV3> {

@API(help = "List of H2O capabilities", direction = API.Direction.OUTPUT)
public CapabilityEntryV3[] capabilities;
}
14 changes: 14 additions & 0 deletions h2o-core/src/main/java/water/api/schemas3/CapabilityEntryV3.java
@@ -0,0 +1,14 @@
package water.api.schemas3;

import water.Iced;
import water.api.API;

public class CapabilityEntryV3 extends SchemaV3<Iced, CapabilityEntryV3> {
@API(help = "Extension name", direction = API.Direction.OUTPUT)
public String name;

public CapabilityEntryV3() {}
public CapabilityEntryV3(String name) {
this.name = name;
}
}
Expand Up @@ -99,6 +99,7 @@ water.api.schemas3.SchemaMetadataV3
water.api.schemas3.SchemaV3
water.api.schemas3.ShutdownV3
water.api.schemas3.SplitFrameV3
water.api.schemas3.SteamMetricsV3
water.api.schemas3.TabulateV3
water.api.schemas3.TimelineV3
water.api.schemas3.TimelineV3$EventV3
Expand Down Expand Up @@ -128,4 +129,6 @@ water.api.schemas4.output.JobV4
water.api.schemas99.AssemblyV99
water.api.schemas99.GridsV99
water.api.schemas99.RapidsV99
water.util.WaterMeterIo$IoStatsEntry
water.util.WaterMeterIo$IoStatsEntry
water.api.schemas3.CapabilitiesV3
water.api.schemas3.CapabilityEntryV3

0 comments on commit 2ba113a

Please sign in to comment.