/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * 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. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.openecomp.sdc.be.model.jsonjanusgraph.operations; import static org.assertj.core.api.Assertions.assertThat; import fj.data.Either; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.openecomp.sdc.be.dao.api.ActionStatus; import org.openecomp.sdc.be.dao.janusgraph.JanusGraphDao; import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus; import org.openecomp.sdc.be.dao.jsongraph.GraphVertex; import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum; import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum; import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition; import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition; import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum; import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; import org.openecomp.sdc.be.model.ModelTestBase; import org.openecomp.sdc.be.model.jsonjanusgraph.enums.JsonConstantKeysEnum; import org.openecomp.sdc.be.model.jsonjanusgraph.utils.GraphTestUtils; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; /** * Created by yavivi on 21/03/2018. */ @SpringJUnitConfig(locations = {"classpath:application-context-test.xml", "classpath:healing-context-test.xml"}) public class ArchiveOperationTest extends ModelTestBase { private static final String CI_UID_RES1_CP = "cp_uid"; private static final String CI_UID_RES2_VL = "vl_uid"; private static final String CI_UID_SVC_PROXY = "svc_proxy_uid"; GraphVertex archiveVertex; GraphVertex catalogVertex; @Resource private ArchiveOperation archiveOperation; @Resource private JanusGraphDao janusGraphDao; private boolean isInitialized; private GraphVertex serviceVertex1; private GraphVertex archivedVertex1; private GraphVertex serviceVertex1_0; private GraphVertex serviceVertex1_1; private GraphVertex serviceVertex2_0; private GraphVertex serviceVertex3_0; private GraphVertex serviceVertex3_1; private GraphVertex serviceVertex0_1; private GraphVertex serviceVertex0_2; private GraphVertex serviceVertex0_3; private GraphVertex serviceVertex0_4; private GraphVertex serviceVertex0_5; //Composition Elements private GraphVertex compositionService; private GraphVertex compositionResource1; private GraphVertex compositionResource2; private GraphVertex compositionServiceProxy; private GraphVertex compositionAnotherService; //For VSP Archive Notification private GraphVertex vfResource0_1; private GraphVertex vfResource0_2; private GraphVertex vfResource1_0; private String csarUuid = "123456789"; @BeforeAll public static void initTest() { ModelTestBase.init(); } @BeforeEach public void beforeTest() { if (!isInitialized) { GraphTestUtils.clearGraph(janusGraphDao); initGraphForTest(); isInitialized = true; } } @Test public void testArchiveComponentSingleVersion() { String componentId = serviceVertex1.getUniqueId(); Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(componentId); assertThat(actionStatus.isLeft()).isTrue(); assertArchived(serviceVertex1.getUniqueId()); } @Test public void testArchiveComponentFailsWhenInCheckoutSingleVersion() { checkoutComponent(serviceVertex1); String componentId = serviceVertex1.getUniqueId(); Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(componentId); assertThat(actionStatus.isLeft()).isFalse(); assertThat(actionStatus.right().value()).isEqualTo(ActionStatus.INVALID_SERVICE_STATE); } @Test public void testArchiveWithWrongId() { Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent("fakeComponentId"); assertThat(actionStatus.isLeft()).isFalse(); assertThat(actionStatus.right().value()).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND); } @Test public void testAlreadyArchived() { Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(archivedVertex1.getUniqueId()); assertThat(actionStatus.isLeft()).isTrue(); assertThat(actionStatus.left().value()).containsExactly(archivedVertex1.getUniqueId()); } @Test public void testScenario2_archive_1_0() { Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(serviceVertex1_0.getUniqueId()); assertThat(actionStatus.isLeft()).isTrue(); assertThat(actionStatus.left().value()).containsExactlyInAnyOrder(serviceVertex1_0.getUniqueId(), serviceVertex1_1.getUniqueId()); assertArchived(serviceVertex1_0.getUniqueId()); assertArchived(serviceVertex1_1.getUniqueId()); } @Test public void testScenario2_archive_1_1() { Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(serviceVertex1_1.getUniqueId()); assertThat(actionStatus.left().value()).containsExactlyInAnyOrder(serviceVertex1_0.getUniqueId(), serviceVertex1_1.getUniqueId()); assertArchived(serviceVertex1_0.getUniqueId()); assertArchived(serviceVertex1_1.getUniqueId()); } @Test public void testScenario4_oneLowOneHighestVersion() { Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(serviceVertex0_2.getUniqueId()); assertThat(actionStatus.left().value()).containsExactlyInAnyOrder(serviceVertex0_2.getUniqueId(), serviceVertex0_1.getUniqueId(), serviceVertex0_3.getUniqueId(), serviceVertex0_4.getUniqueId(), serviceVertex0_5.getUniqueId()); assertArchived(serviceVertex0_1.getUniqueId()); assertArchived(serviceVertex0_2.getUniqueId()); assertArchived(serviceVertex0_3.getUniqueId()); assertArchived(serviceVertex0_4.getUniqueId()); assertArchived(serviceVertex0_5.getUniqueId()); actionStatus = this.archiveOperation.restoreComponent(serviceVertex0_2.getUniqueId()); assertThat(actionStatus.isLeft()).isTrue(); assertThat(actionStatus.left().value()).containsExactlyInAnyOrder(serviceVertex0_2.getUniqueId(), serviceVertex0_1.getUniqueId(), serviceVertex0_3.getUniqueId(), serviceVertex0_4.getUniqueId(), serviceVertex0_5.getUniqueId()); } /////////////// Continue Here ////////////////// @Test public void testScenario4_archiveFromNonHighest() { Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(serviceVertex0_2.getUniqueId()); assertArchived(serviceVertex0_1.getUniqueId()); assertArchived(serviceVertex0_2.getUniqueId()); assertArchived(serviceVertex0_3.getUniqueId()); assertArchived(serviceVertex0_4.getUniqueId()); assertArchived(serviceVertex0_5.getUniqueId()); actionStatus = this.archiveOperation.restoreComponent(serviceVertex0_3.getUniqueId()); assertRestored(serviceVertex0_1.getUniqueId()); assertRestored(serviceVertex0_2.getUniqueId()); assertRestored(serviceVertex0_3.getUniqueId()); assertRestored(serviceVertex0_4.getUniqueId()); assertRestored(serviceVertex0_5.getUniqueId()); } @Test public void testArchiveFailsWhenHighestVersionIsInCheckoutState() { checkoutComponent(serviceVertex0_5); Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(serviceVertex0_2.getUniqueId()); assertThat(actionStatus.right().value()).isEqualTo(ActionStatus.INVALID_SERVICE_STATE); } @Test public void testScenario3_archive_3_0() { Either, ActionStatus> actionStatus = this.archiveOperation.archiveComponent(serviceVertex3_0.getUniqueId()); assertArchived(serviceVertex3_0.getUniqueId()); assertArchived(serviceVertex3_1.getUniqueId()); assertArchivedProps(serviceVertex2_0.getUniqueId()); } @Test public void testArchivedOriginsCalculation() { //Archive the CP resource this.archiveOperation.archiveComponent(this.compositionResource1.getUniqueId()); this.archiveOperation.archiveComponent(this.compositionServiceProxy.getUniqueId()); List ciWithArchivedOrigins = this.archiveOperation.setArchivedOriginsFlagInComponentInstances(this.compositionService); //Validate that method returns the CI of CP assertThat(ciWithArchivedOrigins).containsExactlyInAnyOrder(CI_UID_RES1_CP, CI_UID_SVC_PROXY); Map compositionsJson = (Map) this.compositionService.getJson(); assertThat(compositionsJson).isNotNull(); assertThat(compositionsJson.get(JsonConstantKeysEnum.COMPOSITION.getValue())).isNotNull(); CompositionDataDefinition composition = compositionsJson.get(JsonConstantKeysEnum.COMPOSITION.getValue()); //Get all component instances from composition Map componentInstances = composition.getComponentInstances(); for (ComponentInstanceDataDefinition ci : componentInstances.values()) { //Verify that exactly 2 CIs are marked as archived if (ci.getUniqueId().equals(CI_UID_RES1_CP) || ci.getUniqueId().equals(CI_UID_SVC_PROXY)) { assertThat(ci.isOriginArchived()).isTrue(); } } } @Test public void testNoArchivedOriginsCalculation() { List ciWithArchivedOrigins = this.archiveOperation.setArchivedOriginsFlagInComponentInstances(this.compositionService); //Validate that method returns the CI of CP assertThat(ciWithArchivedOrigins).isEmpty(); } @Test public void testOnVspArchivedAndRestored() { this.archiveOperation.onVspArchived(csarUuid); //assertOnCommit(); assertOnVspArchived(true); this.archiveOperation.onVspRestored(csarUuid); //assertOnCommit(); assertOnVspArchived(false); //Not Found CSAR UUID ActionStatus result = this.archiveOperation.onVspRestored("fakeUuid"); //assertOnCommit(); assertThat(result).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND); } private void assertOnVspArchived(boolean expectedValue) { GraphVertex v = janusGraphDao.getVertexById(vfResource0_1.getUniqueId()).left().value(); assertThat(v.getMetadataProperty(GraphPropertyEnum.IS_VSP_ARCHIVED)).isEqualTo(expectedValue); v = janusGraphDao.getVertexById(vfResource0_2.getUniqueId()).left().value(); assertThat(v.getMetadataProperty(GraphPropertyEnum.IS_VSP_ARCHIVED)).isEqualTo(expectedValue); v = janusGraphDao.getVertexById(vfResource1_0.getUniqueId()).left().value(); assertThat(v.getMetadataProperty(GraphPropertyEnum.IS_VSP_ARCHIVED)).isEqualTo(expectedValue); } /************************** * Utility Methods *************************/ private void checkoutComponent(GraphVertex serviceVertex0_5) { Either vE = janusGraphDao.getVertexById(serviceVertex0_5.getUniqueId()); GraphVertex v = vE.left().value(); v.addMetadataProperty(GraphPropertyEnum.STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT); v.setJsonMetadataField(JsonPresentationFields.LIFECYCLE_STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT); janusGraphDao.updateVertex(v); assertOnCommit(); } private void assertOnCommit() { final JanusGraphOperationStatus commit = this.janusGraphDao.commit(); assertThat(commit).isEqualTo(JanusGraphOperationStatus.OK); } private void assertArchived(String componentUniqueId) { assertArchivedOrRestored(ArchiveOperation.Action.ARCHIVE, componentUniqueId); } private void assertRestored(String componentUniqueId) { assertArchivedOrRestored(ArchiveOperation.Action.RESTORE, componentUniqueId); } private void assertArchivedOrRestored(ArchiveOperation.Action action, String componentUniqueId) { GraphVertex v = janusGraphDao.getVertexById(componentUniqueId).left().value(); EdgeLabelEnum requiredEdge = action == ArchiveOperation.Action.ARCHIVE ? EdgeLabelEnum.ARCHIVE_ELEMENT : EdgeLabelEnum.CATALOG_ELEMENT; EdgeLabelEnum otherEdge = action == ArchiveOperation.Action.ARCHIVE ? EdgeLabelEnum.CATALOG_ELEMENT : EdgeLabelEnum.ARCHIVE_ELEMENT; GraphVertex parent = null; Either otherLookup = null; Boolean isHighest = (Boolean) v.getMetadataProperty(GraphPropertyEnum.IS_HIGHEST_VERSION); if (isHighest != null && isHighest) { //Highest version are linked to Archive/Catalog Root parent = janusGraphDao.getParentVertex(v, requiredEdge, JsonParseFlagEnum.NoParse).left().value(); otherLookup = janusGraphDao.getParentVertex(v, otherEdge, JsonParseFlagEnum.NoParse); assertThat(otherLookup.isRight()).isTrue(); //Verify that component is not linked to Catalog/Archive Root assertThat(parent.getUniqueId()).isEqualTo(action == ArchiveOperation.Action.ARCHIVE ? this.archiveVertex.getUniqueId() : this.catalogVertex.getUniqueId()); //Verify that parent is indeed Archive Root } assertArchivedOrRestoredProps(action, v); } private void assertArchivedProps(String uniqueId) { GraphVertex v = janusGraphDao.getVertexById(uniqueId).left().value(); assertArchivedOrRestoredProps(ArchiveOperation.Action.ARCHIVE, v); } private void assertRestoredProps(String uniqueId) { GraphVertex v = janusGraphDao.getVertexById(uniqueId).left().value(); assertArchivedOrRestoredProps(ArchiveOperation.Action.RESTORE, v); } private void assertArchivedOrRestoredProps(ArchiveOperation.Action action, GraphVertex v) { Object isArchived = v.getMetadataProperty(GraphPropertyEnum.IS_ARCHIVED); Object archiveTime = v.getMetadataProperty(GraphPropertyEnum.ARCHIVE_TIME); assertThat(isArchived).isNotNull().isEqualTo(action == ArchiveOperation.Action.ARCHIVE ? true : false); assertThat(archiveTime).isNotNull(); } /******************************* * Preperation Methods *******************************/ private void initGraphForTest() { //Create Catalog Root this.catalogVertex = GraphTestUtils.createRootCatalogVertex(janusGraphDao); //Create Archive Root this.archiveVertex = GraphTestUtils.createRootArchiveVertex(janusGraphDao); createScenario1_SingleVersionNode(); createScenario2_TwoHighestVersions(); createScenario3_TwoHighestVersionsOneLowest(); createMiscServices(); createServiceCompositionForCalculatingArchivedOrigins(); createScenario4_1Highest4LowestVersions(); createResourcesForArchivedVsp(); assertOnCommit(); } private void createScenario1_SingleVersionNode() { //Create Service for Scenario 1 Tests (1 Service) this.serviceVertex1 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); //Connect Service to Catalog Root janusGraphDao.createEdge(catalogVertex, serviceVertex1, EdgeLabelEnum.CATALOG_ELEMENT, null); } private void createScenario2_TwoHighestVersions() { //Create Service for Scenario 2 Tests (1 Service) this.serviceVertex1_0 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); this.serviceVertex1_1 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); janusGraphDao.createEdge(serviceVertex1_0, serviceVertex1_1, EdgeLabelEnum.VERSION, null); //Connect 1.0 and 1.1 to Catalog Root janusGraphDao .createEdge(catalogVertex, serviceVertex1_0, EdgeLabelEnum.CATALOG_ELEMENT, null); janusGraphDao .createEdge(catalogVertex, serviceVertex1_1, EdgeLabelEnum.CATALOG_ELEMENT, null); } private void createScenario3_TwoHighestVersionsOneLowest() { //Create Service for Scenario 1 Tests (1 Service) this.serviceVertex2_0 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForNonHighestVersion()); //NonHighestVersion this.serviceVertex3_0 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); this.serviceVertex3_1 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); //Connect version edges janusGraphDao.createEdge(serviceVertex2_0, serviceVertex3_0, EdgeLabelEnum.VERSION, null); janusGraphDao.createEdge(serviceVertex3_0, serviceVertex3_1, EdgeLabelEnum.VERSION, null); //Connect 3.0 and 3.1 to Catalog Root janusGraphDao .createEdge(catalogVertex, serviceVertex3_0, EdgeLabelEnum.CATALOG_ELEMENT, null); janusGraphDao .createEdge(catalogVertex, serviceVertex3_1, EdgeLabelEnum.CATALOG_ELEMENT, null); } private void createScenario4_1Highest4LowestVersions() { //2 Lowest version only this.serviceVertex0_1 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForNonHighestVersion()); this.serviceVertex0_2 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForNonHighestVersion()); this.serviceVertex0_3 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForNonHighestVersion()); this.serviceVertex0_4 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForNonHighestVersion()); this.serviceVertex0_5 = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); janusGraphDao.createEdge(serviceVertex0_1, serviceVertex0_2, EdgeLabelEnum.VERSION, null); janusGraphDao.createEdge(serviceVertex0_2, serviceVertex0_3, EdgeLabelEnum.VERSION, null); janusGraphDao.createEdge(serviceVertex0_3, serviceVertex0_4, EdgeLabelEnum.VERSION, null); janusGraphDao.createEdge(serviceVertex0_4, serviceVertex0_5, EdgeLabelEnum.VERSION, null); janusGraphDao .createEdge(catalogVertex, serviceVertex0_5, EdgeLabelEnum.CATALOG_ELEMENT, null); } private void createResourcesForArchivedVsp() { Map vfPropsNonHighest = propsForNonHighestVersion(); Map vfPropsHighest = propsForNonHighestVersion(); vfPropsNonHighest.put(GraphPropertyEnum.CSAR_UUID, csarUuid); vfPropsNonHighest.put(GraphPropertyEnum.IS_VSP_ARCHIVED, false); vfPropsHighest.put(GraphPropertyEnum.CSAR_UUID, csarUuid); vfPropsHighest.put(GraphPropertyEnum.IS_VSP_ARCHIVED, false); this.vfResource0_1 = GraphTestUtils.createResourceVertex(janusGraphDao, vfPropsNonHighest, ResourceTypeEnum.VF); this.vfResource0_2 = GraphTestUtils.createResourceVertex(janusGraphDao, vfPropsNonHighest, ResourceTypeEnum.VF); this.vfResource1_0 = GraphTestUtils.createResourceVertex(janusGraphDao, vfPropsHighest, ResourceTypeEnum.VF); janusGraphDao.createEdge(vfResource0_1, vfResource0_2, EdgeLabelEnum.VERSION, null); janusGraphDao.createEdge(vfResource0_2, vfResource1_0, EdgeLabelEnum.VERSION, null); } private void createMiscServices() { //Create Service for Scenario 1 Tests (1 Service) this.archivedVertex1 = GraphTestUtils.createServiceVertex(janusGraphDao, new HashMap<>()); //Connect Service to Catalog Root janusGraphDao.createEdge(archiveVertex, archivedVertex1, EdgeLabelEnum.ARCHIVE_ELEMENT, null); } private void createServiceCompositionForCalculatingArchivedOrigins() { //Service that point to another service in composition this.compositionService = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); this.compositionAnotherService = GraphTestUtils.createServiceVertex(janusGraphDao, propsForHighestVersion()); this.compositionResource1 = GraphTestUtils.createResourceVertex(janusGraphDao, propsForHighestVersion(), ResourceTypeEnum.CP); this.compositionResource2 = GraphTestUtils.createResourceVertex(janusGraphDao, propsForHighestVersion(), ResourceTypeEnum.VL); this.compositionServiceProxy = GraphTestUtils.createResourceVertex(janusGraphDao, propsForHighestVersion(), ResourceTypeEnum.ServiceProxy); janusGraphDao .createEdge(compositionService, compositionResource1, EdgeLabelEnum.INSTANCE_OF, null); janusGraphDao .createEdge(compositionService, compositionResource2, EdgeLabelEnum.INSTANCE_OF, null); janusGraphDao .createEdge(compositionService, compositionServiceProxy, EdgeLabelEnum.INSTANCE_OF, null); janusGraphDao .createEdge(compositionService, compositionAnotherService, EdgeLabelEnum.PROXY_OF, null); createAndAttachCompositionJson(compositionService); } private void createAndAttachCompositionJson(GraphVertex compositionService) { //Full composition json Map compositions = new HashMap<>(); //Single composition data CompositionDataDefinition composition = new CompositionDataDefinition(); //Instances Map Map instances = new HashMap<>(); //Prepare Instances Map ComponentInstanceDataDefinition instance = new ComponentInstanceDataDefinition(); instance.setUniqueId(CI_UID_RES1_CP); instance.setComponentUid(compositionResource1.getUniqueId()); instances.put(CI_UID_RES1_CP, instance); instance = new ComponentInstanceDataDefinition(); instance.setUniqueId(CI_UID_RES2_VL); instance.setComponentUid(compositionResource2.getUniqueId()); instances.put(CI_UID_RES2_VL, instance); instance = new ComponentInstanceDataDefinition(); instance.setUniqueId(CI_UID_SVC_PROXY); instance.setComponentUid(compositionServiceProxy.getUniqueId()); instances.put(CI_UID_SVC_PROXY, instance); //Add Instances to Composition composition.setComponentInstances(instances); //Add to full composition compositions.put(JsonConstantKeysEnum.COMPOSITION.getValue(), composition); //Add Full Json to vertex compositionService.setJson(compositions); //System.out.println(JsonParserUtils.toJson(compositions)); janusGraphDao.updateVertex(compositionService); } private Map propsForHighestVersion() { Map props = new HashMap(); props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true); props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKIN); return props; } private Map propsForNonHighestVersion() { Map props = new HashMap(); props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, false); props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKIN); return props; } }