Skip to content
Snippets Groups Projects
Commit f76af5f8 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-4814 Simplified implementation of cloud config server /w mongodb using a MongoRepository

parent b12305b0
No related branches found
No related tags found
No related merge requests found
...@@ -6,42 +6,25 @@ import java.util.stream.Collectors; ...@@ -6,42 +6,25 @@ import java.util.stream.Collectors;
import org.springframework.cloud.config.environment.Environment; import org.springframework.cloud.config.environment.Environment;
import org.springframework.cloud.config.environment.PropertySource; import org.springframework.cloud.config.environment.PropertySource;
import org.springframework.cloud.config.server.environment.EnvironmentRepository; import org.springframework.cloud.config.server.environment.EnvironmentRepository;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
public class MongoEnvironmentRepository implements EnvironmentRepository { import lombok.RequiredArgsConstructor;
public static final String COLLECTION_NAME = "configuration_properties";
private static final String APPLICATION = "application";
private static final String PROFILE = "profile";
private MongoOperations mongoOperations; @RequiredArgsConstructor
public class AdminEnvironmentRepository implements EnvironmentRepository {
public static final String COLLECTION_NAME = "configuration_properties";
public MongoEnvironmentRepository(MongoOperations mongoOperations) { private final PropertyRepository propertyRepository;
this.mongoOperations = mongoOperations;
}
@Override @Override
public Environment findOne(String application, String profile, String label) { public Environment findOne(String application, String profile, String label) {
String[] profiles = splitInputProfileIntoArray(profile); String[] profiles = profile.split(",");
Query query = buildMongoQuery(application, profiles); List<MongoPropertySource> properties = propertyRepository.findAllByApplication(application);
List<MongoPropertySource> matchingPropertyEntries = findMatchingEntriesInMongoDB(query, COLLECTION_NAME);
Environment environment = new Environment(application, profiles, null, null, null);
environment.addAll(matchingPropertyEntries.stream().map(this::transformMonPropertySourceToPropertySource).collect(Collectors.toList())); var environment = new Environment(application, profiles, null, null, null);
return environment;
}
private String[] splitInputProfileIntoArray(String profile) { environment.addAll(properties.stream().map(this::transformMonPropertySourceToPropertySource).collect(Collectors.toList()));
return (profile).split(",");
}
private Query buildMongoQuery(String application, String[] profiles) { return environment;
Query query = new Query();
query.addCriteria(Criteria.where(APPLICATION).in(application));
query.addCriteria(Criteria.where(PROFILE).in((Object[]) profiles));
return query;
} }
private PropertySource transformMonPropertySourceToPropertySource(MongoPropertySource mongoPropertySource) { private PropertySource transformMonPropertySourceToPropertySource(MongoPropertySource mongoPropertySource) {
...@@ -49,8 +32,4 @@ public class MongoEnvironmentRepository implements EnvironmentRepository { ...@@ -49,8 +32,4 @@ public class MongoEnvironmentRepository implements EnvironmentRepository {
return new PropertySource(sourceName, mongoPropertySource.getSource()); return new PropertySource(sourceName, mongoPropertySource.getSource());
} }
private List<MongoPropertySource> findMatchingEntriesInMongoDB(Query query, String collectionName) {
return mongoOperations.find(query, MongoPropertySource.class, collectionName);
}
} }
...@@ -3,17 +3,16 @@ package de.ozgcloud.admin.environment; ...@@ -3,17 +3,16 @@ package de.ozgcloud.admin.environment;
import org.springframework.cloud.config.server.environment.EnvironmentRepository; import org.springframework.cloud.config.server.environment.EnvironmentRepository;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoOperations;
import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor;
@Configuration @Configuration
@AllArgsConstructor @RequiredArgsConstructor
public class MongoEnvironmentRepositoryConfiguration { public class AdminEnvironmentRepositoryConfiguration {
private MongoOperations mongoOperations; final PropertyRepository propertyRepository;
@Bean @Bean
public EnvironmentRepository environmentRepository() { EnvironmentRepository environmentRepository() {
return new MongoEnvironmentRepository(mongoOperations); return new AdminEnvironmentRepository(propertyRepository);
} }
} }
...@@ -6,14 +6,14 @@ import java.lang.annotation.RetentionPolicy; ...@@ -6,14 +6,14 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import org.springframework.cloud.config.server.EnableConfigServer; import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Import(MongoEnvironmentRepositoryConfiguration.class) @Import(AdminEnvironmentRepositoryConfiguration.class)
@EnableConfigServer @EnableConfigServer
@Configuration @EnableMongoRepositories
public @interface EnableMongoConfigServer { public @interface EnableMongoConfigServer {
} }
...@@ -2,6 +2,8 @@ package de.ozgcloud.admin.environment; ...@@ -2,6 +2,8 @@ package de.ozgcloud.admin.environment;
import java.util.Map; import java.util.Map;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -9,6 +11,7 @@ import lombok.Setter; ...@@ -9,6 +11,7 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
@Builder @Builder
@Document(AdminEnvironmentRepository.COLLECTION_NAME)
public class MongoPropertySource { public class MongoPropertySource {
private String application; private String application;
private String profile; private String profile;
......
package de.ozgcloud.admin.environment;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface PropertyRepository extends MongoRepository<MongoPropertySource, String> {
List<MongoPropertySource> findAllByApplication(String application);
}
\ No newline at end of file
...@@ -21,7 +21,7 @@ class MongoConfigServerITCase { ...@@ -21,7 +21,7 @@ class MongoConfigServerITCase {
@Test @Test
@SneakyThrows @SneakyThrows
void shouldHaveHttpEndpoint() { void shouldHaveHttpEndpoint() {
var result = mockMvc.perform(get("/" + MongoPropertySourceTestFactory.APPNAME + "/" + MongoPropertySourceTestFactory.PROFILE)); var result = mockMvc.perform(get("/example/path"));
result.andExpect(status().isOk()); result.andExpect(status().isOk());
} }
......
...@@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.cloud.config.environment.Environment; import org.springframework.cloud.config.environment.Environment;
import org.springframework.cloud.config.server.environment.EnvironmentRepository; import org.springframework.cloud.config.server.environment.EnvironmentRepository;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
...@@ -21,59 +20,51 @@ import de.ozgcloud.common.test.DbInitializer; ...@@ -21,59 +20,51 @@ import de.ozgcloud.common.test.DbInitializer;
@ActiveProfiles({ "itcase", "with_db" }) @ActiveProfiles({ "itcase", "with_db" })
class MongoEnvironmentRepositoryITCase { class MongoEnvironmentRepositoryITCase {
@Autowired
private MongoOperations mongoOperations;
@Autowired @Autowired
private EnvironmentRepository repository; private EnvironmentRepository repository;
@Autowired
private PropertyRepository propertyRepository;
private MongoPropertySource mongoPropertySource; private MongoPropertySource mongoPropertySource;
@BeforeEach
public void prepareExampleData() {
mongoPropertySource = MongoPropertySourceTestFactory.create();
}
@AfterEach @AfterEach
public void clearData() { public void clearData() {
mongoOperations.dropCollection(MongoEnvironmentRepository.COLLECTION_NAME); propertyRepository.deleteAll();
} }
private void saveMongoSource() { private void saveMongoSource(MongoPropertySource mongoPropertySource) {
mongoOperations.save(mongoPropertySource, MongoEnvironmentRepository.COLLECTION_NAME); propertyRepository.save(mongoPropertySource);
} }
@Nested @Nested
class TestEnvironmentFindMethod { class TestEnvironmentFindMethod {
@Test @BeforeEach
void shouldFindEnvironmentWithCorrectAppName() { public void addExampleDataToDatabase() {
saveMongoSource(); mongoPropertySource = MongoPropertySourceTestFactory.create();
saveMongoSource(mongoPropertySource);
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
assertEquals(MongoPropertySourceTestFactory.APPNAME, environment.getName());
} }
@Test @Test
void shouldFindEnvironmentWithCorrectProfile() { void shouldFindEnvironmentWithOneCorrectPropertySource() {
saveMongoSource();
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null); Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
assertEquals(MongoPropertySourceTestFactory.PROFILE, environment.getProfiles()[0]); assertEquals(1, environment.getPropertySources().size());
} }
@Test @Test
void shouldFindEnvironmentWithCorrectNumberOfPropertySources() { void shouldFindEnvironmentWithTwoCorrectPropertySource() {
saveMongoSource(); var mongoPropertySource2 = MongoPropertySourceTestFactory.create();
mongoPropertySource2.setProfile("other");
saveMongoSource(mongoPropertySource);
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null); Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
assertEquals(1, environment.getPropertySources().size()); assertEquals(2, environment.getPropertySources().size());
} }
@Test @Test
void shouldFindEnvironmentWithCorrectPropertySource() { void shouldFindEnvironmentWithCorrectPropertySource() {
saveMongoSource();
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null); Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
...@@ -83,7 +74,6 @@ class MongoEnvironmentRepositoryITCase { ...@@ -83,7 +74,6 @@ class MongoEnvironmentRepositoryITCase {
@Test @Test
void shouldFindCorrectEnvironment() { void shouldFindCorrectEnvironment() {
saveMongoSource();
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null); Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
...@@ -93,36 +83,57 @@ class MongoEnvironmentRepositoryITCase { ...@@ -93,36 +83,57 @@ class MongoEnvironmentRepositoryITCase {
} }
@Nested @Nested
class TestMultipleProfilesInput { class TestEnvironment {
@Test @Test
void shouldFindEnvironmentWithCorrectNumberOfPropertySources() { void shouldHaveCorrectAppName() {
saveMongoSource();
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
MongoPropertySourceTestFactory.PROFILE + "," + "SecondProfile", null);
assertEquals(1, environment.getPropertySources().size()); assertEquals(MongoPropertySourceTestFactory.APPNAME, environment.getName());
} }
@Test @Test
void shouldFindEnvironmentWithCorrectFirstProfile() { void shouldHaveCorrectProfileNumber() {
saveMongoSource();
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
MongoPropertySourceTestFactory.PROFILE + "," + "SecondProfile", null);
assertEquals(1, environment.getProfiles().length);
}
@Test
void shouldHaveCorrectProfileEntry() {
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE, null);
assertEquals(MongoPropertySourceTestFactory.PROFILE, environment.getProfiles()[0]); assertEquals(MongoPropertySourceTestFactory.PROFILE, environment.getProfiles()[0]);
} }
@Test @Test
void shouldFindEnvironmentWithCorrectSecondProfile() { void shouldHaveArrayOfProfiles() {
saveMongoSource();
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE + ",Second",
null);
assertEquals(2, environment.getProfiles().length);
}
@Test
void shouldHaveCorrectFirstProfileEntry() {
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE + ",Second",
MongoPropertySourceTestFactory.PROFILE + "," + "SecondProfile", null); null);
assertEquals("SecondProfile", environment.getProfiles()[1]); assertEquals(MongoPropertySourceTestFactory.PROFILE, environment.getProfiles()[0]);
} }
@Test
void shouldHaveCorrectSecondProfileEntry() {
Environment environment = repository.findOne(MongoPropertySourceTestFactory.APPNAME, MongoPropertySourceTestFactory.PROFILE + ",Second",
null);
assertEquals("Second", environment.getProfiles()[1]);
} }
} }
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment