diff --git a/Jenkinsfile b/Jenkinsfile index 9158e620db755d16f6ec99bf7c7da69690ba4d48..f39af07714222e3561ef798cb1edf0e1a511ab82 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -79,28 +79,6 @@ pipeline { } } } - - stage ('OWASP Dependency-Check Vulnerabilities') { - when { - anyOf { - branch 'master' - branch 'release' - } - } - steps { - dependencyCheck additionalArguments: ''' - -o "./" - -s "./" - -f "ALL" - -d /dependency-check-data - --suppression dependency-check-supressions.xml - --disableKnownExploited - --disableArchive - --prettyPrint''', odcInstallation: 'dependency-check-owasp' - - dependencyCheckPublisher pattern: 'dependency-check-report.xml' - } - } stage('Deploy Eingang-Adapter to Nexus'){ when { @@ -155,7 +133,7 @@ pipeline { dir('src/main/helm') { sh "helm lint -f test-values.yaml" - sh "helm unittest -f '../../test/helm/*.yaml' -v '../../test/unit-values.yaml' ." + sh "helm unittest --helm3 -f '../../test/helm/*.yaml' -v '../../test/unit-values.yaml' ." sh "helm package --version=${HELM_CHART_VERSION} ." @@ -174,7 +152,7 @@ pipeline { dir('xta-adapter/src/main/helm') { sh "helm lint -f test-values.yaml" - sh "helm unittest -f '../../test/helm/*.yaml' -v '../../test/helm/values/unit-values.yaml' ." + sh "helm unittest --helm3 -f '../../test/helm/*.yaml' -v '../../test/helm/values/unit-values.yaml' ." sh "helm package --version=${HELM_CHART_VERSION} ." @@ -217,6 +195,28 @@ pipeline { } } } + + stage ('OWASP Dependency-Check Vulnerabilities') { + when { + anyOf { + branch 'master' + branch 'release' + } + } + steps { + dependencyCheck additionalArguments: ''' + -o "./" + -s "./" + -f "ALL" + -d /dependency-check-data + --suppression dependency-check-supressions.xml + --disableKnownExploited + --disableArchive + --prettyPrint''', odcInstallation: 'dependency-check-owasp' + + dependencyCheckPublisher pattern: 'dependency-check-report.xml' + } + } } post { failure { diff --git a/common/pom.xml b/common/pom.xml index fcd679a43f6f3f22d5469f1d2ee94955056d14a7..665d5c50dd4658fb69110588bc17c56581cea0c7 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -31,7 +31,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> <artifactId>common</artifactId> diff --git a/formcycle-adapter/formcycle-adapter-impl/pom.xml b/formcycle-adapter/formcycle-adapter-impl/pom.xml index 7e68ae9cccba4b10f15ff830ecdd33dcb930dafc..3780ceaf98ab22897aca467c2ad90c48ca558eb1 100644 --- a/formcycle-adapter/formcycle-adapter-impl/pom.xml +++ b/formcycle-adapter/formcycle-adapter-impl/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>formcycle-adapter</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>formcycle-adapter-impl</artifactId> diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java index 1f12b52ffe4efc2b1f4731ff88181b2968759f32..1702267a0ca19cf37ef769e1d6c2a41394bbe643 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java @@ -65,6 +65,7 @@ class FormDataController { private final FormCycleFormDataMapper mapper; private final SemantikAdapter semantikAdapter; + private final VorgangNummerSupplier vorgangNummerSupplier; @PostMapping(consumes = "multipart/form-data", produces = "application/protobuf") public FormCycleConfirmationResponse receiveFormData(@RequestPart FormCycleFormData formData, @@ -75,10 +76,16 @@ class FormDataController { mappedFormData = addRepresentations(representations, mappedFormData); mappedFormData = addFiles(formData, attachments, mappedFormData); mappedFormData = addServiceKonto(formData, mappedFormData); + mappedFormData = addVorgangNummer(mappedFormData); semantikAdapter.processFormData(mappedFormData); - return FormCycleConfirmationResponse.newBuilder().setVorgangNummer("TODO FILL ME").build(); + return FormCycleConfirmationResponse.newBuilder().setVorgangNummer(mappedFormData.getHeader().getRequestId()).build(); + } + + private FormData addVorgangNummer(FormData mappedFormData) { + var formDataHeader = mappedFormData.getHeader().toBuilder().requestId(vorgangNummerSupplier.get()).build(); + return mappedFormData.toBuilder().header(formDataHeader).build(); } private FormData addRepresentations(Optional<Collection<MultipartFile>> files, FormData mappedFormData) { diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java new file mode 100644 index 0000000000000000000000000000000000000000..cebe8c74bb4d6fe3fa94035b24eb5caf0818c57d --- /dev/null +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java @@ -0,0 +1,32 @@ +package de.itvsh.kop.eingang.formcycle; + +import java.time.Instant; +import java.time.LocalDate; + +import org.springframework.stereotype.Component; + +@Component +class VorgangNummerSupplier { + + static final String BASE30_ALPHABET = "23456789ABCDEFGHJKMNPQRSTVWXYZ"; + static final int SUFFIX_LENGTH = 6; + + public String get() { + var resultBuilder = initWithPrefix(); + long currentTimeSeconds = Instant.now().toEpochMilli(); + for (int i = 0; i < SUFFIX_LENGTH; i++) { + resultBuilder.append(BASE30_ALPHABET.charAt((int) currentTimeSeconds % 30)); + currentTimeSeconds /= 30; + } + return resultBuilder.toString(); + } + + StringBuilder initWithPrefix() { + var today = LocalDate.now(); + var lastYearNumber = today.getYear() % 10; + var monthValue = "%02d".formatted(today.getMonthValue()); + var dayValue = "%02d".formatted(today.getDayOfMonth()); + return new StringBuilder().append(lastYearNumber).append(monthValue).append(dayValue).append("-"); + } + +} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java index d5bb079c7c955bc8601e83cd5bb074fe901e511b..4c496eb5cd37d49195bfda49d00a24a09c00a1f2 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java @@ -68,6 +68,8 @@ class FormDataControllerTest { private FormCycleFormDataMapper mapper; @Mock private SemantikAdapter semantikAdapter; + @Mock + private VorgangNummerSupplier vorgangNummerSupplier; private MockMvc mockMvc; @@ -81,6 +83,8 @@ class FormDataControllerTest { @Nested class ReceiveFormData { + static final String VORGANG_NUMMER = "VorgangNummer"; + private FormData mappedFormData = FormDataTestFactory.create(); @Captor @@ -89,6 +93,7 @@ class FormDataControllerTest { @BeforeEach void init() { when(mapper.toFormData(any())).thenReturn(mappedFormData); + when(vorgangNummerSupplier.get()).thenReturn(VORGANG_NUMMER); } @Test @@ -96,13 +101,30 @@ class FormDataControllerTest { doPostRequest().andExpect(status().is2xxSuccessful()); } + + @Test + void shouldCallVorgangNummerSupplier() { + doPostRequest(); + + verify(vorgangNummerSupplier).get(); + } + @Test @SneakyThrows void shouldRespondeWithVorgangNummer() { + var confirmation = FormCycleConfirmationResponse.parseFrom( doPostRequest().andReturn().getResponse().getContentAsByteArray()); - assertThat(confirmation.getVorgangNummer()).isEqualTo("TODO FILL ME"); + assertThat(confirmation.getVorgangNummer()).isEqualTo(VORGANG_NUMMER); + } + + @Test + void shouldSetVorgangNummer() { + doPostRequest(); + + verify(semantikAdapter).processFormData(formDataCaptor.capture()); + assertThat(formDataCaptor.getValue().getHeader().getRequestId()).isEqualTo(VORGANG_NUMMER); } @Test @@ -117,7 +139,7 @@ class FormDataControllerTest { doPostRequest(); verify(semantikAdapter).processFormData(formDataCaptor.capture()); - assertThat(formDataCaptor.getValue()).usingRecursiveComparison().ignoringFields("representations", "attachments", "numberOfAttachments") + assertThat(formDataCaptor.getValue()).usingRecursiveComparison().ignoringFields("representations", "attachments", "numberOfAttachments", "header.requestId") .isEqualTo(mappedFormData); } diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java new file mode 100644 index 0000000000000000000000000000000000000000..42a7be6008e89a9b316a933cf5dcaac7c78ab229 --- /dev/null +++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java @@ -0,0 +1,84 @@ +package de.itvsh.kop.eingang.formcycle; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.time.LocalDate; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Spy; + +class VorgangNummerSupplierTest { + + @Spy + private VorgangNummerSupplier vorgangNummerSupplier = new VorgangNummerSupplier(); + + @Nested + @DisplayName("Get Vorgang Nummer") + class TestGetVorgangNummer { + + @Test + void shouldCallAddPrefix() { + vorgangNummerSupplier.get(); + + verify(vorgangNummerSupplier).initWithPrefix(); + } + + @Test + @DisplayName("should add random suffix of length 6") + void shouldAddSuffix() { + doReturn(new StringBuilder()).when(vorgangNummerSupplier).initWithPrefix(); + + var result = vorgangNummerSupplier.get(); + + assertThat(result).hasSize(6); + } + } + + @Nested + class TestAddPrefix{ + + @Test + void shouldHaveSize(){ + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder).hasSize(6); + } + @Test + void shouldAddLastYearNumberFirst(){ + var lastYearNumber = "" + LocalDate.now().getYear() % 10; + + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.substring(0,1)).isEqualTo(lastYearNumber); + } + + @Test + void shouldAddMonthValueSecond(){ + var monthValue = "%02d".formatted(LocalDate.now().getMonthValue()); + + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.substring(1, 3)).isEqualTo(monthValue); + } + + @Test + void shouldAddDayValueThird(){ + var dayValue = "%02d".formatted(LocalDate.now().getDayOfMonth()); + + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.substring(3, 5)).isEqualTo(dayValue); + } + + @Test + void shouldAddHyphenAtEnd(){ + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.charAt(5)).isEqualTo('-'); + } + } + +} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-interface/pom.xml b/formcycle-adapter/formcycle-adapter-interface/pom.xml index 36ade3e01d8e457467ed1fc68958f57cd540d749..b321e925d70826fdf74b323818b84fd7a19302f5 100644 --- a/formcycle-adapter/formcycle-adapter-interface/pom.xml +++ b/formcycle-adapter/formcycle-adapter-interface/pom.xml @@ -29,14 +29,14 @@ <parent> <groupId>de.itvsh.kop.common</groupId> <artifactId>kop-common-dependencies</artifactId> - <version>2.0.0</version> + <version>2.0.1</version> <relativePath /> </parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>formcycle-adapter-interface</artifactId> <name>EM - Formcycle Adapter - Interface</name> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <properties> <pluto.version>1.8.0</pluto.version> diff --git a/formcycle-adapter/pom.xml b/formcycle-adapter/pom.xml index 20c2643269b99ffa21a29282f5a44b43cfea399b..ceb0c3d5e13c4e56e245ec00d2fce15c86024da7 100644 --- a/formcycle-adapter/pom.xml +++ b/formcycle-adapter/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>formcycle-adapter</artifactId> diff --git a/formsolutions-adapter/pom.xml b/formsolutions-adapter/pom.xml index 0894bf1973998a6f31cf849e59d4cb829a3e91ef..11a4d73879284fda10d3fcbae76926877d265e91 100644 --- a/formsolutions-adapter/pom.xml +++ b/formsolutions-adapter/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java index 4781b63438dd76f538f64ae9eb58cde6d1357ffa..91c647211d5e3d4c390cabf8bf0ee6426e8816bd 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java @@ -29,14 +29,17 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.UUID; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup; @Component class FormSolutionsAttachmentsMapper { + public static final String ZIP = "zip"; public static final String FILE_NAME_ZIP_ATTACHMENT = "attachments.zip"; public static final String ZIP_CONTENT_TYPE = "application/zip"; @@ -47,15 +50,32 @@ class FormSolutionsAttachmentsMapper { } List<IncomingFileGroup> mapZipRepresentation(Optional<String> encodedZip) { - var fileGroups = new ArrayList<IncomingFileGroup>(); - encodedZip.filter(StringUtils::isNoneEmpty).ifPresent(content -> { - var files = List.of(mapFile(decodeFile(content), ZIP_CONTENT_TYPE, FILE_NAME_ZIP_ATTACHMENT)); - fileGroups.add(IncomingFileGroup.builder() - .name(FILE_GROUP_ZIP_NAME) - .files(files) - .build()); - }); - - return fileGroups; + return encodedZip.filter(StringUtils::isNoneEmpty) + .map(this::buildZipFile) + .map(this::buildFileGroup) + .map(this::buildMutableList) + .orElseGet(ArrayList::new); + } + + private IncomingFileGroup buildFileGroup(IncomingFile zipFile) { + return IncomingFileGroup.builder() + .name(FILE_GROUP_ZIP_NAME) + .files(List.of(zipFile)) + .build(); + } + + private IncomingFile buildZipFile(String content) { + return IncomingFile.builder() + .id(UUID.randomUUID().toString()) + .contentStream(decodeFile(content)) + .contentType(ZIP_CONTENT_TYPE) + .name(FILE_NAME_ZIP_ATTACHMENT) + .build(); + } + + private List<IncomingFileGroup> buildMutableList(IncomingFileGroup fileGroup) { + var list = new ArrayList<IncomingFileGroup>(); + list.add(fileGroup); + return list; } } \ No newline at end of file diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java index 7f7edd6d5c074cbd682a7088b2c6ca0bfe8af670..bb1a00cc86aaf1daf2e710a51a22e8d92377efc4 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java @@ -26,22 +26,12 @@ package de.itvsh.kop.eingangsadapter.formsolutions; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Base64; -import java.util.UUID; -import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; import lombok.AccessLevel; import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) class FormSolutionsFileMapperUtils { - static IncomingFile mapFile(InputStream data, String contentType, String fileName) { - return IncomingFile.builder() - .contentStream(data) - .contentType(contentType) - .name(fileName) - .id(UUID.randomUUID().toString()) - .build(); - } static InputStream decodeFile(String base64FileContent) { // TODO ins Dateisystem schreiben, anstatt in Memory halten diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java index b6ad13f7cd390340bdb6d6d05fdebd105fb191da..586ecf147f7fb5a139c8a481790a346c75e2456d 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java @@ -23,22 +23,28 @@ */ package de.itvsh.kop.eingangsadapter.formsolutions; -import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFileMapperUtils.*; - import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.UUID; import org.apache.commons.lang3.StringUtils; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; +import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; @Component class FormSolutionsRepresentationsMapper { + public static final String PDF = "pdf"; public static final String FILE_NAME_PDF_REP = "eingang.pdf"; public static final String PDF_CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE; @@ -47,21 +53,76 @@ class FormSolutionsRepresentationsMapper { public static final String FILE_NAME_JSON_REP = "form-data.json"; public static final String JSON_CONTENT_TYPE = MediaType.APPLICATION_JSON_VALUE; + public static final String TMP_FILE_PREFIX = "filecached-inputstream-fs"; + public static final String TMP_FILE_SUFFIX = ".ozg-cloud.tmp"; + List<IncomingFile> mapRepresentations(Map<String, Object> plainMap, Optional<String> json) { List<IncomingFile> representations = new ArrayList<>(); - Optional.ofNullable((String) plainMap.get(PDF)).filter(StringUtils::isNoneEmpty).ifPresent(data -> representations.add(mapPdfFile(data))); + Optional.ofNullable((String) plainMap.get(PDF)).filter(StringUtils::isNoneEmpty).ifPresent(data -> representations.add(buildPdfFile(data))); - json.ifPresent(jsonData -> representations.add(mapJsonFile(jsonData))); + json.ifPresent(jsonData -> representations.add(buildJsonFile(jsonData))); return representations; } - private IncomingFile mapJsonFile(String jsonData) { - return mapFile(new ByteArrayInputStream(jsonData.getBytes()), JSON_CONTENT_TYPE, FILE_NAME_JSON_REP); + private IncomingFile buildJsonFile(String jsonData) { + var size = getSize(new ByteArrayInputStream(jsonData.getBytes())); + return IncomingFile.builder() + .id(UUID.randomUUID().toString()) + .contentStream(new ByteArrayInputStream(jsonData.getBytes())) + .contentType(JSON_CONTENT_TYPE) + .name(FILE_NAME_JSON_REP) + .size(size) + .build(); + } + + private IncomingFile buildPdfFile(String data) { + var size = getSize(FormSolutionsFileMapperUtils.decodeFile(data)); + return IncomingFile.builder() + .id(UUID.randomUUID().toString()) + .contentStream(FormSolutionsFileMapperUtils.decodeFile(data)) + .contentType(PDF_CONTENT_TYPE) + .name(FILE_NAME_PDF_REP) + .size(size) + .build(); + } + + long getSize(InputStream contentStream) { + var path = writeFile(contentStream); + var size = getFileSize(path); + deleteTmpFile(path); + + return size; + } + + Path writeFile(InputStream contentStream) { + Path tmpFile; + try { + tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX); + tmpFile.toFile().deleteOnExit(); + + Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING); + contentStream.close(); + return tmpFile; + } catch (IOException e) { + throw new TechnicalException("Error writing file to temp file.", e); + } + } + + long getFileSize(Path path) { + try { + return Files.size(path); + } catch (IOException e) { + throw new TechnicalException("Error calculate size of tmp file.", e); + } } - private IncomingFile mapPdfFile(String data) { - return mapFile(decodeFile(data), PDF_CONTENT_TYPE, FILE_NAME_PDF_REP); + void deleteTmpFile(Path path) { + try { + Files.deleteIfExists(path); + } catch (IOException e) { + throw new TechnicalException("Error delete tmp file.", e); + } } } \ No newline at end of file diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtilsTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtilsTest.java index 79db1ffd693cb73b920fb503813c5a31cf709775..a39dce7d3975d56de319c9d0d76d7810fe1d269b 100644 --- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtilsTest.java +++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtilsTest.java @@ -27,38 +27,19 @@ import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFileMapper import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFilesTestFactory.*; import static org.assertj.core.api.Assertions.*; -import java.io.ByteArrayInputStream; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import de.itvsh.kop.common.test.TestUtils; -import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; import lombok.SneakyThrows; class FormSolutionsFileMapperUtilsTest { - @DisplayName("Test mapping File data to IncommingFIle") - @Nested - class TestFileMapping { - private static final String NAME = "test.txt"; - private static final String APPLICATION_TYPE = "application/text"; - private static final byte[] CONTENT_BYTES = "test".getBytes(); - - @Test - @SneakyThrows - void shouldMapFileData() { - IncomingFile file = FormSolutionsFileMapperUtils.mapFile(new ByteArrayInputStream(CONTENT_BYTES), APPLICATION_TYPE, NAME); - - assertThat(TestUtils.contentStreamToByteArray(file.getContentStream())).isEqualTo(CONTENT_BYTES); - assertThat(file.getContentType()).isEqualTo(APPLICATION_TYPE); - assertThat(file.getName()).isEqualTo(NAME); - } - } @DisplayName("Test decoding base64 encoded file") @Nested class TestDecodingBase64Content { + @Test @SneakyThrows void shouldDecodeFile() { @@ -67,4 +48,4 @@ class FormSolutionsFileMapperUtilsTest { assertThat(TestUtils.contentStreamToByteArray(decodedFileContentStream)).isEqualTo(ZIP_DECODED); } } -} +} \ No newline at end of file diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java index 69d3587df67f2090d3b55edc09469fcbf6447c22..6631cc4bc955a8db6ba6fe369149e6cb4903f276 100644 --- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java +++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java @@ -27,80 +27,116 @@ import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFact import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFilesTestFactory.*; import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsRepresentationsMapper.*; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Spy; +import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.common.test.TestUtils; import de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; +import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory; import lombok.SneakyThrows; class FormSolutionsRepresentationsMapperTest { + + @Spy private FormSolutionsRepresentationsMapper mapper = new FormSolutionsRepresentationsMapper(); + @DisplayName("Map representations") @Nested - class TestRepresentationsMapping { + class TestMapRepresentations { + + @DisplayName("pdf") @Nested class TestPdfRepresentations { + @Test @SneakyThrows - void shouldParsePdf() { - var map = mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(JSON_CONTENT)); + void shouldSetContentStrean() { + var representation = mapRepresentationPdf(); - assertThat(TestUtils.contentStreamToByteArray(getRepresentation(map, 0).getContentStream())).isEqualTo(PDF_DECODED); + assertThat(TestUtils.contentStreamToByteArray(representation.getContentStream())).isEqualTo(PDF_DECODED); } @Test - void shouldSetPdfContentType() { - var map = mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(JSON_CONTENT)); + void shouldSetHaveContentType() { + var representation = mapRepresentationPdf(); - assertThat(getRepresentation(map, 0).getContentType()).isEqualTo(PDF_CONTENT_TYPE); + assertThat(representation.getContentType()).isEqualTo(PDF_CONTENT_TYPE); } @Test - void shouldSetPdfFileName() { - var map = mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(JSON_CONTENT)); + void shouldSetName() { + var representation = mapRepresentationPdf(); + + assertThat(representation.getName()).isEqualTo(FILE_NAME_PDF_REP); + } + + @Test + void shouldSetSize() { + var representation = mapRepresentationPdf(); + + assertThat(representation.getSize()).isEqualTo(FormSolutionsFilesTestFactory.PDF_DECODED.length); + } - assertThat(getRepresentation(map, 0).getName()).isEqualTo(FILE_NAME_PDF_REP); + private IncomingFile mapRepresentationPdf() { + return mapRepresentation(JSON_CONTENT).get(0); } } + @DisplayName("json") @Nested class TestJsonRepresentation { + @Test + void shouldHaveSize() { + var map = mapRepresentation(SIMPLE_JSON_DATA); + + assertThat(map).hasSize(2); + } + @Test @SneakyThrows - void shouldParseJson() { - var map = mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(SIMPLE_JSON_DATA)); + void shouldSetContentStream() { + var representation = mapRepresentationJson(); - assertThat(TestUtils.contentStreamToByteArray(getRepresentation(map, 1).getContentStream())) + assertThat(TestUtils.contentStreamToByteArray(representation.getContentStream())) .isEqualTo(FormSolutionsTestFactory.SIMPLE_JSON_DATA.getBytes()); } @Test - void shouldSetJsonContentType() { - var map = mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(SIMPLE_JSON_DATA)); + void shouldSetContentType() { + var representation = mapRepresentationJson(); - assertThat(getRepresentation(map, 1).getContentType()).isEqualTo(JSON_CONTENT_TYPE); + assertThat(representation.getContentType()).isEqualTo(JSON_CONTENT_TYPE); } @Test - void shouldSetJsonFileName() { - var map = mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(SIMPLE_JSON_DATA)); + void shouldSetName() { + var representation = mapRepresentationJson(); - assertThat(getRepresentation(map, 1).getName()).isEqualTo(FILE_NAME_JSON_REP); + assertThat(representation.getName()).isEqualTo(FILE_NAME_JSON_REP); } @Test - void shouldParse() { - var map = mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(SIMPLE_JSON_DATA)); + void shouldSetSize() { + var representation = mapRepresentationJson(); - assertThat(map).hasSize(2); + assertThat(representation.getSize()).isEqualTo(SIMPLE_JSON_DATA.getBytes().length); } @Test @@ -111,12 +147,67 @@ class FormSolutionsRepresentationsMapperTest { Optional.of(SIMPLE_JSON_DATA)); assertThat(map).hasSize(1); - assertThat(getRepresentation(map, 0).getContentType()).isEqualTo(JSON_CONTENT_TYPE); + assertThat(map.get(0).getContentType()).isEqualTo(JSON_CONTENT_TYPE); + } + + private IncomingFile mapRepresentationJson() { + return mapRepresentation(SIMPLE_JSON_DATA).get(1); } } + + private List<IncomingFile> mapRepresentation(String content) { + return mapper.mapRepresentations(REPRESENTATIONS.getFormData(), Optional.of(content)); + } + } + + @DisplayName("Get Size") + @Nested + class TestGetSize { + + @Mock + private InputStream stream; + @Mock + private Path path; + + @BeforeEach + void mock() { + doReturn(path).when(mapper).writeFile(any()); + doReturn(IncomingFileTestFactory.SIZE).when(mapper).getFileSize(any()); + doNothing().when(mapper).deleteTmpFile(any()); + } + + @Test + void shouldWriteFile() { + mapper.getSize(stream); + + verify(mapper).writeFile(stream); + } + + @Test + void shouldGetFileSize() { + mapper.getSize(stream); + + verify(mapper).getFileSize(path); + } + + @Test + void shouldDeleteTmpFile() { + mapper.getSize(stream); + + verify(mapper).deleteTmpFile(path); + } } - private IncomingFile getRepresentation(List<IncomingFile> map, int index) { - return map.get(index); + @Nested + class TestWriteFile { + + @Test + @SneakyThrows + void shouldThrowTechnicalException() { + InputStream closedStream = mock(InputStream.class); + when(closedStream.transferTo(any())).thenThrow(IOException.class); + + assertThatThrownBy(() -> mapper.writeFile(closedStream)).isInstanceOf(TechnicalException.class); + } } } diff --git a/forwarder/pom.xml b/forwarder/pom.xml index 8ef2b70a80f7a64ab7374b2245b6a40381d8d629..e631f9c970c1aa365e62189064e01f0a670fa581 100644 --- a/forwarder/pom.xml +++ b/forwarder/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/intelliform-adapter/pom.xml b/intelliform-adapter/pom.xml index d2383ae7f96077917d675c4c7c9657679d5e93d4..426682ce68e8a0ec7ced288b4cb771dec12206cd 100644 --- a/intelliform-adapter/pom.xml +++ b/intelliform-adapter/pom.xml @@ -31,7 +31,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/pom.xml b/pom.xml index 55c9dcc94ab00603b67292f5e83537b69b746e82..16b74790abd0aa2a59d7ebc56e7d959dc6457b69 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Eingangs Adapter - Parent</name> diff --git a/release-erstellen.sh b/release-erstellen.sh index a7105c9df6360bf3e5c8b7b96b7ec28a16e9f77c..dfe2a755312486a606fc94a2187bd1e52c2e3271 100755 --- a/release-erstellen.sh +++ b/release-erstellen.sh @@ -8,7 +8,11 @@ fi ## alle -SNAPSHOT in pom.xmls entfernen -find . -name pom.xml -exec sed -i 's/-SNAPSHOT//g' {} + +SED_PARAMS="-i" +if [[ "$OSTYPE" =~ ^darwin ]]; then + SED_PARAMS="$SED_PARAMS '' -e" +fi +find . -name pom.xml -exec sed $SED_PARAMS 's/-SNAPSHOT//g' {} + ## release version auslesen NEWVERSION=$(xmlstarlet sel -N w="http://maven.apache.org/POM/4.0.0" -t -v '//w:project/w:version' -n pom.xml) diff --git a/router/pom.xml b/router/pom.xml index 56f4c87c8311fdc621af1bc12a5604d67e19a5d0..f4e6162de6de7f34ed630e16309da922dce68225 100644 --- a/router/pom.xml +++ b/router/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/semantik-adapter/pom.xml b/semantik-adapter/pom.xml index 6867cda78180244cd25831eaf31f8060c7d9d5c0..44207744d7f39da4285c4a16d3a4dfa72300a4c6 100644 --- a/semantik-adapter/pom.xml +++ b/semantik-adapter/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>semantik-adapter</artifactId> diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java index c8e1ad324f73bbd083b2802e95a046931f698ae5..bc88c2473afdf5fa77a67224f5e1061a58098e9a 100644 --- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java +++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java @@ -46,10 +46,9 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper { public FormData parseFormData(FormData srcFormData) { var formDataBuilder = FilesMapperHelper.getAttachedFileGroups(srcFormData) .map(this::collectAttachmentContent) - .map(fileGroups -> srcFormData.toBuilder() - .attachments(fileGroups) - .numberOfAttachments(FilesMapperHelper.countAttachedFiles(fileGroups))) + .map(fileGroups -> srcFormData.toBuilder().attachments(fileGroups).numberOfAttachments(FilesMapperHelper.countAttachedFiles(fileGroups))) .orElseGet(srcFormData::toBuilder); + FilesMapperHelper.getRepresentations(srcFormData) .ifPresent(representations -> formDataBuilder.representations(representations).numberOfRepresentations(representations.size())); return FilesMapperHelper.removeProcessedData(formDataBuilder.build()); @@ -61,7 +60,6 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper { .map(file -> ZipAttachmentReader.from(file.getContentStream(), file.getName())) .map(this::mapToIncomingFileGroup) .toList(); - } protected IncomingFileGroup mapToIncomingFileGroup(ZipAttachmentReader zipAttachment) { @@ -71,16 +69,20 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper { zipAttachment.deleteSourceFile(); } catch (RuntimeException e) { LOG.error("Cannot read source ZIP. Attach it as is.", e); - incomingFiles = List.of(IncomingFile.builder() - .name(zipAttachment.getSourceFileName()) - .size(zipAttachment.getSourceFileSize()) - .contentStream(zipAttachment.getSourceZipAsStream()) - .contentType(ZIP_CONTENT_TYPE) - .build()); + incomingFiles = List.of(buildIncomingZipFile(zipAttachment)); } return createIncomingFileGroup(incomingFiles); } + private IncomingFile buildIncomingZipFile(ZipAttachmentReader zipAttachment) { + return IncomingFile.builder() + .name(zipAttachment.getSourceFileName()) + .size(zipAttachment.getSourceFileSize()) + .contentStream(zipAttachment.getSourceZipAsStream()) + .contentType(ZIP_CONTENT_TYPE) + .build(); + } + protected IncomingFileGroup createIncomingFileGroup(Collection<IncomingFile> incomingFiles) { return IncomingFileGroup.builder().name(EXTRAHIERTE_ATTACHMENTS).files(incomingFiles).build(); } diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl index b3a576dd8c199c1070ddf3cfdac16b2c716328f3..10b786e54ef44f05cbf6471db5c915ac1213b893 100644 --- a/src/main/helm/templates/_helpers.tpl +++ b/src/main/helm/templates/_helpers.tpl @@ -69,24 +69,6 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{- end -}} {{- end -}} -{{- define "app.resources" }} -{{- if eq (include "app.kopEnvironment" . ) "prod" }} - limits: - cpu: "500m" - memory: "1000Mi" - requests: - cpu: "50m" - memory: "250Mi" -{{- else }} - limits: - cpu: "500m" - memory: "1000Mi" - requests: - cpu: "50m" - memory: "250Mi" -{{- end }} -{{- end -}} - {{- define "app.ingress.host" }} {{- if eq (.Values.image).name "formsolutions-adapter" }} {{- printf "%s-fs.%s" (include "app.kopBezeichner" .) .Values.baseUrl }} diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index 48bca75d60711118fc724a4885e628c0143e8801..9b5b7c082e139e660858b4605c016abdb31e44bd 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -111,7 +111,9 @@ spec: successThreshold: 1 timeoutSeconds: 5 resources: - {{- include "app.resources" . | indent 8 }} + {{- with .Values.resources }} +{{ toYaml . | indent 10 }} + {{- end }} securityContext: allowPrivilegeEscalation: false privileged: false diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml index 588505e7ed340abef50404ea1ec69a6848fbc8d4..744cc072737cf7858190c1af10d9be704eb7436e 100644 --- a/src/test/helm/deployment_resources_test.yaml +++ b/src/test/helm/deployment_resources_test.yaml @@ -24,42 +24,35 @@ suite: test deployment release: - name: afm_adapter + name: afm-adapter templates: - templates/deployment.yaml tests: - - it: test resources for prod environment - release: - namespace: sh-helm-prod + - it: test resources set: - kop.environment: prod + resources: + limits: + cpu: "11m" + memory: "22Mi" + requests: + cpu: "33m" + memory: "44Mi" asserts: - equal: path: spec.template.spec.containers[0].resources.limits.cpu - value: 500m + value: 11m - equal: path: spec.template.spec.containers[0].resources.limits.memory - value: 1000Mi + value: 22Mi - equal: path: spec.template.spec.containers[0].resources.requests.cpu - value: 50m + value: 33m - equal: path: spec.template.spec.containers[0].resources.requests.memory - value: 250Mi - - it: test default resources - release: - namespace: sh-helm-test + value: 44Mi + + - it: test empty resources asserts: - - equal: - path: spec.template.spec.containers[0].resources.limits.cpu - value: 500m - - equal: - path: spec.template.spec.containers[0].resources.limits.memory - value: 1000Mi - - equal: - path: spec.template.spec.containers[0].resources.requests.cpu - value: 50m - - equal: - path: spec.template.spec.containers[0].resources.requests.memory - value: 250Mi + - isEmpty: + path: spec.template.spec.containers[0].resources diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml index 92a32690e074bea447df9fcbf3858066d51889ff..c0399018687cba257d8a8fc3dcef1c658a542235 100644 --- a/xta-adapter/pom.xml +++ b/xta-adapter/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>xta-adapter</artifactId> <name>Eingangs Adapter - XTA</name> diff --git a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml b/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml index 4cab0e827ff784fb33648f1f161ea64d1644651e..47aa8cd899a803aac2fa5105f738e8260d5c562a 100644 --- a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml +++ b/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml @@ -46,7 +46,7 @@ spec: restartPolicy: Never containers: - name: xta-adapter - image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}" + image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ (.Values.image).tag }}" imagePullPolicy: Always env: - name: spring_profiles_active @@ -94,6 +94,46 @@ spec: mountPath: "/workspace/keystore/xta-keystore.p12" subPath: file readOnly: true + securityContext: + allowPrivilegeEscalation: false + privileged: false + readOnlyRootFilesystem: false + runAsNonRoot: false + resources: + {{- with .Values.resources }} +{{ toYaml . | indent 16 }} + {{- end }} + + {{- if (.Values.dummyProbesEnabled) }} + livenessProbe: + exec: + command: + - echo + - '>' + - /dev/null + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 3 + readinessProbe: + exec: + command: + - echo + - '>' + - /dev/null + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 3 + startupProbe: + exec: + command: + - echo + - '>' + - /dev/null + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 3 + {{- end }} + volumes: - name: bindings configMap: diff --git a/xta-adapter/src/main/helm/test-values.yaml b/xta-adapter/src/main/helm/test-values.yaml index 85c754359e8097fd26883cba7d3659fdf1dfccc2..c16404271ba0d573a4094dd66530d13737a6eee9 100644 --- a/xta-adapter/src/main/helm/test-values.yaml +++ b/xta-adapter/src/main/helm/test-values.yaml @@ -25,4 +25,4 @@ kop: environment: test bezeichner: helm - bundesland: by \ No newline at end of file + bundesland: by diff --git a/xta-adapter/src/main/helm/values.yaml b/xta-adapter/src/main/helm/values.yaml index e81c67a09d248c7658ebc9db4914967e3c6a5421..c889a8f60634cc866653024f6e8f071b7e8e7e94 100644 --- a/xta-adapter/src/main/helm/values.yaml +++ b/xta-adapter/src/main/helm/values.yaml @@ -25,7 +25,7 @@ image: repo: docker.ozg-sh.de name: xta-adapter - tag: latest + tag: 9.9.99 # env: # overrideSpringProfiles: "oc,prod" diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml index 9138881c06f9d7f20f41f9eb5eff70523abedca7..3e0ec759c0446fb34062e1934d8dc7bd775225e9 100644 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml +++ b/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml @@ -74,4 +74,29 @@ tests: asserts: - equal: path: spec.schedule - value: "*/15 * * * *" \ No newline at end of file + value: "*/15 * * * *" + - it: check container image + template: xta_adapter_cronjob.yaml + set: + image.name: xta-adapter + kop.environment: dev + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].image + value: "docker.ozg-sh.de/xta-adapter:9.9.99" + + - it: check securityContext + template: xta_adapter_cronjob.yaml + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation + value: false + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.privileged + value: false + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem + value: false + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.runAsNonRoot + value: false \ No newline at end of file diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_dummy_probes_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_dummy_probes_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e34455f65790222cf1b174fd0f21b92a4a62418e --- /dev/null +++ b/xta-adapter/src/test/helm/xta_adapter_cronjob_dummy_probes_test.yaml @@ -0,0 +1,91 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test xta adapter cronjob +templates: + - templates/xta_adapter_cronjob.yaml +release: + name: xta-adapter + namespace: helm-test +tests: + - it: check dummy livenessProbe default disabled + template: xta_adapter_cronjob.yaml + asserts: + - isEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].livenessProbe + - it: check dummy startupProbe default disabled + template: xta_adapter_cronjob.yaml + asserts: + - isEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].startupProbe + - it: check dummy readynessProbe default disabled + template: xta_adapter_cronjob.yaml + asserts: + - isEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].readinessProbe + + - it: check dummy livenessProbe disabled + template: xta_adapter_cronjob.yaml + set: + dummyProbesEnabled: false + asserts: + - isEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].livenessProbe + - it: check dummy startupProbe disabled + template: xta_adapter_cronjob.yaml + set: + dummyProbesEnabled: false + asserts: + - isEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].startupProbe + - it: check dummy readynessProbe disabled + template: xta_adapter_cronjob.yaml + set: + dummyProbesEnabled: false + asserts: + - isEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].readinessProbe + + + - it: check dummy livenessProbe enabled + template: xta_adapter_cronjob.yaml + set: + dummyProbesEnabled: true + asserts: + - isNotEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].livenessProbe + - it: check dummy startupProbe enabled + template: xta_adapter_cronjob.yaml + set: + dummyProbesEnabled: true + asserts: + - isNotEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].startupProbe + - it: check dummy readynessProbe enabled + template: xta_adapter_cronjob.yaml + set: + dummyProbesEnabled: true + asserts: + - isNotEmpty: + path: spec.jobTemplate.spec.template.spec.containers[0].readinessProbe diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_resources_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_resources_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..198021ea113204629eca21b78cc1b6fa373a28c9 --- /dev/null +++ b/xta-adapter/src/test/helm/xta_adapter_cronjob_resources_test.yaml @@ -0,0 +1,54 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test xta adapter cronjob +templates: + - templates/xta_adapter_cronjob.yaml +release: + name: xta-adapter + namespace: helm-test +tests: + - it: check resources + template: xta_adapter_cronjob.yaml + set: + resources: + limits: + cpu: "11m" + memory: "22Mi" + requests: + cpu: "33m" + memory: "44Mi" + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].resources.limits.cpu + value: "11m" + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].resources.limits.memory + value: "22Mi" + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].resources.requests.cpu + value: "33m" + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].resources.requests.memory + value: "44Mi"