PMS Persistent storage of service definitions - A1 Istanbul 94/121094/3
authorPatrikBuhr <patrik.buhr@est.tech>
Wed, 5 May 2021 06:38:07 +0000 (08:38 +0200)
committerPatrikBuhr <patrik.buhr@est.tech>
Wed, 5 May 2021 07:43:13 +0000 (09:43 +0200)
Bugfix,only sending AVAILABLE notifications for RICs that has been successfully
synched.

Issue-ID: CCSDK-3256
Signed-off-by: PatrikBuhr <patrik.buhr@est.tech>
Change-Id: Ic915c3d83a51ac23cb4652bda9ab696fc27bae3d

a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/tasks/RefreshConfigTask.java
a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ApplicationTest.java

index faef863..e84c983 100644 (file)
@@ -219,12 +219,16 @@ public class RefreshConfigTask {
     private Mono<Ric> trySyncronizeSupportedTypes(Ric ric) {
         logger.debug("Synchronizing policy types for new RIC: {}", ric.id());
         // Synchronize the policy types
+        ric.setState(RicState.SYNCHRONIZING);
         return this.a1ClientFactory.createA1Client(ric) //
                 .flatMapMany(client -> synchronizationTask().synchronizePolicyTypes(ric, client)) //
                 .collectList() //
                 .flatMap(list -> Mono.just(ric)) //
-                .doOnError(t -> logger.warn("Failed to synchronize types in new RIC: {}, reason: {}", ric.id(),
-                        t.getMessage())) //
+                .doOnNext(notUsed -> ric.setState(RicState.AVAILABLE)) //
+                .doOnError(t -> {
+                    logger.warn("Failed to synchronize types in new RIC: {}, reason: {}", ric.id(), t.getMessage());
+                    ric.setState(RicState.UNAVAILABLE); //
+                }) //
                 .onErrorResume(t -> Mono.just(ric));
     }
 
@@ -238,7 +242,6 @@ public class RefreshConfigTask {
                 return trySyncronizeSupportedTypes(new Ric(updatedInfo.getRicConfig())) //
                         .flatMap(this::addRic) //
                         .flatMap(this::notifyServicesRicAvailable) //
-                        .doOnNext(ric -> ric.setState(RicState.AVAILABLE)) //
                         .flatMap(notUsed -> Mono.just(event));
             } else if (event == RicConfigUpdate.Type.REMOVED) {
                 logger.debug("RIC removed {}", ricId);
@@ -270,10 +273,14 @@ public class RefreshConfigTask {
     }
 
     private Mono<Ric> notifyServicesRicAvailable(Ric ric) {
-        ServiceCallbacks callbacks = new ServiceCallbacks(this.restClientFactory);
-        return callbacks.notifyServicesRicAvailable(ric, services) //
-                .collectList() //
-                .flatMap(list -> Mono.just(ric));
+        if (ric.getState() == RicState.AVAILABLE) {
+            ServiceCallbacks callbacks = new ServiceCallbacks(this.restClientFactory);
+            return callbacks.notifyServicesRicAvailable(ric, services) //
+                    .collectList() //
+                    .flatMap(list -> Mono.just(ric));
+        } else {
+            return Mono.just(ric);
+        }
     }
 
     /**
index 84bc47a..91eb633 100644 (file)
@@ -50,6 +50,7 @@ import org.onap.ccsdk.oran.a1policymanagementservice.clients.A1ClientFactory;
 import org.onap.ccsdk.oran.a1policymanagementservice.clients.AsyncRestClient;
 import org.onap.ccsdk.oran.a1policymanagementservice.clients.AsyncRestClientFactory;
 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ApplicationConfig;
+import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ApplicationConfig.RicConfigUpdate;
 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ImmutableRicConfig;
 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ImmutableWebClientConfig;
 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.RicConfig;
@@ -263,10 +264,9 @@ class ApplicationTest {
 
         putService("service");
 
-        RicConfig config = ricConfig(RIC, "me1");
-        ApplicationConfig.RicConfigUpdate update =
-                new ApplicationConfig.RicConfigUpdate(config, ApplicationConfig.RicConfigUpdate.Type.ADDED);
-        refreshConfigTask.handleUpdatedRicConfig(update).block();
+        refreshConfigTask.handleUpdatedRicConfig( //
+                new RicConfigUpdate(ricConfig(RIC, "me1"), RicConfigUpdate.Type.ADDED)) //
+                .block();
         waitForRicState(RIC, RicState.AVAILABLE);
 
         // Test that the type has been synched
@@ -282,6 +282,33 @@ class ApplicationTest {
         assertThat(callbackInfo.eventType).isEqualTo(ServiceCallbackInfo.EventType.AVAILABLE);
     }
 
+    @Test
+    void testAddingRicFromConfiguration_nonRespondingRic() throws ServiceException {
+        putService("service");
+
+        final String RIC = "NonRespondingRic";
+        MockA1Client a1Client = a1ClientFactory.getOrCreateA1Client(RIC);
+        WebClientResponseException a1Exception = new WebClientResponseException(404, "", null, null, null);
+        doReturn(Mono.error(a1Exception)).when(a1Client).getPolicyTypeIdentities();
+
+        refreshConfigTask.handleUpdatedRicConfig( //
+                new RicConfigUpdate(ricConfig(RIC, "me1"), RicConfigUpdate.Type.ADDED)) //
+                .block();
+
+        waitForRicState(RIC, RicState.UNAVAILABLE);
+
+        // Check that no service callback for the UNAVAILABLE RIC is invoked
+        RappSimulatorController.TestResults receivedCallbacks = rAppSimulator.getTestResults();
+        assertThat(receivedCallbacks.getReceivedInfo().size()).isEqualTo(0);
+
+        // Run a synch and check that the AVAILABLE notificationis received
+        a1ClientFactory.reset();
+        supervision.checkAllRics();
+        waitForRicState(RIC, RicState.AVAILABLE);
+        receivedCallbacks = rAppSimulator.getTestResults();
+        assertThat(receivedCallbacks.getReceivedInfo().size()).isEqualTo(1);
+    }
+
     @Test
     void testGetRics() throws Exception {
         addRic("ric1");