From 0c5650ee1bdf9dea75a235888c91b4cf8be90efd Mon Sep 17 00:00:00 2001 From: Jacob McGill Date: Wed, 7 Feb 2018 03:08:53 -0500 Subject: [PATCH] Pathatt connection (#35806) * add interfacce_type to absent required if...not sure how this would work without it * move fex requirement to required_if * Fix incorrect documentation about port_channels --- .../network/aci/aci_static_binding_to_epg.py | 68 +++++++++---------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/lib/ansible/modules/network/aci/aci_static_binding_to_epg.py b/lib/ansible/modules/network/aci/aci_static_binding_to_epg.py index 12eebe2164..832e6827f1 100644 --- a/lib/ansible/modules/network/aci/aci_static_binding_to_epg.py +++ b/lib/ansible/modules/network/aci/aci_static_binding_to_epg.py @@ -62,12 +62,12 @@ options: choices: [ access, trunk, 802.1p ] default: trunk aliases: [ mode, interface_mode_name ] - connection_type: + interface_type: description: - - The Path Type for the static EPG deployement. - - The APIC defaults the Path Type to C(access_interface) which is the same as C(Port). - choices: [ access_interface, virtual_port_channel, direct_port_channel, fex ] - default: access_interface + - The type of interface for the static EPG deployement. + - The APIC defaults the C(interface_type) to C(switch_port). + choices: [ switch_port, vpc, port_channel, fex ] + default: switch_port pod: description: - The pod number part of the tDn. @@ -75,19 +75,19 @@ options: aliases: [ pod_number ] leafs: description: - - The switch or switches ID(s) that the C(interface) belongs to. - - When C(connection_type) is C(access_interface) or C(fex), C(leafs) is a string of the leaf ID - - When C(connection_type) is C(virtual_port_channel) or C(direct_port_channel), C(leafs) is a list with both leaf IDs + - The switch ID(s) that the C(interface) belongs to. + - When C(interface_type) is C(switch_port), C(port_channel), or C(fex), then C(leafs) is a string of the leaf ID. + - When C(interface_type) is C(vpc), then C(leafs) is a list with both leaf IDs. aliases: [ paths, leaves, nodes, switches ] interface: description: - The C(interface) string value part of the tDn. - - Usually a policy group like "test-IntPolGrp" or an interface of the following format "1/7" depending on C(connection_type). + - Usually a policy group like "test-IntPolGrp" or an interface of the following format "1/7" depending on C(interface_type). extpaths: description: - The C(extpaths) integer value part of the tDn. - - C(extpaths) is only used if C(connection_type) is C(fex). - - Usually something like '1011'(int). + - C(extpaths) is only used if C(interface_type) is C(fex). + - Usually something like '1011'. state: description: - Use C(present) or C(absent) for adding or removing. @@ -110,7 +110,7 @@ EXAMPLES = r''' # primary_encap: 11 deploy_immediacy: lazy interface_mode: access - connection_type: access_interface + interface_type: switch_port pod: 1 leafs: 101 interface: '1/7' @@ -126,7 +126,6 @@ from ansible.module_utils.network.aci.aci import ACIModule, aci_argument_spec from ansible.module_utils.basic import AnsibleModule # TODO: change 'deploy_immediacy' to 'resolution_immediacy' (as seen in aci_epg_to_domain)? -# TODO: change C(access_interface) to C(Port) or C(port_channel) as seen on GUI in the 'connection_type' parameter def main(): @@ -139,14 +138,14 @@ def main(): primary_encap=dict(type='int', aliases=['primary_encapsulation']), deploy_immediacy=dict(type='str', choices=['immediate', 'lazy']), interface_mode=dict(type='str', choices=['access', 'tagged', '802.1p'], aliases=['mode', 'interface_mode_name']), - connection_type=dict(type='str', choices=['access_interface', 'virtual_port_channel', 'direct_port_channel', 'fex'], required=True), + interface_type=dict(type='str', choices=['switch_port', 'vpc', 'port_channel', 'fex'], required=True), # NOTE: C(pod) is usually an integer below 10. pod=dict(type='int', aliases=['pod_number']), # NOTE: C(leafs) is usually something like '101' or '101-102' depending on C(connection_type). leafs=dict(type='list', aliases=['paths', 'leaves', 'nodes', 'switches']), - # NOTE: C(interface) is usually a policy group like: "test-IntPolGrp" or an interface of the following format: "1/7" depending on C(connection_type). + # NOTE: C(interface) is usually a policy group like: "test-IntPolGrp" or an interface of the following format: "1/7" depending on C(interface_type). interface=dict(type='str'), - # NOTE: C(extpaths) is only used if C(connection_type) is C(fex), it is usually something like '1011'(int) + # NOTE: C(extpaths) is only used if C(interface_type) is C(fex), it is usually something like '1011'(int) extpaths=dict(type='int'), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) @@ -155,9 +154,9 @@ def main(): argument_spec=argument_spec, supports_check_mode=True, required_if=[ - # NOTE: extpaths is a requirement if 'connection_type' is 'fex' - ['state', 'absent', ['tenant', 'ap', 'epg', 'pod', 'leafs', 'interface']], - ['state', 'present', ['tenant', 'ap', 'epg', 'encap', 'connection_type', 'pod', 'leafs', 'interface']], + ['state', 'absent', ['tenant', 'ap', 'epg', 'interface_type', 'pod', 'leafs', 'interface']], + ['state', 'present', ['tenant', 'ap', 'epg', 'encap', 'interface_type', 'pod', 'leafs', 'interface']], + ['interface_type', 'fex', ['extpaths']], ], ) @@ -168,21 +167,21 @@ def main(): primary_encap = module.params['primary_encap'] deploy_immediacy = module.params['deploy_immediacy'] interface_mode = module.params['interface_mode'] - connection_type = module.params['connection_type'] + interface_type = module.params['interface_type'] pod = module.params['pod'] # Users are likely to use integers for leaf IDs, which would raise an exception when using the join method leafs = [str(leaf) for leaf in module.params['leafs']] if leafs is not None: if len(leafs) == 1: - if connection_type != 'virtual_port_channel': + if interface_type != 'vpc': leafs = leafs[0] else: - module.fail_json(msg='A connection_type of "virtual_port_channel" requires 2 leafs') + module.fail_json(msg='A interface_type of "vpc" requires 2 leafs') elif len(leafs) == 2: - if connection_type == 'virtual_port_channel': + if interface_type == 'vpc': leafs = "-".join(leafs) else: - module.fail_json(msg='The connection_types "access_interface", "direct_port_channel", and "fex" \ + module.fail_json(msg='The interface_types "switch_port", "port_channel", and "fex" \ do not support using multiple leafs for a single binding') else: module.fail_json(msg='The "leafs" parameter must not have more than 2 entries') @@ -203,21 +202,18 @@ def main(): else: module.fail_json(msg='Valid VLAN assigments are from 1 to 4096') - if connection_type == 'fex' and extpaths is None: - module.fail_json(msg='extpaths must be defined') - - CONNECTION_TYPE_MAPPING = dict( - # NOTE: C(interface) can be a policy group like: "test-IntPolGrp" or of following format: "1/7", C(leafs) can only be something like '101' - access_interface='topology/pod-{0}/paths-{1}/pathep-[eth{2}]'.format(pod, leafs, interface), - # NOTE: C(interface) can be a policy group like: "test-IntPolGrp" or of following format: "1/7", C(leafs) can only be something like '101' - direct_port_channel='topology/pod-{0}/paths-{1}/pathep-[eth{2}]'.format(pod, leafs, interface), - # NOTE: C(interface) can be a policy group like: "test-IntPolGrp", C(leafs) can be something like 101-102' - virtual_port_channel='topology/pod-{0}/protpaths-{1}/pathep-[{2}]'.format(pod, leafs, interface), - # NOTE: C(interface) can be of the following format: "1/7", C(leafs) can only be like '101', C(extpaths) can only be like '1011' + INTERFACE_TYPE_MAPPING = dict( + # NOTE: C(interface) can be a policy group like: 'test-IntPolGrp' or of following format: '1/7', C(leafs) can only be something like '101' + switch_port='topology/pod-{0}/paths-{1}/pathep-[eth{2}]'.format(pod, leafs, interface), + # NOTE: C(interface) can be a policy group like: 'test-IntPolGrp' or of following format: '1/7', C(leafs) can only be something like '101' + port_channel='topology/pod-{0}/paths-{1}/pathep-[eth{2}]'.format(pod, leafs, interface), + # NOTE: C(interface) can be a policy group like: 'test-IntPolGrp', C(leafs) can be something like '101-102' + vpc='topology/pod-{0}/protpaths-{1}/pathep-[{2}]'.format(pod, leafs, interface), + # NOTE: C(interface) can be of the following format: '1/7', C(leafs) can only be like '101', C(extpaths) can only be like '1011' fex='topology/pod-{0}/paths-{1}/extpaths-{2}/pathep-[eth{3}]'.format(pod, leafs, extpaths, interface), ) - static_path = CONNECTION_TYPE_MAPPING[connection_type] + static_path = INTERFACE_TYPE_MAPPING[interface_type] aci = ACIModule(module) aci.construct_url(