Ensure an endpoint exists and is up-to-date

    name
        Interface name

    url
        URL of the endpoint

    service_name
        Service name or ID

    region
        The region name to assign the endpoint

    enabled
        Boolean to control if endpoint is enabled

def present(name, service_name, auth=None, **kwargs):
    '''
    Ensure an endpoint exists and is up-to-date

    name
        Interface name

    url
        URL of the endpoint

    service_name
        Service name or ID

    region
        The region name to assign the endpoint

    enabled
        Boolean to control if endpoint is enabled
    '''
    ret = {'name': name,
           'changes': {},
           'result': True,
           'comment': ''}

    kwargs = __utils__['args.clean_kwargs'](**kwargs)

    __salt__['keystoneng.setup_clouds'](auth)

    success, val = _, endpoint = _common(ret, name, service_name, kwargs)
    if not success:
        return val

    if not endpoint:
        if __opts__['test'] is True:
            ret['result'] = None
            ret['changes'] = kwargs
            ret['comment'] = 'Endpoint will be created.'
            return ret

        # NOTE(SamYaple): Endpoints are returned as a list which can contain
        # several items depending on the options passed
        endpoints = __salt__['keystoneng.endpoint_create'](**kwargs)
        if len(endpoints) == 1:
            ret['changes'] = endpoints[0]
        else:
            for i, endpoint in enumerate(endpoints):
                ret['changes'][i] = endpoint
        ret['comment'] = 'Created endpoint'
        return ret

    changes = __salt__['keystoneng.compare_changes'](endpoint, **kwargs)
    if changes:
        if __opts__['test'] is True:
            ret['result'] = None
            ret['changes'] = changes
            ret['comment'] = 'Endpoint will be updated.'
            return ret

        kwargs['endpoint_id'] = endpoint.id
        __salt__['keystoneng.endpoint_update'](**kwargs)
        ret['changes'].update(changes)
        ret['comment'] = 'Updated endpoint'

    return ret