def test_filtering_with_a_value(self): content = dict_2_etree({ "data": { "configuration": [ {"element": { "element-key": "MY-KEY", "attribute": {"sub-attribute": {}} }}, {"element": { "element-key": "MY-OTHER-KEY", "other-attribute": {"sub-attribute": {}} }}, ] } }) content_filter = dict_2_etree({ "filter": { "configuration": { "element": { "element-key": "MY-KEY" }, } } }) filter_content(content, content_filter) assert_that(content.xpath("//data/configuration/element"), has_length(1)) assert_that(content.xpath("//data/configuration/element/*"), has_length(2)) assert_that(content.xpath("//data/configuration/element/attribute/*"), has_length(1))
def test_set_interface_disabling(self): result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("disable"), has_length(0)) self.edit({"interfaces": {"interface": [{"name": "ge-0/0/2"}, {"disable": ""}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("disable"), has_length(1)) self.edit({"interfaces": { "interface": [{"name": "ge-0/0/2"}, {"disable": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("disable"), has_length(0))
def test_set_interface_description(self): self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/2"}, {"description": "Hey there beautiful"}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("name")[0].text, equal_to("ge-0/0/2")) assert_that(int002.xpath("description")[0].text, equal_to("Hey there beautiful")) self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/2"}, {"description": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(0))
def test_create_vlan(self): self.nc.edit_config(target='candidate', config=dict_2_etree({"config": {"configuration": { "vlans": { "vlan": [ {"name": "VLAN2999"}, {"description": "WHAAT"}, {"vlan-id": "2995"} ] } }}})) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/*"), has_length(1)) assert_that(result.xpath("data/configuration/*"), has_length(1)) assert_that(result.xpath("data/configuration/vlans/*"), has_length(1)) assert_that(result.xpath("data/configuration/vlans/vlan/*"), has_length(3)) vlan2995 = result.xpath("data/configuration/vlans/vlan")[0] assert_that(vlan2995.xpath("name")[0].text, equal_to("VLAN2999")) assert_that(vlan2995.xpath("description")[0].text, equal_to("WHAAT")) assert_that(vlan2995.xpath("vlan-id")[0].text, equal_to("2995")) self.cleanup(vlan("VLAN2999"))
def test_display_interface_trunk_native_vlan_and_no_ethernet_switching(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]} ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "2996"} ]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(int003.xpath("native-vlan-id")[0].text, equal_to("2996")) self.cleanup(vlan("VLAN2996"), interface("ge-0/0/3")) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_display_interface_trunk_native_vlan_and_no_ethernet_switching(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]} ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "2996"} ]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(int003.xpath("native-vlan-id")[0].text, equal_to("2996")) self.cleanup(vlan("VLAN2996"), reset_interface("ge-0/0/3")) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_filtering_multi_with_intermediate_without_identification_layers( self): content = dict_2_etree({ "data": { "configuration": { "interfaces": { "interface": [{ "name": "irb" }, { "unit": { "name": "123", "family": { "inet": { "address": { "name": "1.1.1.1/27" } } } } }] } } } }) content_filter = dict_2_etree({ "filter": { "configuration": { "interfaces": { "interface": { "name": "irb", "unit": { "name": "123", "family": { "inet": { "address": { "name": "1.1.1.1/27" } } } } } } } } }) filter_content(content, content_filter) assert_that( content.xpath( "//data/configuration/interfaces/interface/unit/family/inet/address/name" ), has_length(1))
def test_display_interface_with_description_and_trunk_native_vlan(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"description": "I see what you did there!"}, {"native-vlan-id": "2996"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk", "vlan": [ {"members": "2995"}, {"members": "2997"}, ]}}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(int003.xpath("native-vlan-id")[0].text, equal_to("2996")) assert_that(int003.xpath("description")[0].text, equal_to("I see what you did there!")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members")), has_length(2) members = int003.xpath("unit/family/ethernet-switching/vlan/members") assert_that(members[0].text, equal_to("2995")) assert_that(members[1].text, equal_to("2997")) self.cleanup(vlan("VLAN2995"), vlan("VLAN2996"), vlan("VLAN2997"), reset_interface("ge-0/0/3")) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_display_interface_with_description_and_trunk_native_vlan(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"description": "I see what you did there!"}, {"native-vlan-id": "2996"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk", "vlan": [ {"members": "2995"}, {"members": "2997"}, ]}}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(int003.xpath("native-vlan-id")[0].text, equal_to("2996")) assert_that(int003.xpath("description")[0].text, equal_to("I see what you did there!")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members")), has_length(2) members = int003.xpath("unit/family/ethernet-switching/vlan/members") assert_that(members[0].text, equal_to("2995")) assert_that(members[1].text, equal_to("2997")) self.cleanup(vlan("VLAN2995"), vlan("VLAN2996"), vlan("VLAN2997"), interface("ge-0/0/3", ["interface-mode", "vlan"])) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_filtering_multiple_identification_is_weirdly_supported(self): content = dict_2_etree({ "data": { "configuration": { "interfaces": [{ "interface": [{ "name": "key1" }, { "name1": "key2" }, { "unit": { "name": "123" } }] }, { "interface": [{ "name": "key1" }, { "name1": "NOTKEY2" }, { "unit": { "name": "123" } }] }] } } }) content_filter = dict_2_etree({ "filter": { "configuration": { "interfaces": { "interface": [{ "name": "key1" }, { "name1": "key2" }, { "unit": { "name": "123" } }] } } } }) filter_content(content, content_filter) assert_that( content.xpath("//data/configuration/interfaces/interface/unit"), has_length(1))
def test_set_interface_disabling(self): result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("enable"), has_length(0)) assert_that(int002.xpath("disable"), has_length(0)) self.edit({"interfaces": {"interface": [{"name": "ge-0/0/2"}, {"disable": ""}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("enable"), has_length(0)) assert_that(int002.xpath("disable"), has_length(1)) self.edit({"interfaces": {"interface": [{"name": "ge-0/0/2"}, {"enable": ""}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("enable"), has_length(1)) assert_that(int002.xpath("disable"), has_length(0)) self.edit({"interfaces": { "interface": [{"name": "ge-0/0/2"}, {"enable": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("enable"), has_length(0)) assert_that(int002.xpath("disable"), has_length(0)) self.edit({"interfaces": {"interface": [{"name": "ge-0/0/2"}, {"disable": ""}]}}) self.nc.commit() self.edit({"interfaces": { "interface": [{"name": "ge-0/0/2"}, {"disable": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}}})) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("enable"), has_length(0)) assert_that(int002.xpath("disable"), has_length(0))
def test_filtering(self): content = dict_2_etree({ "data": { "configuration": [{ "shizzle": { "whizzle": {} } }, { "shizzle": { "whizzle": { "howdy": {} }, "not-whizzle": { "not-howdy": {} } } }, { "zizzle": { "nothing": {} } }, { "outzzle": { "nothing": {} } }] } }) content_filter = dict_2_etree({ "filter": { "configuration": { "shizzle": { "whizzle": {} }, "zizzle": {}, } } }) filter_content(content, content_filter) assert_that(content.xpath("//data/configuration/shizzle"), has_length(2)) assert_that(content.xpath("//data/configuration/shizzle/*"), has_length(2)) assert_that( content.xpath("//data/configuration/shizzle/whizzle/howdy"), has_length(1)) assert_that(content.xpath("//data/configuration/zizzle"), has_length(1)) assert_that(content.xpath("//data/configuration/outzzle"), has_length(0))
def test_interface_trunk_native_vlan_merge(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "2995"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk", "vlan": [ {"members": "2997"}, ]}}}]}]}}) self.nc.commit() self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "2996"}, ]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("native-vlan-id")[0].text, equal_to("2996")) self.cleanup(vlan("VLAN2995"), vlan("VLAN2996"), vlan("VLAN2997"), reset_interface("ge-0/0/3")) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_set_lldp(self): self.edit({ "protocols": { "lldp": { "interface": [ {"name": "ge-0/0/3"}, {"disable": ""}]}}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"protocols": {"lldp": {"interface": {"name": "ge-0/0/3"}}}}} })) assert_that(result.xpath("data/configuration/protocols/lldp/interface"), has_length(1)) interface = result.xpath("data/configuration/protocols/lldp/interface")[0] assert_that(interface, has_length(2)) assert_that(interface.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(len(interface.xpath("disable")), equal_to(1)) self.edit({ "protocols": { "lldp": { "interface": [ {"name": "ge-0/0/3"}, {"disable": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"protocols": {"lldp": {"interface": {"name": "ge-0/0/3"}}}}} })) assert_that(result.xpath("data/configuration/protocols/lldp/interface")[0], has_length(1)) self.edit({ "protocols": { "lldp": { "interface": { XML_ATTRIBUTES: {"operation": "delete"}, "name": "ge-0/0/3"}}}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"protocols": ""}} })) assert_that(result.xpath("data/configuration/protocols"), has_length(1))
def edit(self, config): result = self.nc.edit_config(target="candidate", config=dict_2_etree( {"config": { "configuration": config }})) assert_that(result.xpath("//rpc-reply/ok"), has_length(1))
def test_filtering_should_only_consider_non_empty_text_nodes(self): content = dict_2_etree({ "data": { "configuration": { "interfaces": { "interface": { "name": "key1" } } } } }) content_filter = to_ele(""" <filter> <configuration> <interfaces> <interface> <name>key1</name> </interface> </interfaces> </configuration> </filter> """) filter_content(content, content_filter) assert_that(content.xpath("//data/configuration/interfaces/interface"), has_length(1))
def test_lock_edit_candidate_add_vlan_and_commit(self): with self.nc.locked(target='candidate'): result = self.nc.edit_config(target='candidate', config=dict_2_etree({ "config": { "configuration": { "vlans": { "vlan": { "name": "VLAN2999", } } } }})) assert_that(result.xpath("//rpc-reply/ok"), has_length(1)) result = self.nc.commit() assert_that(result.xpath("//rpc-reply/ok"), has_length(1)) result = self.nc.get_config(source="running") assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(1)) self.edit({ "vlans": { "vlan": { XML_ATTRIBUTES: {"operation": "delete"}, "name": "VLAN2999" } } }) self.nc.commit() result = self.nc.get_config(source="running") assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_deleting_spanning_tree_options(self): self.edit({ "protocols": { "rstp": { "interface": [ {"name": "ge-0/0/3"}, {"edge": ""}, {"no-root-port": ""}]}}}) self.nc.commit() self.edit({ "protocols": { "rstp": { "interface": [ {"name": "ge-0/0/3"}, {"edge": {XML_ATTRIBUTES: {"operation": "delete"}}}, {"no-root-port": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"protocols": {"rstp": {"interface": {"name": "ge-0/0/3"}}}}} })) assert_that(result.xpath("data/configuration/protocols/rstp/interface"), has_length(0))
def test_access_mode(self): self.edit({ "vlans": { "vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { self.PORT_MODE_TAG: "access", "vlan": [ {"members": "2995"}, ]}}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(int003.xpath("unit/family/ethernet-switching/*"), has_length(2)) assert_that(int003.xpath("unit/family/ethernet-switching/{}".format(self.PORT_MODE_TAG))[0].text, equal_to("access")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members"), has_length(1)) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members")[0].text, equal_to("2995")) self.cleanup(vlan("VLAN2995"), interface("ge-0/0/3", [self.PORT_MODE_TAG, "vlan"]))
def edit(self, config): result = self.nc.edit_config(target="candidate", config=dict_2_etree({ "config": { "configuration": config } })) assert_that(result.xpath("//rpc-reply/ok"), has_length(1))
def test_access_mode(self): self.edit({ "vlans": { "vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "access", "vlan": [ {"members": "2995"}, ]}}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(int003.xpath("unit/family/ethernet-switching/*"), has_length(2)) assert_that(int003.xpath("unit/family/ethernet-switching/interface-mode")[0].text, equal_to("access")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members"), has_length(1)) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members")[0].text, equal_to("2995")) self.cleanup(vlan("VLAN2995"), interface("ge-0/0/3", ["interface-mode", "vlan"]))
def render_POST(self, request): global CONNECTION_ID content = request.content.read().decode("utf-8") if not request.getHeader('authorization'): logging.info("POST %r %r %s", "authenticating", request.uri, content) request.setResponseCode(401) request.responseHeaders.addRawHeader( "WWW-Authenticate", "Basic realm=\"Remote Administrative API Support\"") return b"<html>whatever</html>" else: logging.info("POST %r %r %s", " ", request.uri, content) logging.info(request.requestHeaders) res = dict( netapp={ "results": { "__xml_attributes__": { "status": "passed" }, "major-version": "1", "minor-version": "130" } }) return etree.tostring(dict_2_etree(res), pretty_print=True)
def commit_results_error_to_response(commit_results_error): return Response( dict_2_etree({ 'commit-results': [ error_to_rpcerror_dict(e) for e in commit_results_error.netconf_errors ] }))
def test_bad_configuration_element(self): with self.assertRaises(RPCError): self.nc.edit_config(target='candidate', config=dict_2_etree({ "config": { "configuration": { "vbleh": "shizzle" } }}))
def test_trunk_mode_does_not_allow_no_vlan_members(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "2996"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk" }}}]}]}}) with self.assertRaises(RPCError) as context: self.nc.commit() assert_that(etree.tostring(context.exception._raw.xpath('/*/*')[0]), xml_equals_to( """<?xml version="1.0" encoding="UTF-8"?><commit-results xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/11.4R1/junos"> <rpc-error> <error-tag>operation-failed</error-tag> <error-message> For trunk interface, please ensure either vlan members is configured or inner-vlan-id-list is configured </error-message> <error-severity>error</error-severity> <error-path> [edit interfaces ge-0/0/3 unit 0 family] </error-path> <error-type>protocol</error-type> <error-info> <bad-element>ethernet-switching</bad-element> </error-info> </rpc-error> <rpc-error> <error-severity>error</error-severity> <error-tag>operation-failed</error-tag> <error-type>protocol</error-type> <error-message> configuration check-out failed </error-message> </rpc-error> </commit-results>""")) self.cleanup(vlan("VLAN2995"), vlan("VLAN2996"), vlan("VLAN2997"), reset_interface("ge-0/0/3")) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_trunk_mode_does_not_allow_no_vlan_members(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "2996"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk" }}}]}]}}) with self.assertRaises(RPCError) as context: self.nc.commit() assert_that(etree.tostring(context.exception._raw.xpath('/*/*')[0]), xml_equals_to( """<?xml version="1.0" encoding="UTF-8"?><commit-results xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/11.4R1/junos"> <rpc-error> <error-tag>operation-failed</error-tag> <error-message> For trunk interface, please ensure either vlan members is configured or inner-vlan-id-list is configured </error-message> <error-severity>error</error-severity> <error-path> [edit interfaces ge-0/0/3 unit 0 family] </error-path> <error-type>protocol</error-type> <error-info> <bad-element>ethernet-switching</bad-element> </error-info> </rpc-error> <rpc-error> <error-severity>error</error-severity> <error-tag>operation-failed</error-tag> <error-type>protocol</error-type> <error-message> configuration check-out failed </error-message> </rpc-error> </commit-results>""")) self.cleanup(vlan("VLAN2995"), vlan("VLAN2996"), vlan("VLAN2997"), interface("ge-0/0/3", ["interface-mode"])) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def error_to_response(error): error_specs = {"error-message": error.message} if error.type: error_specs["error-type"] = error.type if error.tag: error_specs["error-tag"] = error.tag if error.severity: error_specs["error-severity"] = error.severity if error.info: error_specs["error-info"] = error.info return Response(dict_2_etree({"rpc-error": error_specs}))
def test_filtering_with_a_value(self): content = dict_2_etree({ "data": { "configuration": [ { "element": { "element-key": "MY-KEY", "attribute": { "sub-attribute": {} } } }, { "element": { "element-key": "MY-OTHER-KEY", "other-attribute": { "sub-attribute": {} } } }, ] } }) content_filter = dict_2_etree({ "filter": { "configuration": { "element": { "element-key": "MY-KEY" }, } } }) filter_content(content, content_filter) assert_that(content.xpath("//data/configuration/element"), has_length(1)) assert_that(content.xpath("//data/configuration/element/*"), has_length(2)) assert_that(content.xpath("//data/configuration/element/attribute/*"), has_length(1))
def test_set_interface_trunk_native_vlan_id(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]} ], "interfaces": { "interface": [ {"name": "ge-0/0/2"}, {"native-vlan-id": "2996"}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("name")[0].text, equal_to("ge-0/0/2")) assert_that(int002.xpath("native-vlan-id")[0].text, equal_to("2996")) self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/2"}, {"native-vlan-id": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("native-vlan-id"), has_length(0))
def connectionMade(self): self.logger.info("Connected, sending <hello>") self.session_count += 1 self.say(dict_2_etree({ "hello": [ {"session-id": str(self.session_count)}, {"capabilities": [{"capability": cap.get_url()} for cap in self.capabilities]} ] }))
def error_to_response(error): error_specs = { "error-message": error.message } if error.type: error_specs["error-type"] = error.type if error.tag: error_specs["error-tag"] = error.tag if error.severity: error_specs["error-severity"] = error.severity if error.info: error_specs["error-info"] = error.info return Response(dict_2_etree({"rpc-error": error_specs}))
def test_filtering(self): content = dict_2_etree({ "data": { "configuration": [ {"shizzle": { "whizzle": {} }}, {"shizzle": { "whizzle": { "howdy": {} }, "not-whizzle": { "not-howdy": {} } }}, {"zizzle": { "nothing": {} }}, {"outzzle": { "nothing": {} }} ] } }) content_filter = dict_2_etree({ "filter": { "configuration": { "shizzle": {"whizzle": {}}, "zizzle": {}, } } }) filter_content(content, content_filter) assert_that(content.xpath("//data/configuration/shizzle"), has_length(2)) assert_that(content.xpath("//data/configuration/shizzle/*"), has_length(2)) assert_that(content.xpath("//data/configuration/shizzle/whizzle/howdy"), has_length(1)) assert_that(content.xpath("//data/configuration/zizzle"), has_length(1)) assert_that(content.xpath("//data/configuration/outzzle"), has_length(0))
def render_GET(self, request): content = request.content.read().decode("utf-8") logging.info("GET %s %r %s", request.getHeader('authorization'), request.uri, content) if request.uri == b"/rest/running/brocade-fibrechannel-switch/fibrechannel-switch": res = dict( Response={"fibrechannel-switch": { "firmware-version": "42" }}) return etree.tostring(dict_2_etree(res), pretty_print=True) elif request.uri == b"/rest/running/zoning/effective-configuration": res = dict( Response={ "effective-configuration": { "cfg-name": "ConfigA", "checksum": "42" } }) return etree.tostring(dict_2_etree(res), pretty_print=True) elif request.uri == b"/rest/running/zoning/defined-configuration/alias": res = dict(Response={"alias": []}) return etree.tostring(dict_2_etree(res), pretty_print=True) elif request.uri == b"/rest/running/zoning/defined-configuration/zone": res = dict(Response={"zone": []}) return etree.tostring(dict_2_etree(res), pretty_print=True) elif request.uri == b"/rest/running/zoning/defined-configuration/cfg": res = dict(Response={"cfg": []}) return etree.tostring(dict_2_etree(res), pretty_print=True) elif request.uri == b"/rest/running/zoning/defined-configuration": res = dict(Response={"defined-configuration": {"zone": []}}) return etree.tostring(dict_2_etree(res), pretty_print=True) return b"<html>Hello, world!</html>"
def test_set_interface_trunk_native_vlan_id(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]} ], "interfaces": { "interface": [ {"name": "ge-0/0/2"}, {"native-vlan-id": "2996"}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int002 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int002.xpath("name")[0].text, equal_to("ge-0/0/2")) assert_that(int002.xpath("native-vlan-id")[0].text, equal_to("2996")) self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/2"}, {"native-vlan-id": {XML_ATTRIBUTES: {"operation": "delete"}}}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/2"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(0))
def test_filtering_multi_level_should_not_return_siblings(self): content = dict_2_etree({ "data": { "configuration": { "interfaces": { "interface": [{ "name": "irb" }, { "unit": { "name": "123" } }] } } } }) content_filter = dict_2_etree({ "filter": { "configuration": { "interfaces": { "interface": { "name": "irb", "unit": { "name": "456" } } } } } }) filter_content(content, content_filter) assert_that( content.xpath("//data/configuration/interfaces/interface/unit"), has_length(0))
def connectionMade(self): self.logger.info("Connected, sending <hello>") self.session_count += 1 self.say( dict_2_etree({ "hello": [{ "session-id": str(self.session_count) }, { "capabilities": [{ "capability": cap.get_url() } for cap in self.capabilities] }] }))
def get_interface(self, name): result = self.nc.get_config(source="running", filter=dict_2_etree({ "filter": { "configuration": { "interfaces": { "interface": { "name": name } } } } })) if len(result.xpath("data/configuration")) == 0: return None return result.xpath("data/configuration/interfaces/interface")[0]
def test_vlan_configuration_merging(self): self.edit({ "vlans": { "vlan": [ {"name": "VLAN2999"}, {"vlan-id": "2995"} ]}}) self.edit({ "vlans": { "vlan": [ {"name": "VLAN2999"}, {"description": "shizzle"} ]}}) self.nc.commit() self.edit({ "vlans": { "vlan": [ {"name": "VLAN2999"}, {"vlan-id": "2996"}, {"description": {XML_ATTRIBUTES: {"operation": "delete"}}} ]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(1)) vlan2995 = result.xpath("data/configuration/vlans/vlan")[0] assert_that(vlan2995.xpath("name")[0].text, equal_to("VLAN2999")) assert_that(vlan2995.xpath("description"), has_length(0)) assert_that(vlan2995.xpath("vlan-id")[0].text, equal_to("2996")) self.cleanup(vlan("VLAN2999"))
def test_locking_fails_if_changes_are_being_made(self): nc2 = self.create_client() try: self.nc.edit_config(target='candidate', config=dict_2_etree({ "config": { "configuration": { "vlans": { "vlan": [ {"name": "VLAN2999"}, {"description": "WHAAT"} ] } } }})) with self.assertRaises(RPCError): with nc2.locked(target='candidate'): self.fail('Should not be able to lock an edited configuration') finally: self.nc.discard_changes() nc2.close_session()
def get_interface(self, name): result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": name}}}}})) if len(result.xpath("data/configuration")) == 0: return None return result.xpath("data/configuration/interfaces/interface")[0]
def test_create_aggregated_port(self): self.edit({ "interfaces": { "interface": [ {"name": "ae1"}, {"description": "This is a Greg hated"}]}}) self.nc.commit() ae1 = self.get_interface("ae1") assert_that(ae1.xpath("*"), has_length(2)) assert_that(ae1.xpath("description")[0].text, is_("This is a Greg hated")) self.edit({ "interfaces": { "interface": [ {"name": "ae1"}, {"description": {XML_ATTRIBUTES: {"operation": "delete"}}}, {"aggregated-ether-options": { "link-speed": "10g", "auto-negotiation": {}, "lacp": { "active": {}, "periodic": "slow"}}}]}}) self.nc.commit() ae1 = self.get_interface("ae1") assert_that(ae1.xpath("*"), has_length(2)) assert_that(ae1.xpath("aggregated-ether-options/*"), has_length(3)) assert_that(ae1.xpath("aggregated-ether-options/link-speed")[0].text, is_("10g")) assert_that(ae1.xpath("aggregated-ether-options/auto-negotiation"), has_length(1)) assert_that(ae1.xpath("aggregated-ether-options/lacp/*"), has_length(2)) assert_that(ae1.xpath("aggregated-ether-options/lacp/active"), has_length(1)) assert_that(ae1.xpath("aggregated-ether-options/lacp/periodic")[0].text, is_("slow")) self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ae1"}, {"aggregated-ether-options": { "link-speed": {XML_ATTRIBUTES: {"operation": "delete"}}, "auto-negotiation": {XML_ATTRIBUTES: {"operation": "delete"}}, "lacp": { "active": {XML_ATTRIBUTES: {"operation": "delete"}}, "periodic": "slow"}}}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { self.PORT_MODE_TAG: "trunk", "vlan": [ {"members": "2995"}, {"members": "2997"}]}}}]}]}}) self.nc.commit() ae1 = self.get_interface("ae1") assert_that(ae1.xpath("*"), has_length(3)) assert_that(ae1.xpath("aggregated-ether-options/*"), has_length(1)) assert_that(ae1.xpath("aggregated-ether-options/lacp/periodic")[0].text, is_("slow")) assert_that(ae1.xpath("unit/family/ethernet-switching/vlan/members"), has_length(2)) self.cleanup(vlan("VLAN2995"), vlan("VLAN2997"), interface("ae1")) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ae1"}}}}})) assert_that(result.xpath("configuration/interfaces"), has_length(0))
def commit_results_error_to_response(commit_results_error): return Response(dict_2_etree({'commit-results': [error_to_rpcerror_dict(e) for e in commit_results_error.netconf_errors]}))
def error_to_response(error): return Response(dict_2_etree(error_to_rpcerror_dict(error)))
def errors_to_response(errors): return Response([dict_2_etree(error_to_rpcerror_dict(error)) for error in errors])
def test_create_aggregated_port(self): self.edit({ "interfaces": { "interface": [ {"name": "ae1"}, {"description": "This is a Greg hated"}]}}) self.nc.commit() ae1 = self.get_interface("ae1") assert_that(ae1.xpath("*"), has_length(2)) assert_that(ae1.xpath("description")[0].text, is_("This is a Greg hated")) self.edit({ "interfaces": { "interface": [ {"name": "ae1"}, {"description": {XML_ATTRIBUTES: {"operation": "delete"}}}, {"aggregated-ether-options": { "link-speed": "10g", "auto-negotiation": {}, "lacp": { "active": {}, "periodic": "slow"}}}]}}) self.nc.commit() ae1 = self.get_interface("ae1") assert_that(ae1.xpath("*"), has_length(2)) assert_that(ae1.xpath("aggregated-ether-options/*"), has_length(3)) assert_that(ae1.xpath("aggregated-ether-options/link-speed")[0].text, is_("10g")) assert_that(ae1.xpath("aggregated-ether-options/auto-negotiation"), has_length(1)) assert_that(ae1.xpath("aggregated-ether-options/lacp/*"), has_length(2)) assert_that(ae1.xpath("aggregated-ether-options/lacp/active"), has_length(1)) assert_that(ae1.xpath("aggregated-ether-options/lacp/periodic")[0].text, is_("slow")) self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ae1"}, {"aggregated-ether-options": { "link-speed": {XML_ATTRIBUTES: {"operation": "delete"}}, "auto-negotiation": {XML_ATTRIBUTES: {"operation": "delete"}}, "lacp": { "active": {XML_ATTRIBUTES: {"operation": "delete"}}, "periodic": "slow"}}}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk", "vlan": [ {"members": "2995"}, {"members": "2997"}]}}}]}]}}) self.nc.commit() ae1 = self.get_interface("ae1") assert_that(ae1.xpath("*"), has_length(3)) assert_that(ae1.xpath("aggregated-ether-options/*"), has_length(1)) assert_that(ae1.xpath("aggregated-ether-options/lacp/periodic")[0].text, is_("slow")) assert_that(ae1.xpath("unit/family/ethernet-switching/vlan/members"), has_length(2)) self.cleanup(vlan("VLAN2995"), vlan("VLAN2997"), interface("ae1")) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ae1"}}}}})) assert_that(result.xpath("configuration/interfaces"), has_length(0))
def errors_to_response(errors): return Response( [dict_2_etree(error_to_rpcerror_dict(error)) for error in errors])
def test_trunk_mode(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN2995"}, {"vlan-id": "2995"}]}, {"vlan": [ {"name": "VLAN2996"}, {"vlan-id": "2996"}]}, {"vlan": [ {"name": "VLAN2997"}, {"vlan-id": "2997"}]}, ], "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "2996"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk", "vlan": [ {"members": "2995"}, {"members": "2997"}, ]}}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("name")[0].text, equal_to("ge-0/0/3")) assert_that(int003.xpath("native-vlan-id")[0].text, equal_to("2996")) assert_that(int003.xpath("unit/family/ethernet-switching/*"), has_length(2)) assert_that(int003.xpath("unit/family/ethernet-switching/interface-mode")[0].text, equal_to("trunk")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members"), has_length(2)) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members")[0].text, equal_to("2995")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members")[1].text, equal_to("2997")) self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "vlan": [ {"members": {XML_TEXT: "2995", XML_ATTRIBUTES: {"operation": "delete"}}}, ]}}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members"), has_length(1)) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members")[0].text, equal_to("2997")) self.cleanup(vlan("VLAN2995"), vlan("VLAN2996"), vlan("VLAN2997"), interface("ge-0/0/3", ["interface-mode", "vlan"])) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))
def test_passing_from_trunk_mode_to_access_gets_rid_of_stuff_in_trunk_mode(self): self.edit({ "vlans": [ {"vlan": [ {"name": "VLAN1100"}, {"vlan-id": "1100"}]}, {"vlan": [ {"name": "VLAN1200"}, {"vlan-id": "1200"}]}, {"vlan": [ {"name": "VLAN1300"}, {"vlan-id": "1300"}]}, {"vlan": [ {"name": "VLAN1400"}, {"vlan-id": "1400"}]}, ]}) self.nc.commit() self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"native-vlan-id": "1200"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "trunk", "vlan": [ {"members": "1100"}, {"members": "1300"}, {"members": "1400"}, ]}}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) assert_that(result.xpath("data/configuration/interfaces/interface"), has_length(1)) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("native-vlan-id")[0].text, equal_to("1200")) assert_that(int003.xpath("unit/family/ethernet-switching/interface-mode")[0].text, equal_to("trunk")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members"), has_length(3)) self.edit({ "interfaces": { "interface": [ {"name": "ge-0/0/3"}, {"unit": [ {"name": "0"}, {"family": { "ethernet-switching": { "interface-mode": "access" }}}]}]}}) self.nc.commit() result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"interfaces": {"interface": {"name": "ge-0/0/3"}}}} })) int003 = result.xpath("data/configuration/interfaces/interface")[0] assert_that(int003.xpath("native-vlan-id"), has_length(0)) assert_that(int003.xpath("unit/family/ethernet-switching/interface-mode")[0].text, equal_to("access")) assert_that(int003.xpath("unit/family/ethernet-switching/vlan/members"), has_length(0)) self.cleanup(vlan("VLAN1100"), vlan("VLAN1200"), vlan("VLAN1300"), vlan("VLAN1400"), interface("ge-0/0/3", ["interface-mode", "vlan"])) result = self.nc.get_config(source="running", filter=dict_2_etree({"filter": { "configuration": {"vlans": {}}} })) assert_that(result.xpath("data/configuration/vlans/vlan"), has_length(0))