Exemplo n.º 1
0
    def servicegroup(self, action, name, svc_type):
        '''Function to add or remove a service group.

	@param action string: add or delete.
	@param name string: describing the service group.
	@param svc_type string: HTTP, FTP, TCP, UDP, SSL, SSL_BRIDGE, SSL_TCP,
		DTLS, NNTP, RPCSVR, DNS, ADNS, SNMP, RTSP, DHCPRA, ANY,
		SIP_UDP, SIP_TCP, SIP_SSL, DNS_TCP, ADNS_TCP, MYSQL, MSSQL,
		ORACLE, RADIUS, RADIUSListener, RDP, DIAMETER, SSL_DIAMETER,
		TFTP, SMPP, PPTP, GRE, SYSLOGTCP, SYSLOGUDP
'''

        if not self._sess and args != None:
            self.__init__(args.netscaler, args.username, args.password)

        obj = servicegroup()
        obj.servicegroupname = name
        obj.servicetype = svc_type

        try:
            if action == 'add':
                servicegroup.add(self._sess, obj)
            elif action == 'delete':
                servicegroup.delete(self._sess, obj)
        except nitro_exception as e:
            print('Exception::errorcode=' + str(e.errorcode) + ',message=' +
                  e.message)
        except Exception as e:
            print('Exception::message=' + str(e.args))
        else:
            return True

        return False
Exemplo n.º 2
0
 def _create_service_group(self, grpname, service_type="HTTP"):
     try:
         svc_grp = servicegroup.get(self.ns_session, grpname)
         if (svc_grp.servicegroupname == grpname):
             logger.info("Service group %s already configured " % grpname)
             return
     except nitro_exception:
         pass
     svc_grp = servicegroup()
     svc_grp.servicegroupname = grpname
     svc_grp.servicetype = service_type
     servicegroup.add(self.ns_session, svc_grp)
Exemplo n.º 3
0
 def unset_bulk_service(self, client):
     try:
         arr = ["cmp", "cacheable", "usip", "healthmonitor"]
         servicegroup1 = [servicegroup() for _ in range(0, 5)]
         for i in range(0, 5):
             servicegroup1[i].servicegroupname = "sg_" + str(i)
             servicegroup.unset(client, servicegroup1, arr)
             print("unset_bulk_service - DONE")
     except nitro_exception as e:
         print("Exception::unset_bulk_service::rc=" + str(e.errorcode) + " ,Message =" + e.message)
     except Exception as e:
         print("Exception::unset_bulk_service::message=" + str(e.args))
Exemplo n.º 4
0
 def _create_service_group(self, grpname):
     try:
         svc_grp = servicegroup.get(self.ns_session, grpname)
         if (svc_grp.servicegroupname == grpname):
             logger.info("Service group %s already configured " % grpname)
             return
     except nitro_exception as e:
         pass
     svc_grp = servicegroup()
     svc_grp.servicegroupname = grpname
     svc_grp.servicetype = "HTTP"
     servicegroup.add(self.ns_session, svc_grp)
Exemplo n.º 5
0
def call_nitro_commands(ns_session):
    try:
        ns_session.clear_config(force=True, level='full')
        logging.debug('Clear config executed')
        needed_features = [
            nsfeature.Feature.CS, nsfeature.Feature.LB, nsfeature.Feature.SSL,
            nsfeature.Feature.RESPONDER, nsfeature.Feature.REWRITE
        ]
        ns_session.enable_features(needed_features)

        logging.debug('Adding CS vserver')
        csvserver_instance = csvserver()
        csvserver_instance.name = 'drinks_sample'
        csvserver_instance.ipv46 = '127.0.0.1'
        csvserver_instance.servicetype = 'http'
        csvserver_instance.port = '443'
        csvserver_instance.add(ns_session, csvserver_instance)

        logging.debug('Adding LB vserver')
        lbvserver_instance = lbvserver()
        lbvserver_instance.name = 'lbvs_hotdrink_http_example'
        lbvserver_instance.ipv46 = '0.0.0.0'
        lbvserver_instance.port = 0
        lbvserver_instance.servicetype = 'http'
        lbvserver_instance.add(ns_session, lbvserver_instance)

        logging.debug('Adding servicegroup')
        servicegroup_instance = servicegroup()
        servicegroup_instance.servicegroupname = 'sg_hotdrink_http_example'
        servicegroup_instance.servicetype = 'http'
        servicegroup_instance.add(ns_session, servicegroup_instance)

        logging.debug('Adding servieegroup binding')
        servicegroup_servicegroupmember_binding_instance = servicegroup_servicegroupmember_binding(
        )
        servicegroup_servicegroupmember_binding_instance.servicegroupname = 'sg_hotdrink_http_example'
        servicegroup_servicegroupmember_binding_instance.ip = '172.100.100.3'
        servicegroup_servicegroupmember_binding_instance.port = 80
        servicegroup_servicegroupmember_binding_instance.add(
            ns_session, servicegroup_servicegroupmember_binding_instance)

        logging.debug('Adding servicegroup lb vserver binding')
        lbvserver_servicegroup_binding_instance = lbvserver_servicegroup_binding(
        )
        lbvserver_servicegroup_binding_instance.name = 'lbvs_hotdrink_http_example'
        lbvserver_servicegroup_binding_instance.servicegroupname = 'sg_hotdrink_http_example'
        lbvserver_servicegroup_binding_instance.add(
            ns_session, lbvserver_servicegroup_binding_instance)

        logging.debug('SUCCESS: Configuration completed')
    except Exception as e:
        logging.error('FAILURE: Error during configuration: {}'.format(
            e.message))
Exemplo n.º 6
0
 def unset_bulk_service(self, client):
     try:
         arr = ["cmp", "cacheable", "usip", "healthmonitor"]
         servicegroup1 = [servicegroup() for _ in range(0, 5)]
         for i in range(0, 5):
             servicegroup1[i].servicegroupname = "sg_" + str(i)
             servicegroup.unset(client, servicegroup1, arr)
             print("unset_bulk_service - DONE")
     except nitro_exception as e:
         print("Exception::unset_bulk_service::rc=" + str(e.errorcode) +
               " ,Message =" + e.message)
     except Exception as e:
         print("Exception::unset_bulk_service::message=" + str(e.args))
Exemplo n.º 7
0
 def bind_servicegroup_server (self, client) : 
     try :
         grp = servicegroup()
         grp.servicegroupname = "svcgrp1"
         grp.servicetype = servicegroup.Servicetype.HTTP
         servicegroup.add(client, grp)
         obj = servicegroup_servicegroupmember_binding()
         obj.servicegroupname = "svcgrp1"
         obj.ip = "1.1.2.79"
         obj.port = 77
         servicegroup_servicegroupmember_binding.add(client, obj)
         print("bind_servicegroup_server - Done")
     except nitro_exception as e :
         print("Exception::bind_servicegroup_server::errorcode="+str(e.errorcode)+",message="+ e.message)
     except Exception as e:
         print("Exception::bind_servicegroup_server::message="+str(e.args))
def main():

    module_specific_arguments = dict(
        servicegroupname=dict(type='str'),
        servicetype=dict(type='str',
                         choices=[
                             'HTTP',
                             'FTP',
                             'TCP',
                             'UDP',
                             'SSL',
                             'SSL_BRIDGE',
                             'SSL_TCP',
                             'DTLS',
                             'NNTP',
                             'RPCSVR',
                             'DNS',
                             'ADNS',
                             'SNMP',
                             'RTSP',
                             'DHCPRA',
                             'ANY',
                             'SIP_UDP',
                             'SIP_TCP',
                             'SIP_SSL',
                             'DNS_TCP',
                             'ADNS_TCP',
                             'MYSQL',
                             'MSSQL',
                             'ORACLE',
                             'RADIUS',
                             'RADIUSListener',
                             'RDP',
                             'DIAMETER',
                             'SSL_DIAMETER',
                             'TFTP',
                             'SMPP',
                             'PPTP',
                             'GRE',
                             'SYSLOGTCP',
                             'SYSLOGUDP',
                             'FIX',
                             'SSL_FIX',
                         ]),
        cachetype=dict(type='str',
                       choices=[
                           'TRANSPARENT',
                           'REVERSE',
                           'FORWARD',
                       ]),
        maxclient=dict(type='float'),
        maxreq=dict(type='float'),
        cacheable=dict(type='bool'),
        cip=dict(type='str', choices=[
            'enabled',
            'disabled',
        ]),
        cipheader=dict(type='str'),
        usip=dict(type='bool'),
        pathmonitor=dict(type='bool'),
        pathmonitorindv=dict(type='bool'),
        useproxyport=dict(type='bool'),
        healthmonitor=dict(type='bool'),
        sp=dict(type='bool'),
        rtspsessionidremap=dict(type='bool'),
        clttimeout=dict(type='float'),
        svrtimeout=dict(type='float'),
        cka=dict(type='bool'),
        tcpb=dict(type='bool'),
        cmp=dict(type='bool'),
        maxbandwidth=dict(type='float'),
        monthreshold=dict(type='float'),
        downstateflush=dict(type='str', choices=[
            'enabled',
            'disabled',
        ]),
        tcpprofilename=dict(type='str'),
        httpprofilename=dict(type='str'),
        comment=dict(type='str'),
        appflowlog=dict(type='str', choices=[
            'enabled',
            'disabled',
        ]),
        netprofile=dict(type='str'),
        autoscale=dict(type='str', choices=[
            'DISABLED',
            'DNS',
            'POLICY',
        ]),
        memberport=dict(type='int'),
        graceful=dict(type='bool'),
    )

    hand_inserted_arguments = dict(
        servicemembers=dict(type='list'),
        monitorbindings=dict(type='list'),
        disabled=dict(
            type='bool',
            default=False,
        ),
    )

    argument_spec = dict()

    argument_spec.update(netscaler_common_arguments)
    argument_spec.update(module_specific_arguments)
    argument_spec.update(hand_inserted_arguments)

    module = AnsibleModule(
        argument_spec=argument_spec,
        supports_check_mode=True,
    )
    module_result = dict(
        changed=False,
        failed=False,
        loglines=loglines,
    )

    # Fail the module if imports failed
    if not PYTHON_SDK_IMPORTED:
        module.fail_json(msg='Could not load nitro python sdk')

    # Fallthrough to rest of execution
    client = get_nitro_client(module)

    try:
        client.login()
    except nitro_exception as e:
        msg = "nitro exception during login. errorcode=%s, message=%s" % (str(
            e.errorcode), e.message)
        module.fail_json(msg=msg)
    except Exception as e:
        if str(type(e)) == "<class 'requests.exceptions.ConnectionError'>":
            module.fail_json(msg='Connection error %s' % str(e))
        elif str(type(e)) == "<class 'requests.exceptions.SSLError'>":
            module.fail_json(msg='SSL Error %s' % str(e))
        else:
            module.fail_json(msg='Unexpected error during login %s' % str(e))

    # Instantiate service group configuration object
    readwrite_attrs = [
        'servicegroupname',
        'servicetype',
        'cachetype',
        'maxclient',
        'maxreq',
        'cacheable',
        'cip',
        'cipheader',
        'usip',
        'pathmonitor',
        'pathmonitorindv',
        'useproxyport',
        'healthmonitor',
        'sp',
        'rtspsessionidremap',
        'clttimeout',
        'svrtimeout',
        'cka',
        'tcpb',
        'cmp',
        'maxbandwidth',
        'monthreshold',
        'downstateflush',
        'tcpprofilename',
        'httpprofilename',
        'comment',
        'appflowlog',
        'netprofile',
        'autoscale',
        'memberport',
        'graceful',
    ]

    readonly_attrs = [
        'numofconnections', 'serviceconftype', 'value', 'svrstate', 'ip',
        'monstatcode', 'monstatparam1', 'monstatparam2', 'monstatparam3',
        'statechangetimemsec', 'stateupdatereason', 'clmonowner', 'clmonview',
        'groupcount', 'riseapbrstatsmsgcode2', 'serviceipstr',
        'servicegroupeffectivestate'
    ]

    immutable_attrs = [
        'servicegroupname',
        'servicetype',
        'cachetype',
        'td',
        'cipheader',
        'state',
        'autoscale',
        'memberport',
        'servername',
        'port',
        'serverid',
        'monitor_name_svc',
        'dup_weight',
        'riseapbrstatsmsgcode',
        'delay',
        'graceful',
        'includemembers',
        'newname',
    ]

    transforms = {
        'pathmonitorindv': ['bool_yes_no'],
        'cacheable': ['bool_yes_no'],
        'cka': ['bool_yes_no'],
        'pathmonitor': ['bool_yes_no'],
        'tcpb': ['bool_yes_no'],
        'sp': ['bool_on_off'],
        'usip': ['bool_yes_no'],
        'healthmonitor': ['bool_yes_no'],
        'useproxyport': ['bool_yes_no'],
        'rtspsessionidremap': ['bool_on_off'],
        'graceful': ['bool_yes_no'],
        'cmp': ['bool_yes_no'],
        'cip': [lambda v: v.upper()],
        'downstateflush': [lambda v: v.upper()],
        'appflowlog': [lambda v: v.upper()],
    }

    # Instantiate config proxy
    servicegroup_proxy = ConfigProxy(
        actual=servicegroup(),
        client=client,
        attribute_values_dict=module.params,
        readwrite_attrs=readwrite_attrs,
        readonly_attrs=readonly_attrs,
        immutable_attrs=immutable_attrs,
        transforms=transforms,
    )

    try:
        if module.params['state'] == 'present':
            log('Applying actions for state present')
            if not servicegroup_exists(client, module):
                if not module.check_mode:
                    log('Adding service group')
                    servicegroup_proxy.add()
                    if module.params['save_config']:
                        client.save_config()
                module_result['changed'] = True
            elif not servicegroup_identical(client, module,
                                            servicegroup_proxy):

                # Check if we try to change value of immutable attributes
                diff_dict = diff(client, module, servicegroup_proxy)
                immutables_changed = get_immutables_intersection(
                    servicegroup_proxy, diff_dict.keys())
                if immutables_changed != []:
                    msg = 'Cannot update immutable attributes %s. Must delete and recreate entity.' % (
                        immutables_changed, )
                    module.fail_json(msg=msg, diff=diff_dict, **module_result)

                if not module.check_mode:
                    servicegroup_proxy.update()
                    if module.params['save_config']:
                        client.save_config()
                module_result['changed'] = True
            else:
                module_result['changed'] = False

            # Check bindings
            if not monitor_bindings_identical(client, module):
                if not module.check_mode:
                    sync_monitor_bindings(client, module)
                    if module.params['save_config']:
                        client.save_config()
                module_result['changed'] = True

            if not servicemembers_identical(client, module):
                if not module.check_mode:
                    sync_service_members(client, module)
                    if module.params['save_config']:
                        client.save_config()
                module_result['changed'] = True

            if not module.check_mode:
                res = do_state_change(client, module, servicegroup_proxy)
                if res.errorcode != 0:
                    msg = 'Error when setting disabled state. errorcode: %s message: %s' % (
                        res.errorcode, res.message)
                    module.fail_json(msg=msg, **module_result)

            # Sanity check for state
            if not module.check_mode:
                log('Sanity checks for state present')
                if not servicegroup_exists(client, module):
                    module.fail_json(msg='Service group is not present',
                                     **module_result)
                if not servicegroup_identical(client, module,
                                              servicegroup_proxy):
                    module.fail_json(
                        msg='Service group is not identical to configuration',
                        diff=diff(client, module, servicegroup_proxy),
                        **module_result)
                if not servicemembers_identical(client, module):
                    module.fail_json(
                        msg='Service group members differ from configuration',
                        **module_result)
                if not monitor_bindings_identical(client, module):
                    module.fail_json(msg='Monitor bindings are not identical',
                                     **module_result)

        elif module.params['state'] == 'absent':
            log('Applying actions for state absent')
            if servicegroup_exists(client, module):
                if not module.check_mode:
                    servicegroup_proxy.delete()
                    if module.params['save_config']:
                        client.save_config()
                module_result['changed'] = True
            else:
                module_result['changed'] = False

            # Sanity check for state
            if not module.check_mode:
                log('Sanity checks for state absent')
                if servicegroup_exists(client, module):
                    module.fail_json(msg='Service group is present',
                                     **module_result)

    except nitro_exception as e:
        msg = "nitro exception errorcode=" + str(
            e.errorcode) + ",message=" + e.message
        module.fail_json(msg=msg, **module_result)

    client.logout()
    module.exit_json(**module_result)
def main():
    from ansible.module_utils.netscaler import ConfigProxy, get_nitro_client, netscaler_common_arguments, log, loglines
    try:
        from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup import servicegroup
        from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup_servicegroupmember_binding import servicegroup_servicegroupmember_binding
        from nssrc.com.citrix.netscaler.nitro.exception.nitro_exception import nitro_exception

        from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup_lbmonitor_binding import servicegroup_lbmonitor_binding
        from nssrc.com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding import lbmonitor_servicegroup_binding
        python_sdk_imported = True
    except ImportError as e:
        python_sdk_imported = False

    module_specific_arguments = dict(
        servicegroupname=dict(type='str'),
        servicetype=dict(
            type='str',
            choices=[
                u'HTTP', u'FTP', u'TCP', u'UDP', u'SSL', u'SSL_BRIDGE',
                u'SSL_TCP', u'DTLS', u'NNTP', u'RPCSVR', u'DNS', u'ADNS',
                u'SNMP', u'RTSP', u'DHCPRA', u'ANY', u'SIP_UDP', u'SIP_TCP',
                u'SIP_SSL', u'DNS_TCP', u'ADNS_TCP', u'MYSQL', u'MSSQL',
                u'ORACLE', u'RADIUS', u'RADIUSListener', u'RDP', u'DIAMETER',
                u'SSL_DIAMETER', u'TFTP', u'SMPP', u'PPTP', u'GRE',
                u'SYSLOGTCP', u'SYSLOGUDP', u'FIX', u'SSL_FIX'
            ]),
        cachetype=dict(type='str',
                       choices=[u'TRANSPARENT', u'REVERSE', u'FORWARD']),
        maxclient=dict(type='float'),
        maxreq=dict(type='float'),
        cacheable=dict(type='str', choices=[u'YES', u'NO']),
        cip=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        cipheader=dict(type='str'),
        usip=dict(type='str', choices=[u'YES', u'NO']),
        pathmonitor=dict(type='str', choices=[u'YES', u'NO']),
        pathmonitorindv=dict(type='str', choices=[u'YES', u'NO']),
        useproxyport=dict(type='str', choices=[u'YES', u'NO']),
        healthmonitor=dict(type='str', choices=[u'YES', u'NO']),
        sc=dict(type='str', choices=[u'ON', u'OFF']),
        sp=dict(type='str', choices=[u'ON', u'OFF']),
        rtspsessionidremap=dict(type='str', choices=[u'ON', u'OFF']),
        clttimeout=dict(type='float'),
        svrtimeout=dict(type='float'),
        cka=dict(type='str', choices=[u'YES', u'NO']),
        tcpb=dict(type='str', choices=[u'YES', u'NO']),
        cmp=dict(type='str', choices=[u'YES', u'NO']),
        maxbandwidth=dict(type='float'),
        monthreshold=dict(type='float'),
        state=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        downstateflush=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        tcpprofilename=dict(type='str'),
        httpprofilename=dict(type='str'),
        comment=dict(type='str'),
        appflowlog=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        netprofile=dict(type='str'),
        autoscale=dict(type='str', choices=[u'DISABLED', u'DNS', u'POLICY']),
        memberport=dict(type='int'),
        graceful=dict(type='str', choices=[u'YES', u'NO']),
    )

    hand_inserted_arguments = dict(
        servicemembers=dict(type='list'),
        monitorbindings=dict(type='list'),
    )

    argument_spec = dict()

    argument_spec.update(netscaler_common_arguments)

    argument_spec.update(module_specific_arguments)

    argument_spec.update(hand_inserted_arguments)

    module = AnsibleModule(
        argument_spec=argument_spec,
        supports_check_mode=True,
    )
    module_result = dict(
        changed=False,
        failed=False,
        loglines=loglines,
    )

    # Fail the module if imports failed
    if not python_sdk_imported:
        module.fail_json(msg='Could not load nitro python sdk')

    # Fallthrough to rest of execution

    client = get_nitro_client(module)
    client.login()

    # Instantiate service group configuration object
    readwrite_attrs = [
        'servicegroupname',
        'servicetype',
        'cachetype',
        'maxclient',
        'maxreq',
        'cacheable',
        'cip',
        'cipheader',
        'usip',
        'pathmonitor',
        'pathmonitorindv',
        'useproxyport',
        'healthmonitor',
        'sc',
        'sp',
        'rtspsessionidremap',
        'clttimeout',
        'svrtimeout',
        'cka',
        'tcpb',
        'cmp',
        'maxbandwidth',
        'monthreshold',
        'state',
        'downstateflush',
        'tcpprofilename',
        'httpprofilename',
        'comment',
        'appflowlog',
        'netprofile',
        'autoscale',
        'memberport',
        'graceful',
    ]

    readonly_attrs = [
        'numofconnections', 'serviceconftype', 'value', 'svrstate', 'ip',
        'monstatcode', 'monstatparam1', 'monstatparam2', 'monstatparam3',
        'statechangetimemsec', 'stateupdatereason', 'clmonowner', 'clmonview',
        'groupcount', 'riseapbrstatsmsgcode2', 'serviceipstr',
        'servicegroupeffectivestate'
    ]

    servicegroup_proxy = ConfigProxy(actual=servicegroup(),
                                     client=client,
                                     attribute_values_dict=module.params,
                                     readwrite_attrs=readwrite_attrs,
                                     readonly_attrs=readonly_attrs)

    def service_group_exists():
        log('service_group_exists')
        if servicegroup.count_filtered(
                client,
                'servicegroupname:%s' % module.params['servicegroupname']) > 0:
            return True
        else:
            return False

    def service_group_identical():
        log('service_group_identical')
        servicegroups = servicegroup.get_filtered(
            client, 'servicegroupname:%s' % module.params['servicegroupname'])
        if servicegroup_proxy.has_equal_attributes(servicegroups[0]):
            return True
        else:
            return False

    def get_servicegroups_from_module_params():
        log('get_servicegroups_from_module_params')
        readwrite_attrs = [
            u'servicegroupname', u'ip', u'port', u'state', u'hashid',
            u'serverid', u'servername', u'customserverid', u'weight'
        ]
        readonly_attrs = [
            u'delay', u'statechangetimesec', u'svrstate',
            u'tickssincelaststatechange', u'graceful', u'__count'
        ]

        members = []
        if module.params['servicemembers'] is None:
            return members

        for config in module.params['servicemembers']:
            # Make a copy to update
            config = copy.deepcopy(config)
            config['servicegroupname'] = module.params['servicegroupname']
            member_proxy = ConfigProxy(
                actual=servicegroup_servicegroupmember_binding(),
                client=client,
                attribute_values_dict=config,
                readwrite_attrs=readwrite_attrs,
                readonly_attrs=readonly_attrs)
            members.append(member_proxy)
        return members

    def service_group_servicemembers_identical():
        log('service_group_servicemembers_identical')
        service_group_members = servicegroup_servicegroupmember_binding.get(
            client, module.params['servicegroupname'])
        module_service_groups = get_servicegroups_from_module_params()
        log('Number of service group members %s' % len(service_group_members))
        if len(service_group_members) != len(module_service_groups):
            return False

        # Fallthrough to member evaluation
        identical_count = 0
        for actual_member in service_group_members:
            for member in module_service_groups:
                if member.has_equal_attributes(actual_member):
                    identical_count += 1
                    break
        if identical_count != len(service_group_members):
            return False

        # Fallthrough to success
        return True

    def delete_all_servicegroup_members():
        log('delete_all_servicegroup_members')
        if servicegroup_servicegroupmember_binding.count(
                client, module.params['servicegroupname']) == 0:
            return
        service_group_members = servicegroup_servicegroupmember_binding.get(
            client, module.params['servicegroupname'])
        log('len %s' % len(service_group_members))
        log('count %s' % servicegroup_servicegroupmember_binding.count(
            client, module.params['servicegroupname']))
        for member in service_group_members:
            log('%s' % dir(member))
            log('ip %s' % member.ip)
            log('servername %s' % member.servername)
            if all([
                    hasattr(member, 'ip'),
                    member.ip is not None,
                    hasattr(member, 'servername'),
                    member.servername is not None,
            ]):
                member.ip = None

            member.servicegroupname = module.params['servicegroupname']
            servicegroup_servicegroupmember_binding.delete(client, member)

    def add_all_servicegroup_members():
        log('add_all_servicegroup_members')
        for member in get_servicegroups_from_module_params():
            member.add()

    def get_configured_monitor_bindings():
        log('Entering get_configured_monitor_bindings')
        bindings = {}
        if 'monitorbindings' in module.params and module.params[
                'monitorbindings'] is not None:
            for binding in module.params['monitorbindings']:
                readwrite_attrs = [
                    'monitorname',
                    'servicegroupname',
                ]
                readonly_attrs = []
                if isinstance(binding, dict):
                    attribute_values_dict = copy.deepcopy(binding)
                else:
                    attribute_values_dict = {'monitorname': binding}
                attribute_values_dict['servicegroupname'] = module.params[
                    'servicegroupname']
                binding_proxy = ConfigProxy(
                    actual=lbmonitor_servicegroup_binding(),
                    client=client,
                    attribute_values_dict=attribute_values_dict,
                    readwrite_attrs=readwrite_attrs,
                    readonly_attrs=readonly_attrs,
                )
                key = attribute_values_dict['monitorname']
                bindings[key] = binding_proxy
        return bindings

    def get_actual_monitor_bindings():
        log('Entering get_actual_monitor_bindings')
        bindings = {}
        if servicegroup_lbmonitor_binding.count(
                client, module.params['servicegroupname']) == 0:
            return bindings

        # Fallthrough to rest of execution
        for binding in servicegroup_lbmonitor_binding.get(
                client, module.params['servicegroupname']):
            log('Gettign actual monitor with name %s' % binding.monitor_name)
            key = binding.monitor_name
            bindings[key] = binding

        return bindings

    def monitor_bindings_identical():
        log('Entering monitor_bindings_identical')
        configured_bindings = get_configured_monitor_bindings()
        actual_bindings = get_actual_monitor_bindings()

        configured_key_set = set(configured_bindings.keys())
        actual_key_set = set(actual_bindings.keys())
        symmetrical_diff = configured_key_set ^ actual_key_set
        for default_monitor in ('tcp-default', 'ping-default'):
            if default_monitor in symmetrical_diff:
                log('Excluding %s monitor from key comparison' %
                    default_monitor)
                symmetrical_diff.remove(default_monitor)
        if len(symmetrical_diff) > 0:
            return False

        # Compare key to key
        for key in configured_key_set:
            configured_proxy = configured_bindings[key]
            if any([
                    configured_proxy.monitorname !=
                    actual_bindings[key].monitor_name,
                    configured_proxy.servicegroupname !=
                    actual_bindings[key].servicegroupname
            ]):
                return False

        # Fallthrought to success
        return True

    def sync_monitor_bindings():
        log('Entering sync_monitor_bindings')
        # Delete existing bindings
        for binding in get_actual_monitor_bindings().values():
            b = lbmonitor_servicegroup_binding()
            b.monitorname = binding.monitor_name
            b.servicegroupname = module.params['servicegroupname']
            # Cannot remove default monitor bindings
            if b.monitorname in ('tcp-default', 'ping-default'):
                continue
            lbmonitor_servicegroup_binding.delete(client, b)
            continue

            binding.monitorname = binding.monitor_name
            log('Will delete %s' % dir(binding))
            log('Name %s' % binding.name)
            log('monitor Name %s' % binding.monitor_name)
            binding.delete(client, binding)
            #service_lbmonitor_binding.delete(client, binding)

        # Apply configured bindings

        for binding in get_configured_monitor_bindings().values():
            binding.add()

    try:
        if module.params['operation'] == 'present':
            log('Checking present')
            if not service_group_exists():
                if not module.check_mode:
                    log('Adding service group')
                    servicegroup_proxy.add()
                    servicegroup_proxy.update()
                    client.save_config()
                    #log('Updating service group')
                    #servicegroup_proxy.update()
                    #client.save_config()
                module_result['changed'] = True
            elif not service_group_identical():
                if not module.check_mode:
                    servicegroup_proxy.update()
                    client.save_config()
                module_result['changed'] = True
            else:
                module_result['changed'] = False

            # Check bindings
            if not monitor_bindings_identical():
                if not module.check_mode:
                    sync_monitor_bindings()
                    client.save_config()
                module_result['changed'] = True

            if not service_group_servicemembers_identical():
                if not module.check_mode:
                    delete_all_servicegroup_members()
                    add_all_servicegroup_members()
                    client.save_config()
                module_result['changed'] = True

            # Sanity check for operation
            log('sanity check')
            if not service_group_exists():
                module.fail_json(msg='Service group is not present',
                                 **module_result)
            if not service_group_identical():
                module.fail_json(
                    msg='Service group is not identical to configuration',
                    **module_result)
            if not service_group_servicemembers_identical():
                module.fail_json(
                    msg='Service group members differ from configuration',
                    **module_result)
            if not monitor_bindings_identical():
                module.fail_json(msg='Monitor bindings are not identical',
                                 **module_result)

        elif module.params['operation'] == 'absent':
            if service_group_exists():
                if not module.check_mode:
                    servicegroup_proxy.delete()
                    client.save_config()
                module_result['changed'] = True
            else:
                module_result['changed'] = False

            # Sanity check for operation
            if service_group_exists():
                module.fail_json(msg='Service group is present',
                                 **module_result)
        module_result['configured_servicegroup'] = {}
        module_result['configured_servicegroup'][
            'actual_rw_attributes'] = servicegroup_proxy.get_actual_rw_attributes(
                filter='servicegroupname')
        module_result['configured_servicegroup'][
            'actual_ro_attributes'] = servicegroup_proxy.get_actual_ro_attributes(
                filter='servicegroupname')
        module_result['configured_servicegroup'][
            'missing_rw_attributes'] = list(
                set(readwrite_attrs) -
                set(module_result['configured_servicegroup']
                    ['actual_rw_attributes'].keys()))
        module_result['configured_servicegroup'][
            'missing_ro_attributes'] = list(
                set(readonly_attrs) -
                set(module_result['configured_servicegroup']
                    ['actual_ro_attributes'].keys()))

    except nitro_exception as e:
        msg = "nitro exception errorcode=" + str(
            e.errorcode) + ",message=" + e.message
        module.fail_json(msg=msg, **module_result)

    client.logout()
    module.exit_json(**module_result)
Exemplo n.º 10
0
def main():
    from ansible.module_utils.netscaler import ConfigProxy, get_nitro_client, netscaler_common_arguments, log, loglines
    try:
        from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup import servicegroup
        from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup_servicegroupmember_binding import servicegroup_servicegroupmember_binding
        from nssrc.com.citrix.netscaler.nitro.exception.nitro_exception import nitro_exception
        python_sdk_imported = True
    except ImportError as e:
        python_sdk_imported = False

    module_specific_arguments = dict(
        servicegroupname=dict(type='str', ),
        servicetype=dict(
            type='str',
            choices=[
                u'HTTP', u'FTP', u'TCP', u'UDP', u'SSL', u'SSL_BRIDGE',
                u'SSL_TCP', u'DTLS', u'NNTP', u'RPCSVR', u'DNS', u'ADNS',
                u'SNMP', u'RTSP', u'DHCPRA', u'ANY', u'SIP_UDP', u'SIP_TCP',
                u'SIP_SSL', u'DNS_TCP', u'ADNS_TCP', u'MYSQL', u'MSSQL',
                u'ORACLE', u'RADIUS', u'RADIUSListener', u'RDP', u'DIAMETER',
                u'SSL_DIAMETER', u'TFTP', u'SMPP', u'PPTP', u'GRE',
                u'SYSLOGTCP', u'SYSLOGUDP', u'FIX', u'SSL_FIX'
            ]),
        cachetype=dict(type='str',
                       choices=[u'TRANSPARENT', u'REVERSE', u'FORWARD']),
        td=dict(type='float', ),
        maxclient=dict(type='float', ),
        maxreq=dict(type='float', ),
        cacheable=dict(type='str', choices=[u'YES', u'NO']),
        cip=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        cipheader=dict(type='str', ),
        usip=dict(type='str', choices=[u'YES', u'NO']),
        pathmonitor=dict(type='str', choices=[u'YES', u'NO']),
        pathmonitorindv=dict(type='str', choices=[u'YES', u'NO']),
        useproxyport=dict(type='str', choices=[u'YES', u'NO']),
        healthmonitor=dict(type='str', choices=[u'YES', u'NO']),
        sc=dict(type='str', choices=[u'ON', u'OFF']),
        sp=dict(type='str', choices=[u'ON', u'OFF']),
        rtspsessionidremap=dict(type='str', choices=[u'ON', u'OFF']),
        clttimeout=dict(type='float', ),
        svrtimeout=dict(type='float', ),
        cka=dict(type='str', choices=[u'YES', u'NO']),
        tcpb=dict(type='str', choices=[u'YES', u'NO']),
        cmp=dict(type='str', choices=[u'YES', u'NO']),
        maxbandwidth=dict(type='float', ),
        monthreshold=dict(type='float', ),
        state=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        downstateflush=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        tcpprofilename=dict(type='str', ),
        httpprofilename=dict(type='str', ),
        comment=dict(type='str', ),
        appflowlog=dict(type='str', choices=[u'ENABLED', u'DISABLED']),
        netprofile=dict(type='str', ),
        autoscale=dict(type='str', choices=[u'DISABLED', u'DNS', u'POLICY']),
        memberport=dict(type='int', ),
        servername=dict(type='str', ),
        port=dict(type='int', ),
        weight=dict(type='float', ),
        customserverid=dict(type='str', ),
        serverid=dict(type='float', ),
        hashid=dict(type='float', ),
        monitor_name_svc=dict(type='str', ),
        dup_weight=dict(type='float', ),
        riseapbrstatsmsgcode=dict(type='int', ),
        delay=dict(type='float', ),
        graceful=dict(type='str', choices=[u'YES', u'NO']),
        includemembers=dict(type='bool', ),
        newname=dict(type='str', ),

        # These are hand inserted
        servicemembers=dict(type='list'),
    )

    argument_spec = dict()

    argument_spec.update(netscaler_common_arguments)

    argument_spec.update(module_specific_arguments)

    module = AnsibleModule(
        argument_spec=argument_spec,
        supports_check_mode=True,
    )
    module_result = dict(
        changed=False,
        failed=False,
    )

    # Fail the module if imports failed
    if not python_sdk_imported:
        module.fail_json(msg='Could not load nitro python sdk')

    # Fallthrough to rest of execution

    client = get_nitro_client(module)
    client.login()

    # Instantiate service group configuration object
    readwrite_attrs = [
        u'servicegroupname', u'servicetype', u'cachetype', u'td', u'maxclient',
        u'maxreq', u'cacheable', u'cip', u'cipheader', u'usip', u'pathmonitor',
        u'pathmonitorindv', u'useproxyport', u'healthmonitor', u'sc', u'sp',
        u'rtspsessionidremap', u'clttimeout', u'svrtimeout', u'cka', u'tcpb',
        u'cmp', u'maxbandwidth', u'monthreshold', u'state', u'downstateflush',
        u'tcpprofilename', u'httpprofilename', u'comment', u'appflowlog',
        u'netprofile', u'autoscale', u'memberport', u'monconnectionclose',
        u'servername', u'port', u'weight', u'customserverid', u'serverid',
        u'hashid', u'monitor_name_svc', u'dup_weight', u'riseapbrstatsmsgcode',
        u'delay', u'graceful', u'includemembers', u'newname'
    ]
    readonly_attrs = [
        u'numofconnections', u'serviceconftype', u'value', u'svrstate', u'ip',
        u'monstatcode', u'monstatparam1', u'monstatparam2', u'monstatparam3',
        u'statechangetimemsec', u'stateupdatereason', u'clmonowner',
        u'clmonview', u'groupcount', u'riseapbrstatsmsgcode2', u'serviceipstr',
        u'servicegroupeffectivestate', u'__count'
    ]
    servicegroup_proxy = ConfigProxy(actual=servicegroup(),
                                     client=client,
                                     attribute_values_dict=module.params,
                                     readwrite_attrs=readwrite_attrs,
                                     readonly_attrs=readonly_attrs)

    def service_group_exists():
        log('service_group_exists')
        if servicegroup.count_filtered(
                client,
                'servicegroupname:%s' % module.params['servicegroupname']) > 0:
            return True
        else:
            return False

    def service_group_identical():
        log('service_group_identical')
        servicegroups = servicegroup.get_filtered(
            client, 'servicegroupname:%s' % module.params['servicegroupname'])
        if servicegroup_proxy.has_equal_attributes(servicegroups[0]):
            return True
        else:
            return False

    def get_servicegroups_from_module_params():
        log('get_servicegroups_from_module_params')
        readwrite_attrs = [
            u'servicegroupname', u'ip', u'port', u'state', u'hashid',
            u'serverid', u'servername', u'customserverid', u'weight'
        ]
        readonly_attrs = [
            u'delay', u'statechangetimesec', u'svrstate',
            u'tickssincelaststatechange', u'graceful', u'__count'
        ]

        members = []
        for config in module.params['servicemembers']:
            # Make a copy to update
            config = copy.deepcopy(config)
            config['servicegroupname'] = module.params['servicegroupname']
            member_proxy = ConfigProxy(
                actual=servicegroup_servicegroupmember_binding(),
                client=client,
                attribute_values_dict=config,
                readwrite_attrs=readwrite_attrs,
                readonly_attrs=readonly_attrs)
            members.append(member_proxy)
        return members

    def service_group_servicemembers_identical():
        log('service_group_servicemembers_identical')
        service_group_members = servicegroup_servicegroupmember_binding.get(
            client, module.params['servicegroupname'])
        module_service_groups = get_servicegroups_from_module_params()
        log('Number of service group members %s' % len(service_group_members))
        if len(service_group_members) != len(module_service_groups):
            return False

        # Fallthrough to member evaluation
        identical_count = 0
        for actual_member in service_group_members:
            for member in module_service_groups:
                if member.has_equal_attributes(actual_member):
                    identical_count += 1
                    break
        if identical_count != len(service_group_members):
            return False

        # Fallthrough to success
        return True

    def delete_all_servicegroup_members():
        log('delete_all_servicegroup_members')
        if servicegroup_servicegroupmember_binding.count(
                client, module.params['servicegroupname']) == 0:
            return
        service_group_members = servicegroup_servicegroupmember_binding.get(
            client, module.params['servicegroupname'])
        log('len %s' % len(service_group_members))
        log('count %s' % servicegroup_servicegroupmember_binding.count(
            client, module.params['servicegroupname']))
        for member in service_group_members:
            log('%s' % dir(member))
            log('ip %s' % member.ip)
            log('servername %s' % member.servername)
            if all([
                    hasattr(member, 'ip'),
                    member.ip is not None,
                    hasattr(member, 'servername'),
                    member.servername is not None,
            ]):
                member.ip = None

            member.servicegroupname = module.params['servicegroupname']
            servicegroup_servicegroupmember_binding.delete(client, member)

    def add_all_servicegroup_members():
        log('add_all_servicegroup_members')
        for member in get_servicegroups_from_module_params():
            member.add()

    try:
        if module.params['operation'] == 'present':
            log('Checking present')
            if not service_group_exists():
                if not module.check_mode:
                    servicegroup_proxy.add()
                    client.save_config()
                module_result['changed'] = True
            elif not service_group_identical():
                if not module.check_mode:
                    servicegroup_proxy.update()
                    client.save_config()
                module_result['changed'] = True

            if not service_group_servicemembers_identical():
                if not module.check_mode:
                    delete_all_servicegroup_members()
                    add_all_servicegroup_members()
                    client.save_config()
                module_result['changed'] = True

            # Sanity check for operation
            log('sanity check')
            if not service_group_exists():
                module.fail_json(msg='Service group is not present',
                                 loglines=loglines)
            if not service_group_identical():
                module.fail_json(
                    msg='Service group is not identical to configuration',
                    loglines=loglines)
            if not service_group_servicemembers_identical():
                module.fail_json(
                    msg='Service group members differ from configuration',
                    loglines=loglines)

        elif module.params['operation'] == 'absent':
            if service_group_exists():
                if not module.check_mode:
                    servicegroup_proxy.delete()
                    client.save_config()
                module_result['changed'] = True
            else:
                module_result['changed'] = False

            # Sanity check for operation
            if service_group_exists():
                module.fail_json(msg='Service group is present')

    except nitro_exception as e:
        msg = "nitro exception errorcode=" + str(
            e.errorcode) + ",message=" + e.message
        module.fail_json(msg=msg, loglines=loglines)

    client.logout()

    module.exit_json(loglines=loglines, **module_result)