From: sourabh_sourabh Date: Tue, 2 Sep 2025 16:22:06 +0000 (+0100) Subject: Add ReadinessHealthIndicator to expose migration readiness status X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=91e76ab0aaba64e110f5e1e18d5e28263508f088;p=cps.git Add ReadinessHealthIndicator to expose migration readiness status - Reports READY when migrations are complete. - Reports NOT READY when a migration or rollback is in progress. - This will allow Helm (Kubernetes) and other monitoring tools to detect application readiness during migrations and act accordingly. Issue-ID: CPS-2974 Change-Id: I72441e186178d4cbd0cd98e754ca6059b4ff0bb6 Signed-off-by: sourabh_sourabh --- diff --git a/cps-charts/values.yaml b/cps-charts/values.yaml index bbe8ee3290..e1773d2819 100644 --- a/cps-charts/values.yaml +++ b/cps-charts/values.yaml @@ -47,6 +47,7 @@ cps: CPS_MONITORING_MICROMETER_JVM_EXTRAS: "true" JAVA_TOOL_OPTIONS: "-XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0" HAZELCAST_MODE_KUBERNETES_ENABLED: "true" + NCMP_INVENTORY_MODEL_UPGRADE_R20250722_ENABLED: 'false' kafka: enabled: true diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java index 4b8a95cee1..278332d854 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoader.java @@ -28,6 +28,7 @@ import org.onap.cps.api.CpsDataService; import org.onap.cps.api.CpsDataspaceService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.init.AbstractModelLoader; +import org.onap.cps.init.actuator.ReadinessManager; import org.springframework.stereotype.Service; @Slf4j @@ -40,9 +41,11 @@ public class CmDataSubscriptionModelLoader extends AbstractModelLoader { private static final String REGISTRY_DATA_NODE_NAME = "dataJob"; public CmDataSubscriptionModelLoader(final CpsDataspaceService cpsDataspaceService, - final CpsModuleService cpsModuleService, final CpsAnchorService cpsAnchorService, - final CpsDataService cpsDataService) { - super(cpsDataspaceService, cpsModuleService, cpsAnchorService, cpsDataService); + final CpsModuleService cpsModuleService, + final CpsAnchorService cpsAnchorService, + final CpsDataService cpsDataService, + final ReadinessManager readinessManager) { + super(cpsDataspaceService, cpsModuleService, cpsAnchorService, cpsDataService, readinessManager); } @Override diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java index 51ba3ecf8e..7ca52f1cf0 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/init/InventoryModelLoader.java @@ -30,6 +30,7 @@ import org.onap.cps.api.CpsDataService; import org.onap.cps.api.CpsDataspaceService; import org.onap.cps.api.CpsModuleService; import org.onap.cps.init.AbstractModelLoader; +import org.onap.cps.init.actuator.ReadinessManager; import org.onap.cps.ncmp.utils.events.NcmpInventoryModelOnboardingFinishedEvent; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; @@ -40,6 +41,7 @@ import org.springframework.stereotype.Service; public class InventoryModelLoader extends AbstractModelLoader { private final ApplicationEventPublisher applicationEventPublisher; + private static final String PREVIOUS_SCHEMA_SET_NAME = "dmi-registry-2024-02-23"; private static final String NEW_INVENTORY_SCHEMA_SET_NAME = "dmi-registry-2025-07-22"; private static final String INVENTORY_YANG_MODULE_NAME = "dmi-registry"; @@ -47,12 +49,17 @@ public class InventoryModelLoader extends AbstractModelLoader { @Value("${ncmp.inventory.model.upgrade.r20250722.enabled:false}") private boolean newRevisionEnabled; + /** + * Creates a new {@code InventoryModelLoader} instance responsible for onboarding or upgrading + * the NCMP inventory model schema sets and managing readiness state during migration. + */ public InventoryModelLoader(final CpsDataspaceService cpsDataspaceService, final CpsModuleService cpsModuleService, final CpsAnchorService cpsAnchorService, final CpsDataService cpsDataService, - final ApplicationEventPublisher applicationEventPublisher) { - super(cpsDataspaceService, cpsModuleService, cpsAnchorService, cpsDataService); + final ApplicationEventPublisher applicationEventPublisher, + final ReadinessManager readinessManager) { + super(cpsDataspaceService, cpsModuleService, cpsAnchorService, cpsDataService, readinessManager); this.applicationEventPublisher = applicationEventPublisher; } @@ -107,6 +114,24 @@ public class InventoryModelLoader extends AbstractModelLoader { // TODO further implementation is pending //1. Load all the cm handles (in batch) //2. Copy the state and known properties + log.info("Starting inventory module data migration..."); + + // Simulate a 4-minute migration (240 seconds total) + final int totalSeconds = 240; + final int stepSeconds = 30; // log progress every 30 seconds + final int steps = totalSeconds / stepSeconds; + + for (int i = 1; i <= steps; i++) { + try { + Thread.sleep(stepSeconds * 1000L); + } catch (final InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("Migration interrupted!", e); + return; + } + final int progress = (i * 100) / steps; + log.info("Migration progress: {}%", progress); + } log.info("Inventory module data migration is completed successfully."); } diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy index d26afb4be5..0a84f51daf 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/CmDataSubscriptionModelLoaderSpec.groovy @@ -28,6 +28,7 @@ import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsDataspaceService import org.onap.cps.api.CpsModuleService import org.onap.cps.api.model.Dataspace +import org.onap.cps.init.actuator.ReadinessManager import org.slf4j.LoggerFactory import org.springframework.boot.context.event.ApplicationStartedEvent import org.springframework.context.annotation.AnnotationConfigApplicationContext @@ -41,7 +42,8 @@ class CmDataSubscriptionModelLoaderSpec extends Specification { def mockCpsModuleService = Mock(CpsModuleService) def mockCpsDataService = Mock(CpsDataService) def mockCpsAnchorService = Mock(CpsAnchorService) - def objectUnderTest = new CmDataSubscriptionModelLoader(mockCpsDataspaceService, mockCpsModuleService, mockCpsAnchorService, mockCpsDataService) + def mockReadinessManager = Mock(ReadinessManager) + def objectUnderTest = new CmDataSubscriptionModelLoader(mockCpsDataspaceService, mockCpsModuleService, mockCpsAnchorService, mockCpsDataService, mockReadinessManager) def applicationContext = new AnnotationConfigApplicationContext() diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy index dfc7c10522..2ae66c91a9 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/init/InventoryModelLoaderSpec.groovy @@ -30,6 +30,7 @@ import org.onap.cps.api.CpsModuleService import org.onap.cps.api.exceptions.AnchorNotFoundException import org.onap.cps.api.model.Dataspace import org.onap.cps.api.model.ModuleDefinition +import org.onap.cps.init.actuator.ReadinessManager import org.slf4j.LoggerFactory import org.springframework.boot.context.event.ApplicationStartedEvent import org.springframework.context.ApplicationEventPublisher @@ -46,7 +47,8 @@ class InventoryModelLoaderSpec extends Specification { def mockCpsDataService = Mock(CpsDataService) def mockCpsAnchorService = Mock(CpsAnchorService) def mockApplicationEventPublisher = Mock(ApplicationEventPublisher) - def objectUnderTest = new InventoryModelLoader(mockCpsAdminService, mockCpsModuleService, mockCpsAnchorService, mockCpsDataService, mockApplicationEventPublisher) + def mockReadinessManager = Mock(ReadinessManager) + def objectUnderTest = new InventoryModelLoader(mockCpsAdminService, mockCpsModuleService, mockCpsAnchorService, mockCpsDataService, mockApplicationEventPublisher, mockReadinessManager) def applicationContext = new AnnotationConfigApplicationContext() diff --git a/cps-service/pom.xml b/cps-service/pom.xml index de0d558dbd..8b7de2c336 100644 --- a/cps-service/pom.xml +++ b/cps-service/pom.xml @@ -1,7 +1,7 @@