mirror of
https://github.com/Alfresco/alfresco-transform-core.git
synced 2025-05-26 17:24:47 +00:00
Merge pull request #892 from Alfresco/acs-6151-create-ats-liveness-readiness-probes-tests
ACS-6151 - Create ATS liveness/readiness probes tests
This commit is contained in:
commit
c269404390
@ -132,6 +132,11 @@
|
|||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Transform Core
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2023 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* -
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
* -
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* -
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
* -
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.alfresco.transform.aio;
|
||||||
|
|
||||||
|
import org.alfresco.transform.base.LivenessReadinessProbeTest;
|
||||||
|
|
||||||
|
public class AIOLivenessReadinessProbeIT extends LivenessReadinessProbeTest {
|
||||||
|
@Override
|
||||||
|
protected LivenessReadinessProbeTest.ImagesForTests getImageForTest() {
|
||||||
|
return new ImagesForTests("alfresco-transform-core-aio", "text/plain", "text/plain", "original.txt");
|
||||||
|
}
|
||||||
|
}
|
@ -97,6 +97,11 @@
|
|||||||
<version>4.2.0</version>
|
<version>4.2.0</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,122 @@
|
|||||||
|
package org.alfresco.transform.base;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
|
||||||
|
import org.springframework.http.client.MultipartBodyBuilder;
|
||||||
|
import org.springframework.test.web.reactive.server.WebTestClient;
|
||||||
|
import org.testcontainers.containers.GenericContainer;
|
||||||
|
import org.testcontainers.containers.wait.strategy.Wait;
|
||||||
|
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import static org.springframework.http.HttpStatus.OK;
|
||||||
|
import static org.springframework.http.HttpStatus.TOO_MANY_REQUESTS;
|
||||||
|
|
||||||
|
import org.springframework.web.reactive.function.client.WebClient;
|
||||||
|
|
||||||
|
public abstract class LivenessReadinessProbeTest
|
||||||
|
{
|
||||||
|
protected final Integer MAX_TRANSFORMS = 10;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void readinessShouldReturnAn429ErrorAfterReachingMaxTransforms() throws URISyntaxException
|
||||||
|
{
|
||||||
|
final ImagesForTests testData = getImageForTest();
|
||||||
|
|
||||||
|
try (final var env = createEnv(testData.image))
|
||||||
|
{
|
||||||
|
env.start();
|
||||||
|
var url = "http://localhost:" + env.getFirstMappedPort();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Asserts that /ready probe hasn't died before sending a transformation request.
|
||||||
|
Each /ready request creates a valid transformation and increases the counter of
|
||||||
|
used transformations, hence the need to divide MAX_TRANSFORMS
|
||||||
|
*/
|
||||||
|
for (int i = 0; i<MAX_TRANSFORMS/2; i++) {
|
||||||
|
assertProbeIsOk(url);
|
||||||
|
sendTransformRequest(url, testData.sourceMimetype, testData.targetMimetype, testData.filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
assertProbeDied(url);
|
||||||
|
|
||||||
|
final String logs = env.getLogs();
|
||||||
|
System.out.println(logs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract ImagesForTests getImageForTest();
|
||||||
|
|
||||||
|
private GenericContainer<?> createEnv(String image) throws URISyntaxException
|
||||||
|
{
|
||||||
|
System.out.println(image);
|
||||||
|
final GenericContainer<?> transformCore = new GenericContainer<>("alfresco/"+image+":latest");
|
||||||
|
|
||||||
|
return transformCore.withEnv("livenessTransformEnabled", "true")
|
||||||
|
.withEnv("maxTransforms", MAX_TRANSFORMS.toString())
|
||||||
|
.withNetworkAliases(image)
|
||||||
|
.withExposedPorts(8090)
|
||||||
|
.waitingFor(Wait.forListeningPort());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static class ImagesForTests
|
||||||
|
{
|
||||||
|
private final String image;
|
||||||
|
private final String sourceMimetype;
|
||||||
|
private final String targetMimetype;
|
||||||
|
private final String filename;
|
||||||
|
|
||||||
|
public ImagesForTests(String image, String sourceMimetype, String targetMimetype, String filename)
|
||||||
|
{
|
||||||
|
this.image = Objects.requireNonNull(image);
|
||||||
|
this.sourceMimetype = Objects.requireNonNull(sourceMimetype);
|
||||||
|
this.targetMimetype = Objects.requireNonNull(targetMimetype);
|
||||||
|
this.filename = Objects.requireNonNull(filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendTransformRequest(String url, String sourceMimetype, String targetMimetype, String filename)
|
||||||
|
{
|
||||||
|
var builder = createRequestBuilder(sourceMimetype, targetMimetype, filename);
|
||||||
|
WebClient client = WebClient.create();
|
||||||
|
WebClient.ResponseSpec responseSpec = client.post()
|
||||||
|
.uri(url + "/test")
|
||||||
|
.bodyValue(builder.build())
|
||||||
|
.retrieve();
|
||||||
|
|
||||||
|
System.out.println(responseSpec.toBodilessEntity().block());
|
||||||
|
assertEquals(OK, responseSpec.toBodilessEntity().block().getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
private MultipartBodyBuilder createRequestBuilder(String sourceMimetype, String targetMimetype, String filename)
|
||||||
|
{
|
||||||
|
MultipartBodyBuilder builder = new MultipartBodyBuilder();
|
||||||
|
builder.part("_sourceMimetype", sourceMimetype);
|
||||||
|
builder.part("_targetMimetype", targetMimetype);
|
||||||
|
builder.part("file", new ClassPathResource(filename));
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertProbeDied(String url)
|
||||||
|
{
|
||||||
|
WebTestClient client = WebTestClient.bindToServer().baseUrl(url+"/ready").build();
|
||||||
|
client.get()
|
||||||
|
.exchange()
|
||||||
|
.expectStatus().isEqualTo(TOO_MANY_REQUESTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertProbeIsOk(String url)
|
||||||
|
{
|
||||||
|
WebTestClient client = WebTestClient.bindToServer().baseUrl(url+"/ready").build();
|
||||||
|
client.get()
|
||||||
|
.exchange()
|
||||||
|
.expectStatus().isEqualTo(OK);
|
||||||
|
}
|
||||||
|
}
|
@ -53,6 +53,11 @@
|
|||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Transform Core
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2023 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* -
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
* -
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* -
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
* -
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.alfresco.transform.imagemagick;
|
||||||
|
|
||||||
|
import org.alfresco.transform.base.LivenessReadinessProbeTest;
|
||||||
|
|
||||||
|
public class ImageMagickLivenessReadinessProbeIT extends LivenessReadinessProbeTest {
|
||||||
|
@Override
|
||||||
|
protected ImagesForTests getImageForTest() {
|
||||||
|
return new ImagesForTests("alfresco-imagemagick", "image/jpeg", "image/png", "quick.jpg");
|
||||||
|
}
|
||||||
|
}
|
@ -57,6 +57,11 @@
|
|||||||
<groupId>org.apache.pdfbox</groupId>
|
<groupId>org.apache.pdfbox</groupId>
|
||||||
<artifactId>pdfbox</artifactId>
|
<artifactId>pdfbox</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Transform Core
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2023 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* -
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
* -
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* -
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
* -
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.alfresco.transform.libreoffice;
|
||||||
|
|
||||||
|
import org.alfresco.transform.base.LivenessReadinessProbeTest;
|
||||||
|
|
||||||
|
public class LibreOfficeLivenessReadinessProbeIT extends LivenessReadinessProbeTest {
|
||||||
|
@Override
|
||||||
|
protected ImagesForTests getImageForTest() {
|
||||||
|
return new ImagesForTests("alfresco-libreoffice", "text/plain", "application/pdf", "original.txt");
|
||||||
|
}
|
||||||
|
}
|
@ -101,6 +101,11 @@
|
|||||||
<groupId>org.dom4j</groupId>
|
<groupId>org.dom4j</groupId>
|
||||||
<artifactId>dom4j</artifactId>
|
<artifactId>dom4j</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Transform Core
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2023 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* -
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
* -
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* -
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
* -
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.alfresco.transform.misc;
|
||||||
|
|
||||||
|
import org.alfresco.transform.base.LivenessReadinessProbeTest;
|
||||||
|
|
||||||
|
public class MiscLivenessReadinessProbeIT extends LivenessReadinessProbeTest {
|
||||||
|
@Override
|
||||||
|
protected ImagesForTests getImageForTest() {
|
||||||
|
return new ImagesForTests("alfresco-transform-misc", "text/plain", "text/plain", "original.txt");
|
||||||
|
}
|
||||||
|
}
|
@ -49,6 +49,11 @@
|
|||||||
<groupId>org.dom4j</groupId>
|
<groupId>org.dom4j</groupId>
|
||||||
<artifactId>dom4j</artifactId>
|
<artifactId>dom4j</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Transform Core
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2023 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* -
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
* -
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* -
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
* -
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.alfresco.transform.pdfrenderer;
|
||||||
|
|
||||||
|
import org.alfresco.transform.base.LivenessReadinessProbeTest;
|
||||||
|
|
||||||
|
public class PdfRendererLivenessReadinessProbeIT extends LivenessReadinessProbeTest {
|
||||||
|
@Override
|
||||||
|
protected ImagesForTests getImageForTest() {
|
||||||
|
return new ImagesForTests("alfresco-pdf-renderer", "application/pdf", "image/png", "quick.pdf");
|
||||||
|
}
|
||||||
|
}
|
@ -145,6 +145,11 @@
|
|||||||
<artifactId>mockito-junit-jupiter</artifactId>
|
<artifactId>mockito-junit-jupiter</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Transform Core
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2023 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* -
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
* -
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* -
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
* -
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.alfresco.transform.tika;
|
||||||
|
|
||||||
|
import org.alfresco.transform.base.LivenessReadinessProbeTest;
|
||||||
|
|
||||||
|
|
||||||
|
public class TikaLivenessReadinessProbeIT extends LivenessReadinessProbeTest {
|
||||||
|
@Override
|
||||||
|
protected ImagesForTests getImageForTest() {
|
||||||
|
return new ImagesForTests("alfresco-tika", "text/plain", "text/plain", "original.txt");
|
||||||
|
}
|
||||||
|
}
|
7
pom.xml
7
pom.xml
@ -184,7 +184,11 @@
|
|||||||
<artifactId>snakeyaml</artifactId>
|
<artifactId>snakeyaml</artifactId>
|
||||||
<version>${dependency.snakeyaml.version}</version>
|
<version>${dependency.snakeyaml.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers</artifactId>
|
||||||
|
<version>1.19.1</version>
|
||||||
|
</dependency>
|
||||||
<!-- PRODSEC-7375 / CVE-2023-46604-->
|
<!-- PRODSEC-7375 / CVE-2023-46604-->
|
||||||
<!-- Both dependencies can be removed once spring-boot-starter-activemq has secure versions of those dependencies-->
|
<!-- Both dependencies can be removed once spring-boot-starter-activemq has secure versions of those dependencies-->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -197,7 +201,6 @@
|
|||||||
<artifactId>activemq-client-jakarta</artifactId>
|
<artifactId>activemq-client-jakarta</artifactId>
|
||||||
<version>5.18.3</version>
|
<version>5.18.3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user