Merge "Test of retry of failed module sync"
authorToine Siebelink <toine.siebelink@est.tech>
Wed, 6 Mar 2024 14:36:40 +0000 (14:36 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 6 Mar 2024 14:36:40 +0000 (14:36 +0000)
1  2 
integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy

@@@ -41,27 -41,29 +41,32 @@@ import org.onap.cps.spi.utils.SessionMa
  import org.springframework.beans.factory.annotation.Autowired
  import org.springframework.boot.autoconfigure.EnableAutoConfiguration
  import org.springframework.boot.autoconfigure.domain.EntityScan
 +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
  import org.springframework.boot.test.context.SpringBootTest
  import org.springframework.context.annotation.ComponentScan
  import org.springframework.data.jpa.repository.config.EnableJpaRepositories
  import org.springframework.http.HttpStatus
  import org.springframework.http.MediaType
  import org.springframework.test.web.client.MockRestServiceServer
 +import org.springframework.test.web.servlet.MockMvc
  import org.springframework.web.client.RestTemplate
  import org.testcontainers.spock.Testcontainers
  import spock.lang.Shared
  import spock.lang.Specification
  import spock.util.concurrent.PollingConditions
  
+ import java.time.format.DateTimeFormatter
  import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo
  import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus
+ import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DATASPACE_NAME;
+ import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DMI_REGISTRY_ANCHOR;
+ import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DMI_REGISTRY_PARENT;
  
 -@SpringBootTest(classes = [CpsDataspaceService])
 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = [CpsDataspaceService])
  @Testcontainers
  @EnableAutoConfiguration
 +@AutoConfigureMockMvc
  @EnableJpaRepositories(basePackageClasses = [DataspaceRepository])
  @ComponentScan(basePackages = ['org.onap.cps'])
  @EntityScan('org.onap.cps.spi.entities')
@@@ -70,9 -72,6 +75,9 @@@ abstract class CpsIntegrationSpecBase e
      @Shared
      DatabaseTestContainer databaseTestContainer = DatabaseTestContainer.getInstance()
  
 +    @Autowired
 +    MockMvc mvc;
 +
      @Autowired
      CpsDataspaceService cpsDataspaceService
  
              createStandardBookStoreSchemaSet(GENERAL_TEST_DATASPACE)
              initialized = true
          }
-         mockDmiServer = MockRestServiceServer.createServer(restTemplate)
+         mockDmiServer = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
      }
  
      def cleanup() {
      def registerCmHandle(dmiPlugin, cmHandleId, moduleSetTag, dmiModuleReferencesResponse, dmiModuleResourcesResponse) {
          def cmHandleToCreate = new NcmpServiceCmHandle(cmHandleId: cmHandleId, moduleSetTag: moduleSetTag)
          networkCmProxyDataService.updateDmiRegistrationAndSyncModule(new DmiPluginRegistration(dmiPlugin: dmiPlugin, createdCmHandles: [cmHandleToCreate]))
-         mockDmiResponsesForRegistration(dmiPlugin, cmHandleId, dmiModuleReferencesResponse, dmiModuleResourcesResponse)
+         mockDmiResponsesForModuleSync(dmiPlugin, cmHandleId, dmiModuleReferencesResponse, dmiModuleResourcesResponse)
          moduleSyncWatchdog.moduleSyncAdvisedCmHandles()
          new PollingConditions().within(3, () -> {
              CmHandleState.READY == networkCmProxyDataService.getCmHandleCompositeState(cmHandleId).cmHandleState
          networkCmProxyDataService.updateDmiRegistrationAndSyncModule(new DmiPluginRegistration(dmiPlugin: dmiPlugin, removedCmHandles: cmHandleIds))
      }
  
-     def mockDmiResponsesForRegistration(dmiPlugin, cmHandleId, dmiModuleReferencesResponse, dmiModuleResourcesResponse) {
-         if (dmiModuleReferencesResponse != null) {
-             mockDmiServer.expect(requestTo("${dmiPlugin}/dmi/v1/ch/${cmHandleId}/modules"))
-                     .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(dmiModuleReferencesResponse))
-         }
-         if (dmiModuleResourcesResponse != null) {
-             mockDmiServer.expect(requestTo("${dmiPlugin}/dmi/v1/ch/${cmHandleId}/moduleResources"))
-                     .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(dmiModuleResourcesResponse))
-         }
+     def mockDmiResponsesForModuleSync(dmiPlugin, cmHandleId, dmiModuleReferencesResponse, dmiModuleResourcesResponse) {
+         mockDmiServer.expect(requestTo("${dmiPlugin}/dmi/v1/ch/${cmHandleId}/modules"))
+                 .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(dmiModuleReferencesResponse))
+         mockDmiServer.expect(requestTo("${dmiPlugin}/dmi/v1/ch/${cmHandleId}/moduleResources"))
+                 .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(dmiModuleResourcesResponse))
+     }
+     def mockDmiIsNotAvailableForModuleSync(dmiPlugin, cmHandleId) {
+         mockDmiServer.expect(requestTo("${dmiPlugin}/dmi/v1/ch/${cmHandleId}/modules"))
+                 .andRespond(withStatus(HttpStatus.SERVICE_UNAVAILABLE))
+     }
+     def overrideCmHandleLastUpdateTime(cmHandleId, newUpdateTime) {
+         String ISO_TIMESTAMP_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
+         DateTimeFormatter ISO_TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern(ISO_TIMESTAMP_PATTERN);
+         def jsonForUpdate = '{ "state": { "last-update-time": "%s" } }'.formatted(ISO_TIMESTAMP_FORMATTER.format(newUpdateTime))
+         cpsDataService.updateNodeLeaves(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
+                 NCMP_DMI_REGISTRY_PARENT + "/cm-handles[@id='${cmHandleId}']", jsonForUpdate, now)
      }
  }