Exemplo n.º 1
0
def save_server_pool_member(user, sp, list_server_pool_member):

    list_pool_member = list()
    old_priorities_list = list()
    # Remove empty values from list
    id_pool_member_noempty = [x['id_pool_member'] for x in list_server_pool_member if x['id_pool_member'] != '']

    #exclue server pool member
    del_smp = sp.serverpoolmember_set.exclude(id__in=id_pool_member_noempty)
    if del_smp:
        for obj in del_smp:

            obj.delete(user)

            #execute script remove real if pool already created
            #commit transaction after each successful script call
            if sp.pool_created:
                command = settings.POOL_REAL_REMOVE % (obj.server_pool_id, obj.ip_id if obj.ip else obj.ipv6_id, obj.port_real)
                code, _, _ = exec_script(command)
                if code != 0:
                    raise exceptions.ScriptCreatePoolException()
                transaction.commit()

    if list_server_pool_member:
        apply_new_priorities = False
        for dic in list_server_pool_member:
        #
            ip_object = None
            ipv6_object = None
            if len(dic['ip']) <= 15:
                ip_object = Ip.get_by_pk(dic['id'])
            else:
                ipv6_object = Ipv6.get_by_pk(dic['id'])

            id_pool = sp.id
            id_ip = ip_object and ip_object.id or ipv6_object and ipv6_object.id
            port_ip = dic['port_real']

            if dic['id_pool_member']:
                spm = ServerPoolMember.objects.get(id=dic['id_pool_member'])
                spm.server_pool = sp
                spm.identifier = dic['nome_equips']
                spm.ip = ip_object
                spm.ipv6 = ipv6_object
                spm.weight = dic['weight']
                spm.limit = sp.default_limit
                old_spm_priority = spm.priority
                old_priorities_list.append(old_spm_priority)
                spm.priority = dic['priority']
                spm.port_real = dic['port_real']
                spm.save(user)
                if(old_spm_priority != spm.priority and sp.pool_created):
                    apply_new_priorities = True
            else:
                spm = ServerPoolMember(server_pool=sp, identifier=dic['nome_equips'], ip=ip_object, ipv6=ipv6_object,
                                       priority=dic['priority'], weight=dic['weight'], limit=sp.default_limit,
                                       port_real=dic['port_real'])
                spm.save(user)

                old_priorities_list.append(dic['priority'])

                #execute script to create real if pool already created
                #commits transaction. Rolls back if script returns error
                if sp.pool_created:
                    transaction.commit()
                    #def prepare_and_save(self, server_pool, ip, ip_type, priority, weight, port_real, user, commit=False):
                    #spm.prepare_and_save(sp, ip_object, IP_VERSION.IPv4[1], dic['priority'], dic['weight'], dic['port_real'], user, True)
                    command = settings.POOL_REAL_CREATE % (id_pool, id_ip, port_ip)
                    code, _, _ = exec_script(command)
                    if code != 0:
                        spm.delete(user)
                        transaction.commit()
                        raise exceptions.ScriptCreatePoolException()

                #if sp.healthcheck_id:
                #    spm.healthcheck = sp.healthcheck
            list_pool_member.append(spm)

        #Applies new priority in pool - only 1 script run for all members
        if(apply_new_priorities):
            transaction.commit()
            command = settings.POOL_MEMBER_PRIORITIES % (sp.id)
            code, _, _ = exec_script(command)
            if code != 0:
                for i in len(old_priorities_list):
                    list_pool_member[i].priority = old_priorities_list[i]
                    list_pool_member[i].save(user)
                transaction.commit()
                raise exceptions.ScriptAlterPriorityPoolMembersException()

    return list_pool_member