Skip to content

Commit

Permalink
Support admin port in openapi (#999)
Browse files Browse the repository at this point in the history
Refactor the routing decision-making that was repeated in health and metrics MP services into one place; add use of that to OpenAPI MP service
  • Loading branch information
tjquinno authored Sep 10, 2019
1 parent 613a010 commit ec20c0d
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package io.helidon.microprofile.health;

import java.lang.annotation.Annotation;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.logging.Logger;

Expand All @@ -26,6 +25,7 @@
import io.helidon.common.serviceloader.HelidonServiceLoader;
import io.helidon.config.Config;
import io.helidon.health.HealthSupport;
import io.helidon.microprofile.server.RoutingBuilders;
import io.helidon.microprofile.server.spi.MpService;
import io.helidon.microprofile.server.spi.MpServiceContext;

Expand Down Expand Up @@ -94,22 +94,8 @@ public void configure(MpServiceContext mpServiceContext) {
healthCheckProvider.readinessChecks().forEach(builder::addReadiness);
});

healthConfig.get("routing")
.asString()
.flatMap(routeName -> {
// support for overriding the routing back to default port using config
if ("@default".equals(routeName)) {
return Optional.empty();
} else {
return Optional.of(routeName);
}
})
// use named routing
.map(mpServiceContext::serverNamedRoutingBuilder)
// use default server routing
.orElseGet(mpServiceContext::serverRoutingBuilder)
// register health support
RoutingBuilders.create(mpServiceContext, healthConfig)
.routingBuilder()
.register(builder.build());

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,11 @@

import io.helidon.common.CollectionsHelper;
import io.helidon.config.Config;
import io.helidon.config.ConfigValue;
import io.helidon.metrics.MetricsSupport;
import io.helidon.metrics.RegistryFactory;
import io.helidon.microprofile.server.RoutingBuilders;
import io.helidon.microprofile.server.spi.MpService;
import io.helidon.microprofile.server.spi.MpServiceContext;
import io.helidon.webserver.Routing;

/**
* Extension of microprofile {@link io.helidon.microprofile.server.Server} to enable support for metrics
Expand All @@ -46,22 +45,12 @@ public void configure(MpServiceContext serviceContext) {

MetricsSupport metricsSupport = MetricsSupport.create(metricsConfig);

ConfigValue<String> routingNameConfig = metricsConfig.get("routing").asString();
Routing.Builder defaultRouting = serviceContext.serverRoutingBuilder();
RoutingBuilders routingBuilders = RoutingBuilders.create(
serviceContext, metricsConfig);

Routing.Builder endpointRouting = defaultRouting;

if (routingNameConfig.isPresent()) {
String routingName = routingNameConfig.get();
// support for overriding this back to default routing using config
if (!"@default".equals(routingName)) {
endpointRouting = serviceContext.serverNamedRoutingBuilder(routingName);
}
}

metricsSupport.configureVendorMetrics(null, defaultRouting);
metricsSupport.configureVendorMetrics(null, routingBuilders.defaultRoutingBuilder());
vendorMetricsAdded.add("@default");
metricsSupport.configureEndpoint(endpointRouting);
metricsSupport.configureEndpoint(routingBuilders.routingBuilder());

// now we may have additional sockets we want to add vendor metrics to
metricsConfig.get("vendor-metrics-routings")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import java.io.IOException;

import io.helidon.microprofile.server.RoutingBuilders;
import io.helidon.microprofile.server.spi.MpService;
import io.helidon.microprofile.server.spi.MpServiceContext;
import io.helidon.openapi.OpenAPISupport;
Expand All @@ -44,6 +45,6 @@ public void configure(MpServiceContext context) {
throw new RuntimeException(ex);
}

openAPISupport.configureEndpoint(context.serverRoutingBuilder());
openAPISupport.configureEndpoint(RoutingBuilders.create(context, "openapi").routingBuilder());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
*
* Licensed 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 io.helidon.microprofile.server;

import java.util.Optional;

import io.helidon.config.Config;
import io.helidon.microprofile.server.spi.MpServiceContext;
import io.helidon.webserver.Routing;

/**
* Provides {@link Routing.Builder} instances (for the default and the actual)
* for a Helidon MP service, based on configuration for the component (if any)
* and defaults otherwise.
*/
public interface RoutingBuilders {

/**
*
* @return the default {@code Routing.Builder} for the component
*/
Routing.Builder defaultRoutingBuilder();

/**
*
* @return the actual {@code Routing.Builder} for the component; might be the default
*/
Routing.Builder routingBuilder();

/**
* Prepares the default and actual {@link Routing.Builder} instances based
* on the "routing" configuration for the specific component.
*
* @param context the {@code MpServiceContext} for the calling service
* @param componentName config key under which "routing" config might exist for the component of interest
* @return {@code RoutingBuilders} based on the named config (or default)
*/
static RoutingBuilders create(MpServiceContext context, String componentName) {
return create(context, context.helidonConfig().get(componentName));
}

/**
* Prepares the default and actual {@link Routing.Builder} instances based
* on the "routing" configuration for the specific component configuration.
*
* @param context the {@code MpServiceContext} for the calling service
* @param componentConfig the configuration for the calling service
* @return {@code RoutingBuilders} based on the config (or default)
*/
static RoutingBuilders create(MpServiceContext context, Config componentConfig) {
final Routing.Builder defaultRoutingBuilder = context.serverRoutingBuilder();
final Routing.Builder actualRoutingBuilder
= componentConfig.get("routing")
.asString()
.flatMap(routeName -> {
// support for overriding the routing back to default port using config
if ("@default".equals(routeName)) {
return Optional.empty();
} else {
return Optional.of(routeName);
}
})
// use named routing
.map(context::serverNamedRoutingBuilder)
// use default server routing
.orElse(defaultRoutingBuilder);
return new RoutingBuildersImpl(defaultRoutingBuilder, actualRoutingBuilder);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
*
* Licensed 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 io.helidon.microprofile.server;

import io.helidon.webserver.Routing;

/**
* Package-private implementation of the {@code RoutingBuilders} interface.
*/
class RoutingBuildersImpl implements RoutingBuilders {

private final Routing.Builder defaultBuilder;
private final Routing.Builder effectiveBuilder;

RoutingBuildersImpl(Routing.Builder defaultBuilder, Routing.Builder effectiveBuilder) {
this.defaultBuilder = defaultBuilder;
this.effectiveBuilder = effectiveBuilder;
}

@Override
public Routing.Builder defaultRoutingBuilder() {
return defaultBuilder;
}

@Override
public Routing.Builder routingBuilder() {
return effectiveBuilder;
}
}

0 comments on commit ec20c0d

Please sign in to comment.