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))
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)
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))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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))
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)
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)
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)
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)
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)
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)
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)
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))
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))
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))
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)
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)
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)
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)
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)
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))
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_)
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))
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)
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)
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)
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)
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)
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))
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)
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))
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)
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)
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)
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)
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)
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)
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_)
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)
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)))
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)
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
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)