Using DbEdgeRules.json files from aai-core jar. 91/8291/1
authorShwetank Dave <shwetank.dave@amdocs.com>
Tue, 22 Aug 2017 14:36:30 +0000 (10:36 -0400)
committerShwetank Dave <shwetank.dave@amdocs.com>
Tue, 22 Aug 2017 14:47:15 +0000 (10:47 -0400)
Before we were aai_relationship_vxx.json files.
Now using the edge rules directly from aai-core jar.

Issue-ID: AAI-21
Change-Id: Id62494caabc75bc29e4f3558268ec78897946937
Signed-off-by: Shwetank Dave <shwetank.dave@amdocs.com>
14 files changed:
pom.xml
src/main/java/org/openecomp/schema/RelationshipSchema.java
src/main/java/org/openecomp/schema/RelationshipSchemaLoader.java
src/main/java/org/openecomp/schema/RelationshipSchemaValidator.java
src/test/java/org/openecomp/schema/RelationshipSchemaLoaderTest.java [new file with mode: 0644]
src/test/java/org/openecomp/schema/RelationshipSchemaTest.java [new file with mode: 0644]
src/test/resources/model/DbEdgeRules_v10.json [new file with mode: 0644]
src/test/resources/model/DbEdgeRules_v11.json [new file with mode: 0644]
src/test/resources/model/DbEdgeRules_v8.json [new file with mode: 0644]
src/test/resources/model/DbEdgeRules_v9.json [new file with mode: 0644]
src/test/resources/model/edge_properties_v10.json [new file with mode: 0644]
src/test/resources/model/edge_properties_v11.json [new file with mode: 0644]
src/test/resources/model/edge_properties_v8.json [new file with mode: 0644]
src/test/resources/model/edge_properties_v9.json [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index 0cb9181..d16e93c 100644 (file)
--- a/pom.xml
+++ b/pom.xml
           <version>1.1.0-SNAPSHOT</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.onap.aai.aai-common</groupId>
+            <artifactId>aai-core</artifactId>
+            <version>1.1.0-SNAPSHOT</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <dependency>
           <groupId>org.onap.aai.aai-common</groupId>
           <artifactId>aai-auth</artifactId>
         <dependency>
             <groupId>org.openecomp.aai</groupId>
             <artifactId>champ</artifactId> 
-            <version>1.0.0-SNAPSHOT</version>
+            <version>1.1.0-SNAPSHOT</version>
             <scope>compile</scope>
             <exclusions>
                 <exclusion>
             <artifactId>json</artifactId>
             <version>20131018</version>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
 
     </dependencies>
 
index 5b28e28..a8d101d 100644 (file)
@@ -25,95 +25,60 @@ package org.openecomp.schema;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 
+import org.codehaus.jackson.map.ObjectMapper;
 import org.openecomp.crud.exception.CrudException;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
 import javax.ws.rs.core.Response.Status;
 
+
 public class RelationshipSchema {
   private static final Gson gson = new GsonBuilder().create();
 
-  public static final String SCHEMA_SOURCE_NODE_TYPE = "source-node-type";
-  public static final String SCHEMA_TARGET_NODE_TYPE = "target-node-type";
-  public static final String SCHEMA_RELATIONSHIP_TYPE = "relationship-type";
-  public static final String SCHEMA_RELATIONSHIP_TYPES_ARRAY = "relationship-types";
-  public static final String SCHEMA_RELATIONSHIP_PROPERTIES = "properties";
-  public static final String SCHEMA_RELATIONS_ARRAY = "relations";
+  public static final String SCHEMA_SOURCE_NODE_TYPE = "from";
+  public static final String SCHEMA_TARGET_NODE_TYPE = "to";
+  public static final String SCHEMA_RELATIONSHIP_TYPE = "label";
+  public static final String SCHEMA_RULES_ARRAY = "rules";
 
+
+  private Map<String, Map<String, Class<?>>> relations = new HashMap<>();
   /**
-   * key = source-node-type:target-node-type:relationship-type value = map of properties with name
-   * and type . Like propertyName:PropertyType
-   */
-  private HashMap<String, HashMap<String, Class<?>>> relations
-      = new HashMap<String, HashMap<String, Class<?>>>();
-  /**
-   * Hashmap of valid relationship types alongwith properrties.
+   * Hashmap of valid relationship types along with properties.
    */
-  private HashMap<String, HashMap<String, Class<?>>> relationTypes
-      = new HashMap<String, HashMap<String, Class<?>>>();
-
-
-  public RelationshipSchema(String json) throws CrudException {
+  private Map<String, Map<String, Class<?>>> relationTypes  = new HashMap<>();
 
-    JsonParser parser = new JsonParser();
-    try {
-      JsonObject root = parser.parse(json).getAsJsonObject();
-      JsonArray relationshipTypesArray = root.getAsJsonArray(SCHEMA_RELATIONSHIP_TYPES_ARRAY);
-      JsonArray relationsArray = root.getAsJsonArray(SCHEMA_RELATIONS_ARRAY);
 
-      //First load all the relationship-types
-      for (JsonElement item : relationshipTypesArray) {
-        JsonObject obj = item.getAsJsonObject();
-        String type = obj.get(SCHEMA_RELATIONSHIP_TYPE).getAsString();
-
-
-        HashMap<String, Class<?>> props = new HashMap<String, Class<?>>();
-        Set<Map.Entry<String, JsonElement>> entries = obj.get(SCHEMA_RELATIONSHIP_PROPERTIES)
-            .getAsJsonObject().entrySet();
-
-        for (Map.Entry<String, JsonElement> entry : entries) {
-          props.put(entry.getKey(), resolveClass(entry.getValue().getAsString()));
-
-        }
-        relationTypes.put(type, props);
+  public RelationshipSchema(List<String> jsonStrings) throws CrudException, IOException {
+    String edgeRules = jsonStrings.get(0);
+    String props = jsonStrings.get(1);
 
+    HashMap<String, ArrayList<LinkedHashMap<String, String>>> rules = new ObjectMapper().readValue(edgeRules, HashMap.class);
+    HashMap<String, String> properties = new ObjectMapper().readValue(props, HashMap.class);
+    Map<String, Class<?>> edgeProps = properties.entrySet().stream().collect(Collectors.toMap(p -> p.getKey(), p -> {
+      try {
+        return resolveClass(p.getValue());
+      } catch (CrudException | ClassNotFoundException e) {
+        e.printStackTrace();
       }
+      return null;
+    }));
 
-      for (JsonElement item : relationsArray) {
-        JsonObject obj = item.getAsJsonObject();
-        // Parse the Source/Taget nodeTypes
-
-        String relationType = obj.get(SCHEMA_RELATIONSHIP_TYPE).getAsString();
-        String key = obj.get(SCHEMA_SOURCE_NODE_TYPE).getAsString() + ":"
-            + obj.get(SCHEMA_TARGET_NODE_TYPE).getAsString() + ":" + relationType;
-
-
-        if (!relationTypes.containsKey(relationType)) {
-          throw new CrudException(SCHEMA_RELATIONSHIP_TYPE + ": " + relationType + " not found",
-              Status.BAD_REQUEST);
-        }
-
-        relations.put(key, relationTypes.get(relationType));
-      }
-    } catch (Exception e) {
-      throw new CrudException(e.getMessage(), Status.BAD_REQUEST);
-    }
-
+    rules.get(SCHEMA_RULES_ARRAY).forEach(l -> {
+      relationTypes.put(l.get(SCHEMA_RELATIONSHIP_TYPE), edgeProps);
+      relations.put(buildRelation(l.get(SCHEMA_SOURCE_NODE_TYPE), l.get(SCHEMA_TARGET_NODE_TYPE), l.get(SCHEMA_RELATIONSHIP_TYPE)), edgeProps);
+    });
   }
 
 
-  public HashMap<String, Class<?>> lookupRelation(String key) {
+
+  public Map<String, Class<?>> lookupRelation(String key) {
     return this.relations.get(key);
   }
 
-  public HashMap<String, Class<?>> lookupRelationType(String type) {
+  public Map<String, Class<?>> lookupRelationType(String type) {
     return this.relationTypes.get(type);
   }
 
@@ -121,6 +86,11 @@ public class RelationshipSchema {
     return relationTypes.containsKey(type);
   }
 
+
+  private String buildRelation(String source, String target, String relation){
+    return source + ":" + target + ":" + relation;
+  }
+
   private Class<?> resolveClass(String type) throws CrudException, ClassNotFoundException {
     Class<?> clazz = Class.forName(type);
     validateClassTypes(clazz);
@@ -129,10 +99,10 @@ public class RelationshipSchema {
 
   private void validateClassTypes(Class<?> clazz) throws CrudException {
     if (!clazz.isAssignableFrom(Integer.class) && !clazz.isAssignableFrom(Double.class)
-        && !clazz.isAssignableFrom(Boolean.class) && !clazz.isAssignableFrom(String.class)) {
+            && !clazz.isAssignableFrom(Boolean.class) && !clazz.isAssignableFrom(String.class)) {
       throw new CrudException("", Status.BAD_REQUEST);
     }
   }
+}
 
 
-}
index 51b33d0..7b68b35 100644 (file)
 package org.openecomp.schema;
 
 import org.apache.commons.io.IOUtils;
+import org.openecomp.aai.dbmodel.DbEdgeRules;
 import org.openecomp.cl.eelf.LoggerFactory;
 import org.openecomp.crud.exception.CrudException;
 import org.openecomp.crud.logging.CrudServiceMsgs;
 import org.openecomp.crud.util.CrudServiceConstants;
 import org.openecomp.crud.util.FileWatcher;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
+import org.springframework.core.io.UrlResource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.Date;
-import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.SortedSet;
+import java.util.stream.Collectors;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import javax.ws.rs.core.Response.Status;
-import javax.xml.bind.JAXBException;
-
 
 public class RelationshipSchemaLoader {
 
-  private static Map<String, RelationshipSchema> versionContextMap
-      = new ConcurrentHashMap<String, RelationshipSchema>();
+  private static Map<String, RelationshipSchema> versionContextMap = new ConcurrentHashMap<>();
   private static SortedSet<Integer> versions = new TreeSet<Integer>();
   private static Map<String, Timer> timers = new ConcurrentHashMap<String, Timer>();
-
-  final static Pattern filePattern = Pattern.compile("aai_relationship_(.*).json");
+  final static String edgePropsFiles = "edge_properties_";
+  final static String fileExt = ".json";
+  final static Pattern rulesFilePattern = Pattern.compile("DbEdgeRules(.*)" + fileExt);
+  final static Pattern propsFilePattern = Pattern.compile(edgePropsFiles + "(.*)" + fileExt);
+  final static Pattern versionPattern = Pattern.compile(".*(v\\d+)" + fileExt);
 
 
   private static org.openecomp.cl.api.Logger logger = LoggerFactory.getInstance()
-      .getLogger(RelationshipSchemaLoader.class.getName());
+          .getLogger(RelationshipSchemaLoader.class.getName());
 
-  public synchronized static void loadModels() {
+  public synchronized static void loadModels() throws CrudException {
+    load(rulesFilePattern, propsFilePattern);
+  }
 
-    File[] listOfFiles = new File(CrudServiceConstants.CRD_HOME_MODEL).listFiles();
+  public synchronized static void loadModels(String version) throws CrudException {
+    String pattern = String.format(".*(%s)" + fileExt, version);
+    load(Pattern.compile(pattern), Pattern.compile(edgePropsFiles + version + fileExt));
+  }
 
-    if (listOfFiles != null) {
-      for (File file : listOfFiles) {
-        if (file.isFile()) {
-          Matcher matcher = filePattern.matcher(file.getName());
-          if (matcher.matches()) {
-            try {
-              RelationshipSchemaLoader.loadModel(matcher.group(1), file);
-            } catch (Exception e) {
-              logger.error(CrudServiceMsgs.INVALID_OXM_FILE, file.getName(), e.getMessage());
-            }
-          }
+  public static RelationshipSchema getSchemaForVersion(String version) throws CrudException {
+    if (versionContextMap == null || versionContextMap.isEmpty()) {
+      loadModels();
+    } else if (!versionContextMap.containsKey(version)) {
+      try {
+        loadModels(version);
+      } catch (Exception e) {
+        throw new CrudException("", Status.NOT_FOUND);
+      }
+    }
+    RelationshipSchema schema = versionContextMap.get(version);
+    if (schema == null) {
+      throw new CrudException("", Status.NOT_FOUND);
+    } else
+      return schema;
+  }
 
-        }
+  public static String getLatestSchemaVersion() throws CrudException {
+    return "v" + versions.last();
+  }
+
+  public static Map<String, RelationshipSchema> getVersionContextMap() {
+    return versionContextMap;
+  }
+
+  public static void setVersionContextMap(Map<String, RelationshipSchema> versionContextMap) {
+    RelationshipSchemaLoader.versionContextMap = versionContextMap;
+  }
+
+  public static void resetVersionContextMap() {
+    RelationshipSchemaLoader.versionContextMap = new ConcurrentHashMap<>();
+  }
+
+
+  private static void load(Pattern rulesPattern, Pattern edgePropsPattern) throws CrudException {
+    ClassLoader cl = RelationshipSchemaLoader.class.getClassLoader();
+    ResourcePatternResolver rulesResolver = new PathMatchingResourcePatternResolver(cl);
+    List<Object> rulesFiles;
+    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());
+
+      // 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 objects of type "File"
+      // 2. We only return the files whose names matched the supplied pattern "p2".
+      // 3. We then collect all the objects in a list and add the contents of this list
+      //    to the previous collection (rulesFiles)
+      rulesFiles.addAll(Arrays.stream(new File(rulesDir).listFiles((d, name) ->
+              edgePropsPattern.matcher(name).matches())).collect(Collectors.toList()));
+
+      if (rulesFiles.isEmpty()) {
+        logger.error(CrudServiceMsgs.INVALID_OXM_DIR, rulesDir);
+        throw new FileNotFoundException("DbEdgeRules and edge_properties files were not found.");
+      }
+
+      // Sort and then group the files with their versions, convert them to the schema, and add them to versionContextMap
+      // 1. Sort the files. We need the DbEdgeRules files to be before the edgeProperties files.
+      // 2. Group the files with their versions. ie. v11 -> ["DbEdgeRule_v11.json", "edgeProperties_v11.json"].
+      //    The "group method" returns a HashMap whose key is the version and the value is a list of objects.
+      // 3. Go through each version and map the files into one schema using the "jsonFilesLoader" method.
+      //      Also update the  "versionContextMap" with the version and it's schema.
+      rulesFiles.stream().sorted(Comparator.comparing(RelationshipSchemaLoader::filename))
+              .collect(Collectors.groupingBy(f -> myMatcher(versionPattern, filename(f))))
+              .forEach((version, resourceAndFile) -> versionContextMap.put(version, jsonFilesLoader(version, resourceAndFile)));
+
+      logger.info(CrudServiceMsgs.LOADED_OXM_FILE, "Relationship Schema and Properties files: " + rulesFiles.stream().map(f -> filename(f)).collect(Collectors.toList()));
+    } catch (IOException e) {
+      logger.error(CrudServiceMsgs.INVALID_OXM_DIR, rulesDir);
+      throw new CrudException("DbEdgeRules or edge_properties files were not found.", new FileNotFoundException());
+    }
+  }
+
+  private static String filename (Object k) throws ClassCastException {
+    if (k instanceof UrlResource){
+      return ((UrlResource) k).getFilename();
+    } else if (k instanceof File) {
+      return ((File) k).getName();
+    } else {
+      throw new ClassCastException();
+    }
+  }
+
+  private static RelationshipSchema jsonFilesLoader (String version, List<Object> files) {
+    List<String> fileContents = new ArrayList<>();
+    RelationshipSchema rsSchema = null;
+    if (files.size() == 2) {
+      for (Object file : files) {
+        fileContents.add(jsonToRelationSchema(version, file));
+        versions.add(Integer.parseInt(version.substring(1)));
       }
+
+      try {
+        rsSchema = new RelationshipSchema(fileContents);
+      } catch (CrudException | IOException e) {
+        e.printStackTrace();
+        logger.error(CrudServiceMsgs.INVALID_OXM_FILE,
+                files.stream().map(f -> filename(f)).collect(Collectors.toList()).toString(), e.getMessage());
+      }
+      return rsSchema;
     } else {
-      logger.error(CrudServiceMsgs.INVALID_OXM_DIR, CrudServiceConstants.CRD_HOME_MODEL);
+      logger.debug(CrudServiceMsgs.INVALID_OXM_FILE, "Expecting a rules file and a properties file but found: " +
+              files.stream().map(f-> filename(f)).collect(Collectors.toList()).toString());
     }
+    return rsSchema;
+  }
 
+  private synchronized static void updateVersionContext(String version, RelationshipSchema rs){
+    versionContextMap.put(version, rs);
+  }
 
+  private synchronized static String jsonToRelationSchema (String version, Object file) {
+    InputStream inputStream = null;
+    String content = null;
+
+    try {
+      if (file instanceof  UrlResource) {
+        inputStream = ((UrlResource) file).getInputStream();
+      } else {
+        inputStream = new FileInputStream((File) file);
+        addtimer(version, file);
+      }
+      content =  IOUtils.toString(inputStream, "UTF-8");
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+    return content;
   }
 
-  private static void addtimer(String version, File file) {
+  private static void addtimer(String version, Object file) {
     TimerTask task = null;
     task = new FileWatcher(
-        file) {
+            (File) file) {
       protected void onChange(File file) {
         // here we implement the onChange
         logger.info(CrudServiceMsgs.OXM_FILE_CHANGED, file.getName());
 
         try {
-          RelationshipSchemaLoader.loadModel(version, file);
+          // Cannot use the file object here because we also have to get the edge properties associated with that version.
+          // The properties are stored in a different file.
+          RelationshipSchemaLoader.loadModels(version);
         } catch (Exception e) {
           e.printStackTrace();
         }
-
       }
     };
 
     if (!timers.containsKey(version)) {
-      Timer timer = new Timer("aai_relationship_" + version);
+      Timer timer = new Timer("db_edge_rules_" + version);
       timer.schedule(task, new Date(), 10000);
       timers.put(version, timer);
 
     }
   }
 
-  private synchronized static void loadModel(String version, File file)
-      throws JAXBException, IOException, CrudException {
-
-    InputStream inputStream = new FileInputStream(file);
-    String content = IOUtils.toString(inputStream, "UTF-8");
-    versionContextMap.put(version, new RelationshipSchema(content));
-    addtimer(version, file);
-    versions.add(Integer.parseInt(version.substring(1)));
+  private static String myMatcher (Pattern p, String s) {
+    Matcher m = p.matcher(s);
+    return m.matches() ? m.group(1) : "";
   }
-
-  public static RelationshipSchema getSchemaForVersion(String version) throws CrudException {
-    if (versionContextMap == null || versionContextMap.isEmpty()) {
-      loadModels();
-    } else if (!versionContextMap.containsKey(version)) {
-      try {
-        loadModel(version, new File(CrudServiceConstants.CRD_HOME_MODEL + "aai_relationship_"
-            + version + ".json"));
-      } catch (Exception e) {
-        throw new CrudException("", Status.NOT_FOUND);
-      }
-    }
-
-    return versionContextMap.get(version);
-  }
-
-  public static String getLatestSchemaVersion() throws CrudException {
-    return "v" + versions.last();
-  }
-
-  public static Map<String, RelationshipSchema> getVersionContextMap() {
-    return versionContextMap;
-  }
-
-  public static void setVersionContextMap(HashMap<String, RelationshipSchema> versionContextMap) {
-    RelationshipSchemaLoader.versionContextMap = versionContextMap;
-  }
-
-  public static void main(String[] args) throws FileNotFoundException, Exception {
-    File initialFile = new File("C:\\Software\\gizmo\\src\\main\\java\\org\\openecomp\\schema\\vio.json");
-
-    loadModel("v8", initialFile);
-  }
-
 }
index 552b60a..af20699 100644 (file)
@@ -56,7 +56,7 @@ public class RelationshipSchemaValidator {
       throw new CrudException("", Status.NOT_FOUND);
     }
 
-    HashMap<String, Class<?>> props = schema.lookupRelationType(type);
+    Map<String, Class<?>> props = schema.lookupRelationType(type);
     Map<String, Object> result = new HashMap<String, Object>();
 
     for (String key : filter.keySet()) {
@@ -128,7 +128,7 @@ public class RelationshipSchemaValidator {
       String key = sourceNodeType + ":" + targetNodeType + ":" + type;
 
       // find the validate the key from the schema
-      HashMap<String, Class<?>> schemaObject = schema.lookupRelation(key);
+      Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
 
       if (schemaObject == null) {
         throw new CrudException("Invalid source/target/relationship type: " + key,
@@ -185,7 +185,7 @@ public class RelationshipSchemaValidator {
           + ":" + edge.getType();
 
       // find the validate the key from the schema
-      HashMap<String, Class<?>> schemaObject = schema.lookupRelation(key);
+      Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
 
       if (schemaObject == null) {
         Logger.warn("key :" + key
@@ -267,7 +267,7 @@ public class RelationshipSchemaValidator {
           + ":" + edge.getType();
 
       // find the validate the key from the schema
-      HashMap<String, Class<?>> schemaObject = schema.lookupRelation(key);
+      Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
 
       if (schemaObject == null) {
         Logger.warn("key :" + key
@@ -295,7 +295,7 @@ public class RelationshipSchemaValidator {
 
 
   private static void validateEdgeProps(Edge.Builder builder, JsonElement props,
-                                        HashMap<String, Class<?>> schemaObject)
+                                        Map<String, Class<?>> schemaObject)
       throws CrudException {
     Set<Map.Entry<String, JsonElement>> entries = props.getAsJsonObject().entrySet();
 
@@ -323,7 +323,7 @@ public class RelationshipSchemaValidator {
 
     String key = edge.getSource().getType() + ":" + edge.getTarget().getType()
         + ":" + edge.getType();
-    HashMap<String, Class<?>> schemaObject = schema.lookupRelation(key);
+    Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
 
     if (schemaObject == null || schemaObject.isEmpty()) {
       return edge;
diff --git a/src/test/java/org/openecomp/schema/RelationshipSchemaLoaderTest.java b/src/test/java/org/openecomp/schema/RelationshipSchemaLoaderTest.java
new file mode 100644 (file)
index 0000000..85ef2fe
--- /dev/null
@@ -0,0 +1,91 @@
+package org.openecomp.schema;
+
+import static org.junit.Assert.*;
+import edu.emory.mathcs.backport.java.util.Arrays;
+import org.junit.Before;
+import org.junit.Test;
+import org.openecomp.crud.exception.CrudException;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+public class RelationshipSchemaLoaderTest {
+
+    @Before
+    public void init() {
+        ClassLoader classLoader = getClass().getClassLoader();
+        File dir = new File(classLoader.getResource( "model").getFile());
+        System.setProperty("CONFIG_HOME", dir.getParent());
+        RelationshipSchemaLoader.resetVersionContextMap();
+    }
+
+    @Test
+    public void loadModels() throws Exception {
+        RelationshipSchemaLoader.loadModels();
+        assertFalse( RelationshipSchemaLoader.getVersionContextMap().keySet().isEmpty());
+    }
+
+    @Test
+    public void loadModelsWithAVersion() throws Exception {
+        RelationshipSchemaLoader.loadModels("v11");
+        assertEquals(1, RelationshipSchemaLoader.getVersionContextMap().keySet().size());
+        assertEquals("v11",  RelationshipSchemaLoader.getLatestSchemaVersion());
+    }
+
+    @Test
+    public void getSchemaForVersion() throws Exception {
+        RelationshipSchemaLoader.loadModels("v11");
+        String version = RelationshipSchemaLoader.getLatestSchemaVersion();
+        RelationshipSchema g = RelationshipSchemaLoader.getSchemaForVersion(version);
+        assertNotNull(g.lookupRelationType("has"));
+    }
+
+    @Test
+    public void getSchemaForVersionFail() throws Exception {
+        RelationshipSchemaLoader.loadModels();
+        try {
+            RelationshipSchemaLoader.getSchemaForVersion("v1");
+        } catch (CrudException e) {
+            assertEquals(404, e.getHttpStatus().getStatusCode());
+        }
+    }
+
+    @Test
+    public void setVersionContextMap() throws Exception {
+        ArrayList<String> jsonString = new ArrayList<String>();
+        String rules = "{" +
+                "\"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}\"" +
+                "}]}";
+        String props = "{" +
+                "  \"isParent\":\"java.lang.Boolean\"," +
+                "  \"isParent-REV\":\"java.lang.Boolean\"," +
+                "  \"usesResource\":\"java.lang.Boolean\"," +
+                "  \"usesResource-REV\":\"java.lang.Boolean\"," +
+                "  \"SVC-INFRA\":\"java.lang.Boolean\"," +
+                "  \"SVC-INFRA-REV\":\"java.lang.Boolean\"," +
+                "  \"hasDelTarget\":\"java.lang.Boolean\"," +
+                "  \"hasDelTarget-REV\":\"java.lang.Boolean\"" +
+                "}";
+        jsonString.add(rules);
+        jsonString.add(props);
+        RelationshipSchema nRs = new RelationshipSchema(jsonString);
+        Map<String, RelationshipSchema> versionMap = new HashMap<>();
+        versionMap.put("v1", nRs);
+        RelationshipSchemaLoader.setVersionContextMap(versionMap);
+        assertNotNull(RelationshipSchemaLoader.getSchemaForVersion("v1").lookupRelationType("groupsResourcesIn"));
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/openecomp/schema/RelationshipSchemaTest.java b/src/test/java/org/openecomp/schema/RelationshipSchemaTest.java
new file mode 100644 (file)
index 0000000..f575105
--- /dev/null
@@ -0,0 +1,116 @@
+package org.openecomp.schema;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Test;
+import org.openecomp.crud.exception.CrudException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Comparator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.*;
+
+public class RelationshipSchemaTest {
+
+    final static Pattern rulesFilePattern = Pattern.compile("DbEdgeRules(.*).json");
+    final static Pattern propsFilePattern = Pattern.compile("edge_properties_(.*).json");
+    final static Pattern versionPattern = Pattern.compile(".*(v\\d+).json");
+
+
+    @Test
+    public void shouldLoadAllTheVersionsInDirectory() throws Exception {
+        Map<String, RelationshipSchema> versionContextMap = new ConcurrentHashMap<>();
+        loadRelations(versionContextMap);
+        assertEquals(6, versionContextMap.keySet().size());
+    }
+
+    @Test
+    public void shouldContainValidTypes() throws Exception {
+        Map<String, RelationshipSchema> versionContextMap = new ConcurrentHashMap<>();
+        loadRelations(versionContextMap);
+        assertTrue(versionContextMap.get("v11").isValidType("groupsResourcesIn"));
+        assertTrue(versionContextMap.get("v11").isValidType("uses"));
+        assertFalse(versionContextMap.get("v11").isValidType("has"));
+    }
+
+    @Test
+    public void shouldLookUpByRelation() throws Exception {
+        Map<String, RelationshipSchema> versionContextMap = new ConcurrentHashMap<>();
+        loadRelations(versionContextMap);
+        assertNotNull(versionContextMap.get("v11").lookupRelation("availability-zone:complex:groupsResourcesIn"));
+        assertTrue(versionContextMap.get("v11")
+                .lookupRelation("availability-zone:complex:groupsResourcesIn").containsKey("usesResource"));
+    }
+
+    @Test
+    public void shouldLookUpByRelationType() throws Exception {
+        Map<String, RelationshipSchema> versionContextMap = new ConcurrentHashMap<>();
+        loadRelations(versionContextMap);
+        assertNotNull(versionContextMap.get("v11").lookupRelationType("groupsResourcesIn"));
+        assertTrue(versionContextMap.get("v11")
+                .lookupRelation("availability-zone:complex:groupsResourcesIn").containsKey("usesResource"));
+    }
+
+    private void loadRelations(Map<String, RelationshipSchema> map){
+        ClassLoader classLoader = getClass().getClassLoader();
+        File dir = new File(classLoader.getResource("model").getFile());
+        File[] allFiles = dir.listFiles((d, name) ->
+                (propsFilePattern.matcher(name).matches() || rulesFilePattern.matcher(name).matches()));
+
+        Arrays.stream(allFiles).sorted(Comparator.comparing(File::getName))
+                .collect(Collectors.groupingBy(f -> myMatcher(versionPattern, f.getName())))
+                .forEach((e, f) -> map.put(e, jsonFilesLoader(f)));
+
+    }
+
+
+    private RelationshipSchema jsonFilesLoader (List<File> files) {
+        List<String> fileContents = new ArrayList<>();
+        RelationshipSchema rsSchema = null;
+        for (File f : files) {
+            fileContents.add(jsonToString(f));
+        }
+
+        try {
+            rsSchema = new RelationshipSchema(fileContents);
+        } catch (CrudException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return rsSchema;
+    }
+
+    private String jsonToString (File file) {
+        InputStream inputStream = null;
+        String content = null;
+        HashMap<String,Object> result = null;
+
+        try {
+            inputStream = new FileInputStream(file);
+            content =  IOUtils.toString(inputStream, "UTF-8");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return content;
+    }
+
+    private String myMatcher (Pattern p, String s) {
+        Matcher m = p.matcher(s);
+        return m.matches() ? m.group(1) : "";
+    }
+}
\ No newline at end of file
diff --git a/src/test/resources/model/DbEdgeRules_v10.json b/src/test/resources/model/DbEdgeRules_v10.json
new file mode 100644 (file)
index 0000000..0381090
--- /dev/null
@@ -0,0 +1,1819 @@
+{
+       "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": "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": "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": "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": "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": "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": "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": "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"
+               }
+       ]
+}
diff --git a/src/test/resources/model/DbEdgeRules_v11.json b/src/test/resources/model/DbEdgeRules_v11.json
new file mode 100644 (file)
index 0000000..d24acd7
--- /dev/null
@@ -0,0 +1,1962 @@
+{
+       "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"
+               }
+       ]
+}
diff --git a/src/test/resources/model/DbEdgeRules_v8.json b/src/test/resources/model/DbEdgeRules_v8.json
new file mode 100644 (file)
index 0000000..6d5b06f
--- /dev/null
@@ -0,0 +1,1478 @@
+{
+       "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": "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": "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": "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": "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": "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": "logical-link",
+                       "label": "usesLogicalLink",
+                       "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": "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": "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-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",
+                       "label": "isA",
+                       "direction": "OUT",
+                       "multiplicity": "Many2One",
+                       "contains-other-v": "NONE",
+                       "delete-other-v": "NONE",
+                       "SVC-INFRA": "NONE",
+                       "prevent-delete": "!${direction}"
+               },
+               {
+                       "from": "model",
+                       "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": "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": "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": "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-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": "One2One",
+                       "contains-other-v": "NONE",
+                       "delete-other-v": "${direction}",
+                       "SVC-INFRA": "${direction}",
+                       "prevent-delete": "NONE"
+               }
+       ]
+}
diff --git a/src/test/resources/model/DbEdgeRules_v9.json b/src/test/resources/model/DbEdgeRules_v9.json
new file mode 100644 (file)
index 0000000..88801e4
--- /dev/null
@@ -0,0 +1,1742 @@
+{
+       "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": "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": "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": "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": "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": "logical-link",
+                       "label": "usesLogicalLink",
+                       "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": "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": "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": "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": "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": "vlan",
+                       "label": "isPartOf",
+                       "direction": "OUT",
+                       "multiplicity": "Many2Many",
+                       "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"
+               }
+       ]
+}
diff --git a/src/test/resources/model/edge_properties_v10.json b/src/test/resources/model/edge_properties_v10.json
new file mode 100644 (file)
index 0000000..7cbddae
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "isParent":"java.lang.Boolean",
+  "isParent-REV":"java.lang.Boolean",
+  "usesResource":"java.lang.Boolean",
+  "usesResource-REV":"java.lang.Boolean",
+  "SVC-INFRA":"java.lang.Boolean",
+  "SVC-INFRA-REV":"java.lang.Boolean",
+  "hasDelTarget":"java.lang.Boolean",
+  "hasDelTarget-REV":"java.lang.Boolean"
+}
diff --git a/src/test/resources/model/edge_properties_v11.json b/src/test/resources/model/edge_properties_v11.json
new file mode 100644 (file)
index 0000000..ce0e6d5
--- /dev/null
@@ -0,0 +1,10 @@
+{
+        "isParent": "java.lang.Boolean",
+        "isParent-REV": "java.lang.Boolean",
+        "usesResource": "java.lang.Boolean",
+        "usesResource-REV": "java.lang.Boolean",
+        "SVC-INFRA": "java.lang.Boolean",
+        "SVC-INFRA-REV": "java.lang.Boolean",
+        "hasDelTarget": "java.lang.Boolean",
+        "hasDelTarget-REV": "java.lang.Boolean"
+    }
\ No newline at end of file
diff --git a/src/test/resources/model/edge_properties_v8.json b/src/test/resources/model/edge_properties_v8.json
new file mode 100644 (file)
index 0000000..7cbddae
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "isParent":"java.lang.Boolean",
+  "isParent-REV":"java.lang.Boolean",
+  "usesResource":"java.lang.Boolean",
+  "usesResource-REV":"java.lang.Boolean",
+  "SVC-INFRA":"java.lang.Boolean",
+  "SVC-INFRA-REV":"java.lang.Boolean",
+  "hasDelTarget":"java.lang.Boolean",
+  "hasDelTarget-REV":"java.lang.Boolean"
+}
diff --git a/src/test/resources/model/edge_properties_v9.json b/src/test/resources/model/edge_properties_v9.json
new file mode 100644 (file)
index 0000000..2ffcabb
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "isParent":"java.lang.Boolean",
+    "isParent-REV":"java.lang.Boolean",
+    "usesResource":"java.lang.Boolean",
+    "usesResource-REV":"java.lang.Boolean",
+    "SVC-INFRA":"java.lang.Boolean",
+    "SVC-INFRA-REV":"java.lang.Boolean",
+    "hasDelTarget":"java.lang.Boolean",
+    "hasDelTarget-REV":"java.lang.Boolean"
+}