def main():
    prepare_connectors()

    resource = LogicalRouter(
        router_type=LogicalRouter.ROUTER_TYPE_TIER0,
        display_name=NAME_PREFIX + "t0",
        failover_mode=LogicalRouter.FAILOVER_MODE_PREEMPTIVE)
    new_t0 = SVC_LOGICAL_ROUTERS.create(resource)
    RESOURCES.append((type(new_t0), new_t0.id))

    resource = LogicalRouter(
        router_type=LogicalRouter.ROUTER_TYPE_TIER1,
        display_name=NAME_PREFIX + "t1-mars",
        failover_mode=LogicalRouter.FAILOVER_MODE_PREEMPTIVE)
    new_t1_1 = SVC_LOGICAL_ROUTERS.create(resource)
    RESOURCES.append((type(new_t1_1), new_t1_1.id))

    resource = LogicalRouter(
        router_type=LogicalRouter.ROUTER_TYPE_TIER1,
        display_name=NAME_PREFIX + "t1-snickers",
        failover_mode=LogicalRouter.FAILOVER_MODE_PREEMPTIVE)
    new_t1_2 = SVC_LOGICAL_ROUTERS.create(resource)
    RESOURCES.append((type(new_t1_2), new_t1_2.id))

    resource = LogicalSwitch(
        transport_zone_id=TRANSPORT_ZONE_ID,
        admin_state=LogicalSwitch.ADMIN_STATE_UP,
        replication_mode=LogicalSwitch.REPLICATION_MODE_MTEP,
        display_name=NAME_PREFIX + "ls-mars",
    )
    new_ls_1 = SVC_LOGICAL_SWITCHES.create(resource)
    RESOURCES.append((type(new_ls_1), new_ls_1.id))

    resource = LogicalSwitch(
        transport_zone_id=TRANSPORT_ZONE_ID,
        admin_state=LogicalSwitch.ADMIN_STATE_UP,
        replication_mode=LogicalSwitch.REPLICATION_MODE_MTEP,
        display_name=NAME_PREFIX + "ls-snickers",
    )
    new_ls_2 = SVC_LOGICAL_SWITCHES.create(resource)
    RESOURCES.append((type(new_ls_2), new_ls_2.id))

    print(RESOURCES)

    for elem in RESOURCES:
        delete_resource(elem[0], elem[1])
Example #2
0
def main():
    module = AnsibleModule(argument_spec=dict(
        display_name=dict(required=True, type='str'),
        description=dict(required=False, type='str', default=None),
        failover_mode=dict(required=False,
                           type='str',
                           default=None,
                           choices=['NON_PREEMPTIVE', 'PREEMPTIVE']),
        edge_cluster_id=dict(required=False, type='str', default=None),
        high_availability_mode=dict(
            required=False,
            type='str',
            default='ACTIVE_STANDBY',
            choices=['ACTIVE_STANDBY', 'ACTIVE_ACTIVE']),
        tags=dict(required=False, type='dict', default=None),
        state=dict(required=False,
                   type='str',
                   default="present",
                   choices=['present', 'absent']),
        nsx_manager=dict(required=True, type='str'),
        nsx_username=dict(required=True, type='str'),
        nsx_passwd=dict(required=True, type='str', no_log=True)),
                           supports_check_mode=True)

    if not HAS_PYNSXT:
        module.fail_json(msg='pynsxt is required for this module')
    session = requests.session()
    session.verify = False
    nsx_url = 'https://%s:%s' % (module.params['nsx_manager'], 443)
    connector = connect.get_requests_connector(session=session,
                                               msg_protocol='rest',
                                               url=nsx_url)
    stub_config = StubConfigurationFactory.new_std_configuration(connector)
    security_context = create_user_password_security_context(
        module.params["nsx_username"], module.params["nsx_passwd"])
    connector.set_security_context(security_context)
    requests.packages.urllib3.disable_warnings()
    #tags=None
    tags = []
    tags.append(
        Tag(scope='created-by', tag=os.getenv("NSX_T_INSTALLER", "nsx-t-gen")))

    if module.params['tags'] is not None:
        #tags = []
        for key, value in module.params['tags'].items():
            tag = Tag(scope=key, tag=value)
            tags.append(tag)
    lr_svc = LogicalRouters(stub_config)
    lr = getLogicalRouterByName(module, stub_config)
    if module.params['state'] == 'present':
        if lr is None:
            tags.append(
                Tag(scope='generated',
                    tag=time.strftime("%Y-%m-%d %H:%M:%S %z")))
            new_lr = LogicalRouter(
                display_name=module.params['display_name'],
                description=module.params['description'],
                failover_mode=module.params['failover_mode'],
                edge_cluster_id=module.params['edge_cluster_id'],
                router_type='TIER0',
                high_availability_mode=module.params['high_availability_mode'],
                tags=tags)
            if module.check_mode:
                module.exit_json(changed=True,
                                 debug_out=str(new_lr),
                                 id="1111")
            try:
                new_lr = lr_svc.create(new_lr)
                module.exit_json(
                    changed=True,
                    object_name=module.params['display_name'],
                    id=new_lr.id,
                    message="Logical Router with name %s created!" %
                    (module.params['display_name']))
            except Error as ex:
                module.fail_json(msg='API Error listing Logical Routers: %s' %
                                 (str(ex)))
        elif lr:
            #if tags != lr.tags:
            if not compareTags(lr.tags, tags):
                tags.append(findTag(lr.tags, 'generated'))
                tags.append(
                    Tag(scope='modified',
                        tag=time.strftime("%Y-%m-%d %H:%M:%S %z")))
                lr.tags = tags
                if module.check_mode:
                    module.exit_json(changed=True, debug_out=str(lr), id=lr.id)
                new_lr = lr_svc.update(lr.id, lr)
                module.exit_json(
                    changed=True,
                    object_name=module.params['display_name'],
                    id=new_lr.id,
                    message="Logical Router with name %s has changed tags!" %
                    (module.params['display_name']))
            module.exit_json(
                changed=False,
                object_name=module.params['display_name'],
                id=lr.id,
                message="Logical Router with name %s already exists!" %
                (module.params['display_name']))

    elif module.params['state'] == "absent":

        if lr:
            if module.check_mode:
                module.exit_json(changed=True, debug_out=str(lr), id=lr.id)
            try:
                deleteAllPortsOnRouter(lr, module, stub_config)
                lr_svc.delete(lr.id)
            except Error as ex:
                api_error = ex.date.convert_to(ApiError)
                module.fail_json(msg='API Error deleting Logical Routers: %s' %
                                 (api_error.error_message))

            module.exit_json(changed=True,
                             object_name=module.params['display_name'],
                             message="Logical Router with name %s deleted!" %
                             (module.params['display_name']))
        module.exit_json(
            changed=False,
            object_name=module.params['display_name'],
            message="Logical Router with name %s does not exist!" %
            (module.params['display_name']))
Example #3
0
def main():
    module = AnsibleModule(
        argument_spec=dict(
            display_name=dict(required=True, type='str'),
            description=dict(required=False, type='str', default=None),
            failover_mode=dict(required=False, type='str', default=None, choices=['NON_PREEMPTIVE', 'PREEMPTIVE']),
            edge_cluster_id=dict(required=False, type='str', default=None),
            connected_t0_id=dict(required=False, type='str', default=None),
            high_availability_mode=dict(required=False, type='str', default='ACTIVE_STANDBY', choices=['ACTIVE_STANDBY', 'ACTIVE_ACTIVE']),
            advertise=dict(required=False, type='dict', default=None),
            tags=dict(required=False, type='dict', default=None),
            state=dict(required=False, type='str', default="present", choices=['present', 'absent']),
            nsx_manager=dict(required=True, type='str'),
            nsx_username=dict(required=True, type='str'),
            nsx_passwd=dict(required=True, type='str', no_log=True)
        ),
        supports_check_mode=True
    )

    if not HAS_PYNSXT:
        module.fail_json(msg='pynsxt is required for this module')
    session = requests.session()
    session.verify = False
    nsx_url = 'https://%s:%s' % (module.params['nsx_manager'], 443)
    connector = connect.get_requests_connector(
        session=session, msg_protocol='rest', url=nsx_url)
    stub_config = StubConfigurationFactory.new_std_configuration(connector)
    security_context = create_user_password_security_context(module.params["nsx_username"], module.params["nsx_passwd"])
    connector.set_security_context(security_context)
    requests.packages.urllib3.disable_warnings()
    desired_adv_config = AdvertisementConfig()
    if module.params['advertise']:
        if 'enabled' in module.params['advertise']:
            desired_adv_config.enabled = module.params['advertise']['enabled']
        else:
            desired_adv_config.enabled = True
        if 'advertise_lb_snat_ip' in module.params['advertise'] and module.params['advertise']['advertise_lb_snat_ip']:
            desired_adv_config.advertise_lb_snat_ip = module.params['advertise']['advertise_lb_snat_ip']
        if 'advertise_lb_vip' in module.params['advertise'] and module.params['advertise']['advertise_lb_vip']:
            desired_adv_config.advertise_lb_vip = module.params['advertise']['advertise_lb_vip']
        if 'advertise_nat_routes' in module.params['advertise'] and module.params['advertise']['advertise_nat_routes']:
            desired_adv_config.advertise_nat_routes = module.params['advertise']['advertise_nat_routes']
        if 'advertise_nsx_connected_routes' in module.params['advertise'] and module.params['advertise']['advertise_nsx_connected_routes']:
            desired_adv_config.advertise_nsx_connected_routes = module.params['advertise']['advertise_nsx_connected_routes']
        if 'advertise_static_routes' in module.params['advertise'] and module.params['advertise']['advertise_static_routes']:
            desired_adv_config.advertise_static_routes = module.params['advertise']['advertise_static_routes']

    tags=None
    if module.params['tags'] is not None:
        tags = []
        for key, value in module.params['tags'].items():
            tag=Tag(scope=key, tag=value)
            tags.append(tag)
    lr_svc = LogicalRouters(stub_config)
    lr = getLogicalRouterByName(module, stub_config)
    if module.params['state'] == 'present':
        if lr is None:
            new_lr = LogicalRouter(
                display_name=module.params['display_name'],
                description=module.params['description'],
                failover_mode=module.params['failover_mode'],
                edge_cluster_id=module.params['edge_cluster_id'],
                router_type='TIER1',
                high_availability_mode=module.params['high_availability_mode'],
                tags=tags
            )
            if module.check_mode:
                module.exit_json(changed=True, debug_out=str(new_lr), id="1111")
            try:
                new_lr = lr_svc.create(new_lr)
                mylr = getLogicalRouterByName(module, stub_config)
                if module.params['connected_t0_id']:
                    connectT0(mylr, module, stub_config)
                if module.params['advertise']:
                    adv_svc = Advertisement(stub_config)
                    adv_config = adv_svc.get(mylr.id)
                    adv_config.enabled = desired_adv_config.enabled
                    adv_config.advertise_lb_snat_ip = desired_adv_config.advertise_lb_snat_ip
                    adv_config.advertise_lb_vip = desired_adv_config.advertise_lb_vip
                    adv_config.advertise_nat_routes = desired_adv_config.advertise_nat_routes
                    adv_config.advertise_nsx_connected_routes = desired_adv_config.advertise_nsx_connected_routes
                    adv_config.advertise_static_routes = desired_adv_config.advertise_static_routes
                    adv_svc.update(mylr.id, adv_config)
                module.exit_json(changed=True, object_name=module.params['display_name'], id=mylr.id, message="Logical Router with name %s created!"%(module.params['display_name']))
            except Error as ex:
                module.fail_json(msg='API Error listing Logical Routers: %s'%(str(ex)))
        elif lr:
            adv_svc = Advertisement(stub_config)
            adv_config = adv_svc.get(lr.id)
            changed = False
            if tags != lr.tags:
                changed = True
                lr.tags=tags
            if module.params['edge_cluster_id'] != lr.edge_cluster_id:
                lr.edge_cluster_id=module.params['edge_cluster_id']
                changed = True
            if changed:
                if module.check_mode:
                    module.exit_json(changed=True, debug_out=str(lr), id=lr.id)
                new_lr = lr_svc.update(lr.id, lr)
                module.exit_json(changed=True, object_name=module.params['display_name'], id=new_lr.id, message="Logical Router with name %s has been modified!"%(module.params['display_name']))
            if compareLrpT0T1(lr, module, stub_config):
                module.exit_json(changed=True, object_name=module.params['display_name'], id=lr.id, message="Logical Router uplink on T1 with name %s has been modified!"%(module.params['display_name']))
            if module.params['advertise']:
                changed = False
                if ('enabled' not in module.params['advertise']):
                    changed = False
                elif module.params['advertise']['enabled'] != adv_config.enabled:
                    adv_config.enabled = desired_adv_config.enabled
                    changed = True
                if ('advertise_lb_snat_ip' not in module.params['advertise']):
                    if adv_config.advertise_lb_snat_ip:
                        adv_config.advertise_lb_snat_ip = None
                        changed = True
                elif module.params['advertise']['advertise_lb_snat_ip'] != adv_config.advertise_lb_snat_ip:
                    adv_config.advertise_lb_snat_ip = desired_adv_config.advertise_lb_snat_ip
                    changed = True

                if ('advertise_lb_vip' not in module.params['advertise']):
                    if adv_config.advertise_lb_vip:
                        adv_config.advertise_lb_vip = None
                        changed = True
                elif module.params['advertise']['advertise_lb_vip'] != adv_config.advertise_lb_vip:
                    adv_config.advertise_lb_vip = desired_adv_config.advertise_lb_vip
                    changed = True
 
                if ('advertise_nat_routes' not in module.params['advertise']):
                    if adv_config.advertise_nat_routes:
                        adv_config.advertise_nat_routes = None
                        changed = True
                elif module.params['advertise']['advertise_nat_routes'] != adv_config.advertise_nat_routes:
                    adv_config.advertise_nat_routes = desired_adv_config.advertise_nat_routes
                    changed = True

                if ('advertise_nsx_connected_routes' not in module.params['advertise']):
                    if adv_config.advertise_nsx_connected_routes:
                        adv_config.advertise_nsx_connected_routes = None
                        changed = True
                elif module.params['advertise']['advertise_nsx_connected_routes'] != adv_config.advertise_nsx_connected_routes:
                    adv_config.advertise_nsx_connected_routes = desired_adv_config.advertise_nsx_connected_routes
                    changed = True

                if ('advertise_static_routes' not in module.params['advertise']):
                    if adv_config.advertise_static_routes:
                        adv_config.advertise_static_routes = None
                        changed = True
                elif module.params['advertise']['advertise_static_routes'] != adv_config.advertise_static_routes:
                    adv_config.advertise_static_routes = desired_adv_config.advertise_static_routes
                    changed = True

                if changed:
                    if module.check_mode:
                        module.exit_json(changed=True, debug_out=str(adv_config), id=lr.id)
                    adv_svc.update(lr.id, adv_config)
                    module.exit_json(changed=True, object_name=module.params['display_name'], id=lr.id, message="Logical Router advertisement config on T1 with name %s has been modified!"%(module.params['display_name']))

            module.exit_json(changed=False, object_name=module.params['display_name'], id=lr.id, message="Logical Router with name %s already exists!"%(module.params['display_name']))

    elif module.params['state'] == "absent":
        if lr:
            if module.check_mode:
                module.exit_json(changed=True, debug_out=str(lr), id=lr.id)
            try:
                deleteAllPortsOnRouter(lr, module, stub_config)
                lr_svc.delete(lr.id)
            except Error as ex:
                api_error = ex.date.convert_to(ApiError)
                module.fail_json(msg='API Error deleting Logical Routers: %s'%(api_error.error_message))


            module.exit_json(changed=True, object_name=module.params['display_name'], message="Logical Router with name %s deleted!"%(module.params['display_name']))
        module.exit_json(changed=False, object_name=module.params['display_name'], message="Logical Router with name %s does not exist!"%(module.params['display_name']))
Example #4
0
def main():
    args = getargs.getargs()
    stub_config = auth.get_session_auth_stub_config(args.user, args.password,
                                                    args.nsx_host,
                                                    args.tcp_port)

    pp = PrettyPrinter()

    # Instantiate all the services we'll need.
    transportzones_svc = TransportZones(stub_config)
    logicalswitches_svc = LogicalSwitches(stub_config)
    logicalrouters_svc = LogicalRouters(stub_config)
    logicalrouterports_svc = LogicalRouterPorts(stub_config)
    logicalports_svc = LogicalPorts(stub_config)
    fwsections_svc = Sections(stub_config)

    # Create a transport zone
    new_tz = TransportZone(
        transport_type=TransportZone.TRANSPORT_TYPE_OVERLAY,
        display_name="Two Tier App Demo Transport Zone",
        description="Transport zone for two-tier app demo",
        host_switch_name="hostswitch"
    )
    demo_tz = transportzones_svc.create(new_tz)

    # Create a logical switch for the db tier
    new_ls = LogicalSwitch(
        transport_zone_id=demo_tz.id,
        admin_state=LogicalSwitch.ADMIN_STATE_UP,
        replication_mode=LogicalSwitch.REPLICATION_MODE_MTEP,
        display_name="ls-db",
    )
    db_ls = logicalswitches_svc.create(new_ls)

    # Create a logical switch for the web tier
    new_ls = LogicalSwitch(
        transport_zone_id=demo_tz.id,
        admin_state=LogicalSwitch.ADMIN_STATE_UP,
        replication_mode=LogicalSwitch.REPLICATION_MODE_MTEP,
        display_name="ls-web",
    )
    web_ls = logicalswitches_svc.create(new_ls)

    # Create a logical router that will route traffic between
    # the web and db tiers
    new_lr = LogicalRouter(
        router_type=LogicalRouter.ROUTER_TYPE_TIER1,
        display_name="lr-demo",
        failover_mode=LogicalRouter.FAILOVER_MODE_PREEMPTIVE
    )
    lr = logicalrouters_svc.create(new_lr)

    # Create a logical port on the db and web logical switches. We
    # will attach the logical router to those ports so that it can
    # route between the logical switches.
    # Logical port on the db logical switch
    new_lp = LogicalPort(
        admin_state=LogicalPort.ADMIN_STATE_UP,
        logical_switch_id=db_ls.id,
        display_name="dbTierUplinkToRouter"
    )
    db_port_on_ls = logicalports_svc.create(new_lp)

    # Logical port on the web logical switch
    new_lp = LogicalPort(
        admin_state=LogicalPort.ADMIN_STATE_UP,
        logical_switch_id=web_ls.id,
        display_name="webTierUplinkToRouter"
    )
    web_port_on_ls = logicalports_svc.create(new_lp)

    # Populate a logical router downlink port payload and configure
    # the port with the CIDR 192.168.1.1/24. We will attach this
    # port to the db tier's logical switch.
    new_lr_port = LogicalRouterDownLinkPort(
        subnets=[IPSubnet(ip_addresses=["192.168.1.1"], prefix_length=24)],
        linked_logical_switch_port_id=ResourceReference(
            target_id=db_port_on_ls.id),
        resource_type="LogicalRouterDownLinkPort",
        logical_router_id=lr.id
    )
    # Create the downlink port
    lr_port_for_db_tier = logicalrouterports_svc.create(new_lr_port)
    # Convert to concrete type
    lr_port_for_db_tier = lr_port_for_db_tier.convert_to(
        LogicalRouterDownLinkPort)

    # Populate a logical router downlink port payload and configure
    # the port with the CIDR 192.168.2.1/24. We will attach this
    # port to the web tier's logical switch.
    new_lr_port = LogicalRouterDownLinkPort(
        subnets=[IPSubnet(ip_addresses=["192.168.2.1"], prefix_length=24)],
        linked_logical_switch_port_id=ResourceReference(
            target_id=web_port_on_ls.id),
        resource_type="LogicalRouterDownLinkPort",
        logical_router_id=lr.id
    )
    # Create the downlink port
    lr_port_for_web_tier = logicalrouterports_svc.create(new_lr_port)
    lr_port_for_web_tier = lr_port_for_web_tier.convert_to(
        LogicalRouterDownLinkPort)

    # Now establish a firewall policy that only allows MSSQL
    # server traffic and ICMP traffic in and out of the db tier's
    # logical switch.

    # Create 3 firewall rules. The first will allow traffic used
    # by MS SQL Server to pass. This rule references a built-in
    # ns service group that includes all the common ports used by
    # the MSSQL Server. The ID is common to all NSX installations.
    MSSQL_SERVER_NS_GROUP_ID = "5a6d380a-6d28-4e3f-b705-489f463ae6ad"
    ms_sql_rule = FirewallRule(
        action=FirewallRule.ACTION_ALLOW,
        display_name="Allow MSSQL Server",
        ip_protocol=FirewallRule.IP_PROTOCOL_IPV4_IPV6,
        services=[
            FirewallService(
                target_type="NSServiceGroup",
                target_id=MSSQL_SERVER_NS_GROUP_ID
            )
        ]
    )

    # The second rule will allow ICMP echo requests and responses.
    ICMP_ECHO_REQUEST_NS_SVC_ID = "5531a880-61aa-42cc-ba4b-13b9ea611e2f"
    ICMP_ECHO_REPLY_NS_SVC_ID = "c54b2d86-6327-41ff-a3fc-c67171b6ba63"
    icmp_rule = FirewallRule(
        action=FirewallRule.ACTION_ALLOW,
        display_name="Allow ICMP Echo",
        ip_protocol=FirewallRule.IP_PROTOCOL_IPV4_IPV6,
        services=[
            FirewallService(
                target_type="NSService",
                target_id=ICMP_ECHO_REQUEST_NS_SVC_ID
            ),
            FirewallService(
                target_type="NSService",
                target_id=ICMP_ECHO_REPLY_NS_SVC_ID
            )
        ]
    )

    # The third rule will drop all traffic not passed by the previous
    # rules.
    block_all_rule = FirewallRule(
        action=FirewallRule.ACTION_DROP,
        display_name="Drop all",
        ip_protocol=FirewallRule.IP_PROTOCOL_IPV4_IPV6
    )

    # Add all rules to a new firewall section and create the section.
    rule_list = FirewallSectionRuleList(
        rules=[ms_sql_rule, icmp_rule, block_all_rule],
        section_type=FirewallSection.SECTION_TYPE_LAYER3,
        stateful=True,
        display_name="MSSQL Server",
        description="Only allow MSSQL server traffic"
    )
    demo_section = fwsections_svc.createwithrules(
        rule_list, None, operation="insert_top")

    # Re-read the firewall section so that we are operating on up-to-date
    # data.
    section = fwsections_svc.get(demo_section.id)

    # Make the firewall section apply to the db tier logical
    # switch. This enables the firewall policy on all logical
    # ports attached to the db tier logical switch.
    section.applied_tos = [
        ResourceReference(target_id=db_ls.id,
                          target_type="LogicalSwitch")
    ]
    fwsections_svc.update(section.id, section)

    print("At this point you may attach VMs for the db tier to the db")
    print("logical switch and VMs for the web tier to the web logical")
    print("switch. The network interfaces should be configured as")
    print("follows:")
    print("db tier:")
    print("    IP address: in the range 192.168.1.2-254")
    print("    Netmask: 255.255.255.0")
    print("    Default route: 192.168.1.1")
    print("web tier:")
    print("    IP address: in the range 192.168.2.2-254")
    print("    Netmask: 255.255.255.0")
    print("    Default route: 192.168.2.1")
    print("Logical switch IDs:")
    print("    %s: %s" % (db_ls.display_name, db_ls.id))
    print("    %s: %s" % (web_ls.display_name, web_ls.id))
    print("Transport zone: %s: %s" % (demo_tz.display_name, demo_tz.id))

    print("Press enter to delete all resources created for this example.")
    sys.stdin.readline()

    fwsections_svc.delete(section.id, cascade=True)
    logicalrouterports_svc.delete(lr_port_for_web_tier.id)
    logicalrouterports_svc.delete(lr_port_for_db_tier.id)
    logicalports_svc.delete(web_port_on_ls.id)
    logicalports_svc.delete(db_port_on_ls.id)
    logicalrouters_svc.delete(lr.id)
    logicalswitches_svc.delete(web_ls.id)
    logicalswitches_svc.delete(db_ls.id)
    transportzones_svc.delete(demo_tz.id)