Esempio n. 1
0
def get_attr(conninfo, credentials, path=None, id_=None):
    assert (path is not None) ^ (id_ is not None)
    ref = unicode(path) if path else unicode(id_)
    uri = build_files_uri([ref, "info", "attributes"])

    method = "GET"
    return request.rest_request(conninfo, credentials, method, unicode(uri))
Esempio n. 2
0
def nfs_list_share(conninfo, credentials, id_):
    id_ = str(id_)

    method = "GET"
    uri = "/v1/conf/shares/nfs/%s" % id_

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 3
0
def iops_get(conninfo, credentials, specific_type=None):
    method = "GET"
    uri = UriBuilder(path="/v1/stats/iops")
    if specific_type:
        uri.add_query_param('type', specific_type)

    return request.rest_request(conninfo, credentials, method, str(uri))
Esempio n. 4
0
def group_get_members(conninfo, credentials, group_id):
    group_id = int(group_id)

    method = "GET"
    uri = "/v1/groups/%d/members/" % group_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 5
0
def modify_network(conninfo, credentials, interface_id, network_id, **kwargs):
    method = "PATCH"
    uri = "/v2/network/interfaces/{}/networks/{}".format(
        interface_id, network_id)

    body = populate_request_body({"id": network_id}, **kwargs)
    return request.rest_request(conninfo, credentials, method, uri, body=body)
Esempio n. 6
0
def modify_user(conninfo,
                credentials,
                user_id,
                name,
                primary_group,
                uid,
                if_match=None):
    user_id = int(user_id)
    if_match = if_match if if_match is None else str(if_match)

    method = "PUT"
    uri = "/v1/auth/users/%d" % user_id

    user_info = {
        'id': str(user_id),
        'name': str(name),
        'primary_group': str(primary_group),
        'uid': '' if uid is None else str(uid)
    }

    return request.rest_request(conninfo,
                                credentials,
                                method,
                                uri,
                                body=user_info,
                                if_match=if_match)
Esempio n. 7
0
def set_dhcp_network(conninfo,
                     credentials,
                     interface_id,
                     network_id,
                     name,
                     floating_ip_ranges=None):

    method = "PUT"
    uri = "/v2/network/interfaces/{}/networks/{}".format(
        interface_id, network_id)

    dhcp_network_config = {
        "id": network_id,
        "assigned_by": "DHCP",
        "name": name,
        "floating_ip_ranges": floating_ip_ranges or [],
        # The rest of these fields are STATIC only and these are the defaults
        "ip_ranges": [],
        "netmask": "",
        "dns_servers": [],
        "dns_search_domains": [],
        "vlan_id": 0,
    }

    return request.rest_request(conninfo,
                                credentials,
                                method,
                                uri,
                                body=dhcp_network_config)
Esempio n. 8
0
def nfs_modify_share(conninfo, credentials, id_, export_path, fs_path,
                             description, read_only, host_restrictions,
                             user_mapping, map_to_user_id,
                             allow_fs_path_create=False, if_match=None):
    id_ = str(id_)
    allow_fs_path_create_ = "true" if allow_fs_path_create else "false"

    if_match = if_match if if_match is None else str(if_match)

    method = "PUT"
    uri = "/v1/conf/shares/nfs/%s?allow-fs-path-create=%s" % \
        (id_, allow_fs_path_create_)

    share_info = {
        'id': id_,
        'export_path':       str(export_path),
        'fs_path':           str(fs_path),
        'description':       str(description),
        'read_only':         bool(read_only),
        'host_restrictions': list(host_restrictions),
        'user_mapping':      str(user_mapping),
        'map_to_user_id':    str(map_to_user_id)
    }

    return request.rest_request(conninfo, credentials, method, uri,
        body=share_info, if_match=if_match)
Esempio n. 9
0
def group_get_members(conninfo, credentials, group_id):
    group_id = int(group_id)

    method = "GET"
    uri = "/v1/groups/%d/members/" % group_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 10
0
def list_group(conninfo, credentials, group_id):
    group_id = int(group_id)

    method = "GET"
    uri = "/v1/groups/%d" % group_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 11
0
def delete_group(conninfo, credentials, group_id):
    group_id = int(group_id)

    method = "DELETE"
    uri = "/v1/groups/%d" % group_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 12
0
def smb_delete_share(conninfo, credentials, id_):
    id_ = unicode(id_)

    method = "DELETE"
    uri = "/v1/smb/shares/%s" % id_

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 13
0
def delete_group(conninfo, credentials, group_id):
    group_id = int(group_id)

    method = "DELETE"
    uri = "/v1/groups/%d" % group_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 14
0
def smb_modify_share(conninfo, credentials, id_, share_name,
        fs_path, description, read_only, allow_guest_access,
        allow_fs_path_create=False, if_match=None,
        access_based_enumeration_enabled=None):
    id_ = unicode(id_)
    allow_fs_path_create_ = "true" if allow_fs_path_create else "false"

    if_match = if_match if if_match is None else unicode(if_match)

    method = "PUT"
    uri = "/v1/smb/shares/%s?allow-fs-path-create=%s" % \
        (id_, allow_fs_path_create_)

    share_info = {
        'id': id_,
        'share_name':         unicode(share_name),
        'fs_path':            unicode(fs_path),
        'description':        unicode(description),
        'read_only':          bool(read_only),
        'allow_guest_access': bool(allow_guest_access)
    }

    # "ABE enabled" is an optional field. It may be absent if we use this client
    # code with the clusters running previous versions of qfsd.
    if access_based_enumeration_enabled is not None:
        share_info['access_based_enumeration_enabled'] = \
            bool(access_based_enumeration_enabled)

    return request.rest_request(conninfo, credentials, method, uri,
        body=share_info, if_match=if_match)
Esempio n. 15
0
def nfs_list_share(conninfo, credentials, id_):
    id_ = unicode(id_)

    method = "GET"
    uri = "/v1/nfs/shares/%s" % id_

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 16
0
def repeat_write(conninfo,
                 credentials,
                 path,
                 size,
                 byte,
                 transaction_size=None):

    if transaction_size == None:
        transaction_size = DEFAULT_REPEAT_WRITE_TRANSACTION_SIZE

    if not path.startswith('/'):
        path = '/' + path

    method = "PUT"
    uri = build_repeat_write_uri(["repeat_write", path])
    options = {
        'size': str(size),
        'transaction_size': int(transaction_size),
        'byte': int(byte),
    }

    return request.rest_request(conninfo,
                                credentials,
                                method,
                                str(uri),
                                body=options)
Esempio n. 17
0
def node_specific_quorum(conninfo, credentials, expected_nodes):
    method = "GET"
    uri = UriBuilder(path="/v1/node/quorum/specific")

    uri.add_query_param('nodes', ','.join(expected_nodes))

    return request.rest_request(conninfo, credentials, method, str(uri))
Esempio n. 18
0
def list_user(conninfo, credentials, user_id):
    user_id = int(user_id)

    method = "GET"
    uri = "/v1/users/%d" % user_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 19
0
def list_groups_for_user(conninfo, credentials, user_id):
    user_id = int(user_id)

    method = "GET"
    uri = "/v1/auth/users/%d/groups/" % user_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 20
0
def delete_user(conninfo, credentials, user_id):
    user_id = int(user_id)

    method = "DELETE"
    uri = "/v1/auth/users/%d" % user_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 21
0
def unpack_identity(conninfo, credentials, auth_id):
    auth_id = int(auth_id)

    method = "GET"
    uri = "/v1/users/" + str(auth_id) + "/unpack-identity"

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 22
0
def delete_user(conninfo, credentials, user_id):
    user_id = int(user_id)

    method = "DELETE"
    uri = "/v1/users/%d" % user_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 23
0
def set_acl(conninfo,
            credentials,
            path=None,
            id_=None,
            control=None,
            aces=None,
            if_match=None):
    assert (path is not None) ^ (id_ is not None)
    if path is not None:
        path = str(path)
        uri = build_fs_path_uri(path).add_query_param("acl")
    if id_ is not None:
        id_ = str(id_)
        uri = build_fs_id_uri(id_).add_query_param("acl")
    if control == None or aces == None:
        raise ValueError("Must specify both control flags and ACEs")

    control = list(control)
    aces = list(aces)
    if_match = if_match if if_match is None else str(if_match)

    config = {'aces': aces, 'control': control}
    method = "PUT"
    return request.rest_request(conninfo,
                                credentials,
                                method,
                                str(uri),
                                body=config,
                                if_match=if_match)
Esempio n. 24
0
def create_link(conninfo,
                credentials,
                name,
                target,
                dir_path=None,
                dir_id=None):
    name = str(name)
    target = str(target)
    if dir_path is not None:
        dir_path = str(dir_path)
        uri = build_fs_path_uri(dir_path)
    else:
        dir_id = str(dir_id)
        uri = build_fs_id_uri(dir_id)

    config = {
        'name': name.rstrip("/"),
        'old_path': target,
        'action': 'CREATE_LINK'
    }

    method = "POST"
    return request.rest_request(conninfo,
                                credentials,
                                method,
                                str(uri),
                                body=config)
Esempio n. 25
0
def get_walk(conninfo, credentials, path):
    assert (path is not None)
    path = str(path)
    uri = build_fs_walk_uri(path)

    method = "GET"
    return request.rest_request(conninfo, credentials, method, str(uri))
Esempio n. 26
0
def current_activity_get(conninfo, credentials, specific_type=None):
    method = "GET"
    uri = UriBuilder(path="/v1/analytics/activity/current")
    if specific_type:
        uri.add_query_param('type', specific_type)

    return request.rest_request(conninfo, credentials, method, str(uri))
Esempio n. 27
0
def iops_get(conninfo, credentials, specific_type=None):
    method = 'GET'
    uri = UriBuilder(path='/v1/analytics/iops')
    if specific_type:
        uri.add_query_param('type', specific_type)

    return request.rest_request(conninfo, credentials, method, str(uri))
Esempio n. 28
0
def set_file_attr(conninfo, credentials, mode, owner, group, size,
                  creation_time, modification_time, change_time, id_,
                  if_match=None):
    uri = build_files_uri([id_, "info", "attributes"])
    if_match = None if not if_match else unicode(if_match)

    method = "PATCH"

    config = {}
    if mode:
        config['mode'] = unicode(mode)
    if owner:
        config['owner'] = unicode(owner)
    if group:
        config['group'] = unicode(group)
    if size:
        config['size'] = unicode(size)
    if creation_time:
        config['creation_time'] = unicode(creation_time)
    if modification_time:
        config['modification_time'] = \
            unicode(modification_time)
    if change_time:
        config['change_time'] = unicode(change_time)

    return request.rest_request(conninfo, credentials, method, unicode(uri),
        body=config, if_match=if_match)
Esempio n. 29
0
def smb_delete_share(conninfo, credentials, id_):
    id_ = str(id_)

    method = "DELETE"
    uri = "/v1/conf/shares/smb/%s" % id_

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 30
0
def list_group(conninfo, credentials, group_id):
    group_id = int(group_id)

    method = "GET"
    uri = "/v1/groups/%d" % group_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 31
0
def directory(conninfo, credentials, inode_num):
    method = "GET"
    uri = str(
        UriBuilder(
            path="/v1/debug/inspect/directory").add_path_component(inode_num))

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 32
0
def unpack_identity(conninfo, credentials, auth_id):
    auth_id = int(auth_id)

    method = "GET"
    uri = "/v1/users/" + str(auth_id) + "/unpack-identity"

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 33
0
def set_acl(conninfo,
            credentials,
            path=None,
            id_=None,
            control=None,
            aces=None,
            if_match=None,
            posix_special_permissions=None):

    if not control or not aces:
        raise ValueError("Must specify both control flags and ACEs")

    # Don't require POSIX special permissions in the input ACL
    if not posix_special_permissions:
        posix_special_permissions = []

    uri = build_files_uri([ref(path, id_), "info", "acl"])

    if_match = None if not if_match else unicode(if_match)

    config = {
        'aces': list(aces),
        'control': list(control),
        'posix_special_permissions': list(posix_special_permissions)
    }
    method = "PUT"

    return request.rest_request(conninfo,
                                credentials,
                                method,
                                unicode(uri),
                                body=config,
                                if_match=if_match)
Esempio n. 34
0
def create_unix_file(conninfo,
                     credentials,
                     name,
                     file_type,
                     major_minor_numbers=None,
                     dir_path=None,
                     dir_id=None):
    uri = build_files_uri([ref(dir_path, dir_id), "entries"]).append_slash()

    config = {
        'name': unicode(name).rstrip("/"),
        'action': 'CREATE_UNIX_FILE',
        'unix_file_type': file_type,
    }

    validate_major_minor_numbers(file_type, major_minor_numbers)

    if major_minor_numbers is not None:
        config['major_minor_numbers'] = major_minor_numbers

    method = "POST"
    return request.rest_request(conninfo,
                                credentials,
                                method,
                                unicode(uri),
                                body=config)
Esempio n. 35
0
def read_directory(conninfo,
                   credentials,
                   page_size=None,
                   path=None,
                   id_=None,
                   snapshot=None,
                   smb_pattern=None):
    '''
    @param {int} page_size   How many entries to return
    @param {str} path        Directory to read, by path
    @param {int} id_         Directory to read, by ID
    @param {int} snapshot    Snapshot ID of directory to read
    @param {str} smb_pattern SMB style match pattern.
    '''
    uri = build_files_uri([ref(path, id_), "entries"]).append_slash()

    method = "GET"

    if page_size is not None:
        uri.add_query_param("limit", page_size)

    if snapshot:
        uri.add_query_param("snapshot", snapshot)

    if smb_pattern:
        uri.add_query_param("smb-pattern", smb_pattern)

    return request.rest_request(conninfo, credentials, method, unicode(uri))
Esempio n. 36
0
def read_file(conninfo,
              credentials,
              file_,
              path=None,
              id_=None,
              snapshot=None,
              offset=None,
              length=None,
              stream_id=None):
    uri = None
    if stream_id:
        uri = build_files_uri([ref(path, id_), 'streams', stream_id, 'data'])
    else:
        uri = build_files_uri([ref(path, id_), "data"])

    if snapshot is not None:
        uri.add_query_param('snapshot', snapshot)
    if offset is not None:
        uri.add_query_param('offset', offset)
    if length is not None:
        uri.add_query_param('length', length)

    method = "GET"
    return request.rest_request(
        conninfo,
        credentials,
        method,
        unicode(uri),
        response_content_type=request.CONTENT_TYPE_BINARY,
        response_file=file_)
Esempio n. 37
0
def acl_explain_posix_mode(conninfo, credentials, path=None, id_=None):
    method = "POST"

    uri = build_files_uri(
        [ref(path, id_), 'info', 'acl', 'explain-posix-mode'])

    return request.rest_request(conninfo, credentials, method, unicode(uri))
Esempio n. 38
0
def acl_explain_rights(conninfo,
                       credentials,
                       user,
                       group,
                       ids=None,
                       path=None,
                       id_=None):
    method = "POST"
    '''
    @param {str}  user      User for whom to explain rights.
    @param {str}  path      Path to the file. If None, id must not be None
    @param {int}  id        File id of the file. If None, path must not be None
    @param {str}  group     User's primary group.
    @param {list} ids       User's additional groups and related identities.
    '''

    uri = build_files_uri([ref(path, id_), 'info', 'acl', 'explain-rights'])

    payload = {'user': Identity(user).dictionary()}
    if group:
        payload['primary_group'] = Identity(group).dictionary()
    if ids:
        payload['auxiliary_identities'] = [
            Identity(i).dictionary() for i in ids
        ]

    return request.rest_request(conninfo,
                                credentials,
                                method,
                                unicode(uri),
                                body=payload)
Esempio n. 39
0
def current_activity_get(conninfo, credentials, specific_type=None):
    method = "GET"
    uri = UriBuilder(path="/v1/analytics/activity/current")
    if specific_type:
        uri.add_query_param('type', specific_type)

    return request.rest_request(conninfo, credentials, method, str(uri))
Esempio n. 40
0
def list_groups_for_user(conninfo, credentials, user_id):
    user_id = int(user_id)

    method = "GET"
    uri = "/v1/users/%d/groups/" % user_id

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 41
0
def iops_get(conninfo, credentials, specific_type=None):
    method = 'GET'
    uri = UriBuilder(path='/v1/analytics/iops')
    if specific_type:
        uri.add_query_param('type', specific_type)

    return request.rest_request(conninfo, credentials, method, str(uri))
Esempio n. 42
0
def pstore_get(conninfo, credentials, pstore=None):
    method = "GET"
    uri = "/v1/debug/pstore/"
    if pstore:
        uri += pstore

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 43
0
def config_put(conninfo,
               credentials,
               install_path,
               target,
               override_version=False):
    '''
    Set upgrade config.

    Warning: override_version allows an unsafe upgrade, which can result in
    corruption if used improperly. It should never be used on a production
    system.  It is useful when upgrading from a non-release build.
    '''
    req = {
        'install_path': str(install_path),
        'target': str(target),
    }
    method = "PUT"
    uri = UriBuilder(path="/v1/upgrade/settings")
    if override_version:
        uri.add_query_param('override_compatibility_check', 'True')

    return request.rest_request(conninfo,
                                credentials,
                                method,
                                str(uri),
                                body=req)
Esempio n. 44
0
def group_remove_member(conninfo, credentials, group_id, member_id):
    group_id = int(group_id)
    member_id = int(member_id)

    method = "DELETE"
    uri = "/v1/groups/%d/members/%d" % (group_id, member_id)

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 45
0
def get_file_samples(conninfo, credentials, path, count, by_value):
    method = "GET"

    uri = build_files_uri([path, 'sample']).append_slash()
    uri.add_query_param('by-value', by_value)
    uri.add_query_param('limit', count)

    return request.rest_request(conninfo, credentials, method, unicode(uri))
Esempio n. 46
0
def set_node_identify_light(conninfo, credentials, node, light_visible):
    method = "POST"
    uri = "/v1/cluster/nodes/{}/identify".format(node)

    body = {'light_visible': light_visible}

    return request.rest_request(conninfo, credentials, method, uri,
                                body=body)
Esempio n. 47
0
def get_file_attr(conninfo, credentials, id_, snapshot=None):
    method = "GET"
    uri = build_files_uri([id_, "info", "attributes"])

    if snapshot:
        uri.add_query_param('snapshot', snapshot)

    return request.rest_request(conninfo, credentials, method, unicode(uri))
Esempio n. 48
0
def get_node_chassis_status(conninfo, credentials, node=None):
    method = "GET"

    if node is not None:
        uri = "/v1/cluster/nodes/{}/chassis".format(node)
    else:
        uri = "/v1/cluster/nodes/chassis/"

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 49
0
def group_add_member(conninfo, credentials, group_id, member_id):
    group_id = int(group_id)
    member_id = member_id if member_id is None else str(member_id)

    method = "POST"
    uri = "/v1/groups/%d/members/" % group_id
    body = { 'member_id' : member_id if member_id is not None else '' }

    return request.rest_request(conninfo, credentials, method, uri, body=body)
Esempio n. 50
0
def set_user_password(conninfo, credentials, user_id, new_password):
    user_id = int(user_id)
    new_password = util.parse_ascii(new_password, 'password')

    method = "POST"
    uri = "/v1/users/%d/setpassword" % user_id
    body = { 'new_password' : new_password }

    return request.rest_request(conninfo, credentials, method, uri, body=body)
Esempio n. 51
0
def put_cluster_conf(conninfo, credentials, cluster_name):
    method = "PUT"
    uri = "/v1/cluster/settings"

    config = {
        'cluster_name': str(cluster_name)
    }

    return request.rest_request(conninfo, credentials, method, uri,
        body=config)
def add_node(conninfo, credentials, node_uuids):
    method = "POST"
    uri = "/v1/cluster/nodes/"

    req = {
        'node_uuids':        list(node_uuids)
    }

    return request.rest_request(conninfo, credentials, method, uri,
                                body=req)
Esempio n. 53
0
def capacity_history_get(conninfo, credentials, interval,
                         begin_time, end_time=None):
    method = 'GET'

    end_time_component = '&end-time={}'.format(end_time) if end_time else ''
    uri = '/v1/analytics/capacity-history/' \
          '?begin-time={}'.format(begin_time) + end_time_component + \
          '&interval={}'.format(interval)

    return request.rest_request(conninfo, credentials, method, uri)
Esempio n. 54
0
def write_file(conninfo, credentials, data_file, path=None, id_=None,
       if_match=None):
    assert (path is not None) ^ (id_ is not None)
    ref = unicode(path) if path else unicode(id_)
    uri = build_files_uri([ref, "data"])
    if_match = None if not if_match else unicode(if_match)

    method = "PUT"
    return request.rest_request(conninfo, credentials, method, unicode(uri),
        body_file=data_file, if_match=if_match,
        request_content_type=request.CONTENT_TYPE_BINARY)
Esempio n. 55
0
def read_file(conninfo, credentials, file_, path=None, id_=None, snapshot=None):
    assert (path is not None) ^ (id_ is not None)
    ref = unicode(path) if path else unicode(id_)
    uri = build_files_uri([ref, "data"])

    if snapshot:
        uri.add_query_param('snapshot', snapshot)

    method = "GET"
    return request.rest_request(conninfo, credentials, method, unicode(uri),
        response_content_type=request.CONTENT_TYPE_BINARY, response_file=file_)
Esempio n. 56
0
def change_password(conninfo, credentials, old_password, new_password):
    "Unlike SetUserPassword, acts implicitly on logged in user"

    method = "POST"
    uri = "/v1/session/change-password"
    body = {
        'old_password': util.parse_ascii(old_password, 'old password'),
        'new_password': util.parse_ascii(new_password, 'new password')
    }

    return request.rest_request(conninfo, credentials, method, uri, body=body)
Esempio n. 57
0
def get_acl(conninfo, credentials, path=None, id_=None, snapshot=None):
    assert (path is not None) ^ (id_ is not None)
    ref = unicode(path) if path else unicode(id_)
    uri = build_files_uri([ref, "info", "acl"])

    method = "GET"

    if snapshot:
        uri.add_query_param("snapshot", snapshot)

    return format_output_acl(conninfo, credentials, request.rest_request(
        conninfo, credentials, method, unicode(uri)))
Esempio n. 58
0
def add_user(conninfo, credentials, name, primary_group, uid):
    method = "POST"
    uri = "/v1/users/"

    user_info = {
        'name':          util.parse_ascii(name, 'username'),
        'primary_group': str(primary_group),
        'uid':           '' if uid is None else str(uid)
    }

    return request.rest_request(conninfo, credentials, method, uri,
        body=user_info)
Esempio n. 59
0
def read_entire_directory(conninfo, credentials, page_size=None, path=None,
                          id_=None):
    # Perform initial read_directory normally.
    result = read_directory(conninfo, credentials, page_size=page_size,
        path=path, id_=id_)
    next_uri = result.data['paging']['next']
    yield result

    while next_uri != '':
        # Perform raw read_directory with paging URI.
        result = request.rest_request(conninfo, credentials, "GET", next_uri)
        next_uri = result.data['paging']['next']
        yield result
Esempio n. 60
0
def add_group(conninfo, credentials, name, gid):
    gid = gid if gid is None else str(gid)

    method = "POST"
    uri = "/v1/groups/"

    group_info = {
        'name': util.parse_ascii(name, 'group name'),
        'gid':  gid if gid is not None else '',
    }

    return request.rest_request(conninfo, credentials, method, uri,
        body=group_info)