Refactoring to persistence connection BGP, factory, reload, save, showrun modules (#43534)

* Refactoring to persistence connection BGP, factory, reload, save, showrun modules

* Refactoring methods from Util to module file

* Removing BGP Utility methods

* Adding to errors that need to be ignored
This commit is contained in:
Anil Kumar Muraleedharan 2018-08-03 18:10:24 +05:30 committed by Nathaniel Case
parent 32c01644d4
commit 119376a685
8 changed files with 1072 additions and 1114 deletions

View file

@ -184,6 +184,8 @@ def run_cnos_commands(module, commands, check_rc=True):
# Exception in Exceptions
if 'VLAN_ACCESS_MAP' in errMsg:
return retVal + '<<' + errMsg + '\n'
if 'confederation identifier' in errMsg:
return retVal + '<<' + errMsg + '\n'
# Add more here if required
retVal = retVal + '<< ' + 'Error-101 ' + errMsg + '\n'
return str(retVal)
@ -1361,836 +1363,6 @@ def portChannelConfig(module, prompt, answer):
# EOM
def routerConfig(
obj, deviceType, prompt, timeout, protocol, asNum, routerArg1,
routerArg2, routerArg3, routerArg4, routerArg5, routerArg6, routerArg7,
routerArg8):
retVal = ""
# Wait time to get response from server
timeout = timeout
if(protocol == "bgp"):
# bgp config command happens here.
command = "routing-protocol bgp "
value = checkSanityofVariable(deviceType, "bgp_as_number", asNum)
if(value == "ok"):
# BGP command happens here. It creates if not present
command = command + asNum + "\n"
# debugOutput(command)
retVal = waitForDeviceResponse(
command, "(config-router)#", timeout, obj)
retVal = retVal + bgpConfig(
obj, deviceType, "(config-router)#", timeout, routerArg1,
routerArg2, routerArg3, routerArg4, routerArg5, routerArg6,
routerArg7, routerArg8)
else:
retVal = "Error-176"
elif(protocol == "ospf"):
retVal = "Command Value is Not supported as of now"
else:
retVal = "Error-177"
return retVal
# EOM
def bgpNeighborAFConfig(
obj, deviceType, prompt, timeout, bgpNeighborAFArg1, bgpNeighborAFArg2,
bgpNeighborAFArg3):
retVal = ""
command = ""
timeout = timeout
if(bgpNeighborAFArg1 == "allowas-in"):
command = command + bgpNeighborAFArg1 + " "
if(bgpNeighborAFArg2 is not None):
value = checkSanityofVariable(
deviceType, "bgp_neighbor_af_occurances", bgpNeighborAFArg2)
if(value == "ok"):
command = command + bgpNeighborAFArg2
else:
retVal = "Error-325"
return retVal
else:
command = command
elif(bgpNeighborAFArg1 == "default-originate"):
command = command + bgpNeighborAFArg1 + " "
if(bgpNeighborAFArg2 is not None and bgpNeighborAFArg2 == "route-map"):
command = command + bgpNeighborAFArg2 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_af_routemap", bgpNeighborAFArg2)
if(value == "ok"):
command = command + bgpNeighborAFArg3
else:
retVal = "Error-324"
return retVal
elif(bgpNeighborAFArg1 == "filter-list"):
command = command + bgpNeighborAFArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_af_filtername", bgpNeighborAFArg2)
if(value == "ok"):
command = command + bgpNeighborAFArg2 + " "
if(bgpNeighborAFArg3 == "in" or bgpNeighborAFArg3 == "out"):
command = command + bgpNeighborAFArg3
else:
retVal = "Error-323"
return retVal
else:
retVal = "Error-322"
return retVal
elif(bgpNeighborAFArg1 == "maximum-prefix"):
command = command + bgpNeighborAFArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_af_maxprefix", bgpNeighborAFArg2)
if(value == "ok"):
command = command + bgpNeighborAFArg2 + " "
if(bgpNeighborAFArg3 is not None):
command = command + bgpNeighborAFArg3
else:
command = command.strip()
else:
retVal = "Error-326"
return retVal
elif(bgpNeighborAFArg1 == "next-hop-self"):
command = command + bgpNeighborAFArg1
elif(bgpNeighborAFArg1 == "prefix-list"):
command = command + bgpNeighborAFArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_af_prefixname", bgpNeighborAFArg2)
if(value == "ok"):
command = command + bgpNeighborAFArg2 + " "
if(bgpNeighborAFArg3 == "in" or bgpNeighborAFArg3 == "out"):
command = command + bgpNeighborAFArg3
else:
retVal = "Error-321"
return retVal
else:
retVal = "Error-320"
return retVal
elif(bgpNeighborAFArg1 == "route-map"):
command = command + bgpNeighborAFArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_af_routemap", bgpNeighborAFArg2)
if(value == "ok"):
command = command + bgpNeighborAFArg2
else:
retVal = "Error-319"
return retVal
elif(bgpNeighborAFArg1 == "route-reflector-client"):
command = command + bgpNeighborAFArg1
elif(bgpNeighborAFArg1 == "send-community"):
command = command + bgpNeighborAFArg1 + " "
if(bgpNeighborAFArg2 is not None and bgpNeighborAFArg2 == "extended"):
command = command + bgpNeighborAFArg2
else:
command = command
elif(bgpNeighborAFArg1 == "soft-reconfiguration"):
command = command + bgpNeighborAFArg1 + " inbound"
elif(bgpNeighborAFArg1 == "unsuppress-map"):
command = command + bgpNeighborAFArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_af_routemap", bgpNeighborAFArg2)
if(value == "ok"):
command = command + bgpNeighborAFArg2
else:
retVal = "Error-318"
return retVal
else:
retVal = "Error-317"
return retVal
command = command + "\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, prompt, timeout, obj)
command = "exit \n"
retVal = retVal + \
waitForDeviceResponse(
command, "(config-router-neighbor)#", timeout, obj)
return retVal
# EOM
def bgpNeighborConfig(
obj, deviceType, prompt, timeout, bgpNeighborArg1, bgpNeighborArg2,
bgpNeighborArg3, bgpNeighborArg4, bgpNeighborArg5):
retVal = ""
command = ""
timeout = timeout
if(bgpNeighborArg1 == "address-family"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_address_family", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2 + " unicast \n"
# debugOutput(command)
retVal = waitForDeviceResponse(
command, "(config-router-neighbor-af)#", timeout, obj)
retVal = retVal + bgpNeighborAFConfig(
obj, deviceType, "(config-router-neighbor-af)#", timeout,
bgpNeighborArg3, bgpNeighborArg4, bgpNeighborArg5)
return retVal
else:
retVal = "Error-316"
return retVal
elif(bgpNeighborArg1 == "advertisement-interval"):
command = command + bgpNeighborArg1
elif(bgpNeighborArg1 == "bfd"):
command = command + bgpNeighborArg1 + " "
if(bgpNeighborArg2 is not None and bgpNeighborArg2 == "mutihop"):
command = command + bgpNeighborArg2
else:
command = command
elif(bgpNeighborArg1 == "connection-retry-time"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_connection_retrytime", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2
else:
retVal = "Error-315"
return retVal
elif(bgpNeighborArg1 == "description"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_description", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2
else:
retVal = "Error-314"
return retVal
elif(bgpNeighborArg1 == "disallow-infinite-holdtime"):
command = command + bgpNeighborArg1
elif(bgpNeighborArg1 == "dont-capability-negotiate"):
command = command + bgpNeighborArg1
elif(bgpNeighborArg1 == "dynamic-capability"):
command = command + bgpNeighborArg1
elif(bgpNeighborArg1 == "ebgp-multihop"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_maxhopcount", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2
else:
retVal = "Error-313"
return retVal
elif(bgpNeighborArg1 == "interface"):
command = command + bgpNeighborArg1 + " "
# TBD
elif(bgpNeighborArg1 == "local-as"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_local_as", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2 + " "
if(bgpNeighborArg3 is not None and
bgpNeighborArg3 == "no-prepend"):
command = command + bgpNeighborArg3 + " "
if(bgpNeighborArg4 is not None and
bgpNeighborArg4 == "replace-as"):
command = command + bgpNeighborArg4 + " "
if(bgpNeighborArg5 is not None and
bgpNeighborArg5 == "dual-as"):
command = command + bgpNeighborArg5
else:
command = command.strip()
else:
command = command.strip()
else:
command = command.strip()
else:
retVal = "Error-312"
return retVal
elif(bgpNeighborArg1 == "maximum-peers"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_maxpeers", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2
else:
retVal = "Error-311"
return retVal
elif(bgpNeighborArg1 == "password"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_password", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2
else:
retVal = "Error-310"
return retVal
elif(bgpNeighborArg1 == "remove-private-AS"):
command = command + bgpNeighborArg1
elif(bgpNeighborArg1 == "timers"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_timers_Keepalive", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_timers_holdtime", bgpNeighborArg3)
if(value == "ok"):
command = command + bgpNeighborArg3
else:
retVal = "Error-309"
return retVal
else:
retVal = "Error-308"
return retVal
elif(bgpNeighborArg1 == "transport"):
command = command + bgpNeighborArg1 + " connection-mode passive "
elif(bgpNeighborArg1 == "ttl-security"):
command = command + bgpNeighborArg1 + " hops "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_ttl_hops", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2
else:
retVal = "Error-307"
return retVal
elif(bgpNeighborArg1 == "update-source"):
command = command + bgpNeighborArg1 + " "
if(bgpNeighborArg2 is not None):
value = checkSanityofVariable(
deviceType, "bgp_neighbor_update_options", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2 + " "
if(bgpNeighborArg2 == "ethernet"):
value = checkSanityofVariable(
deviceType, "bgp_neighbor_update_ethernet",
bgpNeighborArg3)
if(value == "ok"):
command = command + bgpNeighborArg3
else:
retVal = "Error-304"
return retVal
elif(bgpNeighborArg2 == "loopback"):
value = checkSanityofVariable(
deviceType, "bgp_neighbor_update_loopback",
bgpNeighborArg3)
if(value == "ok"):
command = command + bgpNeighborArg3
else:
retVal = "Error-305"
return retVal
else:
value = checkSanityofVariable(
deviceType, "bgp_neighbor_update_vlan",
bgpNeighborArg3)
if(value == "ok"):
command = command + bgpNeighborArg3
else:
retVal = "Error-306"
return retVal
else:
command = command + bgpNeighborArg2
else:
retVal = "Error-303"
return retVal
elif(bgpNeighborArg1 == "weight"):
command = command + bgpNeighborArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_neighbor_weight", bgpNeighborArg2)
if(value == "ok"):
command = command + bgpNeighborArg2
else:
retVal = "Error-302"
return retVal
else:
retVal = "Error-301"
return retVal
command = command + "\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, prompt, timeout, obj)
command = "exit \n"
retVal = retVal + \
waitForDeviceResponse(command, "(config-router)#", timeout, obj)
return retVal
# EOM
def bgpAFConfig(
obj, deviceType, prompt, timeout, bgpAFArg1, bgpAFArg2, bgpAFArg3,
bgpAFArg4, bgpAFArg5, bgpAFArg6):
retVal = ""
command = ""
timeout = timeout
if(bgpAFArg1 == "aggregate-address"):
command = command + bgpAFArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_aggregate_prefix", bgpAFArg2)
if(value == "ok"):
if(bgpAFArg2 is None):
command = command.strip()
elif(bgpAFArg2 == "as-set" or bgpAFArg2 == "summary-only"):
command = command + bgpAFArg2 + " "
if((bgpAFArg3 is not None) and (bgpAFArg2 == "as-set")):
command = command + "summary-only"
else:
retVal = "Error-297"
return retVal
else:
retVal = "Error-296"
return retVal
elif(bgpAFArg1 == "client-to-client"):
command = command + bgpAFArg1 + " reflection "
elif(bgpAFArg1 == "dampening"):
command = command + bgpAFArg1 + " "
if(bgpAFArg2 == "route-map"):
command = command + bgpAFArg2 + " "
value = checkSanityofVariable(
deviceType, "addrfamily_routemap_name", bgpAFArg3)
if(value == "ok"):
command = command + bgpAFArg3
else:
retVal = "Error-196"
return retVal
elif(bgpAFArg2 is not None):
value = checkSanityofVariable(
deviceType, "reachability_half_life", bgpAFArg2)
if(value == "ok"):
command = command + bgpAFArg2 + " "
if(bgpAFArg3 is not None):
value1 = checkSanityofVariable(
deviceType, "start_reuse_route_value", bgpAFArg3)
value2 = checkSanityofVariable(
deviceType, "start_suppress_route_value", bgpAFArg4)
value3 = checkSanityofVariable(
deviceType, "max_duration_to_suppress_route",
bgpAFArg5)
if(value1 == "ok" and value2 == "ok" and value3 == "ok"):
command = command + bgpAFArg3 + " " + bgpAFArg4 + \
" " + bgpAFArg5 + " "
if(bgpAFArg6 is not None):
value = checkSanityofVariable(
deviceType,
"unreachability_halftime_for_penalty",
bgpAFArg6)
if(value == "ok"):
command = command + bgpAFArg6
else:
retVal = "Error-295"
return retVal
else:
command = command.strip()
else:
retVal = "Error-294"
return retVal
elif(bgpAFArg1 == "distance"):
command = command + bgpAFArg1 + " "
value = checkSanityofVariable(
deviceType, "distance_external_AS", bgpAFArg2)
if(value == "ok"):
command = command + bgpAFArg2 + " "
value = checkSanityofVariable(
deviceType, "distance_internal_AS", bgpAFArg3)
if(value == "ok"):
command = command + bgpAFArg3 + " "
value = checkSanityofVariable(
deviceType, "distance_local_routes", bgpAFArg4)
if(value == "ok"):
command = command + bgpAFArg4
else:
retVal = "Error-291"
return retVal
else:
retVal = "Error-292"
return retVal
else:
retVal = "Error-293"
return retVal
elif(bgpAFArg1 == "maximum-paths"):
command = command + bgpAFArg1 + " "
value = checkSanityofVariable(deviceType, "maxpath_option", bgpAFArg2)
if(value == "ok"):
command = command + bgpAFArg2 + " "
value = checkSanityofVariable(
deviceType, "maxpath_numbers", bgpAFArg3)
if(value == "ok"):
command = command + bgpAFArg3
else:
retVal = "Error-199"
return retVal
else:
retVal = "Error-290"
return retVal
elif(bgpAFArg1 == "network"):
command = command + bgpAFArg1 + " "
if(bgpAFArg2 == "synchronization"):
command = command + bgpAFArg2
else:
value = checkSanityofVariable(
deviceType, "network_ip_prefix_with_mask", bgpAFArg2)
if(value == "ok"):
command = command + bgpAFArg2 + " "
if(bgpAFArg3 is not None and bgpAFArg3 == "backdoor"):
command = command + bgpAFArg3
elif(bgpAFArg3 is not None and bgpAFArg3 == "route-map"):
command = command + bgpAFArg3
value = checkSanityofVariable(
deviceType, "addrfamily_routemap_name", bgpAFArg4)
if(value == "ok"):
command = command + bgpAFArg4 + " "
if(bgpAFArg5 is not None and bgpAFArg5 == "backdoor"):
command = command + bgpAFArg5
else:
retVal = "Error-298"
return retVal
else:
retVal = "Error-196"
return retVal
else:
command = command.strip()
else:
value = checkSanityofVariable(
deviceType, "network_ip_prefix_value", bgpAFArg2)
if(value == "ok"):
command = command + bgpAFArg2 + " "
if(bgpAFArg3 is not None and bgpAFArg3 == "backdoor"):
command = command + bgpAFArg3
elif(bgpAFArg3 is not None and bgpAFArg3 == "route-map"):
command = command + bgpAFArg3
value = checkSanityofVariable(
deviceType, "addrfamily_routemap_name", bgpAFArg4)
if(value == "ok"):
command = command + bgpAFArg4 + " "
if(bgpAFArg5 is not None and
bgpAFArg5 == "backdoor"):
command = command + bgpAFArg5
else:
retVal = "Error-298"
return retVal
else:
retVal = "Error-196"
return retVal
elif(bgpAFArg3 is not None and bgpAFArg3 == "mask"):
command = command + bgpAFArg3
value = checkSanityofVariable(
deviceType, "network_ip_prefix_mask", bgpAFArg4)
if(value == "ok"):
command = command + bgpAFArg4 + " "
else:
retVal = "Error-299"
return retVal
else:
command = command.strip()
else:
retVal = "Error-300"
return retVal
elif(bgpAFArg1 == "nexthop"):
command = command + bgpAFArg1 + " trigger-delay critical "
value = checkSanityofVariable(
deviceType, "nexthop_crtitical_delay", bgpAFArg2)
if(value == "ok"):
command = command + bgpAFArg2 + " "
value = checkSanityofVariable(
deviceType, "nexthop_noncrtitical_delay", bgpAFArg3)
if(value == "ok"):
command = command + bgpAFArg3 + " "
else:
retVal = "Error-198"
return retVal
else:
retVal = "Error-197"
return retVal
elif(bgpAFArg1 == "redistribute"):
command = command + bgpAFArg1 + " "
value = checkSanityofVariable(
deviceType, "addrfamily_redistribute_option", bgpAFArg2)
if(value == "ok"):
if(bgpAFArg2 is not None):
command = command + bgpAFArg2 + " " + "route-map "
value = checkSanityofVariable(
deviceType, "addrfamily_routemap_name", bgpAFArg3)
if(value == "ok"):
command = command + bgpAFArg3
else:
retVal = "Error-196"
return retVal
else:
retVal = "Error-195"
return retVal
elif(bgpAFArg1 == "save" or bgpAFArg1 == "synchronization"):
command = command + bgpAFArg1
else:
retVal = "Error-194"
return retVal
command = command + "\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, prompt, timeout, obj)
command = "exit \n"
retVal = retVal + \
waitForDeviceResponse(command, "(config-router)#", timeout, obj)
return retVal
# EOM
def bgpConfig(
obj, deviceType, prompt, timeout, bgpArg1, bgpArg2, bgpArg3, bgpArg4,
bgpAgr5, bgpArg6, bgpArg7, bgpArg8):
retVal = ""
command = ""
# Wait time to get response from server
timeout = timeout
if(bgpArg1 == "address-family"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " "
value = checkSanityofVariable(
deviceType, "bgp_address_family", bgpArg2)
if(value == "ok"):
command = command + bgpArg2 + " " + "unicast \n"
debugOutput(command)
retVal = waitForDeviceResponse(
command, "(config-router-af)#", timeout, obj)
retVal = retVal + bgpAFConfig(
obj, deviceType, "(config-router-af)#", timeout,
bgpArg3, bgpArg4, bgpAgr5, bgpArg6, bgpArg7, bgpArg8)
return retVal
else:
retVal = "Error-178"
return retVal
elif(bgpArg1 == "bestpath"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " "
if(bgpArg2 == "always-compare-med"):
# debugOutput(bgpArg2)
command = command + bgpArg2
elif(bgpArg2 == "compare-confed-aspath"):
# debugOutput(bgpArg2)
command = command + bgpArg2
elif(bgpArg2 == "compare-routerid"):
# debugOutput(bgpArg2)
command = command + bgpArg2
elif(bgpArg2 == "dont-compare-originator-id"):
# debugOutput(bgpArg2)
command = command + bgpArg2
elif(bgpArg2 == "tie-break-on-age"):
# debugOutput(bgpArg2)
command = command + bgpArg2
elif(bgpArg2 == "as-path"):
# debugOutput(bgpArg2)
command = command + bgpArg2 + " "
if(bgpArg3 == "ignore" or bgpArg3 == "multipath-relax"):
command = command + bgpArg3
else:
retVal = "Error-179"
return retVal
elif(bgpArg2 == "med"):
# debugOutput(bgpArg2)
command = command + bgpArg2 + " "
if(bgpArg3 == "confed" or
bgpArg3 == "missing-as-worst" or
bgpArg3 == "non-deterministic" or
bgpArg3 == "remove-recv-med" or
bgpArg3 == "remove-send-med"):
command = command + bgpArg3
else:
retVal = "Error-180"
return retVal
else:
retVal = "Error-181"
return retVal
elif(bgpArg1 == "bgp"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " as-local-count "
value = checkSanityofVariable(
deviceType, "bgp_bgp_local_count", bgpArg2)
if(value == "ok"):
command = command + bgpArg2
else:
retVal = "Error-182"
return retVal
elif(bgpArg1 == "cluster-id"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " "
value = checkSanityofVariable(deviceType, "cluster_id_as_ip", bgpArg2)
if(value == "ok"):
command = command + bgpArg2
else:
value = checkSanityofVariable(
deviceType, "cluster_id_as_number", bgpArg2)
if(value == "ok"):
command = command + bgpArg2
else:
retVal = "Error-183"
return retVal
elif(bgpArg1 == "confederation"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " "
if(bgpArg2 == "identifier"):
value = checkSanityofVariable(
deviceType, "confederation_identifier", bgpArg3)
if(value == "ok"):
command = command + " " + bgpArg2 + " " + bgpArg3
else:
retVal = "Error-184"
return retVal
elif(bgpArg2 == "peers"):
value = checkSanityofVariable(
deviceType, "confederation_peers_as", bgpArg3)
if(value == "ok"):
command = command + " " + bgpArg2 + " " + bgpArg3
else:
retVal = "Error-185"
return retVal
else:
retVal = "Error-186"
return retVal
elif(bgpArg1 == "enforce-first-as"):
# debugOutput(bgpArg1)
command = command + bgpArg1
elif(bgpArg1 == "fast-external-failover"):
# debugOutput(bgpArg1)
command = command + bgpArg1
elif(bgpArg1 == "graceful-restart"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " stalepath-time "
value = checkSanityofVariable(
deviceType, "stalepath_delay_value", bgpArg2)
if(value == "ok"):
command = command + bgpArg2
else:
retVal = "Error-187"
return retVal
elif(bgpArg1 == "graceful-restart-helper"):
# debugOutput(bgpArg1)
command = command + bgpArg1
elif(bgpArg1 == "log-neighbor-changes"):
# debugOutput(bgpArg1)
command = command + bgpArg1
elif(bgpArg1 == "maxas-limit"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " "
value = checkSanityofVariable(deviceType, "maxas_limit_as", bgpArg2)
if(value == "ok"):
command = command + bgpArg2
else:
retVal = "Error-188"
return retVal
elif(bgpArg1 == "neighbor"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " "
value = checkSanityofVariable(
deviceType, "neighbor_ipaddress", bgpArg2)
# retVal = "Error-102"
# return retVal
if(value == "ok"):
command = command + bgpArg2
if(bgpArg3 is not None):
command = command + " remote-as "
value = checkSanityofVariable(
deviceType, "neighbor_as", bgpArg3)
if(value == "ok"):
command = command + bgpArg3 + "\n"
# debugOutput(command)
retVal = waitForDeviceResponse(
command, "(config-router-neighbor)#", timeout, obj)
retVal = retVal + bgpNeighborConfig(
obj, deviceType, "(config-router-neighbor)#",
timeout, bgpArg4, bgpAgr5, bgpArg6, bgpArg7, bgpArg8)
return retVal
else:
retVal = "Error-189"
return retVal
elif(bgpArg1 == "router-id"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " "
value = checkSanityofVariable(deviceType, "router_id", bgpArg2)
if(value == "ok"):
command = command + bgpArg2
else:
retVal = "Error-190"
return retVal
elif(bgpArg1 == "shutdown"):
# debugOutput(bgpArg1)
command = command + bgpArg1
elif(bgpArg1 == "synchronization"):
# debugOutput(bgpArg1)
command = command + bgpArg1
elif(bgpArg1 == "timers"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " bgp "
value = checkSanityofVariable(
deviceType, "bgp_keepalive_interval", bgpArg2)
if(value == "ok"):
command = command + bgpArg2
else:
retVal = "Error-191"
return retVal
if(bgpArg3 is not None):
value = checkSanityofVariable(deviceType, "bgp_holdtime", bgpArg3)
if(value == "ok"):
command = command + " " + bgpArg3
else:
retVal = "Error-192"
return retVal
else:
retVal = "Error-192"
return retVal
elif(bgpArg1 == "vrf"):
# debugOutput(bgpArg1)
command = command + bgpArg1 + " default"
else:
# debugOutput(bgpArg1)
retVal = "Error-192"
return retVal
command = command + "\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, prompt, timeout, obj)
# Come back to config mode
command = "exit \n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "(config)#", timeout, obj)
return retVal
# EOM
def vlanConfig(module, prompt, answer):
retVal = ''
@ -3657,7 +2829,7 @@ def checkLong(s):
def debugOutput(command):
f = open('debugOuput.txt', 'a')
f = open('debugOutput.txt', 'a')
f.write(str(command)) # python will convert \n to os.linesep
f.close() # you can omit in most cases as the destructor will call it
# EOM

File diff suppressed because it is too large Load diff

View file

@ -33,22 +33,26 @@ DOCUMENTATION = '''
---
module: cnos_factory
author: "Anil Kumar Muraleedharan (@amuraleedhar)"
short_description: Reset the switch's startup configuration to default (factory) on devices running Lenovo CNOS
short_description: Reset the switch startup configuration to default (factory)
on devices running Lenovo CNOS.
description:
- This module allows you to reset a switch's startup configuration. The method provides a way to reset the
startup configuration to its factory settings. This is helpful when you want to move the switch to another
topology as a new network device.
This module uses SSH to manage network device configuration.
The results of the operation can be viewed in results directory.
For more information about this module from Lenovo and customizing it usage for your
use cases, please visit U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_factory.html)
- This module allows you to reset a switch's startup configuration. The
method provides a way to reset the startup configuration to its factory
settings. This is helpful when you want to move the switch to another
topology as a new network device. This module uses SSH to manage network
device configuration. The result of the operation can be viewed in results
directory.
For more information about this module and customizing it usage
for your use cases, please visit
U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_factory.html)
version_added: "2.3"
extends_documentation_fragment: cnos
options: {}
'''
EXAMPLES = '''
Tasks : The following are examples of using the module cnos_reload. These are written in the main.yml file of the tasks directory.
Tasks : The following are examples of using the module cnos_reload. These are
written in the main.yml file of the tasks directory.
---
- name: Test Reset to factory
cnos_factory:
@ -68,11 +72,6 @@ msg:
'''
import sys
try:
import paramiko
HAS_PARAMIKO = True
except ImportError:
HAS_PARAMIKO = False
import time
import socket
import array
@ -99,44 +98,11 @@ def main():
deviceType=dict(required=True),),
supports_check_mode=False)
username = module.params['username']
password = module.params['password']
enablePassword = module.params['enablePassword']
cliCommand = "save erase \n"
command = 'write erase'
outputfile = module.params['outputfile']
hostIP = module.params['host']
deviceType = module.params['deviceType']
output = ""
if not HAS_PARAMIKO:
module.fail_json(msg='paramiko is required for this module')
# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()
# Automatically add untrusted hosts (make sure okay for security policy in your environment)
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# initiate SSH connection with the switch
remote_conn_pre.connect(hostIP, username=username, password=password)
time.sleep(2)
# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()
time.sleep(2)
# Enable and enter configure terminal then send command
output = output + cnos.waitForDeviceResponse("\n", ">", 2, remote_conn)
output = output + cnos.enterEnableModeForDevice(enablePassword, 3, remote_conn)
# Make terminal length = 0
output = output + cnos.waitForDeviceResponse("terminal length 0\n", "#", 2, remote_conn)
# cnos.debugOutput(cliCommand)
# Send the CLi command
output = output + cnos.waitForDeviceResponse(cliCommand, "[n]", 2, remote_conn)
output = output + cnos.waitForDeviceResponse("y" + "\n", "#", 2, remote_conn)
output = ''
cmd = [{'command': command, 'prompt': '[n]', 'answer': 'y'}]
output = output + str(cnos.run_cnos_commands(module, cmd))
# Save it into the file
file = open(outputfile, "a")
@ -145,7 +111,8 @@ def main():
errorMsg = cnos.checkOutputForError(output)
if(errorMsg is None):
module.exit_json(changed=True, msg="Switch Startup Config is Reset to factory settings ")
module.exit_json(changed=True,
msg="Switch Startup Config is Reset to Factory settings")
else:
module.fail_json(msg=errorMsg)

View file

@ -35,19 +35,22 @@ module: cnos_reload
author: "Anil Kumar Muraleedharan (@amuraleedhar)"
short_description: Perform switch restart on devices running Lenovo CNOS
description:
- This module allows you to restart the switch using the current startup configuration.
The module is usually invoked after the running configuration has been saved over the startup configuration.
- This module allows you to restart the switch using the current startup
configuration. The module is usually invoked after the running
configuration has been saved over the startup configuration.
This module uses SSH to manage network device configuration.
The results of the operation can be viewed in results directory.
For more information about this module from Lenovo and customizing it usage for your
use cases, please visit U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_reload.html)
For more information about this module and customizing it usage
for your use cases, please visit
U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_reload.html)
version_added: "2.3"
extends_documentation_fragment: cnos
options: {}
'''
EXAMPLES = '''
Tasks : The following are examples of using the module cnos_reload. These are written in the main.yml file of the tasks directory.
Tasks : The following are examples of using the module cnos_reload. These are
written in the main.yml file of the tasks directory.
---
- name: Test Reload
cnos_reload:
@ -67,11 +70,6 @@ msg:
'''
import sys
try:
import paramiko
HAS_PARAMIKO = True
except ImportError:
HAS_PARAMIKO = False
import time
import socket
import array
@ -98,44 +96,12 @@ def main():
deviceType=dict(required=True),),
supports_check_mode=False)
username = module.params['username']
password = module.params['password']
enablePassword = module.params['enablePassword']
cliCommand = "reload \n"
command = 'reload'
outputfile = module.params['outputfile']
hostIP = module.params['host']
deviceType = module.params['deviceType']
output = ""
if not HAS_PARAMIKO:
module.fail_json(msg='paramiko is required for this module')
# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()
# Automatically add untrusted hosts (make sure okay for security policy in your environment)
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# initiate SSH connection with the switch
remote_conn_pre.connect(hostIP, username=username, password=password)
time.sleep(2)
# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()
time.sleep(2)
# Enable and then send command
output = output + cnos.waitForDeviceResponse("\n", ">", 2, remote_conn)
output = output + cnos.enterEnableModeForDevice(enablePassword, 3, remote_conn)
# Make terminal length = 0
output = output + cnos.waitForDeviceResponse("terminal length 0\n", "#", 2, remote_conn)
# Send the CLi command
output = output + cnos.waitForDeviceResponse(cliCommand, "(y/n):", 2, remote_conn)
# Send the Confirmation y
output = output + cnos.waitForDeviceResponse("y\n", "#", 2, remote_conn)
output = ''
cmd = [{'command': command, 'prompt': 'reboot system? (y/n): ',
'answer': 'y'}]
output = output + str(cnos.run_cnos_commands(module, cmd))
# Save it into the file
file = open(outputfile, "a")
@ -144,7 +110,8 @@ def main():
errorMsg = cnos.checkOutputForError(output)
if(errorMsg in "Device Response Timed out"):
module.exit_json(changed=True, msg="Device is Reloading. Please wait...")
module.exit_json(changed=True,
msg="Device is Reloading. Please wait...")
else:
module.fail_json(msg=errorMsg)

View file

@ -33,22 +33,26 @@ DOCUMENTATION = '''
---
module: cnos_save
author: "Anil Kumar Muraleedharan (@amuraleedhar)"
short_description: Save the running configuration as the startup configuration on devices running Lenovo CNOS
short_description: Save the running configuration as the startup configuration
on devices running Lenovo CNOS
description:
- This module allows you to copy the running configuration of a switch over its startup configuration.
It is recommended to use this module shortly after any major configuration changes so they persist after
a switch restart. This module uses SSH to manage network device configuration.
- This module allows you to copy the running configuration of a switch over
its startup configuration. It is recommended to use this module shortly
after any major configuration changes so they persist after a switch
restart. This module uses SSH to manage network device configuration.
The results of the operation will be placed in a directory named 'results'
that must be created by the user in their local directory to where the playbook is run.
For more information about this module from Lenovo and customizing it usage for your
use cases, please visit U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_save.html)
that must be created by the user in their local directory to where the
playbook is run. For more information about this module from Lenovo and
customizing it usage for your use cases, please visit
U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_save.html)
version_added: "2.3"
extends_documentation_fragment: cnos
options: {}
'''
EXAMPLES = '''
Tasks : The following are examples of using the module cnos_save. These are written in the main.yml file of the tasks directory.
Tasks : The following are examples of using the module cnos_save. These are
written in the main.yml file of the tasks directory.
---
- name: Test Save
cnos_save:
@ -68,11 +72,6 @@ msg:
'''
import sys
try:
import paramiko
HAS_PARAMIKO = True
except ImportError:
HAS_PARAMIKO = False
import time
import socket
import array
@ -99,42 +98,11 @@ def main():
deviceType=dict(required=True),),
supports_check_mode=False)
username = module.params['username']
password = module.params['password']
enablePassword = module.params['enablePassword']
cliCommand = "save memory \n"
command = 'write memory'
outputfile = module.params['outputfile']
hostIP = module.params['host']
deviceType = module.params['deviceType']
output = ""
if not HAS_PARAMIKO:
module.fail_json(msg='paramiko is required for this module')
# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()
# Automatically add untrusted hosts (make sure okay for security policy in your environment)
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# initiate SSH connection with the switch
remote_conn_pre.connect(hostIP, username=username, password=password)
time.sleep(2)
# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()
time.sleep(2)
# Enable and then send command
output = output + cnos.waitForDeviceResponse("\n", ">", 2, remote_conn)
output = output + cnos.enterEnableModeForDevice(enablePassword, 3, remote_conn)
# Make terminal length = 0
output = output + cnos.waitForDeviceResponse("terminal length 0\n", "#", 2, remote_conn)
# cnos.debugOutput(cliCommand)
# Send the CLi command
output = output + cnos.waitForDeviceResponse(cliCommand, "#", 2, remote_conn)
output = ''
cmd = [{'command': command, 'prompt': None, 'answer': None}]
output = output + str(cnos.run_cnos_commands(module, cmd))
# Save it into the file
file = open(outputfile, "a")
@ -143,7 +111,8 @@ def main():
errorMsg = cnos.checkOutputForError(output)
if(errorMsg is None):
module.exit_json(changed=True, msg="Switch Running Config is Saved to Startup Config ")
module.exit_json(changed=True,
msg="Switch Running Config is Saved to Startup Config ")
else:
module.fail_json(msg=errorMsg)

View file

@ -33,22 +33,25 @@ DOCUMENTATION = '''
---
module: cnos_showrun
author: "Anil Kumar Muraleedharan (@amuraleedhar)"
short_description: Collect the current running configuration on devices running Lenovo CNOS
short_description: Collect the current running configuration on devices running on CNOS
description:
- This module allows you to view the switch running configuration. It executes the display running-config CLI
command on a switch and returns a file containing the current running configuration of the target network
- This module allows you to view the switch running configuration. It
executes the display running-config CLI command on a switch and returns a
file containing the current running configuration of the target network
device. This module uses SSH to manage network device configuration.
The results of the operation will be placed in a directory named 'results'
that must be created by the user in their local directory to where the playbook is run.
For more information about this module from Lenovo and customizing it usage for your
use cases, please visit U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_showrun.html)
that must be created by the user in their local directory to where the
playbook is run. For more information about this module from Lenovo and
customizing it usage for your use cases, please visit
U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_showrun.html)
version_added: "2.3"
extends_documentation_fragment: cnos
options: {}
'''
EXAMPLES = '''
Tasks : The following are examples of using the module cnos_showrun. These are written in the main.yml file of the tasks directory.
Tasks : The following are examples of using the module cnos_showrun. These are
written in the main.yml file of the tasks directory.
---
- name: Run show running-config
cnos_showrun:
@ -69,11 +72,6 @@ msg:
'''
import sys
try:
import paramiko
HAS_PARAMIKO = True
except ImportError:
HAS_PARAMIKO = False
import time
import socket
import array
@ -99,41 +97,11 @@ def main():
enablePassword=dict(required=False, no_log=True),),
supports_check_mode=False)
username = module.params['username']
password = module.params['password']
enablePassword = module.params['enablePassword']
cliCommand = "display running-config"
command = 'show running-config'
outputfile = module.params['outputfile']
hostIP = module.params['host']
output = ""
if not HAS_PARAMIKO:
module.fail_json(msg='paramiko is required for this module')
# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()
# Automatically add untrusted hosts (make sure okay for security policy in your environment)
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# initiate SSH connection with the switch
remote_conn_pre.connect(hostIP, username=username, password=password)
time.sleep(2)
# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()
time.sleep(2)
# Enable and then send command
output = output + cnos.waitForDeviceResponse("\n", ">", 2, remote_conn)
output = output + cnos.enterEnableModeForDevice(enablePassword, 3, remote_conn)
# Make terminal length = 0
output = output + cnos.waitForDeviceResponse("terminal length 0\n", "#", 2, remote_conn)
# Send the CLi command
output = output + cnos.waitForDeviceResponse(cliCommand + "\n", "#", 2, remote_conn)
output = ''
cmd = [{'command': command, 'prompt': None, 'answer': None}]
output = output + str(cnos.run_cnos_commands(module, cmd))
# Save it into the file
file = open(outputfile, "a")
file.write(output)
@ -141,7 +109,8 @@ def main():
errorMsg = cnos.checkOutputForError(output)
if(errorMsg is None):
module.exit_json(changed=True, msg="Running Configuration saved in file ")
module.exit_json(changed=True,
msg="Running Configuration saved in file ")
else:
module.fail_json(msg=errorMsg)

View file

@ -0,0 +1,24 @@
!
router bgp 33
router-id 1.2.3.4
bestpath always-compare-med
cluster-id 1.2.3.4
confederation identifier 333
enforce-first-as
bgp as-local-count 33
bestpath compare-confed-aspath
maxas-limit 333
graceful-restart-helper
graceful-restart stalepath-time 333
timers bgp 333 3333
address-family ipv4 unicast
synchronization
network 0.0.0.0 backdoor
network 0.0.0.0 backdoor
dampening 13 233 333 15 33
neighbor 10.241.107.40 remote-as 13
bfd
address-family ipv4 unicast
next-hop-self
!

View file

@ -0,0 +1,99 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import json
from ansible.compat.tests.mock import patch
from ansible.modules.network.cnos import cnos_bgp
from units.modules.utils import set_module_args
from .cnos_module import TestCnosModule, load_fixture
class TestCnosBgpModule(TestCnosModule):
module = cnos_bgp
def setUp(self):
super(TestCnosBgpModule, self).setUp()
self.mock_run_cnos_commands = patch('ansible.module_utils.network.cnos.cnos.run_cnos_commands')
self.run_cnos_commands = self.mock_run_cnos_commands.start()
def tearDown(self):
super(TestCnosBgpModule, self).tearDown()
self.mock_run_cnos_commands.stop()
def load_fixtures(self, commands=None, transport='cli'):
self.run_cnos_commands.return_value = [load_fixture('cnos_bgp_config.cfg')]
def test_bgp_neighbor(self):
set_module_args({'username': 'admin', 'password': 'pass',
'host': '10.241.107.39', 'deviceType': 'g8272_cnos',
'outputfile': 'test.log', 'asNum': '33',
'bgpArg1': 'neighbor', 'bgpArg2': '10.241.107.40',
'bgpArg3': '13', 'bgpArg4': 'address-family',
'bgpArg5': 'ipv4', 'bgpArg6': 'next-hop-self'})
result = self.execute_module(changed=True)
file = open('Anil.txt', "a")
file.write(str(result))
file.close()
expected_result = 'BGP configurations accomplished'
self.assertEqual(result['msg'], expected_result)
def test_cnos_bgp_dampening(self):
set_module_args({'username': 'admin', 'password': 'pass',
'host': '10.241.107.39', 'deviceType': 'g8272_cnos',
'outputfile': 'test.log', 'asNum': '33',
'bgpArg1': 'address-family', 'bgpArg2': 'ipv4',
'bgpArg3': 'dampening', 'bgpArg4': '13',
'bgpArg5': '233', 'bgpArg6': '333',
'bgpArg7': '15', 'bgpArg8': '33'})
result = self.execute_module(changed=True)
expected_result = 'BGP configurations accomplished'
self.assertEqual(result['msg'], expected_result)
def test_cnos_bgp_network(self):
set_module_args({'username': 'admin', 'password': 'pass',
'host': '10.241.107.39', 'deviceType': 'g8272_cnos',
'outputfile': 'test.log', 'asNum': '33',
'bgpArg1': 'address-family', 'bgpArg2': 'ipv4',
'bgpArg3': 'network', 'bgpArg4': '1.2.3.4/5',
'bgpArg5': 'backdoor'})
result = self.execute_module(changed=True)
expected_result = 'BGP configurations accomplished'
self.assertEqual(result['msg'], expected_result)
def test_cnos_bgp_clusterid(self):
set_module_args({'username': 'admin', 'password': 'pass',
'host': '10.241.107.39', 'deviceType': 'g8272_cnos',
'outputfile': 'test.log', 'asNum': '33',
'bgpArg1': 'cluster-id', 'bgpArg2': '10.241.107.40'})
result = self.execute_module(changed=True)
expected_result = 'BGP configurations accomplished'
self.assertEqual(result['msg'], expected_result)
def test_cnos_bgp_graceful_restart(self):
set_module_args({'username': 'admin', 'password': 'pass',
'host': '10.241.107.39', 'deviceType': 'g8272_cnos',
'outputfile': 'test.log', 'asNum': '33',
'bgpArg1': 'graceful-restart', 'bgpArg2': '333'})
result = self.execute_module(changed=True)
expected_result = 'BGP configurations accomplished'
self.assertEqual(result['msg'], expected_result)
def test_cnos_bgp_routerid(self):
set_module_args({'username': 'admin', 'password': 'pass',
'host': '10.241.107.39', 'deviceType': 'g8272_cnos',
'outputfile': 'test.log', 'asNum': '33',
'bgpArg1': 'router-id', 'bgpArg2': '1.2.3.4'})
result = self.execute_module(changed=True)
expected_result = 'BGP configurations accomplished'
self.assertEqual(result['msg'], expected_result)
def test_cnos_bgp_vrf(self):
set_module_args({'username': 'admin', 'password': 'pass',
'host': '10.241.107.39', 'deviceType': 'g8272_cnos',
'outputfile': 'test.log', 'asNum': '33',
'bgpArg1': 'vrf'})
result = self.execute_module(changed=True)
expected_result = 'BGP configurations accomplished'
self.assertEqual(result['msg'], expected_result)