From b713fc2e83452517654c9e37c6380cb68bfbafe7 Mon Sep 17 00:00:00 2001 From: sblimkie Date: Fri, 16 Mar 2018 15:29:41 -0400 Subject: [PATCH] Allow ingestion of edge schema at deploy time Gizmo to optionally allow a deployer to drop in a custom edge schema at deploy time. Change-Id: I5b7ccca79bc4fdb79629d308f517d4446adeb971 Issue-ID: AAI-889 Signed-off-by: sblimkie --- .../org/onap/schema/RelationshipSchemaLoader.java | 40 +- .../onap/schema/RelationshipSchemaLoaderTest.java | 14 + .../org/onap/schema/RelationshipSchemaTest.java | 29 +- src/test/resources/model/DbEdgeRules_v11.json | 1962 -------------------- 4 files changed, 61 insertions(+), 1984 deletions(-) delete mode 100644 src/test/resources/model/DbEdgeRules_v11.json diff --git a/src/main/java/org/onap/schema/RelationshipSchemaLoader.java b/src/main/java/org/onap/schema/RelationshipSchemaLoader.java index 761f6ad..0e10fc3 100644 --- a/src/main/java/org/onap/schema/RelationshipSchemaLoader.java +++ b/src/main/java/org/onap/schema/RelationshipSchemaLoader.java @@ -29,8 +29,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedSet; import java.util.Timer; import java.util.TimerTask; @@ -48,6 +50,7 @@ import org.onap.crud.exception.CrudException; import org.onap.crud.logging.CrudServiceMsgs; import org.onap.crud.util.CrudServiceConstants; import org.onap.crud.util.FileWatcher; +import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; @@ -71,7 +74,7 @@ public class RelationshipSchemaLoader { } public synchronized static void loadModels(String version) throws CrudException { - String pattern = String.format(".*(%s)" + fileExt, version); + String pattern = String.format("DbEdgeRules.*(%s)" + fileExt, version); load(Pattern.compile(pattern), Pattern.compile(edgePropsFiles + version + fileExt)); } @@ -111,20 +114,31 @@ public class RelationshipSchemaLoader { private static void load(Pattern rulesPattern, Pattern edgePropsPattern) throws CrudException { ClassLoader cl = RelationshipSchemaLoader.class.getClassLoader(); ResourcePatternResolver rulesResolver = new PathMatchingResourcePatternResolver(cl); - List rulesFiles; + List rulesFiles = new ArrayList(); + Set existingFiles = new HashSet(); String rulesDir = CrudServiceConstants.CRD_HOME_MODEL; try { - // getResources method returns objects of type "Resource" - // 1. We are getting all the objects from the classpath which has - // "DbEdgeRules" in the name. - // 2. We run them through a filter and return only the objects which match - // the supplied pattern "p" - // 3. We then collect the objects in a list. At this point we have a list - // of the kind of files we require. - rulesFiles = Arrays.stream(rulesResolver.getResources("classpath*:/dbedgerules/DbEdgeRules*" + fileExt)) - .filter(r -> !myMatcher(rulesPattern, r.getFilename()).isEmpty()).collect(Collectors.toList()); - + // Allow additional DBEdgeRule files to be dropped in manually (in addition to those found on the classpath) + File[] edgeRuleFileList = new File(rulesDir).listFiles((d, name) -> rulesPattern.matcher(name).matches()); + for (File file : edgeRuleFileList) { + rulesFiles.add(file); + existingFiles.add(filename(file)); + } + + // Get DBEdgeRules from the jar on the classpath. Don't include any that conflict with files which + // were dropped manually. + Resource[] rawResourceList = rulesResolver.getResources("classpath*:/dbedgerules/DbEdgeRules*" + fileExt); + List prunedResourceList = new ArrayList(); + for (Resource resource : rawResourceList) { + if (!existingFiles.contains(filename(resource))) { + prunedResourceList.add(resource); + } + } + + rulesFiles.addAll(Arrays.stream(prunedResourceList.toArray(new Resource[prunedResourceList.size()])) + .filter(r -> !myMatcher(rulesPattern, r.getFilename()).isEmpty()).collect(Collectors.toList())); + // This gets all the objects of type "File" from external directory (not // on the classpath) // 1. From an external directory (one not on the classpath) we get all the @@ -135,7 +149,7 @@ public class RelationshipSchemaLoader { // this list // to the previous collection (rulesFiles) rulesFiles - .addAll(Arrays.stream(new File(rulesDir).listFiles((d, name) -> edgePropsPattern.matcher(name).matches())) + .addAll(Arrays.stream(new File(rulesDir).listFiles( (d, name) -> edgePropsPattern.matcher(name).matches() )) .collect(Collectors.toList())); if (rulesFiles.isEmpty()) { diff --git a/src/test/java/org/onap/schema/RelationshipSchemaLoaderTest.java b/src/test/java/org/onap/schema/RelationshipSchemaLoaderTest.java index 565a215..22fead0 100644 --- a/src/test/java/org/onap/schema/RelationshipSchemaLoaderTest.java +++ b/src/test/java/org/onap/schema/RelationshipSchemaLoaderTest.java @@ -45,12 +45,14 @@ public class RelationshipSchemaLoaderTest { @Test public void loadModels() throws Exception { + RelationshipSchemaLoader.resetVersionContextMap(); RelationshipSchemaLoader.loadModels(); assertFalse( RelationshipSchemaLoader.getVersionContextMap().keySet().isEmpty()); } @Test public void loadModelsWithAVersion() throws Exception { + RelationshipSchemaLoader.resetVersionContextMap(); RelationshipSchemaLoader.loadModels("v11"); assertEquals(1, RelationshipSchemaLoader.getVersionContextMap().keySet().size()); assertEquals("v11", RelationshipSchemaLoader.getLatestSchemaVersion()); @@ -58,14 +60,25 @@ public class RelationshipSchemaLoaderTest { @Test public void getSchemaForVersion() throws Exception { + RelationshipSchemaLoader.resetVersionContextMap(); RelationshipSchemaLoader.loadModels("v11"); String version = RelationshipSchemaLoader.getLatestSchemaVersion(); RelationshipSchema g = RelationshipSchemaLoader.getSchemaForVersion(version); assertNotNull(g.lookupRelationType("org.onap.relationships.inventory.BelongsTo")); } + public void getSchemaForVersionManualFile() throws Exception { + RelationshipSchemaLoader.resetVersionContextMap(); + RelationshipSchemaLoader.loadModels("v10"); + String version = RelationshipSchemaLoader.getLatestSchemaVersion(); + RelationshipSchema g = RelationshipSchemaLoader.getSchemaForVersion(version); + assertNotNull(g.lookupRelationType("locatedIn")); + } + + @Test public void getSchemaForVersionFail() throws Exception { + RelationshipSchemaLoader.resetVersionContextMap(); RelationshipSchemaLoader.loadModels(); try { RelationshipSchemaLoader.getSchemaForVersion("v1"); @@ -76,6 +89,7 @@ public class RelationshipSchemaLoaderTest { @Test public void setVersionContextMap() throws Exception { + RelationshipSchemaLoader.resetVersionContextMap(); ArrayList jsonString = new ArrayList(); String rules = "{" + "\"rules\": [" + diff --git a/src/test/java/org/onap/schema/RelationshipSchemaTest.java b/src/test/java/org/onap/schema/RelationshipSchemaTest.java index 7d54a30..ce8559a 100644 --- a/src/test/java/org/onap/schema/RelationshipSchemaTest.java +++ b/src/test/java/org/onap/schema/RelationshipSchemaTest.java @@ -24,6 +24,8 @@ import org.apache.commons.io.IOUtils; import org.junit.Test; import org.onap.crud.exception.CrudException; +import com.att.aft.dme2.internal.apache.commons.lang.ArrayUtils; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -60,17 +62,17 @@ public class RelationshipSchemaTest { public void shouldContainValidTypes() throws Exception { Map versionContextMap = new ConcurrentHashMap<>(); loadRelations(versionContextMap); - assertTrue(versionContextMap.get("v11").isValidType("groupsResourcesIn")); - assertTrue(versionContextMap.get("v11").isValidType("uses")); - assertFalse(versionContextMap.get("v11").isValidType("notValidType")); + assertTrue(versionContextMap.get("v10").isValidType("groupsResourcesIn")); + assertTrue(versionContextMap.get("v10").isValidType("uses")); + assertFalse(versionContextMap.get("v10").isValidType("notValidType")); } @Test public void shouldLookUpByRelation() throws Exception { Map versionContextMap = new ConcurrentHashMap<>(); loadRelations(versionContextMap); - assertNotNull(versionContextMap.get("v11").lookupRelation("availability-zone:complex:groupsResourcesIn")); - assertTrue(versionContextMap.get("v11") + assertNotNull(versionContextMap.get("v10").lookupRelation("availability-zone:complex:groupsResourcesIn")); + assertTrue(versionContextMap.get("v10") .lookupRelation("availability-zone:complex:groupsResourcesIn").containsKey("prevent-delete")); } @@ -78,8 +80,8 @@ public class RelationshipSchemaTest { public void shouldLookUpByRelationType() throws Exception { Map versionContextMap = new ConcurrentHashMap<>(); loadRelations(versionContextMap); - assertNotNull(versionContextMap.get("v11").lookupRelationType("groupsResourcesIn")); - assertTrue(versionContextMap.get("v11") + assertNotNull(versionContextMap.get("v10").lookupRelationType("groupsResourcesIn")); + assertTrue(versionContextMap.get("v10") .lookupRelation("availability-zone:complex:groupsResourcesIn").containsKey("prevent-delete")); } @@ -88,7 +90,14 @@ public class RelationshipSchemaTest { File dir = new File(classLoader.getResource("model").getFile()); File[] allFiles = dir.listFiles((d, name) -> (propsFilePattern.matcher(name).matches() || rulesFilePattern.matcher(name).matches())); - + + // Special handling for the v12 file, as it is used for a special test + for (File f : allFiles) { + if (f.getName().equals("edge_properties_v11.json")) { + allFiles = (File[]) ArrayUtils.removeElement(allFiles, f); + } + } + Arrays.stream(allFiles).sorted(Comparator.comparing(File::getName)) .collect(Collectors.groupingBy(f -> myMatcher(versionPattern, f.getName()))) .forEach((e, f) -> map.put(e, jsonFilesLoader(f))); @@ -104,7 +113,9 @@ public class RelationshipSchemaTest { } try { - rsSchema = new RelationshipSchema(fileContents); + if (fileContents.size() == 2) { + rsSchema = new RelationshipSchema(fileContents); + } } catch (CrudException e) { e.printStackTrace(); } catch (IOException e) { diff --git a/src/test/resources/model/DbEdgeRules_v11.json b/src/test/resources/model/DbEdgeRules_v11.json deleted file mode 100644 index d24acd7..0000000 --- a/src/test/resources/model/DbEdgeRules_v11.json +++ /dev/null @@ -1,1962 +0,0 @@ -{ - "rules": [ - { - "from": "availability-zone", - "to": "complex", - "label": "groupsResourcesIn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from" : "auth-info-item", - "to" : "tenant", - "label" : "defaultTenant", - "direction" : "OUT", - "multiplicity" : "One2One", - "isParent" : "false", - "usesResource" : "false", - "hasDelTarget" : "false", - "SVC-INFRA" : "false" - }, - { - "from": "generic-vnf", - "to": "license-key-resource", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "availability-zone", - "to": "service-capability", - "label": "supportsServiceCapability", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "cloud-region", - "to": "complex", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "cloud-region", - "to": "l3-network", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "cloud-region", - "to": "tenant", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "auth-info-item", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "image", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "flavor", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "availability-zone", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "oam-network", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "dvs-switch", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "volume-group", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "group-assignment", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "snapshot", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "${direction}" - }, - { - "from": "cloud-region", - "to": "zone", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "complex", - "to": "ctag-pool", - "label": "hasCtagPool", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "complex", - "to": "l3-network", - "label": "usesL3Network", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "ctag-pool", - "to": "availability-zone", - "label": "supportsAvailabilityZone", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "customer", - "to": "service-subscription", - "label": "subscribesTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "NONE" - }, - { - "from": "dvs-switch", - "to": "availability-zone", - "label": "existsIn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "generic-vnf", - "to": "l-interface", - "label": "hasLInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "availability-zone", - "label": "hasAvailabilityZone", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "generic-vnf", - "to": "lag-interface", - "label": "hasLAGInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "l3-network", - "label": "usesL3Network", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "pserver", - "label": "runsOnPserver", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "generic-vnf", - "to": "vnf-image", - "label": "usesVnfImage", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "generic-vnf", - "to": "vserver", - "label": "runsOnVserver", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "service-instance", - "label": "hasInstance", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "site-pair-set", - "label": "hasSitePairSet", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "network-profile", - "label": "hasNetworkProfile", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "pnf", - "label": "hostedOn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "group-assignment", - "to": "tenant", - "label": "has", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "group-assignment", - "to": "pserver", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "image", - "to": "metadatum", - "label": "hasMetaDatum", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l-interface", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "vnfc", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l-interface", - "to": "l3-interface-ipv4-address-list", - "label": "hasIpAddress", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l-interface", - "to": "l3-interface-ipv6-address-list", - "label": "hasIpAddress", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l-interface", - "to": "l-interface", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l-interface", - "to": "logical-link", - "label": "usesLogicalLink", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "lag-interface", - "to": "logical-link", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l-interface", - "to": "vlan", - "label": "hasVlan", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l-interface", - "to": "sriov-vf", - "label": "has", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l3-interface-ipv4-address-list", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l3-interface-ipv6-address-list", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l3-interface-ipv4-address-list", - "to": "l3-network", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l3-interface-ipv6-address-list", - "to": "l3-network", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l3-interface-ipv4-address-list", - "to": "subnet", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "l3-interface-ipv6-address-list", - "to": "subnet", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "l3-network", - "to": "vpn-binding", - "label": "usesVpnBinding", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "l3-network", - "to": "instance-group", - "label": "memberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l3-network", - "to": "subnet", - "label": "hasSubnet", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l3-network", - "to": "service-instance", - "label": "hasInstance", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l3-network", - "to": "ctag-assignment", - "label": "hasCtagAssignment", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l3-network", - "to": "network-policy", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "l3-network", - "to": "segmentation-assignment", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "l3-network", - "to": "route-table-reference", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "lag-interface", - "to": "lag-link", - "label": "usesLAGLink", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "lag-interface", - "to": "p-interface", - "label": "usesPInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "lag-interface", - "to": "l-interface", - "label": "hasLInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "logical-link", - "to": "lag-link", - "label": "usesLAGLink", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "logical-link", - "to": "pnf", - "label": "bridgedTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "logical-link", - "to": "logical-link", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "model", - "to": "model-ver", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "model-ver", - "to": "model-element", - "label": "startsWith", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "model-element", - "to": "model-ver", - "label": "isA", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "model-ver", - "to": "metadatum", - "label": "hasMetaData", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "model-element", - "to": "model-element", - "label": "connectsTo", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "model-element", - "to": "model-constraint", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "model-element", - "to": "constrained-element-set", - "label": "connectsTo", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "model-constraint", - "to": "constrained-element-set", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "constrained-element-set", - "to": "element-choice-set", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "element-choice-set", - "to": "model-element", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "named-query", - "to": "model", - "label": "relatedTo", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "named-query", - "to": "named-query-element", - "label": "startsWith", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "named-query-element", - "to": "named-query-element", - "label": "connectsTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "named-query-element", - "to": "model", - "label": "isA", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "named-query-element", - "to": "property-constraint", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "named-query-element", - "to": "related-lookup", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "instance-group", - "to": "model", - "label": "targets", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "newvce", - "to": "l-interface", - "label": "hasLInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "oam-network", - "to": "complex", - "label": "definedFor", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "oam-network", - "to": "service-capability", - "label": "supportsServiceCapability", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "p-interface", - "to": "l-interface", - "label": "hasLInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "p-interface", - "to": "physical-link", - "label": "usesPhysicalLink", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "p-interface", - "to": "logical-link", - "label": "usesLogicalLink", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "port-group", - "to": "cvlan-tag", - "label": "hasCTag", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "pserver", - "to": "complex", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "pserver", - "to": "cloud-region", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "pserver", - "to": "availability-zone", - "label": "existsIn", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "pserver", - "to": "lag-interface", - "label": "hasLAGInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "pserver", - "to": "p-interface", - "label": "hasPinterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "pserver", - "to": "zone", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "pnf", - "to": "p-interface", - "label": "hasPinterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "pnf", - "to": "lag-interface", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "pnf", - "to": "complex", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "pnf", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "pnf", - "to": "zone", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "zone", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "cvlan-tag", - "label": "hasIPAGFacingVLAN", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "pnf", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-subscription", - "to": "service-instance", - "label": "hasInstance", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "NONE" - }, - { - "from": "site-pair-set", - "to": "routing-instance", - "label": "hasRoutingInstance", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "routing-instance", - "to": "site-pair", - "label": "hasSitePair", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "site-pair", - "to": "class-of-service", - "label": "hasClassOfService", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "tenant", - "to": "l3-network", - "label": "usesL3Network", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "tenant", - "to": "service-subscription", - "label": "relatedTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "tenant", - "to": "vserver", - "label": "owns", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "${direction}" - }, - { - "from": "vce", - "to": "availability-zone", - "label": "hasAvailabilityZone", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "vce", - "to": "complex", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "vce", - "to": "port-group", - "label": "hasPortGroup", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vce", - "to": "vserver", - "label": "runsOnVserver", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vce", - "to": "service-instance", - "label": "hasServiceInstance", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "NONE" - }, - { - "from": "virtual-data-center", - "to": "generic-vnf", - "label": "hasVNF", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "!${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vlan", - "to": "l3-interface-ipv4-address-list", - "label": "hasIpAddress", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vlan", - "to": "l3-interface-ipv6-address-list", - "label": "hasIpAddress", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vpls-pe", - "to": "complex", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "vpls-pe", - "to": "ctag-pool", - "label": "usesCtagPool", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "vpls-pe", - "to": "p-interface", - "label": "hasPinterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "vpls-pe", - "to": "lag-interface", - "label": "hasLAGinterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "vserver", - "to": "flavor", - "label": "hasFlavor", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "vserver", - "to": "image", - "label": "hasImage", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "vserver", - "to": "l-interface", - "label": "hasLInterface", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vserver", - "to": "pserver", - "label": "runsOnPserver", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "vserver", - "to": "volume", - "label": "hasVolume", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vserver", - "to": "vnfc", - "label": "hosts", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vserver", - "to": "snapshot", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "connector", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "metadatum", - "label": "hasMetaData", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "logical-link", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "vlan", - "label": "dependsOn", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "service-instance", - "label": "dependsOn", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "connector", - "to": "virtual-data-center", - "label": "contains", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "connector", - "to": "metadatum", - "label": "hasMetaData", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "virtual-data-center", - "to": "logical-link", - "label": "contains", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "logical-link", - "to": "generic-vnf", - "label": "bridgedTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "logical-link", - "to": "pserver", - "label": "bridgedTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "vlan", - "to": "multicast-configuration", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "volume-group", - "to": "complex", - "label": "existsIn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "!${direction}" - }, - { - "from": "volume-group", - "to": "tenant", - "label": "belongsTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "ipsec-configuration", - "to": "vig-server", - "label": "hasVigServer", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "ipsec-configuration", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "vf-module", - "to": "volume-group", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vserver", - "to": "vf-module", - "label": "isPartOf", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vf-module", - "to": "l3-network", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vf-module", - "to": "vnfc", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "${direction}", - "prevent-delete": "${direction}" - }, - { - "from": "generic-vnf", - "to": "vf-module", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "volume-group", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "vnfc", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vlan", - "to": "logical-link", - "label": "usesLogicalLink", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "${direction}", - "SVC-INFRA": "${direction}", - "prevent-delete": "NONE" - }, - { - "from": "vpn-binding", - "to": "route-target", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "ctag-assignment", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "generic-vnf", - "label": "isPartOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "l3-network", - "label": "isPartOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "network-policy", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "vlan", - "label": "isPartOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "l-interface", - "label": "uses", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "instance-group", - "label": "isMemberOf", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "tunnel-xconnect", - "label": "has", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "logical-link", - "to": "cloud-region", - "label": "existsIn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "logical-link", - "to": "vpn-binding", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "generic-vnf", - "to": "entitlement", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "license", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "vce", - "to": "entitlement", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "vce", - "to": "license", - "label": "has", - "direction": "OUT", - "multiplicity": "One2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "zone", - "to": "complex", - "label": "existsIn", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "service-instance", - "to": "allotted-resource", - "label": "has", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "service-instance", - "to": "allotted-resource", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "allotted-resource", - "to": "vpn-binding", - "label": "belongsTo", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "allotted-resource", - "to": "allotted-resource", - "label": "bindsTo", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "generic-vnf", - "to": "complex", - "label": "locatedIn", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "!${direction}" - }, - { - "from": "generic-vnf", - "to": "ctag-pool", - "label": "usesCtagPool", - "direction": "OUT", - "multiplicity": "Many2Many", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "p-interface", - "to": "sriov-pf", - "label": "has", - "direction": "OUT", - "multiplicity": "One2One", - "contains-other-v": "${direction}", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - }, - { - "from": "sriov-vf", - "to": "sriov-pf", - "label": "uses", - "direction": "OUT", - "multiplicity": "Many2One", - "contains-other-v": "NONE", - "delete-other-v": "NONE", - "SVC-INFRA": "NONE", - "prevent-delete": "NONE" - } - ] -} -- 2.16.6