/* * Copyright 2016 the original author or authors. * * 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 ratpack.consul; import com.google.common.io.ByteSource; import com.orbitz.consul.Consul; import com.orbitz.consul.option.QueryOptions; import ratpack.func.Action; import ratpack.util.Exceptions; /** * Integration for retrieving values from a <a href=https://www.consul.io/>Consul</a> Key-Value store as {@link com.google.common.io.ByteSource} to be used * with the existing {@link ratpack.server.ServerConfigBuilder} parsing options. * @since 1.5 */ public interface RatpackConsulConfig { /** * Read the specified key as a {@link ByteSource} using the default Consul agent connection properties. * * @param key the key to read from Consul's Key-Value store * @return a {@link ByteSource} representing the value stored in the key * @see #value(String, QueryOptions, Action) */ static ByteSource value(String key) { return value(key, QueryOptions.BLANK, Action.noop()); } /** * Read the specified key as a {@link ByteSource} using the default Consul agent connection properties and the provided {@link QueryOptions}. * * @param key the key to read from Consul Key-Value store * @param queryOptions the options to use when querying Consul * @return a {@link ByteSource} representing the value stored in the key * @see #value(String, QueryOptions, Action) */ static ByteSource value(String key, QueryOptions queryOptions) { return value(key, queryOptions, Action.noop()); } /** * Read the specified key as a {@link ByteSource} using the specified configuration to connection to Consul. * * @param key the key to read from Consul's KeyValue store * @param clientConfig the configuration for the Consul connection * @return a {@link ByteSource} representing the value stored in the key * @see #value(String, QueryOptions, Action) */ static ByteSource value(String key, Action<? super Consul.Builder> clientConfig) { return value(key, QueryOptions.BLANK, clientConfig); } /** * Read the specified key as a {@link ByteSource} using the specified configuration to connection to Consul and the provided {@link QueryOptions}. * The returned value can then be passed to the existing parsing options in {@link ratpack.server.ServerConfigBuilder} to provide configuration. * <p> * <pre class="java-args">{@code * import ratpack.consul.RatpackConsulConfig; * import ratpack.test.embed.EmbeddedApp; * import com.orbitz.consul.option.ImmutableQueryOptions; * * public class Example { * public static class Config { * public String name; * public String environment; * public String secret; * } * * public static void main(String... args) throws Exception { * EmbeddedApp.of(a -> a * .serverConfig(s -> s * .yaml(RatpackConsulConfig.value("default/app")) * .json(RatpackConsulConfig.value("default/environment", ImmutableQueryOptions.builder().token("app-acl-token").build())) * .props(RatpackConsulConfig.value("app/environment", b -> b.withUrl("https://consul.domain.io"))) * .require("/config", Config.class) * ) * .handlers(c -> c * .get(ctx -> ctx.render(ctx.get(Config.class))) * ) * ); * } * } * }</pre> * @param key the key to read from Consul Key-Value store * @param queryOptions the options to use when querying Consul * @param clientConfig he configuration for the Consul connection * @return a {@link ByteSource} representing the value stored in the key */ static ByteSource value(String key, QueryOptions queryOptions, Action<? super Consul.Builder> clientConfig) { return Exceptions.uncheck(() -> ByteSource.wrap( clientConfig.with(Consul.builder()).build() .keyValueClient() .getValue(key, queryOptions) .transform(v -> v.getValueAsString().or("")) .or("").getBytes() ) ); } }