Repository: fabric-testbed/InformationModel (language: python)

Issue:
Add sliver diff methods
Based on @kthare10 code add to FIM sliver diff methods that can be used in the Broker, which doesn't have access to ASM and can't use its diff method.

```
#!/usr/bin/env python3
​
from fabric_mb.message_bus.messages.abc_message_avro import AbcMessageAvro
from fim.slivers.base_sliver import BaseSliver
from fim.slivers.network_node import NodeSliver
from fim.slivers.network_service import NetworkServiceSliver
from fim.user import ComponentType
from fim.user.topology import TopologyDiff, TopologyDiffTuple
​
from fabric_cf.actor.security.pdp_auth import ActionId
​
​
def sliver_to_str(*, sliver: BaseSliver):
    if isinstance(sliver, NodeSliver):
        return node_sliver_to_str(sliver=sliver)
​
    if isinstance(sliver, NetworkServiceSliver):
        return ns_sliver_to_str(sliver=sliver)
​
​
def dict_diff(dict_a, dict_b, show_value_diff=False):
    result = {'added': {k: dict_b[k] for k in set(dict_b) - set(dict_a)},
              'removed': {k: dict_a[k] for k in set(dict_a) - set(dict_b)}}
    if show_value_diff:
        common_keys = set(dict_a) & set(dict_b)
        result['value_diffs'] = {
            k: (dict_a[k], dict_b[k])
            for k in common_keys
            if dict_a[k] != dict_b[k]
        }
    return result
​
​
def sliver_diff(*, sliver1: BaseSliver, sliver2: BaseSliver) -> TopologyDiff or None:
    if isinstance(sliver1, NodeSliver) and isinstance(sliver2, NodeSliver):
        return node_sliver_diff(sliver1=sliver1, sliver2=sliver2)
​
    elif isinstance(sliver1, NetworkServiceSliver) and isinstance(sliver2, NetworkServiceSliver):
        return ns_sliver_diff(sliver1=sliver1, sliver2=sliver2)
    else:
        raise Exception("Incorrect Instance type")
​
​
def node_sliver_diff(*, sliver1: NodeSliver, sliver2: NodeSliver) -> TopologyDiff or None:
    if sliver1 is not None and sliver2 is not None:
        comp_added = set()
        comp_removed = set()
        ns_added = set()
        ns_removed = set()
        if sliver1.attached_components_info is not None and sliver2.attached_components_info is not None:
            diff_comps = dict_diff(sliver1.attached_components_info.devices,
                                   sliver2.attached_components_info.devices)
            comp_added = set(diff_comps['added'].keys())
            comp_removed = set(diff_comps['removed'].keys())
​
        if sliver1.attached_components_info is None and sliver2.attached_components_info is not None:
            comp_added = set(sliver2.attached_components_info.devices.keys())
​
        if sliver1.attached_components_info is not None and sliver2.attached_components_info is None:
            comp_removed = set(sliver1.attached_components_info.devices.keys())
​
        if sliver1.network_service_info is not None and sliver2.network_service_info is not None:
            diff_ns = dict_diff(sliver1.network_service_info.services,
                                sliver2.network_service_info.services)
            ns_added = set(diff_ns['added'].keys())
            ns_removed = set(diff_ns['removed'].keys())
​
        if sliver1.network_service_info is None and sliver2.network_service_info is not None:
            ns_added = set(sliver2.network_service_info.services.keys())
​
        if sliver1.network_service_info is not None and sliver2.network_service_info is None:
            ns_removed = set(sliver1.network_service_info.services.keys())
​
        if len(comp_added) > 0 or len(comp_removed) > 0 or len(ns_removed) > 0 or len(ns_added) > 0:
            return TopologyDiff(added=TopologyDiffTuple(components=comp_added, services=ns_added, interfaces=set(),
                                                        nodes=set()),
                                removed=TopologyDiffTuple(components=comp_removed, services=ns_removed,
                                                          interfaces=set(), nodes=set()))
​
    return None
​
​
def ns_sliver_diff(*, sliver1: NetworkServiceSliver, sliver2: NetworkServiceSliver) -> TopologyDiff or None:
    if sliver1 is not None and sliver2 is not None:
        ifs_added = set()
        ifs_removed = set()
        if sliver1.interface_info is not None and sliver2.interface_info is not None:
            diff_comps = dict_diff(sliver1.interface_info.interfaces,
                                   sliver2.interface_info.interfaces)
            ifs_added = set(diff_comps['added'].keys())
            ifs_removed = set(diff_comps['removed'].keys())
​
        if sliver1.interface_info is None and sliver2.interface_info is not None:
            ifs_added = set(sliver2.interface_info.interfaces.keys())
​
        if sliver1.interface_info is not None and sliver2.interface_info is None:
            ifs_removed = set(sliver1.interface_info.interfaces.keys())
​
        if len(ifs_added) > 0 or len(ifs_removed) > 0:
            return TopologyDiff(added=TopologyDiffTuple(components=set(), services=set(), interfaces=ifs_added,
                                                        nodes=set()),
                                removed=TopologyDiffTuple(components=set(), services=set(),
                                                          interfaces=ifs_removed, nodes=set()))
​
    return None
​
​
def node_sliver_to_str(*, sliver: NodeSliver):
    result = str(sliver)
    nic_types = [ComponentType.SharedNIC, ComponentType.SmartNIC]
    if sliver.attached_components_info is not None:
        for c in sliver.attached_components_info.devices.values():
            result += f"\nComponent: {c}"
            if c.get_type() not in nic_types:
                continue
            if c.network_service_info is not None and c.network_service_info.network_services is not None:
                for ns in c.network_service_info.network_services.values():
                    result += f"\nNS: {ns}"
                    if ns.interface_info is not None and ns.interface_info.interfaces is not None:
                        for i in ns.interface_info.interfaces.values():
                            result += f"\nIFS: {i}"
    return result
​
​
def ns_sliver_to_str(*, sliver: NetworkServiceSliver):
    result = str(sliver)
    for interface in sliver.interface_info.interfaces.values():
        result += f"\nIFS: {interface}"
    return result
​```
Modify bug
Per @kthare10 

I also ran into another issue, when I do a modify where I just add components to the existing VM and don't have any other modifications. I see following exception:
```
Traceback (most recent call last):
    topology_diff = existing_topology.diff(new_topology)
  File "/Users/kthare10/.virtualenvs/ControlFramework1.3/lib/python3.9/site-packages/fim/user/topology.py", line 794, in diff
    ExperimentTopology._exclude_parented_elements(nodes_added, nss_added,
  File "/Users/kthare10/.virtualenvs/ControlFramework1.3/lib/python3.9/site-packages/fim/user/topology.py", line 764, in _exclude_parented_elements
    excluded_components = {c for c in components if ExperimentTopology._is_parented_component(c, nodes)}
  File "/Users/kthare10/.virtualenvs/ControlFramework1.3/lib/python3.9/site-packages/fim/user/topology.py", line 764, in <setcomp>
    excluded_components = {c for c in components if ExperimentTopology._is_parented_component(c, nodes)}
  File "/Users/kthare10/.virtualenvs/ControlFramework1.3/lib/python3.9/site-packages/fim/user/topology.py", line 714, in _is_parented_component
    assert nodes
```
Add method to prune topology based on reservation_info from modify operation
Will allow Orchestrator to create a clean model with no failed subelements after modify. 
Add sliver diff methods
Based on @kthare10 code add to FIM sliver diff methods that can be used in the Broker, which doesn't have access to ASM and can't use its diff method.

```
#!/usr/bin/env python3
​
from fabric_mb.message_bus.messages.abc_message_avro import AbcMessageAvro
from fim.slivers.base_sliver import BaseSliver
from fim.slivers.network_node import NodeSliver
from fim.slivers.network_service import NetworkServiceSliver
from fim.user import ComponentType
from fim.user.topology import TopologyDiff, TopologyDiffTuple
​
from fabric_cf.actor.security.pdp_auth import ActionId
​
​
def sliver_to_str(*, sliver: BaseSliver):
    if isinstance(sliver, NodeSliver):
        return node_sliver_to_str(sliver=sliver)
​
    if isinstance(sliver, NetworkServiceSliver):
        return ns_sliver_to_str(sliver=sliver)
​
​
def dict_diff(dict_a, dict_b, show_value_diff=False):
    result = {'added': {k: dict_b[k] for k in set(dict_b) - set(dict_a)},
              'removed': {k: dict_a[k] for k in set(dict_a) - set(dict_b)}}
    if show_value_diff:
        common_keys = set(dict_a) & set(dict_b)
        result['value_diffs'] = {
            k: (dict_a[k], dict_b[k])
            for k in common_keys
            if dict_a[k] != dict_b[k]
        }
    return result
​
​
def sliver_diff(*, sliver1: BaseSliver, sliver2: BaseSliver) -> TopologyDiff or None:
    if isinstance(sliver1, NodeSliver) and isinstance(sliver2, NodeSliver):
        return node_sliver_diff(sliver1=sliver1, sliver2=sliver2)
​
    elif isinstance(sliver1, NetworkServiceSliver) and isinstance(sliver2, NetworkServiceSliver):
        return ns_sliver_diff(sliver1=sliver1, sliver2=sliver2)
    else:
        raise Exception("Incorrect Instance type")
​
​
def node_sliver_diff(*, sliver1: NodeSliver, sliver2: NodeSliver) -> TopologyDiff or None:
    if sliver1 is not None and sliver2 is not None:
        comp_added = set()
        comp_removed = set()
        ns_added = set()
        ns_removed = set()
        if sliver1.attached_components_info is not None and sliver2.attached_components_info is not None:
            diff_comps = dict_diff(sliver1.attached_components_info.devices,
                                   sliver2.attached_components_info.devices)
            comp_added = set(diff_comps['added'].keys())
            comp_removed = set(diff_comps['removed'].keys())
​
        if sliver1.attached_components_info is None and sliver2.attached_components_info is not None:
            comp_added = set(sliver2.attached_components_info.devices.keys())
​
        if sliver1.attached_components_info is not None and sliver2.attached_components_info is None:
            comp_removed = set(sliver1.attached_components_info.devices.keys())
​
        if sliver1.network_service_info is not None and sliver2.network_service_info is not None:
            diff_ns = dict_diff(sliver1.network_service_info.services,
                                sliver2.network_service_info.services)
            ns_added = set(diff_ns['added'].keys())
            ns_removed = set(diff_ns['removed'].keys())
​
        if sliver1.network_service_info is None and sliver2.network_service_info is not None:
            ns_added = set(sliver2.network_service_info.services.keys())
​
        if sliver1.network_service_info is not None and sliver2.network_service_info is None:
            ns_removed = set(sliver1.network_service_info.services.keys())
​
        if len(comp_added) > 0 or len(comp_removed) > 0 or len(ns_removed) > 0 or len(ns_added) > 0:
            return TopologyDiff(added=TopologyDiffTuple(components=comp_added, services=ns_added, interfaces=set(),
                                                        nodes=set()),
                                removed=TopologyDiffTuple(components=comp_removed, services=ns_removed,
                                                          interfaces=set(), nodes=set()))
​
    return None
​
​
def ns_sliver_diff(*, sliver1: NetworkServiceSliver, sliver2: NetworkServiceSliver) -> TopologyDiff or None:
    if sliver1 is not None and sliver2 is not None:
        ifs_added = set()
        ifs_removed = set()
        if sliver1.interface_info is not None and sliver2.interface_info is not None:
            diff_comps = dict_diff(sliver1.interface_info.interfaces,
                                   sliver2.interface_info.interfaces)
            ifs_added = set(diff_comps['added'].keys())
            ifs_removed = set(diff_comps['removed'].keys())
​
        if sliver1.interface_info is None and sliver2.interface_info is not None:
            ifs_added = set(sliver2.interface_info.interfaces.keys())
​
        if sliver1.interface_info is not None and sliver2.interface_info is None:
            ifs_removed = set(sliver1.interface_info.interfaces.keys())
​
        if len(ifs_added) > 0 or len(ifs_removed) > 0:
            return TopologyDiff(added=TopologyDiffTuple(components=set(), services=set(), interfaces=ifs_added,
                                                        nodes=set()),
                                removed=TopologyDiffTuple(components=set(), services=set(),
                                                          interfaces=ifs_removed, nodes=set()))
​
    return None
​
​
def node_sliver_to_str(*, sliver: NodeSliver):
    result = str(sliver)
    nic_types = [ComponentType.SharedNIC, ComponentType.SmartNIC]
    if sliver.attached_components_info is not None:
        for c in sliver.attached_components_info.devices.values():
            result += f"\nComponent: {c}"
            if c.get_type() not in nic_types:
                continue
            if c.network_service_info is not None and c.network_service_info.network_services is not None:
                for ns in c.network_service_info.network_services.values():
                    result += f"\nNS: {ns}"
                    if ns.interface_info is not None and ns.interface_info.interfaces is not None:
                        for i in ns.interface_info.interfaces.values():
                            result += f"\nIFS: {i}"
    return result
​
​
def ns_sliver_to_str(*, sliver: NetworkServiceSliver):
    result = str(sliver)
    for interface in sliver.interface_info.interfaces.values():
        result += f"\nIFS: {interface}"
    return result
​```


Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index ea799e9..bb32706 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Requirements Status](https://requires.io/github/fabric-testbed/InformationModel/requirements.svg?branch=rel-1.2)](https://requires.io/github/fabric-testbed/InformationModel/requirements/?branch=rel-1.2)
+[![Requirements Status](https://requires.io/github/fabric-testbed/InformationModel/requirements.svg?branch=master)](https://requires.io/github/fabric-testbed/InformationModel/requirements/?branch=master)
 
 [![PyPI](https://img.shields.io/pypi/v/fabric-fim?style=plastic)](https://pypi.org/manage/project/fabric-fim/releases/)
 
diff --git a/fim/__init__.py b/fim/__init__.py
index 3362214..ccf99af 100644
--- a/fim/__init__.py
+++ b/fim/__init__.py
@@ -1,3 +1,3 @@
 #
-__VERSION__ = "1.3.0b2"
+__VERSION__ = "1.3.0rc1"
 
diff --git a/fim/graph/abc_property_graph.py b/fim/graph/abc_property_graph.py
index 5b01a51..9d7e8dc 100644
--- a/fim/graph/abc_property_graph.py
+++ b/fim/graph/abc_property_graph.py
@@ -948,6 +948,56 @@ def build_deep_component_sliver_from_dict(*, props: Dict[str, Any]) -> Component
             cs.network_service_info = nsi
         return cs
 
+    def build_deep_interface_sliver(self, *, node_id: str) -> InterfaceSliver:
+        """
+        Build a deep interface sliver from graph
+        :param node_id:
+        :return:
+        """
+        clazzes, props = self.get_node_properties(node_id=node_id)
+        if ABCPropertyGraph.CLASS_ConnectionPoint not in clazzes:
+            raise PropertyGraphQueryException(node_id=node_id, graph_id=self.graph_id,
+                                              msg="Node is not of class Interface")
+        # create top-level sliver
+        isl = ABCPropertyGraph.interface_sliver_from_graph_properties_dict(props)
+        return isl
+
+    @staticmethod
+    def build_deep_interface_sliver_from_dict(*, props: Dict[str, Any]) -> InterfaceSliver:
+        """
+        Build a deep interface sliver from graph
+        :param props:
+        :return:
+        """
+        # create top-level sliver
+        isl = ABCPropertyGraph.interface_sliver_from_graph_properties_dict(props)
+        return isl
+
+    def build_deep_link_sliver(self, *, node_id: str) -> NetworkLinkSliver:
+        """
+        Build a deep link sliver from graph
+        :param node_id:
+        :return:
+        """
+        clazzes, props = self.get_node_properties(node_id=node_id)
+        if ABCPropertyGraph.CLASS_Link not in clazzes:
+            raise PropertyGraphQueryException(node_id=node_id, graph_id=self.graph_id,
+                                              msg="Node is not of class Link")
+        # create top-level sliver
+        lsl = ABCPropertyGraph.link_sliver_from_graph_properties_dict(props)
+        return lsl
+
+    @staticmethod
+    def build_deep_link_sliver_from_dict(*, props: Dict[str, Any]) -> NetworkLinkSliver:
+        """
+        Build a deep link sliver from graph
+        :param props:
+        :return:
+        """
+        # create top-level sliver
+        lsl = ABCPropertyGraph.link_sliver_from_graph_properties_dict(props)
+        return lsl
+
     def remove_network_node_with_components_nss_cps_and_links(self, node_id: str):
         """
         Remove a network node, all of components and their interfaces, parent interfaces
@@ -1211,9 +1261,9 @@ def get_parent(self, node_id: str, rel: str, parent: str) -> Tuple[str, str]:
         :param parent: parent class
         :return:
         """
-        assert node_id is not None
-        assert rel is not None
-        assert parent is not None
+        #assert node_id is not None
+        #assert rel is not None
+        #assert parent is not None
         parent_ids = self.get_first_neighbor(node_id=node_id, rel=rel,
                                              node_label=parent)
         if len(parent_ids) != 1:
diff --git a/fim/slivers/attached_components.py b/fim/slivers/attached_components.py
index d764cf4..e69cc27 100644
--- a/fim/slivers/attached_components.py
+++ b/fim/slivers/attached_components.py
@@ -28,6 +28,7 @@
 
 from .base_sliver import BaseSliver
 from .network_service import NetworkServiceInfo
+from .topology_diff import TopologyDiff
 
 
 @enum.unique
@@ -63,6 +64,9 @@ def type_from_str(ctype: str) -> ComponentType or None:
             if ctype == str(t):
                 return t
 
+    def diff(self, other_sliver) -> TopologyDiff or None:
+        raise RuntimeError('Not implemented')
+
 
 class AttachedComponentsInfo:
     """
diff --git a/fim/slivers/base_sliver.py b/fim/slivers/base_sliver.py
index 399f9af..d1d740c 100644
--- a/fim/slivers/base_sliver.py
+++ b/fim/slivers/base_sliver.py
@@ -33,6 +33,7 @@
 from fim.slivers.delegations import Delegations
 from fim.slivers.tags import Tags
 from fim.slivers.measurement_data import MeasurementData
+from fim.slivers.topology_diff import TopologyDiff, TopologyDiffTuple
 
 
 class BaseSliver(ABC):
@@ -213,6 +214,26 @@ def set_properties(self, **kwargs):
             # we can set anything the sliver model has a setter for
             self.__getattribute__('set_' + k)(v)
 
+    @staticmethod
+    def _dict_diff(dict_a, dict_b, show_value_diff=False):
+        """
+        supports diffing slivers
+        """
+        result = {'added': {k: dict_b[k] for k in set(dict_b) - set(dict_a)},
+                  'removed': {k: dict_a[k] for k in set(dict_a) - set(dict_b)}}
+        if show_value_diff:
+            common_keys = set(dict_a) & set(dict_b)
+            result['value_diffs'] = {
+                k: (dict_a[k], dict_b[k])
+                for k in common_keys
+                if dict_a[k] != dict_b[k]
+            }
+        return result
+
+    @abstractmethod
+    def diff(self, other_sliver) -> TopologyDiff or None:
+        assert isinstance(self, other_sliver.__class__)
+
     @classmethod
     def list_properties(cls) -> Tuple[str]:
         """
diff --git a/fim/slivers/data/instance_sizes.json b/fim/slivers/data/instance_sizes.json
index c281c72..7b1579f 100644
--- a/fim/slivers/data/instance_sizes.json
+++ b/fim/slivers/data/instance_sizes.json
@@ -1,27 +1,4872 @@
 {
-  "fabric.c1.m4.d10": {"core":1, "ram":4, "disk": 10},
-  "fabric.c2.m8.d10": {"core":2, "ram":8, "disk": 10},
-  "fabric.c4.m16.d10": {"core":4, "ram":16, "disk": 10},
-  "fabric.c8.m32.d10": {"core":8, "ram":32, "disk": 10},
-  "fabric.c16.m64.d10": {"core":16, "ram":64, "disk": 10},
-  "fabric.c32.m128.d10": {"core":32, "ram":128, "disk": 10},
-  "fabric.c1.m4.d100": {"core":1, "ram":4, "disk": 100},
-  "fabric.c2.m8.d100": {"core":2, "ram":8, "disk": 100},
-  "fabric.c4.m16.d100": {"core":4, "ram":16, "disk": 100},
-  "fabric.c8.m32.d100": {"core":8, "ram":32, "disk": 100},
-  "fabric.c16.m64.d100": {"core":16, "ram":64, "disk": 100},
-  "fabric.c32.m128.d100": {"core":32, "ram":128, "disk": 100},
-  "fabric.c1.m4.d500": {"core":1, "ram":4, "disk": 500},
-  "fabric.c2.m8.d500": {"core":2, "ram":8, "disk": 500},
-  "fabric.c4.m16.d500": {"core":4, "ram":16, "disk": 500},
-  "fabric.c8.m32.d500": {"core":8, "ram":32, "disk": 500},
-  "fabric.c16.m64.d500": {"core":16, "ram":64, "disk": 500},
-  "fabric.c32.m128.d500": {"core":32, "ram":128, "disk": 500},
-  "fabric.c1.m4.d2000": {"core":1, "ram":4, "disk": 2000},
-  "fabric.c2.m8.d2000": {"core":2, "ram":8, "disk": 2000},
-  "fabric.c4.m16.d2000": {"core":4, "ram":16, "disk": 2000},
-  "fabric.c8.m32.d2000": {"core":8, "ram":32, "disk": 2000},
-  "fabric.c16.m64.d2000": {"core":16, "ram":64, "disk": 2000},
-  "fabric.c32.m128.d2000": {"core":32, "ram":128, "disk": 2000},
-  "fabric.c64.m384.d4000": {"core":64, "ram":384, "disk": 4000}
-}
\ No newline at end of file
+  "fabric.c4.m4.d10": {
+    "core": 4,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c4.m4.d100": {
+    "core": 4,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c4.m4.d500": {
+    "core": 4,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c4.m4.d2000": {
+    "core": 4,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c4.m8.d10": {
+    "core": 4,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c4.m8.d100": {
+    "core": 4,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c4.m8.d500": {
+    "core": 4,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c4.m8.d2000": {
+    "core": 4,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c4.m16.d10": {
+    "core": 4,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c4.m16.d100": {
+    "core": 4,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c4.m16.d500": {
+    "core": 4,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c4.m16.d2000": {
+    "core": 4,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c4.m32.d10": {
+    "core": 4,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c4.m32.d100": {
+    "core": 4,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c4.m32.d500": {
+    "core": 4,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c4.m32.d2000": {
+    "core": 4,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c4.m64.d10": {
+    "core": 4,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c4.m64.d100": {
+    "core": 4,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c4.m64.d500": {
+    "core": 4,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c4.m64.d2000": {
+    "core": 4,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c4.m128.d10": {
+    "core": 4,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c4.m128.d100": {
+    "core": 4,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c4.m128.d500": {
+    "core": 4,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c4.m128.d2000": {
+    "core": 4,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c4.m256.d10": {
+    "core": 4,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c4.m256.d100": {
+    "core": 4,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c4.m256.d500": {
+    "core": 4,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c4.m256.d2000": {
+    "core": 4,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c4.m384.d10": {
+    "core": 4,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c4.m384.d100": {
+    "core": 4,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c4.m384.d500": {
+    "core": 4,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c4.m384.d2000": {
+    "core": 4,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c6.m4.d10": {
+    "core": 6,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c6.m4.d100": {
+    "core": 6,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c6.m4.d500": {
+    "core": 6,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c6.m4.d2000": {
+    "core": 6,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c6.m8.d10": {
+    "core": 6,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c6.m8.d100": {
+    "core": 6,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c6.m8.d500": {
+    "core": 6,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c6.m8.d2000": {
+    "core": 6,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c6.m16.d10": {
+    "core": 6,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c6.m16.d100": {
+    "core": 6,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c6.m16.d500": {
+    "core": 6,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c6.m16.d2000": {
+    "core": 6,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c6.m32.d10": {
+    "core": 6,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c6.m32.d100": {
+    "core": 6,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c6.m32.d500": {
+    "core": 6,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c6.m32.d2000": {
+    "core": 6,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c6.m64.d10": {
+    "core": 6,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c6.m64.d100": {
+    "core": 6,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c6.m64.d500": {
+    "core": 6,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c6.m64.d2000": {
+    "core": 6,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c6.m128.d10": {
+    "core": 6,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c6.m128.d100": {
+    "core": 6,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c6.m128.d500": {
+    "core": 6,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c6.m128.d2000": {
+    "core": 6,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c6.m256.d10": {
+    "core": 6,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c6.m256.d100": {
+    "core": 6,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c6.m256.d500": {
+    "core": 6,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c6.m256.d2000": {
+    "core": 6,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c6.m384.d10": {
+    "core": 6,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c6.m384.d100": {
+    "core": 6,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c6.m384.d500": {
+    "core": 6,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c6.m384.d2000": {
+    "core": 6,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c8.m4.d10": {
+    "core": 8,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c8.m4.d100": {
+    "core": 8,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c8.m4.d500": {
+    "core": 8,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c8.m4.d2000": {
+    "core": 8,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c8.m8.d10": {
+    "core": 8,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c8.m8.d100": {
+    "core": 8,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c8.m8.d500": {
+    "core": 8,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c8.m8.d2000": {
+    "core": 8,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c8.m16.d10": {
+    "core": 8,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c8.m16.d100": {
+    "core": 8,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c8.m16.d500": {
+    "core": 8,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c8.m16.d2000": {
+    "core": 8,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c8.m32.d10": {
+    "core": 8,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c8.m32.d100": {
+    "core": 8,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c8.m32.d500": {
+    "core": 8,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c8.m32.d2000": {
+    "core": 8,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c8.m64.d10": {
+    "core": 8,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c8.m64.d100": {
+    "core": 8,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c8.m64.d500": {
+    "core": 8,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c8.m64.d2000": {
+    "core": 8,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c8.m128.d10": {
+    "core": 8,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c8.m128.d100": {
+    "core": 8,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c8.m128.d500": {
+    "core": 8,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c8.m128.d2000": {
+    "core": 8,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c8.m256.d10": {
+    "core": 8,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c8.m256.d100": {
+    "core": 8,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c8.m256.d500": {
+    "core": 8,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c8.m256.d2000": {
+    "core": 8,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c8.m384.d10": {
+    "core": 8,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c8.m384.d100": {
+    "core": 8,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c8.m384.d500": {
+    "core": 8,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c8.m384.d2000": {
+    "core": 8,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c10.m4.d10": {
+    "core": 10,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c10.m4.d100": {
+    "core": 10,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c10.m4.d500": {
+    "core": 10,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c10.m4.d2000": {
+    "core": 10,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c10.m8.d10": {
+    "core": 10,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c10.m8.d100": {
+    "core": 10,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c10.m8.d500": {
+    "core": 10,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c10.m8.d2000": {
+    "core": 10,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c10.m16.d10": {
+    "core": 10,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c10.m16.d100": {
+    "core": 10,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c10.m16.d500": {
+    "core": 10,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c10.m16.d2000": {
+    "core": 10,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c10.m32.d10": {
+    "core": 10,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c10.m32.d100": {
+    "core": 10,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c10.m32.d500": {
+    "core": 10,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c10.m32.d2000": {
+    "core": 10,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c10.m64.d10": {
+    "core": 10,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c10.m64.d100": {
+    "core": 10,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c10.m64.d500": {
+    "core": 10,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c10.m64.d2000": {
+    "core": 10,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c10.m128.d10": {
+    "core": 10,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c10.m128.d100": {
+    "core": 10,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c10.m128.d500": {
+    "core": 10,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c10.m128.d2000": {
+    "core": 10,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c10.m256.d10": {
+    "core": 10,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c10.m256.d100": {
+    "core": 10,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c10.m256.d500": {
+    "core": 10,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c10.m256.d2000": {
+    "core": 10,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c10.m384.d10": {
+    "core": 10,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c10.m384.d100": {
+    "core": 10,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c10.m384.d500": {
+    "core": 10,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c10.m384.d2000": {
+    "core": 10,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c12.m4.d10": {
+    "core": 12,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c12.m4.d100": {
+    "core": 12,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c12.m4.d500": {
+    "core": 12,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c12.m4.d2000": {
+    "core": 12,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c12.m8.d10": {
+    "core": 12,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c12.m8.d100": {
+    "core": 12,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c12.m8.d500": {
+    "core": 12,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c12.m8.d2000": {
+    "core": 12,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c12.m16.d10": {
+    "core": 12,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c12.m16.d100": {
+    "core": 12,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c12.m16.d500": {
+    "core": 12,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c12.m16.d2000": {
+    "core": 12,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c12.m32.d10": {
+    "core": 12,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c12.m32.d100": {
+    "core": 12,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c12.m32.d500": {
+    "core": 12,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c12.m32.d2000": {
+    "core": 12,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c12.m64.d10": {
+    "core": 12,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c12.m64.d100": {
+    "core": 12,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c12.m64.d500": {
+    "core": 12,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c12.m64.d2000": {
+    "core": 12,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c12.m128.d10": {
+    "core": 12,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c12.m128.d100": {
+    "core": 12,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c12.m128.d500": {
+    "core": 12,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c12.m128.d2000": {
+    "core": 12,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c12.m256.d10": {
+    "core": 12,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c12.m256.d100": {
+    "core": 12,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c12.m256.d500": {
+    "core": 12,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c12.m256.d2000": {
+    "core": 12,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c12.m384.d10": {
+    "core": 12,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c12.m384.d100": {
+    "core": 12,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c12.m384.d500": {
+    "core": 12,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c12.m384.d2000": {
+    "core": 12,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c14.m4.d10": {
+    "core": 14,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c14.m4.d100": {
+    "core": 14,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c14.m4.d500": {
+    "core": 14,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c14.m4.d2000": {
+    "core": 14,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c14.m8.d10": {
+    "core": 14,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c14.m8.d100": {
+    "core": 14,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c14.m8.d500": {
+    "core": 14,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c14.m8.d2000": {
+    "core": 14,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c14.m16.d10": {
+    "core": 14,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c14.m16.d100": {
+    "core": 14,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c14.m16.d500": {
+    "core": 14,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c14.m16.d2000": {
+    "core": 14,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c14.m32.d10": {
+    "core": 14,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c14.m32.d100": {
+    "core": 14,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c14.m32.d500": {
+    "core": 14,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c14.m32.d2000": {
+    "core": 14,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c14.m64.d10": {
+    "core": 14,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c14.m64.d100": {
+    "core": 14,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c14.m64.d500": {
+    "core": 14,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c14.m64.d2000": {
+    "core": 14,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c14.m128.d10": {
+    "core": 14,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c14.m128.d100": {
+    "core": 14,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c14.m128.d500": {
+    "core": 14,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c14.m128.d2000": {
+    "core": 14,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c14.m256.d10": {
+    "core": 14,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c14.m256.d100": {
+    "core": 14,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c14.m256.d500": {
+    "core": 14,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c14.m256.d2000": {
+    "core": 14,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c14.m384.d10": {
+    "core": 14,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c14.m384.d100": {
+    "core": 14,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c14.m384.d500": {
+    "core": 14,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c14.m384.d2000": {
+    "core": 14,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c16.m4.d10": {
+    "core": 16,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c16.m4.d100": {
+    "core": 16,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c16.m4.d500": {
+    "core": 16,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c16.m4.d2000": {
+    "core": 16,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c16.m8.d10": {
+    "core": 16,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c16.m8.d100": {
+    "core": 16,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c16.m8.d500": {
+    "core": 16,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c16.m8.d2000": {
+    "core": 16,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c16.m16.d10": {
+    "core": 16,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c16.m16.d100": {
+    "core": 16,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c16.m16.d500": {
+    "core": 16,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c16.m16.d2000": {
+    "core": 16,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c16.m32.d10": {
+    "core": 16,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c16.m32.d100": {
+    "core": 16,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c16.m32.d500": {
+    "core": 16,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c16.m32.d2000": {
+    "core": 16,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c16.m64.d10": {
+    "core": 16,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c16.m64.d100": {
+    "core": 16,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c16.m64.d500": {
+    "core": 16,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c16.m64.d2000": {
+    "core": 16,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c16.m128.d10": {
+    "core": 16,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c16.m128.d100": {
+    "core": 16,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c16.m128.d500": {
+    "core": 16,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c16.m128.d2000": {
+    "core": 16,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c16.m256.d10": {
+    "core": 16,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c16.m256.d100": {
+    "core": 16,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c16.m256.d500": {
+    "core": 16,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c16.m256.d2000": {
+    "core": 16,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c16.m384.d10": {
+    "core": 16,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c16.m384.d100": {
+    "core": 16,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c16.m384.d500": {
+    "core": 16,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c16.m384.d2000": {
+    "core": 16,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c18.m4.d10": {
+    "core": 18,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c18.m4.d100": {
+    "core": 18,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c18.m4.d500": {
+    "core": 18,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c18.m4.d2000": {
+    "core": 18,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c18.m8.d10": {
+    "core": 18,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c18.m8.d100": {
+    "core": 18,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c18.m8.d500": {
+    "core": 18,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c18.m8.d2000": {
+    "core": 18,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c18.m16.d10": {
+    "core": 18,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c18.m16.d100": {
+    "core": 18,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c18.m16.d500": {
+    "core": 18,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c18.m16.d2000": {
+    "core": 18,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c18.m32.d10": {
+    "core": 18,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c18.m32.d100": {
+    "core": 18,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c18.m32.d500": {
+    "core": 18,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c18.m32.d2000": {
+    "core": 18,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c18.m64.d10": {
+    "core": 18,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c18.m64.d100": {
+    "core": 18,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c18.m64.d500": {
+    "core": 18,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c18.m64.d2000": {
+    "core": 18,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c18.m128.d10": {
+    "core": 18,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c18.m128.d100": {
+    "core": 18,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c18.m128.d500": {
+    "core": 18,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c18.m128.d2000": {
+    "core": 18,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c18.m256.d10": {
+    "core": 18,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c18.m256.d100": {
+    "core": 18,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c18.m256.d500": {
+    "core": 18,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c18.m256.d2000": {
+    "core": 18,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c18.m384.d10": {
+    "core": 18,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c18.m384.d100": {
+    "core": 18,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c18.m384.d500": {
+    "core": 18,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c18.m384.d2000": {
+    "core": 18,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c20.m4.d10": {
+    "core": 20,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c20.m4.d100": {
+    "core": 20,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c20.m4.d500": {
+    "core": 20,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c20.m4.d2000": {
+    "core": 20,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c20.m8.d10": {
+    "core": 20,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c20.m8.d100": {
+    "core": 20,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c20.m8.d500": {
+    "core": 20,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c20.m8.d2000": {
+    "core": 20,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c20.m16.d10": {
+    "core": 20,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c20.m16.d100": {
+    "core": 20,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c20.m16.d500": {
+    "core": 20,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c20.m16.d2000": {
+    "core": 20,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c20.m32.d10": {
+    "core": 20,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c20.m32.d100": {
+    "core": 20,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c20.m32.d500": {
+    "core": 20,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c20.m32.d2000": {
+    "core": 20,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c20.m64.d10": {
+    "core": 20,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c20.m64.d100": {
+    "core": 20,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c20.m64.d500": {
+    "core": 20,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c20.m64.d2000": {
+    "core": 20,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c20.m128.d10": {
+    "core": 20,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c20.m128.d100": {
+    "core": 20,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c20.m128.d500": {
+    "core": 20,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c20.m128.d2000": {
+    "core": 20,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c20.m256.d10": {
+    "core": 20,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c20.m256.d100": {
+    "core": 20,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c20.m256.d500": {
+    "core": 20,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c20.m256.d2000": {
+    "core": 20,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c20.m384.d10": {
+    "core": 20,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c20.m384.d100": {
+    "core": 20,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c20.m384.d500": {
+    "core": 20,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c20.m384.d2000": {
+    "core": 20,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c22.m4.d10": {
+    "core": 22,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c22.m4.d100": {
+    "core": 22,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c22.m4.d500": {
+    "core": 22,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c22.m4.d2000": {
+    "core": 22,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c22.m8.d10": {
+    "core": 22,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c22.m8.d100": {
+    "core": 22,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c22.m8.d500": {
+    "core": 22,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c22.m8.d2000": {
+    "core": 22,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c22.m16.d10": {
+    "core": 22,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c22.m16.d100": {
+    "core": 22,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c22.m16.d500": {
+    "core": 22,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c22.m16.d2000": {
+    "core": 22,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c22.m32.d10": {
+    "core": 22,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c22.m32.d100": {
+    "core": 22,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c22.m32.d500": {
+    "core": 22,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c22.m32.d2000": {
+    "core": 22,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c22.m64.d10": {
+    "core": 22,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c22.m64.d100": {
+    "core": 22,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c22.m64.d500": {
+    "core": 22,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c22.m64.d2000": {
+    "core": 22,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c22.m128.d10": {
+    "core": 22,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c22.m128.d100": {
+    "core": 22,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c22.m128.d500": {
+    "core": 22,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c22.m128.d2000": {
+    "core": 22,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c22.m256.d10": {
+    "core": 22,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c22.m256.d100": {
+    "core": 22,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c22.m256.d500": {
+    "core": 22,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c22.m256.d2000": {
+    "core": 22,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c22.m384.d10": {
+    "core": 22,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c22.m384.d100": {
+    "core": 22,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c22.m384.d500": {
+    "core": 22,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c22.m384.d2000": {
+    "core": 22,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c24.m4.d10": {
+    "core": 24,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c24.m4.d100": {
+    "core": 24,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c24.m4.d500": {
+    "core": 24,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c24.m4.d2000": {
+    "core": 24,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c24.m8.d10": {
+    "core": 24,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c24.m8.d100": {
+    "core": 24,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c24.m8.d500": {
+    "core": 24,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c24.m8.d2000": {
+    "core": 24,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c24.m16.d10": {
+    "core": 24,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c24.m16.d100": {
+    "core": 24,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c24.m16.d500": {
+    "core": 24,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c24.m16.d2000": {
+    "core": 24,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c24.m32.d10": {
+    "core": 24,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c24.m32.d100": {
+    "core": 24,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c24.m32.d500": {
+    "core": 24,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c24.m32.d2000": {
+    "core": 24,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c24.m64.d10": {
+    "core": 24,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c24.m64.d100": {
+    "core": 24,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c24.m64.d500": {
+    "core": 24,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c24.m64.d2000": {
+    "core": 24,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c24.m128.d10": {
+    "core": 24,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c24.m128.d100": {
+    "core": 24,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c24.m128.d500": {
+    "core": 24,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c24.m128.d2000": {
+    "core": 24,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c24.m256.d10": {
+    "core": 24,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c24.m256.d100": {
+    "core": 24,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c24.m256.d500": {
+    "core": 24,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c24.m256.d2000": {
+    "core": 24,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c24.m384.d10": {
+    "core": 24,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c24.m384.d100": {
+    "core": 24,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c24.m384.d500": {
+    "core": 24,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c24.m384.d2000": {
+    "core": 24,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c26.m4.d10": {
+    "core": 26,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c26.m4.d100": {
+    "core": 26,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c26.m4.d500": {
+    "core": 26,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c26.m4.d2000": {
+    "core": 26,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c26.m8.d10": {
+    "core": 26,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c26.m8.d100": {
+    "core": 26,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c26.m8.d500": {
+    "core": 26,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c26.m8.d2000": {
+    "core": 26,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c26.m16.d10": {
+    "core": 26,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c26.m16.d100": {
+    "core": 26,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c26.m16.d500": {
+    "core": 26,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c26.m16.d2000": {
+    "core": 26,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c26.m32.d10": {
+    "core": 26,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c26.m32.d100": {
+    "core": 26,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c26.m32.d500": {
+    "core": 26,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c26.m32.d2000": {
+    "core": 26,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c26.m64.d10": {
+    "core": 26,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c26.m64.d100": {
+    "core": 26,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c26.m64.d500": {
+    "core": 26,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c26.m64.d2000": {
+    "core": 26,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c26.m128.d10": {
+    "core": 26,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c26.m128.d100": {
+    "core": 26,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c26.m128.d500": {
+    "core": 26,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c26.m128.d2000": {
+    "core": 26,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c26.m256.d10": {
+    "core": 26,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c26.m256.d100": {
+    "core": 26,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c26.m256.d500": {
+    "core": 26,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c26.m256.d2000": {
+    "core": 26,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c26.m384.d10": {
+    "core": 26,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c26.m384.d100": {
+    "core": 26,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c26.m384.d500": {
+    "core": 26,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c26.m384.d2000": {
+    "core": 26,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c28.m4.d10": {
+    "core": 28,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c28.m4.d100": {
+    "core": 28,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c28.m4.d500": {
+    "core": 28,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c28.m4.d2000": {
+    "core": 28,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c28.m8.d10": {
+    "core": 28,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c28.m8.d100": {
+    "core": 28,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c28.m8.d500": {
+    "core": 28,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c28.m8.d2000": {
+    "core": 28,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c28.m16.d10": {
+    "core": 28,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c28.m16.d100": {
+    "core": 28,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c28.m16.d500": {
+    "core": 28,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c28.m16.d2000": {
+    "core": 28,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c28.m32.d10": {
+    "core": 28,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c28.m32.d100": {
+    "core": 28,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c28.m32.d500": {
+    "core": 28,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c28.m32.d2000": {
+    "core": 28,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c28.m64.d10": {
+    "core": 28,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c28.m64.d100": {
+    "core": 28,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c28.m64.d500": {
+    "core": 28,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c28.m64.d2000": {
+    "core": 28,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c28.m128.d10": {
+    "core": 28,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c28.m128.d100": {
+    "core": 28,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c28.m128.d500": {
+    "core": 28,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c28.m128.d2000": {
+    "core": 28,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c28.m256.d10": {
+    "core": 28,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c28.m256.d100": {
+    "core": 28,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c28.m256.d500": {
+    "core": 28,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c28.m256.d2000": {
+    "core": 28,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c28.m384.d10": {
+    "core": 28,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c28.m384.d100": {
+    "core": 28,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c28.m384.d500": {
+    "core": 28,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c28.m384.d2000": {
+    "core": 28,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c30.m4.d10": {
+    "core": 30,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c30.m4.d100": {
+    "core": 30,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c30.m4.d500": {
+    "core": 30,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c30.m4.d2000": {
+    "core": 30,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c30.m8.d10": {
+    "core": 30,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c30.m8.d100": {
+    "core": 30,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c30.m8.d500": {
+    "core": 30,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c30.m8.d2000": {
+    "core": 30,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c30.m16.d10": {
+    "core": 30,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c30.m16.d100": {
+    "core": 30,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c30.m16.d500": {
+    "core": 30,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c30.m16.d2000": {
+    "core": 30,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c30.m32.d10": {
+    "core": 30,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c30.m32.d100": {
+    "core": 30,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c30.m32.d500": {
+    "core": 30,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c30.m32.d2000": {
+    "core": 30,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c30.m64.d10": {
+    "core": 30,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c30.m64.d100": {
+    "core": 30,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c30.m64.d500": {
+    "core": 30,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c30.m64.d2000": {
+    "core": 30,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c30.m128.d10": {
+    "core": 30,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c30.m128.d100": {
+    "core": 30,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c30.m128.d500": {
+    "core": 30,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c30.m128.d2000": {
+    "core": 30,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c30.m256.d10": {
+    "core": 30,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c30.m256.d100": {
+    "core": 30,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c30.m256.d500": {
+    "core": 30,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c30.m256.d2000": {
+    "core": 30,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c30.m384.d10": {
+    "core": 30,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c30.m384.d100": {
+    "core": 30,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c30.m384.d500": {
+    "core": 30,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c30.m384.d2000": {
+    "core": 30,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c32.m4.d10": {
+    "core": 32,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c32.m4.d100": {
+    "core": 32,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c32.m4.d500": {
+    "core": 32,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c32.m4.d2000": {
+    "core": 32,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c32.m8.d10": {
+    "core": 32,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c32.m8.d100": {
+    "core": 32,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c32.m8.d500": {
+    "core": 32,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c32.m8.d2000": {
+    "core": 32,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c32.m16.d10": {
+    "core": 32,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c32.m16.d100": {
+    "core": 32,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c32.m16.d500": {
+    "core": 32,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c32.m16.d2000": {
+    "core": 32,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c32.m32.d10": {
+    "core": 32,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c32.m32.d100": {
+    "core": 32,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c32.m32.d500": {
+    "core": 32,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c32.m32.d2000": {
+    "core": 32,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c32.m64.d10": {
+    "core": 32,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c32.m64.d100": {
+    "core": 32,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c32.m64.d500": {
+    "core": 32,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c32.m64.d2000": {
+    "core": 32,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c32.m128.d10": {
+    "core": 32,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c32.m128.d100": {
+    "core": 32,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c32.m128.d500": {
+    "core": 32,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c32.m128.d2000": {
+    "core": 32,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c32.m256.d10": {
+    "core": 32,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c32.m256.d100": {
+    "core": 32,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c32.m256.d500": {
+    "core": 32,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c32.m256.d2000": {
+    "core": 32,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c32.m384.d10": {
+    "core": 32,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c32.m384.d100": {
+    "core": 32,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c32.m384.d500": {
+    "core": 32,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c32.m384.d2000": {
+    "core": 32,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c34.m4.d10": {
+    "core": 34,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c34.m4.d100": {
+    "core": 34,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c34.m4.d500": {
+    "core": 34,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c34.m4.d2000": {
+    "core": 34,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c34.m8.d10": {
+    "core": 34,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c34.m8.d100": {
+    "core": 34,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c34.m8.d500": {
+    "core": 34,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c34.m8.d2000": {
+    "core": 34,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c34.m16.d10": {
+    "core": 34,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c34.m16.d100": {
+    "core": 34,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c34.m16.d500": {
+    "core": 34,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c34.m16.d2000": {
+    "core": 34,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c34.m32.d10": {
+    "core": 34,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c34.m32.d100": {
+    "core": 34,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c34.m32.d500": {
+    "core": 34,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c34.m32.d2000": {
+    "core": 34,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c34.m64.d10": {
+    "core": 34,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c34.m64.d100": {
+    "core": 34,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c34.m64.d500": {
+    "core": 34,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c34.m64.d2000": {
+    "core": 34,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c34.m128.d10": {
+    "core": 34,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c34.m128.d100": {
+    "core": 34,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c34.m128.d500": {
+    "core": 34,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c34.m128.d2000": {
+    "core": 34,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c34.m256.d10": {
+    "core": 34,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c34.m256.d100": {
+    "core": 34,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c34.m256.d500": {
+    "core": 34,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c34.m256.d2000": {
+    "core": 34,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c34.m384.d10": {
+    "core": 34,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c34.m384.d100": {
+    "core": 34,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c34.m384.d500": {
+    "core": 34,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c34.m384.d2000": {
+    "core": 34,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c36.m4.d10": {
+    "core": 36,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c36.m4.d100": {
+    "core": 36,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c36.m4.d500": {
+    "core": 36,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c36.m4.d2000": {
+    "core": 36,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c36.m8.d10": {
+    "core": 36,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c36.m8.d100": {
+    "core": 36,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c36.m8.d500": {
+    "core": 36,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c36.m8.d2000": {
+    "core": 36,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c36.m16.d10": {
+    "core": 36,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c36.m16.d100": {
+    "core": 36,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c36.m16.d500": {
+    "core": 36,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c36.m16.d2000": {
+    "core": 36,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c36.m32.d10": {
+    "core": 36,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c36.m32.d100": {
+    "core": 36,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c36.m32.d500": {
+    "core": 36,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c36.m32.d2000": {
+    "core": 36,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c36.m64.d10": {
+    "core": 36,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c36.m64.d100": {
+    "core": 36,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c36.m64.d500": {
+    "core": 36,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c36.m64.d2000": {
+    "core": 36,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c36.m128.d10": {
+    "core": 36,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c36.m128.d100": {
+    "core": 36,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c36.m128.d500": {
+    "core": 36,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c36.m128.d2000": {
+    "core": 36,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c36.m256.d10": {
+    "core": 36,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c36.m256.d100": {
+    "core": 36,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c36.m256.d500": {
+    "core": 36,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c36.m256.d2000": {
+    "core": 36,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c36.m384.d10": {
+    "core": 36,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c36.m384.d100": {
+    "core": 36,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c36.m384.d500": {
+    "core": 36,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c36.m384.d2000": {
+    "core": 36,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c38.m4.d10": {
+    "core": 38,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c38.m4.d100": {
+    "core": 38,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c38.m4.d500": {
+    "core": 38,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c38.m4.d2000": {
+    "core": 38,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c38.m8.d10": {
+    "core": 38,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c38.m8.d100": {
+    "core": 38,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c38.m8.d500": {
+    "core": 38,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c38.m8.d2000": {
+    "core": 38,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c38.m16.d10": {
+    "core": 38,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c38.m16.d100": {
+    "core": 38,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c38.m16.d500": {
+    "core": 38,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c38.m16.d2000": {
+    "core": 38,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c38.m32.d10": {
+    "core": 38,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c38.m32.d100": {
+    "core": 38,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c38.m32.d500": {
+    "core": 38,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c38.m32.d2000": {
+    "core": 38,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c38.m64.d10": {
+    "core": 38,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c38.m64.d100": {
+    "core": 38,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c38.m64.d500": {
+    "core": 38,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c38.m64.d2000": {
+    "core": 38,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c38.m128.d10": {
+    "core": 38,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c38.m128.d100": {
+    "core": 38,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c38.m128.d500": {
+    "core": 38,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c38.m128.d2000": {
+    "core": 38,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c38.m256.d10": {
+    "core": 38,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c38.m256.d100": {
+    "core": 38,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c38.m256.d500": {
+    "core": 38,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c38.m256.d2000": {
+    "core": 38,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c38.m384.d10": {
+    "core": 38,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c38.m384.d100": {
+    "core": 38,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c38.m384.d500": {
+    "core": 38,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c38.m384.d2000": {
+    "core": 38,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c40.m4.d10": {
+    "core": 40,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c40.m4.d100": {
+    "core": 40,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c40.m4.d500": {
+    "core": 40,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c40.m4.d2000": {
+    "core": 40,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c40.m8.d10": {
+    "core": 40,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c40.m8.d100": {
+    "core": 40,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c40.m8.d500": {
+    "core": 40,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c40.m8.d2000": {
+    "core": 40,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c40.m16.d10": {
+    "core": 40,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c40.m16.d100": {
+    "core": 40,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c40.m16.d500": {
+    "core": 40,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c40.m16.d2000": {
+    "core": 40,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c40.m32.d10": {
+    "core": 40,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c40.m32.d100": {
+    "core": 40,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c40.m32.d500": {
+    "core": 40,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c40.m32.d2000": {
+    "core": 40,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c40.m64.d10": {
+    "core": 40,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c40.m64.d100": {
+    "core": 40,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c40.m64.d500": {
+    "core": 40,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c40.m64.d2000": {
+    "core": 40,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c40.m128.d10": {
+    "core": 40,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c40.m128.d100": {
+    "core": 40,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c40.m128.d500": {
+    "core": 40,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c40.m128.d2000": {
+    "core": 40,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c40.m256.d10": {
+    "core": 40,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c40.m256.d100": {
+    "core": 40,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c40.m256.d500": {
+    "core": 40,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c40.m256.d2000": {
+    "core": 40,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c40.m384.d10": {
+    "core": 40,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c40.m384.d100": {
+    "core": 40,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c40.m384.d500": {
+    "core": 40,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c40.m384.d2000": {
+    "core": 40,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c42.m4.d10": {
+    "core": 42,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c42.m4.d100": {
+    "core": 42,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c42.m4.d500": {
+    "core": 42,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c42.m4.d2000": {
+    "core": 42,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c42.m8.d10": {
+    "core": 42,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c42.m8.d100": {
+    "core": 42,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c42.m8.d500": {
+    "core": 42,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c42.m8.d2000": {
+    "core": 42,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c42.m16.d10": {
+    "core": 42,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c42.m16.d100": {
+    "core": 42,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c42.m16.d500": {
+    "core": 42,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c42.m16.d2000": {
+    "core": 42,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c42.m32.d10": {
+    "core": 42,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c42.m32.d100": {
+    "core": 42,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c42.m32.d500": {
+    "core": 42,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c42.m32.d2000": {
+    "core": 42,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c42.m64.d10": {
+    "core": 42,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c42.m64.d100": {
+    "core": 42,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c42.m64.d500": {
+    "core": 42,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c42.m64.d2000": {
+    "core": 42,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c42.m128.d10": {
+    "core": 42,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c42.m128.d100": {
+    "core": 42,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c42.m128.d500": {
+    "core": 42,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c42.m128.d2000": {
+    "core": 42,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c42.m256.d10": {
+    "core": 42,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c42.m256.d100": {
+    "core": 42,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c42.m256.d500": {
+    "core": 42,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c42.m256.d2000": {
+    "core": 42,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c42.m384.d10": {
+    "core": 42,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c42.m384.d100": {
+    "core": 42,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c42.m384.d500": {
+    "core": 42,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c42.m384.d2000": {
+    "core": 42,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c44.m4.d10": {
+    "core": 44,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c44.m4.d100": {
+    "core": 44,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c44.m4.d500": {
+    "core": 44,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c44.m4.d2000": {
+    "core": 44,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c44.m8.d10": {
+    "core": 44,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c44.m8.d100": {
+    "core": 44,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c44.m8.d500": {
+    "core": 44,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c44.m8.d2000": {
+    "core": 44,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c44.m16.d10": {
+    "core": 44,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c44.m16.d100": {
+    "core": 44,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c44.m16.d500": {
+    "core": 44,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c44.m16.d2000": {
+    "core": 44,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c44.m32.d10": {
+    "core": 44,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c44.m32.d100": {
+    "core": 44,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c44.m32.d500": {
+    "core": 44,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c44.m32.d2000": {
+    "core": 44,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c44.m64.d10": {
+    "core": 44,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c44.m64.d100": {
+    "core": 44,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c44.m64.d500": {
+    "core": 44,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c44.m64.d2000": {
+    "core": 44,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c44.m128.d10": {
+    "core": 44,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c44.m128.d100": {
+    "core": 44,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c44.m128.d500": {
+    "core": 44,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c44.m128.d2000": {
+    "core": 44,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c44.m256.d10": {
+    "core": 44,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c44.m256.d100": {
+    "core": 44,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c44.m256.d500": {
+    "core": 44,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c44.m256.d2000": {
+    "core": 44,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c44.m384.d10": {
+    "core": 44,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c44.m384.d100": {
+    "core": 44,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c44.m384.d500": {
+    "core": 44,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c44.m384.d2000": {
+    "core": 44,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c46.m4.d10": {
+    "core": 46,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c46.m4.d100": {
+    "core": 46,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c46.m4.d500": {
+    "core": 46,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c46.m4.d2000": {
+    "core": 46,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c46.m8.d10": {
+    "core": 46,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c46.m8.d100": {
+    "core": 46,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c46.m8.d500": {
+    "core": 46,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c46.m8.d2000": {
+    "core": 46,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c46.m16.d10": {
+    "core": 46,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c46.m16.d100": {
+    "core": 46,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c46.m16.d500": {
+    "core": 46,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c46.m16.d2000": {
+    "core": 46,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c46.m32.d10": {
+    "core": 46,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c46.m32.d100": {
+    "core": 46,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c46.m32.d500": {
+    "core": 46,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c46.m32.d2000": {
+    "core": 46,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c46.m64.d10": {
+    "core": 46,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c46.m64.d100": {
+    "core": 46,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c46.m64.d500": {
+    "core": 46,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c46.m64.d2000": {
+    "core": 46,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c46.m128.d10": {
+    "core": 46,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c46.m128.d100": {
+    "core": 46,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c46.m128.d500": {
+    "core": 46,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c46.m128.d2000": {
+    "core": 46,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c46.m256.d10": {
+    "core": 46,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c46.m256.d100": {
+    "core": 46,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c46.m256.d500": {
+    "core": 46,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c46.m256.d2000": {
+    "core": 46,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c46.m384.d10": {
+    "core": 46,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c46.m384.d100": {
+    "core": 46,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c46.m384.d500": {
+    "core": 46,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c46.m384.d2000": {
+    "core": 46,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c48.m4.d10": {
+    "core": 48,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c48.m4.d100": {
+    "core": 48,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c48.m4.d500": {
+    "core": 48,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c48.m4.d2000": {
+    "core": 48,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c48.m8.d10": {
+    "core": 48,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c48.m8.d100": {
+    "core": 48,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c48.m8.d500": {
+    "core": 48,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c48.m8.d2000": {
+    "core": 48,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c48.m16.d10": {
+    "core": 48,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c48.m16.d100": {
+    "core": 48,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c48.m16.d500": {
+    "core": 48,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c48.m16.d2000": {
+    "core": 48,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c48.m32.d10": {
+    "core": 48,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c48.m32.d100": {
+    "core": 48,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c48.m32.d500": {
+    "core": 48,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c48.m32.d2000": {
+    "core": 48,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c48.m64.d10": {
+    "core": 48,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c48.m64.d100": {
+    "core": 48,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c48.m64.d500": {
+    "core": 48,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c48.m64.d2000": {
+    "core": 48,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c48.m128.d10": {
+    "core": 48,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c48.m128.d100": {
+    "core": 48,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c48.m128.d500": {
+    "core": 48,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c48.m128.d2000": {
+    "core": 48,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c48.m256.d10": {
+    "core": 48,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c48.m256.d100": {
+    "core": 48,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c48.m256.d500": {
+    "core": 48,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c48.m256.d2000": {
+    "core": 48,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c48.m384.d10": {
+    "core": 48,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c48.m384.d100": {
+    "core": 48,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c48.m384.d500": {
+    "core": 48,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c48.m384.d2000": {
+    "core": 48,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c50.m4.d10": {
+    "core": 50,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c50.m4.d100": {
+    "core": 50,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c50.m4.d500": {
+    "core": 50,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c50.m4.d2000": {
+    "core": 50,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c50.m8.d10": {
+    "core": 50,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c50.m8.d100": {
+    "core": 50,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c50.m8.d500": {
+    "core": 50,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c50.m8.d2000": {
+    "core": 50,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c50.m16.d10": {
+    "core": 50,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c50.m16.d100": {
+    "core": 50,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c50.m16.d500": {
+    "core": 50,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c50.m16.d2000": {
+    "core": 50,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c50.m32.d10": {
+    "core": 50,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c50.m32.d100": {
+    "core": 50,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c50.m32.d500": {
+    "core": 50,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c50.m32.d2000": {
+    "core": 50,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c50.m64.d10": {
+    "core": 50,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c50.m64.d100": {
+    "core": 50,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c50.m64.d500": {
+    "core": 50,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c50.m64.d2000": {
+    "core": 50,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c50.m128.d10": {
+    "core": 50,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c50.m128.d100": {
+    "core": 50,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c50.m128.d500": {
+    "core": 50,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c50.m128.d2000": {
+    "core": 50,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c50.m256.d10": {
+    "core": 50,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c50.m256.d100": {
+    "core": 50,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c50.m256.d500": {
+    "core": 50,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c50.m256.d2000": {
+    "core": 50,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c50.m384.d10": {
+    "core": 50,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c50.m384.d100": {
+    "core": 50,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c50.m384.d500": {
+    "core": 50,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c50.m384.d2000": {
+    "core": 50,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c52.m4.d10": {
+    "core": 52,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c52.m4.d100": {
+    "core": 52,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c52.m4.d500": {
+    "core": 52,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c52.m4.d2000": {
+    "core": 52,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c52.m8.d10": {
+    "core": 52,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c52.m8.d100": {
+    "core": 52,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c52.m8.d500": {
+    "core": 52,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c52.m8.d2000": {
+    "core": 52,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c52.m16.d10": {
+    "core": 52,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c52.m16.d100": {
+    "core": 52,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c52.m16.d500": {
+    "core": 52,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c52.m16.d2000": {
+    "core": 52,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c52.m32.d10": {
+    "core": 52,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c52.m32.d100": {
+    "core": 52,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c52.m32.d500": {
+    "core": 52,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c52.m32.d2000": {
+    "core": 52,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c52.m64.d10": {
+    "core": 52,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c52.m64.d100": {
+    "core": 52,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c52.m64.d500": {
+    "core": 52,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c52.m64.d2000": {
+    "core": 52,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c52.m128.d10": {
+    "core": 52,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c52.m128.d100": {
+    "core": 52,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c52.m128.d500": {
+    "core": 52,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c52.m128.d2000": {
+    "core": 52,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c52.m256.d10": {
+    "core": 52,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c52.m256.d100": {
+    "core": 52,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c52.m256.d500": {
+    "core": 52,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c52.m256.d2000": {
+    "core": 52,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c52.m384.d10": {
+    "core": 52,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c52.m384.d100": {
+    "core": 52,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c52.m384.d500": {
+    "core": 52,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c52.m384.d2000": {
+    "core": 52,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c54.m4.d10": {
+    "core": 54,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c54.m4.d100": {
+    "core": 54,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c54.m4.d500": {
+    "core": 54,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c54.m4.d2000": {
+    "core": 54,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c54.m8.d10": {
+    "core": 54,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c54.m8.d100": {
+    "core": 54,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c54.m8.d500": {
+    "core": 54,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c54.m8.d2000": {
+    "core": 54,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c54.m16.d10": {
+    "core": 54,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c54.m16.d100": {
+    "core": 54,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c54.m16.d500": {
+    "core": 54,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c54.m16.d2000": {
+    "core": 54,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c54.m32.d10": {
+    "core": 54,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c54.m32.d100": {
+    "core": 54,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c54.m32.d500": {
+    "core": 54,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c54.m32.d2000": {
+    "core": 54,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c54.m64.d10": {
+    "core": 54,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c54.m64.d100": {
+    "core": 54,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c54.m64.d500": {
+    "core": 54,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c54.m64.d2000": {
+    "core": 54,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c54.m128.d10": {
+    "core": 54,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c54.m128.d100": {
+    "core": 54,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c54.m128.d500": {
+    "core": 54,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c54.m128.d2000": {
+    "core": 54,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c54.m256.d10": {
+    "core": 54,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c54.m256.d100": {
+    "core": 54,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c54.m256.d500": {
+    "core": 54,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c54.m256.d2000": {
+    "core": 54,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c54.m384.d10": {
+    "core": 54,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c54.m384.d100": {
+    "core": 54,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c54.m384.d500": {
+    "core": 54,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c54.m384.d2000": {
+    "core": 54,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c56.m4.d10": {
+    "core": 56,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c56.m4.d100": {
+    "core": 56,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c56.m4.d500": {
+    "core": 56,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c56.m4.d2000": {
+    "core": 56,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c56.m8.d10": {
+    "core": 56,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c56.m8.d100": {
+    "core": 56,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c56.m8.d500": {
+    "core": 56,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c56.m8.d2000": {
+    "core": 56,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c56.m16.d10": {
+    "core": 56,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c56.m16.d100": {
+    "core": 56,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c56.m16.d500": {
+    "core": 56,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c56.m16.d2000": {
+    "core": 56,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c56.m32.d10": {
+    "core": 56,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c56.m32.d100": {
+    "core": 56,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c56.m32.d500": {
+    "core": 56,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c56.m32.d2000": {
+    "core": 56,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c56.m64.d10": {
+    "core": 56,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c56.m64.d100": {
+    "core": 56,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c56.m64.d500": {
+    "core": 56,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c56.m64.d2000": {
+    "core": 56,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c56.m128.d10": {
+    "core": 56,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c56.m128.d100": {
+    "core": 56,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c56.m128.d500": {
+    "core": 56,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c56.m128.d2000": {
+    "core": 56,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c56.m256.d10": {
+    "core": 56,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c56.m256.d100": {
+    "core": 56,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c56.m256.d500": {
+    "core": 56,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c56.m256.d2000": {
+    "core": 56,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c56.m384.d10": {
+    "core": 56,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c56.m384.d100": {
+    "core": 56,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c56.m384.d500": {
+    "core": 56,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c56.m384.d2000": {
+    "core": 56,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c58.m4.d10": {
+    "core": 58,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c58.m4.d100": {
+    "core": 58,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c58.m4.d500": {
+    "core": 58,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c58.m4.d2000": {
+    "core": 58,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c58.m8.d10": {
+    "core": 58,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c58.m8.d100": {
+    "core": 58,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c58.m8.d500": {
+    "core": 58,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c58.m8.d2000": {
+    "core": 58,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c58.m16.d10": {
+    "core": 58,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c58.m16.d100": {
+    "core": 58,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c58.m16.d500": {
+    "core": 58,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c58.m16.d2000": {
+    "core": 58,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c58.m32.d10": {
+    "core": 58,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c58.m32.d100": {
+    "core": 58,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c58.m32.d500": {
+    "core": 58,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c58.m32.d2000": {
+    "core": 58,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c58.m64.d10": {
+    "core": 58,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c58.m64.d100": {
+    "core": 58,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c58.m64.d500": {
+    "core": 58,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c58.m64.d2000": {
+    "core": 58,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c58.m128.d10": {
+    "core": 58,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c58.m128.d100": {
+    "core": 58,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c58.m128.d500": {
+    "core": 58,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c58.m128.d2000": {
+    "core": 58,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c58.m256.d10": {
+    "core": 58,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c58.m256.d100": {
+    "core": 58,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c58.m256.d500": {
+    "core": 58,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c58.m256.d2000": {
+    "core": 58,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c58.m384.d10": {
+    "core": 58,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c58.m384.d100": {
+    "core": 58,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c58.m384.d500": {
+    "core": 58,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c58.m384.d2000": {
+    "core": 58,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c60.m4.d10": {
+    "core": 60,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c60.m4.d100": {
+    "core": 60,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c60.m4.d500": {
+    "core": 60,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c60.m4.d2000": {
+    "core": 60,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c60.m8.d10": {
+    "core": 60,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c60.m8.d100": {
+    "core": 60,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c60.m8.d500": {
+    "core": 60,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c60.m8.d2000": {
+    "core": 60,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c60.m16.d10": {
+    "core": 60,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c60.m16.d100": {
+    "core": 60,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c60.m16.d500": {
+    "core": 60,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c60.m16.d2000": {
+    "core": 60,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c60.m32.d10": {
+    "core": 60,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c60.m32.d100": {
+    "core": 60,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c60.m32.d500": {
+    "core": 60,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c60.m32.d2000": {
+    "core": 60,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c60.m64.d10": {
+    "core": 60,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c60.m64.d100": {
+    "core": 60,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c60.m64.d500": {
+    "core": 60,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c60.m64.d2000": {
+    "core": 60,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c60.m128.d10": {
+    "core": 60,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c60.m128.d100": {
+    "core": 60,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c60.m128.d500": {
+    "core": 60,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c60.m128.d2000": {
+    "core": 60,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c60.m256.d10": {
+    "core": 60,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c60.m256.d100": {
+    "core": 60,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c60.m256.d500": {
+    "core": 60,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c60.m256.d2000": {
+    "core": 60,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c60.m384.d10": {
+    "core": 60,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c60.m384.d100": {
+    "core": 60,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c60.m384.d500": {
+    "core": 60,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c60.m384.d2000": {
+    "core": 60,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c62.m4.d10": {
+    "core": 62,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c62.m4.d100": {
+    "core": 62,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c62.m4.d500": {
+    "core": 62,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c62.m4.d2000": {
+    "core": 62,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c62.m8.d10": {
+    "core": 62,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c62.m8.d100": {
+    "core": 62,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c62.m8.d500": {
+    "core": 62,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c62.m8.d2000": {
+    "core": 62,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c62.m16.d10": {
+    "core": 62,
+    "ram": 16,
+    "disk": 10
+  },
+  "fabric.c62.m16.d100": {
+    "core": 62,
+    "ram": 16,
+    "disk": 100
+  },
+  "fabric.c62.m16.d500": {
+    "core": 62,
+    "ram": 16,
+    "disk": 500
+  },
+  "fabric.c62.m16.d2000": {
+    "core": 62,
+    "ram": 16,
+    "disk": 2000
+  },
+  "fabric.c62.m32.d10": {
+    "core": 62,
+    "ram": 32,
+    "disk": 10
+  },
+  "fabric.c62.m32.d100": {
+    "core": 62,
+    "ram": 32,
+    "disk": 100
+  },
+  "fabric.c62.m32.d500": {
+    "core": 62,
+    "ram": 32,
+    "disk": 500
+  },
+  "fabric.c62.m32.d2000": {
+    "core": 62,
+    "ram": 32,
+    "disk": 2000
+  },
+  "fabric.c62.m64.d10": {
+    "core": 62,
+    "ram": 64,
+    "disk": 10
+  },
+  "fabric.c62.m64.d100": {
+    "core": 62,
+    "ram": 64,
+    "disk": 100
+  },
+  "fabric.c62.m64.d500": {
+    "core": 62,
+    "ram": 64,
+    "disk": 500
+  },
+  "fabric.c62.m64.d2000": {
+    "core": 62,
+    "ram": 64,
+    "disk": 2000
+  },
+  "fabric.c62.m128.d10": {
+    "core": 62,
+    "ram": 128,
+    "disk": 10
+  },
+  "fabric.c62.m128.d100": {
+    "core": 62,
+    "ram": 128,
+    "disk": 100
+  },
+  "fabric.c62.m128.d500": {
+    "core": 62,
+    "ram": 128,
+    "disk": 500
+  },
+  "fabric.c62.m128.d2000": {
+    "core": 62,
+    "ram": 128,
+    "disk": 2000
+  },
+  "fabric.c62.m256.d10": {
+    "core": 62,
+    "ram": 256,
+    "disk": 10
+  },
+  "fabric.c62.m256.d100": {
+    "core": 62,
+    "ram": 256,
+    "disk": 100
+  },
+  "fabric.c62.m256.d500": {
+    "core": 62,
+    "ram": 256,
+    "disk": 500
+  },
+  "fabric.c62.m256.d2000": {
+    "core": 62,
+    "ram": 256,
+    "disk": 2000
+  },
+  "fabric.c62.m384.d10": {
+    "core": 62,
+    "ram": 384,
+    "disk": 10
+  },
+  "fabric.c62.m384.d100": {
+    "core": 62,
+    "ram": 384,
+    "disk": 100
+  },
+  "fabric.c62.m384.d500": {
+    "core": 62,
+    "ram": 384,
+    "disk": 500
+  },
+  "fabric.c62.m384.d2000": {
+    "core": 62,
+    "ram": 384,
+    "disk": 2000
+  },
+  "fabric.c1.m2.d10": {
+    "core": 1,
+    "ram": 2,
+    "disk": 10
+  },
+  "fabric.c1.m4.d10": {
+    "core": 1,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c1.m4.d100": {
+    "core": 1,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c1.m4.d500": {
+    "core": 1,
+    "ram": 4,
+    "disk": 500
+  },
+  "fabric.c1.m4.d2000": {
+    "core": 1,
+    "ram": 4,
+    "disk": 2000
+  },
+  "fabric.c2.m2.d10": {
+    "core": 2,
+    "ram": 2,
+    "disk": 10
+  },
+  "fabric.c2.m2.d100": {
+    "core": 2,
+    "ram": 2,
+    "disk": 100
+  },
+  "fabric.c2.m4.d10": {
+    "core": 2,
+    "ram": 4,
+    "disk": 10
+  },
+  "fabric.c2.m4.d100": {
+    "core": 2,
+    "ram": 4,
+    "disk": 100
+  },
+  "fabric.c2.m8.d10": {
+    "core": 2,
+    "ram": 8,
+    "disk": 10
+  },
+  "fabric.c2.m8.d100": {
+    "core": 2,
+    "ram": 8,
+    "disk": 100
+  },
+  "fabric.c2.m8.d500": {
+    "core": 2,
+    "ram": 8,
+    "disk": 500
+  },
+  "fabric.c2.m8.d2000": {
+    "core": 2,
+    "ram": 8,
+    "disk": 2000
+  },
+  "fabric.c64.m384.d4000": {
+    "core": 64,
+    "ram": 384,
+    "disk": 4000
+  }
+}
diff --git a/fim/slivers/interface_info.py b/fim/slivers/interface_info.py
index 2b41ac9..51a3eef 100644
--- a/fim/slivers/interface_info.py
+++ b/fim/slivers/interface_info.py
@@ -28,6 +28,7 @@
 import enum
 
 from .base_sliver import BaseSliver
+from .topology_diff import TopologyDiff
 
 
 class InterfaceType(enum.Enum):
@@ -67,6 +68,8 @@ def type_from_str(ntype: str) -> InterfaceType:
             if ntype == str(t):
                 return t
 
+    def diff(self, other_sliver) -> TopologyDiff or None:
+        raise RuntimeError('Not implemented')
 
 class InterfaceInfo:
     def __init__(self):
diff --git a/fim/slivers/network_link.py b/fim/slivers/network_link.py
index d4a9716..04f7a5d 100644
--- a/fim/slivers/network_link.py
+++ b/fim/slivers/network_link.py
@@ -28,6 +28,7 @@
 
 from .base_sliver import BaseSliver
 from .network_service import NSLayer
+from .topology_diff import TopologyDiff
 
 
 class LinkType(enum.Enum):
@@ -110,3 +111,5 @@ def layer_from_str(layer: str) -> NSLayer or None:
             return None
         return NSLayer.from_string(layer)
 
+    def diff(self, other_sliver) -> TopologyDiff or None:
+        raise RuntimeError('Not implemented')
diff --git a/fim/slivers/network_node.py b/fim/slivers/network_node.py
index 7923abb..20c4eae 100644
--- a/fim/slivers/network_node.py
+++ b/fim/slivers/network_node.py
@@ -29,6 +29,7 @@
 
 from fim.slivers.capacities_labels import Location
 from .base_sliver import BaseSliver
+from .topology_diff import TopologyDiff, TopologyDiffTuple
 
 
 class NodeType(enum.Enum):
@@ -145,6 +146,49 @@ def set_location(self, location: Location):
     def get_location(self) -> Location:
         return self.location
 
+    def diff(self, other_sliver) -> TopologyDiff or None:
+        if not other_sliver:
+            return None
+
+        super().diff(other_sliver)
+
+        comp_added = set()
+        comp_removed = set()
+        ns_added = set()
+        ns_removed = set()
+
+        if self.attached_components_info and other_sliver.attached_components_info:
+            diff_comps = self._dict_diff(self.attached_components_info.devices,
+                                         other_sliver.attached_components_info.devices)
+            comp_added = set(diff_comps['added'].keys())
+            comp_removed = set(diff_comps['removed'].keys())
+
+        if not self.attached_components_info and other_sliver.attached_components_info:
+            comp_added = set(other_sliver.attached_components_info.devices.keys())
+
+        if self.attached_components_info and not other_sliver.attached_components_info:
+            comp_removed = set(self.attached_components_info.devices.keys())
+
+        if self.network_service_info and other_sliver.network_service_info:
+            diff_ns = self._dict_diff(other_sliver.network_service_info.services,
+                                      other_sliver.network_service_info.services)
+            ns_added = set(diff_ns['added'].keys())
+            ns_removed = set(diff_ns['removed'].keys())
+
+        if not self.network_service_info and other_sliver.network_service_info:
+            ns_added = set(other_sliver.network_service_info.services.keys())
+
+        if self.network_service_info and not other_sliver.network_service_info:
+            ns_removed = set(self.network_service_info.services.keys())
+
+        if len(comp_added) > 0 or len(comp_removed) > 0 or len(ns_removed) > 0 or len(ns_added) > 0:
+            return TopologyDiff(added=TopologyDiffTuple(components=comp_added, services=ns_added, interfaces=set(),
+                                                        nodes=set()),
+                                removed=TopologyDiffTuple(components=comp_removed, services=ns_removed,
+                                                          interfaces=set(), nodes=set()))
+        else:
+            return None
+
     @staticmethod
     def type_from_str(ntype: str) -> NodeType or None:
         if ntype is None:
diff --git a/fim/slivers/network_service.py b/fim/slivers/network_service.py
index 9a41268..f5a3755 100644
--- a/fim/slivers/network_service.py
+++ b/fim/slivers/network_service.py
@@ -31,6 +31,7 @@
 from .path_info import PathRepresentationType, ERO, PathInfo
 from .gateway import Gateway
 from .interface_info import InterfaceType
+from .topology_diff import TopologyDiff, TopologyDiffTuple
 
 
 class NSLayer(enum.Enum):
@@ -315,6 +316,34 @@ def layer_from_str(layer: str) -> NSLayer or None:
             if layer == str(t):
                 return t
 
+    def diff(self, other_sliver) -> TopologyDiff or None:
+        if not other_sliver:
+            return None
+
+        super().diff(other_sliver)
+
+        ifs_added = set()
+        ifs_removed = set()
+        if self.interface_info and other_sliver.interface_info:
+            diff_comps = self._dict_diff(self.interface_info.interfaces,
+                                         other_sliver.interface_info.interfaces)
+            ifs_added = set(diff_comps['added'].keys())
+            ifs_removed = set(diff_comps['removed'].keys())
+
+        if not self.interface_info and other_sliver.interface_info:
+            ifs_added = set(other_sliver.interface_info.interfaces.keys())
+
+        if self.interface_info and not other_sliver.interface_info:
+            ifs_removed = set(self.interface_info.interfaces.keys())
+
+        if len(ifs_added) > 0 or len(ifs_removed) > 0:
+            return TopologyDiff(added=TopologyDiffTuple(components=set(), services=set(), interfaces=ifs_added,
+                                                        nodes=set()),
+                                removed=TopologyDiffTuple(components=set(), services=set(),
+                                                          interfaces=ifs_removed, nodes=set()))
+        else:
+            return None
+
 
 class NetworkServiceInfo:
 
diff --git a/fim/slivers/topology_diff.py b/fim/slivers/topology_diff.py
new file mode 100644
index 0000000..0317928
--- /dev/null
+++ b/fim/slivers/topology_diff.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+# MIT License
+#
+# Copyright (c) 2020 FABRIC Testbed
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+#
+# Author: Ilya Baldin (ibaldin@renci.org)
+
+"""
+Definitions of topology differences for modify operations - used in topology and sliver diff methods
+"""
+import dataclasses
+from typing import Any
+
+
+@dataclasses.dataclass
+class TopologyDiffTuple:
+    nodes: set[Any]
+    components: set[Any]
+    services: set[Any]
+    interfaces: set[Any]
+
+
+@dataclasses.dataclass
+class TopologyDiff:
+    added: TopologyDiffTuple
+    removed: TopologyDiffTuple
diff --git a/fim/user/component.py b/fim/user/component.py
index 6c43db3..509629f 100644
--- a/fim/user/component.py
+++ b/fim/user/component.py
@@ -243,6 +243,13 @@ def interface_list(self):
     def network_services(self):
         return self.__list_network_services()
 
+    def get_sliver(self) -> ComponentSliver:
+        """
+        Get a deep sliver representation of this component from graph
+        :return:
+        """
+        return self.topo.graph_model.build_deep_component_sliver(node_id=self.node_id)
+
     def __repr__(self):
         _, node_properties = self.topo.graph_model.get_node_properties(node_id=self.node_id)
         comp_sliver = self.topo.graph_model.component_sliver_from_graph_properties_dict(node_properties)
diff --git a/fim/user/interface.py b/fim/user/interface.py
index 7811810..9548aa6 100644
--- a/fim/user/interface.py
+++ b/fim/user/interface.py
@@ -156,6 +156,13 @@ def get_peers(self, itype: InterfaceType = None):
                 ret.append(i)
         return ret
 
+    def get_sliver(self) -> InterfaceSliver:
+        """
+        Get a deep sliver representation of this interface from graph
+        :return:
+        """
+        return self.topo.graph_model.build_deep_interface_sliver(node_id=self.node_id)
+
     def __repr__(self):
         _, node_properties = self.topo.graph_model.get_node_properties(node_id=self.node_id)
         if_sliver = self.topo.graph_model.interface_sliver_from_graph_properties_dict(node_properties)
diff --git a/fim/user/link.py b/fim/user/link.py
index b0be1fe..22d233d 100644
--- a/fim/user/link.py
+++ b/fim/user/link.py
@@ -174,6 +174,12 @@ def __list_of_interfaces(self) -> List[Interface] or None:
             return self._interfaces.copy()
         return None
 
+    def get_sliver(self):
+        """
+        Return a NetworkLinkSliver
+        """
+        return self.topo.graph_model.build_deep_link_sliver(node_id=self.node_id)
+
     @property
     def interface_list(self):
         return self.__list_of_interfaces()
diff --git a/fim/user/model_element.py b/fim/user/model_element.py
index 1bc2f76..055f9d2 100644
--- a/fim/user/model_element.py
+++ b/fim/user/model_element.py
@@ -29,7 +29,7 @@
 import enum
 
 from ..graph.abc_property_graph import ABCPropertyGraph
-from ..slivers.capacities_labels import Capacities, Labels
+from ..slivers.capacities_labels import Capacities, Labels, ReservationInfo
 from ..slivers.measurement_data import MeasurementData
 
 
@@ -127,6 +127,12 @@ def set_properties(self, **kwargs):
         :return:
         """
 
+    @abstractmethod
+    def get_sliver(self):
+        """
+        Return sliver of appropriate type for this element
+        """
+
     @property
     def name(self):
         return self._name
@@ -217,6 +223,15 @@ def boot_script(self, value: str):
         if self.__dict__.get('topo', None) is not None:
             self.set_property('boot_script', value)
 
+    @property
+    def reservation_info(self):
+        return self.get_property('reservation_info') if self.__dict__.get('topo', None) is not None else None
+
+    @reservation_info.setter
+    def reservation_info(self, value: ReservationInfo):
+        if self.__dict__.get('topo', None) is not None:
+            self.set_property('reservation_info', value)
+
     def update_labels(self, **kwargs):
         """
         Take current labels field (even empty) and add/overwrite additional values into it
diff --git a/fim/user/network_service.py b/fim/user/network_service.py
index b32c3f0..b3e7639 100644
--- a/fim/user/network_service.py
+++ b/fim/user/network_service.py
@@ -99,7 +99,7 @@ def __init__(self, *, name: str, node_id: str = None, topo: Any,
                 exception_thrown = False
                 for i in interfaces:
                     # run through guardrails, then connect
-                    try :
+                    try:
                         self.__service_guardrails(sliver, i)
                         self.connect_interface(interface=i)
                         connected_interfaces.append(i)
@@ -242,6 +242,7 @@ def __validate_nstype_constraints(self, nstype, interfaces) -> Set[str]:
             if self.site:
                 raise TopologyException(f"Service {self.name} is multi-site, but site {self.site} was specified in"
                                         f"constructor")
+
     def validate_constraints(self, interfaces):
         """
         Validate service constraints - number of sites, interfaces, instances, properties
@@ -351,8 +352,9 @@ def add_interface(self, *, name: str, node_id: str = None, itype: InterfaceType
         assert name is not None
 
         # check uniqueness
-        if name in self.__list_interfaces().keys():
-            raise TopologyException('Interface names must be unique within a switch fabric')
+        all_names = [n.name for n in self._interfaces]
+        if name in all_names:
+            raise TopologyException(f'Interface {name} is not unique within a network service')
         iff = Interface(name=name, node_id=node_id, parent_node_id=self.node_id,
                         etype=ElementType.NEW, topo=self.topo, itype=itype,
                         **kwargs)
@@ -442,26 +444,30 @@ def __list_interfaces(self) -> ViewOnlyDict:
         List all interfaces of the network service as a dictionary
         :return:
         """
-        node_id_list = self.topo.graph_model.get_all_ns_or_link_connection_points(link_id=self.node_id)
         ret = dict()
-        for nid in node_id_list:
-            c = self.__get_interface_by_id(nid)
-            ret[c.name] = c
+        for intf in self._interfaces:
+            ret[intf.name] = intf
         return ViewOnlyDict(ret)
 
     def __list_of_interfaces(self) -> Tuple[Interface]:
         """
-        Return a list of all interfaces of network service
+        Return a list of names of interfaces of network service
         :return:
         """
         return tuple(self._interfaces)
 
     @property
     def interface_list(self):
+        """
+        List of names of service interfaces
+        """
         return self.__list_of_interfaces()
 
     @property
     def interfaces(self):
+        """
+        Dictionary name->Interface for all interfaces
+        """
         return self.__list_interfaces()
 
     def __repr__(self):
diff --git a/fim/user/node.py b/fim/user/node.py
index 832c079..73f81d5 100644
--- a/fim/user/node.py
+++ b/fim/user/node.py
@@ -40,7 +40,7 @@
 from ..slivers.network_node import NodeType
 from ..slivers.network_service import ServiceType, NetworkServiceInfo
 from ..slivers.component_catalog import ComponentModelType
-from ..slivers.capacities_labels import CapacityHints, Location, ReservationInfo
+from ..slivers.capacities_labels import CapacityHints, Location
 
 
 class Node(ModelElement):
@@ -156,15 +156,6 @@ def capacity_hints(self, value: CapacityHints):
         if self.__dict__.get('topo', None) is not None:
             self.set_property('capacity_hints', value)
 
-    @property
-    def reservation_info(self):
-        return self.get_property('reservation_info') if self.__dict__.get('topo', None) is not None else None
-
-    @reservation_info.setter
-    def reservation_info(self, value: ReservationInfo):
-        if self.__dict__.get('topo', None) is not None:
-            self.set_property('reservation_info', value)
-
     @property
     def location(self):
         return self.get_property('location') if self.__dict__.get('topo', None) is not None else None
diff --git a/fim/user/topology.py b/fim/user/topology.py
index e7614d7..e807b70 100644
--- a/fim/user/topology.py
+++ b/fim/user/topology.py
@@ -23,7 +23,6 @@
 #
 #
 # Author: Ilya Baldin (ibaldin@renci.org)
-import dataclasses
 from abc import ABC
 from typing import List, Tuple, Any, Set
 import enum
@@ -49,6 +48,7 @@
 from fim.graph.resources.networkx_abqm import NetworkXAggregateBQM, NetworkXABQMFactory
 from fim.slivers.capacities_labels import FreeCapacity
 from fim.slivers.interface_info import InterfaceType
+from fim.slivers.topology_diff import TopologyDiff, TopologyDiffTuple
 
 from .model_element import ElementType
 from .node import Node
@@ -59,20 +59,6 @@
 from .link import Link
 
 
-@dataclasses.dataclass
-class TopologyDiffTuple:
-    nodes: set[Node]
-    components: set[Component]
-    services: set[NetworkService]
-    interfaces: set[Interface]
-
-
-@dataclasses.dataclass
-class TopologyDiff:
-    added: TopologyDiffTuple
-    removed: TopologyDiffTuple
-
-
 class TopologyDetail(enum.Enum):
     """
     Describe the level of detail for drawing a topology.
@@ -113,10 +99,19 @@ def get_parent_element(self, e: ModelElement) -> ModelElement or None:
         :param e:
         :return:
         """
-        assert e is not None
         if isinstance(e, Node) or isinstance(e, Link):
             # nodes or links don't have parents
             return None
+
+        # interfaces have NSs as parents
+        if isinstance(e, Interface):
+            node_name, node_id = self.graph_model.get_parent(node_id=e.node_id,
+                                                             rel=ABCPropertyGraph.REL_CONNECTS,
+                                                             parent=ABCPropertyGraph.CLASS_NetworkService)
+            if node_id is None:
+                raise TopologyException(f'Interface {e} has no parent')
+            return NetworkService(name=node_name, node_id=node_id, topo=self)
+
         # components have nodes as parents
         if isinstance(e, Component):
             node_name, node_id = self.graph_model.get_parent(node_id=e.node_id,
@@ -125,6 +120,7 @@ def get_parent_element(self, e: ModelElement) -> ModelElement or None:
             if node_id is None:
                 raise TopologyException(f'Component {e} has no parent')
             return Node(name=node_name, node_id=node_id, topo=self)
+
         # NSs may have nodes or components as parents or be by themselves
         if isinstance(e, NetworkService):
             node_name, node_id = self.graph_model.get_parent(node_id=e.node_id,
@@ -146,14 +142,7 @@ def get_parent_element(self, e: ModelElement) -> ModelElement or None:
                 return CompositeNode(name=node_name, node_id=node_id, topo=self)
 
             return None
-        # interfaces have NSs as parents
-        if isinstance(e, Interface):
-            node_name, node_id = self.graph_model.get_parent(node_id=e.node_id,
-                                                             rel=ABCPropertyGraph.REL_CONNECTS,
-                                                             parent=ABCPropertyGraph.CLASS_NetworkService)
-            if node_id is None:
-                raise TopologyException(f'Interface {e} has no parent')
-            return NetworkService(name=node_name, node_id=node_id, topo=self)
+
         raise TopologyException(f'Unable to determine parent of element {e}')
 
     def get_owner_node(self, e: ModelElement) -> ModelElement or None:
@@ -163,7 +152,6 @@ def get_owner_node(self, e: ModelElement) -> ModelElement or None:
         :param e:
         :return:
         """
-        assert e is not None
         if isinstance(e, Node) or isinstance(e, Link):
             # nodes or links don't have parents
             return None
@@ -218,7 +206,6 @@ def remove_node(self, name: str):
         :param name:
         :return:
         """
-        assert name is not None
         self.graph_model.remove_network_node_with_components_nss_cps_and_links(
             node_id=self._get_node_by_name(name=name).node_id)
 
@@ -279,7 +266,6 @@ def remove_link(self, name: str):
         :param name:
         :return:
         """
-        assert name is not None
         self.graph_model.remove_network_link(node_id=self._get_link_by_name(name=name).node_id)
 
     def add_network_service(self, *, name: str, node_id: str = None, nstype: ServiceType,
@@ -304,7 +290,6 @@ def remove_network_service(self, name: str):
         :param name:
         :return:
         """
-        assert name is not None
         self.graph_model.remove_ns_with_cps_and_links(node_id=self._get_ns_by_name(name=name).node_id)
 
     def _get_node_by_name(self, name: str) -> Node:
@@ -313,7 +298,6 @@ def _get_node_by_name(self, name: str) -> Node:
         :param name:
         :return:
         """
-        assert name is not None
         node_id = self.graph_model.find_node_by_name(node_name=name,
                                                      label=ABCPropertyGraph.CLASS_NetworkNode)
         return Node(name=name, node_id=node_id, topo=self)
@@ -324,7 +308,6 @@ def _get_link_by_name(self, name: str) -> Link:
         :param name:
         :return:
         """
-        assert name is not None
         node_id = self.graph_model.find_node_by_name(node_name=name,
                                                      label=ABCPropertyGraph.CLASS_Link)
         return Link(name=name, node_id=node_id, topo=self)
@@ -335,7 +318,6 @@ def _get_ns_by_name(self, name: str) -> NetworkService:
         :param name:
         :return:
         """
-        assert name is not None
         node_id = self.graph_model.find_node_by_name(node_name=name,
                                                      label=ABCPropertyGraph.CLASS_NetworkService)
         return NetworkService(name=name, node_id=node_id, topo=self)
@@ -346,9 +328,7 @@ def _get_node_by_id(self, node_id: str) -> Node:
         :param node_id:
         :return:
         """
-        assert node_id is not None
         _, node_props = self.graph_model.get_node_properties(node_id=node_id)
-        assert node_props.get(ABCPropertyGraph.PROP_NAME, None) is not None
         return Node(name=node_props[ABCPropertyGraph.PROP_NAME], node_id=node_id, topo=self)
 
     def _get_link_by_id(self, node_id: str) -> Link:
@@ -357,9 +337,7 @@ def _get_link_by_id(self, node_id: str) -> Link:
         :param node_id:
         :return:
         """
-        assert node_id is not None
         _, node_props = self.graph_model.get_node_properties(node_id=node_id)
-        assert node_props.get(ABCPropertyGraph.PROP_NAME, None) is not None
         return Link(name=node_props[ABCPropertyGraph.PROP_NAME], node_id=node_id, topo=self)
 
     def _get_ns_by_id(self, node_id: str) -> NetworkService:
@@ -368,9 +346,7 @@ def _get_ns_by_id(self, node_id: str) -> NetworkService:
         :param node_id:
         :return:
         """
-        assert node_id is not None
         _, node_props = self.graph_model.get_node_properties(node_id=node_id)
-        assert node_props.get(ABCPropertyGraph.PROP_NAME, None) is not None
         ns = NetworkService(name=node_props[ABCPropertyGraph.PROP_NAME], node_id=node_id, topo=self)
         if ns.type == ServiceType.PortMirror:
             return PortMirrorService(name=node_props[ABCPropertyGraph.PROP_NAME], node_id=node_id, topo=self)
@@ -594,7 +570,6 @@ def cast(self, *, asm_graph: ABCASMPropertyGraph):
         :param asm_graph:
         :return:
         """
-        assert asm_graph is not None
         assert isinstance(asm_graph, ABCASMPropertyGraph)
         self.graph_model = asm_graph
 
@@ -710,10 +685,9 @@ def _is_parented_component(comp: Component, nodes: Set[Node]):
         """
         Is this component parented to any of the nodes?
         """
-        assert comp
-        assert nodes
+        if not nodes:
+            return False
         parent_node = comp.topo.get_parent_element(comp)
-        assert parent_node
         # so we can get early exit
         for n in nodes:
             if n.node_id == parent_node.node_id:
@@ -725,10 +699,9 @@ def _is_parented_interface(intf: Interface, nss: Set[NetworkService]):
         """
         Is this Interface parented to the Network Service
         """
-        assert intf
-        assert nss
+        if not nss:
+            return False
         parent_ns = intf.topo.get_parent_element(intf)
-        assert parent_ns
         # so we can get early exit
         for ns in nss:
             if ns.node_id == parent_ns.node_id:
@@ -740,8 +713,8 @@ def _is_parented_ns(ns: NetworkService, parents: Set[Node or Component]):
         """
         Is this Network Service parented to a node or component
         """
-        assert ns
-        assert parents
+        if not parents:
+            return False
         parent_node = ns.topo.get_parent_element(ns)
         if parent_node:
             # so we get early exit
@@ -807,6 +780,91 @@ def diff(self, t) -> TopologyDiff:
                                                       services=nss_removed,
                                                       interfaces=interfaces_removed))
 
+    def _prune_node(self, node: Node):
+        """
+        Prune this node, its components, network services and interfaces
+        """
+        self.graph_model.remove_network_node_with_components_nss_cps_and_links(node_id=node.node_id)
+
+    def _prune_ns(self, ns: NetworkService):
+        """
+        Prune this network service and its interfaces
+        """
+        self.graph_model.remove_ns_with_cps_and_links(node_id=ns.node_id)
+
+    def _prune_components(self, c: Component):
+        """
+        Prune this component, its network services and interfaces
+        """
+        self.graph_model.remove_component_with_nss_cps_and_links(node_id=c.node_id)
+
+    def _prune_interface(self, i: Interface):
+        """
+        Prune this interface
+        """
+        self.graph_model.remove_cp_and_links(node_id=i.node_id)
+
+    def prune(self, reservation_state):
+        """
+        Prune the topology of any elements with reservation_info.reservation_state matching
+        the provided.
+        """
+        #
+        # for all nodes, network services, components and interfaces collect them
+        #
+        nodes = set()
+        components = set()
+        nss = set()
+        seennss = set()
+        interfaces = set()
+        for n in self.nodes.values():
+            nsl = n.get_sliver()
+            if nsl.get_reservation_info() and \
+                    nsl.get_reservation_info().reservation_state == reservation_state:
+                nodes.add(n)
+            for c in n.components.values():
+                csl = c.get_sliver()
+                if csl.get_reservation_info() and \
+                        csl.get_reservation_info().reservation_state == reservation_state:
+                    components.add(c)
+                for ns in c.network_services.values():
+                    seennss.add(ns)
+                    nsl = ns.get_sliver()
+                    if nsl.get_reservation_info() and \
+                            nsl.get_reservation_info().reservation_state == reservation_state:
+                        nss.add(ns)
+                    for i in ns.interface_list:
+                        isl = i.get_sliver()
+                        if isl.get_reservation_info() and \
+                                isl.get_reservation_info().reservation_state == reservation_state:
+                            interfaces.add(i)
+
+        # top level network services only, we visited others already
+        for ns in self.network_services.values():
+            if ns not in seennss:
+                nsl = ns.get_sliver()
+                if nsl.get_reservation_info() and \
+                        nsl.get_reservation_info().reservation_state == reservation_state:
+                    nss.add(ns)
+                for i in ns.interface_list:
+                    isl = i.get_sliver()
+                    if isl.get_reservation_info() and \
+                            isl.get_reservation_info().reservation_state == reservation_state:
+                        interfaces.add(i)
+
+        # all deletes are supposed to be idempotent
+        for n in nodes:
+            self._prune_node(n)
+
+        for c in components:
+            self._prune_components(c)
+
+        for ns in nss:
+            self._prune_ns(ns)
+
+        for i in interfaces:
+            self._prune_interface(i)
+
 
 class SubstrateTopology(Topology):
     """
@@ -843,8 +901,6 @@ def __copy_to_delegations(e: ModelElement, atype: DelegationType,
         :param e:
         :return:
         """
-        assert e is not None
-        assert delegation_id is not None
         if e.get_property("stitch_node"):
             return None
         if atype == DelegationType.CAPACITY:
@@ -962,9 +1018,7 @@ def _get_node_by_id(self, node_id: str) -> Node:
         :param node_id:
         :return:
         """
-        assert node_id is not None
         claz, node_props = self.graph_model.get_node_properties(node_id=node_id)
-        assert node_props.get(ABCPropertyGraph.PROP_NAME, None) is not None
         if claz[0] == ABCPropertyGraph.CLASS_CompositeNode:
             return CompositeNode(name=node_props[ABCPropertyGraph.PROP_NAME], node_id=node_id, topo=self)
         elif claz[0] == ABCPropertyGraph.CLASS_NetworkNode:
@@ -976,9 +1030,7 @@ def _get_link_by_id(self, node_id: str) -> Link:
         :param node_id:
         :return:
         """
-        assert node_id is not None
         _, node_props = self.graph_model.get_node_properties(node_id=node_id)
-        assert node_props.get(ABCPropertyGraph.PROP_NAME, None) is not None
         return Link(name=node_props[ABCPropertyGraph.PROP_NAME], node_id=node_id, topo=self)
 
     def __list_sites(self) -> ViewOnlyDict:
diff --git a/requirements.txt b/requirements.txt
index ed95f86..38b6473 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -24,7 +24,7 @@ pycodestyle==2.6.0
 Pygments==2.9.0
 pyparsing==2.4.7
 pytest==7.1.1
-python-dateutil==2.8.1
+python-dateutil==2.8.2
 pytz==2020.1
 PyYAML==5.4
 readme-renderer==29.0


Test patch:
diff --git a/test/catalog_test.py b/test/catalog_test.py
index e206367..d7cc876 100644
--- a/test/catalog_test.py
+++ b/test/catalog_test.py
@@ -28,17 +28,18 @@ def testCatalog(self):
         c3port = c3ns.interface_info.get_interface(c3ns.interface_info.get_interface_names()[0])
         self.assertEqual(c3port.get_property('capacities').bw, 0)
 
-
     def testInstanceCatalog(self):
         cata = InstanceCatalog()
-        cap = Capacities(ram=20, cpu=1, core=9, disk=110)
+        cap = Capacities(ram=4, core=1, disk=90)
         c = cata.map_capacities_to_instance(cap=cap)
+        print(f'For {cap=} instance is {c}')
         cap1 = cata.get_instance_capacities(instance_type=c)
-        self.assertTrue(cap1.core > cap.core and cap1.ram > cap.ram and cap1.disk > cap.disk)
-        cap = Capacities(ram=20, cpu=1, core=9, disk=110)
+        self.assertTrue(cap1.core >= cap.core and cap1.ram >= cap.ram and cap1.disk >= cap.disk)
+        cap = Capacities(ram=20, core=9, disk=110)
         c = cata.map_capacities_to_instance(cap=cap)
+        print(f'For {cap=} instance is {c}')
         cap1 = cata.get_instance_capacities(instance_type=c)
-        self.assertTrue(cap1.core > cap.core and cap1.ram > cap.ram and cap1.disk > cap.disk)
+        self.assertTrue(cap1.core >= cap.core and cap1.ram >= cap.ram and cap1.disk >= cap.disk)
 
     def testComponentTypeModel(self):
         cata = ComponentCatalog()
diff --git a/test/modify_test.py b/test/modify_test.py
index 2cc1285..8c9ccdc 100644
--- a/test/modify_test.py
+++ b/test/modify_test.py
@@ -2,12 +2,18 @@
 import uuid
 from typing import Any
 
+import cProfile
+from pstats import Stats
+
 import fim.user as f
 
 from fim.graph.neo4j_property_graph import Neo4jGraphImporter
 from fim.slivers.attached_components import ComponentType
 from fim.slivers.network_service import ServiceType
 from fim.user.topology import TopologyDiff, TopologyDiffTuple
+from fim.slivers.capacities_labels import ReservationInfo
+
+WITH_PROFILER = False
 
 
 class ModifyTest(unittest.TestCase):
@@ -114,7 +120,18 @@ def modifyActions(self):
 
         self.topoB.validate()
 
+    def modifyActions1(self):
+        #
+        # add a component to old node (will show up as added)
+        #
+        c1 = self.topoB.nodes['NodeA'].add_component(name='gpu1', ctype=ComponentType.GPU, model='RTX6000')
+        self.diff.added.components.add(c1)
+
+        self.topoB.validate()
+
     def setUp(self) -> None:
+        if WITH_PROFILER: self.pr = cProfile.Profile()
+
         self.n4j_imp = Neo4jGraphImporter(url=self.neo4j["url"], user=self.neo4j["user"],
                                           pswd=self.neo4j["pass"],
                                           import_host_dir=self.neo4j["import_host_dir"],
@@ -131,7 +148,6 @@ def setUp(self) -> None:
         new_id = str(uuid.uuid4())
         self.topoB.load(graph_string=graph_A_string, new_graph_id=new_id)
         print(f'Created topology B with new GUID {self.topoB.graph_model.graph_id}/{new_id}')
-        self.modifyActions()
 
     @staticmethod
     def compare_sets(diff1: set[Any], diff2: set[Any], str):
@@ -153,17 +169,79 @@ def compare_diffs(diff1: TopologyDiff, diff2: TopologyDiff):
     def tearDown(self) -> None:
         pass
         self.n4j_imp.delete_all_graphs()
+        if WITH_PROFILER:
+            p = Stats(self.pr)
+            p.strip_dirs()
+            p.sort_stats('ncalls')
+            p.print_stats()
+            print('\n')
 
     def testNodeAddRemove(self):
         """
         Run the diff between topoA and topoB and validate the results
         """
+        print('*** Full diff test')
+        self.modifyActions()
+
+        if WITH_PROFILER: self.pr.enable()
         diff_res = self.topoA.diff(self.topoB)
+        if WITH_PROFILER: self.pr.disable()
 
         ModifyTest.compare_diffs(diff_res, self.diff)
 
         print(f'Result {diff_res=}')
         #print(f'\nExpected {self.diff}')
-        print(f'\nStartig Topo {self.topoA}')
-        print(f'\nFinal Topo {self.topoB}')
+        #print(f'\nStarting Topo {self.topoA}')
+        #print(f'\nFinal Topo {self.topoB}')
+
+    def testComponentAddOnly(self):
+        print('*** Component add test')
+        self.modifyActions1()
+
+        if WITH_PROFILER: self.pr.enable()
+        diff_res = self.topoA.diff(self.topoB)
+        if WITH_PROFILER: self.pr.disable()
+
+        ModifyTest.compare_diffs(diff_res, self.diff)
+
+        #print(f'Result {diff_res=}')
+        #print(f'\nExpected {self.diff}')
+        #print(f'\nStarting Topo {self.topoA}')
+        #print(f'\nFinal Topo {self.topoB}')
+
+    def testSliverDiffs(self):
+
+        print('*** Sliver diff test')
+        self.modifyActions()
+
+        nAA = self.topoA.nodes['NodeA']
+        print(f'{nAA.components=}')
+        nAB = self.topoB.nodes['NodeA']
+        print(f'{nAB.components=}')
+        nAAs = nAA.get_sliver()
+        nABs = nAB.get_sliver()
+
+        if WITH_PROFILER: self.pr.enable()
+        diff = nAAs.diff(nABs)
+        if WITH_PROFILER: self.pr.disable()
+
+        assert(len(diff.added.components) == 1)
+        assert('gpu1' in diff.added.components)
+
+        print(f'Sliver diff {diff}')
+
+    def testPrune(self):
+
+        print('*** Prune test')
+
+        print(self.topoA.nodes)
+
+        self.topoA.nodes['NodeA'].reservation_info = ReservationInfo(reservation_state="Failed")
+        self.topoA.network_services['bridge1'].reservation_info = ReservationInfo(reservation_state="Failed")
+
+        self.topoA.prune(reservation_state="Failed")
+
+        self.assertTrue('NodeA' not in self.topoA.nodes.keys())
+        self.assertTrue('bridge1' not in self.topoA.network_services.keys())
 
+        print(self.topoA.nodes)