aboutsummaryrefslogtreecommitdiffstats
path: root/app/test/fetch/db_fetch
diff options
context:
space:
mode:
Diffstat (limited to 'app/test/fetch/db_fetch')
-rw-r--r--app/test/fetch/db_fetch/__init__.py9
-rw-r--r--app/test/fetch/db_fetch/mock_cursor.py25
-rw-r--r--app/test/fetch/db_fetch/test_data/__init__.py9
-rw-r--r--app/test/fetch/db_fetch/test_data/db_access.py40
-rw-r--r--app/test/fetch/db_fetch/test_data/db_fetch_aggregate_hosts.py34
-rw-r--r--app/test/fetch/db_fetch/test_data/db_fetch_aggregates.py17
-rw-r--r--app/test/fetch/db_fetch/test_data/db_fetch_host_network_agents.py65
-rw-r--r--app/test/fetch/db_fetch/test_data/db_fetch_instances.py91
-rw-r--r--app/test/fetch/db_fetch/test_data/db_fetch_oteps.py131
-rw-r--r--app/test/fetch/db_fetch/test_data/db_fetch_vedges_ovs.py168
-rw-r--r--app/test/fetch/db_fetch/test_data/db_fetch_vedges_vpp.py89
-rw-r--r--app/test/fetch/db_fetch/test_db_access.py108
-rw-r--r--app/test/fetch/db_fetch/test_db_fetch_aggregate_hosts.py60
-rw-r--r--app/test/fetch/db_fetch/test_db_fetch_aggregates.py26
-rw-r--r--app/test/fetch/db_fetch/test_db_fetch_instances.py37
-rw-r--r--app/test/fetch/db_fetch/test_db_fetch_oteps.py92
-rw-r--r--app/test/fetch/db_fetch/test_db_fetch_vedges_ovs.py109
-rw-r--r--app/test/fetch/db_fetch/test_db_fetch_vedges_vpp.py82
-rw-r--r--app/test/fetch/db_fetch/test_fetch_host_network_agents.py66
19 files changed, 1258 insertions, 0 deletions
diff --git a/app/test/fetch/db_fetch/__init__.py b/app/test/fetch/db_fetch/__init__.py
new file mode 100644
index 0000000..b0637e9
--- /dev/null
+++ b/app/test/fetch/db_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/db_fetch/mock_cursor.py b/app/test/fetch/db_fetch/mock_cursor.py
new file mode 100644
index 0000000..71efd3b
--- /dev/null
+++ b/app/test/fetch/db_fetch/mock_cursor.py
@@ -0,0 +1,25 @@
+###############################################################################
+# 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 #
+###############################################################################
+class MockCursor:
+
+ def __init__(self, result):
+ self.result = result
+ self.current = 0
+
+ def __next__(self):
+ if self.current < len(self.result):
+ next = self.result[self.current]
+ self.current += 1
+ return next
+ else:
+ raise StopIteration
+
+ def __iter__(self):
+ return self
diff --git a/app/test/fetch/db_fetch/test_data/__init__.py b/app/test/fetch/db_fetch/test_data/__init__.py
new file mode 100644
index 0000000..b0637e9
--- /dev/null
+++ b/app/test/fetch/db_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/db_fetch/test_data/db_access.py b/app/test/fetch/db_fetch/test_data/db_access.py
new file mode 100644
index 0000000..a4ad548
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_access.py
@@ -0,0 +1,40 @@
+###############################################################################
+# 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 #
+###############################################################################
+DB_CONFIG = {
+ "host": "10.56.20.239",
+ "name": "mysql",
+ "password": "102QreDdiD5sKcvNf9qbHrmr",
+ "port": 3307.0,
+ "user": "root",
+ "schema": "nova"
+ }
+
+QUERY_WITHOUT_ID = """
+ SELECT id, name
+ FROM nova.aggregates
+ WHERE deleted = 0
+ """
+
+QUERY_WITH_ID = """
+ SELECT CONCAT('aggregate-', a.name, '-', host) AS id, host AS name
+ FROM nova.aggregate_hosts ah
+ JOIN nova.aggregates a ON a.id = ah.aggregate_id
+ WHERE ah.deleted = 0 AND aggregate_id = %s
+ """
+
+ID = "2"
+OBJECT_TYPE = "host aggregate"
+
+OBJECTS_LIST = [
+ {
+ "id": 1,
+ "name": "osdna-agg"
+ }
+]
diff --git a/app/test/fetch/db_fetch/test_data/db_fetch_aggregate_hosts.py b/app/test/fetch/db_fetch/test_data/db_fetch_aggregate_hosts.py
new file mode 100644
index 0000000..2f1313a
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_fetch_aggregate_hosts.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 bson.objectid import ObjectId
+
+
+AGGREGATE = {
+ "id": "1",
+}
+
+HOSTS = [
+ {
+ "id": "aggregate-osdna-agg-node-5.cisco.com",
+ "name": "node-5.cisco.com"
+ }
+]
+
+HOST_IN_INVENTORY = {
+ "_id": "595ac4b6d7c037efdb8918a7"
+}
+
+HOSTS_RESULT = [
+ {
+ "id": "aggregate-osdna-agg-node-5.cisco.com",
+ "name": "node-5.cisco.com",
+ "ref_id": ObjectId(HOST_IN_INVENTORY["_id"])
+ }
+]
diff --git a/app/test/fetch/db_fetch/test_data/db_fetch_aggregates.py b/app/test/fetch/db_fetch/test_data/db_fetch_aggregates.py
new file mode 100644
index 0000000..65182fa
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_fetch_aggregates.py
@@ -0,0 +1,17 @@
+###############################################################################
+# 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 #
+###############################################################################
+REGION_ID = "RegionOne"
+
+OBJECTS_LIST = [
+ {
+ "id": 1,
+ "name": "calipso-agg"
+ }
+]
diff --git a/app/test/fetch/db_fetch/test_data/db_fetch_host_network_agents.py b/app/test/fetch/db_fetch/test_data/db_fetch_host_network_agents.py
new file mode 100644
index 0000000..6188ddf
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_fetch_host_network_agents.py
@@ -0,0 +1,65 @@
+###############################################################################
+# 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 #
+###############################################################################
+CONFIG_WITH_MECHANISM_DRIVERS = {
+ 'mechanism_drivers': [
+ "OVS"
+ ]
+}
+
+CONFIG_WITHOUT_MECHANISM_DRIVERS = {
+ 'mechanism_drivers': [
+
+ ]
+}
+
+NETWORK_AGENT_FOLDER_ID = 'node-6.cisco.com-network_agents'
+
+NETWORK_AGENT = [
+ {
+ 'configurations': '{}',
+ 'id': '1764430c-c09e-4717-86fa-c04350b1fcbb',
+ 'binary': 'neutron-openvswitch-agent',
+ },
+ {
+ 'configurations': '{}',
+ 'id': '2c2ddfee-91f9-47da-bd65-aceecd998b7c',
+ 'binary': 'neutron-dhcp-agent',
+ }
+]
+
+NETWORK_AGENT_WITH_MECHANISM_DRIVERS_IN_CONFIG_RESULTS = [
+ {
+ 'configurations': {},
+ 'id': 'OVS-1764430c-c09e-4717-86fa-c04350b1fcbb',
+ 'binary': 'neutron-openvswitch-agent',
+ 'name': 'neutron-openvswitch-agent'
+ },
+ {
+ 'configurations': {},
+ 'id': 'OVS-2c2ddfee-91f9-47da-bd65-aceecd998b7c',
+ 'binary': 'neutron-dhcp-agent',
+ 'name': 'neutron-dhcp-agent'
+ }
+]
+
+NETWORK_AGENT_WITHOUT_MECHANISM_DRIVERS_IN_CONFIG_RESULTS = [
+ {
+ 'configurations': {},
+ 'id': 'network_agent-1764430c-c09e-4717-86fa-c04350b1fcbb',
+ 'binary': 'neutron-openvswitch-agent',
+ 'name': 'neutron-openvswitch-agent'
+ },
+ {
+ 'configurations': {},
+ 'id': 'network_agent-2c2ddfee-91f9-47da-bd65-aceecd998b7c',
+ 'binary': 'neutron-dhcp-agent',
+ 'name': 'neutron-dhcp-agent'
+ }
+]
diff --git a/app/test/fetch/db_fetch/test_data/db_fetch_instances.py b/app/test/fetch/db_fetch/test_data/db_fetch_instances.py
new file mode 100644
index 0000000..5ba6a74
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_fetch_instances.py
@@ -0,0 +1,91 @@
+###############################################################################
+# 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 #
+###############################################################################
+INSTANCES_FROM_API = [
+ {
+ "host": "node-5.cisco.com",
+ "id": "6f29c867-9150-4533-8e19-70d749b172fa",
+ }
+]
+
+INSTANCES_FROM_DB = [
+ {
+ "host": "node-5.cisco.com",
+ "id": "6f29c867-9150-4533-8e19-70d749b172fa",
+ "network_info": "[{\"network\": {\"id\": \"7e59b726-d6f4-451a-a574-c67a920ff627\"}}]",
+ "project": "Calipso-project",
+ },
+ {
+ "host": "node-5.cisco.com",
+ "id": "bf0cb914-b316-486c-a4ce-f22deb453c52",
+ "network_info": "[{\"network\": {\"id\": \"7e59b726-d6f4-451a-a574-c67a920ff627\"}}]",
+ "project": "Calipso-project",
+ }
+]
+
+UPDATED_INSTANCES_DATA = [
+ {
+ "host": "node-5.cisco.com",
+ "id": "6f29c867-9150-4533-8e19-70d749b172fa",
+ "network": ["7e59b726-d6f4-451a-a574-c67a920ff627"],
+ "type": "instance",
+ "parent_type": "instances_folder",
+ "parent_id": "node-5.cisco.com-instances",
+ "in_project-Calipso-project": "1",
+ "network_info": [
+ {
+ "network": {
+ "id": "7e59b726-d6f4-451a-a574-c67a920ff627"
+ }
+ }
+ ]
+ }
+]
+
+INSTANCE_WITH_NETWORK = {
+ "host": "node-5.cisco.com",
+ "id": "6f29c867-9150-4533-8e19-70d749b172fa",
+ "network_info": "[{\"network\": {\"id\": \"7e59b726-d6f4-451a-a574-c67a920ff627\"}}]",
+ "project": "Calipso-project",
+}
+
+INSTANCE_WITH_NETWORK_RESULT = {
+ "host": "node-5.cisco.com",
+ "id": "6f29c867-9150-4533-8e19-70d749b172fa",
+ "network": ["7e59b726-d6f4-451a-a574-c67a920ff627"],
+ "type": "instance",
+ "parent_type": "instances_folder",
+ "parent_id": "node-5.cisco.com-instances",
+ "in_project-Calipso-project": "1",
+ "network_info": [
+ {
+ "network": {
+ "id": "7e59b726-d6f4-451a-a574-c67a920ff627"
+ }
+ }
+ ]
+}
+
+INSTANCE_WITHOUT_NETWORK = {
+ "host": "node-5.cisco.com",
+ "id": "6f29c867-9150-4533-8e19-70d749b172fa",
+ "network_info": "[]",
+ "project": "Calipso-project",
+}
+
+INSTANCE_WITHOUT_NETWORK_RESULT = {
+ "host": "node-5.cisco.com",
+ "id": "6f29c867-9150-4533-8e19-70d749b172fa",
+ "network": [],
+ "type": "instance",
+ "parent_type": "instances_folder",
+ "parent_id": "node-5.cisco.com-instances",
+ "in_project-Calipso-project": "1",
+ "network_info": []
+}
diff --git a/app/test/fetch/db_fetch/test_data/db_fetch_oteps.py b/app/test/fetch/db_fetch/test_data/db_fetch_oteps.py
new file mode 100644
index 0000000..a5bc63d
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_fetch_oteps.py
@@ -0,0 +1,131 @@
+###############################################################################
+# 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 #
+###############################################################################
+VEDGE_ID = "3858e121-d861-4348-9d64-a55fcd5bf60a"
+VEDGE = {
+ "configurations": {
+ "tunnel_types": [
+ "vxlan"
+ ],
+ "tunneling_ip": "192.168.2.1"
+ },
+ "host": "node-5.cisco.com",
+ "id": "3858e121-d861-4348-9d64-a55fcd5bf60a",
+ "tunnel_ports": {
+ "vxlan-c0a80203": {
+ },
+ "br-tun": {
+ }
+ },
+ "type": "vedge"
+}
+VEDGE_WITHOUT_CONFIGS ={
+
+}
+VEDGE_WITHOUT_TUNNEL_TYPES = {
+ "configuration": {
+ "tunnel_types": ""
+ }
+}
+NON_ICEHOUSE_CONFIGS = {
+ "distribution": "Mirantis-8.0"
+}
+ICEHOUSE_CONFIGS = {
+ "distribution": "Canonical-icehouse"
+}
+HOST = {
+ "host": "node-5.cisco.com",
+ "id": "node-5.cisco.com",
+ "ip_address": "192.168.0.4",
+ "name": "node-5.cisco.com"
+}
+OTEPS_WITHOUT_CONFIGURATIONS_IN_VEDGE_RESULTS = []
+OTEPS_WITHOUT_TUNNEL_TYPES_IN_VEDGE_RESULTS = []
+OTEPS_FOR_NON_ICEHOUSE_DISTRIBUTION_RESULTS = [
+ {
+ "host": "node-5.cisco.com",
+ "ip_address": "192.168.2.1",
+ "udp_port": 4789,
+ "id": "node-5.cisco.com-otep",
+ "name": "node-5.cisco.com-otep",
+ "overlay_type": "vxlan",
+ "ports": {
+ "vxlan-c0a80203": {
+ },
+ "br-tun": {
+ }
+ }
+ }
+]
+OTEPS_FOR_ICEHOUSE_DISTRIBUTION_RESULTS = [
+ {
+ "host": "node-5.cisco.com",
+ "ip_address": "192.168.0.4",
+ "id": "node-5.cisco.com-otep",
+ "name": "node-5.cisco.com-otep",
+ "overlay_type": "vxlan",
+ "ports": {
+ "vxlan-c0a80203": {
+ },
+ "br-tun": {
+ }
+ },
+ "udp_port": "67"
+ }
+]
+
+OTEPS = [
+ {
+ "host": "node-5.cisco.com",
+ "ip_address": "192.168.2.1",
+ "udp_port": 4789
+ }
+]
+
+OTEP_FOR_GETTING_VECONNECTOR = {
+ "host": "node-5.cisco.com",
+ "ip_address": "192.168.2.1",
+ "udp_port": 4789,
+ "id": "node-5.cisco.com-otep",
+ "name": "node-5.cisco.com-otep",
+ "overlay_type": "vxlan",
+ "ports": {
+ "vxlan-c0a80203": {
+ },
+ "br-tun": {
+ }
+ }
+}
+HOST_ID = "node-5.cisco.com"
+IFCONFIG_LINES = [
+ "br-mesh Link encap:Ethernet HWaddr 00:50:56:ac:28:9d ",
+ " inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0",
+ " inet6 addr: fe80::d4e1:8fff:fe33:ed6a/64 Scope:Link",
+ " UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1",
+ " RX packets:2273307 errors:0 dropped:0 overruns:0 frame:0",
+ " TX packets:2255930 errors:0 dropped:0 overruns:0 carrier:0",
+ " collisions:0 txqueuelen:0 ",
+ " RX bytes:578536155 (578.5 MB) TX bytes:598541522 (598.5 MB)",
+ ""
+]
+OTEP_WITH_CONNECTOR = {
+ "host": "node-5.cisco.com",
+ "ip_address": "192.168.2.1",
+ "udp_port": 4789,
+ "id": "node-5.cisco.com-otep",
+ "name": "node-5.cisco.com-otep",
+ "overlay_type": "vxlan",
+ "ports": {
+ "vxlan-c0a80203": {
+ },
+ "br-tun": {
+ }
+ },
+ "vconnector": "br-mesh"
+}
diff --git a/app/test/fetch/db_fetch/test_data/db_fetch_vedges_ovs.py b/app/test/fetch/db_fetch/test_data/db_fetch_vedges_ovs.py
new file mode 100644
index 0000000..818704c
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_fetch_vedges_ovs.py
@@ -0,0 +1,168 @@
+###############################################################################
+# 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 #
+###############################################################################
+VEDGES_FOLDER_ID = "node-6.cisco.com-vedges"
+
+OBJECTS_FROM_DB = [
+ {
+ "host": "node-6.cisco.com",
+ "agent_type": "Open vSwitch agent",
+ "configurations": '{"tunneling_ip": "192.168.2.3"}',
+ }
+]
+
+HOST = {
+ "host": "node-6.cisco.com",
+ "host_type": [
+ "Controller",
+ "Network"
+ ],
+ "id": "node-6.cisco.com",
+ "name": "node-6.cisco.com"
+}
+
+HOST_WITHOUT_REQUIRED_HOST_TYPES = {
+ "id": "node-6.cisco.com",
+ "host_type": []
+}
+
+PORTS = {
+ "ovs-system": {
+ "name": "ovs-system",
+ "id": "0",
+ "internal": True
+ },
+ "qr-bb9b8340-72": {
+ "name": "qr-bb9b8340-72",
+ "id": "1",
+ "internal": True,
+ "tag": "3"
+ },
+ "qr-8733cc5d-b3": {
+ "name": "qr-8733cc5d-b3",
+ "id": "2",
+ "internal": True,
+ "tag": "4"
+ }
+}
+
+TUNNEL_PORTS = {
+ "patch-int": {
+ "interface": "patch-int",
+ "name": "patch-int",
+ "options": {
+ "peer": "patch-tun"
+ },
+ "type": "patch"
+ }
+}
+
+GET_RESULTS = [
+ {
+ 'name': 'node-6.cisco.com-OVS',
+ 'host': 'node-6.cisco.com',
+ 'agent_type': 'Open vSwitch agent',
+ 'configurations': {"tunneling_ip": "192.168.2.3"},
+ 'ports': PORTS,
+ 'tunnel_ports': TUNNEL_PORTS
+ }
+]
+
+
+VSCTL_LINES = [
+ "3b12f08e-4e13-4976-8da5-23314b268805",
+ " Bridge br-int",
+ " fail_mode: secure",
+ " Port \"qr-bb9b8340-72\"",
+ " tag: 3",
+ " Interface \"qr-bb9b8340-72\"",
+ " type: internal",
+ " Port \"qr-8733cc5d-b3\"",
+ " tag: 4",
+ " Interface \"qr-8733cc5d-b3\"",
+ " type: internal",
+ " Bridge br-tun",
+ " fail_mode: secure",
+ " Port patch-int",
+ " Interface patch-int",
+ " type: patch",
+ " options: {peer=patch-tun}",
+]
+
+DPCTL_LINES = [
+ "system@ovs-system:",
+ "\tlookups: hit:14039304 missed:35687906 lost:0",
+ "\tflows: 4",
+ "\tmasks: hit:95173613 total:2 hit/pkt:1.91",
+ "\tport 0: ovs-system (internal)",
+ "\tport 1: qr-bb9b8340-72 (internal)",
+ "\tport 2: qr-8733cc5d-b3 (internal)"
+]
+
+DPCTL_RESULTS = {
+ "ovs-system": {
+ "name": "ovs-system",
+ "id": "0",
+ "internal": True
+ },
+ "qr-bb9b8340-72": {
+ "name": "qr-bb9b8340-72",
+ "id": "1",
+ "internal": True
+ },
+ "qr-8733cc5d-b3": {
+ "name": "qr-8733cc5d-b3",
+ "id": "2",
+ "internal": True
+ }
+}
+
+FETCH__PORT_TAGS_INPUT = {
+ "ovs-system": {
+ "name": "ovs-system",
+ "id": "0",
+ "internal": True
+ },
+ "qr-bb9b8340-72": {
+ "name": "qr-bb9b8340-72",
+ "id": "1",
+ "internal": True
+ },
+ "qr-8733cc5d-b3": {
+ "name": "qr-8733cc5d-b3",
+ "id": "2",
+ "internal": True
+ }
+}
+
+FETCH_PORT_TAGS_RESULT = {
+ "ovs-system": {
+ "name": "ovs-system",
+ "id": "0",
+ "internal": True
+ },
+ "qr-bb9b8340-72": {
+ "name": "qr-bb9b8340-72",
+ "id": "1",
+ "internal": True,
+ "tag": "3"
+ },
+ "qr-8733cc5d-b3": {
+ "name": "qr-8733cc5d-b3",
+ "id": "2",
+ "internal": True,
+ "tag": "4"
+ }
+}
+
+DOC_TO_GET_OVERLAY = {
+ "host": "node-6.cisco.com",
+ "agent_type": "Open vSwitch agent",
+ "configurations": {"tunneling_ip": "192.168.2.3"},
+}
diff --git a/app/test/fetch/db_fetch/test_data/db_fetch_vedges_vpp.py b/app/test/fetch/db_fetch/test_data/db_fetch_vedges_vpp.py
new file mode 100644
index 0000000..24265ae
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_data/db_fetch_vedges_vpp.py
@@ -0,0 +1,89 @@
+###############################################################################
+# 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 #
+###############################################################################
+VEDGE_FOLDER_ID = "ubuntu0-vedges"
+
+HOST = {
+ "host_type": [
+ "Controller",
+ "Compute",
+ "Network"
+ ],
+ "id": "ubuntu0",
+}
+
+HOST_WITHOUT_REQUIRED_HOST_TYPE = {
+ "host_type": [
+
+ ]
+}
+
+VERSION = [
+ "vpp v16.09-rc0~157-g203c632 built by localadmin on ubuntu0 at Sun Jun 26 16:35:15 PDT 2016\n"
+]
+
+INTERFACES = [
+ " Name Idx State Counter Count ",
+ "TenGigabitEthernetc/0/0 5 up rx packets 502022",
+ " rx bytes 663436206",
+ " tx packets 81404",
+ " tx bytes 6366378",
+ " drops 1414",
+ " punts 1",
+ " rx-miss 64525",
+ "VirtualEthernet0/0/0 7 up tx packets 31496",
+ " tx bytes 2743185",
+ "local0 0 down ",
+ "pg/stream-0 1 down ",
+]
+
+PORTS = {
+ "TenGigabitEthernetc/0/0": {
+ "id": "5",
+ "name": "TenGigabitEthernetc/0/0",
+ "state": "up"
+ },
+ "VirtualEthernet0/0/0": {
+ "id": "7",
+ "name": "VirtualEthernet0/0/0",
+ "state": "up"
+ },
+ "local0": {
+ "id": "0",
+ "name": "local0",
+ "state": "down"
+ },
+ "pg/stream-0": {
+ "id": "1",
+ "name": "pg/stream-0",
+ "state": "down"
+ }
+}
+
+
+VEDGE_RESULTS = [
+ {
+ "host": "ubuntu0",
+ "id": "ubuntu0-VPP",
+ "name": "VPP-ubuntu0",
+ "agent_type": "VPP",
+ "binary": "vpp v16.09-rc0~157-g203c632",
+ "ports": PORTS
+ }
+]
+
+VEDGE_RESULTS_WITHOUT_BINARY = [
+ {
+ "host": "ubuntu0",
+ "id": "ubuntu0-VPP",
+ "name": "VPP-ubuntu0",
+ "agent_type": "VPP",
+ "ports": PORTS
+ }
+]
diff --git a/app/test/fetch/db_fetch/test_db_access.py b/app/test/fetch/db_fetch/test_db_access.py
new file mode 100644
index 0000000..4ef3e74
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_db_access.py
@@ -0,0 +1,108 @@
+###############################################################################
+# 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.db.db_access import DbAccess
+from test.fetch.test_fetch import TestFetch
+from test.fetch.db_fetch.test_data.db_access import *
+from unittest.mock import MagicMock, patch
+from test.fetch.db_fetch.mock_cursor import MockCursor
+
+
+class TestDbAccess(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbAccess()
+
+ @patch("mysql.connector.connect")
+ def test_db_connect(self, db_connect):
+ DbAccess.conn = None
+ db_conn = MagicMock()
+ db_conn.ping = MagicMock()
+ db_connect.return_value = db_conn
+
+ self.fetcher.db_connect(DB_CONFIG['host'], DB_CONFIG['port'],
+ DB_CONFIG['user'], DB_CONFIG['password'],
+ DB_CONFIG['schema'])
+
+ self.assertEqual(True, db_connect.called, "connect method has't been called")
+ db_conn.ping.assert_called_once_with(True)
+
+ def test_connect_to_db(self):
+ DbAccess.conn = None
+ self.fetcher.db_connect = MagicMock()
+ self.fetcher.connect_to_db()
+
+ self.assertEqual(True, self.fetcher.db_connect.called)
+
+ def test_connect_to_db_with_force(self):
+ DbAccess.conn = MagicMock()
+ self.fetcher.db_connect = MagicMock()
+ self.fetcher.connect_to_db(force=True)
+
+ self.assertEqual(True, self.fetcher.db_connect.called)
+
+ def test_connect_to_db_without_force(self):
+ DbAccess.conn = MagicMock()
+ self.fetcher.db_connect = MagicMock()
+ self.fetcher.connect_to_db()
+
+ self.assertEqual(False, self.fetcher.db_connect.called)
+
+ def test_get_objects_list_for_id_with_id(self):
+ # mock the db cursor
+ mock_cursor = MockCursor(OBJECTS_LIST)
+ mock_cursor.execute = MagicMock()
+
+ self.fetcher.connect_to_db = MagicMock()
+ DbAccess.conn.cursor = MagicMock(return_value=mock_cursor)
+
+ result = self.fetcher.get_objects_list_for_id(QUERY_WITH_ID, OBJECT_TYPE, ID)
+
+ mock_cursor.execute.assert_called_once_with(QUERY_WITH_ID, [ID])
+ self.assertEqual(result, OBJECTS_LIST, "Can't get objects list")
+
+ def test_get_objects_list_for_id_without_id(self):
+ mock_cursor = MockCursor(OBJECTS_LIST)
+
+ self.fetcher.connect_to_db = MagicMock()
+ DbAccess.conn.cursor = MagicMock(return_value=mock_cursor)
+ mock_cursor.execute = MagicMock()
+
+ result = self.fetcher.get_objects_list_for_id(QUERY_WITHOUT_ID, OBJECT_TYPE, None)
+
+ mock_cursor.execute.assert_called_once_with(QUERY_WITHOUT_ID)
+ self.assertEqual(result, OBJECTS_LIST, "Can't get objects list")
+
+ def test_get_objects_list_for_id_with_id_with_exception(self):
+ mock_cursor = MockCursor(OBJECTS_LIST)
+ self.fetcher.connect_to_db = MagicMock()
+ # mock exception
+ DbAccess.conn.cursor = MagicMock(return_value=mock_cursor)
+ mock_cursor.execute = MagicMock(side_effect=[AttributeError, ""])
+
+ result = self.fetcher.get_objects_list_for_id(QUERY_WITH_ID, OBJECT_TYPE, ID)
+
+ self.assertEqual(mock_cursor.execute.call_count, 2, "Can't invoke execute method " +
+ "twice when error occurs")
+ self.assertEqual(result, OBJECTS_LIST, "Can't get objects list")
+
+ def test_get_objects_list_for_id_without_id_with_exception(self):
+ mock_cursor = MockCursor(OBJECTS_LIST)
+ self.fetcher.connect_to_db = MagicMock()
+ DbAccess.conn.cursor = MagicMock(return_value=mock_cursor)
+ mock_cursor.execute = MagicMock(side_effect=[AttributeError, ""])
+
+ result = self.fetcher.get_objects_list_for_id(QUERY_WITHOUT_ID,
+ OBJECT_TYPE,
+ None)
+
+ self.assertEqual(mock_cursor.execute.call_count, 2, "Can't invoke execute method " +
+ "twice when error occurs")
+ self.assertEqual(result, OBJECTS_LIST, "Can't get objects list")
diff --git a/app/test/fetch/db_fetch/test_db_fetch_aggregate_hosts.py b/app/test/fetch/db_fetch/test_db_fetch_aggregate_hosts.py
new file mode 100644
index 0000000..2066577
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_db_fetch_aggregate_hosts.py
@@ -0,0 +1,60 @@
+###############################################################################
+# 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.db.db_fetch_aggregate_hosts import DbFetchAggregateHosts
+from test.fetch.test_fetch import TestFetch
+from test.fetch.db_fetch.test_data.db_fetch_aggregate_hosts import *
+from unittest.mock import MagicMock
+
+
+class TestDbFetchAggregateHosts(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbFetchAggregateHosts()
+
+ def check_get_results_is_correct(self,
+ objects_list,
+ host_in_inventory,
+ expected_result,
+ err_msg):
+ self.fetcher.get_objects_list_for_id = MagicMock(return_value=objects_list)
+ self.inv.get_by_id = MagicMock(return_value=host_in_inventory)
+ result = self.fetcher.get(AGGREGATE["id"])
+
+ self.assertEqual(result, expected_result, err_msg)
+
+ def test_get(self):
+ test_cases = [
+ {
+ "objects_list": HOSTS,
+ "host_in_inventory": HOST_IN_INVENTORY,
+ "expected_result": HOSTS_RESULT,
+ "err_msg": "Can't get correct hosts info"
+ },
+ {
+ "objects_list": [],
+ "host_in_inventory": None,
+ "expected_result": [],
+ "err_msg": "Can't get [] when the "
+ "returned objects list is empty"
+ },
+ {
+ "objects_list": HOSTS,
+ "host_in_inventory": [],
+ "expected_result": HOSTS,
+ "err_msg": "Can't get correct hosts info "
+ "when the host doesn't exist in the inventory"
+ }
+ ]
+ for test_case in test_cases:
+ self.check_get_results_is_correct(test_case["objects_list"],
+ test_case["host_in_inventory"],
+ test_case["expected_result"],
+ test_case["err_msg"])
diff --git a/app/test/fetch/db_fetch/test_db_fetch_aggregates.py b/app/test/fetch/db_fetch/test_db_fetch_aggregates.py
new file mode 100644
index 0000000..12693b7
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_db_fetch_aggregates.py
@@ -0,0 +1,26 @@
+###############################################################################
+# 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.db.db_fetch_aggregates import DbFetchAggregates
+from test.fetch.test_fetch import TestFetch
+from test.fetch.db_fetch.test_data.db_fetch_aggregates import *
+from unittest.mock import MagicMock
+
+
+class TestDbFetchAggregates(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbFetchAggregates()
+
+ def test_get(self):
+ self.fetcher.get_objects_list = MagicMock(return_value=OBJECTS_LIST)
+ result = self.fetcher.get(REGION_ID)
+ self.assertEqual(result, OBJECTS_LIST, "Can't get correct " +
+ "aggregates info")
diff --git a/app/test/fetch/db_fetch/test_db_fetch_instances.py b/app/test/fetch/db_fetch/test_db_fetch_instances.py
new file mode 100644
index 0000000..a1207a1
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_db_fetch_instances.py
@@ -0,0 +1,37 @@
+###############################################################################
+# 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.db.db_fetch_instances import DbFetchInstances
+from test.fetch.test_fetch import TestFetch
+from unittest.mock import MagicMock
+from test.fetch.db_fetch.test_data.db_fetch_instances import *
+
+
+class TestDbFetchInstances(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbFetchInstances()
+
+ def test_get(self):
+ self.fetcher.get_objects_list = MagicMock(return_value=
+ INSTANCES_FROM_DB)
+ self.fetcher.get_instance_data(INSTANCES_FROM_API)
+
+ self.assertEqual(INSTANCES_FROM_API, UPDATED_INSTANCES_DATA)
+
+ def test_build_instance_details_with_network(self):
+ self.fetcher.build_instance_details(INSTANCE_WITH_NETWORK)
+ self.assertEqual(INSTANCE_WITH_NETWORK,
+ INSTANCE_WITH_NETWORK_RESULT)
+
+ def test_build_instance_details_without_network(self):
+ self.fetcher.build_instance_details(INSTANCE_WITHOUT_NETWORK)
+ self.assertEqual(INSTANCE_WITHOUT_NETWORK,
+ INSTANCE_WITHOUT_NETWORK_RESULT)
diff --git a/app/test/fetch/db_fetch/test_db_fetch_oteps.py b/app/test/fetch/db_fetch/test_db_fetch_oteps.py
new file mode 100644
index 0000000..905f55a
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_db_fetch_oteps.py
@@ -0,0 +1,92 @@
+###############################################################################
+# 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 copy
+
+from discover.fetchers.db.db_fetch_oteps import DbFetchOteps
+from test.fetch.test_fetch import TestFetch
+from test.fetch.db_fetch.test_data.db_fetch_oteps import *
+from unittest.mock import MagicMock
+
+
+class TestDbFetchOteps(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbFetchOteps()
+ self.fetcher.set_env(self.env)
+
+ def check_get_oteps_results(self, vedge,
+ config,
+ host,
+ oteps_from_db,
+ expected_results,
+ err_msg):
+ original_get_vconnector = self.fetcher.get_vconnector
+ self.fetcher.get_vconnector = MagicMock()
+ self.fetcher.inv.get_by_id = MagicMock(side_effect=[vedge, host])
+ self.fetcher.config.get_env_config = MagicMock(return_value=config)
+ self.fetcher.get_objects_list_for_id = MagicMock(return_value=oteps_from_db)
+ results = self.fetcher.get(VEDGE_ID)
+ self.assertEqual(results, expected_results, err_msg)
+ self.fetcher.get_vconnector = original_get_vconnector
+
+ def test_get(self):
+ test_cases = [
+ {
+ "vedge": VEDGE_WITHOUT_CONFIGS,
+ "config": NON_ICEHOUSE_CONFIGS,
+ "host": None,
+ "oteps_from_db": None,
+ "expected_results": [],
+ "err_msg": "Can't get [] when the vedge " +
+ "doesn't contains configurations"
+ },
+ {
+ "vedge": VEDGE_WITHOUT_TUNNEL_TYPES,
+ "config": NON_ICEHOUSE_CONFIGS,
+ "host": None,
+ "oteps_from_db": None,
+ "expected_results": [],
+ "err_msg": "Can't get [] when the vedge configurations " +
+ "doesn't contain tunnel_types"
+ },
+ {
+ "vedge": VEDGE,
+ "config": ICEHOUSE_CONFIGS,
+ "host": HOST,
+ "oteps_from_db": None,
+ "expected_results": OTEPS_FOR_ICEHOUSE_DISTRIBUTION_RESULTS,
+ "err_msg": "Can't get correct oteps result " +
+ "when the distribution is icehouse"
+ },
+ {
+ "vedge": VEDGE,
+ "config": NON_ICEHOUSE_CONFIGS,
+ "host": None,
+ "oteps_from_db": OTEPS,
+ "expected_results": OTEPS_FOR_NON_ICEHOUSE_DISTRIBUTION_RESULTS,
+ "err_msg": "Can't get correct oteps result " +
+ "when the distribution is not icehouse"
+ }
+ ]
+ for test_case in test_cases:
+ self.check_get_oteps_results(test_case["vedge"],
+ test_case["config"],
+ test_case["host"],
+ test_case["oteps_from_db"],
+ test_case["expected_results"],
+ test_case["err_msg"])
+
+ def test_get_vconnectors(self):
+ self.fetcher.run_fetch_lines = MagicMock(return_value=IFCONFIG_LINES)
+ self.fetcher.get_vconnector(OTEP_FOR_GETTING_VECONNECTOR,
+ HOST_ID, VEDGE)
+ self.assertEqual(OTEP_FOR_GETTING_VECONNECTOR, OTEP_WITH_CONNECTOR,
+ "Can't get vconnector from the config lines for otep")
diff --git a/app/test/fetch/db_fetch/test_db_fetch_vedges_ovs.py b/app/test/fetch/db_fetch/test_db_fetch_vedges_ovs.py
new file mode 100644
index 0000000..b08aebd
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_db_fetch_vedges_ovs.py
@@ -0,0 +1,109 @@
+###############################################################################
+# 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.db.db_fetch_vedges_ovs import DbFetchVedgesOvs
+from test.fetch.test_fetch import TestFetch
+from test.fetch.db_fetch.test_data.db_fetch_vedges_ovs import *
+from unittest.mock import MagicMock
+
+
+class TestDbFetchVedgesOvs(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbFetchVedgesOvs()
+ self.fetcher.set_env(self.env)
+
+ def check_get_result(self,
+ objects_from_db, host,
+ vsctl_lines, ports, tunnel_ports,
+ expected_result, err_msg):
+ # store original methods
+ original_get_objects_list_by_id = self.fetcher.get_objects_list_for_id
+ original_get_by_id = self.fetcher.inv.get_by_id
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_fetch_ports = self.fetcher.fetch_ports
+ original_get_overlay_tunnels = self.fetcher.get_overlay_tunnels
+
+ self.fetcher.get_objects_list_for_id = MagicMock(return_value=objects_from_db)
+ self.fetcher.inv.get_by_id = MagicMock(return_value=host)
+ self.fetcher.run_fetch_lines = MagicMock(return_value=vsctl_lines)
+ self.fetcher.fetch_ports = MagicMock(return_value=ports)
+ self.fetcher.get_overlay_tunnels = MagicMock(return_value=tunnel_ports)
+
+ results = self.fetcher.get(VEDGES_FOLDER_ID)
+ self.assertEqual(results, expected_result, err_msg)
+
+ # restore methods
+ self.fetcher.get_objects_list_for_id = original_get_objects_list_by_id
+ self.fetcher.inv.get_by_id = original_get_by_id
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.fetch_ports = original_fetch_ports
+ self.fetcher.get_overlay_tunnels = original_get_overlay_tunnels
+
+ def test_get(self):
+ test_cases = [
+ {
+ "objects_from_db": OBJECTS_FROM_DB,
+ "host": HOST,
+ "vsctl_lines": "",
+ "ports": PORTS,
+ "tunnel_ports": TUNNEL_PORTS,
+ "expected_result": GET_RESULTS,
+ "err_msg": "Can't get correct vedges"
+ },
+ {
+ "objects_from_db": OBJECTS_FROM_DB,
+ "host": [],
+ "vsctl_lines": "",
+ "ports": {},
+ "tunnel_ports": [],
+ "expected_result": [],
+ "err_msg": "Can't get [] when the host " +
+ "doesn't exist"
+ },
+ {
+ "objects_from_db": OBJECTS_FROM_DB,
+ "host": HOST_WITHOUT_REQUIRED_HOST_TYPES,
+ "vsctl_lines": "",
+ "ports": {},
+ "tunnel_ports": [],
+ "expected_result": [],
+ "err_msg": "Can't get [] when the host " +
+ "doesn't have required host types"
+ }
+ ]
+ for test_case in test_cases:
+ self.check_get_result(test_case["objects_from_db"],
+ test_case["host"],
+ test_case["vsctl_lines"],
+ test_case["ports"],
+ test_case["tunnel_ports"],
+ test_case["expected_result"],
+ test_case["err_msg"])
+
+ def test_fetch_ports_from_dpctl(self):
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ self.fetcher.run_fetch_lines = MagicMock(return_value=DPCTL_LINES)
+
+ results = self.fetcher.fetch_ports_from_dpctl(HOST['id'])
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.assertEqual(results, DPCTL_RESULTS,
+ "Can' t get correct ports info from dpctl lines")
+
+ def test_fetch_port_tags_from_vsctl(self):
+ ports = self.fetcher.fetch_port_tags_from_vsctl(VSCTL_LINES,
+ FETCH__PORT_TAGS_INPUT)
+ self.assertEqual(ports, FETCH_PORT_TAGS_RESULT,
+ "Can't fetch tag from vsctl")
+
+ def test_get_overlay_tunnels(self):
+ results = self.fetcher.get_overlay_tunnels(DOC_TO_GET_OVERLAY,
+ VSCTL_LINES)
+ self.assertEqual(results, TUNNEL_PORTS)
diff --git a/app/test/fetch/db_fetch/test_db_fetch_vedges_vpp.py b/app/test/fetch/db_fetch/test_db_fetch_vedges_vpp.py
new file mode 100644
index 0000000..9e6f497
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_db_fetch_vedges_vpp.py
@@ -0,0 +1,82 @@
+###############################################################################
+# 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.db.db_fetch_vedges_vpp import DbFetchVedgesVpp
+from test.fetch.test_fetch import TestFetch
+from test.fetch.db_fetch.test_data.db_fetch_vedges_vpp import *
+from unittest.mock import MagicMock
+
+
+class TestDbFetchVedgesVpp(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbFetchVedgesVpp()
+ self.fetcher.set_env(self.env)
+
+ def check_get_results(self, version,
+ interfaces, host,
+ expected_results, err_msg):
+ original_run_fetch_lines = self.fetcher.run_fetch_lines
+ original_get_by_id = self.fetcher.inv.get_by_id
+
+ self.fetcher.run_fetch_lines = MagicMock(side_effect=[version, interfaces])
+ self.fetcher.inv.get_by_id = MagicMock(return_value=host)
+
+ vedges = self.fetcher.get(VEDGE_FOLDER_ID)
+ self.assertEqual(vedges, expected_results, err_msg)
+
+ self.fetcher.run_fetch_lines = original_run_fetch_lines
+ self.fetcher.inv.get_by_id = original_get_by_id
+
+ def test_get(self):
+ test_cases = [
+ {
+ "version": VERSION,
+ "interfaces": INTERFACES,
+ "host": HOST,
+ "expected_results": VEDGE_RESULTS,
+ "err_msg": "Can' get correct vedges"
+ },
+ {
+ "version": [],
+ "interfaces": INTERFACES,
+ "host": HOST,
+ "expected_results": VEDGE_RESULTS_WITHOUT_BINARY,
+ "err_msg": "Can' get correct vedges when " +
+ "it can't get version info host"
+ },
+ {
+ "version": VERSION,
+ "interfaces": INTERFACES,
+ "host": [],
+ "expected_results": [],
+ "err_msg": "Can't get [] when the host of the " +
+ "vedge doesn't exist in db"
+ },
+ {
+ "version": VERSION,
+ "interfaces": INTERFACES,
+ "host": HOST_WITHOUT_REQUIRED_HOST_TYPE,
+ "expected_results": [],
+ "err_msg": "Can't get [] when the host of the " +
+ "vedge doesn't contains required host types"
+ }
+ ]
+
+ for test_case in test_cases:
+ self.check_get_results(test_case["version"],
+ test_case["interfaces"],
+ test_case["host"],
+ test_case["expected_results"],
+ test_case["err_msg"])
+
+ def test_fetch_ports(self):
+ ports = self.fetcher.fetch_ports(INTERFACES)
+ self.assertEqual(ports, PORTS, "Can't get the correct ports info") \ No newline at end of file
diff --git a/app/test/fetch/db_fetch/test_fetch_host_network_agents.py b/app/test/fetch/db_fetch/test_fetch_host_network_agents.py
new file mode 100644
index 0000000..fd68a56
--- /dev/null
+++ b/app/test/fetch/db_fetch/test_fetch_host_network_agents.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 #
+###############################################################################
+import copy
+
+from discover.fetchers.db.db_fetch_host_network_agents import DbFetchHostNetworkAgents
+from test.fetch.test_fetch import TestFetch
+from test.fetch.db_fetch.test_data.db_fetch_host_network_agents import *
+from unittest.mock import MagicMock
+
+
+class TestFetchHostNetworkAgents(TestFetch):
+
+ def setUp(self):
+ self.configure_environment()
+ self.fetcher = DbFetchHostNetworkAgents()
+
+ def check_get_result(self,
+ config,
+ network_agent_res,
+ expected_result,
+ err_msg):
+ self.fetcher.env_config = config
+ self.fetcher.get_objects_list_for_id =\
+ MagicMock(return_value=network_agent_res)
+ result = self.fetcher.get(NETWORK_AGENT_FOLDER_ID)
+ self.assertEqual(result, expected_result, err_msg)
+
+ def test_get(self):
+ test_cases = [
+ {
+ 'config': CONFIG_WITH_MECHANISM_DRIVERS,
+ 'network_agent_res': copy.deepcopy(NETWORK_AGENT),
+ 'expected_result':
+ NETWORK_AGENT_WITH_MECHANISM_DRIVERS_IN_CONFIG_RESULTS,
+ 'err_msg': "Can't get correct result when the " +
+ "mechanism drivers exists in the config"
+ },
+ {
+ 'config': CONFIG_WITHOUT_MECHANISM_DRIVERS,
+ 'network_agent_res': copy.deepcopy(NETWORK_AGENT),
+ 'expected_result':
+ NETWORK_AGENT_WITHOUT_MECHANISM_DRIVERS_IN_CONFIG_RESULTS,
+ 'err_msg': "Can't get correct result when the " +
+ "mechanism drivers doesn't exist in the config"
+ },
+ {
+ 'config': CONFIG_WITH_MECHANISM_DRIVERS,
+ 'network_agent_res': [],
+ 'expected_result': [],
+ 'err_msg': "Can't get [] when the network agent result " +
+ "is empty"
+ }
+ ]
+
+ for test_case in test_cases:
+ self.check_get_result(test_case['config'],
+ test_case['network_agent_res'],
+ test_case['expected_result'],
+ test_case['err_msg'])