<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def uplink_portgroup_configured(name, dvs, uplink_portgroup):
    '''
    Configures the uplink portgroup on a DVS. The state assumes there is only
    one uplink portgroup.

    dvs
        Name of the DVS

    upling_portgroup
        Uplink portgroup dict representations (see module sysdocs)

    '''
    datacenter = _get_datacenter_name()
    log.info('Running %s on DVS \'%s\', datacenter \'%s\'', name, dvs, datacenter)
    changes_required = False
    ret = {'name': name,
           'changes': {},
           'result': None,
           'comment': None}
    comments = []
    changes = {}
    changes_required = False

    try:
        #TODO portroups validation
        si = __salt__['vsphere.get_service_instance_via_proxy']()
        current_uplink_portgroup = __salt__['vsphere.list_uplink_dvportgroup'](
            dvs=dvs, service_instance=si)
        log.trace('current_uplink_portgroup = %s', current_uplink_portgroup)
        diff_dict = _get_diff_dict(current_uplink_portgroup, uplink_portgroup)
        if diff_dict:
            changes_required = True
            if __opts__['test']:
                changes_strings = \
                        _get_changes_from_diff_dict(diff_dict)
                log.trace('changes_strings = %s', changes_strings)
                comments.append(
                    'State {0} will update the '
                    'uplink portgroup in DVS \'{1}\', datacenter '
                    '\'{2}\':\n{3}'
                    ''.format(name, dvs, datacenter,
                              '\n'.join(['\t{0}'.format(c) for c in
                                         changes_strings])))
            else:
                __salt__['vsphere.update_dvportgroup'](
                    portgroup_dict=uplink_portgroup,
                    portgroup=current_uplink_portgroup['name'],
                    dvs=dvs,
                    service_instance=si)
                comments.append('Updated the uplink portgroup in DVS '
                                '\'{0}\', datacenter \'{1}\''
                                ''.format(dvs, datacenter))
            log.info(comments[-1])
            changes.update(
                {'uplink_portgroup':
                 {'new': _get_val2_dict_from_diff_dict(diff_dict),
                  'old': _get_val1_dict_from_diff_dict(diff_dict)}})
        __salt__['vsphere.disconnect'](si)
    except salt.exceptions.CommandExecutionError as exc:
        log.exception('Encountered error')
        if si:
            __salt__['vsphere.disconnect'](si)
        if not __opts__['test']:
            ret['result'] = False
        ret.update({'comment': exc.strerror,
                    'result': False if not __opts__['test'] else None})
        return ret
    if not changes_required:
        # We have no changes
        ret.update({'comment': ('Uplink portgroup in DVS \'{0}\', datacenter '
                                '\'{1}\' is correctly configured. '
                                'Nothing to be done.'.format(dvs, datacenter)),
                    'result': True})
    else:
        ret.update({
            'comment': '\n'.join(comments),
            'changes': changes,
            'result': None if __opts__['test'] else True,
        })
    return ret