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

Merge pull request 'OZG-4814-SpringCloudConfig' (#8) from OZG-4814-SpringCloudConfig into master

parents 5702f11a b9b00f68
No related branches found
No related tags found
No related merge requests found
Showing
with 288 additions and 2 deletions
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
<properties> <properties>
<imageName>docker.ozg-sh.de/administration</imageName> <imageName>docker.ozg-sh.de/administration</imageName>
<build.number>SET_BY_JENKINS</build.number> <build.number>SET_BY_JENKINS</build.number>
<spring-cloud-config-server.version>4.1.0</spring-cloud-config-server.version>
</properties> </properties>
<dependencies> <dependencies>
...@@ -42,6 +43,11 @@ ...@@ -42,6 +43,11 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId> <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>${spring-cloud-config-server.version}</version>
</dependency>
<!-- Dev --> <!-- Dev -->
<dependency> <dependency>
......
...@@ -23,8 +23,12 @@ package de.ozgcloud.admin; ...@@ -23,8 +23,12 @@ package de.ozgcloud.admin;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@SpringBootApplication @SpringBootApplication
@EnableConfigServer
@EnableMongoRepositories
public class AdministrationApplication { public class AdministrationApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
package de.ozgcloud.admin.environment;
import java.util.List;
import org.springframework.cloud.config.environment.Environment;
import org.springframework.cloud.config.environment.PropertySource;
import org.springframework.cloud.config.server.environment.EnvironmentRepository;
import org.springframework.stereotype.Component;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Component
public class AdminEnvironmentRepository implements EnvironmentRepository {
private final PropertyRepository propertyRepository;
@Override
public Environment findOne(String application, String profile, String label) {
List<ConfigurationProperties> properties = propertyRepository.findAllByApplication(application);
return buildEnvironment(application, properties);
}
Environment buildEnvironment(String application, List<ConfigurationProperties> properties) {
var environment = new Environment(application);
environment.addAll(properties.stream().map(this::createPropertySource).toList());
return environment;
}
PropertySource createPropertySource(ConfigurationProperties configurationProperties) {
return new PropertySource(null, configurationProperties.getSource());
}
}
package de.ozgcloud.admin.environment;
import java.util.Map;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
@Document(ConfigurationProperties.COLLECTION_NAME)
public class ConfigurationProperties {
public static final String COLLECTION_NAME = "configuration_properties";
private String application;
private String profile;
private Map<String, Object> source;
}
package de.ozgcloud.admin.environment;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
interface PropertyRepository extends MongoRepository<ConfigurationProperties, String> {
List<ConfigurationProperties> findAllByApplication(String application);
}
\ No newline at end of file
spring:
data:
mongodb:
uri: mongodb://localhost/config-db
\ No newline at end of file
...@@ -2,3 +2,7 @@ spring: ...@@ -2,3 +2,7 @@ spring:
data: data:
rest: rest:
basePath: /api/configuration basePath: /api/configuration
cloud:
config:
server:
prefix: /configserver
\ No newline at end of file
package de.ozgcloud.admin.environment;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.test.web.servlet.MockMvc;
import de.ozgcloud.common.test.DataITCase;
import lombok.SneakyThrows;
@DataITCase
@AutoConfigureMockMvc
class AdminEnvironmentITCase {
@Autowired
private MockMvc mockMvc;
@Test
@SneakyThrows
void shouldHaveHttpEndpoint() {
var result = mockMvc.perform(get("/configserver/example/path"));
result.andExpect(status().isOk());
}
}
\ No newline at end of file
package de.ozgcloud.admin.environment;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.config.environment.Environment;
import org.springframework.cloud.config.server.environment.EnvironmentRepository;
import de.ozgcloud.common.test.DataITCase;
@DataITCase
class AdminEnvironmentRepositoryITCase {
@Autowired
private EnvironmentRepository repository;
@Autowired
private PropertyRepository propertyRepository;
private ConfigurationProperties configurationProperties = ConfigurationPropertiesTestFactory.create();
@AfterEach
void clearData() {
propertyRepository.deleteAll();
}
@Nested
class TestFindOne {
@BeforeEach
void initDb() {
saveMongoSource(configurationProperties);
}
@Test
void shouldFindEnvironmentWithOneCorrectPropertySource() {
var environment = findOneEnvironment();
assertThat(environment.getPropertySources()).hasSize(1);
}
@Test
void shouldFindEnvironmentWithTwoCorrectPropertySources() {
var configurationProperties2 = ConfigurationPropertiesTestFactory.createBuilder().profile("other").build();
saveMongoSource(configurationProperties2);
var environment = findOneEnvironment();
assertThat(environment.getPropertySources()).hasSize(2);
}
private void saveMongoSource(ConfigurationProperties configurationProperties) {
propertyRepository.save(configurationProperties);
}
@Test
void shouldFindEnvironmentWithoutPropertySources() {
var environment = repository.findOne("FalseAppName", ConfigurationPropertiesTestFactory.PROFILE, null);
assertThat(environment.getPropertySources()).isEmpty();
}
@Test
void shouldFindCorrectEnvironment() {
var environment = findOneEnvironment();
assertThat(environment.getPropertySources().getLast().getSource()).isEqualTo(ConfigurationPropertiesTestFactory.PROPERTIES);
}
private Environment findOneEnvironment() {
return repository.findOne(ConfigurationPropertiesTestFactory.APPNAME, ConfigurationPropertiesTestFactory.PROFILE,
null);
}
}
}
package de.ozgcloud.admin.environment;
import static org.assertj.core.api.Assertions.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class AdminEnvironmentRepositoryTest {
@InjectMocks
private AdminEnvironmentRepository repository;
private ConfigurationProperties configurationProperties = ConfigurationPropertiesTestFactory.create();
@Nested
class TestBuildEnvironment {
@Test
void shouldHaveCorrectAppName() {
var environment = repository.buildEnvironment(ConfigurationPropertiesTestFactory.APPNAME, new ArrayList<ConfigurationProperties>());
assertThat(environment.getName()).isEqualTo(ConfigurationPropertiesTestFactory.APPNAME);
}
@Test
void shouldHaveCorrectNumberOfPropertySources() {
var environment = repository.buildEnvironment(ConfigurationPropertiesTestFactory.APPNAME,
List.of(configurationProperties, configurationProperties));
assertThat(environment.getPropertySources()).hasSize(2);
}
@Test
void shouldHandleEmptyConfigurationList() {
var environment = repository.buildEnvironment(ConfigurationPropertiesTestFactory.APPNAME, new ArrayList<ConfigurationProperties>());
assertThat(environment.getPropertySources()).isEmpty();
}
}
@Nested
class TestCreatePropertySource {
@Test
void shouldHaveCorrectSource() {
var propertySource = repository.createPropertySource(configurationProperties);
assertThat(propertySource.getSource()).isEqualTo(configurationProperties.getSource());
}
@Test
void shouldHaveCorrectName() {
var propertySource = repository.createPropertySource(configurationProperties);
assertThat(propertySource.getName()).isNull();
}
}
}
package de.ozgcloud.admin.environment;
import java.util.Map;
public class ConfigurationPropertiesTestFactory {
public static final String APPNAME = "testapp";
public static final String PROFILE = "testprofile";
public static final String PROPERTY1 = "property1";
public static final String VALUE1 = "value1";
public static Map<String, Object> PROPERTIES = Map.of(PROPERTY1, VALUE1);
public static ConfigurationProperties create() {
return createBuilder().build();
}
public static ConfigurationProperties.ConfigurationPropertiesBuilder createBuilder() {
return ConfigurationProperties.builder()
.application(APPNAME)
.profile(PROFILE)
.source(PROPERTIES);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment