use of co.cask.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class ServiceSpecificationCodec method decodeOldSpec.
private ServiceSpecification decodeOldSpec(JsonObject json) {
String className = json.get("classname").getAsString();
TwillSpecification twillSpec = twillSpecificationAdapter.fromJson(json.get("spec").getAsString()).getTwillSpecification();
Map<String, HttpServiceHandlerSpecification> handlers = Maps.newHashMap();
RuntimeSpecification handlerSpec = twillSpec.getRunnables().get(twillSpec.getName());
Map<String, String> configs = handlerSpec.getRunnableSpecification().getConfigs();
// Get the class names of all handlers. It is stored in the handler runnable spec configs
List<String> handlerClasses = GSON.fromJson(configs.get("service.runnable.handlers"), new TypeToken<List<String>>() {
}.getType());
List<JsonObject> handlerSpecs = GSON.fromJson(configs.get("service.runnable.handler.spec"), new TypeToken<List<JsonObject>>() {
}.getType());
for (int i = 0; i < handlerClasses.size(); i++) {
String handlerClass = handlerClasses.get(i);
JsonObject spec = handlerSpecs.get(i);
Map<String, String> properties = GSON.fromJson(spec.get("properties"), new TypeToken<Map<String, String>>() {
}.getType());
// Reconstruct the HttpServiceSpecification. However there is no way to determine the datasets or endpoints
// as it is not recorded in old spec. It's ok since the spec is only used to load data from MDS during redeploy.
handlers.put(spec.get("name").getAsString(), new HttpServiceHandlerSpecification(handlerClass, spec.get("name").getAsString(), spec.get("description").getAsString(), properties, ImmutableSet.<String>of(), ImmutableList.<ServiceHttpEndpoint>of()));
}
ResourceSpecification resourceSpec = handlerSpec.getResourceSpecification();
return new ServiceSpecification(className, twillSpec.getName(), twillSpec.getName(), handlers, new Resources(resourceSpec.getMemorySize(), resourceSpec.getVirtualCores()), resourceSpec.getInstances());
}
use of co.cask.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class ProgramLifecycleHttpHandlerTest method testServiceSpecification.
@Test
public void testServiceSpecification() throws Exception {
deploy(AppWithServices.class);
HttpResponse response = doGet("/v3/namespaces/default/apps/AppWithServices/services/NoOpService");
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
Set<ServiceHttpEndpoint> expectedEndpoints = ImmutableSet.of(new ServiceHttpEndpoint("GET", "/ping"), new ServiceHttpEndpoint("POST", "/multi"), new ServiceHttpEndpoint("GET", "/multi"), new ServiceHttpEndpoint("GET", "/multi/ping"));
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ServiceSpecification.class, new ServiceSpecificationCodec());
Gson gson = gsonBuilder.create();
ServiceSpecification specification = readResponse(response, ServiceSpecification.class, gson);
Set<ServiceHttpEndpoint> returnedEndpoints = new HashSet<>();
for (HttpServiceHandlerSpecification httpServiceHandlerSpecification : specification.getHandlers().values()) {
returnedEndpoints.addAll(httpServiceHandlerSpecification.getEndpoints());
}
Assert.assertEquals("NoOpService", specification.getName());
Assert.assertTrue(returnedEndpoints.equals(expectedEndpoints));
}
use of co.cask.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class ServiceClient method getEndpoints.
/**
* Gets a list of {@link ServiceHttpEndpoint} that a {@link Service} exposes.
*
* @param service ID of the service
* @return A list of {@link ServiceHttpEndpoint}
* @throws IOException if a network error occurred
* @throws UnauthenticatedException if the request is not authorized successfully in the gateway server
* @throws NotFoundException if the app or service could not be found
*/
public List<ServiceHttpEndpoint> getEndpoints(ServiceId service) throws IOException, UnauthenticatedException, NotFoundException, UnauthorizedException {
ServiceSpecification specification = get(service);
ImmutableList.Builder<ServiceHttpEndpoint> builder = new ImmutableList.Builder<>();
for (HttpServiceHandlerSpecification handlerSpecification : specification.getHandlers().values()) {
builder.addAll(handlerSpecification.getEndpoints());
}
return builder.build();
}
use of co.cask.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class ServiceEndpointExtractor method visit.
@Override
public void visit(Object instance, Type inspectType, Type declareType, Method method) throws Exception {
if (!Modifier.isPublic(method.getModifiers())) {
return;
}
Path classPathAnnotation = TypeToken.of(inspectType).getRawType().getAnnotation(Path.class);
Path methodPathAnnotation = method.getAnnotation(Path.class);
if (methodPathAnnotation == null && classPathAnnotation == null) {
return;
}
// Find one or more request type annotations present on the method.
Set<Class<? extends Annotation>> acceptedMethodTypes = ImmutableSet.of(GET.class, POST.class, DELETE.class, PUT.class, OPTIONS.class, HEAD.class);
Set<Class<? extends Annotation>> methodAnnotations = Sets.newHashSet();
for (Annotation annotation : method.getAnnotations()) {
Class<? extends Annotation> annotationClz = annotation.annotationType();
if (acceptedMethodTypes.contains(annotationClz)) {
methodAnnotations.add(annotationClz);
}
}
for (Class<? extends Annotation> methodTypeClz : methodAnnotations) {
String methodType = methodTypeClz.getAnnotation(HttpMethod.class).value();
String endpoint = "/";
endpoint = classPathAnnotation == null ? endpoint : endpoint + classPathAnnotation.value();
endpoint = methodPathAnnotation == null ? endpoint : endpoint + "/" + methodPathAnnotation.value();
// Replace consecutive instances of / with a single instance.
endpoint = endpoint.replaceAll("/+", "/");
endpoints.add(new ServiceHttpEndpoint(methodType, endpoint));
}
}
use of co.cask.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class DefaultHttpServiceHandlerConfigurer method createSpecification.
/**
* Creates a {@link HttpServiceHandlerSpecification} from the parameters stored in this class.
*
* @return a new specification from the parameters stored in this instance
*/
public HttpServiceHandlerSpecification createSpecification() {
List<ServiceHttpEndpoint> endpoints = new ArrayList<>();
// Inspect the handler to grab all @UseDataset, @Property and endpoints.
Reflections.visit(handler, handler.getClass(), new DataSetFieldExtractor(datasets), new PropertyFieldExtractor(properties), new ServiceEndpointExtractor(endpoints));
return new HttpServiceHandlerSpecification(handler.getClass().getName(), name, "", properties, datasets, endpoints);
}
Aggregations