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', required=True), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) argument_spec.update(mso_subnet_spec()) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['subnet']], ['state', 'present', ['subnet']], ], ) schema = module.params.get('schema') template = module.params.get('template') bd = module.params.get('bd') subnet = module.params.get('subnet') description = module.params.get('description') scope = module.params.get('scope') shared = module.params.get('shared') no_default_gateway = module.params.get('no_default_gateway') state = module.params.get('state') mso = MSOModule(module) # Get schema schema_obj = mso.get_obj('schemas', displayName=schema) if not schema_obj: 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 BD bds = [ b.get('name') for b in schema_obj.get('templates')[template_idx]['bds'] ] if bd not in bds: mso.fail_json( msg="Provided BD '{0}' does not exist. Existing BDs: {1}".format( bd, ', '.join(bds))) bd_idx = bds.index(bd) # Get Subnet subnets = [ s.get('ip') for s in schema_obj.get('templates')[template_idx]['bds'] [bd_idx]['subnets'] ] if subnet in subnets: subnet_idx = subnets.index(subnet) # FIXME: Changes based on index are DANGEROUS subnet_path = '/templates/{0}/bds/{1}/subnets/{2}'.format( template, bd, subnet_idx) mso.existing = schema_obj.get( 'templates')[template_idx]['bds'][bd_idx]['subnets'][subnet_idx] if state == 'query': if subnet is None: mso.existing = schema_obj.get( 'templates')[template_idx]['bds'][bd_idx]['subnets'] elif not mso.existing: mso.fail_json(msg="Subnet IP '{subnet}' not found".format( subnet=subnet)) mso.exit_json() subnets_path = '/templates/{0}/bds/{1}/subnets'.format(template, bd) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=subnet_path)) elif state == 'present': if not mso.existing: if description is None: description = subnet if scope is None: scope = 'private' if shared is None: shared = False if no_default_gateway is None: no_default_gateway = False payload = dict( ip=subnet, description=description, scope=scope, shared=shared, noDefaultGateway=no_default_gateway, ) mso.sanitize(payload, collate=True) if mso.existing: ops.append(dict(op='replace', path=subnet_path, value=mso.sent)) else: ops.append(dict(op='add', path=subnets_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), 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()), 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') 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 ANP 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) 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, ) 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 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), anp=dict(type='str', required=True), epg=dict(type='str', required=True), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) argument_spec.update(mso_subnet_spec()) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=[ ['state', 'absent', ['subnet']], ['state', 'present', ['subnet']], ], ) schema = module.params.get('schema') site = module.params.get('site') template = module.params.get('template') anp = module.params.get('anp') epg = module.params.get('epg') subnet = module.params.get('subnet') description = module.params.get('description') scope = module.params.get('scope') shared = module.params.get('shared') no_default_gateway = module.params.get('no_default_gateway') state = module.params.get('state') mso = MSOModule(module) # Get schema_id schema_obj = mso.get_obj('schemas', displayName=schema) if not schema_obj: mso.fail_json(msg="Provided schema '{0}' does not exist".format(schema)) schema_path = 'schemas/{id}'.format(**schema_obj) schema_id = schema_obj.get('id') # Get site site_id = mso.lookup_site(site) # Get site_idx 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 site/template '{0}-{1}' does not exist. Existing sites/templates: {2}".format(site, template, ', '.join(sites))) # 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 ANP anp_ref = mso.anp_ref(schema_id=schema_id, template=template, anp=anp) anps = [a.get('anpRef') for a in schema_obj.get('sites')[site_idx]['anps']] if anp_ref 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_ref) # Get EPG epg_ref = mso.epg_ref(schema_id=schema_id, template=template, anp=anp, epg=epg) epgs = [e.get('epgRef') for e in schema_obj.get('sites')[site_idx]['anps'][anp_idx]['epgs']] if epg_ref not in epgs: mso.fail_json(msg="Provided epg '{0}' does not exist. Existing epgs: {1}".format(epg, ', '.join(epgs))) epg_idx = epgs.index(epg_ref) # Get Subnet subnets = [s.get('ip') for s in schema_obj.get('sites')[site_idx]['anps'][anp_idx]['epgs'][epg_idx]['subnets']] if subnet in subnets: subnet_idx = subnets.index(subnet) # FIXME: Changes based on index are DANGEROUS subnet_path = '/sites/{0}/anps/{1}/epgs/{2}/subnets/{3}'.format(site_template, anp, epg, subnet_idx) mso.existing = schema_obj.get('sites')[site_idx]['anps'][anp_idx]['epgs'][epg_idx]['subnets'][subnet_idx] if state == 'query': if subnet is None: mso.existing = schema_obj.get('sites')[site_idx]['anps'][anp_idx]['epgs'][epg_idx]['subnets'] elif not mso.existing: mso.fail_json(msg="Subnet '{subnet}' not found".format(subnet=subnet)) mso.exit_json() subnets_path = '/sites/{0}/anps/{1}/epgs/{2}/subnets'.format(site_template, anp, epg) ops = [] mso.previous = mso.existing if state == 'absent': if mso.existing: mso.sent = mso.existing = {} ops.append(dict(op='remove', path=subnet_path)) elif state == 'present': if not mso.existing: if description is None: description = subnet if scope is None: scope = 'private' if shared is None: shared = False if no_default_gateway is None: no_default_gateway = False payload = dict( ip=subnet, description=description, scope=scope, shared=shared, noDefaultGateway=no_default_gateway, ) mso.sanitize(payload, collate=True) if mso.existing: ops.append(dict(op='replace', path=subnet_path, value=mso.sent)) else: ops.append(dict(op='add', path=subnets_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_multicaste_source=dict(type='bool'), subnets=dict(type='list', 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') anp = module.params.get('anp') epg = module.params.get('epg') display_name = module.params.get('display_name') bd = module.params.get('bd') vrf = module.params.get('vrf') useg_epg = module.params.get('useg_epg') intra_epg_isolation = module.params.get('intra_epg_isolation') intersite_multicaste_source = module.params.get('intersite_multicaste_source') 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)) 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) 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, proxyArp=intersite_multicaste_source, # FIXME: Missing functionality # uSegAttrs=[], contractRelationships=[], subnets=subnets, bdRef=bd_ref, preferredGroup=preferred_group, vrfRef=vrf_ref, ) mso.sanitize(payload, collate=True) if mso.existing: 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 not module.check_mode: mso.request(schema_path, method='PATCH', data=ops) mso.exit_json()