def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), template=dict(type='str', required=True), external_epg=dict(type='str', aliases=['name', 'externalepg']), # This parameter is not required for querying all objects description=dict(type='str'), display_name=dict(type='str'), vrf=dict(type='dict', options=mso_reference_spec()), l3out=dict(type='dict', options=mso_reference_spec()), anp=dict(type='dict', options=mso_reference_spec()), preferred_group=dict(type='bool'), type=dict(type='str', default='on-premise', choices=['on-premise', 'cloud']), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['external_epg']], ['state', 'present', ['external_epg', 'vrf']], ['type', 'cloud', ['anp']], ], ) schema = module.params.get('schema') template = module.params.get('template').replace(' ', '') external_epg = module.params.get('external_epg') description = module.params.get('description') display_name = module.params.get('display_name') vrf = module.params.get('vrf') if vrf is not None and vrf.get('template') is not None: vrf['template'] = vrf.get('template').replace(' ', '') l3out = module.params.get('l3out') if l3out is not None and l3out.get('template') is not None: l3out['template'] = l3out.get('template').replace(' ', '') anp = module.params.get('anp') if anp is not None and anp.get('template') is not None: anp['template'] = anp.get('template').replace(' ', '') preferred_group = module.params.get('preferred_group') type_ext_epg = module.params.get('type') state = module.params.get('state') mso = MSOModule(module) # Get schema objects schema_id, schema_path, schema_obj = mso.query_schema(schema) # Get template templates = [t.get('name') for t in schema_obj.get('templates')] if template not in templates: mso.fail_json(msg="Provided template '{0}' does not exist. Existing templates: {1}".format(template, ', '.join(templates))) template_idx = templates.index(template) # Get external EPGs external_epgs = [e.get('name') for e in schema_obj.get('templates')[template_idx]['externalEpgs']] if external_epg is not None and external_epg in external_epgs: external_epg_idx = external_epgs.index(external_epg) mso.existing = schema_obj.get('templates')[template_idx]['externalEpgs'][external_epg_idx] if 'externalEpgRef' in mso.existing: del mso.existing['externalEpgRef'] if 'vrfRef' in mso.existing: mso.existing['vrfRef'] = mso.dict_from_ref(mso.existing.get('vrfRef')) if 'l3outRef' in mso.existing: mso.existing['l3outRef'] = mso.dict_from_ref(mso.existing.get('l3outRef')) if 'anpRef' in mso.existing: mso.existing['anpRef'] = mso.dict_from_ref(mso.existing.get('anpRef')) if state == 'query': if external_epg is None: mso.existing = schema_obj.get('templates')[template_idx]['externalEpgs'] elif not mso.existing: mso.fail_json(msg="External EPG '{external_epg}' not found".format(external_epg=external_epg)) mso.exit_json() eepgs_path = '/templates/{0}/externalEpgs'.format(template) eepg_path = '/templates/{0}/externalEpgs/{1}'.format(template, external_epg) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=eepg_path)) elif state == 'present': vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) l3out_ref = mso.make_reference(l3out, 'l3out', schema_id, template) anp_ref = mso.make_reference(anp, 'anp', schema_id, template) if display_name is None and not mso.existing: display_name = external_epg payload = dict( name=external_epg, displayName=display_name, vrfRef=vrf_ref, preferredGroup=preferred_group, ) if description is not None: payload.update(description=description) if type_ext_epg == 'cloud': payload['extEpgType'] = 'cloud' payload['anpRef'] = anp_ref else: payload['l3outRef'] = l3out_ref mso.sanitize(payload, collate=True) if mso.existing: # clean contractRef to fix api issue for contract in mso.sent.get('contractRelationships'): contract['contractRef'] = mso.dict_from_ref(contract.get('contractRef')) ops.append(dict(op='replace', path=eepg_path, value=mso.sent)) else: ops.append(dict(op='add', path=eepgs_path + '/-', value=mso.sent)) mso.existing = mso.proposed if not module.check_mode: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()
def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), template=dict(type='str', required=True), l3out=dict(type='str', aliases=[ 'name' ]), # This parameter is not required for querying all objects display_name=dict(type='str'), vrf=dict(type='dict', options=mso_reference_spec()), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['l3out']], ['state', 'present', ['l3out', 'vrf']], ], ) schema = module.params.get('schema') template = module.params.get('template') l3out = module.params.get('l3out') display_name = module.params.get('display_name') vrf = module.params.get('vrf') state = module.params.get('state') mso = MSOModule(module) # Get schema_id schema_obj = mso.get_obj('schemas', displayName=schema) if schema_obj: schema_id = schema_obj.get('id') else: mso.fail_json( msg="Provided schema '{0}' does not exist".format(schema)) schema_path = 'schemas/{id}'.format(**schema_obj) # Get template templates = [t.get('name') for t in schema_obj.get('templates')] if template not in templates: mso.fail_json( msg="Provided template '{0}' does not exist. Existing templates: {1}" .format(template, ', '.join(templates))) template_idx = templates.index(template) # Get L3out l3outs = [ l.get('name') for l in schema_obj.get('templates')[template_idx]['intersiteL3outs'] ] if l3out is not None and l3out in l3outs: l3out_idx = l3outs.index(l3out) mso.existing = schema_obj.get( 'templates')[template_idx]['intersiteL3outs'][l3out_idx] if state == 'query': if l3out is None: mso.existing = schema_obj.get( 'templates')[template_idx]['intersiteL3outs'] elif not mso.existing: mso.fail_json(msg="L3out '{l3out}' not found".format(l3out=l3out)) mso.exit_json() l3outs_path = '/templates/{0}/intersiteL3outs'.format(template) l3out_path = '/templates/{0}/intersiteL3outs/{1}'.format(template, l3out) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=l3out_path)) elif state == 'present': vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) if display_name is None and not mso.existing: display_name = l3out payload = dict( name=l3out, displayName=display_name, vrfRef=vrf_ref, ) mso.sanitize(payload, collate=True) if mso.existing: ops.append(dict(op='replace', path=l3out_path, value=mso.sent)) else: ops.append(dict(op='add', path=l3outs_path + '/-', value=mso.sent)) mso.existing = mso.proposed if not module.check_mode: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()
def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), template=dict(type='str', required=True), anp=dict(type='str', required=True), epg=dict(type='str', aliases=[ 'name' ]), # This parameter is not required for querying all objects bd=dict(type='dict', options=mso_reference_spec()), vrf=dict(type='dict', options=mso_reference_spec()), display_name=dict(type='str'), useg_epg=dict(type='bool'), intra_epg_isolation=dict(type='str', choices=['enforced', 'unenforced']), intersite_multicast_source=dict(type='bool'), proxy_arp=dict(type='bool'), subnets=dict(type='list', elements='dict', options=mso_subnet_spec()), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), preferred_group=dict(type='bool'), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['epg']], ['state', 'present', ['epg']], ], ) schema = module.params.get('schema') template = module.params.get('template').replace(' ', '') anp = module.params.get('anp') epg = module.params.get('epg') display_name = module.params.get('display_name') bd = module.params.get('bd') if bd is not None and bd.get('template') is not None: bd['template'] = bd.get('template').replace(' ', '') vrf = module.params.get('vrf') if vrf is not None and vrf.get('template') is not None: vrf['template'] = vrf.get('template').replace(' ', '') useg_epg = module.params.get('useg_epg') intra_epg_isolation = module.params.get('intra_epg_isolation') intersite_multicast_source = module.params.get( 'intersite_multicast_source') proxy_arp = module.params.get('proxy_arp') subnets = module.params.get('subnets') state = module.params.get('state') preferred_group = module.params.get('preferred_group') mso = MSOModule(module) # Get schema_id schema_obj = mso.get_obj('schemas', displayName=schema) if schema_obj: schema_id = schema_obj.get('id') else: mso.fail_json( msg="Provided schema '{0}' does not exist".format(schema)) schema_path = 'schemas/{id}'.format(**schema_obj) # Get template templates = [t.get('name') for t in schema_obj.get('templates')] if template not in templates: mso.fail_json( msg="Provided template '{0}' does not exist. Existing templates: {1}" .format(template, ', '.join(templates))) template_idx = templates.index(template) # Get ANP anps = [ a.get('name') for a in schema_obj.get('templates')[template_idx]['anps'] ] if anp not in anps: mso.fail_json( msg="Provided anp '{0}' does not exist. Existing anps: {1}".format( anp, ', '.join(anps))) anp_idx = anps.index(anp) # Get EPG epgs = [ e.get('name') for e in schema_obj.get('templates')[template_idx] ['anps'][anp_idx]['epgs'] ] if epg is not None and epg in epgs: epg_idx = epgs.index(epg) mso.existing = schema_obj.get( 'templates')[template_idx]['anps'][anp_idx]['epgs'][epg_idx] if state == 'query': if epg is None: mso.existing = schema_obj.get( 'templates')[template_idx]['anps'][anp_idx]['epgs'] elif not mso.existing: mso.fail_json(msg="EPG '{epg}' not found".format(epg=epg)) if 'bdRef' in mso.existing: mso.existing['bdRef'] = mso.dict_from_ref(mso.existing['bdRef']) if 'vrfRef' in mso.existing: mso.existing['vrfRef'] = mso.dict_from_ref(mso.existing['vrfRef']) mso.exit_json() epgs_path = '/templates/{0}/anps/{1}/epgs'.format(template, anp) epg_path = '/templates/{0}/anps/{1}/epgs/{2}'.format(template, anp, epg) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=epg_path)) elif state == 'present': bd_ref = mso.make_reference(bd, 'bd', schema_id, template) vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) mso.stdout = str(subnets) subnets = mso.make_subnets(subnets) if display_name is None and not mso.existing: display_name = epg payload = dict( name=epg, displayName=display_name, uSegEpg=useg_epg, intraEpg=intra_epg_isolation, mCastSource=intersite_multicast_source, proxyArp=proxy_arp, # FIXME: Missing functionality # uSegAttrs=[], subnets=subnets, bdRef=bd_ref, preferredGroup=preferred_group, vrfRef=vrf_ref, ) mso.sanitize(payload, collate=True) if mso.existing: # Clean contractRef to fix api issue for contract in mso.sent.get('contractRelationships'): contract['contractRef'] = mso.dict_from_ref( contract.get('contractRef')) ops.append(dict(op='replace', path=epg_path, value=mso.sent)) else: ops.append(dict(op='add', path=epgs_path + '/-', value=mso.sent)) mso.existing = mso.proposed if 'epgRef' in mso.previous: del mso.previous['epgRef'] if 'bdRef' in mso.previous and mso.previous['bdRef'] != '': mso.previous['bdRef'] = mso.dict_from_ref(mso.previous['bdRef']) if 'vrfRef' in mso.previous and mso.previous['bdRef'] != '': mso.previous['vrfRef'] = mso.dict_from_ref(mso.previous['vrfRef']) if not module.check_mode and mso.proposed != mso.previous: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()
def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), template=dict(type='str', required=True), bd=dict(type='str', aliases=[ 'name' ]), # This parameter is not required for querying all objects display_name=dict(type='str'), intersite_bum_traffic=dict(type='bool'), optimize_wan_bandwidth=dict(type='bool'), layer2_stretch=dict(type='bool'), layer2_unknown_unicast=dict(type='str', choices=['flood', 'proxy']), layer3_multicast=dict(type='bool'), vrf=dict(type='dict', options=mso_reference_spec()), dhcp_policy=dict(type='dict', options=mso_dhcp_spec()), subnets=dict(type='list', options=mso_subnet_spec()), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['bd']], ['state', 'present', ['bd', 'vrf']], ], ) schema = module.params.get('schema') template = module.params.get('template') bd = module.params.get('bd') display_name = module.params.get('display_name') intersite_bum_traffic = module.params.get('intersite_bum_traffic') optimize_wan_bandwidth = module.params.get('optimize_wan_bandwidth') layer2_stretch = module.params.get('layer2_stretch') layer2_unknown_unicast = module.params.get('layer2_unknown_unicast') layer3_multicast = module.params.get('layer3_multicast') vrf = module.params.get('vrf') dhcp_policy = module.params.get('dhcp_policy') subnets = module.params.get('subnets') state = module.params.get('state') mso = MSOModule(module) # Get schema_id schema_obj = mso.get_obj('schemas', displayName=schema) if schema_obj: schema_id = schema_obj.get('id') else: mso.fail_json( msg="Provided schema '{0}' does not exist".format(schema)) schema_path = 'schemas/{id}'.format(**schema_obj) # Get template templates = [t.get('name') for t in schema_obj.get('templates')] if template not in templates: mso.fail_json( msg="Provided template '{0}' does not exist. Existing templates: {1}" .format(template, ', '.join(templates))) template_idx = templates.index(template) # Get BDs bds = [ b.get('name') for b in schema_obj.get('templates')[template_idx]['bds'] ] if bd is not None and bd in bds: bd_idx = bds.index(bd) mso.existing = schema_obj.get('templates')[template_idx]['bds'][bd_idx] if state == 'query': if bd is None: mso.existing = schema_obj.get('templates')[template_idx]['bds'] elif not mso.existing: mso.fail_json(msg="BD '{bd}' not found".format(bd=bd)) mso.exit_json() bds_path = '/templates/{0}/bds'.format(template) bd_path = '/templates/{0}/bds/{1}'.format(template, bd) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=bd_path)) elif state == 'present': vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) subnets = mso.make_subnets(subnets) dhcp_label = mso.make_dhcp_label(dhcp_policy) if display_name is None and not mso.existing: display_name = bd if subnets is None and not mso.existing: subnets = [] payload = dict( name=bd, displayName=display_name, intersiteBumTrafficAllow=intersite_bum_traffic, optimizeWanBandwidth=optimize_wan_bandwidth, l2UnknownUnicast=layer2_unknown_unicast, l2Stretch=layer2_stretch, l3MCast=layer3_multicast, subnets=subnets, vrfRef=vrf_ref, dhcpLabel=dhcp_label, ) mso.sanitize(payload, collate=True) if mso.existing: ops.append(dict(op='replace', path=bd_path, value=mso.sent)) else: ops.append(dict(op='add', path=bds_path + '/-', value=mso.sent)) mso.existing = mso.proposed if 'bdRef' in mso.previous: del mso.previous['bdRef'] if 'vrfRef' in mso.previous: mso.previous['vrfRef'] = mso.vrf_dict_from_ref( mso.previous.get('vrfRef')) if not module.check_mode and mso.proposed != mso.previous: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()
def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), template=dict(type='str', required=True), bd=dict(type='str', aliases=[ 'name' ]), # This parameter is not required for querying all objects display_name=dict(type='str'), description=dict(type='str'), intersite_bum_traffic=dict(type='bool'), optimize_wan_bandwidth=dict(type='bool'), layer2_stretch=dict(type='bool', default='true'), layer2_unknown_unicast=dict(type='str', choices=['flood', 'proxy']), layer3_multicast=dict(type='bool'), vrf=dict(type='dict', options=mso_reference_spec()), dhcp_policy=dict(type='dict', options=mso_dhcp_spec()), dhcp_policies=dict(type='list', elements='dict', options=mso_dhcp_spec()), subnets=dict(type='list', elements='dict', options=mso_bd_subnet_spec()), unknown_multicast_flooding=dict( type='str', choices=['optimized_flooding', 'flood']), multi_destination_flooding=dict( type='str', choices=['flood_in_bd', 'drop', 'encap-flood']), ipv6_unknown_multicast_flooding=dict( type='str', choices=['optimized_flooding', 'flood']), arp_flooding=dict(type='bool'), virtual_mac_address=dict(type='str'), unicast_routing=dict(type='bool', default=False), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['bd']], ['state', 'present', ['bd', 'vrf']], ], ) schema = module.params.get('schema') template = module.params.get('template').replace(' ', '') bd = module.params.get('bd') display_name = module.params.get('display_name') description = module.params.get('description') intersite_bum_traffic = module.params.get('intersite_bum_traffic') optimize_wan_bandwidth = module.params.get('optimize_wan_bandwidth') layer2_stretch = module.params.get('layer2_stretch') layer2_unknown_unicast = module.params.get('layer2_unknown_unicast') layer3_multicast = module.params.get('layer3_multicast') vrf = module.params.get('vrf') if vrf is not None and vrf.get('template') is not None: vrf['template'] = vrf.get('template').replace(' ', '') dhcp_policy = module.params.get('dhcp_policy') dhcp_policies = module.params.get('dhcp_policies') subnets = module.params.get('subnets') unknown_multicast_flooding = module.params.get( 'unknown_multicast_flooding') multi_destination_flooding = module.params.get( 'multi_destination_flooding') ipv6_unknown_multicast_flooding = module.params.get( 'ipv6_unknown_multicast_flooding') arp_flooding = module.params.get('arp_flooding') virtual_mac_address = module.params.get('virtual_mac_address') unicast_routing = module.params.get('unicast_routing') state = module.params.get('state') mso = MSOModule(module) # Map choices if unknown_multicast_flooding == 'optimized_flooding': unknown_multicast_flooding = 'opt-flood' if ipv6_unknown_multicast_flooding == 'optimized_flooding': ipv6_unknown_multicast_flooding = 'opt-flood' if multi_destination_flooding == 'flood_in_bd': multi_destination_flooding = 'bd-flood' if layer2_unknown_unicast == 'flood': arp_flooding = True # Get schema objects schema_id, schema_path, schema_obj = mso.query_schema(schema) # Get template templates = [t.get('name') for t in schema_obj.get('templates')] if template not in templates: mso.fail_json( msg="Provided template '{0}' does not exist. Existing templates: {1}" .format(template, ', '.join(templates))) template_idx = templates.index(template) # Get BDs bds = [ b.get('name') for b in schema_obj.get('templates')[template_idx]['bds'] ] if bd is not None and bd in bds: bd_idx = bds.index(bd) mso.existing = schema_obj.get('templates')[template_idx]['bds'][bd_idx] if state == 'query': if bd is None: mso.existing = schema_obj.get('templates')[template_idx]['bds'] elif not mso.existing: mso.fail_json(msg="BD '{bd}' not found".format(bd=bd)) mso.exit_json() bds_path = '/templates/{0}/bds'.format(template) bd_path = '/templates/{0}/bds/{1}'.format(template, bd) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=bd_path)) elif state == 'present': vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) subnets = mso.make_subnets(subnets) dhcp_label = mso.make_dhcp_label(dhcp_policy) dhcp_labels = mso.make_dhcp_label(dhcp_policies) if display_name is None and not mso.existing: display_name = bd if subnets is None and not mso.existing: subnets = [] payload = dict( name=bd, displayName=display_name, intersiteBumTrafficAllow=intersite_bum_traffic, optimizeWanBandwidth=optimize_wan_bandwidth, l2UnknownUnicast=layer2_unknown_unicast, l2Stretch=layer2_stretch, l3MCast=layer3_multicast, subnets=subnets, vrfRef=vrf_ref, dhcpLabel=dhcp_label, unkMcastAct=unknown_multicast_flooding, multiDstPktAct=multi_destination_flooding, v6unkMcastAct=ipv6_unknown_multicast_flooding, vmac=virtual_mac_address, arpFlood=arp_flooding, ) if dhcp_labels: payload.update(dhcpLabels=dhcp_labels) if unicast_routing: payload.update(unicastRouting=unicast_routing) if description: payload.update(description=description) mso.sanitize(payload, collate=True, required=['dhcpLabel', 'dhcpLabels']) if mso.existing: ops.append(dict(op='replace', path=bd_path, value=mso.sent)) else: ops.append(dict(op='add', path=bds_path + '/-', value=mso.sent)) mso.existing = mso.proposed if 'bdRef' in mso.previous: del mso.previous['bdRef'] if 'vrfRef' in mso.previous: mso.previous['vrfRef'] = mso.vrf_dict_from_ref( mso.previous.get('vrfRef')) if not module.check_mode and mso.proposed != mso.previous: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()
def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), template=dict(type='str', required=True), anp=dict(type='str', required=True), epg=dict(type='str', aliases=['name']), # This parameter is not required for querying all objects description=dict(type='str'), bd=dict(type='dict', options=mso_reference_spec()), vrf=dict(type='dict', options=mso_reference_spec()), display_name=dict(type='str'), useg_epg=dict(type='bool'), intra_epg_isolation=dict(type='str', choices=['enforced', 'unenforced']), intersite_multicast_source=dict(type='bool'), proxy_arp=dict(type='bool'), subnets=dict(type='list', elements='dict', options=mso_epg_subnet_spec()), qos_level=dict(type='str'), epg_type=dict(type='str', choices=['application', 'service']), deployment_type=dict(type='str', choices=['cloud_native', 'cloud_native_managed', 'third_party']), service_type=dict(type='str'), access_type=dict(type='str', choices=['private', 'public', 'public_and_private']), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), preferred_group=dict(type='bool'), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['epg']], ['state', 'present', ['epg']], ], ) schema = module.params.get('schema') template = module.params.get('template').replace(' ', '') anp = module.params.get('anp') epg = module.params.get('epg') description = module.params.get('description') display_name = module.params.get('display_name') bd = module.params.get('bd') if bd is not None and bd.get('template') is not None: bd['template'] = bd.get('template').replace(' ', '') vrf = module.params.get('vrf') if vrf is not None and vrf.get('template') is not None: vrf['template'] = vrf.get('template').replace(' ', '') useg_epg = module.params.get('useg_epg') intra_epg_isolation = module.params.get('intra_epg_isolation') intersite_multicast_source = module.params.get('intersite_multicast_source') proxy_arp = module.params.get('proxy_arp') subnets = module.params.get('subnets') qos_level = module.params.get('qos_level') epg_type = module.params.get('epg_type') deployment_type = module.params.get('deployment_type') service_type = module.params.get('service_type') access_type = module.params.get('access_type') state = module.params.get('state') preferred_group = module.params.get('preferred_group') mso = MSOModule(module) # Get schema objects schema_id, schema_path, schema_obj = mso.query_schema(schema) # Get template templates = [t.get('name') for t in schema_obj.get('templates')] if template not in templates: mso.fail_json(msg="Provided template '{0}' does not exist. Existing templates: {1}".format(template, ', '.join(templates))) template_idx = templates.index(template) # Get ANP anps = [a.get('name') for a in schema_obj.get('templates')[template_idx]['anps']] if anp not in anps: mso.fail_json(msg="Provided anp '{0}' does not exist. Existing anps: {1}".format(anp, ', '.join(anps))) anp_idx = anps.index(anp) # Get EPG epgs = [e.get('name') for e in schema_obj.get('templates')[template_idx]['anps'][anp_idx]['epgs']] if epg is not None and epg in epgs: epg_idx = epgs.index(epg) mso.existing = schema_obj.get('templates')[template_idx]['anps'][anp_idx]['epgs'][epg_idx] if state == 'query': if epg is None: mso.existing = schema_obj.get('templates')[template_idx]['anps'][anp_idx]['epgs'] elif not mso.existing: mso.fail_json(msg="EPG '{epg}' not found".format(epg=epg)) if 'bdRef' in mso.existing: mso.existing['bdRef'] = mso.dict_from_ref(mso.existing['bdRef']) if 'vrfRef' in mso.existing: mso.existing['vrfRef'] = mso.dict_from_ref(mso.existing['vrfRef']) mso.exit_json() epgs_path = '/templates/{0}/anps/{1}/epgs'.format(template, anp) epg_path = '/templates/{0}/anps/{1}/epgs/{2}'.format(template, anp, epg) service_path = '{0}/cloudServiceEpgConfig'.format(epg_path) ops = [] cloud_service_epg_config = {} mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=epg_path)) elif state == 'present': bd_ref = mso.make_reference(bd, 'bd', schema_id, template) vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) subnets = mso.make_subnets(subnets, is_bd_subnet=False) if display_name is None and not mso.existing: display_name = epg payload = dict( name=epg, displayName=display_name, uSegEpg=useg_epg, intraEpg=intra_epg_isolation, mCastSource=intersite_multicast_source, proxyArp=proxy_arp, # FIXME: Missing functionality # uSegAttrs=[], subnets=subnets, bdRef=bd_ref, preferredGroup=preferred_group, vrfRef=vrf_ref, ) if description is not None: payload.update(description=description) if qos_level is not None: payload.update(prio=qos_level) if epg_type is not None: payload.update(epgType=epg_type) mso.sanitize(payload, collate=True) if mso.existing: # Clean contractRef to fix api issue for contract in mso.sent.get('contractRelationships'): contract['contractRef'] = mso.dict_from_ref(contract.get('contractRef')) ops.append(dict(op='replace', path=epg_path, value=mso.sent)) else: ops.append(dict(op='add', path=epgs_path + '/-', value=mso.sent)) if epg_type == 'service': access_type_map = { 'private': 'Private', 'public': 'Public', 'public_and_private': 'PublicAndPrivate', } deployment_type_map = { 'cloud_native': 'CloudNative', 'cloud_native_managed': 'CloudNativeManaged', 'third_party': 'Third-party', } if cloud_service_epg_config != {}: cloud_service_epg_config.update(dict( deploymentType=deployment_type_map[deployment_type], serviceType=service_type, accessType=access_type_map[access_type])) ops.append(dict(op='replace', path=service_path, value=cloud_service_epg_config)) else: cloud_service_epg_config.update(dict( deploymentType=deployment_type_map[deployment_type], serviceType=service_type, accessType=access_type_map[access_type])) ops.append(dict(op='add', path=service_path, value=cloud_service_epg_config)) mso.existing = mso.proposed if 'epgRef' in mso.previous: del mso.previous['epgRef'] if 'bdRef' in mso.previous and mso.previous['bdRef'] != '': mso.previous['bdRef'] = mso.dict_from_ref(mso.previous['bdRef']) if 'vrfRef' in mso.previous and mso.previous['bdRef'] != '': mso.previous['vrfRef'] = mso.dict_from_ref(mso.previous['vrfRef']) if not module.check_mode and mso.proposed != mso.previous: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()
def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), template=dict(type='str', required=True), externalepg=dict(type='str', aliases=[ 'name' ]), # This parameter is not required for querying all objects display_name=dict(type='str'), vrf=dict(type='dict', options=mso_reference_spec()), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['externalepg']], ['state', 'present', ['externalepg', 'vrf']], ], ) schema = module.params['schema'] template = module.params['template'] externalepg = module.params['externalepg'] display_name = module.params['display_name'] vrf = module.params['vrf'] state = module.params['state'] mso = MSOModule(module) # Get schema_id schema_obj = mso.get_obj('schemas', displayName=schema) if schema_obj: schema_id = schema_obj['id'] else: mso.fail_json( msg="Provided schema '{0}' does not exist".format(schema)) schema_path = 'schemas/{id}'.format(**schema_obj) # Get template templates = [t['name'] for t in schema_obj['templates']] if template not in templates: mso.fail_json( msg="Provided template '{0}' does not exist. Existing templates: {1}" .format(template, ', '.join(templates))) template_idx = templates.index(template) # Get external EPGs externalepgs = [ e['name'] for e in schema_obj['templates'][template_idx]['externalEpgs'] ] if externalepg is not None and externalepg in externalepgs: externalepg_idx = externalepgs.index(externalepg) mso.existing = schema_obj['templates'][template_idx]['externalEpgs'][ externalepg_idx] if state == 'query': if externalepg is None: mso.existing = schema_obj['templates'][template_idx][ 'externalEpgs'] elif not mso.existing: mso.fail_json(msg="External EPG '{externalepg}' not found".format( externalepg=externalepg)) mso.exit_json() eepgs_path = '/templates/{0}/externalEpgs'.format(template) eepg_path = '/templates/{0}/externalEpgs/{1}'.format(template, externalepg) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=eepg_path)) elif state == 'present': vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) if display_name is None and not mso.existing: display_name = externalepg payload = dict( name=externalepg, displayName=display_name, vrfRef=vrf_ref, # FIXME subnets=[], contractRelationships=[], ) mso.sanitize(payload, collate=True) if mso.existing: ops.append(dict(op='replace', path=eepg_path, value=mso.sent)) else: ops.append(dict(op='add', path=eepgs_path + '/-', value=mso.sent)) mso.existing = mso.proposed if not module.check_mode: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()
def main(): argument_spec = mso_argument_spec() argument_spec.update( schema=dict(type='str', required=True), site=dict(type='str', required=True), template=dict(type='str', required=True), vrf=dict(type='dict', options=mso_reference_spec()), l3out=dict(type='str', aliases=[ 'name' ]), # This parameter is not required for querying all objects state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['l3out']], ['state', 'present', ['l3out', 'vrf']], ], ) schema = module.params.get('schema') site = module.params.get('site') template = module.params.get('template').replace(' ', '') l3out = module.params.get('l3out') vrf = module.params.get('vrf') state = module.params.get('state') mso = MSOModule(module) # Get schema objects schema_id, schema_path, schema_obj = mso.query_schema(schema) # Get template templates = [t.get('name') for t in schema_obj.get('templates')] if template not in templates: mso.fail_json( msg="Provided template '{0}' does not exist. Existing templates: {1}" .format(template, ', '.join(templates))) # Get site site_id = mso.lookup_site(site) # Get site_idx if 'sites' not in schema_obj: mso.fail_json( msg= "No site associated with template '{0}'. Associate the site with the template using mso_schema_site." .format(template)) sites = [(s.get('siteId'), s.get('templateName')) for s in schema_obj.get('sites')] if (site_id, template) not in sites: mso.fail_json(msg="Provided template '{0}' is not associated to site". format(template)) # Schema-access uses indexes site_idx = sites.index((site_id, template)) # Path-based access uses site_id-template site_template = '{0}-{1}'.format(site_id, template) # Get l3out l3out_ref = mso.l3out_ref(schema_id=schema_id, template=template, l3out=l3out) l3outs = [ v.get('l3outRef') for v in schema_obj.get('sites')[site_idx]['intersiteL3outs'] ] if l3out is not None and l3out_ref in l3outs: l3out_idx = l3outs.index(l3out_ref) l3out_path = '/sites/{0}/intersiteL3outs/{1}'.format( site_template, l3out) mso.existing = schema_obj.get( 'sites')[site_idx]['intersiteL3outs'][l3out_idx] if state == 'query': if l3out is None: mso.existing = schema_obj.get('sites')[site_idx]['intersiteL3outs'] for l3out in mso.existing: l3out['l3outRef'] = mso.dict_from_ref(l3out.get('l3outRef')) elif not mso.existing: mso.fail_json(msg="L3Out '{l3out}' not found".format(l3out=l3out)) mso.exit_json() l3outs_path = '/sites/{0}/intersiteL3outs'.format(site_template) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=l3out_path)) elif state == 'present': vrf_ref = mso.make_reference(vrf, 'vrf', schema_id, template) payload = dict( l3outRef=dict( schemaId=schema_id, templateName=template, l3outName=l3out, ), vrfRef=vrf_ref, ) mso.sanitize(payload, collate=True) if mso.existing: ops.append(dict(op='replace', path=l3out_path, value=mso.sent)) else: ops.append(dict(op='add', path=l3outs_path + '/-', value=mso.sent)) mso.existing = mso.proposed if not module.check_mode: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()