From 4669102be6ea0546ebe4fea60321e5e98e2e3328 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 13 Nov 2014 18:15:31 +0000 Subject: [PATCH] Search in subdirectories of main config repo ... in addition to top level. That way users can organize their config files, e.g. by subsystem. Subdirectories have *higher* precedence than the top level. Users configure which subdirectories to search through spring.cloud.config.server.git.searchPaths (array or String, so csv in config file, default empty). Fixes gh-36 --- .../config/server/ConfigServerTestUtils.java | 10 +- .../server/JGitEnvironmentRepository.java | 26 +++++- ...EnvironmentRepositoryIntegrationTests.java | 88 ++++++++++++++++++ .../JGitEnvironmentRepositoryTests.java | 13 +++ .../another-config-repo/bar.properties | 1 + .../another-config-repo/git/COMMIT_EDITMSG | 1 + .../another-config-repo/git/FETCH_HEAD | 2 + .../resources/another-config-repo/git/HEAD | 1 + .../resources/another-config-repo/git/config | 5 + .../another-config-repo/git/gitk.cache | 3 + .../resources/another-config-repo/git/index | Bin 0 -> 200 bytes .../another-config-repo/git/logs/HEAD | 3 + .../git/logs/refs/heads/master | 2 + .../git/logs/refs/heads/raw | 1 + .../16/33e23980f4b4dffab6e1d87b622afd9131515e | Bin 0 -> 89 bytes .../27/d0b5b449f2e8326844a735220383bf16de28b5 | 1 + .../c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 | 2 + ...edd2290fa647beaa1255881228dc90c1d53fce.idx | Bin 0 -> 1268 bytes ...dd2290fa647beaa1255881228dc90c1d53fce.pack | Bin 0 -> 571 bytes .../another-config-repo/git/refs/heads/master | 1 + .../another-config-repo/git/refs/heads/raw | 1 + .../another-config-repo/git/refs/tags/foo | 1 + .../another-config-repo/sub/application.yml | 2 + 23 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryIntegrationTests.java create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/config create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/index create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/27/d0b5b449f2e8326844a735220383bf16de28b5 create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.idx create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/master create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/raw create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/tags/foo create mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/sub/application.yml diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java index ed511857..a892d8ac 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java @@ -28,10 +28,14 @@ public class ConfigServerTestUtils { public static String prepareLocalRepo() throws IOException { return prepareLocalRepo("target/test-classes", "config-repo", "target/config"); - } - - public static String prepareLocalRepo(String buildDir, String repoPath, String checkoutDir) throws IOException { + + public static String prepareLocalRepo(String repoPath) throws IOException { + return prepareLocalRepo("target/test-classes", repoPath, "target/config"); + } + + public static String prepareLocalRepo(String buildDir, String repoPath, + String checkoutDir) throws IOException { if (!repoPath.startsWith("/")) { repoPath = "/" + repoPath; } diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java index da8d93dc..5224c74b 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java @@ -21,6 +21,7 @@ import static org.springframework.util.StringUtils.hasText; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; @@ -72,6 +73,8 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { private boolean initialized; + private String[] searchPaths = new String[0]; + public JGitEnvironmentRepository(ConfigurableEnvironment environment) { this.environment = environment; try { @@ -112,6 +115,14 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { public File getBasedir() { return basedir; } + + public void setSearchPaths(String... searchPaths) { + this.searchPaths = searchPaths; + } + + public String[] getSearchPaths() { + return searchPaths; + } public String getUsername() { return username; @@ -148,11 +159,22 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { if (shouldPull(git, ref)) { pull(git, label, ref); } - String search = basedir.toURI().toString(); - environment.setSearchLocations(search); + environment.setSearchLocations(getSearchLocations(basedir)); return clean(environment.findOne(application, profile, label)); } + private String[] getSearchLocations(File dir) { + List locations = new ArrayList(); + locations.add(dir.toURI().toString()); + for (String path : searchPaths) { + File file = new File(basedir, path); + if (file.isDirectory()) { + locations.add(file.toURI().toString()); + } + } + return locations.toArray(new String[0]); + } + private Ref checkout(Git git, String label) throws GitAPIException { CheckoutCommand checkout = git.checkout(); if (shouldTrack(git, label)) { diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryIntegrationTests.java new file mode 100644 index 00000000..036628d6 --- /dev/null +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryIntegrationTests.java @@ -0,0 +1,88 @@ +/* + * Copyright 2013-2014 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.config.server; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; + +import org.eclipse.jgit.util.FileUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.config.Environment; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * @author Dave Syer + * + */ +public class JGitEnvironmentRepositoryIntegrationTests { + + private ConfigurableApplicationContext context; + + private File basedir = new File("target/config"); + + @Before + public void init() throws Exception { + if (basedir.exists()) { + FileUtils.delete(basedir, FileUtils.RECURSIVE); + } + } + + @After + public void close() { + if (context != null) { + context.close(); + } + } + + @Test + public void vanilla() throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo(); + context = new SpringApplicationBuilder(TestConfiguration.class).web(false) + .properties("spring.cloud.config.server.git.uri=" + uri).run(); + EnvironmentRepository repository = context.getBean(EnvironmentRepository.class); + repository.findOne("bar", "staging", "master"); + Environment environment = repository.findOne("bar", "staging", "master"); + assertEquals(2, environment.getPropertySources().size()); + } + + @Test + public void nested() throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo("another-config-repo"); + context = new SpringApplicationBuilder(TestConfiguration.class) + .web(false) + .properties("spring.cloud.config.server.git.uri=" + uri, + "spring.cloud.config.server.git.searchPaths=sub").run(); + EnvironmentRepository repository = context.getBean(EnvironmentRepository.class); + repository.findOne("bar", "staging", "master"); + Environment environment = repository.findOne("bar", "staging", "master"); + assertEquals(2, environment.getPropertySources().size()); + } + + @Configuration + @Import({ PropertyPlaceholderAutoConfiguration.class, ConfigServerConfiguration.class }) + protected static class TestConfiguration { + } + +} diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java index 07ae62b0..079ca57a 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java @@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; +import java.io.IOException; import org.eclipse.jgit.util.FileUtils; import org.junit.Before; @@ -57,6 +58,18 @@ public class JGitEnvironmentRepositoryTests { .getPropertySources().get(0).getName()); } + @Test + public void nested() throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo("another-config-repo"); + repository.setUri(uri); + repository.setSearchPaths(new String[] {"sub"}); + repository.findOne("bar", "staging", "master"); + Environment environment = repository.findOne("bar", "staging", "master"); + assertEquals(2, environment.getPropertySources().size()); + assertEquals(repository.getUri() + "/sub/application.yml", environment + .getPropertySources().get(0).getName()); + } + @Test public void branch() { repository.setBasedir(basedir); diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties b/spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties new file mode 100644 index 00000000..7daacd5d --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties @@ -0,0 +1 @@ +foo: bar \ No newline at end of file diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG b/spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG new file mode 100644 index 00000000..38f51b1c --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG @@ -0,0 +1 @@ +Move application.yml to subdir diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD b/spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD new file mode 100644 index 00000000..527abd40 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD @@ -0,0 +1,2 @@ +7df4a26d5437d9d4090cd5809967f870444cde8f not-for-merge branch 'raw' of dsyer@localhost:/home/dsyer/dev/platform/config/spring-platform-config-server/target/test-classes/config-repo +7df4a26d5437d9d4090cd5809967f870444cde8f not-for-merge tag 'foo' of dsyer@localhost:/home/dsyer/dev/platform/config/spring-platform-config-server/target/test-classes/config-repo diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD b/spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD new file mode 100644 index 00000000..cb089cd8 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/config b/spring-cloud-config-server/src/test/resources/another-config-repo/git/config new file mode 100644 index 00000000..9b73bf82 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/config @@ -0,0 +1,5 @@ +[core] + repositoryformatversion = 0 + filemode = true + logallrefupdates = true +[branch "raw"] diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache b/spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache new file mode 100644 index 00000000..b420ccba --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache @@ -0,0 +1,3 @@ +1 1 +7df4a26d5437d9d4090cd5809967f870444cde8f 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 +1 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/index b/spring-cloud-config-server/src/test/resources/another-config-repo/git/index new file mode 100644 index 0000000000000000000000000000000000000000..2e65e5aceb937f1e6aef5caf5dd9ee8f1a4b8338 GIT binary patch literal 200 zcmZ?q402{*U|<5_kd!a+${+X4h0zQQ9Lx-9G7}jX8kaCIFu#Cc29DZQXJdC<&OUa3 znyxJ4=@~Z)?VlcD;7dv@(km#+FGwva$xJNb%7 literal 0 HcmV?d00001 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD new file mode 100644 index 00000000..115205aa --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 7df4a26d5437d9d4090cd5809967f870444cde8f Dave Syer 1406860717 -0700 +7df4a26d5437d9d4090cd5809967f870444cde8f 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 Dave Syer 1415902155 +0000 checkout: moving from raw to master +9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 c4bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 Dave Syer 1415902338 +0000 commit: Move application.yml to subdir diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master new file mode 100644 index 00000000..dabf7fcd --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 Dave Syer 1406860776 -0700 branch: Created from 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 +9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 c4bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 Dave Syer 1415902338 +0000 commit: Move application.yml to subdir diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw new file mode 100644 index 00000000..c6423ee9 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 7df4a26d5437d9d4090cd5809967f870444cde8f Dave Syer 1406860717 -0700 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e new file mode 100644 index 0000000000000000000000000000000000000000..10dff25f47652abbe5830f0a1e37c3504a6a086d GIT binary patch literal 89 zcmV-f0H*(V0V^p=O;s>AVlXr?Ff%bxNJ=cyD=5k@NG&SKOf6=pU3E5g$K~u}_owN~ vGM=7sqtO285fcL-P$(`uc7<+*;Da_(wf&?^4Gd zcTa|Hzu?!fUU5(UcBxDI{{oY_ED-+zhA9uQ*y07!i-7!UAij}eze-KC`oQCBoWK7) ipY^Zw_QYqOd2MI>an7H=ylg|9Z^`1arT4GC`3e9D%Xqc` literal 0 HcmV?d00001 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack new file mode 100644 index 0000000000000000000000000000000000000000..a082f3c195a8a659f954b8d0d48c6eb842604f63 GIT binary patch literal 571 zcmWG=boORoU|<4b_G!EobLO7*? zfAH!c`+D;|mH zE06MQU48D@yB%|C-~2O)jXZYQI8Wr3y)6^NDOc58Jf>&Nukbh=e87KMZIF9F>ZB<;}YE6zg78P^6PoLi&B=T-ni!0YS@lxvSE-3sA9#F?^Y_2!v;LLdp7`uD0IeVdkpKVy literal 0 HcmV?d00001 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/master b/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/master new file mode 100644 index 00000000..5ab04afa --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/master @@ -0,0 +1 @@ +c4bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/raw b/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/raw new file mode 100644 index 00000000..4389eb3a --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/raw @@ -0,0 +1 @@ +7df4a26d5437d9d4090cd5809967f870444cde8f diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/tags/foo b/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/tags/foo new file mode 100644 index 00000000..4389eb3a --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/tags/foo @@ -0,0 +1 @@ +7df4a26d5437d9d4090cd5809967f870444cde8f diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/sub/application.yml b/spring-cloud-config-server/src/test/resources/another-config-repo/sub/application.yml new file mode 100644 index 00000000..8791c228 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/sub/application.yml @@ -0,0 +1,2 @@ +info: + foo: bar