Skip to content

Commit 15bd5d4

Browse files
committed
Edge Share - complete CRUD
Access Type - add get and set Screened File Types - Add get, set, add and remove
1 parent fe0ff03 commit 15bd5d4

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

cterasdk/edge/shares.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,24 @@ def set_share_winacls(self, name):
9494
logging.getLogger().error("Updating Windows file sharing access mode. %s", {'share': name, 'access': enum.Acl.WindowsNT})
9595
self._gateway.put('/config/fileservices/share/' + name + '/access', enum.Acl.WindowsNT)
9696

97+
def get_access_type(self, name):
98+
"""
99+
Get the network share Windows File Sharing authentication mode
100+
101+
:param str name: The share name
102+
"""
103+
return self._gateway.get('/config/fileservices/share/' + name + '/access')
104+
105+
def set_access_type(self, name, access):
106+
"""
107+
Set the network share Windows File Sharing authentication mode
108+
109+
:param str name: The share name
110+
:param cterasdk.edge.enum.Acl access: The Windows File Sharing authentication mode
111+
"""
112+
logging.getLogger().info("Updating Windows file sharing access mode. %s", {'share': name, 'access': access})
113+
self._gateway.put('/config/fileservices/share/' + name + '/access', access)
114+
97115
def block_files(self, name, extensions):
98116
"""
99117
Configure a share to block one or more file extensions
@@ -336,6 +354,68 @@ def entry_not_removed(entry):
336354
param = list(filter(entry_not_removed, self.get_trusted_nfs_clients(name)))
337355
self._gateway.put('/config/fileservices/share/' + name + '/trustedNFSClients', param)
338356

357+
def get_screened_file_types(self, name):
358+
"""
359+
Get the share's current list of blocked file extensions
360+
361+
:param str name: The share name
362+
"""
363+
return self._gateway.get('/config/fileservices/share/' + name + '/screenedFileTypes')
364+
365+
def set_screened_file_types(self, name, extensions):
366+
"""
367+
Set the share's current list of blocked file extensions (override the current list)
368+
369+
:param str name: The share name
370+
:param list[str] extensions: List of file extensions to block
371+
"""
372+
share = self.get(name)
373+
if share.access != enum.Acl.WindowsNT:
374+
raise CTERAException('Cannot block file types on non Windows-ACL enabled shares', None, share=share.name, access=share.access)
375+
logging.getLogger().info(
376+
"Updating the list of blocked file extensions. %s",
377+
{'share': name, 'extensions': extensions, 'access': enum.Acl.WindowsNT}
378+
)
379+
self._gateway.put('/config/fileservices/share/' + share.name + '/screenedFileTypes', extensions)
380+
381+
def add_screened_file_types(self, name, extensions):
382+
"""
383+
Add extensions to the share's current list of blocked file extensions
384+
385+
:param str name: The share name
386+
:param list[str] extensions: List of file extensions to add
387+
"""
388+
share = self.get(name)
389+
if share.access != enum.Acl.WindowsNT:
390+
raise CTERAException('Cannot block file types on non Windows-ACL enabled shares', None, share=share.name, access=share.access)
391+
392+
new_list = list(set(share.screenedFileTypes + extensions))
393+
394+
logging.getLogger().info(
395+
"Updating the list of blocked file extensions. %s",
396+
{'share': name, 'extensions': new_list, 'access': enum.Acl.WindowsNT}
397+
)
398+
self._gateway.put('/config/fileservices/share/' + share.name + '/screenedFileTypes', new_list)
399+
400+
def remove_screened_file_types(self, name, extensions):
401+
"""
402+
Remove extensions from the share's current list of blocked file extensions
403+
404+
:param str name: The share name
405+
:param list[str] extensions: List of file extensions to remove
406+
"""
407+
share = self.get(name)
408+
if share.access != enum.Acl.WindowsNT:
409+
raise CTERAException('Cannot block file types on non Windows-ACL enabled shares', None, share=share.name, access=share.access)
410+
411+
new_list = list(set(share.screenedFileTypes) - set(extensions))
412+
413+
logging.getLogger().info(
414+
"Updating the list of blocked file extensions. %s",
415+
{'share': name, 'extensions': new_list, 'access': enum.Acl.WindowsNT}
416+
)
417+
self._gateway.put('/config/fileservices/share/' + share.name + '/screenedFileTypes', new_list)
418+
339419
def _validate_root_directory(self, name):
340420
param = Object()
341421
param.path = '/'

tests/ut/test_edge_shares.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,106 @@ def test_remove_trusted_nfs_clients(self):
314314
@staticmethod
315315
def _get_get_trusted_nfs_client_object(address=None):
316316
return NFSv3AccessControlEntry(address=address or '192.168.68.0', netmask='255.255.255.0', perm=FileAccessMode.RO)
317+
318+
def _test_get_access_type(self, expected_access):
319+
share_name = 'share'
320+
self._init_filer(get_response=expected_access)
321+
actual_access = shares.Shares(self._filer).get_access_type(share_name)
322+
self._filer.get.assert_called_once_with('/config/fileservices/share/' + share_name + '/access')
323+
self.assertEqual(actual_access, expected_access)
324+
325+
def test_get_access_type(self):
326+
for access in [k for k in Acl.__dict__ if not k.startswith('_')]:
327+
self._test_get_access_type(access)
328+
329+
def _test_set_access_type(self, access):
330+
share_name = 'share'
331+
self._init_filer()
332+
shares.Shares(self._filer).set_access_type(share_name, access)
333+
self._filer.put.assert_called_once_with('/config/fileservices/share/' + share_name + '/access', access)
334+
335+
def test_set_access_type(self):
336+
for access in [k for k in Acl.__dict__ if not k.startswith('_')]:
337+
self._test_set_access_type(access)
338+
339+
def test_get_screened_file_types(self):
340+
share_name = 'share'
341+
get_response = ['exe', 'sh']
342+
self._init_filer(get_response=get_response)
343+
screened_file_types = shares.Shares(self._filer).get_screened_file_types(share_name)
344+
self._filer.get.assert_called_once_with('/config/fileservices/share/' + share_name + '/screenedFileTypes')
345+
self.assertListEqual(get_response, screened_file_types)
346+
347+
def test_set_screened_file_types(self):
348+
share_name = 'share'
349+
current_screened_file_type = 'old'
350+
current_share = self._test_screened_file_types_get_current_share(share_name, Acl.WindowsNT, [current_screened_file_type])
351+
self._init_filer(get_response=current_share)
352+
new_screened_file_type = ['new']
353+
shares.Shares(self._filer).set_screened_file_types(share_name, new_screened_file_type)
354+
self._filer.get.assert_called_once_with('/config/fileservices/share/' + share_name)
355+
self._filer.put.assert_called_once_with('/config/fileservices/share/' + share_name + '/screenedFileTypes', mock.ANY)
356+
self.assertListEqual(new_screened_file_type, self._filer.put.call_args[0][1])
357+
358+
def test_set_screened_file_types_invalid_access(self):
359+
share_name = 'share'
360+
current_share = self._test_screened_file_types_get_current_share(
361+
share_name,
362+
Acl.OnlyAuthenticatedUsers,
363+
['old']
364+
)
365+
self._init_filer(get_response=current_share)
366+
with self.assertRaises(exception.CTERAException):
367+
shares.Shares(self._filer).set_screened_file_types(share_name, ['new'])
368+
369+
def test_add_screened_file_types(self):
370+
share_name = 'share'
371+
current_screened_file_type = ['old']
372+
current_share = self._test_screened_file_types_get_current_share(share_name, Acl.WindowsNT, current_screened_file_type)
373+
self._init_filer(get_response=current_share)
374+
new_screened_file_type = ['new']
375+
shares.Shares(self._filer).add_screened_file_types(share_name, new_screened_file_type)
376+
self._filer.get.assert_called_once_with('/config/fileservices/share/' + share_name)
377+
self._filer.put.assert_called_once_with('/config/fileservices/share/' + share_name + '/screenedFileTypes', mock.ANY)
378+
self.assertListEqual(sorted(current_screened_file_type + new_screened_file_type), sorted(self._filer.put.call_args[0][1]))
379+
380+
def test_add_screened_file_types_invalid_access(self):
381+
share_name = 'share'
382+
current_share = self._test_screened_file_types_get_current_share(
383+
share_name,
384+
Acl.OnlyAuthenticatedUsers,
385+
['old']
386+
)
387+
self._init_filer(get_response=current_share)
388+
with self.assertRaises(exception.CTERAException):
389+
shares.Shares(self._filer).add_screened_file_types(share_name, ['new'])
390+
391+
def test_remove_screened_file_types(self):
392+
share_name = 'share'
393+
current_screened_file_types = ['old', 'new']
394+
current_share = self._test_screened_file_types_get_current_share(share_name, Acl.WindowsNT, current_screened_file_types)
395+
self._init_filer(get_response=current_share)
396+
removed_screened_file_type = 'new'
397+
shares.Shares(self._filer).remove_screened_file_types(share_name, [removed_screened_file_type])
398+
self._filer.get.assert_called_once_with('/config/fileservices/share/' + share_name)
399+
self._filer.put.assert_called_once_with('/config/fileservices/share/' + share_name + '/screenedFileTypes', mock.ANY)
400+
self.assertListEqual(['old'], sorted(self._filer.put.call_args[0][1]))
401+
402+
def test_remove_screened_file_types_invalid_access(self):
403+
share_name = 'share'
404+
current_share = self._test_screened_file_types_get_current_share(
405+
share_name,
406+
Acl.OnlyAuthenticatedUsers,
407+
['old']
408+
)
409+
self._init_filer(get_response=current_share)
410+
with self.assertRaises(exception.CTERAException):
411+
shares.Shares(self._filer).remove_screened_file_types(share_name, ['new'])
412+
413+
@staticmethod
414+
def _test_screened_file_types_get_current_share(name, access, current_list):
415+
share = Object()
416+
share.name = name
417+
share.access = access
418+
share.screenedFileTypes = current_list
419+
return share

0 commit comments

Comments
 (0)