From 080dd34e7f506027c2dc1a87ddc4c9aa347a9c59 Mon Sep 17 00:00:00 2001 From: "pramod.jamkhedkar" Date: Wed, 10 Apr 2019 21:22:01 -0400 Subject: Drools-App changes to support CQ Changes in event manager to support Aai custom query Issue-ID: POLICY-1278 Change-Id: I693dd6b94f1fa6f24b08a389db099914636cf2ba Signed-off-by: pramod.jamkhedkar --- .../eventmanager/ControlLoopEventManager.java | 90 ++- .../eventmanager/ControlLoopOperationManager.java | 91 ++- .../eventmanager/ControlLoopEventManagerTest.java | 27 +- .../ControlLoopOperationManagerTest.java | 44 +- .../src/test/resources/AaiCqResponse.json | 673 +++++++++++++++++++++ 5 files changed, 845 insertions(+), 80 deletions(-) create mode 100644 controlloop/common/eventmanager/src/test/resources/AaiCqResponse.json (limited to 'controlloop/common/eventmanager/src') diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java index bfb8c13fe..edee4c2f0 100644 --- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java +++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java @@ -31,7 +31,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.UUID; - +import org.onap.policy.aai.AaiCqResponse; import org.onap.policy.aai.AaiGetVnfResponse; import org.onap.policy.aai.AaiGetVserverResponse; import org.onap.policy.aai.AaiManager; @@ -82,8 +82,8 @@ public class ControlLoopEventManager implements LockCallback, Serializable { private static final String QUERY_AAI_ERROR_MSG = "Exception from queryAai: "; /** - * Additional time, in seconds, to add to a "lock" request. This ensures that the lock - * won't expire right before an operation completes. + * Additional time, in seconds, to add to a "lock" request. This ensures that the lock won't expire right before an + * operation completes. */ private static final int ADDITIONAL_LOCK_SEC = 60; @@ -111,8 +111,7 @@ public class ControlLoopEventManager implements LockCallback, Serializable { private boolean useTargetLock = true; /** - * Wrapper for AAI vserver named-query response. This is initialized in a lazy - * fashion. + * Wrapper for AAI vserver named-query response. This is initialized in a lazy fashion. */ private AaiNqResponseWrapper nqVserverResponse = null; @@ -305,8 +304,7 @@ public class ControlLoopEventManager implements LockCallback, Serializable { /** * Check if the control loop is final. * - * @return a VirtualControlLoopNotification if the control loop is final, otherwise - * null is returned + * @return a VirtualControlLoopNotification if the control loop is final, otherwise null is returned * @throws ControlLoopException if an error occurs */ public VirtualControlLoopNotification isControlLoopFinal() throws ControlLoopException { @@ -496,8 +494,7 @@ public class ControlLoopEventManager implements LockCallback, Serializable { // if (!this.useTargetLock) { TargetLock lock = PolicyGuard.createTargetLock(this.currentOperation.policy.getTarget().getType(), - this.currentOperation.getTargetEntity(), - this.onset.getRequestId(), this); + this.currentOperation.getTargetEntity(), this.onset.getRequestId(), this); this.targetLock = lock; return LockResult.createLockResult(GuardResult.LOCK_ACQUIRED, lock); } @@ -510,16 +507,15 @@ public class ControlLoopEventManager implements LockCallback, Serializable { // Currently, it should be. But in the future it may not. // GuardResult result = PolicyGuard.lockTarget(targetLock, - this.currentOperation.getOperationTimeout() + ADDITIONAL_LOCK_SEC); + this.currentOperation.getOperationTimeout() + ADDITIONAL_LOCK_SEC); return new LockResult<>(result, this.targetLock); } else { // // Ask the Guard // - LockResult lockResult = - PolicyGuard.lockTarget(this.currentOperation.policy.getTarget().getType(), - this.currentOperation.getTargetEntity(), this.onset.getRequestId(), this, - this.currentOperation.getOperationTimeout() + ADDITIONAL_LOCK_SEC); + LockResult lockResult = PolicyGuard.lockTarget( + this.currentOperation.policy.getTarget().getType(), this.currentOperation.getTargetEntity(), + this.onset.getRequestId(), this, this.currentOperation.getOperationTimeout() + ADDITIONAL_LOCK_SEC); // // Was it acquired? // @@ -637,13 +633,13 @@ public class ControlLoopEventManager implements LockCallback, Serializable { return; } try { - this.lastOperationManager.commitAbatement(message,outcome); + this.lastOperationManager.commitAbatement(message, outcome); } catch (NoSuchElementException e) { logger.error("{}: commitAbatement threw an exception ", this, e); } } - + /** * Set the control loop time out. * @@ -775,8 +771,8 @@ public class ControlLoopEventManager implements LockCallback, Serializable { * Process a response from A&AI for a VNF. * * @param aaiResponse the response from A&AI - * @param queryByVnfId true if the query was based on vnf-id, - * false if the query was based on vnf-name + * @param queryByVnfId true if the query was based on vnf-id, false if the query was based + * on vnf-name * @throws AaiException if an error occurs processing the response */ private static void processVnfResponse(AaiGetVnfResponse aaiResponse, boolean queryByVnfId) throws AaiException { @@ -831,38 +827,35 @@ public class ControlLoopEventManager implements LockCallback, Serializable { * Is closed loop disabled for an event. * * @param event the event - * @return true if the control loop is disabled, false - * otherwise + * @return true if the control loop is disabled, false otherwise */ public static boolean isClosedLoopDisabled(VirtualControlLoopEvent event) { Map aai = event.getAai(); return (isAaiTrue(aai.get(VSERVER_IS_CLOSED_LOOP_DISABLED)) - || isAaiTrue(aai.get(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED))); + || isAaiTrue(aai.get(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED))); } /** * Does provisioning status, for an event, have a value other than ACTIVE. * * @param event the event - * @return {@code true} if the provisioning status is neither ACTIVE nor {@code null}, - * {@code false} otherwise + * @return {@code true} if the provisioning status is neither ACTIVE nor {@code null}, {@code false} otherwise */ protected static boolean isProvStatusInactive(VirtualControlLoopEvent event) { Map aai = event.getAai(); return (!PROV_STATUS_ACTIVE.equals(aai.getOrDefault(VSERVER_PROV_STATUS, PROV_STATUS_ACTIVE)) - || !PROV_STATUS_ACTIVE.equals(aai.getOrDefault(GENERIC_VNF_PROV_STATUS, PROV_STATUS_ACTIVE))); + || !PROV_STATUS_ACTIVE.equals(aai.getOrDefault(GENERIC_VNF_PROV_STATUS, PROV_STATUS_ACTIVE))); } /** * Determines the boolean value represented by the given AAI field value. * * @param aaiValue value to be examined - * @return the boolean value represented by the field value, or {@code false} if the - * value is {@code null} + * @return the boolean value represented by the field value, or {@code false} if the value is {@code null} */ protected static boolean isAaiTrue(String aaiValue) { return ("true".equalsIgnoreCase(aaiValue) || "T".equalsIgnoreCase(aaiValue) || "yes".equalsIgnoreCase(aaiValue) - || "Y".equalsIgnoreCase(aaiValue)); + || "Y".equalsIgnoreCase(aaiValue)); } /** @@ -937,6 +930,7 @@ public class ControlLoopEventManager implements LockCallback, Serializable { /** * Gets the output from the AAI vserver named-query, using the cache, if appropriate. + * * @return output from the AAI vserver named-query */ public AaiNqResponseWrapper getNqVserverFromAai() { @@ -976,7 +970,7 @@ public class ControlLoopEventManager implements LockCallback, Serializable { } AaiNqResponse aaiNqResponse = new AaiManager(new RestManager()).postQuery(getPeManagerEnvProperty(AAI_URL), - getPeManagerEnvProperty(AAI_USERNAME_PROPERTY), getPeManagerEnvProperty(AAI_PASS_PROPERTY), + getPeManagerEnvProperty(AAI_USERNAME_PROPERTY), getPeManagerEnvProperty(AAI_PASS_PROPERTY), aaiNqRequest, onset.getRequestId()); // Check AAI response @@ -997,8 +991,8 @@ public class ControlLoopEventManager implements LockCallback, Serializable { } /** - * This method reads and validates environmental properties coming from the policy engine. Null - * properties cause an {@link IllegalArgumentException} runtime exception to be thrown + * This method reads and validates environmental properties coming from the policy engine. Null properties cause an + * {@link IllegalArgumentException} runtime exception to be thrown * * @param enginePropertyName the name of the parameter to retrieve * @return the property value @@ -1032,4 +1026,40 @@ public class ControlLoopEventManager implements LockCallback, Serializable { + ", currentOperation=" + currentOperation + ", targetLock=" + targetLock + "]"; } + /** + * This function calls Aai Custom Query and responds with the AaiCqResponse. + * + * @param event input event + * @return AaiCqResponse Response from Aai for custom query + * @throws AaiException if error occurs + */ + public AaiCqResponse getCqResponse(VirtualControlLoopEvent event) throws AaiException { + + Map aai = event.getAai(); + + if (aai.containsKey(VSERVER_IS_CLOSED_LOOP_DISABLED) || aai.containsKey(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED)) { + + if (isClosedLoopDisabled(event)) { + throw new AaiException("is-closed-loop-disabled is set to true on VServer or VNF"); + } + + if (isProvStatusInactive(event)) { + throw new AaiException("prov-status is not ACTIVE on VServer or VNF"); + } + } + + UUID reqId = event.getRequestId(); + AaiCqResponse response = null; + String vserverId = event.getAai().get(VSERVER_VSERVER_NAME); + + String aaiHostUrl = PolicyEngine.manager.getEnvironmentProperty(AAI_URL); + String aaiUser = PolicyEngine.manager.getEnvironmentProperty(AAI_USERNAME_PROPERTY); + String aaiPassword = PolicyEngine.manager.getEnvironmentProperty(AAI_PASS_PROPERTY); + + response = new AaiManager(new RestManager()).getCustomQueryResponse(aaiHostUrl, aaiUser, aaiPassword, reqId, + vserverId); + return response; + + } + } diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java index 7bd0a0e54..9cd2fb350 100644 --- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java +++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java @@ -33,6 +33,7 @@ import java.util.Properties; import javax.persistence.EntityManager; import javax.persistence.Persistence; import org.eclipse.persistence.config.PersistenceUnitProperties; +import org.onap.aai.domain.yang.GenericVnf; import org.onap.policy.aai.util.AaiException; import org.onap.policy.appc.Response; import org.onap.policy.appc.ResponseCode; @@ -110,14 +111,25 @@ public class ControlLoopOperationManager implements Serializable { case "APPC": if ("ModifyConfig".equalsIgnoreCase(policy.getRecipe())) { /* - * The target vnf-id may not be the same as the source vnf-id specified in the - * yaml, the target vnf-id is retrieved by a named query to A&AI. + * The target vnf-id may not be the same as the source vnf-id specified in the yaml, the target + * vnf-id is retrieved by a named query to A&AI. */ - String targetVnf = AppcLcmActorServiceProvider.vnfNamedQuery(policy.getTarget().getResourceID(), - this.targetEntity, PolicyEngine.manager.getEnvironmentProperty("aai.url"), - PolicyEngine.manager.getEnvironmentProperty("aai.username"), - PolicyEngine.manager.getEnvironmentProperty("aai.password")); - this.targetEntity = targetVnf; + if (Boolean.valueOf(PolicyEngine.manager.getEnvironmentProperty("aai.customQuery"))) { + GenericVnf genvnf = this.eventManager.getCqResponse((VirtualControlLoopEvent) onset) + .getGenericVnfByModelInvariantId(policy.getTarget().getResourceID()); + if (genvnf == null) { + logger.info("Target entity could not be found"); + throw new AaiException("Target vnf-id could not be found"); + } + this.targetEntity = genvnf.getVnfId(); + + } else { + this.targetEntity = + AppcLcmActorServiceProvider.vnfNamedQuery(policy.getTarget().getResourceID(), + this.targetEntity, PolicyEngine.manager.getEnvironmentProperty("aai.url"), + PolicyEngine.manager.getEnvironmentProperty("aai.username"), + PolicyEngine.manager.getEnvironmentProperty("aai.password")); + } } break; case "SO": @@ -133,6 +145,7 @@ public class ControlLoopOperationManager implements Serializable { } } + public ControlLoopEventManager getEventManager() { return eventManager; } @@ -218,10 +231,16 @@ public class ControlLoopOperationManager implements Serializable { } /* - * If the vnf-name was retrieved from the onset then the vnf-id must be obtained - * from the event manager's A&AI GET query + * If the vnf-name was retrieved from the onset then the vnf-id must be obtained from the event + * manager's A&AI GET query */ - String vnfId = this.eventManager.getVnfResponse().getVnfId(); + String vnfId; + if (Boolean.valueOf(PolicyEngine.manager.getEnvironmentProperty("aai.customQuery"))) { + vnfId = this.eventManager.getCqResponse((VirtualControlLoopEvent) onset).getDefaultGenericVnf() + .getVnfId(); + } else { + vnfId = this.eventManager.getVnfResponse().getVnfId(); + } if (vnfId == null) { throw new AaiException("No vnf-id found"); } @@ -243,10 +262,16 @@ public class ControlLoopOperationManager implements Serializable { } /* - * If the vnf-name was retrieved from the onset then the vnf-id must be obtained - * from the event manager's A&AI GET query + * If the vnf-name was retrieved from the onset then the vnf-id must be obtained from the event + * manager's A&AI GET query */ - String vnfId = this.eventManager.getVnfResponse().getVnfId(); + String vnfId; + if (Boolean.valueOf(PolicyEngine.manager.getEnvironmentProperty("aai.customQuery"))) { + vnfId = this.eventManager.getCqResponse((VirtualControlLoopEvent) onset).getDefaultGenericVnf() + .getVnfId(); + } else { + vnfId = this.eventManager.getVnfResponse().getVnfId(); + } if (vnfId == null) { throw new AaiException("No vnf-id found"); } @@ -264,8 +289,10 @@ public class ControlLoopOperationManager implements Serializable { * @param onset the onset event * @return the operation request * @throws ControlLoopException if an error occurs + * @throws AaiException if error occurs */ - public Object startOperation(/* VirtualControlLoopEvent */ControlLoopEvent onset) throws ControlLoopException { + public Object startOperation(/* VirtualControlLoopEvent */ControlLoopEvent onset) + throws ControlLoopException, AaiException { verifyOperatonCanRun(); // @@ -284,8 +311,8 @@ public class ControlLoopOperationManager implements Serializable { switch (policy.getActor()) { case "APPC": /* - * If the recipe is ModifyConfig, a legacy APPC request is constructed. Otherwise an - * LCMRequest is constructed. + * If the recipe is ModifyConfig, a legacy APPC request is constructed. Otherwise an LCMRequest is + * constructed. */ this.currentOperation = operation; if ("ModifyConfig".equalsIgnoreCase(policy.getRecipe())) { @@ -302,8 +329,14 @@ public class ControlLoopOperationManager implements Serializable { return operationRequest; case "SO": SoActorServiceProvider soActorSp = new SoActorServiceProvider(); - this.operationRequest = soActorSp.constructRequest((VirtualControlLoopEvent) onset, - operation.clOperation, this.policy, eventManager.getNqVserverFromAai()); + if (Boolean.valueOf(PolicyEngine.manager.getEnvironmentProperty("aai.customQuery"))) { + this.operationRequest = + soActorSp.constructRequestCq((VirtualControlLoopEvent) onset, operation.clOperation, + this.policy, eventManager.getCqResponse((VirtualControlLoopEvent) onset)); + } else { + this.operationRequest = soActorSp.constructRequest((VirtualControlLoopEvent) onset, + operation.clOperation, this.policy, eventManager.getNqVserverFromAai()); + } // Save the operation this.currentOperation = operation; @@ -314,11 +347,17 @@ public class ControlLoopOperationManager implements Serializable { return operationRequest; case "VFC": - this.operationRequest = VfcActorServiceProvider.constructRequest((VirtualControlLoopEvent) onset, - operation.clOperation, this.policy, this.eventManager.getVnfResponse(), - PolicyEngine.manager.getEnvironmentProperty("vfc.url"), - PolicyEngine.manager.getEnvironmentProperty("vfc.username"), - PolicyEngine.manager.getEnvironmentProperty("vfc.password")); + if (Boolean.valueOf(PolicyEngine.manager.getEnvironmentProperty("aai.customQuery"))) { + this.operationRequest = VfcActorServiceProvider.constructRequestCq((VirtualControlLoopEvent) onset, + operation.clOperation, this.policy, + eventManager.getCqResponse((VirtualControlLoopEvent) onset)); + } else { + this.operationRequest = VfcActorServiceProvider.constructRequest((VirtualControlLoopEvent) onset, + operation.clOperation, this.policy, this.eventManager.getVnfResponse(), + PolicyEngine.manager.getEnvironmentProperty("vfc.url"), + PolicyEngine.manager.getEnvironmentProperty("vfc.username"), + PolicyEngine.manager.getEnvironmentProperty("vfc.password")); + } this.currentOperation = operation; if (this.operationRequest == null) { this.policyResult = PolicyResult.FAILURE; @@ -330,7 +369,7 @@ public class ControlLoopOperationManager implements Serializable { */ this.currentOperation = operation; this.operationRequest = SdnrActorServiceProvider.constructRequest((VirtualControlLoopEvent) onset, - operation.clOperation, this.policy); + operation.clOperation, this.policy); // // Save the operation // @@ -341,8 +380,8 @@ public class ControlLoopOperationManager implements Serializable { return operationRequest; case "SDNC": SdncActorServiceProvider provider = new SdncActorServiceProvider(); - this.operationRequest = provider.constructRequest((VirtualControlLoopEvent) onset, - operation.clOperation, this.policy); + this.operationRequest = + provider.constructRequest((VirtualControlLoopEvent) onset, operation.clOperation, this.policy); this.currentOperation = operation; if (this.operationRequest == null) { this.policyResult = PolicyResult.FAILURE; diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java index 7c3a38b38..bce96b2f0 100644 --- a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java +++ b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java @@ -43,6 +43,7 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.onap.policy.aai.AaiCqResponse; import org.onap.policy.aai.AaiGetVnfResponse; import org.onap.policy.aai.AaiGetVserverResponse; import org.onap.policy.aai.AaiNqRequestError; @@ -80,6 +81,7 @@ public class ControlLoopEventManagerTest { private static final Logger logger = LoggerFactory.getLogger(ControlLoopEventManagerTest.class); + @Rule public ExpectedException thrown = ExpectedException.none(); @@ -558,7 +560,7 @@ public class ControlLoopEventManagerTest { VirtualControlLoopNotification clfNotification = manager.isControlLoopFinal(); assertNull(clfNotification); - + // serialize and de-serialize manager manager = Serializer.roundTrip(manager); @@ -632,7 +634,7 @@ public class ControlLoopEventManagerTest { ControlLoopOperationManager clom = manager.processControlLoop(); assertNotNull(clom); assertNull(clom.getOperationResult()); - + // serialize and de-serialize manager manager = Serializer.roundTrip(manager); @@ -724,7 +726,7 @@ public class ControlLoopEventManagerTest { } assertNull(manager.unlockCurrentOperation()); - + // serialize and de-serialize manager manager = Serializer.roundTrip(manager); @@ -917,7 +919,7 @@ public class ControlLoopEventManagerTest { try { onset.getAai().put(ControlLoopEventManager.GENERIC_VNF_IS_CLOSED_LOOP_DISABLED, Boolean.TRUE.toString()); onset.getAai().put(ControlLoopEventManager.GENERIC_VNF_PROV_STATUS, - ControlLoopEventManager.PROV_STATUS_ACTIVE); + ControlLoopEventManager.PROV_STATUS_ACTIVE); mgr = makeManager(onset); mgr.queryAai(onset); @@ -1290,6 +1292,23 @@ public class ControlLoopEventManagerTest { assertNull(manager.getNqVserverFromAai()); } + @Test + public void testGetCqResponse() { + try { + ControlLoopEventManager mgr = null; + mgr = makeManager(onset); + mgr.queryAai(onset); + AaiCqResponse aaiCqResponse = mgr.getCqResponse(onset); + assertNotNull(aaiCqResponse); + + + } catch (Exception e) { + logger.error("testGetCqResponse Exception: ", e); + fail(e.getMessage()); + } + } + + private ControlLoopEventManager makeManager(VirtualControlLoopEvent event) { return new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId()); } diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java index 82da603ff..d722cc220 100644 --- a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java +++ b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -119,7 +119,7 @@ public class ControlLoopOperationManagerTest { return numEvents; } - + /** * Set up test class. */ @@ -131,7 +131,7 @@ public class ControlLoopOperationManagerTest { } catch (Exception e) { fail(e.getMessage()); } - + // Set PU System.setProperty("OperationsHistoryPU", "TestOperationsHistoryPU"); @@ -155,7 +155,7 @@ public class ControlLoopOperationManagerTest { emf.close(); HttpServletServer.factory.destroy(); } - + @Test public void testRetriesFail() { // @@ -479,8 +479,11 @@ public class ControlLoopOperationManagerTest { onsetEvent.getAai().remove("generic-vnf.vnf-id"); manager.getVnfResponse(); - clom.getEventManager().getVnfResponse().setVnfId("generic-vnf.vnf-id"); - assertEquals("generic-vnf.vnf-id", clom.getTarget(policy)); + if (!Boolean.valueOf(PolicyEngine.manager.getEnvironmentProperty("aai.customQuery"))) { + clom.getEventManager().getVnfResponse().setVnfId("generic-vnf.vnf-id"); + assertEquals("generic-vnf.vnf-id", clom.getTarget(policy)); + } + policy.getTarget().setType(TargetType.VFC); try { @@ -550,6 +553,7 @@ public class ControlLoopOperationManagerTest { clom = new ControlLoopOperationManager(onsetEvent, policy, manager); assertNotNull(clom); + policy.setActor("SO"); clom = new ControlLoopOperationManager(onsetEvent, policy, manager); assertNotNull(clom); @@ -804,13 +808,13 @@ public class ControlLoopOperationManagerTest { System.setProperty("OperationsHistoryPU", "TestOperationsHistoryPU"); assertEquals(PolicyResult.FAILURE, clom.onResponse(soRw)); - } + } @Test public void testCommitAbatement() throws ControlLoopException, AaiException, IOException { String yamlString = null; - try ( InputStream is = new FileInputStream(new File("src/test/resources/test.yaml")) ) { + try (InputStream is = new FileInputStream(new File("src/test/resources/test.yaml"))) { yamlString = IOUtils.toString(is, StandardCharsets.UTF_8); } catch (Exception e) { fail(e.getMessage()); @@ -835,19 +839,19 @@ public class ControlLoopOperationManagerTest { Policy policy = manager.getProcessor().getCurrentPolicy(); ControlLoopOperationManager clom = new ControlLoopOperationManager(onsetEvent, policy, manager); assertNotNull(clom); - + clom.startOperation(onsetEvent); int numEventsBefore = getCount(); - logger.info("numEventsBefore={}", numEventsBefore); - - clom.commitAbatement("Test message","TEST_RESULT"); + logger.info("numEventsBefore={}", numEventsBefore); + + clom.commitAbatement("Test message", "TEST_RESULT"); int numEventsAfter = getCount(); - logger.info("numEventsAfter={}", numEventsAfter); - - assertEquals(1, numEventsAfter - numEventsBefore); - } + logger.info("numEventsAfter={}", numEventsAfter); + + assertEquals(1, numEventsAfter - numEventsBefore); + } @Test public void testSerialization() throws Exception { @@ -876,7 +880,7 @@ public class ControlLoopOperationManagerTest { clom.startOperation(onsetEvent); assertTrue(clom.isOperationRunning()); - + clom = Serializer.roundTrip(clom); assertNotNull(clom); assertTrue(clom.isOperationRunning()); @@ -893,7 +897,7 @@ public class ControlLoopOperationManagerTest { assertEquals(PolicyResult.FAILURE, clom.onResponse(soRw)); assertFalse(clom.isOperationRunning()); assertEquals(1, clom.getHistory().size()); - + clom = Serializer.roundTrip(clom); assertNotNull(clom); assertFalse(clom.isOperationRunning()); @@ -901,7 +905,7 @@ public class ControlLoopOperationManagerTest { System.setProperty("OperationsHistoryPU", "TestOperationsHistoryPU"); assertEquals(PolicyResult.FAILURE, clom.onResponse(soRw)); - + clom = Serializer.roundTrip(clom); assertNotNull(clom); assertFalse(clom.isOperationRunning()); diff --git a/controlloop/common/eventmanager/src/test/resources/AaiCqResponse.json b/controlloop/common/eventmanager/src/test/resources/AaiCqResponse.json new file mode 100644 index 000000000..63d6f79ac --- /dev/null +++ b/controlloop/common/eventmanager/src/test/resources/AaiCqResponse.json @@ -0,0 +1,673 @@ +{ + "results": [ + { + "vserver": { + "vserver-id": "e7f1db09-ff78-44fc-b256-69095c5556fb", + "vserver-name": "vfw-vm-0201-2", + "vserver-name2": "vfw-vm-0201-2", + "prov-status": "ACTIVE", + "vserver-selflink": "http://ecompctl1.research.att.com:8774/v2/3f2aaef74ecb4b19b35e26d0849fe9a2/servers/e7f1db09-ff78-44fc-b256-69095c5556fb", + "in-maint": false, + "is-closed-loop-disabled": false, + "resource-version": "1549553422524", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "17044ef4-e7f3-46a1-af03-e2aa562f23ac" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "TestVM-Vnf-0201-1" + } + ] + }, + { + "related-to": "vnfc", + "related-link": "/aai/v11/network/vnfcs/vnfc/vfw", + "relationship-data": [ + { + "relationship-key": "vnfc.vnfc-name", + "relationship-value": "vfw" + } + ] + }, + { + "related-to": "vf-module", + "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vf-modules/vf-module/33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "17044ef4-e7f3-46a1-af03-e2aa562f23ac" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2" + } + ] + }, + { + "related-to": "flavor", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/2", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "flavor.flavor-id", + "relationship-value": "2" + } + ], + "related-to-property": [ + { + "property-key": "flavor.flavor-name", + "property-value": "m1.small" + } + ] + }, + { + "related-to": "image", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/84be7136-301f-4f47-9585-3a2e0f9534af", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "image.image-id", + "relationship-value": "84be7136-301f-4f47-9585-3a2e0f9534af" + } + ], + "related-to-property": [ + { + "property-key": "image.image-name", + "property-value": "unknown" + } + ] + } + ] + } + } + }, + { + "generic-vnf": { + "vnf-id": "7b202620-2936-4b0d-b09c-60b411f10f64", + "vnf-name": "vLoadBalancerMS-Vnf-0211-1", + "vnf-type": "vLoadBalancerMS/vLoadBalancerMS 0", + "prov-status": "ACTIVE", + "equipment-role": "vLB", + "orchestration-status": "Active", + "ipv4-oam-address": "10.0.150.1", + "in-maint": true, + "is-closed-loop-disabled": false, + "resource-version": "1552311656338", + "model-invariant-id": "724ab1cf-6120-49e8-b909-849963bed1d6", + "model-version-id": "9d5944d8-2267-4799-824a-0f824e9a978d", + "model-customization-id": "efcd576d-a05e-4798-bb68-79e7d9c80f4c", + "nf-type": "ONAP-LOADBALANCER", + "nf-function": "LOADBALANCER", + "nf-role": "vLB", + "nf-naming-code": "vlb", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/101b8fc1-1796-4db1-a4e7-fe39c6a51558/service-data/vnfs/vnf/7b202620-2936-4b0d-b09c-60b411f10f64/vnf-data/vnf-topology/", + "relationship-list": { + "relationship": [ + { + "related-to": "service-instance", + "related-link": "/aai/v11/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vLB/service-instances/service-instance/101b8fc1-1796-4db1-a4e7-fe39c6a51558", + "relationship-data": [ + { + "relationship-key": "customer.global-customer-id", + "relationship-value": "Demonstration" + }, + { + "relationship-key": "service-subscription.service-type", + "relationship-value": "vLB" + }, + { + "relationship-key": "service-instance.service-instance-id", + "relationship-value": "101b8fc1-1796-4db1-a4e7-fe39c6a51558" + } + ], + "related-to-property": [ + { + "property-key": "service-instance.service-instance-name", + "property-value": "vLoadBalancerMS-0211-1" + } + ] + }, + { + "related-to": "platform", + "related-link": "/aai/v11/business/platforms/platform/Test-Platform", + "relationship-data": [ + { + "relationship-key": "platform.platform-name", + "relationship-value": "Test-Platform" + } + ] + }, + { + "related-to": "line-of-business", + "related-link": "/aai/v11/business/lines-of-business/line-of-business/Test-Business", + "relationship-data": [ + { + "relationship-key": "line-of-business.line-of-business-name", + "relationship-value": "Test-Business" + } + ] + }, + { + "related-to": "vserver", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/58ca8df0-17b8-4aa2-8766-9c6c1a12cec8", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2" + }, + { + "relationship-key": "vserver.vserver-id", + "relationship-value": "58ca8df0-17b8-4aa2-8766-9c6c1a12cec8" + } + ], + "related-to-property": [ + { + "property-key": "vserver.vserver-name", + "property-value": "vdns-ms-0211-1" + } + ] + }, + { + "related-to": "vserver", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/6c3b3714-e36c-45af-9f16-7d3a73d99497", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2" + }, + { + "relationship-key": "vserver.vserver-id", + "relationship-value": "6c3b3714-e36c-45af-9f16-7d3a73d99497" + } + ], + "related-to-property": [ + { + "property-key": "vserver.vserver-name", + "property-value": "vlb-ms-0211-1" + } + ] + }, + { + "related-to": "availability-zone", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "availability-zone.availability-zone-name", + "relationship-value": "nova" + } + ] + } + ] + }, + "vf-modules": { + "vf-module": [ + { + "vf-module-id": "e46c6636-9ce5-4b77-bb1b-455ce9edc892", + "vf-module-name": "vLoadBalancerMS-0211-1", + "heat-stack-id": "vLoadBalancerMS-0211-1/73360253-2dfe-46f6-bcd6-8662a81238ea", + "orchestration-status": "Active", + "is-base-vf-module": true, + "resource-version": "1552311559802", + "model-invariant-id": "d263fc6d-cfce-4e20-8337-e06f48b474e6", + "model-version-id": "24c0aa10-3979-402c-ad98-20124751b551", + "model-customization-id": "65382eb1-db84-466c-b9d7-4e0f1ba7105f", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/101b8fc1-1796-4db1-a4e7-fe39c6a51558/service-data/vnfs/vnf/7b202620-2936-4b0d-b09c-60b411f10f64/vnf-data/vf-modules/vf-module/e46c6636-9ce5-4b77-bb1b-455ce9edc892/vf-module-data/vf-module-topology/", + "relationship-list": { + "relationship": [ + { + "related-to": "vserver", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/58ca8df0-17b8-4aa2-8766-9c6c1a12cec8", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2" + }, + { + "relationship-key": "vserver.vserver-id", + "relationship-value": "58ca8df0-17b8-4aa2-8766-9c6c1a12cec8" + } + ], + "related-to-property": [ + { + "property-key": "vserver.vserver-name", + "property-value": "vdns-ms-0211-1" + } + ] + }, + { + "related-to": "vserver", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/6c3b3714-e36c-45af-9f16-7d3a73d99497", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2" + }, + { + "relationship-key": "vserver.vserver-id", + "relationship-value": "6c3b3714-e36c-45af-9f16-7d3a73d99497" + } + ], + "related-to-property": [ + { + "property-key": "vserver.vserver-name", + "property-value": "vlb-ms-0211-1" + } + ] + } + ] + } + } + ] + } + } + }, + { + "service-instance": { + "service-instance-id": "101b8fc1-1796-4db1-a4e7-fe39c6a51558", + "service-instance-name": "vLoadBalancerMS-0211-1", + "environment-context": "General_Revenue-Bearing", + "workload-context": "Production", + "model-invariant-id": "1008a768-1b67-407e-88c6-58c82b34ef42", + "model-version-id": "81f8c1cd-f664-4450-b3a4-be645613ab32", + "resource-version": "1552311350334", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/101b8fc1-1796-4db1-a4e7-fe39c6a51558/service-data/service-topology/", + "orchestration-status": "Active", + "relationship-list": { + "relationship": [ + { + "related-to": "project", + "related-link": "/aai/v11/business/projects/project/Test-Project", + "relationship-data": [ + { + "relationship-key": "project.project-name", + "relationship-value": "Test-Project" + } + ] + }, + { + "related-to": "generic-vnf", + "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/7b202620-2936-4b0d-b09c-60b411f10f64", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "7b202620-2936-4b0d-b09c-60b411f10f64" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "vLoadBalancerMS-Vnf-0211-1" + } + ] + }, + { + "related-to": "owning-entity", + "related-link": "/aai/v11/business/owning-entities/owning-entity/bb94a687-4f3b-40a3-914e-e98037d5ebd2", + "relationship-data": [ + { + "relationship-key": "owning-entity.owning-entity-id", + "relationship-value": "bb94a687-4f3b-40a3-914e-e98037d5ebd2" + } + ] + } + ] + } + } + }, + { + "generic-vnf": { + "vnf-id": "17044ef4-e7f3-46a1-af03-e2aa562f23ac", + "vnf-name": "TestVM-Vnf-0201-1", + "vnf-type": "TestVM/TestVM 0", + "prov-status": "ACTIVE", + "equipment-role": "", + "orchestration-status": "Active", + "ipv4-oam-address": "10.0.70.1", + "in-maint": true, + "is-closed-loop-disabled": false, + "resource-version": "1549041636264", + "model-invariant-id": "6a4d7971-0778-4655-9eab-9d6031c7ad57", + "model-version-id": "fb6c673c-e5b6-4e0a-9baf-5e0089784de9", + "model-customization-id": "706a3100-dbe5-442e-86c3-c7b823abbec2", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vnf-topology/", + "relationship-list": { + "relationship": [ + { + "related-to": "service-instance", + "related-link": "/aai/v11/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vFW/service-instances/service-instance/d41f8217-d464-4458-bf0a-fba33a0f1b31", + "relationship-data": [ + { + "relationship-key": "customer.global-customer-id", + "relationship-value": "Demonstration" + }, + { + "relationship-key": "service-subscription.service-type", + "relationship-value": "vFW" + }, + { + "relationship-key": "service-instance.service-instance-id", + "relationship-value": "d41f8217-d464-4458-bf0a-fba33a0f1b31" + } + ], + "related-to-property": [ + { + "property-key": "service-instance.service-instance-name", + "property-value": "TestVM-Service-0201-1" + } + ] + }, + { + "related-to": "platform", + "related-link": "/aai/v11/business/platforms/platform/Test-Platform", + "relationship-data": [ + { + "relationship-key": "platform.platform-name", + "relationship-value": "Test-Platform" + } + ] + }, + { + "related-to": "line-of-business", + "related-link": "/aai/v11/business/lines-of-business/line-of-business/Test-Business", + "relationship-data": [ + { + "relationship-key": "line-of-business.line-of-business-name", + "relationship-value": "Test-Business" + } + ] + }, + { + "related-to": "vserver", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/e7f1db09-ff78-44fc-b256-69095c5556fb", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2" + }, + { + "relationship-key": "vserver.vserver-id", + "relationship-value": "e7f1db09-ff78-44fc-b256-69095c5556fb" + } + ], + "related-to-property": [ + { + "property-key": "vserver.vserver-name", + "property-value": "vfw-vm-0201-2" + } + ] + }, + { + "related-to": "availability-zone", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionTwo/availability-zones/availability-zone/zone-1", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionTwo" + }, + { + "relationship-key": "availability-zone.availability-zone-name", + "relationship-value": "zone-1" + } + ] + } + ] + }, + "vf-modules": { + "vf-module": [ + { + "vf-module-id": "0afde97a-3e3f-4597-aec3-e5488c0f20b7", + "vf-module-name": "TestVM-0201-1", + "heat-stack-id": "TestVM-0201-1/aee4d7e5-b4a0-4261-b3cf-bb23348a3d99", + "orchestration-status": "Active", + "is-base-vf-module": true, + "resource-version": "1549039401119", + "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd", + "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d", + "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/0afde97a-3e3f-4597-aec3-e5488c0f20b7/vf-module-data/vf-module-topology/" + }, + { + "vf-module-id": "33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2", + "vf-module-name": "TestVM-0201-2", + "heat-stack-id": "TestVM-0201-2/1b9db6b8-620b-46f1-935a-8a61c294a98b", + "orchestration-status": "Active", + "is-base-vf-module": true, + "resource-version": "1549041447373", + "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd", + "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d", + "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2/vf-module-data/vf-module-topology/", + "relationship-list": { + "relationship": [ + { + "related-to": "vserver", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/e7f1db09-ff78-44fc-b256-69095c5556fb", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2" + }, + { + "relationship-key": "vserver.vserver-id", + "relationship-value": "e7f1db09-ff78-44fc-b256-69095c5556fb" + } + ], + "related-to-property": [ + { + "property-key": "vserver.vserver-name", + "property-value": "vfw-vm-0201-2" + } + ] + } + ] + } + } + ] + } + } + }, + { + "vf-module": { + "vf-module-id": "0afde97a-3e3f-4597-aec3-e5488c0f20b7", + "vf-module-name": "TestVM-0201-1", + "heat-stack-id": "TestVM-0201-1/aee4d7e5-b4a0-4261-b3cf-bb23348a3d99", + "orchestration-status": "Active", + "is-base-vf-module": true, + "resource-version": "1549039401119", + "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd", + "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d", + "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/0afde97a-3e3f-4597-aec3-e5488c0f20b7/vf-module-data/vf-module-topology/" + } + }, + { + "vf-module": { + "vf-module-id": "33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2", + "vf-module-name": "TestVM-0201-2", + "heat-stack-id": "TestVM-0201-2/1b9db6b8-620b-46f1-935a-8a61c294a98b", + "orchestration-status": "Active", + "is-base-vf-module": true, + "resource-version": "1549041447373", + "model-invariant-id": "6af68fdb-6479-43e2-8989-938f06c994bd", + "model-version-id": "16d1834e-d834-431f-b064-98c469c6505d", + "model-customization-id": "29ffb122-22c8-48d2-b152-b52d9e81e910", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/d41f8217-d464-4458-bf0a-fba33a0f1b31/service-data/vnfs/vnf/17044ef4-e7f3-46a1-af03-e2aa562f23ac/vnf-data/vf-modules/vf-module/33f9e03d-2fbd-4e9c-8e73-ce6b12f0b3d2/vf-module-data/vf-module-topology/", + "relationship-list": { + "relationship": [ + { + "related-to": "vserver", + "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3f2aaef74ecb4b19b35e26d0849fe9a2/vservers/vserver/e7f1db09-ff78-44fc-b256-69095c5556fb", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "CloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "RegionOne" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3f2aaef74ecb4b19b35e26d0849fe9a2" + }, + { + "relationship-key": "vserver.vserver-id", + "relationship-value": "e7f1db09-ff78-44fc-b256-69095c5556fb" + } + ], + "related-to-property": [ + { + "property-key": "vserver.vserver-name", + "property-value": "vfw-vm-0201-2" + } + ] + } + ] + } + } + }, + { + "tenant": { + "tenant-id": "tenant1-16197-as988q", + "tenant-name": "tenant-name-16197-as988q", + "resource-version": "1550769793637", + "vservers": { + "vserver": [ + { + "vserver-id": "vserver1-16197-as988q", + "vserver-name": "vserverName", + "vserver-name2": "vserverTE-name2-as988q", + "prov-status": "ACTIVE", + "vserver-selflink": "TRINITY vserverLink", + "in-maint": false, + "is-closed-loop-disabled": false, + "resource-version": "1550769794551", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v16/network/generic-vnfs/generic-vnf/VNF1-16197-as988q", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "VNF1-16197-as988q" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "vnf1Name" + } + ] + } + ] + } + } + ] + } + } + }, + { + "cloud-region": { + "cloud-owner": "co-16197-01-as988q", + "cloud-region-id": "cr-16197-01-as988q", + "resource-version": "1550769792672", + "orchestration-disabled": false, + "in-maint": false, + "tenants": { + "tenant": [ + { + "tenant-id": "tenant1-16197-as988q", + "tenant-name": "tenant-name-16197-as988q", + "resource-version": "1550769793637" + } + ] + } + } + } + ] +} -- cgit 1.2.3-korg