Skip to content

Commit 328dde8

Browse files
authored
Saimon/support xattrs cloudfolders (#253)
1 parent 370a3a6 commit 328dde8

File tree

5 files changed

+67
-11
lines changed

5 files changed

+67
-11
lines changed

cterasdk/core/cloudfs.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from .base_command import BaseCommand
66
from . import query, devices
77
from .enum import ListFilter, PolicyType
8-
from .types import ComplianceSettingsBuilder
8+
from .types import ComplianceSettingsBuilder, ExtendedAttributesBuilder
99
from ..common import union, Object
1010
from ..exceptions import CTERAException, ObjectNotFoundException
1111

@@ -137,7 +137,7 @@ class CloudDrives(BaseCommand):
137137
def _get_entire_object(self, name, owner):
138138
return self._core.api.get(f'{self.find(name, owner, include=["baseObjectRef"]).baseObjectRef}')
139139

140-
def add(self, name, group, owner, winacls=True, description=None, quota=None, compliance_settings=None):
140+
def add(self, name, group, owner, winacls=True, description=None, quota=None, compliance_settings=None, xattrs=None):
141141
"""
142142
Create a new Cloud Drive Folder (Cloud Volume)
143143
@@ -149,6 +149,8 @@ def add(self, name, group, owner, winacls=True, description=None, quota=None, co
149149
:param str,optional quota: Cloud drive folder quota in GB
150150
:param cterasdk.common.object.Object,optional compliance_settings: Compliance settings, defaults to disabled.
151151
Use :func:`cterasdk.core.types.ComplianceSettingsBuilder` to build the compliance settings object
152+
:param cterasdk.common.object.Object,optional xattrs: Extended attributes, defaults to MacOS.
153+
Use :func:`cterasdk.core.types.ExtendedAttributesBuilder` to build the extended attributes object
152154
"""
153155
param = Object()
154156
param.name = name
@@ -159,6 +161,7 @@ def add(self, name, group, owner, winacls=True, description=None, quota=None, co
159161
if description:
160162
param.description = description
161163
param.wormSettings = compliance_settings if compliance_settings else ComplianceSettingsBuilder.default().build()
164+
param.extendedAttributes = xattrs if xattrs else ExtendedAttributesBuilder.default().build()
162165

163166
try:
164167
response = self._core.api.execute('', 'addCloudDrive', param)
@@ -174,8 +177,8 @@ def add(self, name, group, owner, winacls=True, description=None, quota=None, co
174177
)
175178
raise error
176179

177-
def modify(self, current_name, owner, new_name=None, new_owner=None, new_group=None,
178-
description=None, winacls=None, quota=None, compliance_settings=None):
180+
def modify(self, current_name, owner, new_name=None, new_owner=None, new_group=None, # pylint: disable=too-many-arguments
181+
description=None, winacls=None, quota=None, compliance_settings=None, xattrs=None):
179182
"""
180183
Modify a Cloud Drive Folder (Cloud Volume)
181184
@@ -189,6 +192,8 @@ def modify(self, current_name, owner, new_name=None, new_owner=None, new_group=N
189192
:param str,optional quota: Folder quota in GB
190193
:param cterasdk.common.object.Object,optional compliance_settings: Compliance settings.
191194
Use :func:`cterasdk.core.types.ComplianceSettingsBuilder` to build the compliance settings object
195+
:param cterasdk.common.object.Object,optional xattrs: Extended attributes.
196+
Use :func:`cterasdk.core.types.ExtendedAttributesBuilder` to build the extended attributes object
192197
"""
193198
param = self._get_entire_object(current_name, owner)
194199
if new_name:
@@ -205,6 +210,8 @@ def modify(self, current_name, owner, new_name=None, new_owner=None, new_group=N
205210
param.folderQuota = quota
206211
if compliance_settings:
207212
param.wormSettings = compliance_settings
213+
if xattrs:
214+
param.extendedAttributes = xattrs
208215
try:
209216
response = self._core.api.put(f'/{param.baseObjectRef}', param)
210217
logging.getLogger('cterasdk.core').info('Cloud drive folder updated. %s', {'name': current_name})

cterasdk/core/enum.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,15 @@ class RetentionMode:
607607
Compliance = 'Compliance'
608608

609609

610+
class ExtendedAttributes:
611+
"""
612+
Extended Attributes
613+
614+
:ivar str MacOS: MacOS
615+
"""
616+
MacOS = 'MacOS'
617+
618+
610619
class Duration:
611620
"""
612621
Duration

cterasdk/core/types.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from ..lib import FileSystem
55

66
from .enum import PortalAccountType, CollaboratorType, FileAccessMode, PlanCriteria, TemplateCriteria, \
7-
BucketType, LocationType, Platform, RetentionMode, Duration
7+
BucketType, LocationType, Platform, RetentionMode, Duration, ExtendedAttributes
88

99

1010
CloudFSFolderFindingHelper = namedtuple('CloudFSFolderFindingHelper', ('name', 'owner'))
@@ -698,6 +698,40 @@ def build(self):
698698
return self.settings
699699

700700

701+
class ExtendedAttribute(Object):
702+
703+
def __init__(self, name, supported):
704+
self._classname = 'ExtendedAttributesInfo' # pylint: disable=protected-access
705+
self.name = name
706+
self.supported = supported
707+
708+
709+
class ExtendedAttributesBuilder:
710+
711+
def __init__(self, enable, xattrs):
712+
self.xattrs = Object()
713+
self.xattrs._classname = 'ExtendedAttributes' # pylint: disable=protected-access
714+
self.xattrs.enable = enable
715+
self.xattrs.attributes = xattrs
716+
717+
@staticmethod
718+
def default():
719+
return ExtendedAttributesBuilder(True, [ExtendedAttribute(ExtendedAttributes.MacOS, True)])
720+
721+
@staticmethod
722+
def disabled():
723+
return ExtendedAttributesBuilder(False, [ExtendedAttribute(ExtendedAttributes.MacOS, True)])
724+
725+
def add(self, xattr):
726+
"""
727+
:param cterasdk.core.enum.ExtendedAttributes xattr: Extended attribute
728+
"""
729+
self.xattrs.append(xattr)
730+
731+
def build(self):
732+
return self.xattrs
733+
734+
701735
class RoleSettings(Object): # pylint: disable=too-many-instance-attributes
702736
"""
703737
Role Settings

docs/source/UserGuides/Portal/Administration.rst

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,8 +1380,11 @@ Cloud Drive Folders
13801380
"""Create a Cloud Drive folder, owned by a local user account 'svc_account'"""
13811381
svc_account = core_types.UserAccount('svc_account')
13821382
admin.cloudfs.drives.add('DIR-001', 'FG-001', svc_account)
1383-
admin.cloudfs.drives.add('DIR-003', 'FG-003', svc_account, winacls = False) # disable Windows ACL's
1384-
admin.cloudfs.drives.add('DIR-003', 'FG-003', svc_account, quota = 1024) # Set folder quota, in GB
1383+
admin.cloudfs.drives.add('DIR-002', 'FG-002', svc_account, winacls=False,
1384+
xattrs=core_types.ExtendedAttributesBuilder.disabled().build()) # Disable xattrs and Windows ACL's
1385+
admin.cloudfs.drives.add('DIR-003', 'FG-003', svc_account, winacls=True,
1386+
xattrs=core_types.ExtendedAttributesBuilder.disabled().build()) # Disable xattrs, Enable Windows ACL's
1387+
admin.cloudfs.drives.add('DIR-004', 'FG-004', svc_account, quota=1024) # Set folder quota, in GB
13851388
13861389
"""Create a Cloud Drive folder, owned by the domain user 'ctera.local\wbruce'"""
13871390
wbruce = core_types.UserAccount('wbruce', 'ctera.local')
@@ -1409,6 +1412,7 @@ Cloud Drive Folders
14091412
settings = core_types.ComplianceSettingsBuilder.enterprise(1, core_enum.Duration.Years).grace_period(1, core_enum.Duration.Hours).build()
14101413
admin.cloudfs.drives.add('Compliance', 'FG-Compliance', svc_account, compliance_settings=settings)
14111414
1415+
14121416
.. automethod:: cterasdk.core.cloudfs.CloudDrives.modify
14131417
:noindex:
14141418

tests/ut/test_core_cloudfs_cloud_drives.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from cterasdk import exceptions
55
from cterasdk.core import cloudfs
6-
from cterasdk.core.types import UserAccount, ComplianceSettingsBuilder
6+
from cterasdk.core.types import UserAccount, ComplianceSettingsBuilder, ExtendedAttributesBuilder
77
from cterasdk.core import query
88
from cterasdk.common import Object, union
99
from tests.ut import base_core
@@ -118,13 +118,14 @@ def test_add_cloud_drive_with_local_owner_winacls_false(self):
118118
self._mock_get_user_base_object_ref()
119119
self._mock_get_folder_group()
120120

121-
ret = cloudfs.CloudDrives(self._global_admin).add(self._name, self._group, self._local_user_account, False)
121+
ret = cloudfs.CloudDrives(self._global_admin).add(self._name, self._group, self._local_user_account, False,
122+
xattrs=ExtendedAttributesBuilder.disabled().build())
122123

123124
self._global_admin.users.get.assert_called_once_with(self._local_user_account, ['baseObjectRef'])
124125
self._global_admin.cloudfs.groups.get.assert_called_once_with(self._group, ['baseObjectRef'])
125126
self._global_admin.api.execute.assert_called_once_with('', 'addCloudDrive', mock.ANY)
126127

127-
expected_param = self._get_add_cloud_drive_object(winacls=False)
128+
expected_param = self._get_add_cloud_drive_object(winacls=False, xattrs=ExtendedAttributesBuilder.disabled().build())
128129
actual_param = self._global_admin.api.execute.call_args[0][2]
129130
self._assert_equal_objects(actual_param, expected_param)
130131

@@ -171,7 +172,7 @@ def test_undelete_with_local_owner(self):
171172
self._global_admin.users.get.assert_called_once_with(self._local_user_account, ['displayName'])
172173
self._global_admin.files.undelete.assert_called_once_with(f'Users/{self._owner}/{self._name}')
173174

174-
def _get_add_cloud_drive_object(self, winacls=True, description=None, quota=None, compliance_settings=None):
175+
def _get_add_cloud_drive_object(self, winacls=True, description=None, quota=None, compliance_settings=None, xattrs=None):
175176
add_cloud_drive_param = Object()
176177
add_cloud_drive_param.name = self._name
177178
add_cloud_drive_param.owner = self._owner
@@ -181,6 +182,7 @@ def _get_add_cloud_drive_object(self, winacls=True, description=None, quota=None
181182
if description:
182183
add_cloud_drive_param.description = description
183184
add_cloud_drive_param.wormSettings = compliance_settings if compliance_settings else ComplianceSettingsBuilder.default().build()
185+
add_cloud_drive_param.extendedAttributes = xattrs if xattrs else ExtendedAttributesBuilder.default().build()
184186
return add_cloud_drive_param
185187

186188
def _mock_get_user_base_object_ref(self):

0 commit comments

Comments
 (0)