diff --git a/Dockerfile b/Dockerfile
index 84c5211dd09456b6a9ce2ec14316d27868a4e135..9125ad7c71b780edbd550dec8bb8da139f3d5923 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.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 0f053fc4d2220dc21416ba47988140e5c3109268..16156427d271d2d105f33565509eda15925aef7a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.etsi.osl
org.etsi.osl.main
- 2024Q4
+ 2025Q2
../org.etsi.osl.main
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 0000000000000000000000000000000000000000..9a40578d9e6fd8c29e4ab27a0c470ffafb7656ce
--- /dev/null
+++ b/src/main/java/portal/api/metrics/MetricsApi.java
@@ -0,0 +1,48 @@
+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.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;
+
+
+@Tag(name = "NFV Metrics Api")
+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 = "/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 = "/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 = "/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 0000000000000000000000000000000000000000..834b8a7b531be152fc1a8a995001b3d814c4eb67
--- /dev/null
+++ b/src/main/java/portal/api/metrics/MetricsApiController.java
@@ -0,0 +1,68 @@
+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;
+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;
+
+
+@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();
+ RegisteredNSDs response = new 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();
+ RegisteredVNFs response = new 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();
+ RegisteredManoProviders response = new 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);
+ }
+ }
+}
diff --git a/src/main/java/portal/api/swagger2/SwaggerConfig.java b/src/main/java/portal/api/swagger2/SwaggerConfig.java
index c49190fcc26e923fbad7bcec6576cebaa349bc72..db9a0b930b6e45da4a08ef81ecab5f3905bd8333 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")));
}