aboutsummaryrefslogtreecommitdiffstats
path: root/app/test/fetch/cli_fetch
diff options
context:
space:
mode:
authorYaron Yogev <yaronyogev@gmail.com>2017-07-27 09:02:54 +0300
committerYaron Yogev <yaronyogev@gmail.com>2017-07-27 14:56:25 +0300
commit7e83d0876ddb84a45e130eeba28bc40ef53c074b (patch)
tree47d76239ae7658d87c66abd142df92709427e7dd /app/test/fetch/cli_fetch
parent378ecbd8947589b9cbb39013a0c2e2aa201e03bd (diff)
Calipso initial release for OPNFV
Change-Id: I7210c244b0c10fa80bfa8c77cb86c9d6ddf8bc88 Signed-off-by: Yaron Yogev <yaronyogev@gmail.com>
Diffstat (limited to 'app/test/fetch/cli_fetch')
-rw-r--r--app/test/fetch/cli_fetch/__init__.py9
-rw-r--r--app/test/fetch/cli_fetch/test_cli_access.py159
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_host_pnics.py135
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_host_pnics_vpp.py34
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_host_vservices.py132
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics.py111
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_ovs.py36
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_vpp.py23
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_vconnectors.py66
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_ovs.py38
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_vpp.py50
-rw-r--r--app/test/fetch/cli_fetch/test_cli_fetch_vservice_vnics.py124
-rw-r--r--app/test/fetch/cli_fetch/test_data/__init__.py9
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_access.py58
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics.py147
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics_vpp.py204
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_host_verservices.py276
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_instance_vnics.py288
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors.py103
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_ovs.py234
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_vpp.py137
-rw-r--r--app/test/fetch/cli_fetch/test_data/cli_fetch_vservice_vnics.py616
22 files changed, 2989 insertions, 0 deletions
diff --git a/app/test/fetch/cli_fetch/__init__.py b/app/test/fetch/cli_fetch/__init__.py
new file mode 100644
index 0000000..b0637e9
--- /dev/null
+++ b/app/test/fetch/cli_fetch/__init__.py
@@ -0,0 +1,9 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
diff --git a/app/test/fetch/cli_fetch/test_cli_access.py b/app/test/fetch/cli_fetch/test_cli_access.py
new file mode 100644
index 0000000..f393538
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_access.py
@@ -0,0 +1,159 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+import time
+
+from discover.fetchers.cli.cli_access import CliAccess
+from test.fetch.cli_fetch.test_data.cli_access import *
+from test.fetch.test_fetch import TestFetch
+from unittest.mock import MagicMock, patch
+from utils.ssh_conn import SshConn
+
+
+class TestCliAccess(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.cli_access = CliAccess()
+
+ @patch("utils.ssh_conn.SshConn.exec")
+ def check_run_result(self, is_gateway_host,
+ enable_cache,
+ cached_command_result, exec_result,
+ expected_result, err_msg,
+ ssh_con_exec):
+ # mock cached commands
+ if not is_gateway_host:
+ self.cli_access.cached_commands = {
+ NON_GATEWAY_CACHED_COMMAND: cached_command_result
+ }
+ else:
+ self.cli_access.cached_commands = {
+ GATEWAY_CACHED_COMMAND: cached_command_result
+ }
+ original_is_gateway_host = SshConn.is_gateway_host
+ SshConn.is_gateway_host = MagicMock(return_value=is_gateway_host)
+ ssh_con_exec.return_value = exec_result
+ result = self.cli_access.run(COMMAND, COMPUTE_HOST_ID,
+ on_gateway=False, enable_cache=enable_cache)
+ self.assertEqual(result, expected_result, err_msg)
+
+ # reset the cached commands after testing
+ self.cli_access.cached_commands = {}
+ # reset method
+ SshConn.is_gateway_host = original_is_gateway_host
+
+ def test_run(self):
+ curr_time = time.time()
+ test_cases = [
+ {
+ "is_gateway_host": True,
+ "enable_cache": False,
+ "cached_command_result": None,
+ "exec_result": RUN_RESULT,
+ "expected_result": RUN_RESULT,
+ "err_msg": "Can't get the " +
+ "result of the command"
+ },
+ {
+ "is_gateway_host": True,
+ "enable_cache": True,
+ "cached_command_result": {
+ "timestamp": curr_time,
+ "result": CACHED_COMMAND_RESULT
+ },
+ "exec_result": None,
+ "expected_result": CACHED_COMMAND_RESULT,
+ "err_msg": "Can't get the cached " +
+ "result of the command " +
+ "when the host is a gateway host"
+ },
+ {
+ "is_gateway_host": False,
+ "enable_cache": True,
+ "cached_command_result": {
+ "timestamp": curr_time,
+ "result": CACHED_COMMAND_RESULT
+ },
+ "exec_result": None,
+ "expected_result": CACHED_COMMAND_RESULT,
+ "err_msg": "Can't get the cached " +
+ "result of the command " +
+ "when the host is not a gateway host"
+ },
+ {
+ "is_gateway_host": True,
+ "enable_cache": True,
+ "cached_command_result": {
+ "timestamp": curr_time - self.cli_access.cache_lifetime,
+ "result": CACHED_COMMAND_RESULT
+ },
+ "exec_result": RUN_RESULT,
+ "expected_result": RUN_RESULT,
+ "err_msg": "Can't get the result " +
+ "of the command when the cached result expired " +
+ "and the host is a gateway host"
+ },
+ {
+ "is_gateway_host": False,
+ "enable_cache": True,
+ "cached_command_result": {
+ "timestamp": curr_time - self.cli_access.cache_lifetime,
+ "result": CACHED_COMMAND_RESULT
+ },
+ "exec_result": RUN_RESULT,
+ "expected_result": RUN_RESULT,
+ "err_msg": "Can't get the result " +
+ "of the command when the cached result expired " +
+ "and the host is a not gateway host"
+ }
+ ]
+
+ for test_case in test_cases:
+ self.check_run_result(test_case["is_gateway_host"],
+ test_case["enable_cache"],
+ test_case["cached_command_result"],
+ test_case["exec_result"],
+ test_case["expected_result"],
+ test_case["err_msg"])
+
+ def test_run_fetch_lines(self):
+ original_run = self.cli_access.run
+ self.cli_access.run = MagicMock(return_value=RUN_RESULT)
+
+ result = self.cli_access.run_fetch_lines(COMMAND, COMPUTE_HOST_ID)
+
+ self.assertEqual(result, FETCH_LINES_RESULT,
+ "Can't get correct result of the command line")
+ self.cli_access.run = original_run
+
+ def test_run_fetch_lines_with_empty_command_result(self):
+ original_run = self.cli_access.run
+ self.cli_access.run = MagicMock(return_value="")
+
+ result = self.cli_access.run_fetch_lines(COMMAND, COMPUTE_HOST_ID)
+ self.assertEqual(result, [], "Can't get [] when the command " +
+ "result is empty")
+ self.cli_access.run = original_run
+
+ def test_merge_ws_spillover_lines(self):
+ fixed_lines = self.cli_access.merge_ws_spillover_lines(LINES_FOR_FIX)
+ self.assertEqual(fixed_lines, FIXED_LINES, "Can't merge the " +
+ "ws-separated spillover lines")
+
+ def test_parse_line_with_ws(self):
+ parse_line = self.cli_access.parse_line_with_ws(LINE_FOR_PARSE, HEADERS)
+ self.assertEqual(parse_line, PARSED_LINE, "Can't parse the line with ws")
+
+ def test_parse_cmd_result_with_whitespace(self):
+ result = self.cli_access.parse_cmd_result_with_whitespace(FIXED_LINES,
+ HEADERS,
+ remove_first=False)
+ self.assertEqual(result, PARSED_CMD_RESULT,
+ "Can't parse the cmd result with whitespace")
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_host_pnics.py b/app/test/fetch/cli_fetch/test_cli_fetch_host_pnics.py
new file mode 100644
index 0000000..f5f327e
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_host_pnics.py
@@ -0,0 +1,135 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_host_pnics import CliFetchHostPnics
+from test.fetch.cli_fetch.test_data.cli_fetch_host_pnics import *
+from test.fetch.test_fetch import TestFetch
+from unittest.mock import MagicMock
+from unittest.mock import call
+
+
+class TestCliFetchHostPnics(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchHostPnics()
+ self.fetcher.set_env(self.env)
+
+ def check_get_result(self, host,
+ interface_lines, interface_names,
+ interface_details, expected_result,
+ err_msg):
+ original_get_by_id = self.fetcher.inv.get_by_id
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_find_interface_details = self.fetcher.find_interface_details
+
+ self.fetcher.inv.get_by_id = MagicMock(return_value=host)
+ self.fetcher.run_fetch_lines = MagicMock(return_value=interface_lines)
+ self.fetcher.find_interface_details = MagicMock(side_effect=
+ interface_details)
+ result = self.fetcher.get(PNICS_FOLDER_ID)
+ self.assertEqual(result, expected_result, err_msg)
+
+ if interface_names:
+ interface_calls = [call(HOST_ID, interface_name) for
+ interface_name in interface_names]
+ self.fetcher.find_interface_details.assert_has_calls(interface_calls,
+ any_order=True)
+ # reset the methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.find_interface_details = original_find_interface_details
+
+ def test_get(self):
+ test_cases = [
+ {
+ "host": NETWORK_NODE,
+ "interface_lines": INTERFACE_LINES,
+ "interface_names": INTERFACE_NAMES,
+ "interface_details": [INTERFACE, None],
+ "expected_results": INTERFACES_GET_RESULTS,
+ "err_msg": "Can't get interfaces"
+ },
+ {
+ "host": [],
+ "interface_lines": None,
+ "interface_names": None,
+ "interface_details": None,
+ "expected_results": [],
+ "err_msg": "Can't get [] when the host " +
+ "doesn't exist in the database"
+ },
+ {
+ "host": WRONG_NODE,
+ "interface_lines": None,
+ "interface_names": None,
+ "interface_details": None,
+ "expected_results": [],
+ "err_msg": "Can't get [] when the host doesn't " +
+ "have required host type"
+ },
+ {
+ "host": NETWORK_NODE,
+ "interface_lines": [],
+ "interface_names": None,
+ "interface_details":None,
+ "expected_results": [],
+ "err_msg": "Can't get [] when " +
+ "the interface lines is []"
+ }
+ ]
+ for test_case in test_cases:
+ self.check_get_result(test_case["host"],
+ test_case["interface_lines"],
+ test_case["interface_names"],
+ test_case["interface_details"],
+ test_case["expected_results"],
+ test_case["err_msg"])
+
+ def test_find_interface_details(self):
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_handle_line = self.fetcher.handle_line
+ original_set_interface_data = self.fetcher.set_interface_data
+
+ self.fetcher.run_fetch_lines = MagicMock(return_value=IFCONFIG_CM_RESULT)
+ self.fetcher.handle_line = MagicMock()
+ self.fetcher.set_interface_data = MagicMock()
+
+ result = self.fetcher.find_interface_details(HOST_ID, INTERFACE_NAME)
+
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.handle_line = original_handle_line
+ self.fetcher.set_interface_data = original_set_interface_data
+
+ self.assertEqual(result, INTERFACE_DETAILS, "Can't get interface details")
+
+ def test_handle_mac_address_line(self):
+ self.fetcher.handle_line(RAW_INTERFACE, MAC_ADDRESS_LINE)
+ self.assertEqual(RAW_INTERFACE["mac_address"], MAC_ADDRESS,
+ "Can't get the correct mac address")
+
+ # Test failed, defect, result: addr: expected result: fe80::f816:3eff:fea1:eb73/64
+ def test_handle_ipv6_address_line(self):
+ self.fetcher.handle_line(RAW_INTERFACE, IPV6_ADDRESS_LINE)
+ self.assertEqual(RAW_INTERFACE['IPv6 Address'], IPV6_ADDRESS,
+ "Can' get the correct ipv6 address")
+
+ def test_handle_ipv4_address_line(self):
+ self.fetcher.handle_line(RAW_INTERFACE, IPV4_ADDRESS_LINE)
+ self.assertEqual(RAW_INTERFACE['IP Address'], IPV4_ADDRESS,
+ "Can't get the correct ipv4 address")
+
+ def test_set_interface_data(self):
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ self.fetcher.run_fetch_lines = MagicMock(return_value=ETHTOOL_RESULT)
+ self.fetcher.set_interface_data(INTERFACE_FOR_SET)
+ self.assertEqual(INTERFACE_FOR_SET, INTERFACE_AFTER_SET, "Can't get the attributes of the "
+ "interface from the CMD result")
+
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_host_pnics_vpp.py b/app/test/fetch/cli_fetch/test_cli_fetch_host_pnics_vpp.py
new file mode 100644
index 0000000..805e36d
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_host_pnics_vpp.py
@@ -0,0 +1,34 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_host_pnics_vpp import CliFetchHostPnicsVpp
+from test.fetch.test_fetch import TestFetch
+from unittest.mock import MagicMock
+from test.fetch.cli_fetch.test_data.cli_fetch_host_pnics_vpp import *
+
+
+class TestCliFetchHostPnicsVpp(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchHostPnicsVpp()
+ self.fetcher.set_env(self.env)
+
+ def test_get(self):
+ # store original method
+ original_find_items = self.fetcher.inv.find_items
+
+ # mock the method
+ self.fetcher.inv.find_items = MagicMock(return_value=VEDGES)
+
+ result = self.fetcher.get(ID)
+ # reset the method
+ self.fetcher.inv.find_items = original_find_items
+
+ self.assertNotEqual(result, [], "Can't get the pnics info") \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_host_vservices.py b/app/test/fetch/cli_fetch/test_cli_fetch_host_vservices.py
new file mode 100644
index 0000000..c33faca
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_host_vservices.py
@@ -0,0 +1,132 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_host_vservices import CliFetchHostVservices
+from test.fetch.test_fetch import TestFetch
+from test.fetch.cli_fetch.test_data.cli_fetch_host_verservices import *
+from unittest.mock import MagicMock
+
+
+class TestCliFetchHostVservices(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchHostVservices()
+ self.fetcher.set_env(self.env)
+
+ def test_get(self):
+ # store original get_single method
+ original_get_single = self.fetcher.inv.get_single
+ # mock the host data
+ self.fetcher.inv.get_single = MagicMock(return_value=NETWORK_HOST)
+ # store original run_fetch_lines method
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ # mock command line results
+ self.fetcher.run_fetch_lines = MagicMock(return_value=NAMESPACES)
+
+ # only test the logic on get method, mock the set_details method
+ original_set_details = self.fetcher.set_details
+ self.fetcher.set_details = MagicMock()
+
+ result = self.fetcher.get(NETWORK_HOST['id'])
+ # reset methods
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.set_details = original_set_details
+ self.fetcher.inv.get_single = original_get_single
+
+ self.assertNotEqual(result, [], "Can't get verservices")
+
+ def test_get_with_wrong_host_type(self):
+ # store original get_single method
+ original_get_single = self.fetcher.inv.get_single
+ # mock the host data
+ self.fetcher.inv.get_single = MagicMock(return_value=COMPUTE_HOST)
+ result = self.fetcher.get(COMPUTE_HOST['id'])
+
+ self.fetcher.inv.get_single = original_get_single
+
+ self.assertEqual(result, [], "Can't get empty array when the host_type doesn't contain Network")
+
+ def test_set_details(self):
+ # store orginal methods
+ original_get_router_name = self.fetcher.get_router_name
+ original_get_network_name = self.fetcher.get_network_name
+ original_get_type = self.fetcher.agents_list.get_type
+
+ # mock methods
+ self.fetcher.get_network_name = MagicMock(return_value=ROUTER[0]['name'])
+ self.fetcher.get_router_name = MagicMock(return_value=ROUTER[0]['name'])
+ self.fetcher.agents_list.get_type = MagicMock(return_value=AGENT)
+
+ self.fetcher.set_details(NETWORK_HOST['id'], LOCAL_SERVICES_IDS[0])
+
+ # reset methods
+ self.fetcher.get_network_name = original_get_network_name
+ self.fetcher.get_router_name = original_get_router_name
+ self.fetcher.agents_list.get_type = original_get_type
+
+ self.assertIn("name", LOCAL_SERVICES_IDS[0], "Can't add name")
+ self.assertIn("parent_id", LOCAL_SERVICES_IDS[0], "Can't add parent id")
+
+ def test_get_network_name(self):
+ # store original method
+ original_get_objects_list_for_id = self.fetcher.get_objects_list_for_id
+ # mock the result
+ self.fetcher.get_objects_list_for_id = MagicMock(return_value=ROUTER)
+
+ name = self.fetcher.get_network_name(ID_CLEAN)
+
+ self.fetcher.get_objects_list_for_id = original_get_objects_list_for_id
+ self.assertEqual(name, ROUTER[0]['name'], "Can't get network name")
+
+ def test_get_network_without_router(self):
+ # store original method
+ original_get_objects_list_for_id = self.fetcher.get_objects_list_for_id
+ # mock the result
+ self.fetcher.get_objects_list_for_id = MagicMock(return_value=[])
+
+ name = self.fetcher.get_network_name(ID_CLEAN)
+
+ self.fetcher.get_objects_list_for_id = original_get_objects_list_for_id
+ self.assertEqual(name, ID_CLEAN, "Can't use the id as the name when network info from database is empty")
+
+ def test_get_router_name(self):
+ # store original method
+ original_get_objects_list_for_id = self.fetcher.get_objects_list_for_id
+ # mock the result
+ self.fetcher.get_objects_list_for_id = MagicMock(return_value=ROUTER)
+
+ name = self.fetcher.get_router_name(LOCAL_SERVICES_IDS[0], ID_CLEAN)
+
+ self.fetcher.get_objects_list_for_id = original_get_objects_list_for_id
+
+ self.assertIn("name", LOCAL_SERVICES_IDS[0], "Can't get network name")
+ self.assertEqual(name, ROUTER[0]['name'], "Can't get router name")
+
+ def test_set_agent_type(self):
+ # store original get_type method
+ original_get_type = self.fetcher.agents_list.get_type
+ self.fetcher.agents_list.get_type = MagicMock(return_value=AGENT)
+
+ self.fetcher.set_agent_type(VSERVICE)
+ # reset method
+ self.fetcher.set_agent_type = original_get_type
+ self.assertIn("parent_id", VSERVICE, "Can't add parent id to vservice document")
+
+ def test_set_agent_type_without_agent(self):
+ # store original get_type method
+ original_get_type = self.fetcher.agents_list.get_type
+ self.fetcher.agents_list.get_type = MagicMock(return_value={})
+
+ self.fetcher.set_agent_type(VSERVICE)
+ # reset method
+ self.fetcher.set_agent_type = original_get_type
+ self.assertIn("parent_id", VSERVICE, "Can't add parent id to vservice document")
+ self.assertEqual(VSERVICE['parent_type'], "vservice_miscellenaous_folder",
+ "Can't add document to miscellenaous folder when it doesn't have agent") \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics.py b/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics.py
new file mode 100644
index 0000000..5a57b9c
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics.py
@@ -0,0 +1,111 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_instance_vnics import CliFetchInstanceVnics
+from test.fetch.test_fetch import TestFetch
+from test.fetch.cli_fetch.test_data.cli_fetch_instance_vnics import *
+from unittest.mock import MagicMock
+
+
+class TestCliFetchInstanceVnics(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchInstanceVnics()
+ self.fetcher.set_env(self.env)
+
+ def test_get(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_get_vnics_from_dumpxml = self.fetcher.get_vnics_from_dumpxml
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(side_effect=[INSATNCE, COMPUTE_HOST])
+ self.fetcher.run_fetch_lines = MagicMock(return_value=INSTANCES_LIST)
+ self.fetcher.get_vnics_from_dumpxml = MagicMock(return_value=VNICS_FROM_DUMP_XML)
+
+ result = self.fetcher.get(VNICS_FOLDER['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.get_vnics_from_dumpxml = original_get_vnics_from_dumpxml
+
+ self.assertNotEqual(result, [], "Can't get vnics with VNICS folder id")
+
+ def test_get_without_instance(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(return_value=[])
+
+ result = self.fetcher.get(VNICS_FOLDER['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+
+ self.assertEqual(result, [], "Can't get empty array when the instance can't be found")
+
+ def test_get_without_host(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(side_effect=[[], NETWORK_HOST])
+
+ result = self.fetcher.get(VNICS_FOLDER['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+
+ self.assertEqual(result, [], "Can't get empty array when the host doesn't contain network host type")
+
+ def test_get_vnics_from_dumpxml(self):
+ # store original functions
+ original_run = self.fetcher.run
+ original_set_vnic_properties = self.fetcher.set_vnic_properties
+
+ # mock the functions
+ self.fetcher.run = MagicMock(return_value=DUMPXML)
+ self.fetcher.set_vnic_properties = MagicMock()
+
+ vnics = self.fetcher.get_vnics_from_dumpxml(ID, INSATNCE)
+ # reset functions
+ self.fetcher.run = original_run
+ self.fetcher.set_vnic_properties = original_set_vnic_properties
+
+ self.assertNotEqual(vnics, [], "Can't get vnics")
+
+ def test_get_vnics_from_dumpxml_with_empty_command_result(self):
+ # store original functions
+ original_run = self.fetcher.run
+
+ # mock the functions
+ self.fetcher.run = MagicMock(return_value=" ")
+
+ vnics = self.fetcher.get_vnics_from_dumpxml(ID, INSATNCE)
+ # reset functions
+ self.fetcher.run = original_run
+
+ self.assertEqual(vnics, [], "Can't get empty array when the dumpxml is empty")
+
+ def test_get_vnics_from_dumpxml_with_wrong_instance(self):
+ # store original functions
+ original_run = self.fetcher.run
+
+ # mock the functions
+ self.fetcher.run = MagicMock(return_value=WRONG_DUMPXML)
+
+ vnics = self.fetcher.get_vnics_from_dumpxml(ID, INSATNCE)
+ # reset functions
+ self.fetcher.run = original_run
+
+ self.assertEqual(vnics, [], "Can't get empty array when the instance is wrong") \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_ovs.py b/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_ovs.py
new file mode 100644
index 0000000..24a1b5d
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_ovs.py
@@ -0,0 +1,36 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.cli_fetch_instance_vnics_ovs import CliFetchInstanceVnicsOvs
+from test.fetch.test_fetch import TestFetch
+from test.fetch.cli_fetch.test_data.cli_fetch_instance_vnics import *
+from unittest.mock import MagicMock
+
+
+class TestCliFetchInstanceVnicsOvs(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchInstanceVnicsOvs()
+ self.fetcher.set_env(self.env)
+
+ def test_set_vnic_properties(self):
+ # store original method
+ original_set = self.fetcher.inv.set
+ self.fetcher.inv.set = MagicMock()
+
+ self.fetcher.set_vnic_properties(VNIC, INSATNCE)
+ # reset method
+ self.fetcher.inv.set = original_set
+
+ self.assertIn("source_bridge", VNIC, "Can't set source_bridge for ovs vnic")
+
+ def test_get_vnic_name(self):
+ name = self.fetcher.get_vnic_name(VNIC, INSATNCE)
+ self.assertNotEqual(name, None, "Can't get vnic name") \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_vpp.py b/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_vpp.py
new file mode 100644
index 0000000..46c25fb
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_instance_vnics_vpp.py
@@ -0,0 +1,23 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.cli_fetch_instance_vnics_vpp import CliFetchInstanceVnicsVpp
+from test.fetch.cli_fetch.test_data.cli_fetch_instance_vnics import *
+from test.fetch.test_fetch import TestFetch
+
+
+class TestCliFetchInstanceVnicsVpp(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchInstanceVnicsVpp()
+
+ def test_get_name(self):
+ name = self.fetcher.get_vnic_name(VNIC, INSATNCE)
+ self.assertNotEqual(name, None, "Can't get vnic name") \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors.py b/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors.py
new file mode 100644
index 0000000..23e0a99
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors.py
@@ -0,0 +1,66 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_vconnectors import CliFetchVconnectors
+from test.fetch.test_fetch import TestFetch
+from test.fetch.cli_fetch.test_data.cli_fetch_vconnectors import *
+from unittest.mock import MagicMock
+
+
+class TestCliFetchVconnectors(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchVconnectors()
+ self.fetcher.set_env(self.env)
+
+ def test_get(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+ original_get_vconnectors = self.fetcher.get_vconnectors
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(return_value=HOST)
+ self.fetcher.get_vconnectors = MagicMock(return_value=VCONNECTORS)
+
+ result = self.fetcher.get(VCONNECTORS_FOLDER['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+ self.fetcher.get_vconnectors = original_get_vconnectors
+
+ self.assertEqual(result, VCONNECTORS, "Can't get the vconnectors")
+
+ def test_get_without_host(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(return_value=[])
+
+ result = self.fetcher.get(VCONNECTORS_FOLDER['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+
+ self.assertEqual(result, [], "Can't get empty array when the host doesn't exist")
+
+ def test_get_with_wrong_host(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(return_value=WRONG_HOST)
+
+ result = self.fetcher.get(VCONNECTORS_FOLDER['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+
+ self.assertEqual(result, [], "Can't get empty array when the host doesn't contain host type") \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_ovs.py b/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_ovs.py
new file mode 100644
index 0000000..cc882a1
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_ovs.py
@@ -0,0 +1,38 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_vconnectors_ovs import CliFetchVconnectorsOvs
+from test.fetch.test_fetch import TestFetch
+from test.fetch.cli_fetch.test_data.cli_fetch_vconnectors_ovs import *
+from unittest.mock import MagicMock
+
+
+class TestCliFetchVconnectorsOvs(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchVconnectorsOvs()
+ self.fetcher.set_env(self.env)
+
+ def test_get_vconnectors(self):
+ # store the original methods
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_find_items = self.fetcher.inv.find_items
+
+ # mock the methods
+ self.fetcher.run_fetch_lines = MagicMock(return_value=BRIDGE_RESULT)
+ self.fetcher.inv.find_items = MagicMock(return_value=[])
+
+ result = self.fetcher.get_vconnectors(NETWORK_NODE)
+
+ # reset methods
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.inv.find_items = original_find_items
+
+ self.assertNotEqual(result, [], "Can't get vconnectors with the host id")
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_vpp.py b/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_vpp.py
new file mode 100644
index 0000000..f729c2c
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_vconnectors_vpp.py
@@ -0,0 +1,50 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_vconnectors_vpp import CliFetchVconnectorsVpp
+from test.fetch.test_fetch import TestFetch
+from unittest.mock import MagicMock
+from test.fetch.cli_fetch.test_data.cli_fetch_vconnectors_vpp import *
+
+
+class TestCliFetchVconnectorsVpp(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchVconnectorsVpp()
+ self.fetcher.set_env(self.env)
+
+ def test_get_vconnectors(self):
+ # store original method
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_get_interface_details = self.fetcher.get_interface_details
+
+ # mock methods
+ self.fetcher.run_fetch_lines = MagicMock(return_value=MODE_RESULT)
+ self.fetcher.get_interface_details = MagicMock(return_value=None)
+
+ result = self.fetcher.get_vconnectors(HOST)
+
+ # reset methods
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.get_interface_details = original_get_interface_details
+
+ self.assertNotEqual(result, {}, "Can't get vconnectors info")
+
+ def test_set_interface_details(self):
+ # store original methods
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+
+ # mock method
+ self.fetcher.run_fetch_lines = MagicMock(return_value=INTERFACE_LINES)
+
+ result = self.fetcher.get_interface_details(HOST, INTERFACE_NAME)
+ # restore method
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.assertNotEqual(result, None, "Can't get the interface details") \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_cli_fetch_vservice_vnics.py b/app/test/fetch/cli_fetch/test_cli_fetch_vservice_vnics.py
new file mode 100644
index 0000000..b77f41e
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_cli_fetch_vservice_vnics.py
@@ -0,0 +1,124 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+from discover.fetchers.cli.cli_fetch_vservice_vnics import CliFetchVserviceVnics
+from test.fetch.test_fetch import TestFetch
+from test.fetch.cli_fetch.test_data.cli_fetch_vservice_vnics import *
+from unittest.mock import MagicMock
+
+
+class TestCliFetchVserviceVnics(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = CliFetchVserviceVnics()
+ self.fetcher.set_env(self.env)
+
+ def test_get(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_handle_service = self.fetcher.handle_service
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(return_value=NETWORK_NODE)
+ self.fetcher.run_fetch_lines = MagicMock(return_value=NAME_SPACES)
+ self.fetcher.handle_service = MagicMock(return_value=SERVICES)
+
+ result = self.fetcher.get(NETWORK_NODE['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.handle_service = original_handle_service
+
+ self.assertNotEqual(result, [], "Can't get vnics")
+
+ def test_get_with_error_host(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(return_value=ERROR_NODE)
+
+ result = self.fetcher.get(NETWORK_NODE['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+
+ self.assertEqual(result, [], "Can't get empty array when the host doesn't contain host_type")
+
+ def test_get_with_compute_host(self):
+ # store original methods
+ original_get_by_id = self.fetcher.inv.get_by_id
+
+ # mock methods
+ self.fetcher.inv.get_by_id = MagicMock(return_value=COMPUTE_NODE)
+
+ result = self.fetcher.get(NETWORK_NODE['id'])
+
+ # reset methods
+ self.fetcher.inv.get_by_id = original_get_by_id
+
+ self.assertEqual(result, [], "Can't get empty array when the host type doesn't contain network")
+
+ def test_handle_service(self):
+ # store original method
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_set_interface_data = self.fetcher.set_interface_data
+ # mock the method
+ self.fetcher.run_fetch_lines = MagicMock(return_value=IFCONFIG_RESULT)
+ self.fetcher.set_interface_data = MagicMock()
+ result = self.fetcher.handle_service(NETWORK_NODE['id'], SERVICE_ID)
+ # reset method
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.set_interface_data = original_set_interface_data
+
+ self.assertNotEqual(result, [], "Can't get interfaces data")
+
+ def test_set_interface_data(self):
+ # store original methods
+ original_get_by_field = self.fetcher.inv.get_by_field
+ original_get_by_id = self.fetcher.inv.get_by_id
+ original_set = self.fetcher.inv.set
+
+ # mock the methods
+ self.fetcher.inv.get_by_field = MagicMock(return_value=NETWORK)
+ self.fetcher.inv.get_by_id = MagicMock(return_value=VSERVICE)
+ self.fetcher.inv.set = MagicMock()
+
+ self.fetcher.set_interface_data(VNIC)
+
+ # reset methods
+ self.fetcher.inv.get_by_field = original_get_by_field
+ self.fetcher.inv.get_by_id = original_get_by_id
+ self.fetcher.inv.set = original_set
+
+ self.assertIn("data", VNIC, "Can't set data")
+ self.assertIn("cidr", VNIC, "Can't set cidr")
+ self.assertIn("network", VNIC, "Can't set network")
+
+ def test_handle_mac_address_line(self):
+ self.fetcher.handle_line(RAW_VNIC, MAC_ADDRESS_LINE)
+ self.assertEqual(RAW_VNIC['mac_address'], MAC_ADDRESS, "Can't get the correct mac address from the line")
+
+ def test_handle_ipv4_address_line(self):
+ self.fetcher.handle_line(RAW_VNIC, IPV4_ADDRESS_LINE)
+ self.assertEqual(RAW_VNIC['IP Address'], IPV4_ADDRESS, "Can't get the correct ipv4 address from the line")
+
+ def test_handle_ipv6_address_line(self):
+ self.fetcher.handle_line(RAW_VNIC, IPV6_ADDRESS_LINE)
+ self.assertEqual(RAW_VNIC['IPv6 Address'], IPV6_ADDRESS, "Can't get the correct ipv6 address from the line")
+
+ def test_get_net_size(self):
+ size = self.fetcher.get_net_size(NET_MASK_ARRAY)
+ self.assertEqual(size, SIZE, "Can't get the size of network by netmask")
+
+ def test_get_cidr_for_vnic(self):
+ cidr = self.fetcher.get_cidr_for_vnic(VNIC)
+ self.assertEqual(cidr, CIDR, "the cidr info is wrong")
diff --git a/app/test/fetch/cli_fetch/test_data/__init__.py b/app/test/fetch/cli_fetch/test_data/__init__.py
new file mode 100644
index 0000000..b0637e9
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/__init__.py
@@ -0,0 +1,9 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
diff --git a/app/test/fetch/cli_fetch/test_data/cli_access.py b/app/test/fetch/cli_fetch/test_data/cli_access.py
new file mode 100644
index 0000000..b151dc6
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_access.py
@@ -0,0 +1,58 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+COMPUTE_HOST_ID = "node-5.cisco.com"
+COMMAND = "virsh list"
+NON_GATEWAY_CACHED_COMMAND = COMPUTE_HOST_ID + "," + "ssh -o StrictHostKeyChecking=no " + \
+ COMPUTE_HOST_ID + " sudo " + COMMAND
+GATEWAY_CACHED_COMMAND = COMPUTE_HOST_ID + "," + "sudo " + COMMAND
+CACHED_COMMAND_RESULT = " Id Name State\n---\n 2 instance-00000003 running"
+RUN_RESULT = " Id Name State\n---\n 2 instance-00000002 running"
+FETCH_LINES_RESULT = [
+ " Id Name State",
+ "---",
+ " 2 instance-00000002 running"
+]
+
+LINES_FOR_FIX = [
+ "br-ex\t\t8000.005056acc9a2\tno\t\teno33554952",
+ "\t\t\t\t\t\t\tp_ff798dba-0",
+ "\t\t\t\t\t\t\tv_public",
+ "\t\t\t\t\t\t\tv_vrouter_pub",
+ "br-fw-admin\t\t8000.005056ace897\tno\t\teno16777728"
+]
+
+FIXED_LINES = [
+ "br-ex\t\t8000.005056acc9a2\tno\t\teno33554952,p_ff798dba-0,v_public,v_vrouter_pub",
+ "br-fw-admin\t\t8000.005056ace897\tno\t\teno16777728"
+]
+
+PARSED_CMD_RESULT = [
+ {
+ "bridge_id": "8000.005056acc9a2",
+ "bridge_name": "br-ex",
+ "interfaces": "eno33554952,p_ff798dba-0,v_public,v_vrouter_pub",
+ "stp_enabled": "no"
+ },
+ {
+ "bridge_id": "8000.005056ace897",
+ "bridge_name": "br-fw-admin",
+ "interfaces": "eno16777728",
+ "stp_enabled": "no"
+ }
+]
+
+LINE_FOR_PARSE = "br-ex\t\t8000.005056acc9a2\tno\t\teno33554952,p_ff798dba-0,v_public,v_vrouter_pub"
+PARSED_LINE = {
+ "bridge_id": "8000.005056acc9a2",
+ "bridge_name": "br-ex",
+ "interfaces": "eno33554952,p_ff798dba-0,v_public,v_vrouter_pub",
+ "stp_enabled": "no"
+}
+HEADERS = ["bridge_name", "bridge_id", "stp_enabled", "interfaces"]
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics.py
new file mode 100644
index 0000000..316c68a
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics.py
@@ -0,0 +1,147 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+PNICS_FOLDER_ID = "node-6.cisco.com-pnics"
+HOST_ID = "node-6.cisco.com"
+
+NETWORK_NODE = {
+ "host_type": [
+ "Controller",
+ "Network"
+ ],
+ "id": "node-6.cisco.com"
+}
+
+WRONG_NODE = {
+ "host_type": [
+ "Controller"
+ ]
+}
+
+INTERFACE_LINES = [
+ "lrwxrwxrwx 1 root 0 Jul 5 17:17 eno16777728 -> ../../devices/0000:02:00.0/net/eno16777728",
+ "lrwxrwxrwx 1 root 0 Jul 5 17:17 eno33554952 -> ../../devices/0000:02:01.0/net/eno33554952"
+]
+
+INTERFACE_NAMES = ["eno16777728", "eno33554952"]
+
+INTERFACE_NAME = INTERFACE_NAMES[0]
+IFCONFIG_CM_RESULT = [
+ "eno16777728 Link encap:Ethernet HWaddr 00:50:56:ac:e8:97 ",
+ " UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1",
+ " RX packets:409056348 errors:0 dropped:0 overruns:0 frame:0",
+ " TX packets:293898173 errors:0 dropped:0 overruns:0 carrier:0",
+ " collisions:0 txqueuelen:1000 ",
+ " RX bytes:103719003730 (103.7 GB) TX bytes:165090993470 (165.0 GB)",
+ ""
+]
+
+INTERFACE_DETAILS = {
+ "host": "node-6.cisco.com",
+ "id": "eno16777728-unknown_mac",
+ "lines": [],
+ "local_name": "eno16777728",
+ "name": "eno16777728",
+ "state": "UP"
+}
+
+MAC_ADDRESS_LINE = "eno16777728 Link encap:Ethernet HWaddr 00:50:56:ac:e8:97 "
+MAC_ADDRESS = "00:50:56:ac:e8:97"
+RAW_INTERFACE = {
+ "host": "node-6.cisco.com",
+ "lines": [],
+ "local_name": "eno16777728",
+ "name": "eno16777728"
+}
+
+INTERFACE_AFTER_LINE_HANDLE = {
+ "host": "node-6.cisco.com",
+ "lines": [MAC_ADDRESS_LINE.strip()],
+ "local_name": "eno16777728",
+ "name": "eno16777728",
+ "id": "eno16777728-" + MAC_ADDRESS,
+ "mac_address": MAC_ADDRESS
+}
+
+INTERFACE_FOR_SET = {
+ "host": "node-6.cisco.com",
+ "lines": [
+ "Link encap:Ethernet HWaddr 00:50:56:ac:e8:97",
+ "UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1"
+ ],
+ "local_name": "eno16777728",
+ "mac_address": "00:50:56:ac:e8:97"
+}
+
+INTERFACE_AFTER_SET = {
+ "host": "node-6.cisco.com",
+ "data": "Link encap:Ethernet HWaddr 00:50:56:ac:e8:97" +
+ "\nUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1",
+ "local_name": "eno16777728",
+ "mac_address": "00:50:56:ac:e8:97",
+ "Supported ports": "[ TP ]",
+ "Supported link modes": ["10baseT/Half 10baseT/Full",
+ "100baseT/Half 100baseT/Full",
+ "1000baseT/Full"],
+ "Supported pause frame use": "No"
+}
+
+INTERFACE = {
+ "Advertised auto-negotiation": "Yes",
+ "Advertised link modes": [
+ "10baseT/Half 10baseT/Full",
+ "100baseT/Half 100baseT/Full",
+ "1000baseT/Full"
+ ],
+ "Advertised pause frame use": "No",
+ "Auto-negotiation": "on",
+ "Current message level": [
+ "0x00000007 (7)",
+ "drv probe link"
+ ],
+ "Duplex": "Full",
+ "Link detected": "yes",
+ "MDI-X": "off (auto)",
+ "PHYAD": "0",
+ "Port": "Twisted Pair",
+ "Speed": "1000Mb/s",
+ "Supported link modes": [
+ "10baseT/Half 10baseT/Full",
+ "100baseT/Half 100baseT/Full",
+ "1000baseT/Full"
+ ],
+ "Supported pause frame use": "No",
+ "Supported ports": "[ TP ]",
+ "Supports Wake-on": "d",
+ "Supports auto-negotiation": "Yes",
+ "Transceiver": "internal",
+ "Wake-on": "d",
+ "data": "Link encap:Ethernet HWaddr 00:50:56:ac:e8:97\nUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\nRX packets:408989052 errors:0 dropped:0 overruns:0 frame:0\nTX packets:293849880 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:1000\nRX bytes:103702814216 (103.7 GB) TX bytes:165063440009 (165.0 GB)\n",
+ "host": "node-6.cisco.com",
+ "id": "eno16777728-00:50:56:ac:e8:97",
+ "local_name": "eno16777728",
+ "mac_address": "00:50:56:ac:e8:97",
+ "name": "eno16777728"
+}
+
+INTERFACES_GET_RESULTS = [INTERFACE]
+
+IPV6_ADDRESS_LINE = " inet6 addr: fe80::f816:3eff:fea1:eb73/64 Scope:Link"
+IPV6_ADDRESS = "fe80::f816:3eff:fea1:eb73/64"
+IPV4_ADDRESS_LINE = " inet addr:172.16.13.2 Bcast:172.16.13.255 Mask:255.255.255.0"
+IPV4_ADDRESS = "172.16.13.2"
+
+ETHTOOL_RESULT = [
+ "Settings for eno16777728:",
+ "\tSupported ports: [ TP ]",
+ "\tSupported link modes: 10baseT/Half 10baseT/Full ",
+ "\t 100baseT/Half 100baseT/Full ",
+ "\t 1000baseT/Full ",
+ "\tSupported pause frame use: No",
+]
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics_vpp.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics_vpp.py
new file mode 100644
index 0000000..99bd4cd
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_host_pnics_vpp.py
@@ -0,0 +1,204 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+ID = "node-4.cisco.com-VPP-folders"
+VEDGES = [
+ {
+ "agent_type": "Open vSwitch agent",
+ "binary": "neutron-openvswitch-agent",
+ "configurations" : {
+ "tunneling_ip": "192.168.2.3",
+ "arp_responder_enabled" : True,
+ "extensions" : [
+
+ ],
+ "l2_population" : True,
+ "enable_distributed_routing" : False,
+ "bridge_mappings" : {
+ "physnet1": "br-floating"
+ },
+ "log_agent_heartbeats" : False,
+ "tunnel_types" : [
+ "vxlan"
+ ],
+ "in_distributed_mode" : False
+ },
+ "description" : None,
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-6.cisco.com",
+ "id": "1764430c-c09e-4717-86fa-c04350b1fcbb",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/internal/node-6.cisco.com/node-6.cisco.com-vedges/1764430c-c09e-4717-86fa-c04350b1fcbb",
+ "name": "node-6.cisco.com-OVS",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/internal/node-6.cisco.com/vEdges/node-6.cisco.com-OVS",
+ "object_name": "node-6.cisco.com-OVS",
+ "parent_id": "node-6.cisco.com-vedges",
+ "parent_type": "vedges_folder",
+ "ports" : {
+ "TenGigabitEthernet-g-63489f34-af" : {
+ "id": "8",
+ "name": "qg-63489f34-af",
+ "internal" : True,
+ "tag": "2",
+ "host": "node-4.cisco.com",
+ "state": "up"
+ },
+ "qr-3ff411a2-54" : {
+ "id": "7",
+ "name": "qr-3ff411a2-54",
+ "internal" : True,
+ "tag": "5"
+ },
+ "tap31c19fbe-5d" : {
+ "id": "19",
+ "name": "tap31c19fbe-5d",
+ "internal" : True,
+ "tag": "117"
+ },
+ "br-int" : {
+ "id": "3",
+ "name": "br-int",
+ "internal" : True
+ },
+ "qr-18f029db-77" : {
+ "id": "17",
+ "name": "qr-18f029db-77",
+ "internal" : True,
+ "tag": "105"
+ },
+ "br-tun" : {
+ "id": "13",
+ "name": "br-tun",
+ "internal" : True
+ },
+ "tap82d4992f-4d" : {
+ "id": "9",
+ "name": "tap82d4992f-4d",
+ "internal" : True,
+ "tag": "5"
+ },
+ "tap16620a58-c4" : {
+ "id": "16",
+ "name": "tap16620a58-c4",
+ "internal" : True,
+ "tag": "6"
+ },
+ "p_ff798dba-0" : {
+ "id": "15",
+ "name": "p_ff798dba-0",
+ "internal" : True
+ },
+ "tapee8e5dbb-03" : {
+ "id": "6",
+ "name": "tapee8e5dbb-03",
+ "internal" : True,
+ "tag": "1"
+ },
+ "tap702e9683-0c" : {
+ "id": "20",
+ "name": "tap702e9683-0c",
+ "internal" : True,
+ "tag": "118"
+ },
+ "tapaf69959f-ef" : {
+ "id": "18",
+ "name": "tapaf69959f-ef",
+ "internal" : True,
+ "tag": "105"
+ },
+ "tap5f22f397-d8" : {
+ "id": "11",
+ "name": "tap5f22f397-d8",
+ "internal" : True,
+ "tag": "3"
+ },
+ "qr-bb9b8340-72" : {
+ "id": "1",
+ "name": "qr-bb9b8340-72",
+ "internal" : True,
+ "tag": "3"
+ },
+ "qr-8733cc5d-b3" : {
+ "id": "2",
+ "name": "qr-8733cc5d-b3",
+ "internal" : True,
+ "tag": "4"
+ },
+ "ovs-system" : {
+ "id": "0",
+ "name": "ovs-system",
+ "internal" : True
+ },
+ "br-floating" : {
+ "id": "14",
+ "name": "br-floating",
+ "internal" : True
+ },
+ "qg-57e65d34-3d" : {
+ "id": "10",
+ "name": "qg-57e65d34-3d",
+ "internal" : True,
+ "tag": "2"
+ },
+ "qr-f7b44150-99" : {
+ "id": "4",
+ "name": "qr-f7b44150-99",
+ "internal" : True,
+ "tag": "1"
+ },
+ "tapbf16c3ab-56" : {
+ "id": "5",
+ "name": "tapbf16c3ab-56",
+ "internal" : True,
+ "tag": "4"
+ }
+ },
+ "show_in_tree" : True,
+ "topic": "N/A",
+ "tunnel_ports" : {
+ "br-tun" : {
+ "name": "br-tun",
+ "interface": "br-tun",
+ "type": "internal"
+ },
+ "vxlan-c0a80201" : {
+ "name": "vxlan-c0a80201",
+ "options" : {
+ "local_ip": "192.168.2.3",
+ "out_key": "flow",
+ "in_key": "flow",
+ "df_default": "True",
+ "remote_ip": "192.168.2.1"
+ },
+ "interface": "vxlan-c0a80201",
+ "type": "vxlan"
+ },
+ "vxlan-c0a80202" : {
+ "name": "vxlan-c0a80202",
+ "options" : {
+ "local_ip": "192.168.2.3",
+ "out_key": "flow",
+ "in_key": "flow",
+ "df_default": "True",
+ "remote_ip": "192.168.2.2"
+ },
+ "interface": "vxlan-c0a80202",
+ "type": "vxlan"
+ },
+ "patch-int" : {
+ "name": "patch-int",
+ "options" : {
+ "peer": "patch-tun"
+ },
+ "interface": "patch-int",
+ "type": "patch"
+ }
+ },
+ "type": "vedge"
+}
+ ] \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_host_verservices.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_host_verservices.py
new file mode 100644
index 0000000..94ee38c
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_host_verservices.py
@@ -0,0 +1,276 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+NETWORK_HOST = {
+ "config": {
+ "interfaces": 4,
+ "log_agent_heartbeats": False,
+ "gateway_external_network_id": "",
+ "router_id": "",
+ "interface_driver": "neutron.agent.linux.interface.OVSInterfaceDriver",
+ "ex_gw_ports": 2,
+ "routers": 2,
+ "handle_internal_only_routers": True,
+ "floating_ips": 1,
+ "external_network_bridge": "",
+ "use_namespaces": True,
+ "agent_mode": "legacy"
+ },
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-6.cisco.com",
+ "host_type": [
+ "Controller",
+ "Network"
+ ],
+ "id": "node-6.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/internal/node-6.cisco.com",
+ "name": "node-6.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/internal/node-6.cisco.com",
+ "object_name": "node-6.cisco.com",
+ "parent_id": "internal",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-scheduler": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:10.000000"
+ },
+ "nova-consoleauth": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:54.000000"
+ },
+ "nova-conductor": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:45.000000"
+ },
+ "nova-cert": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:56.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type" : "host",
+ "zone" : "internal"
+}
+
+COMPUTE_HOST = {
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-5.cisco.com",
+ "host_type": [
+ "Compute"
+ ],
+ "id": "node-5.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/osdna-zone/node-5.cisco.com",
+ "ip_address": "192.168.0.4",
+ "name": "node-5.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/osdna-zone/node-5.cisco.com",
+ "object_name": "node-5.cisco.com",
+ "os_id": "1",
+ "parent_id": "osdna-zone",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-compute": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:42.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type": "host",
+ "zone": "osdna-zone"
+}
+
+NAMESPACES = [
+ 'qdhcp-413de095-01ed-49dc-aa50-4479f43d390e',
+ 'qdhcp-2e3b85f4-756c-49d9-b34c-f3db13212dbc',
+ 'qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe',
+ 'qdhcp-eb276a62-15a9-4616-a192-11466fdd147f',
+ 'qdhcp-7e59b726-d6f4-451a-a574-c67a920ff627',
+ 'qdhcp-a55ff1e8-3821-4e5f-bcfd-07df93720a4f',
+ 'qdhcp-6504fcf7-41d7-40bb-aeb1-6a7658c105fc',
+ 'qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9',
+ 'qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6',
+ 'haproxy',
+ 'vrouter'
+]
+
+LOCAL_SERVICES_IDS = [
+ {
+ "local_service_id": "qdhcp-413de095-01ed-49dc-aa50-4479f43d390e"
+ },
+ {
+ "local_service_id": "qdhcp-2e3b85f4-756c-49d9-b34c-f3db13212dbc"
+ },
+ {
+ "local_service_id": "qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe"
+ },
+ {
+ "local_service_id": "qdhcp-eb276a62-15a9-4616-a192-11466fdd147f"
+ },
+ {
+ "local_service_id": "qdhcp-7e59b726-d6f4-451a-a574-c67a920ff627"
+ },
+ {
+ "local_service_id": "qdhcp-a55ff1e8-3821-4e5f-bcfd-07df93720a4f"
+ },
+ {
+ "local_service_id": "qdhcp-6504fcf7-41d7-40bb-aeb1-6a7658c105fc"
+ },
+ {
+ "local_service_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9"
+ },
+ {
+ "local_service_id": "qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6"
+ }
+]
+
+VSERVICE = {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe",
+ "local_service_id": "qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe",
+ "name": "dhcp-osdna-met4",
+ "service_type": "dhcp"
+ }
+
+AGENT = {
+ "description": "DHCP agent",
+ "folder_text": "DHCP servers",
+ "type": "dhcp"
+}
+
+ROUTER = [
+ {"name": "123456"}
+]
+
+ID_CLEAN = "413de095-01ed-49dc-aa50-4479f43d390e"
+# functional test
+INPUT = "node-6.cisco.com"
+OUTPUT = [
+ {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-413de095-01ed-49dc-aa50-4479f43d390e",
+ "local_service_id": "qdhcp-413de095-01ed-49dc-aa50-4479f43d390e",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "dhcp-aiya",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp"
+ },
+ {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-2e3b85f4-756c-49d9-b34c-f3db13212dbc",
+ "local_service_id": "qdhcp-2e3b85f4-756c-49d9-b34c-f3db13212dbc",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "dhcp-123456",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp"
+ },
+ {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe",
+ "local_service_id": "qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "dhcp-osdna-met4",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp"
+ },
+ {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-eb276a62-15a9-4616-a192-11466fdd147f",
+ "local_service_id": "qdhcp-eb276a62-15a9-4616-a192-11466fdd147f",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "dhcp-osdna-net3",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp"
+ },
+ {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-7e59b726-d6f4-451a-a574-c67a920ff627",
+ "local_service_id": "qdhcp-7e59b726-d6f4-451a-a574-c67a920ff627",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "dhcp-osdna-net1",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp"
+ },
+ {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-a55ff1e8-3821-4e5f-bcfd-07df93720a4f",
+ "local_service_id": "qdhcp-a55ff1e8-3821-4e5f-bcfd-07df93720a4f",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "dhcp-osdna-net2",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp"
+ },
+ {
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-6504fcf7-41d7-40bb-aeb1-6a7658c105fc",
+ "local_service_id": "qdhcp-6504fcf7-41d7-40bb-aeb1-6a7658c105fc",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "dhcp-admin_internal_net",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp"
+ },
+ {
+ "admin_state_up": 1,
+ "enable_snat": 1,
+ "gw_port_id": "63489f34-af99-44f4-81de-9a2eb1c1941f",
+ "host": "node-6.cisco.com",
+ "id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9",
+ "local_service_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "router-osdna-router",
+ "parent_id": "node-6.cisco.com-vservices-routers",
+ "parent_text": "Gateways",
+ "parent_type": "vservice_routers_folder",
+ "service_type": "router",
+ "status": "ACTIVE",
+ "tenant_id": "75c0eb79ff4a42b0ae4973c8375ddf40"
+ },
+ {
+ "admin_state_up": 1,
+ "enable_snat": 1,
+ "gw_port_id": "57e65d34-3d87-4751-8e95-fc78847a3070",
+ "host": "node-6.cisco.com",
+ "id": "qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6",
+ "local_service_id": "qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6",
+ "master_parent_id": "node-6.cisco.com-vservices",
+ "master_parent_type": "vservices_folder",
+ "name": "router-router04",
+ "parent_id": "node-6.cisco.com-vservices-routers",
+ "parent_text": "Gateways",
+ "parent_type": "vservice_routers_folder",
+ "service_type": "router",
+ "status": "ACTIVE",
+ "tenant_id": "8c1751e0ce714736a63fee3c776164da"
+ }
+] \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_instance_vnics.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_instance_vnics.py
new file mode 100644
index 0000000..a43b5c2
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_instance_vnics.py
@@ -0,0 +1,288 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+VNICS_FOLDER = {
+ "create_object": True,
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "id": "bf0cb914-b316-486c-a4ce-f22deb453c52-vnics",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/osdna-zone/node-5.cisco.com/node-5.cisco.com-instances/bf0cb914-b316-486c-a4ce-f22deb453c52/bf0cb914-b316-486c-a4ce-f22deb453c52-vnics",
+ "name": "vNICs",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/osdna-zone/node-5.cisco.com/Instances/test/vNICs",
+ "object_name": "vNICs",
+ "parent_id": "bf0cb914-b316-486c-a4ce-f22deb453c52",
+ "parent_type": "instance",
+ "show_in_tree": True,
+ "text": "vNICs",
+ "type": "vnics_folder"
+}
+
+INSATNCE = {
+ "_id": "5806817e4a0a8a3fbe3bee8b",
+ "children_url": "/osdna_dev/discover.py?type=tree&id=bf0cb914-b316-486c-a4ce-f22deb453c52",
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-5.cisco.com",
+ "id": "bf0cb914-b316-486c-a4ce-f22deb453c52",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/osdna-zone/node-5.cisco.com/node-5.cisco.com-instances/bf0cb914-b316-486c-a4ce-f22deb453c52",
+ "ip_address": "192.168.0.4",
+ "local_name": "instance-00000026",
+ "mac_address": "fa:16:3e:e8:7f:04",
+ "name": "test",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/osdna-zone/node-5.cisco.com/Instances/test",
+ "network": [
+ "2e3b85f4-756c-49d9-b34c-f3db13212dbc"
+ ],
+ "network_info": [
+ {
+ "devname": "tap1f72bd15-8a",
+ "id": "1f72bd15-8ab2-43cb-94d7-e823dd845255",
+ "profile": {
+
+ },
+ "vnic_type": "normal",
+ "type": "ovs",
+ "address": "fa:16:3e:e8:7f:04",
+ "qbg_params": None,
+ "network": {
+ "bridge": "br-int",
+ "label": "123456",
+ "subnets": [
+ {
+ "cidr": "172.16.13.0/24",
+ "version": 4,
+ "gateway": {
+ "version": 4,
+ "meta": {
+
+ },
+ "address": "172.16.13.1",
+ "type": "gateway"
+ },
+ "routes": [
+
+ ],
+ "dns": [
+
+ ],
+ "ips": [
+ {
+ "meta": {
+
+ },
+ "version": 4,
+ "type": "fixed",
+ "address": "172.16.13.4",
+ "floating_ips": [
+
+ ]
+ }
+ ],
+ "meta": {
+ "dhcp_server": "172.16.13.2"
+ }
+ }
+ ],
+ "meta": {
+ "tenant_id": "75c0eb79ff4a42b0ae4973c8375ddf40",
+ "injected": False
+ },
+ "id": "2e3b85f4-756c-49d9-b34c-f3db13212dbc"
+ },
+ "active": True,
+ "meta": {
+
+ },
+ "details": {
+ "port_filter": True,
+ "ovs_hybrid_plug": True
+ },
+ "preserve_on_delete": False,
+ "qbh_params": None,
+ "ovs_interfaceid": "1f72bd15-8ab2-43cb-94d7-e823dd845255"
+ }
+ ],
+ "object_name": "test",
+ "parent_id": "node-5.cisco.com-instances",
+ "parent_type": "instances_folder",
+ "project_id": "75c0eb79ff4a42b0ae4973c8375ddf40",
+ "projects": [
+ "OSDNA-project"
+ ],
+ "show_in_tree": True,
+ "type": "instance",
+ "uuid": "bf0cb914-b316-486c-a4ce-f22deb453c52"
+}
+
+
+COMPUTE_HOST = {
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-5.cisco.com",
+ "host_type": [
+ "Compute"
+ ],
+ "id": "node-5.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/osdna-zone/node-5.cisco.com",
+ "ip_address": "192.168.0.4",
+ "name": "node-5.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/osdna-zone/node-5.cisco.com",
+ "object_name": "node-5.cisco.com",
+ "os_id": "1",
+ "parent_id": "osdna-zone",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-compute": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:42.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type": "host",
+ "zone": "osdna-zone"
+}
+
+NETWORK_HOST = {
+ "config": {
+ "interfaces": 4,
+ "log_agent_heartbeats": False,
+ "gateway_external_network_id": "",
+ "router_id": "",
+ "interface_driver": "neutron.agent.linux.interface.OVSInterfaceDriver",
+ "ex_gw_ports": 2,
+ "routers": 2,
+ "handle_internal_only_routers": True,
+ "floating_ips": 1,
+ "external_network_bridge": "",
+ "use_namespaces": True,
+ "agent_mode": "legacy"
+ },
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-6.cisco.com",
+ "host_type": [
+ "Controller",
+ "Network"
+ ],
+ "id": "node-6.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/internal/node-6.cisco.com",
+ "name": "node-6.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/internal/node-6.cisco.com",
+ "object_name": "node-6.cisco.com",
+ "parent_id": "internal",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-scheduler": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:10.000000"
+ },
+ "nova-consoleauth": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:54.000000"
+ },
+ "nova-conductor": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:45.000000"
+ },
+ "nova-cert": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:56.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type": "host",
+ "zone": "internal"
+}
+
+DUMPXML = "<domain type='qemu' id='38'>\n <name>instance-00000026</name>\n <uuid>bf0cb914-b316-486c-a4ce-f22deb453c52</uuid>\n <metadata>\n <nova:instance xmlns:nova=\"http://openstack.org/xmlns/libvirt/nova/1.0\">\n <nova:package version=\"12.0.0\"/>\n <nova:name>test</nova:name>\n <nova:creationTime>2016-10-17 22:37:43</nova:creationTime>\n <nova:flavor name=\"m1.micro\">\n <nova:memory>64</nova:memory>\n <nova:disk>0</nova:disk>\n <nova:swap>0</nova:swap>\n <nova:ephemeral>0</nova:ephemeral>\n <nova:vcpus>1</nova:vcpus>\n </nova:flavor>\n <nova:owner>\n <nova:user uuid=\"13baa553aae44adca6615e711fd2f6d9\">admin</nova:user>\n <nova:project uuid=\"75c0eb79ff4a42b0ae4973c8375ddf40\">OSDNA-project</nova:project>\n </nova:owner>\n <nova:root type=\"image\" uuid=\"c6f490c4-3656-43c6-8d03-b4e66bd249f9\"/>\n </nova:instance>\n </metadata>\n <memory unit='KiB'>65536</memory>\n <currentMemory unit='KiB'>65536</currentMemory>\n <vcpu placement='static'>1</vcpu>\n <cputune>\n <shares>1024</shares>\n </cputune>\n <sysinfo type='smbios'>\n <system>\n <entry name='manufacturer'>OpenStack Foundation</entry>\n <entry name='product'>OpenStack Nova</entry>\n <entry name='version'>12.0.0</entry>\n <entry name='serial'>9cf57bfd-7477-4671-b2d3-3dfeebfefb1d</entry>\n <entry name='uuid'>bf0cb914-b316-486c-a4ce-f22deb453c52</entry>\n <entry name='family'>Virtual Machine</entry>\n </system>\n </sysinfo>\n <os>\n <type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>\n <boot dev='hd'/>\n <smbios mode='sysinfo'/>\n </os>\n <features>\n <acpi/>\n <apic/>\n </features>\n <cpu>\n <topology sockets='1' cores='1' threads='1'/>\n </cpu>\n <clock offset='utc'/>\n <on_poweroff>destroy</on_poweroff>\n <on_reboot>restart</on_reboot>\n <on_crash>destroy</on_crash>\n <devices>\n <emulator>/usr/bin/qemu-system-x86_64</emulator>\n <disk type='file' device='disk'>\n <driver name='qemu' type='qcow2' cache='directsync'/>\n <source file='/var/lib/nova/instances/bf0cb914-b316-486c-a4ce-f22deb453c52/disk'/>\n <backingStore type='file' index='1'>\n <format type='raw'/>\n <source file='/var/lib/nova/instances/_base/44881e4441fbd821d0d6240f90742fc97e52f83e'/>\n <backingStore/>\n </backingStore>\n <target dev='vda' bus='virtio'/>\n <alias name='virtio-disk0'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>\n </disk>\n <controller type='usb' index='0'>\n <alias name='usb0'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>\n </controller>\n <controller type='pci' index='0' model='pci-root'>\n <alias name='pci.0'/>\n </controller>\n <interface type='bridge'>\n <mac address='fa:16:3e:e8:7f:04'/>\n <source bridge='qbr1f72bd15-8a'/>\n <target dev='tap1f72bd15-8a'/>\n <model type='virtio'/>\n <driver name='qemu'/>\n <alias name='net0'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>\n </interface>\n <serial type='file'>\n <source path='/var/lib/nova/instances/bf0cb914-b316-486c-a4ce-f22deb453c52/console.log'/>\n <target port='0'/>\n <alias name='serial0'/>\n </serial>\n <serial type='pty'>\n <source path='/dev/pts/8'/>\n <target port='1'/>\n <alias name='serial1'/>\n </serial>\n <console type='file'>\n <source path='/var/lib/nova/instances/bf0cb914-b316-486c-a4ce-f22deb453c52/console.log'/>\n <target type='serial' port='0'/>\n <alias name='serial0'/>\n </console>\n <input type='tablet' bus='usb'>\n <alias name='input0'/>\n </input>\n <input type='mouse' bus='ps2'/>\n <input type='keyboard' bus='ps2'/>\n <graphics type='vnc' port='5902' autoport='yes' listen='0.0.0.0' keymap='en-us'>\n <listen type='address' address='0.0.0.0'/>\n </graphics>\n <video>\n <model type='cirrus' vram='9216' heads='1'/>\n <alias name='video0'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>\n </video>\n <memballoon model='virtio'>\n <alias name='balloon0'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>\n <stats period='10'/>\n </memballoon>\n </devices>\n <seclabel type='dynamic' model='apparmor' relabel='yes'>\n <label>libvirt-bf0cb914-b316-486c-a4ce-f22deb453c52</label>\n <imagelabel>libvirt-bf0cb914-b316-486c-a4ce-f22deb453c52</imagelabel>\n </seclabel>\n</domain>\n\n"
+WRONG_DUMPXML = "<domain type='qemu' id='38'><uuid>wrong_instance</uuid></domain>"
+INSTANCES_LIST = [
+ ' Id Name State',
+ '----------------------------------------------------',
+ ' 2 instance-00000002 running',
+ ' 27 instance-0000001c running',
+ ' 38 instance-00000026 running',
+ ' 39 instance-00000028 running',
+ ''
+]
+
+VNIC = {
+ "@type": "bridge",
+ "address": {
+ "@bus": "0x00",
+ "@domain": "0x0000",
+ "@function": "0x0",
+ "@slot": "0x03",
+ "@type": "pci"
+ },
+ "alias": {
+ "@name": "net0"
+ },
+ "driver": {
+ "@name": "qemu"
+ },
+ "mac": {
+ "@address": "fa:16:3e:e8:7f:04"
+ },
+ "model": {
+ "@type": "virtio"
+ },
+ "source": {
+ "@bridge": "qbr1f72bd15-8a"
+ },
+ "target": {
+ "@dev": "tap1f72bd15-8a"
+ }
+}
+
+ID = "38"
+
+VNICS_FROM_DUMP_XML = [
+ {
+ "@type": "bridge",
+ "address": {
+ "@bus": "0x00",
+ "@domain": "0x0000",
+ "@function": "0x0",
+ "@slot": "0x03",
+ "@type": "pci"
+ },
+ "alias": {
+ "@name": "net0"
+ },
+ "driver": {
+ "@name": "qemu"
+ },
+ "host": "node-5.cisco.com",
+ "id": "tap1f72bd15-8a",
+ "instance_db_id": "5806817e4a0a8a3fbe3bee8b",
+ "instance_id": "bf0cb914-b316-486c-a4ce-f22deb453c52",
+ "mac": {
+ "@address": "fa:16:3e:e8:7f:04"
+ },
+ "mac_address": "fa:16:3e:e8:7f:04",
+ "model": {
+ "@type": "virtio"
+ },
+ "name": "tap1f72bd15-8a",
+ "source": {
+ "@bridge": "qbr1f72bd15-8a"
+ },
+ "source_bridge": "qbr1f72bd15-8a",
+ "target": {
+ "@dev": "tap1f72bd15-8a"
+ },
+ "vnic_type": "instance_vnic"
+ }
+]
+
+
+# functional test
+INPUT = "bf0cb914-b316-486c-a4ce-f22deb453c52-vnics" \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors.py
new file mode 100644
index 0000000..f51e510
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors.py
@@ -0,0 +1,103 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+HOST = {
+ "config" : {
+ "metadata_proxy_socket" : "/opt/stack/data/neutron/metadata_proxy",
+ "nova_metadata_ip" : "192.168.20.14",
+ "log_agent_heartbeats" : False
+ },
+ "environment" : "Devstack-VPP-2",
+ "host" : "ubuntu0",
+ "host_type" : [
+ "Controller",
+ "Compute",
+ "Network"
+ ],
+ "id" : "ubuntu0",
+ "id_path" : "/Devstack-VPP-2/Devstack-VPP-2-regions/RegionOne/RegionOne-availability_zones/nova/ubuntu0",
+ "ip_address" : "192.168.20.14",
+ "name" : "ubuntu0",
+ "name_path" : "/Devstack-VPP-2/Regions/RegionOne/Availability Zones/nova/ubuntu0",
+ "object_name" : "ubuntu0",
+ "os_id" : "1",
+ "parent_id" : "nova",
+ "parent_type" : "availability_zone",
+ "services" : {
+ "nova-conductor" : {
+ "available" : True,
+ "active" : True,
+ "updated_at" : "2016-08-30T09:18:58.000000"
+ },
+ "nova-scheduler" : {
+ "available" : True,
+ "active" : True,
+ "updated_at" : "2016-08-30T09:18:54.000000"
+ },
+ "nova-consoleauth" : {
+ "available" : True,
+ "active" : True,
+ "updated_at" : "2016-08-30T09:18:54.000000"
+ }
+ },
+ "show_in_tree" : True,
+ "type" : "host",
+ "zone" : "nova"
+}
+
+WRONG_HOST = {
+ "show_in_tree" : True,
+ "type" : "host",
+ "zone" : "nova"
+}
+
+VCONNECTORS_FOLDER = {
+ "create_object" : True,
+ "environment" : "Mirantis-Liberty-Xiaocong",
+ "id" : "node-6.cisco.com-vconnectors",
+ "id_path" : "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/internal/node-6.cisco.com/node-6.cisco.com-vconnectors",
+ "name" : "vConnectors",
+ "name_path" : "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/internal/node-6.cisco.com/vConnectors",
+ "object_name" : "vConnectors",
+ "parent_id" : "node-6.cisco.com",
+ "parent_type" : "host",
+ "show_in_tree" : True,
+ "text" : "vConnectors",
+ "type" : "vconnectors_folder"
+}
+
+VCONNECTORS = [
+ {
+ "bd_id": "5678",
+ "host": "ubuntu0",
+ "id": "ubuntu0-vconnector-5678",
+ "interfaces": {
+ "name": {
+ "hardware": "VirtualEthernet0/0/8",
+ "id": "15",
+ "mac_address": "fa:16:3e:d1:98:73",
+ "name": "VirtualEthernet0/0/8",
+ "state": "up"
+ }
+ },
+ "interfaces_names": [
+ "TenGigabitEthernetc/0/0",
+ "VirtualEthernet0/0/0",
+ "VirtualEthernet0/0/1",
+ "VirtualEthernet0/0/2",
+ "VirtualEthernet0/0/3",
+ "VirtualEthernet0/0/4",
+ "VirtualEthernet0/0/5",
+ "VirtualEthernet0/0/6",
+ "VirtualEthernet0/0/7",
+ "VirtualEthernet0/0/8"
+ ],
+ "name": "bridge-domain-5678"
+ }
+] \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_ovs.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_ovs.py
new file mode 100644
index 0000000..9161457
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_ovs.py
@@ -0,0 +1,234 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+NETWORK_NODE = {
+ "config": {
+ "interfaces": 4,
+ "log_agent_heartbeats": False,
+ "gateway_external_network_id": "",
+ "router_id": "",
+ "interface_driver": "neutron.agent.linux.interface.OVSInterfaceDriver",
+ "ex_gw_ports": 2,
+ "routers": 2,
+ "handle_internal_only_routers": True,
+ "floating_ips": 1,
+ "external_network_bridge": "",
+ "use_namespaces": True,
+ "agent_mode": "legacy"
+ },
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-6.cisco.com",
+ "host_type": [
+ "Controller",
+ "Network"
+ ],
+ "id": "node-6.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/internal/node-6.cisco.com",
+ "name": "node-6.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/internal/node-6.cisco.com",
+ "object_name": "node-6.cisco.com",
+ "parent_id": "internal",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-scheduler": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:10.000000"
+ },
+ "nova-consoleauth": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:54.000000"
+ },
+ "nova-conductor": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:45.000000"
+ },
+ "nova-cert": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:56.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type": "host",
+ "zone": "internal"
+}
+
+BRIDGE_RESULT = [
+ "bridge name\tbridge id\t\tSTP enabled\tinterfaces",
+ "br-ex\t\t8000.005056acc9a2\tno\t\teno33554952",
+ "\t\t\t\t\t\t\tp_ff798dba-0",
+ "\t\t\t\t\t\t\tv_public",
+ "\t\t\t\t\t\t\tv_vrouter_pub",
+ "br-fw-admin\t\t8000.005056ace897\tno\t\teno16777728",
+ "br-mesh\t\t8000.005056acc9a2\tno\t\teno33554952.103",
+ "br-mgmt\t\t8000.005056ace897\tno\t\teno16777728.101",
+ "\t\t\t\t\t\t\tmgmt-conntrd",
+ "\t\t\t\t\t\t\tv_management",
+ "\t\t\t\t\t\t\tv_vrouter",
+ "br-storage\t\t8000.005056ace897\tno\t\teno16777728.102"
+]
+
+FIXED_LINES = [
+ "br-ex\t\t8000.005056acc9a2\tno\t\teno33554952,p_ff798dba-0,v_public,v_vrouter_pub",
+ "br-fw-admin\t\t8000.005056ace897\tno\t\teno16777728",
+ "br-mesh\t\t8000.005056acc9a2\tno\t\teno33554952.103",
+ "br-mgmt\t\t8000.005056ace897\tno\t\teno16777728.101,mgmt-conntrd,v_management,v_vrouter",
+ "br-storage\t\t8000.005056ace897\tno\t\teno16777728.102"
+]
+
+PARSE_CM_RESULTS = [
+ {
+ "bridge_id": "8000.005056acc9a2",
+ "bridge_name": "br-ex",
+ "interfaces": "eno33554952,p_ff798dba-0,v_public,v_vrouter_pub",
+ "stp_enabled": "no"
+ },
+ {
+ "bridge_id": "8000.005056ace897",
+ "bridge_name": "br-fw-admin",
+ "interfaces": "eno16777728",
+ "stp_enabled": "no"
+ },
+ {
+ "bridge_id": "8000.005056acc9a2",
+ "bridge_name": "br-mesh",
+ "interfaces": "eno33554952.103",
+ "stp_enabled": "no"
+ },
+ {
+ "bridge_id": "8000.005056ace897",
+ "bridge_name": "br-mgmt",
+ "interfaces": "eno16777728.101,mgmt-conntrd,v_management,v_vrouter",
+ "stp_enabled": "no"
+ },
+ {
+ "bridge_id": "8000.005056ace897",
+ "bridge_name": "br-storage",
+ "interfaces": "eno16777728.102",
+ "stp_enabled": "no"
+ }
+]
+
+# functional test
+INPUT = "node-6.cisco.com"
+OUPUT = [
+ {
+ "connector_type": "bridge",
+ "host": "node-6.cisco.com",
+ "id": "8000.005056acc9a2",
+ "interfaces": {
+ "eno33554952": {
+ "mac_address": "",
+ "name": "eno33554952"
+ },
+ "p_ff798dba-0": {
+ "mac_address": "",
+ "name": "p_ff798dba-0"
+ },
+ "v_public": {
+ "mac_address": "",
+ "name": "v_public"
+ },
+ "v_vrouter_pub": {
+ "mac_address": "",
+ "name": "v_vrouter_pub"
+ }
+ },
+ "interfaces_names": [
+ "p_ff798dba-0",
+ "v_public",
+ "v_vrouter_pub",
+ "eno33554952"
+ ],
+ "name": "br-ex",
+ "stp_enabled": "no"
+ },
+ {
+ "connector_type": "bridge",
+ "host": "node-6.cisco.com",
+ "id": "8000.005056ace897",
+ "interfaces": {
+ "eno16777728": {
+ "mac_address": "",
+ "name": "eno16777728"
+ }
+ },
+ "interfaces_names": [
+ "eno16777728"
+ ],
+ "name": "br-fw-admin",
+ "stp_enabled": "no"
+ },
+ {
+ "connector_type": "bridge",
+ "host": "node-6.cisco.com",
+ "id": "8000.005056acc9a2",
+ "interfaces": {
+ "eno33554952.103": {
+ "mac_address": "",
+ "name": "eno33554952.103"
+ }
+ },
+ "interfaces_names": [
+ "eno33554952.103"
+ ],
+ "name": "br-mesh",
+ "stp_enabled": "no"
+ },
+ {
+ "connector_type": "bridge",
+ "host": "node-6.cisco.com",
+ "id": "8000.005056ace897",
+ "interfaces": {
+ "eno16777728.101": {
+ "mac_address": "",
+ "name": "eno16777728.101"
+ },
+ "mgmt-conntrd": {
+ "mac_address": "",
+ "name": "mgmt-conntrd"
+ },
+ "v_management": {
+ "mac_address": "",
+ "name": "v_management"
+ },
+ "v_vrouter": {
+ "mac_address": "",
+ "name": "v_vrouter"
+ }
+ },
+ "interfaces_names": [
+ "v_management",
+ "mgmt-conntrd",
+ "v_vrouter",
+ "eno16777728.101"
+ ],
+ "name": "br-mgmt",
+ "stp_enabled": "no"
+ },
+ {
+ "connector_type": "bridge",
+ "host": "node-6.cisco.com",
+ "id": "8000.005056ace897",
+ "interfaces": {
+ "eno16777728.102": {
+ "mac_address": "",
+ "name": "eno16777728.102"
+ }
+ },
+ "interfaces_names": [
+ "eno16777728.102"
+ ],
+ "name": "br-storage",
+ "stp_enabled": "no"
+ }
+] \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_vpp.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_vpp.py
new file mode 100644
index 0000000..2c78b6a
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_vconnectors_vpp.py
@@ -0,0 +1,137 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+HOST = {
+ "config" : {
+ "metadata_proxy_socket" : "/opt/stack/data/neutron/metadata_proxy",
+ "nova_metadata_ip" : "192.168.20.14",
+ "log_agent_heartbeats" : False
+ },
+ "environment" : "Devstack-VPP-2",
+ "host" : "ubuntu0",
+ "host_type" : [
+ "Controller",
+ "Compute",
+ "Network"
+ ],
+ "id" : "ubuntu0",
+ "id_path" : "/Devstack-VPP-2/Devstack-VPP-2-regions/RegionOne/RegionOne-availability_zones/nova/ubuntu0",
+ "ip_address" : "192.168.20.14",
+ "name" : "ubuntu0",
+ "name_path" : "/Devstack-VPP-2/Regions/RegionOne/Availability Zones/nova/ubuntu0",
+ "object_name" : "ubuntu0",
+ "os_id" : "1",
+ "parent_id" : "nova",
+ "parent_type" : "availability_zone",
+ "services" : {
+ "nova-conductor" : {
+ "available" : True,
+ "active" : True,
+ "updated_at" : "2016-08-30T09:18:58.000000"
+ },
+ "nova-scheduler" : {
+ "available" : True,
+ "active" : True,
+ "updated_at" : "2016-08-30T09:18:54.000000"
+ },
+ "nova-consoleauth" : {
+ "available" : True,
+ "active" : True,
+ "updated_at" : "2016-08-30T09:18:54.000000"
+ }
+ },
+ "show_in_tree" : True,
+ "type" : "host",
+ "zone" : "nova"
+}
+
+MODE_RESULT = [
+ "l3 local0 ",
+ "l3 pg/stream-0 ",
+ "l3 pg/stream-1 ",
+ "l3 pg/stream-2 ",
+ "l3 pg/stream-3 ",
+ "l2 bridge TenGigabitEthernetc/0/0 bd_id 5678 shg 0",
+ "l3 TenGigabitEthernetd/0/0 ",
+ "l2 bridge VirtualEthernet0/0/0 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/1 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/2 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/3 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/4 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/5 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/6 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/7 bd_id 5678 shg 0",
+ "l2 bridge VirtualEthernet0/0/8 bd_id 5678 shg 0"
+]
+
+INTERFACE_LINES = [
+ " Name Idx Link Hardware",
+ "TenGigabitEthernetc/0/0 5 up TenGigabitEthernetc/0/0",
+ " Ethernet address 00:25:b5:99:00:5c",
+ " Cisco VIC",
+ " carrier up full duplex speed 40000 mtu 1500 promisc",
+ " rx queues 1, rx desc 5120, tx queues 1, tx desc 2048",
+ " cpu socket 0",
+ "",
+ " tx frames ok 81404",
+ " tx bytes ok 6711404",
+ " rx frames ok 502521",
+ " rx bytes ok 668002732",
+ " rx missed 64495",
+ " extended stats:",
+ " rx good packets 502521",
+ " tx good packets 81404",
+ " rx good bytes 668002732",
+ " tx good bytes 6711404"
+]
+
+INTERFACE_NAME = "TenGigabitEthernetc/0/0"
+
+GET_INTERFACE_DETAIL = {
+ "hardware": "TenGigabitEthernetc/0/0",
+ "id": "5",
+ "mac_address": "00:25:b5:99:00:5c",
+ "name": "TenGigabitEthernetc/0/0",
+ "state": "up"
+}
+
+# functional test
+# environment: Devstack-VPP-2
+# inventory name: vpp
+
+INPUT = "ubuntu0"
+OUPUT = [
+ {
+ "bd_id": "5678",
+ "host": "ubuntu0",
+ "id": "ubuntu0-vconnector-5678",
+ "interfaces": {
+ "name": {
+ "hardware": "VirtualEthernet0/0/8",
+ "id": "15",
+ "mac_address": "fa:16:3e:d1:98:73",
+ "name": "VirtualEthernet0/0/8",
+ "state": "up"
+ }
+ },
+ "interfaces_names": [
+ "TenGigabitEthernetc/0/0",
+ "VirtualEthernet0/0/0",
+ "VirtualEthernet0/0/1",
+ "VirtualEthernet0/0/2",
+ "VirtualEthernet0/0/3",
+ "VirtualEthernet0/0/4",
+ "VirtualEthernet0/0/5",
+ "VirtualEthernet0/0/6",
+ "VirtualEthernet0/0/7",
+ "VirtualEthernet0/0/8"
+ ],
+ "name": "bridge-domain-5678"
+ }
+] \ No newline at end of file
diff --git a/app/test/fetch/cli_fetch/test_data/cli_fetch_vservice_vnics.py b/app/test/fetch/cli_fetch/test_data/cli_fetch_vservice_vnics.py
new file mode 100644
index 0000000..0b60af5
--- /dev/null
+++ b/app/test/fetch/cli_fetch/test_data/cli_fetch_vservice_vnics.py
@@ -0,0 +1,616 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) #
+# and others #
+# #
+# All rights reserved. This program and the accompanying materials #
+# are made available under the terms of the Apache License, Version 2.0 #
+# which accompanies this distribution, and is available at #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+###############################################################################
+NETWORK_NODE = {
+ "config": {
+ "interfaces": 4,
+ "log_agent_heartbeats": False,
+ "gateway_external_network_id": "",
+ "router_id": "",
+ "interface_driver": "neutron.agent.linux.interface.OVSInterfaceDriver",
+ "ex_gw_ports": 2,
+ "routers": 2,
+ "handle_internal_only_routers": True,
+ "floating_ips": 1,
+ "external_network_bridge": "",
+ "use_namespaces": True,
+ "agent_mode": "legacy"
+ },
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-6.cisco.com",
+ "host_type": [
+ "Controller",
+ "Network"
+ ],
+ "id": "node-6.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/internal/node-6.cisco.com",
+ "name": "node-6.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/internal/node-6.cisco.com",
+ "object_name": "node-6.cisco.com",
+ "parent_id": "internal",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-scheduler": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:10.000000"
+ },
+ "nova-consoleauth": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:54.000000"
+ },
+ "nova-conductor": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:45.000000"
+ },
+ "nova-cert": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:56.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type": "host",
+ "zone": "internal"
+}
+
+COMPUTE_NODE = {
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-5.cisco.com",
+ "host_type": [
+ "Compute"
+ ],
+ "id": "node-5.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/osdna-zone/node-5.cisco.com",
+ "ip_address": "192.168.0.4",
+ "name": "node-5.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/osdna-zone/node-5.cisco.com",
+ "object_name": "node-5.cisco.com",
+ "os_id": "1",
+ "parent_id": "osdna-zone",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-compute": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:42.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type": "host",
+ "zone": "osdna-zone"
+}
+
+ERROR_NODE = {
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-5.cisco.com",
+ "id": "node-5.cisco.com",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/osdna-zone/node-5.cisco.com",
+ "ip_address": "192.168.0.4",
+ "name": "node-5.cisco.com",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/osdna-zone/node-5.cisco.com",
+ "object_name": "node-5.cisco.com",
+ "os_id": "1",
+ "parent_id": "osdna-zone",
+ "parent_type": "availability_zone",
+ "services": {
+ "nova-compute": {
+ "active": True,
+ "available": True,
+ "updated_at": "2016-10-21T18:01:42.000000"
+ }
+ },
+ "show_in_tree": True,
+ "type": "host",
+ "zone": "osdna-zone"
+}
+
+NAME_SPACES = [
+ 'qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17',
+ 'qdhcp-0abe6331-0d74-4bbd-ad89-a5719c3793e4',
+ 'qdhcp-413de095-01ed-49dc-aa50-4479f43d390e',
+ 'qdhcp-2e3b85f4-756c-49d9-b34c-f3db13212dbc',
+ 'qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe',
+ 'qdhcp-eb276a62-15a9-4616-a192-11466fdd147f',
+ 'qdhcp-7e59b726-d6f4-451a-a574-c67a920ff627',
+ 'qdhcp-a55ff1e8-3821-4e5f-bcfd-07df93720a4f',
+ 'qdhcp-6504fcf7-41d7-40bb-aeb1-6a7658c105fc',
+ 'qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9',
+ 'qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6',
+ 'haproxy',
+ 'vrouter'
+]
+
+SERVICE_ID = 'qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17'
+
+SERVICES = [
+ {
+ "IP Address": "172.16.13.2",
+ "IPv6 Address": "fe80::f816:3eff:fea1:eb73/64",
+ "cidr": "172.16.13.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:a1:eb:73\ninet addr:172.16.13.2 Bcast:172.16.13.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fea1:eb73/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:28 errors:0 dropped:35 overruns:0 frame:0\nTX packets:8 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:4485 (4.4 KB) TX bytes:648 (648.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "tapa68b2627-a1",
+ "mac_address": "fa:16:3e:a1:eb:73",
+ "master_parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "master_parent_type": "vservice",
+ "name": "tapa68b2627-a1",
+ "netmask": "255.255.255.0",
+ "network": "8673c48a-f137-4497-b25d-08b7b218fd17",
+ "parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ }
+]
+
+NET_MASK_ARRAY = ["255", "255", "255", "0"]
+SIZE = '24'
+
+VNIC = {
+ "IP Address": "172.16.13.2",
+ "IPv6 Address": "fe80::f816:3eff:fea1:eb73/64",
+ "host": "node-6.cisco.com",
+ "id": "tapa68b2627-a1",
+ "lines": [
+ "Link encap:Ethernet HWaddr fa:16:3e:a1:eb:73",
+ "inet addr:172.16.13.2 Bcast:172.16.13.255 Mask:255.255.255.0",
+ "inet6 addr: fe80::f816:3eff:fea1:eb73/64 Scope:Link",
+ "UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1",
+ "RX packets:28 errors:0 dropped:35 overruns:0 frame:0",
+ "TX packets:8 errors:0 dropped:0 overruns:0 carrier:0",
+ "collisions:0 txqueuelen:0",
+ "RX bytes:4485 (4.4 KB) TX bytes:648 (648.0 B)",
+ ""
+ ],
+ "mac_address": "fa:16:3e:a1:eb:73",
+ "master_parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "master_parent_type": "vservice",
+ "name": "tapa68b2627-a1",
+ "netmask": "255.255.255.0",
+ "parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+}
+
+RAW_VNIC = {
+ "host": "node-6.cisco.com",
+ "id": "tapa68b2627-a1",
+ "lines": [],
+ "master_parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "master_parent_type": "vservice",
+ "name": "tapa68b2627-a1",
+ "parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+}
+
+NETWORK = [{
+ "admin_state_up": True,
+ "cidrs": [
+ "172.16.13.0/24"
+ ],
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "id": "8673c48a-f137-4497-b25d-08b7b218fd17",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-projects/75c0eb79ff4a42b0ae4973c8375ddf40/75c0eb79ff4a42b0ae4973c8375ddf40-networks/8673c48a-f137-4497-b25d-08b7b218fd17",
+ "mtu": 1400,
+ "name": "25",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Projects/OSDNA-project/Networks/25",
+ "network": "8673c48a-f137-4497-b25d-08b7b218fd17",
+ "object_name": "25",
+ "parent_id": "75c0eb79ff4a42b0ae4973c8375ddf40-networks",
+ "parent_text": "Networks",
+ "parent_type": "networks_folder",
+ "port_security_enabled": True,
+ "project": "OSDNA-project",
+ "provider:network_type": "vxlan",
+ "provider:physical_network": None,
+ "provider:segmentation_id": 52,
+ "router:external": False,
+ "shared": False,
+ "show_in_tree": True,
+ "status": "ACTIVE",
+ "subnets": {
+ "123e": {
+ "ip_version": 4,
+ "enable_dhcp": True,
+ "gateway_ip": "172.16.13.1",
+ "id": "fcfa62ec-5ae7-46ce-9259-5f30de7af858",
+ "ipv6_ra_mode": None,
+ "name": "123e",
+ "dns_nameservers": [
+
+ ],
+ "cidr" : "172.16.13.0/24",
+ "subnetpool_id": None,
+ "ipv6_address_mode": None,
+ "tenant_id": "75c0eb79ff4a42b0ae4973c8375ddf40",
+ "network_id": "8673c48a-f137-4497-b25d-08b7b218fd17",
+ "host_routes": [
+
+ ],
+ "allocation_pools": [
+ {
+ "start": "172.16.13.2",
+ "end": "172.16.13.254"
+ }
+ ]
+ }
+ },
+ "tenant_id": "75c0eb79ff4a42b0ae4973c8375ddf40",
+ "type": "network"
+}]
+
+VSERVICE = {
+ "children_url": "/osdna_dev/discover.py?type=tree&id=qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "environment": "Mirantis-Liberty-Xiaocong",
+ "host": "node-6.cisco.com",
+ "id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "id_path": "/Mirantis-Liberty-Xiaocong/Mirantis-Liberty-Xiaocong-regions/RegionOne/RegionOne-availability_zones/internal/node-6.cisco.com/node-6.cisco.com-vservices/node-6.cisco.com-vservices-dhcps/qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "local_service_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "name": "dhcp-25",
+ "name_path": "/Mirantis-Liberty-Xiaocong/Regions/RegionOne/Availability Zones/internal/node-6.cisco.com/Vservices/DHCP servers/dhcp-25",
+ "network": [
+ "8673c48a-f137-4497-b25d-08b7b218fd17"
+ ],
+ "object_name": "dhcp-25",
+ "parent_id": "node-6.cisco.com-vservices-dhcps",
+ "parent_text": "DHCP servers",
+ "parent_type": "vservice_dhcps_folder",
+ "service_type": "dhcp",
+ "show_in_tree": True,
+ "type": "vservice"
+}
+
+
+CIDR = "172.16.13.0/24"
+
+IFCONFIG_RESULT = [
+ "lo Link encap:Local Loopback ",
+ " inet addr:127.0.0.1 Mask:255.0.0.0",
+ " inet6 addr: ::1/128 Scope:Host",
+ " UP LOOPBACK RUNNING MTU:65536 Metric:1",
+ " RX packets:0 errors:0 dropped:0 overruns:0 frame:0",
+ " TX packets:0 errors:0 dropped:0 overruns:0 carrier:0",
+ " collisions:0 txqueuelen:0 ",
+ " RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)",
+ "",
+ "tapa68b2627-a1 Link encap:Ethernet HWaddr fa:16:3e:a1:eb:73 ",
+ " inet addr:172.16.13.2 Bcast:172.16.13.255 Mask:255.255.255.0",
+ " inet6 addr: fe80::f816:3eff:fea1:eb73/64 Scope:Link",
+ " UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1",
+ " RX packets:28 errors:0 dropped:35 overruns:0 frame:0",
+ " TX packets:8 errors:0 dropped:0 overruns:0 carrier:0",
+ " collisions:0 txqueuelen:0 ",
+ " RX bytes:4485 (4.4 KB) TX bytes:648 (648.0 B)",
+ ""
+]
+
+MAC_ADDRESS_LINE = "tapa68b2627-a1 Link encap:Ethernet HWaddr 00:50:56:ac:e8:97 "
+MAC_ADDRESS = "00:50:56:ac:e8:97"
+IPV6_ADDRESS_LINE = " inet6 addr: fe80::f816:3eff:fea1:eb73/64 Scope:Link"
+IPV6_ADDRESS = "fe80::f816:3eff:fea1:eb73/64"
+IPV4_ADDRESS_LINE = " inet addr:172.16.13.2 Bcast:172.16.13.255 Mask:255.255.255.0"
+IPV4_ADDRESS = "172.16.13.2"
+
+# functional test
+INPUT = "node-6.cisco.com"
+OUTPUT = [
+ {
+ "IP Address": "172.16.13.2",
+ "IPv6 Address": "fe80::f816:3eff:fea1:eb73/64",
+ "cidr": "172.16.13.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:a1:eb:73\ninet addr:172.16.13.2 Bcast:172.16.13.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fea1:eb73/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:28 errors:0 dropped:35 overruns:0 frame:0\nTX packets:8 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:4485 (4.4 KB) TX bytes:648 (648.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "tapa68b2627-a1",
+ "mac_address": "fa:16:3e:a1:eb:73",
+ "master_parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17",
+ "master_parent_type": "vservice",
+ "name": "tapa68b2627-a1",
+ "netmask": "255.255.255.0",
+ "network": "8673c48a-f137-4497-b25d-08b7b218fd17",
+ "parent_id": "qdhcp-8673c48a-f137-4497-b25d-08b7b218fd17-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.12.2",
+ "IPv6 Address": "fe80::f816:3eff:fec1:7f19/64",
+ "cidr": "172.16.12.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:c1:7f:19\ninet addr:172.16.12.2 Bcast:172.16.12.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fec1:7f19/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:6 errors:0 dropped:8 overruns:0 frame:0\nTX packets:8 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:360 (360.0 B) TX bytes:648 (648.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "tape67d81de-48",
+ "mac_address": "fa:16:3e:c1:7f:19",
+ "master_parent_id": "qdhcp-0abe6331-0d74-4bbd-ad89-a5719c3793e4",
+ "master_parent_type": "vservice",
+ "name": "tape67d81de-48",
+ "netmask": "255.255.255.0",
+ "network": "0abe6331-0d74-4bbd-ad89-a5719c3793e4",
+ "parent_id": "qdhcp-0abe6331-0d74-4bbd-ad89-a5719c3793e4-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.10.2",
+ "IPv6 Address": "fe80::f816:3eff:fe23:1b94/64",
+ "cidr": "172.16.10.0/25",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:23:1b:94\ninet addr:172.16.10.2 Bcast:172.16.10.127 Mask:255.255.255.128\ninet6 addr: fe80::f816:3eff:fe23:1b94/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:51 errors:0 dropped:12 overruns:0 frame:0\nTX packets:8 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:9161 (9.1 KB) TX bytes:648 (648.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "tapa1bf631f-de",
+ "mac_address": "fa:16:3e:23:1b:94",
+ "master_parent_id": "qdhcp-413de095-01ed-49dc-aa50-4479f43d390e",
+ "master_parent_type": "vservice",
+ "name": "tapa1bf631f-de",
+ "netmask": "255.255.255.128",
+ "network": "413de095-01ed-49dc-aa50-4479f43d390e",
+ "parent_id": "qdhcp-413de095-01ed-49dc-aa50-4479f43d390e-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.13.2",
+ "IPv6 Address": "fe80::f816:3eff:fec3:c871/64",
+ "cidr": "172.16.13.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:c3:c8:71\ninet addr:172.16.13.2 Bcast:172.16.13.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fec3:c871/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:4614 errors:0 dropped:4 overruns:0 frame:0\nTX packets:4459 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:823296 (823.2 KB) TX bytes:929712 (929.7 KB)\n",
+ "host": "node-6.cisco.com",
+ "id": "tapaf69959f-ef",
+ "mac_address": "fa:16:3e:c3:c8:71",
+ "master_parent_id": "qdhcp-2e3b85f4-756c-49d9-b34c-f3db13212dbc",
+ "master_parent_type": "vservice",
+ "name": "tapaf69959f-ef",
+ "netmask": "255.255.255.0",
+ "network": "8673c48a-f137-4497-b25d-08b7b218fd17",
+ "parent_id": "qdhcp-2e3b85f4-756c-49d9-b34c-f3db13212dbc-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.4.2",
+ "IPv6 Address": "fe80::f816:3eff:fed7:c516/64",
+ "cidr": "172.16.4.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:d7:c5:16\ninet addr:172.16.4.2 Bcast:172.16.4.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fed7:c516/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:56928 errors:0 dropped:15 overruns:0 frame:0\nTX packets:56675 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:10526014 (10.5 MB) TX bytes:12041070 (12.0 MB)\n",
+ "host": "node-6.cisco.com",
+ "id": "tap16620a58-c4",
+ "mac_address": "fa:16:3e:d7:c5:16",
+ "master_parent_id": "qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe",
+ "master_parent_type": "vservice",
+ "name": "tap16620a58-c4",
+ "netmask": "255.255.255.0",
+ "network": "b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe",
+ "parent_id": "qdhcp-b6fd5175-4b22-4256-9b1a-9fc4b9dce1fe-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.2.2",
+ "IPv6 Address": "fe80::f816:3eff:feeb:39c2/64",
+ "cidr": "172.16.2.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:eb:39:c2\ninet addr:172.16.2.2 Bcast:172.16.2.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:feeb:39c2/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:93317 errors:0 dropped:57 overruns:0 frame:0\nTX packets:93264 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:17406098 (17.4 MB) TX bytes:19958079 (19.9 MB)\n",
+ "host": "node-6.cisco.com",
+ "id": "tap82d4992f-4d",
+ "mac_address": "fa:16:3e:eb:39:c2",
+ "master_parent_id": "qdhcp-eb276a62-15a9-4616-a192-11466fdd147f",
+ "master_parent_type": "vservice",
+ "name": "tap82d4992f-4d",
+ "netmask": "255.255.255.0",
+ "network": "eb276a62-15a9-4616-a192-11466fdd147f",
+ "parent_id": "qdhcp-eb276a62-15a9-4616-a192-11466fdd147f-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.3.2",
+ "IPv6 Address": "fe80::f816:3eff:fe1c:9936/64",
+ "cidr": "172.16.3.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:1c:99:36\ninet addr:172.16.3.2 Bcast:172.16.3.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fe1c:9936/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:170894 errors:0 dropped:41 overruns:0 frame:0\nTX packets:170588 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:31784458 (31.7 MB) TX bytes:36444046 (36.4 MB)\n",
+ "host": "node-6.cisco.com",
+ "id": "tap5f22f397-d8",
+ "mac_address": "fa:16:3e:1c:99:36",
+ "master_parent_id": "qdhcp-7e59b726-d6f4-451a-a574-c67a920ff627",
+ "master_parent_type": "vservice",
+ "name": "tap5f22f397-d8",
+ "netmask": "255.255.255.0",
+ "network": "7e59b726-d6f4-451a-a574-c67a920ff627",
+ "parent_id": "qdhcp-7e59b726-d6f4-451a-a574-c67a920ff627-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.1.2",
+ "IPv6 Address": "fe80::f816:3eff:fe59:5fff/64",
+ "cidr": "172.16.1.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:59:5f:ff\ninet addr:172.16.1.2 Bcast:172.16.1.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fe59:5fff/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:93468 errors:0 dropped:38 overruns:0 frame:0\nTX packets:93452 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:17416578 (17.4 MB) TX bytes:19972565 (19.9 MB)\n",
+ "host": "node-6.cisco.com",
+ "id": "tapbf16c3ab-56",
+ "mac_address": "fa:16:3e:59:5f:ff",
+ "master_parent_id": "qdhcp-a55ff1e8-3821-4e5f-bcfd-07df93720a4f",
+ "master_parent_type": "vservice",
+ "name": "tapbf16c3ab-56",
+ "netmask": "255.255.255.0",
+ "network": "a55ff1e8-3821-4e5f-bcfd-07df93720a4f",
+ "parent_id": "qdhcp-a55ff1e8-3821-4e5f-bcfd-07df93720a4f-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "192.168.111.2",
+ "IPv6 Address": "fe80::f816:3eff:fe74:5/64",
+ "cidr": "192.168.111.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:74:00:05\ninet addr:192.168.111.2 Bcast:192.168.111.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fe74:5/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:45 errors:0 dropped:28 overruns:0 frame:0\nTX packets:8 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:3734 (3.7 KB) TX bytes:648 (648.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "tapee8e5dbb-03",
+ "mac_address": "fa:16:3e:74:00:05",
+ "master_parent_id": "qdhcp-6504fcf7-41d7-40bb-aeb1-6a7658c105fc",
+ "master_parent_type": "vservice",
+ "name": "tapee8e5dbb-03",
+ "netmask": "255.255.255.0",
+ "network": "6504fcf7-41d7-40bb-aeb1-6a7658c105fc",
+ "parent_id": "qdhcp-6504fcf7-41d7-40bb-aeb1-6a7658c105fc-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.0.131",
+ "IPv6 Address": "2001:420:4482:24c1:f816:3eff:fe23:3ad7/64",
+ "cidr": "172.16.0.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:23:3a:d7\ninet addr:172.16.0.131 Bcast:172.16.0.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fe23:3ad7/64 Scope:Link\ninet6 addr: 2001:420:4482:24c1:f816:3eff:fe23:3ad7/64 Scope:Global\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:48172796 errors:0 dropped:1144801 overruns:0 frame:0\nTX packets:63 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:4220491940 (4.2 GB) TX bytes:3162 (3.1 KB)\n",
+ "host": "node-6.cisco.com",
+ "id": "qg-63489f34-af",
+ "mac_address": "fa:16:3e:23:3a:d7",
+ "master_parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9",
+ "master_parent_type": "vservice",
+ "name": "qg-63489f34-af",
+ "netmask": "255.255.255.0",
+ "network": "c64adb76-ad9d-4605-9f5e-bd6dbe325cfb",
+ "parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.13.5",
+ "IPv6 Address": "fe80::f816:3eff:fe1f:e174/64",
+ "cidr": "172.16.13.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:1f:e1:74\ninet addr:172.16.13.5 Bcast:172.16.13.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fe1f:e174/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:25 errors:0 dropped:1 overruns:0 frame:0\nTX packets:10 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:2460 (2.4 KB) TX bytes:864 (864.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "qr-18f029db-77",
+ "mac_address": "fa:16:3e:1f:e1:74",
+ "master_parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9",
+ "master_parent_type": "vservice",
+ "name": "qr-18f029db-77",
+ "netmask": "255.255.255.0",
+ "network": "8673c48a-f137-4497-b25d-08b7b218fd17",
+ "parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.2.1",
+ "IPv6 Address": "fe80::f816:3eff:fe2c:fb9b/64",
+ "cidr": "172.16.2.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:2c:fb:9b\ninet addr:172.16.2.1 Bcast:172.16.2.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fe2c:fb9b/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:49 errors:0 dropped:3 overruns:0 frame:0\nTX packets:10 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:5825 (5.8 KB) TX bytes:864 (864.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "qr-3ff411a2-54",
+ "mac_address": "fa:16:3e:2c:fb:9b",
+ "master_parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9",
+ "master_parent_type": "vservice",
+ "name": "qr-3ff411a2-54",
+ "netmask": "255.255.255.0",
+ "network": "eb276a62-15a9-4616-a192-11466fdd147f",
+ "parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.1.1",
+ "IPv6 Address": "fe80::f816:3eff:feee:9a46/64",
+ "cidr": "172.16.1.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:ee:9a:46\ninet addr:172.16.1.1 Bcast:172.16.1.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:feee:9a46/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:85 errors:0 dropped:14 overruns:0 frame:0\nTX packets:10 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:7402 (7.4 KB) TX bytes:864 (864.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "qr-8733cc5d-b3",
+ "mac_address": "fa:16:3e:ee:9a:46",
+ "master_parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9",
+ "master_parent_type": "vservice",
+ "name": "qr-8733cc5d-b3",
+ "netmask": "255.255.255.0",
+ "network": "a55ff1e8-3821-4e5f-bcfd-07df93720a4f",
+ "parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.3.1",
+ "IPv6 Address": "fe80::f816:3eff:feba:5a3c/64",
+ "cidr": "172.16.3.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:ba:5a:3c\ninet addr:172.16.3.1 Bcast:172.16.3.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:feba:5a3c/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:3018 errors:0 dropped:15 overruns:0 frame:0\nTX packets:1766 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:295458 (295.4 KB) TX bytes:182470 (182.4 KB)\n",
+ "host": "node-6.cisco.com",
+ "id": "qr-bb9b8340-72",
+ "mac_address": "fa:16:3e:ba:5a:3c",
+ "master_parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9",
+ "master_parent_type": "vservice",
+ "name": "qr-bb9b8340-72",
+ "netmask": "255.255.255.0",
+ "network": "7e59b726-d6f4-451a-a574-c67a920ff627",
+ "parent_id": "qrouter-9ec3d703-0725-47e3-8f48-02b16236caf9-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "172.16.0.130",
+ "IPv6 Address": "fe80::f816:3eff:fecb:8d7b/64",
+ "cidr": "172.16.0.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:cb:8d:7b\ninet addr:172.16.0.130 Bcast:172.16.0.255 Mask:255.255.255.0\ninet6 addr: 2001:420:4482:24c1:f816:3eff:fecb:8d7b/64 Scope:Global\ninet6 addr: fe80::f816:3eff:fecb:8d7b/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:48172955 errors:0 dropped:1144729 overruns:0 frame:0\nTX packets:59 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:4220505032 (4.2 GB) TX bytes:2958 (2.9 KB)\n",
+ "host": "node-6.cisco.com",
+ "id": "qg-57e65d34-3d",
+ "mac_address": "fa:16:3e:cb:8d:7b",
+ "master_parent_id": "qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6",
+ "master_parent_type": "vservice",
+ "name": "qg-57e65d34-3d",
+ "netmask": "255.255.255.0",
+ "network": "c64adb76-ad9d-4605-9f5e-bd6dbe325cfb",
+ "parent_id": "qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ },
+ {
+ "IP Address": "192.168.111.1",
+ "IPv6 Address": "fe80::f816:3eff:fe0a:3cc/64",
+ "cidr": "192.168.111.0/24",
+ "data": "Link encap:Ethernet HWaddr fa:16:3e:0a:03:cc\ninet addr:192.168.111.1 Bcast:192.168.111.255 Mask:255.255.255.0\ninet6 addr: fe80::f816:3eff:fe0a:3cc/64 Scope:Link\nUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1\nRX packets:79 errors:0 dropped:0 overruns:0 frame:0\nTX packets:10 errors:0 dropped:0 overruns:0 carrier:0\ncollisions:0 txqueuelen:0\nRX bytes:6475 (6.4 KB) TX bytes:864 (864.0 B)\n",
+ "host": "node-6.cisco.com",
+ "id": "qr-f7b44150-99",
+ "mac_address": "fa:16:3e:0a:03:cc",
+ "master_parent_id": "qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6",
+ "master_parent_type": "vservice",
+ "name": "qr-f7b44150-99",
+ "netmask": "255.255.255.0",
+ "network": "6504fcf7-41d7-40bb-aeb1-6a7658c105fc",
+ "parent_id": "qrouter-49ac7716-06da-49ed-b388-f8ba60e8a0e6-vnics",
+ "parent_text": "vNICs",
+ "parent_type": "vnics_folder",
+ "type": "vnic",
+ "vnic_type": "vservice_vnic"
+ }
+] \ No newline at end of file