@ -34,7 +34,8 @@ DOCUMENTATION = '''
- - -
- - -
module : cnos_vlan
module : cnos_vlan
author : " Anil Kumar Muraleedharan (@amuraleedhar) "
author : " Anil Kumar Muraleedharan (@amuraleedhar) "
short_description : Manage VLAN resources and attributes on devices running Lenovo CNOS
short_description : Manage VLAN resources and attributes on devices running
Lenovo CNOS
description :
description :
- This module allows you to work with VLAN related configurations . The
- This module allows you to work with VLAN related configurations . The
operators used are overloaded to ensure control over switch VLAN
operators used are overloaded to ensure control over switch VLAN
@ -43,45 +44,57 @@ description:
filter . After passing this level , there are five VLAN arguments that will
filter . After passing this level , there are five VLAN arguments that will
perform further configurations . They are vlanArg1 , vlanArg2 , vlanArg3 ,
perform further configurations . They are vlanArg1 , vlanArg2 , vlanArg3 ,
vlanArg4 , and vlanArg5 . The value of vlanArg1 will determine the way
vlanArg4 , and vlanArg5 . The value of vlanArg1 will determine the way
following arguments will be evaluated . This module uses SSH to manage network
following arguments will be evaluated . This module uses SSH to manage
device configuration . The results of the operation will be placed in a directory
network device configuration . The results of the operation will be placed
named ' results ' that must be created by the user in their local directory to
in a directory named ' results ' that must be created by the user in their
where the playbook is run . For more information about this module from Lenovo and
local directory to where the playbook is run . For more information about
customizing it usage for your use cases ,
this module from Lenovo and customizing it usage for your use cases ,
please visit U ( http : / / systemx . lenovofiles . com / help / index . jsp ? topic = % 2 Fcom . lenovo . switchmgt . ansible . doc % 2 Fcnos_vlan . html )
please visit
U ( http : / / systemx . lenovofiles . com / help / index . jsp ? topic = % 2 Fcom . lenovo . switchmgt . ansible . doc % 2 Fcnos_vlan . html )
version_added : " 2.3 "
version_added : " 2.3 "
extends_documentation_fragment : cnos
extends_documentation_fragment : cnos
options :
options :
vlanArg1 :
vlanArg1 :
description :
description :
- This is an overloaded vlan first argument . Usage of this argument can be found is the User Guide referenced above .
- This is an overloaded vlan first argument . Usage of this argument can
be found is the User Guide referenced above .
required : true
required : true
choices : [ access - map , dot1q , filter , < 1 - 3999 > VLAN ID 1 - 3999 or range ]
choices : [ access - map , dot1q , filter , < 1 - 3999 > VLAN ID 1 - 3999 or range ]
vlanArg2 :
vlanArg2 :
description :
description :
- This is an overloaded vlan second argument . Usage of this argument can be found is the User Guide referenced above .
- This is an overloaded vlan second argument . Usage of this argument can
be found is the User Guide referenced above .
choices : [ VLAN Access Map name , egress - only , name , flood , state , ip ]
choices : [ VLAN Access Map name , egress - only , name , flood , state , ip ]
vlanArg3 :
vlanArg3 :
description :
description :
- This is an overloaded vlan third argument . Usage of this argument can be found is the User Guide referenced above .
- This is an overloaded vlan third argument . Usage of this argument can
choices : [ action , match , statistics , enter VLAN id or range of vlan , ascii name for the VLAN , ipv4 or ipv6 , active or suspend , fast - leave ,
be found is the User Guide referenced above .
last - member - query - interval , mrouter , querier , querier - timeout , query - interval , query - max - response - time , report - suppression ,
choices : [ action , match , statistics , enter VLAN id or range of vlan ,
robustness - variable , startup - query - count , startup - query - interval , static - group ]
ascii name for the VLAN , ipv4 or ipv6 , active or suspend ,
fast - leave , last - member - query - interval , mrouter , querier ,
querier - timeout , query - interval , query - max - response - time ,
report - suppression , robustness - variable , startup - query - count ,
startup - query - interval , static - group ]
vlanArg4 :
vlanArg4 :
description :
description :
- This is an overloaded vlan fourth argument . Usage of this argument can be found is the User Guide referenced above .
- This is an overloaded vlan fourth argument . Usage of this argument can
choices : [ drop or forward or redirect , ip or mac , Interval in seconds , ethernet , port - aggregation , Querier IP address ,
be found is the User Guide referenced above .
Querier Timeout in seconds , Query Interval in seconds , Query Max Response Time in seconds , Robustness Variable value ,
choices : [ drop or forward or redirect , ip or mac , Interval in seconds ,
Number of queries sent at startup , Query Interval at startup ]
ethernet , port - aggregation , Querier IP address ,
Querier Timeout in seconds , Query Interval in seconds ,
Query Max Response Time in seconds , Robustness Variable value ,
Number of queries sent at startup , Query Interval at startup ]
vlanArg5 :
vlanArg5 :
description :
description :
- This is an overloaded vlan fifth argument . Usage of this argument can be found is the User Guide referenced above .
- This is an overloaded vlan fifth argument . Usage of this argument can
be found is the User Guide referenced above .
choices : [ access - list name , Slot / chassis number , Port Aggregation Number ]
choices : [ access - list name , Slot / chassis number , Port Aggregation Number ]
'''
'''
EXAMPLES = '''
EXAMPLES = '''
Tasks : The following are examples of using the module cnos_vlan . These are written in the main . yml file of the tasks directory .
Tasks : The following are examples of using the module cnos_vlan . These are
written in the main . yml file of the tasks directory .
- - -
- - -
- name : Test Vlan - Create a vlan , name it
- name : Test Vlan - Create a vlan , name it
cnos_vlan :
cnos_vlan :
@ -196,6 +209,339 @@ from ansible.module_utils.basic import AnsibleModule
from collections import defaultdict
from collections import defaultdict
def vlanAccessMapConfig ( module , cmd ) :
retVal = ' '
# Wait time to get response from server
command = ' '
vlanArg3 = module . params [ ' vlanArg3 ' ]
vlanArg4 = module . params [ ' vlanArg4 ' ]
vlanArg5 = module . params [ ' vlanArg5 ' ]
deviceType = module . params [ ' deviceType ' ]
if ( vlanArg3 == " action " ) :
command = command + vlanArg3 + ' '
value = cnos . checkSanityofVariable (
deviceType , " vlan_accessmap_action " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-135 "
return retVal
elif ( vlanArg3 == " match " ) :
command = command + vlanArg3 + ' '
if ( vlanArg4 == " ip " or vlanArg4 == " mac " ) :
command = command + vlanArg4 + ' address '
value = cnos . checkSanityofVariable (
deviceType , " vlan_access_map_name " , vlanArg5 )
if ( value == " ok " ) :
command = command + vlanArg5
else :
retVal = " Error-136 "
return retVal
else :
retVal = " Error-137 "
return retVal
elif ( vlanArg3 == " statistics " ) :
command = vlanArg3 + " per-entry "
else :
retVal = " Error-138 "
return retVal
inner_cmd = [ { ' command ' : command , ' prompt ' : None , ' answer ' : None } ]
cmd . extend ( inner_cmd )
retVal = retVal + str ( cnos . run_cnos_commands ( module , cmd ) )
# debugOutput(command)
return retVal
# EOM
def checkVlanNameNotAssigned ( module , prompt , answer ) :
retVal = " ok "
vlanId = module . params [ ' vlanArg1 ' ]
vlanName = module . params [ ' vlanArg3 ' ]
command = " show vlan id " + vlanId
cmd = [ { ' command ' : command , ' prompt ' : None , ' answer ' : None } ]
retVal = str ( cnos . run_cnos_commands ( module , cmd ) )
if ( retVal . find ( ' Error ' ) != - 1 ) :
command = " display vlan id " + vlanId
retVal = str ( cnos . run_cnos_commands ( module , cmd ) )
if ( retVal . find ( vlanName ) != - 1 ) :
return " Nok "
else :
return " ok "
# EOM
# Utility Method to create vlan
def createVlan ( module , prompt , answer ) :
# vlan config command happens here. It creates if not present
vlanArg1 = module . params [ ' vlanArg1 ' ]
vlanArg2 = module . params [ ' vlanArg2 ' ]
vlanArg3 = module . params [ ' vlanArg3 ' ]
vlanArg4 = module . params [ ' vlanArg4 ' ]
vlanArg5 = module . params [ ' vlanArg5 ' ]
deviceType = module . params [ ' deviceType ' ]
retVal = ' '
command = ' vlan ' + vlanArg1
# debugOutput(command)
cmd = [ { ' command ' : command , ' prompt ' : None , ' answer ' : None } ]
command = " "
if ( vlanArg2 == " name " ) :
# debugOutput("name")
command = vlanArg2 + " "
value = cnos . checkSanityofVariable ( deviceType , " vlan_name " , vlanArg3 )
if ( value == " ok " ) :
value = checkVlanNameNotAssigned ( module , prompt , answer )
if ( value == " ok " ) :
command = command + vlanArg3
else :
retVal = retVal + ' VLAN Name is already assigned \n '
command = " \n "
else :
retVal = " Error-139 "
return retVal
elif ( vlanArg2 == " flood " ) :
# debugOutput("flood")
command = vlanArg2 + " "
value = cnos . checkSanityofVariable ( deviceType , " vlan_flood " , vlanArg3 )
if ( value == " ok " ) :
command = command + vlanArg3
else :
retVal = " Error-140 "
return retVal
elif ( vlanArg2 == " state " ) :
# debugOutput("state")
command = vlanArg2 + " "
value = cnos . checkSanityofVariable ( deviceType , " vlan_state " , vlanArg3 )
if ( value == " ok " ) :
command = command + vlanArg3
else :
retVal = " Error-141 "
return retVal
elif ( vlanArg2 == " ip " ) :
# debugOutput("ip")
command = vlanArg2 + " igmp snooping "
# debugOutput("vlanArg3")
if ( vlanArg3 is None or vlanArg3 == " " ) :
# debugOutput("None or empty")
command = command . strip ( )
elif ( vlanArg3 == " fast-leave " ) :
# debugOutput("fast-leave")
command = command + vlanArg3
elif ( vlanArg3 == " last-member-query-interval " ) :
# debugOutput("last-member-query-interval")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_last_member_query_interval " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-142 "
return retVal
elif ( vlanArg3 == " querier " ) :
# debugOutput("querier")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable ( deviceType ,
" vlan_querier " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-143 "
return retVal
elif ( vlanArg3 == " querier-timeout " ) :
# debugOutput("querier-timeout")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_querier_timeout " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-144 "
return retVal
elif ( vlanArg3 == " query-interval " ) :
# debugOutput("query-interval")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_query_interval " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-145 "
return retVal
elif ( vlanArg3 == " query-max-response-time " ) :
# debugOutput("query-max-response-time")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_query_max_response_time " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-146 "
return retVal
elif ( vlanArg3 == " report-suppression " ) :
# debugOutput("report-suppression")
command = command + vlanArg3
elif ( vlanArg3 == " robustness-variable " ) :
# debugOutput("robustness-variable")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_startup_query_count " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-148 "
return retVal
elif ( vlanArg3 == " startup-query-interval " ) :
# debugOutput("startup-query-interval")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_startup_query_interval " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-149 "
return retVal
elif ( vlanArg3 == " static-group " ) :
retVal = " Error-102 "
return retVal
elif ( vlanArg3 == " version " ) :
# debugOutput("version")
command = command + vlanArg3 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_snooping_version " , vlanArg4 )
if ( value == " ok " ) :
command = command + vlanArg4
else :
retVal = " Error-150 "
return retVal
elif ( vlanArg3 == " mrouter " ) :
# debugOutput("mrouter")
command = command + vlanArg3 + " interface "
if ( vlanArg4 == " ethernet " ) :
command = command + vlanArg4 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_ethernet_interface " , vlanArg5 )
if ( value == " ok " ) :
command = command + vlanArg5
else :
retVal = " Error-151 "
return retVal
elif ( vlanArg4 == " port-aggregation " ) :
command = command + vlanArg4 + " "
value = cnos . checkSanityofVariable (
deviceType , " vlan_portagg_number " , vlanArg5 )
if ( value == " ok " ) :
command = command + vlanArg5
else :
retVal = " Error-152 "
return retVal
else :
retVal = " Error-153 "
return retVal
else :
command = command + vlanArg3
else :
retVal = " Error-154 "
return retVal
inner_cmd = [ { ' command ' : command , ' prompt ' : None , ' answer ' : None } ]
cmd . extend ( inner_cmd )
retVal = retVal + str ( cnos . run_cnos_commands ( module , cmd ) )
# debugOutput(command)
return retVal
# EOM
def vlanConfig ( module , prompt , answer ) :
retVal = ' '
# Wait time to get response from server
vlanArg1 = module . params [ ' vlanArg1 ' ]
vlanArg2 = module . params [ ' vlanArg2 ' ]
vlanArg3 = module . params [ ' vlanArg3 ' ]
vlanArg4 = module . params [ ' vlanArg4 ' ]
vlanArg5 = module . params [ ' vlanArg5 ' ]
deviceType = module . params [ ' deviceType ' ]
# vlan config command happens here.
command = ' vlan '
if ( vlanArg1 == " access-map " ) :
# debugOutput("access-map ")
command = command + vlanArg1 + ' '
value = cnos . checkSanityofVariable (
deviceType , " vlan_access_map_name " , vlanArg2 )
if ( value == " ok " ) :
command = command + vlanArg2
# debugOutput(command)
cmd = [ { ' command ' : command , ' prompt ' : None , ' answer ' : None } ]
retVal = retVal + vlanAccessMapConfig ( module , cmd )
return retVal
else :
retVal = " Error-130 "
return retVal
elif ( vlanArg1 == " dot1q " ) :
# debugOutput("dot1q")
command = command + vlanArg1 + " tag native "
if ( vlanArg2 is not None ) :
value = cnos . checkSanityofVariable (
deviceType , " vlan_dot1q_tag " , vlanArg2 )
if ( value == " ok " ) :
command = command + vlanArg2
else :
retVal = " Error-131 "
return retVal
elif ( vlanArg1 == " filter " ) :
# debugOutput( "filter")
command = command + vlanArg1 + " "
if ( vlanArg2 is not None ) :
value = cnos . checkSanityofVariable (
deviceType , " vlan_filter_name " , vlanArg2 )
if ( value == " ok " ) :
command = command + vlanArg2 + " vlan-list "
value = cnos . checkSanityofVariable ( deviceType , " vlan_id " ,
vlanArg3 )
if ( value == " ok " ) :
command = command + vlanArg3
else :
value = cnos . checkSanityofVariable (
deviceType , " vlan_id_range " , vlanArg3 )
if ( value == " ok " ) :
command = command + vlanArg3
else :
retVal = " Error-133 "
return retVal
else :
retVal = " Error-132 "
return retVal
else :
value = cnos . checkSanityofVariable ( deviceType , " vlan_id " , vlanArg1 )
if ( value == " ok " ) :
retVal = createVlan ( module , ' (config-vlan)# ' , None )
return retVal
else :
value = cnos . checkSanityofVariable (
deviceType , " vlan_id_range " , vlanArg1 )
if ( value == " ok " ) :
retVal = createVlan ( module , ' (config-vlan)# ' , None )
return retVal
retVal = " Error-133 "
return retVal
# debugOutput(command)
cmd = [ { ' command ' : command , ' prompt ' : None , ' answer ' : None } ]
retVal = retVal + str ( cnos . run_cnos_commands ( module , cmd ) )
return retVal
# EOM
def main ( ) :
def main ( ) :
#
#
# Define parameters for vlan creation entry
# Define parameters for vlan creation entry
@ -220,7 +566,7 @@ def main():
output = " "
output = " "
# Send the CLi command
# Send the CLi command
output = output + str ( cnos. vlanConfig( module , " (config)# " , None ) )
output = output + str ( vlanConfig( module , " (config)# " , None ) )
# Save it operation details into the file
# Save it operation details into the file
file = open ( outputfile , " a " )
file = open ( outputfile , " a " )