/* * Copyright 2013-2015 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 org.springframework.cloud.consul.config; import javax.annotation.PostConstruct; import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.NotEmpty; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; import lombok.Data; /** * @author Spencer Gibb */ @ConfigurationProperties("spring.cloud.consul.config") @Data @Validated public class ConsulConfigProperties { private boolean enabled = true; @NotEmpty private String prefix = "config"; @NotEmpty private String defaultContext = "application"; @NotEmpty private String profileSeparator = ","; @NotNull private Format format = Format.KEY_VALUE; /** * If format is Format.PROPERTIES or Format.YAML * then the following field is used as key to look up consul for configuration. */ @NotEmpty private String dataKey = "data"; @Value("${consul.token:${CONSUL_TOKEN:${spring.cloud.consul.token:${SPRING_CLOUD_CONSUL_TOKEN:}}}}") private String aclToken; private Watch watch = new Watch(); /** * Throw exceptions during config lookup if true, otherwise, log warnings. */ private boolean failFast = true; /** * Alternative to spring.application.name to use in looking up values in consul KV. */ private String name; @PostConstruct public void init() { if (this.format == Format.FILES) { this.profileSeparator = "-"; } } @Data public static class Watch { /** The number of seconds to wait (or block) for watch query, defaults to 55. * Needs to be less than default ConsulClient (defaults to 60). To increase ConsulClient * timeout create a ConsulClient bean with a custom ConsulRawClient with a custom * HttpClient. */ private int waitTime = 55; /** If the watch is enabled. Defaults to true. */ private boolean enabled = true; /** The value of the fixed delay for the watch in millis. Defaults to 1000. */ private int delay = 1000; } /** * There are many ways in which we can specify configuration in consul i.e., * * <ol> * <li> * Nested key value style: Where value is either a constant or part of the key (nested). * For e.g., For following configuration a.b.c=something a.b.d=something else One can * specify the configuration in consul with key as "../kv/config/application/a/b/c" and * value as "something" and key as "../kv/config/application/a/b/d" and value as * "something else"</li> * <li> * Entire contents of properties file as value For e.g., For following configuration * a.b.c=something a.b.d=something else One can specify the configuration in consul with * key as "../kv/config/application/properties" and value as whole configuration " * a.b.c=something a.b.d=something else "</li> * <li> * as Json or YML. You get it.</li> * </ol> * * This enum specifies the different Formats/styles supported for loading the * configuration. * * @author srikalyan.swayampakula */ public enum Format { /** * Indicates that the configuration specified in consul is of type native key values. */ KEY_VALUE, /** * Indicates that the configuration specified in consul is of property style i.e., * value of the consul key would be a list of key=value pairs separated by new lines. */ PROPERTIES, /** * Indicates that the configuration specified in consul is of YAML style i.e., value * of the consul key would be YAML format */ YAML, /** * Indicates that the configuration specified in consul uses keys as files. * This is useful for tools like git2consul. */ FILES, } }