Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions cterasdk/cio/core/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,20 @@ def _handle_response(self, r):
return PortalResource.from_server_object(metadata)


class GetShareCandidate(GetProperties):

def _handle_response(self, r):
candidate = r.root.gwShareManagementCandidate
return Object(**{
'full_path': candidate.fullPath,
'display_path': candidate.displayPath,
'cloud_folder_uid': candidate.cloudFolderUid,
'has_acl': candidate.hasAcl,
'web_dav_url': candidate.webDavUrl,
'cloud_folder_name': r.root.name
})


class GetPermalink(GetMetadata):

def _handle_response(self, r):
Expand Down
2 changes: 1 addition & 1 deletion cterasdk/cio/core/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class GlobalAdminPath(PortalPath):

@staticmethod
def from_context(reference):
return ServicesPortalPath(GlobalAdminPath.Namespace, reference)
return GlobalAdminPath(GlobalAdminPath.Namespace, reference)


class InvitationPath(PortalPath):
Expand Down
22 changes: 14 additions & 8 deletions cterasdk/clients/clients.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,8 +236,8 @@ def multipart(self, path, form, *, on_response=None, on_error=None, **kwargs):
return self.request(request, on_response=on_response, on_error=on_error)

@decorators.authenticated
def delete(self, path, *, on_response=None, on_error=None, **kwargs):
request = async_requests.DeleteRequest(self._builder(path), **kwargs)
def delete(self, path, data=None, *, data_serializer=None, on_response=None, on_error=None, **kwargs):
request = async_requests.DeleteRequest(self._builder(path), data=data_serializer(data), **kwargs)
return self.request(request, on_response=on_response, on_error=on_error)

def _request(self, request, *, on_response=None, on_error=None):
Expand Down Expand Up @@ -325,8 +325,8 @@ def form_data(self, path, data, **kwargs):
response = super().form_data(path, data, on_error=XMLHandler(), **kwargs)
return response.xml()

def delete(self, path, **kwargs):
response = super().delete(path, on_error=XMLHandler(), **kwargs)
def delete(self, path, data=None, **kwargs):
response = super().delete(path, data, on_error=XMLHandler(), **kwargs)
return response.xml()


Expand All @@ -338,15 +338,21 @@ def get(self, path, **kwargs):
return response.json()

def put(self, path, data, **kwargs):
response = super().put(path, data, data_serializer=Serializers.JSON, on_error=JSONHandler(), **kwargs)
response = super().put(path, data, data_serializer=Serializers.JSON, headers={
'Content-Type': 'application/json'
}, on_error=JSONHandler(), **kwargs)
return response.json()

def post(self, path, data, **kwargs):
response = super().post(path, data, data_serializer=Serializers.JSON, on_error=JSONHandler(), **kwargs)
response = super().post(path, data, data_serializer=Serializers.JSON, headers={
'Content-Type': 'application/json'
}, on_error=JSONHandler(), **kwargs)
return response.json()

def delete(self, path, **kwargs):
response = super().delete(path, on_error=JSONHandler(), **kwargs)
def delete(self, path, data=None, **kwargs):
response = super().delete(path, data, data_serializer=Serializers.JSON, headers={
'Content-Type': 'application/json'
}, on_error=JSONHandler(), **kwargs)
return response.json()


Expand Down
15 changes: 13 additions & 2 deletions cterasdk/convert/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,18 @@ def _to_protected_dict(o):
return ret


def tojsonstr(obj, pretty_print=True, no_log=True):
class Encoder(json.JSONEncoder):

def default(self, o):
d = o.get('__dict__', None)
if d:
if '_classname' in d:
d['$class'] = d.pop('_classname')
return d
return super().default(o)


def tojsonstr(obj, pretty_print=True, no_log=False):
"""
Convert a Python object to a JSON string.

Expand All @@ -49,7 +60,7 @@ def tojsonstr(obj, pretty_print=True, no_log=True):
indent = 5 if pretty_print else None
if no_log:
return json.dumps(obj, default=_to_protected_dict, indent=indent)
return json.dumps(obj, default=lambda o: o.__dict__, indent=indent)
return json.dumps(obj, cls=Encoder, indent=indent)


def toxmlstr(obj, pretty_print=False, no_log=False):
Expand Down
43 changes: 43 additions & 0 deletions cterasdk/core/enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,14 @@ class CollaboratorType:
DG = "adGroup"
EXT = "external"

@staticmethod
def from_account(account):
if account.account_type == PortalAccountType.User:
return CollaboratorType.LU if account.is_local else CollaboratorType.DU
if account.account_type == PortalAccountType.Group:
return CollaboratorType.DU if account.is_local else CollaboratorType.DG
raise ValueError(f'Unknown principal type: {account.account_type}')


class PortalType:
"""
Expand Down Expand Up @@ -752,3 +760,38 @@ class NativeFormat:
Filesystem = 'Filesystem'
Bucket = 'Bucket'
Bidirectional = 'Bidirectional'


class ShareGroup:
"""
Grouping Criteria when Listing Network Shares

:ivar str Path: Group by Path
:ivar str Edge Filer: Group by Edge Filers
"""
Path = 'path'
Edge = 'edgeFilers'


class ShareProtocol:
"""
Filter Shares by Protocol

:ivar str NFS: NFS Shares
:ivar str SMB: SMB Shares
"""
SMB = 'smb'
NFS = 'nfs'


class KRBSecurity:
"""
Kerberos Security.

:ivar str KRB5: krb5
:ivar str KRB5I: krb5i
:ivar str KRB5P: krb5p
"""
KRB5 = "krb5"
KRB5I = "krb5i"
KRB5P = "krb5p"
29 changes: 22 additions & 7 deletions cterasdk/core/groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,30 +46,45 @@ def get(self, group_account, include=None):
raise ObjectNotFoundException(baseurl)
return group_object

def list_local_groups(self, include=None):
def list_local_groups(self, include=None, filters=None):
"""
List all local groups

:param list[str] include: List of fields to retrieve, defaults to ['name']
:param list[],optional filters: List of additional filters, defaults to None
:return: Iterator for all local groups
:rtype: cterasdk.lib.iterator.QueryIterator
"""
include = union(include or [], Groups.default)
param = query.QueryParamBuilder().include(include).build()
return query.iterator(self._core, '/localGroups', param)
return self._groups('/localGroups', include, filters)

def list_domain_groups(self, domain, include=None):
def list_domain_groups(self, domain, include=None, filters=None):
"""
List all the groups in the domain

:param str domain: Domain name
:param list[str] include: List of fields to retrieve, defaults to ['name']
:param list[],optional filters: List of additional filters, defaults to None
:return: Iterator for all the domain groups
:rtype: cterasdk.lib.iterator.QueryIterator
"""
return self._groups(f'/domains/{domain}/adGroups', include, filters)

def _groups(self, path, include, filters):
"""
List Groups.

:param str path: Path
:param list[str],optional include: List of fields to retrieve, defaults to ['name']
:param list[],optional filters: List of additional filters, defaults to None
"""
include = union(include or [], Groups.default)
param = query.QueryParamBuilder().include(include).build()
return query.iterator(self._core, f'/domains/{domain}/adGroups', param)
builder = query.QueryParamBuilder().include(include)
if filters:
for query_filter in filters:
builder.addFilter(query_filter)
builder.orFilter((len(filters) > 1))
param = builder.build()
return query.iterator(self._core, path, param)

def _members_reference(self, users):
return [self._core.users.get(user, include=['baseObjectRef']).baseObjectRef for user in users]
Expand Down
49 changes: 40 additions & 9 deletions cterasdk/core/query.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
from datetime import datetime

from ..lib import QueryIterator, DefaultResponse, Command
from ..lib import QueryIterator, DefaultResponse, v2DefaultResponse, Command
from ..common import Object


def run(core, path, param):
return create_callback_function(core, path, callback_response=DefaultResponse)(param)
def run(core, path, param, *, version=None):
if version != 'v2':
return v1_callback_function(core, path, callback_response=DefaultResponse)(param)
return v2_callback_function(core, path)


def create_callback_function(core, path, name=None, *, callback_response=None):
def v1_callback_function(core, path, name=None, *, callback_response=None):
"""
Create a query callback function

Expand All @@ -29,22 +31,38 @@ def execute(core, path, name, param):
return Command(execute if name else database, core, path, name or 'query')


def iterator(core, path, param=None, name=None, *, callback_response=None):
def v2_callback_function(core, path):

def wrapper(core, path, params):
return v2DefaultResponse(core.clients.v2.get(path, params=dict(params)))

return Command(wrapper, core, path)


def iterator(core, path, param=None, name=None, *, callback_response=None, version=None):
"""
Create iterator

:param cterasdk.objects.core.Portal core: Portal object
:param str path: URL Path
:param str,optional name: Schema method name
:param cterasdk.core.query.QueryParams,optional param: Query paramter object
:param cterasdk.core.query.QueryParams or dict,optional param:
Query parameters, either as a ``QueryParams`` object or a dictionary of key-value pairs.
:param cterasdk.lib.iterator.BaseResponse callback_response: Class to consume callback response
:param str,optional version: Iterator API Version

:returns: Query iterator object
"""

callback_response = callback_response if callback_response else DefaultResponse
callback_function = create_callback_function(core, path, name, callback_response=callback_response)
return QueryIterator(callback_function, param if param else QueryParams())
if version != 'v2':

callback_response = callback_response if callback_response else DefaultResponse

callback_function = v1_callback_function(core, path, name, callback_response=callback_response)

return QueryIterator(callback_function, param if param else QueryParams())

return QueryIterator(v2_callback_function(core, path), v2QueryParams(**param))


class Restriction:
Expand Down Expand Up @@ -148,6 +166,19 @@ def setValue(self, value):
return self.filter


class v2QueryParams(Object):

def __init__(self, **kwargs):
super().__init__()
self.page = 0
self.size = 150
for key, value in kwargs.items():
setattr(self, key, value)

def increment(self):
self.page = self.page + 1


class QueryParams(Object):

def __init__(self):
Expand Down
Loading
Loading