diff --git a/docs/file_format.rst b/docs/file_format.rst index ccb04bf1..31814db5 100644 --- a/docs/file_format.rst +++ b/docs/file_format.rst @@ -23,7 +23,8 @@ A minimal version: The revision is the version of file format: -* 5: GNS3 2.0 +* 6: GNS3 2.0 +* 5: GNS3 2.0 < alpha 4 * 4: GNS3 1.5 * 3: GNS3 1.4 * 2: GNS3 1.3 diff --git a/gns3server/compute/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py index 63a83bee..393234ca 100644 --- a/gns3server/compute/virtualbox/virtualbox_vm.py +++ b/gns3server/compute/virtualbox/virtualbox_vm.py @@ -66,7 +66,6 @@ class VirtualBoxVM(BaseNode): self._ethernet_adapters = {} self._headless = False self._acpi_shutdown = False - self._enable_remote_console = False if not self.linked_clone: for node in self.manager.nodes: if node.vmname == vmname: @@ -86,7 +85,6 @@ class VirtualBoxVM(BaseNode): "vmname": self.vmname, "headless": self.headless, "acpi_shutdown": self.acpi_shutdown, - "enable_remote_console": self.enable_remote_console, "adapters": self._adapters, "adapter_type": self.adapter_type, "ram": self.ram, @@ -245,7 +243,7 @@ class VirtualBoxVM(BaseNode): self._local_udp_tunnels[adapter_number][1], nio) - if self._enable_remote_console and self._console is not None: + if self._console is not None: try: # wait for VirtualBox to create the pipe file. if sys.platform.startswith("win"): @@ -539,34 +537,6 @@ class VirtualBoxVM(BaseNode): log.info("VirtualBox VM '{name}' [{id}] has disabled the ACPI shutdown mode".format(name=self.name, id=self.id)) self._acpi_shutdown = acpi_shutdown - @property - def enable_remote_console(self): - """ - Returns either the remote console is enabled or not - - :returns: boolean - """ - - return self._enable_remote_console - - @asyncio.coroutine - def set_enable_remote_console(self, enable_remote_console): - """ - Sets either the console is enabled or not - - :param enable_remote_console: boolean - """ - - if enable_remote_console: - log.info("VirtualBox VM '{name}' [{id}] has enabled the console".format(name=self.name, id=self.id)) - vm_state = yield from self._get_vm_state() - if vm_state == "running": - self._start_remote_console() - else: - log.info("VirtualBox VM '{name}' [{id}] has disabled the console".format(name=self.name, id=self.id)) - self._stop_remote_console() - self._enable_remote_console = enable_remote_console - @property def ram(self): """ diff --git a/gns3server/compute/vmware/vmware_vm.py b/gns3server/compute/vmware/vmware_vm.py index a1301976..e3484573 100644 --- a/gns3server/compute/vmware/vmware_vm.py +++ b/gns3server/compute/vmware/vmware_vm.py @@ -68,7 +68,6 @@ class VMwareVM(BaseNode): # VMware VM settings self._headless = False self._vmx_path = vmx_path - self._enable_remote_console = False self._acpi_shutdown = False self._adapters = 0 self._ethernet_adapters = {} @@ -87,7 +86,6 @@ class VMwareVM(BaseNode): "vmx_path": self.vmx_path, "headless": self.headless, "acpi_shutdown": self.acpi_shutdown, - "enable_remote_console": self.enable_remote_console, "adapters": self._adapters, "adapter_type": self.adapter_type, "use_any_adapter": self.use_any_adapter, @@ -442,7 +440,7 @@ class VMwareVM(BaseNode): if nio: yield from self._add_ubridge_connection(nio, adapter_number) - # if self._enable_remote_console and self._console is not None: + # if self._console is not None: # try: # if sys.platform.startswith("win"): # yield from wait_for_named_pipe_creation(self._get_pipe_name()) @@ -631,33 +629,6 @@ class VMwareVM(BaseNode): log.info("VMware VM '{name}' [{id}] has set the vmx file path to '{vmx}'".format(name=self.name, id=self.id, vmx=vmx_path)) self._vmx_path = vmx_path - @property - def enable_remote_console(self): - """ - Returns either the remote console is enabled or not - - :returns: boolean - """ - - return self._enable_remote_console - - @enable_remote_console.setter - def enable_remote_console(self, enable_remote_console): - """ - Sets either the console is enabled or not - - :param enable_remote_console: boolean - """ - - # if enable_remote_console: - # log.info("VMware VM '{name}' [{id}] has enabled the console".format(name=self.name, id=self.id)) - # if self._started: - # self._start_remote_console() - # else: - # log.info("VMware VM '{name}' [{id}] has disabled the console".format(name=self.name, id=self.id)) - # self._stop_remote_console() - self._enable_remote_console = enable_remote_console - @property def adapters(self): """ diff --git a/gns3server/controller/topology.py b/gns3server/controller/topology.py index 127b0016..43877d9d 100644 --- a/gns3server/controller/topology.py +++ b/gns3server/controller/topology.py @@ -35,7 +35,7 @@ import logging log = logging.getLogger(__name__) -GNS3_FILE_FORMAT_REVISION = 5 +GNS3_FILE_FORMAT_REVISION = 6 def _check_topology_schema(topo): @@ -113,7 +113,7 @@ def load_topology(path): topo = json.load(f) except (OSError, UnicodeDecodeError, json.JSONDecodeError) as e: raise aiohttp.web.HTTPConflict(text="Could not load topology {}: {}".format(path, str(e))) - if "revision" not in topo or topo["revision"] < GNS3_FILE_FORMAT_REVISION: + if "revision" not in topo or topo["revision"] < 5: # If it's an old GNS3 file we need to convert it # first we backup the file shutil.copy(path, path + ".backup{}".format(topo.get("revision", 0))) @@ -121,12 +121,40 @@ def load_topology(path): _check_topology_schema(topo) with open(path, "w+", encoding="utf-8") as f: json.dump(topo, f, indent=4, sort_keys=True) - elif topo["revision"] > GNS3_FILE_FORMAT_REVISION: + + # Version before GNS3 2.0 alpha 4 + if topo["revision"] < 6: + shutil.copy(path, path + ".backup{}".format(topo.get("revision", 0))) + topo = _convert_2_0_0_alpha(topo, path) + _check_topology_schema(topo) + with open(path, "w+", encoding="utf-8") as f: + json.dump(topo, f, indent=4, sort_keys=True) + + if topo["revision"] > GNS3_FILE_FORMAT_REVISION: raise aiohttp.web.HTTPConflict(text="This project is designed for a more recent version of GNS3 please update GNS3 to version {} or later".format(topo["version"])) _check_topology_schema(topo) return topo +def _convert_2_0_0_alpha(topo, topo_path): + """ + Convert topologies from GNS3 2.0.0 alpha to 2.0.0 final. + + Changes: + * No more serial console + * No more option for VMware / VirtualBox remote console (always use telnet) + """ + topo["revision"] = 6 + for node in topo.get("topology", {}).get("nodes", []): + if node.get("console_type") == "serial": + node["console_type"] = "telnet" + if node["node_type"] in ("vmware", "virtualbox"): + prop = node.get("properties") + if "enable_remote_console" in prop: + del prop["enable_remote_console"] + return topo + + def _convert_1_3_later(topo, topo_path): """ Convert topologies from 1_3 to the new file format @@ -139,7 +167,7 @@ def _convert_1_3_later(topo, topo_path): new_topo = { "type": "topology", - "revision": GNS3_FILE_FORMAT_REVISION, + "revision": 5, "version": __version__, "auto_start": topo.get("auto_start", False), "name": topo["name"], diff --git a/gns3server/handlers/api/compute/virtualbox_handler.py b/gns3server/handlers/api/compute/virtualbox_handler.py index 62890882..734f3449 100644 --- a/gns3server/handlers/api/compute/virtualbox_handler.py +++ b/gns3server/handlers/api/compute/virtualbox_handler.py @@ -60,9 +60,6 @@ class VirtualBoxHandler: console=request.json.get("console", None), adapters=request.json.get("adapters", 0)) - if "enable_remote_console" in request.json: - yield from vm.set_enable_remote_console(request.json.pop("enable_remote_console")) - if "ram" in request.json: ram = request.json.pop("ram") if ram != vm.ram: @@ -120,9 +117,6 @@ class VirtualBoxHandler: if vmname != vm.vmname: yield from vm.set_vmname(vmname) - if "enable_remote_console" in request.json: - yield from vm.set_enable_remote_console(request.json.pop("enable_remote_console")) - if "adapters" in request.json: adapters = int(request.json.pop("adapters")) if adapters != vm.adapters: diff --git a/gns3server/schemas/node.py b/gns3server/schemas/node.py index 91ebd719..ed350ff6 100644 --- a/gns3server/schemas/node.py +++ b/gns3server/schemas/node.py @@ -143,7 +143,7 @@ NODE_OBJECT_SCHEMA = { }, "console_type": { "description": "Console type", - "enum": ["serial", "vnc", "telnet", "http", None] + "enum": ["vnc", "telnet", "http", None] }, "properties": { "description": "Properties specific to an emulator", diff --git a/gns3server/schemas/virtualbox.py b/gns3server/schemas/virtualbox.py index 3c891521..f154720a 100644 --- a/gns3server/schemas/virtualbox.py +++ b/gns3server/schemas/virtualbox.py @@ -66,10 +66,6 @@ VBOX_CREATE_SCHEMA = { "maximum": 65535, "type": "integer" }, - "enable_remote_console": { - "description": "Enable the remote console", - "type": "boolean" - }, "ram": { "description": "Amount of RAM", "minimum": 0, @@ -127,10 +123,6 @@ VBOX_OBJECT_SCHEMA = { "decription": "Path to the VM working directory", "type": ["string", "null"] }, - "enable_remote_console": { - "description": "Enable the remote console", - "type": "boolean" - }, "headless": { "description": "Headless mode", "type": "boolean" diff --git a/gns3server/schemas/vmware.py b/gns3server/schemas/vmware.py index 27fb7a4e..7c9bc90a 100644 --- a/gns3server/schemas/vmware.py +++ b/gns3server/schemas/vmware.py @@ -48,10 +48,6 @@ VMWARE_CREATE_SCHEMA = { "maximum": 65535, "type": "integer" }, - "enable_remote_console": { - "description": "Enable the remote console", - "type": "boolean" - }, "headless": { "description": "Headless mode", "type": "boolean" @@ -118,10 +114,6 @@ VMWARE_OBJECT_SCHEMA = { "type": "string", "minLength": 1, }, - "enable_remote_console": { - "description": "Enable the remote console", - "type": "boolean" - }, "headless": { "description": "Headless mode", "type": "boolean" diff --git a/tests/controller/test_topology.py b/tests/controller/test_topology.py index 5a998354..4431d722 100644 --- a/tests/controller/test_topology.py +++ b/tests/controller/test_topology.py @@ -39,7 +39,7 @@ def test_project_to_topology_empty(tmpdir): "auto_open": False, "scene_width": 2000, "scene_height": 1000, - "revision": 5, + "revision": GNS3_FILE_FORMAT_REVISION, "topology": { "nodes": [], "links": [], @@ -79,7 +79,7 @@ def test_load_topology(tmpdir): data = { "project_id": "69f26504-7aa3-48aa-9f29-798d44841211", "name": "Test", - "revision": 5, + "revision": GNS3_FILE_FORMAT_REVISION, "topology": { "nodes": [], "links": [], diff --git a/tests/topologies/1_0_empty/after/1_0_empty.gns3 b/tests/topologies/1_0_empty/after/1_0_empty.gns3 index 0b6c0312..b33c0bc9 100644 --- a/tests/topologies/1_0_empty/after/1_0_empty.gns3 +++ b/tests/topologies/1_0_empty/after/1_0_empty.gns3 @@ -15,7 +15,7 @@ } ] }, - "revision" : 5, + "revision": 6, "project_id" : "ANYUUID", "type" : "topology", "auto_start" : false diff --git a/tests/topologies/1_3_dynamips/after/1_3_dynamips.gns3 b/tests/topologies/1_3_dynamips/after/1_3_dynamips.gns3 index 81491cfb..eb264324 100644 --- a/tests/topologies/1_3_dynamips/after/1_3_dynamips.gns3 +++ b/tests/topologies/1_3_dynamips/after/1_3_dynamips.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_3_dynamips", "project_id": "ba5790e1-2f51-443e-a3cc-1a2eee132888", - "revision": 5, + "revision": 6, "topology": { "computes": [ { diff --git a/tests/topologies/1_3_dynamips_missing_platform/after/1_3_dynamips_missing_platform.gns3 b/tests/topologies/1_3_dynamips_missing_platform/after/1_3_dynamips_missing_platform.gns3 index 252d27e3..40db2eb6 100644 --- a/tests/topologies/1_3_dynamips_missing_platform/after/1_3_dynamips_missing_platform.gns3 +++ b/tests/topologies/1_3_dynamips_missing_platform/after/1_3_dynamips_missing_platform.gns3 @@ -1,5 +1,5 @@ { - "revision": 5, + "revision": 6, "auto_start": false, "topology": { "drawings": [], diff --git a/tests/topologies/1_5_builtins/after/builtins.gns3 b/tests/topologies/1_5_builtins/after/builtins.gns3 index 7cdf6b1c..643f69b2 100644 --- a/tests/topologies/1_5_builtins/after/builtins.gns3 +++ b/tests/topologies/1_5_builtins/after/builtins.gns3 @@ -1,7 +1,7 @@ { "name": "builtins", "project_id": "644e3892-4a50-4457-9601-2234d4842169", - "revision": 5, + "revision": 6, "auto_start": false, "topology": { "computes": [ diff --git a/tests/topologies/1_5_cloud/after/1_5_cloud.gns3 b/tests/topologies/1_5_cloud/after/1_5_cloud.gns3 index c91a1eee..9cc50149 100644 --- a/tests/topologies/1_5_cloud/after/1_5_cloud.gns3 +++ b/tests/topologies/1_5_cloud/after/1_5_cloud.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_cloud", "project_id": "467ce18d-4848-494a-88d2-4f53ddaca111", - "revision": 5, + "revision": 6, "topology": { "computes": [ { diff --git a/tests/topologies/1_5_docker_remote/after/1_5_docker_remote.gns3 b/tests/topologies/1_5_docker_remote/after/1_5_docker_remote.gns3 index d23d8a79..5259d910 100644 --- a/tests/topologies/1_5_docker_remote/after/1_5_docker_remote.gns3 +++ b/tests/topologies/1_5_docker_remote/after/1_5_docker_remote.gns3 @@ -1,7 +1,7 @@ { "name": "1_5_docker_remote", "project_id": "8182b710-c6bf-4e51-8e2e-213cce952797", - "revision": 5, + "revision": 6, "auto_start": false, "topology": { "computes": [ diff --git a/tests/topologies/1_5_drawing/after/1_5_drawing.gns3 b/tests/topologies/1_5_drawing/after/1_5_drawing.gns3 index 17898413..9f123064 100644 --- a/tests/topologies/1_5_drawing/after/1_5_drawing.gns3 +++ b/tests/topologies/1_5_drawing/after/1_5_drawing.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_drawing", "project_id": "ANYUUID", - "revision": 5, + "revision": 6, "topology": { "computes": [ ], diff --git a/tests/topologies/1_5_dynamips/after/1_5_dynamips.gns3 b/tests/topologies/1_5_dynamips/after/1_5_dynamips.gns3 index 71e7d637..81532226 100644 --- a/tests/topologies/1_5_dynamips/after/1_5_dynamips.gns3 +++ b/tests/topologies/1_5_dynamips/after/1_5_dynamips.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_dynamips", "project_id": "62f389c0-f26d-43b7-ab29-e4d306b29c07", - "revision": 5, + "revision": 6, "topology": { "computes": [ { diff --git a/tests/topologies/1_5_host/after/1_5_host.gns3 b/tests/topologies/1_5_host/after/1_5_host.gns3 index fd7ee311..cd884171 100644 --- a/tests/topologies/1_5_host/after/1_5_host.gns3 +++ b/tests/topologies/1_5_host/after/1_5_host.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_host", "project_id": "ce17e635-bc1b-44df-946c-149e938dedc4", - "revision": 5, + "revision": 6, "topology": { "computes": [ { diff --git a/tests/topologies/1_5_images/after/1_5_image.gns3 b/tests/topologies/1_5_images/after/1_5_image.gns3 index 24099682..f371c2ed 100644 --- a/tests/topologies/1_5_images/after/1_5_image.gns3 +++ b/tests/topologies/1_5_images/after/1_5_image.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_image", "project_id": "ANYUUID", - "revision": 5, + "revision": 6, "topology": { "computes": [], "drawings": [ diff --git a/tests/topologies/1_5_internet/after/1_5_internet.gns3 b/tests/topologies/1_5_internet/after/1_5_internet.gns3 index 2d5c7b40..7214d7c7 100644 --- a/tests/topologies/1_5_internet/after/1_5_internet.gns3 +++ b/tests/topologies/1_5_internet/after/1_5_internet.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_internet", "project_id": "a64f6cf9-ea6e-42e6-9e4e-a2a292e2b827", - "revision": 5, + "revision": 6, "topology": { "computes": [ {"name": "GNS3 VM", "protocol": "http", "port": 3080, "host": "172.16.16.150", "compute_id": "vm"} diff --git a/tests/topologies/1_5_iou/after/1_5_iou.gns3 b/tests/topologies/1_5_iou/after/1_5_iou.gns3 index 874d0073..f45baa1c 100644 --- a/tests/topologies/1_5_iou/after/1_5_iou.gns3 +++ b/tests/topologies/1_5_iou/after/1_5_iou.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_iou", "project_id": "8a077150-3e3e-4fed-944e-b8cd882e24db", - "revision": 5, + "revision": 6, "topology": { "computes": [ { diff --git a/tests/topologies/1_5_qemu/after/testqemu.gns3 b/tests/topologies/1_5_qemu/after/testqemu.gns3 index 6c527615..db3d15c4 100644 --- a/tests/topologies/1_5_qemu/after/testqemu.gns3 +++ b/tests/topologies/1_5_qemu/after/testqemu.gns3 @@ -1,7 +1,7 @@ { "name": "testqemu", "project_id": "a3ca8a82-6b11-4c8e-b20d-c9e94286054c", - "revision": 5, + "revision": 6, "auto_start": false, "topology": { "computes": [ diff --git a/tests/topologies/1_5_snapshot/after/1_5_snapshot.gns3 b/tests/topologies/1_5_snapshot/after/1_5_snapshot.gns3 index 1cead513..08f8c367 100644 --- a/tests/topologies/1_5_snapshot/after/1_5_snapshot.gns3 +++ b/tests/topologies/1_5_snapshot/after/1_5_snapshot.gns3 @@ -41,7 +41,7 @@ } ] }, - "revision" : 5, + "revision": 6, "name" : "1_5_snapshot", "project_id" : "17912669-dd40-4843-b348-689b8f34f09d", "auto_start" : false diff --git a/tests/topologies/1_5_virtualbox/after/1_5_virtualbox.gns3 b/tests/topologies/1_5_virtualbox/after/1_5_virtualbox.gns3 index 1647677a..1f591b24 100644 --- a/tests/topologies/1_5_virtualbox/after/1_5_virtualbox.gns3 +++ b/tests/topologies/1_5_virtualbox/after/1_5_virtualbox.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_virtualbox", "project_id": "bf00c459-05a5-45c0-950c-3f6150a20703", - "revision": 5, + "revision": 6, "topology": { "computes": [ { @@ -37,7 +37,6 @@ "acpi_shutdown": false, "adapter_type": "Intel PRO/1000 MT Desktop (82540EM)", "adapters": 1, - "enable_remote_console": false, "headless": false, "ram": 512, "use_any_adapter": false, diff --git a/tests/topologies/1_5_vmware/after/1_5_vmware.gns3 b/tests/topologies/1_5_vmware/after/1_5_vmware.gns3 index 6e7bfd69..98a25f62 100644 --- a/tests/topologies/1_5_vmware/after/1_5_vmware.gns3 +++ b/tests/topologies/1_5_vmware/after/1_5_vmware.gns3 @@ -1,7 +1,7 @@ { "name": "1_5_vmware", "project_id": "4be1f3e5-76e5-4223-93b7-f37f4091549e", - "revision": 5, + "revision": 6, "auto_start": false, "topology": { "computes": [ @@ -37,7 +37,6 @@ "acpi_shutdown": false, "adapter_type": "e1000", "adapters": 1, - "enable_remote_console": false, "headless": false, "use_any_adapter": false, "vmx_path": "/Users/bob/Documents/Virtual Machines.localized/GNS3 VM.vmwarevm/GNS3 VM.vmx" diff --git a/tests/topologies/1_5_vpcs/after/1_5_vpcs.gns3 b/tests/topologies/1_5_vpcs/after/1_5_vpcs.gns3 index 98b19857..59e98ebb 100644 --- a/tests/topologies/1_5_vpcs/after/1_5_vpcs.gns3 +++ b/tests/topologies/1_5_vpcs/after/1_5_vpcs.gns3 @@ -2,7 +2,7 @@ "auto_start": false, "name": "1_5_vpcs", "project_id": "62fc7a04-ae65-4003-a9e6-a046b1996f0e", - "revision": 5, + "revision": 6, "topology": { "computes": [ { diff --git a/tests/topologies/2_0_vmware/after/1_5_vmware.gns3 b/tests/topologies/2_0_vmware/after/1_5_vmware.gns3 new file mode 100644 index 00000000..98a25f62 --- /dev/null +++ b/tests/topologies/2_0_vmware/after/1_5_vmware.gns3 @@ -0,0 +1,53 @@ +{ + "name": "1_5_vmware", + "project_id": "4be1f3e5-76e5-4223-93b7-f37f4091549e", + "revision": 6, + "auto_start": false, + "topology": { + "computes": [ + { + "compute_id": "local", + "host": "127.0.0.1", + "name": "Local", + "port": 3080, + "protocol": "http" + } + ], + "drawings": [], + "links": [], + "nodes": [ + { + "compute_id": "local", + "console": 2000, + "console_type": "telnet", + "label": { + "rotation": 0, + "style": "font-family: TypeWriter;font-size: 10;font-weight: bold;fill: #000000;fill-opacity: 1.0;", + "text": "GNS3 VM", + "x": 5, + "y": -25 + }, + "name": "GNS3 VM", + "node_id": "9e06d0ce-e8df-4f38-bdfa-7c83e19a91c1", + "node_type": "vmware", + "port_name_format": "Ethernet{0}", + "port_segment_size": 0, + "first_port_name": null, + "properties": { + "acpi_shutdown": false, + "adapter_type": "e1000", + "adapters": 1, + "headless": false, + "use_any_adapter": false, + "vmx_path": "/Users/bob/Documents/Virtual Machines.localized/GNS3 VM.vmwarevm/GNS3 VM.vmx" + }, + "symbol": ":/symbols/vmware_guest.svg", + "x": 7, + "y": 8, + "z": 1 + } + ] + }, + "type": "topology", + "version": "ANYSTR" +} diff --git a/tests/topologies/2_0_vmware/before/1_5_vmware.gns3 b/tests/topologies/2_0_vmware/before/1_5_vmware.gns3 new file mode 100644 index 00000000..de3a93e1 --- /dev/null +++ b/tests/topologies/2_0_vmware/before/1_5_vmware.gns3 @@ -0,0 +1,54 @@ +{ + "name": "1_5_vmware", + "project_id": "4be1f3e5-76e5-4223-93b7-f37f4091549e", + "revision": 5, + "auto_start": false, + "topology": { + "computes": [ + { + "compute_id": "local", + "host": "127.0.0.1", + "name": "Local", + "port": 3080, + "protocol": "http" + } + ], + "drawings": [], + "links": [], + "nodes": [ + { + "compute_id": "local", + "console": 2000, + "console_type": "serial", + "label": { + "rotation": 0, + "style": "font-family: TypeWriter;font-size: 10;font-weight: bold;fill: #000000;fill-opacity: 1.0;", + "text": "GNS3 VM", + "x": 5, + "y": -25 + }, + "name": "GNS3 VM", + "node_id": "9e06d0ce-e8df-4f38-bdfa-7c83e19a91c1", + "node_type": "vmware", + "port_name_format": "Ethernet{0}", + "port_segment_size": 0, + "first_port_name": null, + "properties": { + "acpi_shutdown": false, + "adapter_type": "e1000", + "adapters": 1, + "headless": false, + "use_any_adapter": false, + "enable_remote_console": false, + "vmx_path": "/Users/bob/Documents/Virtual Machines.localized/GNS3 VM.vmwarevm/GNS3 VM.vmx" + }, + "symbol": ":/symbols/vmware_guest.svg", + "x": 7, + "y": 8, + "z": 1 + } + ] + }, + "type": "topology", + "version": "ANYSTR" +}