From 5a386fb47b1924601483af1451161037b09e8d0b Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 28 Jan 2025 13:46:06 +0000 Subject: [PATCH 1/7] Preparing for Release 2025Q2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0f053fc..6ebded5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.etsi.osl org.etsi.osl.main - 2024Q4 + 2025Q2-SNAPSHOT ../org.etsi.osl.main -- GitLab From cdbf8788510e913853a28f0c48a71289571c5a11 Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 28 Jan 2025 13:54:10 +0000 Subject: [PATCH 2/7] Preparing for Release 2025Q2 --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 84c5211..49555e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,6 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk MAINTAINER openslice.io RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.portal.api-1.0.1.jar /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.portal.api-1.0.1.jar"] +COPY target/org.etsi.osl.portal.api-1.0.2-SNAPSHOT.jar /opt/openslice/lib/ +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.portal.api-1.0.2-SNAPSHOT.jar"] EXPOSE 13000 \ No newline at end of file -- GitLab From 40f02b23b6477e5293069cf61a475308e3919d40 Mon Sep 17 00:00:00 2001 From: Nikos Kyriakoulis Date: Tue, 6 May 2025 12:11:06 +0300 Subject: [PATCH 3/7] Created metrics endpoints for NFV-related information --- .../java/portal/api/metrics/MetricsApi.java | 46 ++++++++++++ .../api/metrics/MetricsApiController.java | 70 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 src/main/java/portal/api/metrics/MetricsApi.java create mode 100644 src/main/java/portal/api/metrics/MetricsApiController.java diff --git a/src/main/java/portal/api/metrics/MetricsApi.java b/src/main/java/portal/api/metrics/MetricsApi.java new file mode 100644 index 0000000..a840ca0 --- /dev/null +++ b/src/main/java/portal/api/metrics/MetricsApi.java @@ -0,0 +1,46 @@ +package portal.api.metrics; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.Map; + +@Tag(name = "NFV_MetricsApi") +public interface MetricsApi { + + Logger log = LoggerFactory.getLogger(MetricsApi.class); + + @Operation(summary = "Get total number of registered NSDs", operationId = "getRegisteredNsds") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Success"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "500", description = "Internal Server Error") + }) + @RequestMapping(value = "/osapi/metrics/registeredNsds", method = RequestMethod.GET, produces = "application/json;charset=utf-8") + ResponseEntity> getRegisteredNsds(); + + @Operation(summary = "Get total number of registered VNFs", operationId = "getRegisteredVnfs") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Success"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "500", description = "Internal Server Error") + }) + @RequestMapping(value = "/osapi/metrics/registeredVnfs", method = RequestMethod.GET, produces = "application/json;charset=utf-8") + ResponseEntity> getRegisteredVnfs(); + + @Operation(summary = "Get total number of registered Mano Providers", operationId = "getRegisteredManoProviders") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Success"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "500", description = "Internal Server Error") + }) + @RequestMapping(value = "/osapi/metrics/registeredManoProviders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") + ResponseEntity> getRegisteredManoProviders(); +} diff --git a/src/main/java/portal/api/metrics/MetricsApiController.java b/src/main/java/portal/api/metrics/MetricsApiController.java new file mode 100644 index 0000000..079b0f6 --- /dev/null +++ b/src/main/java/portal/api/metrics/MetricsApiController.java @@ -0,0 +1,70 @@ +package portal.api.metrics; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import portal.api.service.ManoProviderService; +import portal.api.service.NSDService; +import portal.api.service.VxFService; + +import java.util.HashMap; +import java.util.Map; + +@Controller +public class MetricsApiController implements MetricsApi { + + private static final Logger log = LoggerFactory.getLogger(MetricsApiController.class); + + private final NSDService nsdService; + + private final VxFService vxfService; + + private final ManoProviderService manoProviderService; + + public MetricsApiController(NSDService nsdService, VxFService vxfService, ManoProviderService manoProviderService) { + this.nsdService = nsdService; + this.vxfService = vxfService; + this.manoProviderService = manoProviderService; + } + + @Override + public ResponseEntity> getRegisteredNsds() { + try { + int totalNSDs = nsdService.getExperiments().size(); + Map response = new HashMap<>(); + response.put("registeredNsds", totalNSDs); + return new ResponseEntity<>(response, HttpStatus.OK); + } catch (Exception e) { + log.error("Couldn't retrieve total registered NSDs. ", e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Override + public ResponseEntity> getRegisteredVnfs() { + try { + int totalVNFs = vxfService.getVxFs().size(); + Map response = new HashMap<>(); + response.put("registeredVnfs", totalVNFs); + return new ResponseEntity<>(response, HttpStatus.OK); + } catch (Exception e) { + log.error("Couldn't retrieve total registered VNFs. ", e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Override + public ResponseEntity> getRegisteredManoProviders() { + try { + int totalManoProviders = manoProviderService.getMANOproviders().size(); + Map response = new HashMap<>(); + response.put("registeredManoProviders", totalManoProviders); + return new ResponseEntity<>(response, HttpStatus.OK); + } catch (Exception e) { + log.error("Couldn't retrieve total registered MANO Providers. ", e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} -- GitLab From b5930fc596a0070f31ef213a150398bd794b9c7e Mon Sep 17 00:00:00 2001 From: Nikos Kyriakoulis Date: Tue, 6 May 2025 17:19:41 +0300 Subject: [PATCH 4/7] Removed duplicate 'osapi' prefix in metrics API endpoints --- src/main/java/portal/api/metrics/MetricsApi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/portal/api/metrics/MetricsApi.java b/src/main/java/portal/api/metrics/MetricsApi.java index a840ca0..e5b7482 100644 --- a/src/main/java/portal/api/metrics/MetricsApi.java +++ b/src/main/java/portal/api/metrics/MetricsApi.java @@ -23,7 +23,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "400", description = "Bad Request"), @ApiResponse(responseCode = "500", description = "Internal Server Error") }) - @RequestMapping(value = "/osapi/metrics/registeredNsds", method = RequestMethod.GET, produces = "application/json;charset=utf-8") + @RequestMapping(value = "/metrics/registeredNsds", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity> getRegisteredNsds(); @Operation(summary = "Get total number of registered VNFs", operationId = "getRegisteredVnfs") @@ -32,7 +32,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "400", description = "Bad Request"), @ApiResponse(responseCode = "500", description = "Internal Server Error") }) - @RequestMapping(value = "/osapi/metrics/registeredVnfs", method = RequestMethod.GET, produces = "application/json;charset=utf-8") + @RequestMapping(value = "/metrics/registeredVnfs", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity> getRegisteredVnfs(); @Operation(summary = "Get total number of registered Mano Providers", operationId = "getRegisteredManoProviders") @@ -41,6 +41,6 @@ public interface MetricsApi { @ApiResponse(responseCode = "400", description = "Bad Request"), @ApiResponse(responseCode = "500", description = "Internal Server Error") }) - @RequestMapping(value = "/osapi/metrics/registeredManoProviders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") + @RequestMapping(value = "/metrics/registeredManoProviders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity> getRegisteredManoProviders(); } -- GitLab From bf673ad421712398aabb0341cfc94f2d3cc3139f Mon Sep 17 00:00:00 2001 From: Nikos Kyriakoulis Date: Tue, 13 May 2025 16:40:15 +0300 Subject: [PATCH 5/7] Use metrics model for NFV-related information --- .../java/portal/api/metrics/MetricsApi.java | 10 ++++++---- .../api/metrics/MetricsApiController.java | 20 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/portal/api/metrics/MetricsApi.java b/src/main/java/portal/api/metrics/MetricsApi.java index e5b7482..9e6949d 100644 --- a/src/main/java/portal/api/metrics/MetricsApi.java +++ b/src/main/java/portal/api/metrics/MetricsApi.java @@ -4,13 +4,15 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import org.etsi.osl.model.nfv.metrics.RegisteredManoProviders; +import org.etsi.osl.model.nfv.metrics.RegisteredNSDs; +import org.etsi.osl.model.nfv.metrics.RegisteredVNFs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import java.util.Map; @Tag(name = "NFV_MetricsApi") public interface MetricsApi { @@ -24,7 +26,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/registeredNsds", method = RequestMethod.GET, produces = "application/json;charset=utf-8") - ResponseEntity> getRegisteredNsds(); + ResponseEntity getRegisteredNsds(); @Operation(summary = "Get total number of registered VNFs", operationId = "getRegisteredVnfs") @ApiResponses(value = { @@ -33,7 +35,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/registeredVnfs", method = RequestMethod.GET, produces = "application/json;charset=utf-8") - ResponseEntity> getRegisteredVnfs(); + ResponseEntity getRegisteredVnfs(); @Operation(summary = "Get total number of registered Mano Providers", operationId = "getRegisteredManoProviders") @ApiResponses(value = { @@ -42,5 +44,5 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/registeredManoProviders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") - ResponseEntity> getRegisteredManoProviders(); + ResponseEntity getRegisteredManoProviders(); } diff --git a/src/main/java/portal/api/metrics/MetricsApiController.java b/src/main/java/portal/api/metrics/MetricsApiController.java index 079b0f6..834b8a7 100644 --- a/src/main/java/portal/api/metrics/MetricsApiController.java +++ b/src/main/java/portal/api/metrics/MetricsApiController.java @@ -1,5 +1,8 @@ package portal.api.metrics; +import org.etsi.osl.model.nfv.metrics.RegisteredManoProviders; +import org.etsi.osl.model.nfv.metrics.RegisteredNSDs; +import org.etsi.osl.model.nfv.metrics.RegisteredVNFs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; @@ -9,8 +12,6 @@ import portal.api.service.ManoProviderService; import portal.api.service.NSDService; import portal.api.service.VxFService; -import java.util.HashMap; -import java.util.Map; @Controller public class MetricsApiController implements MetricsApi { @@ -30,11 +31,10 @@ public class MetricsApiController implements MetricsApi { } @Override - public ResponseEntity> getRegisteredNsds() { + public ResponseEntity getRegisteredNsds() { try { int totalNSDs = nsdService.getExperiments().size(); - Map response = new HashMap<>(); - response.put("registeredNsds", totalNSDs); + RegisteredNSDs response = new RegisteredNSDs(totalNSDs); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { log.error("Couldn't retrieve total registered NSDs. ", e); @@ -43,11 +43,10 @@ public class MetricsApiController implements MetricsApi { } @Override - public ResponseEntity> getRegisteredVnfs() { + public ResponseEntity getRegisteredVnfs() { try { int totalVNFs = vxfService.getVxFs().size(); - Map response = new HashMap<>(); - response.put("registeredVnfs", totalVNFs); + RegisteredVNFs response = new RegisteredVNFs(totalVNFs); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { log.error("Couldn't retrieve total registered VNFs. ", e); @@ -56,11 +55,10 @@ public class MetricsApiController implements MetricsApi { } @Override - public ResponseEntity> getRegisteredManoProviders() { + public ResponseEntity getRegisteredManoProviders() { try { int totalManoProviders = manoProviderService.getMANOproviders().size(); - Map response = new HashMap<>(); - response.put("registeredManoProviders", totalManoProviders); + RegisteredManoProviders response = new RegisteredManoProviders(totalManoProviders); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { log.error("Couldn't retrieve total registered MANO Providers. ", e); -- GitLab From 9015e68dc30a238adc94132d991f1da5aca7ecdd Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Mon, 26 May 2025 18:36:40 +0300 Subject: [PATCH 6/7] Adding OAS support for the NFV Metrics API (fix for #12) --- .../java/portal/api/metrics/MetricsApi.java | 2 +- .../portal/api/swagger2/SwaggerConfig.java | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/java/portal/api/metrics/MetricsApi.java b/src/main/java/portal/api/metrics/MetricsApi.java index 9e6949d..9a40578 100644 --- a/src/main/java/portal/api/metrics/MetricsApi.java +++ b/src/main/java/portal/api/metrics/MetricsApi.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -@Tag(name = "NFV_MetricsApi") +@Tag(name = "NFV Metrics Api") public interface MetricsApi { Logger log = LoggerFactory.getLogger(MetricsApi.class); diff --git a/src/main/java/portal/api/swagger2/SwaggerConfig.java b/src/main/java/portal/api/swagger2/SwaggerConfig.java index c49190f..db9a0b9 100644 --- a/src/main/java/portal/api/swagger2/SwaggerConfig.java +++ b/src/main/java/portal/api/swagger2/SwaggerConfig.java @@ -57,7 +57,7 @@ public class SwaggerConfig { SpringDocUtils.getConfig().replaceWithClass(java.time.LocalDate.class, java.sql.Date.class); SpringDocUtils.getConfig().replaceWithClass(java.time.OffsetDateTime.class, java.util.Date.class); return GroupedOpenApi.builder() - .group("nfv-portal.api.controller-v1.0.0") + .group("nfv-portal.api.controller") .addOpenApiCustomizer( this.apiInfoPortalAPI() ) .packagesToScan("portal.api.controller") .build(); @@ -69,11 +69,36 @@ public class SwaggerConfig { return openApi -> openApi .specVersion( SpecVersion.V30 ).addSecurityItem(new SecurityRequirement().addList("security_auth")) - .info(new Info().title("NFV portal API") - .description("## NFV portal API") + .info(new Info().title("NFV Portal API") + .description("## An API to manage NFV Artifacts") .version("1.0.0") - .license(new License().name("Apache 2.0").url("http://openslice.io"))); + .license(new License().name("Apache 2.0").url("https://osl.etsi.org"))); + } + + @Bean + public GroupedOpenApi nfvportalmetrics(){ + + SpringDocUtils.getConfig().replaceWithClass(java.time.LocalDate.class, java.sql.Date.class); + SpringDocUtils.getConfig().replaceWithClass(java.time.OffsetDateTime.class, java.util.Date.class); + return GroupedOpenApi.builder() + .group("nfv-portal.api.metrics") + .addOpenApiCustomizer( this.nfvPortalAPImetrics() ) + .packagesToScan("portal.api.metrics") + .build(); + + } + + OpenApiCustomizer nfvPortalAPImetrics() { + + + return openApi -> openApi + .specVersion( SpecVersion.V30 ).addSecurityItem(new SecurityRequirement().addList("security_auth")) + .info(new Info().title("NFV Portal metrics API") + .description("## An API to retrieve metrics about NFV Portal") + + .version("1.0.0") + .license(new License().name("Apache 2.0").url("https://osl.etsi.org"))); } -- GitLab From e16226ea6254130e9f4be6747bfe4fb5748df1d2 Mon Sep 17 00:00:00 2001 From: trantzas Date: Fri, 18 Jul 2025 11:21:58 +0000 Subject: [PATCH 7/7] Preparing for the Release 2025Q2 --- Dockerfile | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 49555e6..9125ad7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,6 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk MAINTAINER openslice.io RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.portal.api-1.0.2-SNAPSHOT.jar /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.portal.api-1.0.2-SNAPSHOT.jar"] +COPY target/org.etsi.osl.portal.api-1.1.0.jar /opt/openslice/lib/ +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.portal.api-1.1.0.jar"] EXPOSE 13000 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6ebded5..1615642 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.etsi.osl org.etsi.osl.main - 2025Q2-SNAPSHOT + 2025Q2 ../org.etsi.osl.main -- GitLab