示例#1
0
def build_transport_zone(dir, context, type='transport_zone', alternate_template=None):

    # if found the matching transport zone (either given or default), return
    if check_transport_zone(context):
        return

    # Transport zone does not exist, lets create
    transport_zone_name = context['nsxmanager'].get('transport_zone')
    if not transport_zone_name:
        transport_zone_name = context['name'] + '-tz'

    transport_zone = {}
    transport_zone['name'] = transport_zone_name
    transport_zone['cluster_names'] = context['nsxmanager'].get('transport_zone_clusters').strip()
    if transport_zone['cluster_names'] == '':
        raise Exception('Error! No cluster members specified to create the Transport Zone...!!')
    
    cluster_ids = ''
    for cluster_name in transport_zone['cluster_names'].split(','):
        cluster_id = mobclient.lookup_moid(cluster_name.strip())
        if 'domain' in cluster_id:
            cluster_ids += cluster_id + ','

    cluster_ids = cluster_ids.strip(',')
    if cluster_ids == '':
        raise Exception('Error! No matching cluster members found to create the Transport Zone...!!')
    
    transport_zone['cluster_ids'] = cluster_ids
    tz_context = {
        'context': context,
        'transport_zone': transport_zone,
        'files': []
    }    

    transport_zones_dir = os.path.realpath(os.path.join(dir ))
    if os.path.isdir(transport_zones_dir):
        shutil.rmtree(transport_zones_dir)
    mkdir_p(transport_zones_dir)

    template_dir = '.'
    if alternate_template is not None:
        template_dir = os.path.join(template_dir, alternate_template)

    template.render(
        os.path.join(transport_zones_dir, transport_zone['name'] + '_payload.xml'),
        os.path.join(template_dir, 'vdn_scope_post_payload.xml' ),
        tz_context
    )

    post_response = client.post_xml(NSX_URLS['scope']['all'], 
            os.path.join(transport_zones_dir, transport_zone['name'] + '_payload.xml'))
    data = post_response.text
    if DEBUG:
        print('Transport Zone creation response:{}\n'.format(data))

    if post_response.status_code < 400: 
        print('Created Transport Zone : {}\n'.format(transport_zone['name']))
        context['nsxmanager']['transport_zone'] = transport_zone['name']
        context['nsxmanager']['transport_zone_id'] = data
示例#2
0
def add_certs_to_nsx_edge(nsx_edges_dir, nsx_edge, cert_section):

    map_nsx_esg_id( [ nsx_edge ] )

    cert_config = cert_section.get('config')
    if not cert_config:
        print('No certs section to use an available cert or generate cert was specified for cert: {} for edge instance: {}'.\
                    format( cert_section['name'], nsx_edge['name']))
        raise Exception('Creation of NSX Edge failed, no certs section was provided')   

    if cert_config.get('cert_id'):
        print('Going to use available cert id: {} from its cert_config for edge instance: {}'.\
                    format(cert_config['cert_id'], nsx_edge['name']))
        return

    
    if cert_config.get('key') and cert_config.get('cert'):
        print('Using the provided certs and key for associating with NSX Edge instance: {}'.format(nsx_edge['name']))
        cert_config['key'] = cert_config.get('key').strip() + '\n'
        cert_config['cert'] = cert_config.get('cert').strip() + '\n'
    else:
        # Try to generate certs if key and cert are not provided
        generate_certs(cert_section)
    
    certPayloadFile = os.path.join(nsx_edges_dir, cert_section['name'] + '_cert_post_payload.xml')

    template_dir = '.'
    nsx_cert_context = {
        'certs': cert_section,
        'files': []
    }    

    template.render(
        certPayloadFile,
        os.path.join(template_dir, 'edge_cert_post_payload.xml' ),
        nsx_cert_context
    )

    retry = True
    while (retry):
            
        retry = False
        post_response = client.post_xml(NSX_URLS['cert']['all'] + '/' + nsx_edge['id'], 
                certPayloadFile, check=False)
        data = post_response.text

        if DEBUG:
            print('NSX Edge Cert {} addition response:\{}\n'.format(cert_section['name'], data))

        if post_response.status_code < 400: 
            certPostResponseDoc = xmltodict.parse(data)

            certId = certPostResponseDoc['certificates']['certificate']['objectId']
            cert_section['cert_id'] = certId
            print('Added `{}` cert with id: `{}` to NSX Edge: `{}`\n'.format(cert_section['name'], cert_section['cert_id'], nsx_edge['name']))
            return certId

        elif post_response.status_code == 404: 
            print('NSX Edge {} not yet up, retrying!!'.format(nsx_edge['name']))
            retry = True 
            print('Going to retry addition of cert {} again... for NSX Edge: {}\n'.format(cert_section['name'], nsx_edge['name']))
        else:
            print('Addition of NSX Edge Cert {} failed, details:{}\n'.format(cert_section['name'], data))
            raise Exception('Addition of NSX Edge Cert `{}` failed, details:\n {}'.format(cert_section['name'], data))
示例#3
0
def build_nsx_edge_gateways(dir, context, alternate_template=None):
    nsx_edges_dir = os.path.realpath(os.path.join(dir ))
    
    if os.path.isdir(nsx_edges_dir):
        shutil.rmtree(nsx_edges_dir)
    mkdir_p(nsx_edges_dir)

    template_dir = '.'
    if alternate_template is not None:
        template_dir = os.path.join(template_dir, alternate_template)

    logical_switches = context['logical_switches']
    map_logical_switches_id(logical_switches)
    if DEBUG:
        print('Logical Switches:{}\n'.format(str(logical_switches)))

    empty_logical_switches = xrange(len(logical_switches) + 1, 10) 
    vcenterMobMap = refresh_moid_map(context)
    vm_network_moid = mobclient.lookup_moid('VM Network')

    # Go with the VM Network for default uplink
    nsxmanager = context['nsxmanager']
    bosh_nsx_enabled = nsxmanager['bosh_nsx_enabled']

    uplink_port_switch = nsxmanager['uplink_details'].get('uplink_port_switch')
    if uplink_port_switch is None:
        uplink_port_switch = 'VM Network'
        nsxmanager['uplink_details']['uplink_port_switch'] = uplink_port_switch
        
    # if use_port_switch is set to 'VM Network' or port switch id could not be retreived.
    portSwitchId = mobclient.lookup_moid(uplink_port_switch) 
    if (portSwitchId is None):
        nsxmanager['uplink_details']['uplink_id'] = vm_network_moid
    else:
        nsxmanager['uplink_details']['uplink_id'] = portSwitchId
    
    for nsx_edge in  context['edge_service_gateways']:
    
        # Defaults routed components
        # FIX ME -- would have to update this 
        # for any new component that needs direct route via firewall
        opsmgr_routed_component = nsx_edge['routed_components'][0]
        ert_routed_component    = nsx_edge['routed_components'][1]
        diego_routed_component  = nsx_edge['routed_components'][2]
        tcp_routed_component    = nsx_edge['routed_components'][3]

        isozone_routed_components = []
        iso_zones = []


        for routed_component in nsx_edge['routed_components']:
            routed_component_name_upper = routed_component['name'].upper()

            if 'ISOZONE' in routed_component_name_upper:
                isozone_routed_components.append(routed_component)
                iso_zone = { 'name' : routed_component['switch']['given_name'] }

                if iso_zone not in iso_zones:
                    iso_zones.append(iso_zone)
            else:
                if 'OPS' in routed_component_name_upper:
                    opsmgr_routed_component = routed_component
                elif 'GO-ROUTER' in routed_component_name_upper:
                    ert_routed_component = routed_component
                elif 'DIEGO' in routed_component_name_upper:
                    diego_routed_component = routed_component
                elif 'TCP-ROUTER' in routed_component_name_upper:
                    tcp_routed_component = routed_component

        nsx_edge['iso_zones'] = iso_zones

        ertLogicalSwitch = {}
        infraLogicalSwitch = {}
        ospfLogicalSwitch = {}

        for name, lswitch in nsx_edge['global_switches'].iteritems():
            switch_name_upper = name.upper()
            if 'ERT' in switch_name_upper:
                ertLogicalSwitch = lswitch
            elif 'INFRA' in switch_name_upper:
                infraLogicalSwitch = lswitch
            elif 'OSPF' in switch_name_upper:
                ospfLogicalSwitch = lswitch             

        nsx_edge['bosh_nsx_enabled'] = bosh_nsx_enabled

        vcenter_ctx = context['vcenter']

        nsx_edge['datacenter_id'] = mobclient.lookup_moid(vcenter_ctx['datacenter']) 

        # Use the cluster name/id for resource pool...
        nsx_edge['datastore_id'] = mobclient.lookup_moid(vcenter_ctx['datastore']) 
        nsx_edge['cluster_id'] = mobclient.lookup_moid(vcenter_ctx['cluster'])   
        nsx_edge['resourcePool_id'] = mobclient.lookup_moid(vcenter_ctx['cluster'])
        
        # TODO: Ignore the vm folder for now...
        #nsx_edge['vmFolder_id'] = mobclient.lookup_moid(vcenter_ctx['vmFolder']) 

        # Get a large cidr (like 16) that would allow all networks to talk to each other
        cross_network_cidr = calculate_cross_network_cidr(infraLogicalSwitch)
        
        gateway_address = nsx_edge.get('gateway_ip')
        if not gateway_address:
            gateway_address = calculate_gateway(context['nsxmanager']['uplink_details']['uplink_ip'])   

        firewall_src_network_list = logical_switches
        firewall_destn_network_list = logical_switches

        cross_logical_network_combo = cross_combine_lists(firewall_src_network_list, firewall_destn_network_list)       

        if DEBUG:
            print('NSX Edge config: {}\n'.format(str(nsx_edge)))   

        nsx_edges_context = {
            'context': context,
            'defaults': context['defaults'],
            'nsxmanager': context['nsxmanager'],
            'static_routes': context['nsxmanager']['static_routes'],
            'edge': nsx_edge,
            'enable_dlr': nsx_edge['enable_dlr'],
            'logical_switches': logical_switches,
            'empty_logical_switches': empty_logical_switches,
            'global_switches': nsx_edge['global_switches'],
            'ospfLogicalSwitch': ospfLogicalSwitch,
            'infraLogicalSwitch': infraLogicalSwitch,
            'ertLogicalSwitch': ertLogicalSwitch,
            'routed_components':  nsx_edge['routed_components'],
            'opsmgr_routed_component': opsmgr_routed_component,
            'ert_routed_component': ert_routed_component,
            'diego_routed_component': diego_routed_component,
            'tcp_routed_component': tcp_routed_component,
            'isozone_routed_components': isozone_routed_components,
            'cross_network_cidr': cross_network_cidr,
            'cross_logical_network_combo': cross_logical_network_combo,
            'gateway_address': gateway_address,
            'files': []
        }    

        template.render(
            os.path.join(nsx_edges_dir, nsx_edge['name'] + '_post_payload.xml'),
            os.path.join(template_dir, 'edge_config_post_payload.xml' ),
            nsx_edges_context
        )
        
        """
        if True:
        """
        print('Creating NSX Edge instance: {}\n\n'.format(nsx_edge['name']))
        post_response = client.post_xml(NSX_URLS['esg']['all'] , 
                                os.path.join(nsx_edges_dir, nsx_edge['name'] + '_post_payload.xml'), 
                                check=False)
        data = post_response.text
        
        if post_response.status_code < 400: 
            print('Success!! Created NSX Edge :{}\n'.format(nsx_edge['name']))
            add_ert_certs_to_nsx_edge(nsx_edges_dir, nsx_edge)
            add_iso_certs_to_nsx_edge(nsx_edges_dir, nsx_edge)
            print('Finished adding certs to NSX Edge :{}!!\n'.format(nsx_edge['name']))

            print('Updating LBR config!!')
            add_lbr_to_nsx_edge(nsx_edges_dir, nsx_edge)
            print('Success!! Finished complete creation of NSX Edge instance: {}\n\n'.format(nsx_edge['name']))
        else:
            print('Creation of NSX Edge failed, details:\n{}\n'.format(data))
            raise Exception('Creation of NSX Edge failed, details:\n {}'.format(data))          
示例#4
0
def build_nsx_dlrs(dir, context, alternate_template=None):
    nsx_dlrs_dir = os.path.realpath(os.path.join(dir ))
    
    if os.path.isdir(nsx_dlrs_dir):
        shutil.rmtree(nsx_dlrs_dir)
    mkdir_p(nsx_dlrs_dir)

    template_dir = '.'
    if alternate_template is not None:
        template_dir = os.path.join(template_dir, alternate_template)

    logical_switches = context['logical_switches']
    map_logical_switches_id(logical_switches)
    if DEBUG:
        print('Logical Switches:{}\n'.format(str(logical_switches)))

    empty_logical_switches = xrange(len(logical_switches) + 1, 10) 
    vcenterMobMap = refresh_moid_map(context)
    vm_network_moid = mobclient.lookup_moid('VM Network')

    # Go with the VM Network for default uplink
    nsxmanager = context['nsxmanager']
    enable_dlr = nsxmanager['enable_dlr']
    if enable_dlr:
        nsxmanager['distributed_portgroup_id'] =  mobclient.lookup_moid(nsxmanager['distributed_portgroup'])

    uplink_port_switch = nsxmanager['uplink_details'].get('uplink_port_switch')
    if uplink_port_switch is None:
        uplink_port_switch = 'VM Network'
        nsxmanager['uplink_details']['uplink_port_switch'] = uplink_port_switch
    
    # if use_port_switch is set to 'VM Network' or port switch id could not be retreived.
    portSwitchId = mobclient.lookup_moid(uplink_port_switch) 
    if (portSwitchId is None):
        #nsxmanager['uplink_details']['uplink_id'] = vm_network_moid
        raise Exception('Error! Uplink Port Group not defined...!!')
    
    nsxmanager['uplink_details']['uplink_id'] = portSwitchId

    dlr_instances = []
    
    for nsx_edge in  context['edge_service_gateways']:
    
        enable_dlr = nsx_edge['enable_dlr']
        if not enable_dlr:
            print('DLR disabled!! Not creating DLR for NSX Edge: ' + nsx_edge['name'])
            continue

        nsx_dlr = copy.deepcopy(nsx_edge)

        vcenter_ctx = context['vcenter']

        nsx_dlr['name'] = nsx_dlr['name'] + '-dlr'
        print('Name of DLR: ' + nsx_dlr['name'])
        nsx_dlr['datacenter_id'] = mobclient.lookup_moid(vcenter_ctx['datacenter']) 

        # Use the cluster name/id for resource pool...
        nsx_dlr['datastore_id'] = mobclient.lookup_moid(vcenter_ctx['datastore']) 
        nsx_dlr['cluster_id'] = mobclient.lookup_moid(vcenter_ctx['cluster'])   
        nsx_dlr['resourcePool_id'] = mobclient.lookup_moid(vcenter_ctx['cluster'])

        
        gateway_address = nsx_dlr.get('gateway_ip')
        if not gateway_address:
            gateway_address = calculate_gateway(context['nsxmanager']['uplink_details']['uplink_ip'])
            nsx_dlr['gateway_ip'] = gateway_address 

        nsx_dlrs_context = {
            'context': context,
            'defaults': context['defaults'],
            'nsxmanager': context['nsxmanager'],
            'dlr': nsx_dlr,
            'logical_switches': logical_switches,
            'empty_logical_switches': empty_logical_switches,
            'gateway_address': gateway_address,
            'files': []
        }    

        template.render(
            os.path.join(nsx_dlrs_dir, nsx_dlr['name'] + '_dlr_post_payload.xml'),
            os.path.join(template_dir, 'dlr_config_post_payload.xml' ),
            nsx_dlrs_context
        )
        
        print('Creating NSX DLR instance: {}\n\n'.format(nsx_dlr['name']))

        post_response = client.post_xml(NSX_URLS['esg']['all'] , 
                                os.path.join(nsx_dlrs_dir, nsx_dlr['name'] + '_dlr_post_payload.xml'), 
                                check=False)
        data = post_response.text
        
        if post_response.status_code < 400: 
            print('Created NSX DLR :{}\n'.format(nsx_dlr['name']))
            print('Success!! Finished creation of NSX DLR instance: {}\n\n'.format(nsx_dlr['name']))
            add_ospf_to_nsx_dlr(nsx_dlrs_dir, context, nsx_dlr)
            print('Success!! Finished adding OSPF & Interfaces for NSX DLR instance: {}\n\n'.format(nsx_dlr['name']))
        else:
            print('Creation of NSX DLR failed, details:\n{}\n'.format(data))
            raise Exception('Creation of NSX DLR failed, details:\n {}'.format(data))           

        dlr_instances.append(nsx_dlr)

    context['nsx_dlrs'] = dlr_instances
示例#5
0
def build_logical_switches(dir, context, type='logical_switches', alternate_template=None):

    logical_switches_dir = os.path.realpath(os.path.join(dir ))
    
    if os.path.isdir(logical_switches_dir):
        shutil.rmtree(logical_switches_dir)
    mkdir_p(logical_switches_dir)

    template_dir = '.'
    if alternate_template is not None:
        template_dir = os.path.join(template_dir, alternate_template)

    vcenterMobMap = refresh_moid_map(context)
    
    transportZone = context['nsxmanager'].get('transport_zone')
    
    try:
        transportZoneClusters = context['nsxmanager'].get('transport_zone_clusters')
    except KeyError:
        pass
    
    if transportZone or transportZoneClusters:
        build_transport_zone(dir, context, 'transport_zone')
    else:
        raise Exception('Error! No transport zone name or cluster members specified to create the Transport Zone...!!')
    
    defaultVdnScopeId = context['nsxmanager']['transport_zone_id']

    enable_dlr = context['nsxmanager']['enable_dlr']
        
    for lswitch in  context[type]: 

        # Skip if DLR is disabled and OSPF is in the switch name
        if not enable_dlr and 'OSPF' in lswitch['name']:
            continue

        if check_logical_switch_exists(vcenterMobMap, lswitch['name']):
            print('\tSkipping creation of Logical Switch: {} !!'.format(lswitch['name']))           
            continue

        logical_switches_context = {
            'context': context,
            'logical_switch': lswitch,
            'files': []
        }    

        template.render(
            os.path.join(logical_switches_dir, lswitch['name'] + '_payload.xml'),
            os.path.join(template_dir, 'logical_switch_config_post_payload.xml' ),
            logical_switches_context
        )

        # Get the vdn scopes
        #  https://10.193.99.20//api/2.0/vdn/scopes
        # After determining the vdn scope, then post to that scope endpoint

        # POST /api/2.0/vdn/scopes/vdnscope-1/virtualwires
        post_response = client.post_xml(NSX_URLS['scope']['all'] + '/' 
                    + defaultVdnScopeId+'/virtualwires', 
                os.path.join(logical_switches_dir, lswitch['name'] + '_payload.xml'))
        data = post_response.text
        print('Created Logical Switch : {}\n'.format(lswitch['name']))
        if DEBUG:
            print('Logical switch creation response:{}\n'.format(data))