From c4e7ee7abce757d391eeaf03bde2153db2ed8bd8 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 17 Jul 2014 08:28:59 +0100 Subject: [PATCH] Add "application" to config search path in server This is incredibly useful in a distributed system: all components get the shared config in "application.yml" (for instance) as well as their specific values per spring.application.name. --- spring-platform-config-server/pom.xml | 26 ++++++++++++- .../platform/config/server/Application.java | 5 ++- .../server/JGitEnvironmentRepository.java | 38 +++++++++++++------ .../server/NativeEnvironmentRepository.java | 1 + ...pringApplicationEnvironmentRepository.java | 3 ++ .../src/main/resources/application.yml | 2 +- .../JGitEnvironmentRepositoryTests.java | 3 +- 7 files changed, 62 insertions(+), 16 deletions(-) diff --git a/spring-platform-config-server/pom.xml b/spring-platform-config-server/pom.xml index 112d04be..3f817c4f 100644 --- a/spring-platform-config-server/pom.xml +++ b/spring-platform-config-server/pom.xml @@ -4,7 +4,7 @@ 4.0.0 spring-platform-config-server - jar + jar spring-platform-config-server spring-platform-config-server @@ -16,11 +16,27 @@ .. + + + + org.springframework.platform + spring-platform-netflix + ${spring-platform.version} + pom + import + + + + org.springframework.platform spring-platform-config-client + + org.springframework.platform + spring-platform-netflix-core + org.springframework.boot spring-boot-starter-actuator @@ -34,6 +50,10 @@ org.eclipse.jgit 2.3.1.201302201838-r + + com.netflix.eureka + eureka-client + org.springframework.boot spring-boot-starter-test @@ -43,6 +63,7 @@ UTF-8 + ${project.version} org.springframework.platform.config.server.Application 1.7 @@ -52,6 +73,9 @@ org.springframework.boot spring-boot-maven-plugin + + exec + diff --git a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/Application.java b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/Application.java index 59a2ed6a..953fa11c 100644 --- a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/Application.java +++ b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/Application.java @@ -53,10 +53,13 @@ public class Application { @Configuration @Profile("!native") protected static class GitRepositoryConfiguration { + @Autowired + private ConfigurableEnvironment environment; + @Bean @ConfigurationProperties("spring.platform.config.server") public JGitEnvironmentRepository repository() { - return new JGitEnvironmentRepository(); + return new JGitEnvironmentRepository(environment); } } } diff --git a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/JGitEnvironmentRepository.java b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/JGitEnvironmentRepository.java index 9101c1d9..c250b050 100644 --- a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/JGitEnvironmentRepository.java +++ b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/JGitEnvironmentRepository.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.util.FileUtils; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.platform.config.Environment; import org.springframework.platform.config.PropertySource; import org.springframework.util.Assert; @@ -35,14 +36,17 @@ import org.springframework.util.Assert; public class JGitEnvironmentRepository implements EnvironmentRepository { public static final String DEFAULT_URI = "https://github.com/scratches/config-repo"; - + private static Log logger = LogFactory.getLog(JGitEnvironmentRepository.class); private File basedir; private String uri = DEFAULT_URI; - public JGitEnvironmentRepository() { + private ConfigurableEnvironment environment; + + public JGitEnvironmentRepository(ConfigurableEnvironment environment) { + this.environment = environment; try { final File basedir = Files.createTempDirectory("config-repo-").toFile(); Runtime.getRuntime().addShutdownHook(new Thread() { @@ -50,13 +54,15 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { public void run() { try { FileUtils.delete(basedir, FileUtils.RECURSIVE); - } catch (IOException e) { + } + catch (IOException e) { logger.warn("Failed to delete temporary directory on exit: " + e); } } }); this.basedir = basedir; - } catch (IOException e) { + } + catch (IOException e) { throw new IllegalStateException("Cannot create temp dir", e); } } @@ -67,8 +73,7 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { } this.uri = uri; } - - + public void setBasedir(File basedir) { this.basedir = basedir; } @@ -80,12 +85,15 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { if (new File(basedir, ".git").exists()) { git = Git.open(basedir); git.fetch().call(); - } else { + } + else { if (basedir.exists()) { try { FileUtils.delete(basedir, FileUtils.RECURSIVE); - } catch (IOException e) { - throw new IllegalStateException("Failed to initialize base directory", e); + } + catch (IOException e) { + throw new IllegalStateException( + "Failed to initialize base directory", e); } } Assert.state(basedir.mkdirs(), "Could not create basedir: " + basedir); @@ -100,7 +108,8 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { result = clean(environment.findOne(application, name, label)); } return result; - } catch (Exception e) { + } + catch (Exception e) { throw new IllegalStateException("Cannot clone repository", e); } } @@ -109,9 +118,14 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { Environment result = new Environment(value.getName(), value.getLabel()); for (PropertySource source : value.getPropertySources()) { String name = source.getName().replace(basedir.toURI().toString(), ""); + if (name.contains(("classpath:/"))) { + continue; + } + if (environment.getPropertySources().contains(name)) { + continue; + } name = name.replace("applicationConfig: [", ""); - name = uri + "/" - + name.substring(0, name.contains("]") ? name.lastIndexOf("]") : name.length()); + name = uri + "/" + name.replace("]", ""); result.add(new PropertySource(name, source.getSource())); } return result; diff --git a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/NativeEnvironmentRepository.java b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/NativeEnvironmentRepository.java index 2cc33132..1da695c9 100644 --- a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/NativeEnvironmentRepository.java +++ b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/NativeEnvironmentRepository.java @@ -38,6 +38,7 @@ import org.springframework.web.context.support.StandardServletEnvironment; public class NativeEnvironmentRepository implements EnvironmentRepository { private Set standardSources = new HashSet(Arrays.asList( + "vcap", StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, StandardServletEnvironment.JNDI_PROPERTY_SOURCE_NAME, diff --git a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/SpringApplicationEnvironmentRepository.java b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/SpringApplicationEnvironmentRepository.java index ad7c7365..5f6285ce 100644 --- a/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/SpringApplicationEnvironmentRepository.java +++ b/spring-platform-config-server/src/main/java/org/springframework/platform/config/server/SpringApplicationEnvironmentRepository.java @@ -55,6 +55,9 @@ public class SpringApplicationEnvironmentRepository implements EnvironmentReposi private String[] getArgs(String config) { List list = new ArrayList(); + if (!config.startsWith("application")) { + config = "application," + config; + } list.add("--spring.config.name=" + config); list.add("--spring.platform.bootstrap.enabled=false"); if (locations != null) { diff --git a/spring-platform-config-server/src/main/resources/application.yml b/spring-platform-config-server/src/main/resources/application.yml index 5504ae26..7c19f761 100644 --- a/spring-platform-config-server/src/main/resources/application.yml +++ b/spring-platform-config-server/src/main/resources/application.yml @@ -8,4 +8,4 @@ spring: server: port: 8888 management: - context_path: /admin \ No newline at end of file + context_path: /admin diff --git a/spring-platform-config-server/src/test/java/org/springframework/platform/config/server/JGitEnvironmentRepositoryTests.java b/spring-platform-config-server/src/test/java/org/springframework/platform/config/server/JGitEnvironmentRepositoryTests.java index 4f0934f3..563992fc 100644 --- a/spring-platform-config-server/src/test/java/org/springframework/platform/config/server/JGitEnvironmentRepositoryTests.java +++ b/spring-platform-config-server/src/test/java/org/springframework/platform/config/server/JGitEnvironmentRepositoryTests.java @@ -24,6 +24,7 @@ import java.io.File; import org.eclipse.jgit.util.FileUtils; import org.junit.Before; import org.junit.Test; +import org.springframework.core.env.StandardEnvironment; import org.springframework.platform.config.Environment; /** @@ -32,7 +33,7 @@ import org.springframework.platform.config.Environment; */ public class JGitEnvironmentRepositoryTests { - private JGitEnvironmentRepository repository = new JGitEnvironmentRepository(); + private JGitEnvironmentRepository repository = new JGitEnvironmentRepository(new StandardEnvironment()); private File basedir = new File("target/config-repo");