From cbc3da1f8c19847297e2ad88ba4f70210605b59e Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Wed, 19 May 2021 15:14:08 +0200 Subject: [PATCH] Increment code coverage for Application Issue-ID: OAM-209 Signed-off-by: Claudio D. Gasparini Change-Id: I8b40f00b022613517c4bb17bcc345f714c47fa08 --- solution/docker-compose.yaml | 4 +- ves-nf-oam-adopter/ves-nf-oam-adopter-app/pom.xml | 14 +- .../adopter/app/config/LoginAttemptsLogger.java | 4 + .../adopter/app/config/SecurityConfiguration.java | 9 +- .../adopter/app/controller/AdapterController.java | 1 - .../nf/oam/adopter/app/http/HttpCientFactory.java | 32 +--- .../app/{ => properties}/ServerProperties.java | 2 +- .../app/{ => properties}/SslProperties.java | 2 +- .../nf/oam/adopter/app/AdapterApplicationTest.java | 164 +++++++++++++++++++++ .../src/test/resources/application.yml | 33 +++++ .../configuration/application.yml | 4 +- ves-nf-oam-adopter/ves-nf-oam-adopter-mock/pom.xml | 1 - .../ves-nf-oam-adopter-parent/pom.xml | 5 + 13 files changed, 229 insertions(+), 46 deletions(-) rename ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/{ => properties}/ServerProperties.java (96%) rename ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/{ => properties}/SslProperties.java (95%) create mode 100644 ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/java/org/o/ran/oam/nf/oam/adopter/app/AdapterApplicationTest.java create mode 100644 ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/resources/application.yml diff --git a/solution/docker-compose.yaml b/solution/docker-compose.yaml index 9acf3e4..1490d22 100644 --- a/solution/docker-compose.yaml +++ b/solution/docker-compose.yaml @@ -16,7 +16,7 @@ services: - "443:443/tcp" network_mode: host restart: unless-stopped - image: nexus3.o-ran-sc.org:10003/o-ran-sc/ves-nf-oam-adopter-ran-mock:latest + image: nexus3.o-ran-sc.org:10004/o-ran-sc/ves-nf-oam-adopter-ran-mock:latest container_name: ves-nf-oam-adopter-ran-mock environment: KEY_PASSWORD: nf-oam-adopter @@ -29,7 +29,7 @@ services: - "443:444/tcp" network_mode: host restart: unless-stopped - image: nexus3.o-ran-sc.org:10003/o-ran-sc/ves-nf-oam-adopter:latest + image: nexus3.o-ran-sc.org:10004/o-ran-sc/ves-nf-oam-adopter:latest container_name: ves-nf-oam-adopter environment: SERVER_PORT: 444 diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/pom.xml b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/pom.xml index 25738b6..c92c564 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/pom.xml +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/pom.xml @@ -34,9 +34,6 @@ ves-nf-oam-adopter-app - 0.18 - - 3.0.25 ves-nf-oam-adopter @@ -90,6 +87,16 @@ io.swagger.core.v3 swagger-annotations + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + @@ -102,7 +109,6 @@ io.swagger.codegen.v3 swagger-codegen-maven-plugin - ${swagger-codegen-maven-plugin.version} diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/LoginAttemptsLogger.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/LoginAttemptsLogger.java index e1222f5..072fbb9 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/LoginAttemptsLogger.java +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/LoginAttemptsLogger.java @@ -40,6 +40,10 @@ public class LoginAttemptsLogger { public void auditEventHappened(final AuditApplicationEvent auditApplicationEvent) { final AuditEvent auditEvent = auditApplicationEvent.getAuditEvent(); final WebAuthenticationDetails details = (WebAuthenticationDetails) auditEvent.getData().get("details"); + if (details == null) { + LOG.info("AUDIT: User: {} Event Type: {}", auditEvent.getPrincipal(), auditEvent.getType()); + return; + } LOG.info("AUDIT: User: {} Event Type: {} Remote IP address: {}", auditEvent.getPrincipal(), auditEvent.getType(), details.getRemoteAddress()); } diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/SecurityConfiguration.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/SecurityConfiguration.java index 18101a4..2fc030f 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/SecurityConfiguration.java +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/config/SecurityConfiguration.java @@ -19,8 +19,8 @@ package org.o.ran.oam.nf.oam.adopter.app.config; -import org.o.ran.oam.nf.oam.adopter.app.ServerProperties; -import org.o.ran.oam.nf.oam.adopter.app.SslProperties; +import org.o.ran.oam.nf.oam.adopter.app.properties.ServerProperties; +import org.o.ran.oam.nf.oam.adopter.app.properties.SslProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -47,7 +47,10 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { if (ssl != null && ssl.getEnabled() != null && ssl.getEnabled()) { http.requiresChannel().anyRequest().requiresSecure(); } - http.csrf().disable().antMatcher("/adapters/**").authorizeRequests().anyRequest().hasRole(ADMIN_ROLE).and() + http.csrf().disable() + .antMatcher("/adapters/**") + .authorizeRequests().anyRequest() + .hasRole(ADMIN_ROLE).and() .httpBasic(); } diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/controller/AdapterController.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/controller/AdapterController.java index 1960af7..a6fb63d 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/controller/AdapterController.java +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/controller/AdapterController.java @@ -57,7 +57,6 @@ public class AdapterController implements ControllerApi { } @Override - @SneakyThrows public ResponseEntity> getAllAdapters() { LOG.info("Request triggered: getAllAdapters"); return ResponseEntity.ok(deployer.getAll()); diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/http/HttpCientFactory.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/http/HttpCientFactory.java index 073a622..7184c28 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/http/HttpCientFactory.java +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/http/HttpCientFactory.java @@ -19,7 +19,6 @@ package org.o.ran.oam.nf.oam.adopter.app.http; -import com.google.common.base.Strings; import java.io.File; import java.io.IOException; import java.security.KeyManagementException; @@ -37,10 +36,8 @@ import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager; import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder; import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder; import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; -import org.apache.hc.client5.http.ssl.TrustAllStrategy; import org.apache.hc.core5.http2.HttpVersionPolicy; import org.apache.hc.core5.ssl.SSLContextBuilder; -import org.apache.hc.core5.ssl.SSLContexts; import org.apache.hc.core5.util.Timeout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,15 +53,7 @@ public final class HttpCientFactory { final String trustStorePassword, final Long conectionTimeout, final Long responseTimeout) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException, CertificateException { - if (Strings.isNullOrEmpty(trustStore) || Strings.isNullOrEmpty(trustStorePassword)) { - return trustAllCertificate(conectionTimeout, responseTimeout); - } - final File trustStoreFilePath = new File(trustStore); - if (!trustStoreFilePath.exists() || trustStoreFilePath.isDirectory()) { - return trustAllCertificate(conectionTimeout, responseTimeout); - } - - final SSLContext sslContext = getSslContext(trustStoreFilePath, trustStorePassword); + final SSLContext sslContext = getSslContext(new File(trustStore), trustStorePassword); return trustTrustStore(sslContext, conectionTimeout, responseTimeout); } @@ -101,23 +90,4 @@ public final class HttpCientFactory { .setCookieSpec(StandardCookieSpec.STRICT) .build(); } - - private static CloseableHttpAsyncClient trustAllCertificate(final Long conectionTimeout, final Long responseTimeout) - throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { - LOG.info("Trust all SSL certificates"); - final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(new TrustAllStrategy()).build(); - final PoolingAsyncClientConnectionManager connectionManager = - PoolingAsyncClientConnectionManagerBuilder.create() - .setTlsStrategy(ClientTlsStrategyBuilder.create() - .setSslContext(sslContext) - .setHostnameVerifier(NoopHostnameVerifier.INSTANCE) - .build()) - .build(); - - return HttpAsyncClients.custom() - .setConnectionManager(connectionManager) - .setDefaultRequestConfig(createDefaultRequestConfig(conectionTimeout, responseTimeout)) - .setVersionPolicy(HttpVersionPolicy.NEGOTIATE) - .build(); - } } diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/ServerProperties.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/properties/ServerProperties.java similarity index 96% rename from ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/ServerProperties.java rename to ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/properties/ServerProperties.java index 0c77e44..1096cfb 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/ServerProperties.java +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/properties/ServerProperties.java @@ -17,7 +17,7 @@ * ============LICENSE_END========================================================= */ -package org.o.ran.oam.nf.oam.adopter.app; +package org.o.ran.oam.nf.oam.adopter.app.properties; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/SslProperties.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/properties/SslProperties.java similarity index 95% rename from ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/SslProperties.java rename to ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/properties/SslProperties.java index fd4e066..6e34bc9 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/SslProperties.java +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/main/java/org/o/ran/oam/nf/oam/adopter/app/properties/SslProperties.java @@ -17,7 +17,7 @@ * ============LICENSE_END========================================================= */ -package org.o.ran.oam.nf.oam.adopter.app; +package org.o.ran.oam.nf.oam.adopter.app.properties; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/java/org/o/ran/oam/nf/oam/adopter/app/AdapterApplicationTest.java b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/java/org/o/ran/oam/nf/oam/adopter/app/AdapterApplicationTest.java new file mode 100644 index 0000000..3b9cdf3 --- /dev/null +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/java/org/o/ran/oam/nf/oam/adopter/app/AdapterApplicationTest.java @@ -0,0 +1,164 @@ +/* + * ============LICENSE_START======================================================= + * O-RAN-SC + * ================================================================================ + * Copyright © 2021 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.o.ran.oam.nf.oam.adopter.app; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.google.gson.Gson; +import java.time.ZoneId; +import java.util.Collections; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.o.ran.oam.nf.oam.adopter.app.controller.TimeZoneServiceProvider; +import org.o.ran.oam.nf.oam.adopter.model.Adapter; +import org.o.ran.oam.nf.oam.adopter.model.AdapterMechId; +import org.o.ran.oam.nf.oam.adopter.pm.rest.manager.PerformanceManagementMapperConfigProvider; +import org.o.ran.oam.nf.oam.adopter.pm.rest.manager.api.PerformanceManagementAdaptersDeployer; +import org.o.ran.oam.nf.oam.adopter.pm.rest.manager.exceptions.AlreadyPresentException; +import org.o.ran.oam.nf.oam.adopter.pm.rest.manager.exceptions.NotFoundException; +import org.o.ran.oam.nf.oam.adopter.snmp.manager.SnmpMappingConfigurationProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +class AdapterApplicationTest { + + private static final Gson GSON = new Gson(); + + @Autowired + private MockMvc mockMvc; + @Autowired + private TimeZoneServiceProvider timeZoneServiceProvider; + @MockBean + private PerformanceManagementAdaptersDeployer deployer; + @MockBean + private SnmpMappingConfigurationProvider snmpProvider; + @MockBean + private PerformanceManagementMapperConfigProvider pmProvider; + @Autowired + private WebApplicationContext context; + + + @BeforeEach + public void applySecurity() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + public void testGetAllAdapters() throws Exception { + when(deployer.getAll()).thenReturn(Collections.singletonList("mockResult")); + + mockMvc.perform(get("/adapters/").secure(true).contentType(MediaType.APPLICATION_JSON)).andDo(print()) + .andExpect(status().isOk()).andExpect(content().string(containsString("mockResult"))); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + public void testDeleteAdapter() throws Exception { + mockMvc.perform(delete("/adapters/adapter/172.10.55.3").secure(true).contentType(MediaType.APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + public void testNotFound() throws Exception { + doThrow(NotFoundException.class).when(deployer).delete(anyString()); + + mockMvc.perform(delete("/adapters/adapter/172.10.55.3").secure(true).contentType(MediaType.APPLICATION_JSON)) + .andDo(print()).andExpect(status().isNotFound()); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + public void testAddAdapter() throws Exception { + + final Adapter adapter = new Adapter(); + adapter.setHost("172.10.55.3"); + + final AdapterMechId mechId = new AdapterMechId(); + mechId.username("admin"); + mechId.password("somePass"); + adapter.setMechId(mechId); + + mockMvc.perform(post("/adapters/adapter").secure(true).contentType(MediaType.APPLICATION_JSON) + .content(GSON.toJson(adapter))).andDo(print()).andExpect(status().isOk()); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + public void testAlreadyExist() throws Exception { + + final Adapter adapter = new Adapter(); + adapter.setHost("172.10.55.3"); + + final AdapterMechId mechId = new AdapterMechId(); + mechId.username("admin"); + mechId.password("somePass"); + adapter.setMechId(mechId); + + doThrow(AlreadyPresentException.class).when(deployer).create(anyString(), anyString(), anyString()); + + mockMvc.perform(post("/adapters/adapter").secure(true).contentType(MediaType.APPLICATION_JSON) + .content(GSON.toJson(adapter))).andDo(print()).andExpect(status().isBadRequest()); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + public void testMissingArguments() throws Exception { + + final Adapter adapter = new Adapter(); + adapter.setHost("172.10.55.3"); + + final AdapterMechId mechId = new AdapterMechId(); + mechId.username("admin"); + adapter.setMechId(mechId); + + + mockMvc.perform(post("/adapters/adapter").secure(true).contentType(MediaType.APPLICATION_JSON) + .content(GSON.toJson(adapter))).andDo(print()).andExpect(status().isBadRequest()); + } + + @Test + public void test() { + final ZoneId zoneId = ZoneId.of("+02:00"); + when(deployer.getTimeZone("172.10.55.3")).thenReturn(zoneId); + assertEquals(zoneId, timeZoneServiceProvider.getTimeZone("172.10.55.3")); + } +} \ No newline at end of file diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/resources/application.yml b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/resources/application.yml new file mode 100644 index 0000000..27b27ff --- /dev/null +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-app/src/test/resources/application.yml @@ -0,0 +1,33 @@ +spring.devtools.restart.log-condition-evaluation-delta: false +logging.config: ./configuration/log4j2.yml +server: + username: admin + password: admin + ssl: + enabled: true + key-store-type: JKS + key-alias: nf-oam-adopter + key-store: ./configuration/ssl/nf-oam-adopter-keystore.jks + key-store-password: nf-oam-adopter + key-password: nf-oam-adopter + trust-store: ./configuration/ssl/nf-oam-adopter-truststore.jks + trust-store-password: nf-oam-adopter + enabled-protocols: TLSv1.3 + ciphers: TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_CCM_8_SHA256, TLS_AES_128_CCM_SHA256 +ves-collector: + url: someUrl + vesEncodedAuth: someAuth +http-client: + conection-timeout: 600 + response-timeout: 600 +pm-rest-manager: + synchronization-time-start: 20:00:00 + synchronization-time-frequency: 5 + mapping-config-path: mapping-configuration/pm-ves-message-mapping.yaml + ran-token-endpoint: /auth/token + ran-pm-endpoint: /pm/files + ran-time-zone-offset-endpoint: /system/timeZone +snmp-manager: + host: "0.0.0.0" + port: 10162 + mapping-config-path: mapping-configuration/fm-ves-message-mapping.yaml \ No newline at end of file diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/configuration/application.yml b/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/configuration/application.yml index 6bd01fd..c409443 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/configuration/application.yml +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/configuration/application.yml @@ -1,7 +1,7 @@ spring.devtools.restart.log-condition-evaluation-delta: false scheduler: - fixedDelay: 8000 - initialDelay: 4000 + fixedDelay: 16000 + initialDelay: 8000 security: auth: username: admin diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/pom.xml b/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/pom.xml index ecf61cc..0869dc6 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/pom.xml +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-mock/pom.xml @@ -91,7 +91,6 @@ io.swagger.codegen.v3 swagger-codegen-maven-plugin - ${swagger-codegen-maven-plugin.version} diff --git a/ves-nf-oam-adopter/ves-nf-oam-adopter-parent/pom.xml b/ves-nf-oam-adopter/ves-nf-oam-adopter-parent/pom.xml index 465d3db..a200391 100644 --- a/ves-nf-oam-adopter/ves-nf-oam-adopter-parent/pom.xml +++ b/ves-nf-oam-adopter/ves-nf-oam-adopter-parent/pom.xml @@ -445,6 +445,11 @@ + + io.swagger.codegen.v3 + swagger-codegen-maven-plugin + ${swagger-codegen-maven-plugin.version} + -- 2.16.6