Skip to content

Commit ccfccba

Browse files
authored
Unity: supports modification of NFS/CIFS server (#373)
Major changes: - Supports modification of NFS/CIFS server - Supports modification of virus checker - Supports file uploading/downloading for NAS server
1 parent 3144379 commit ccfccba

File tree

15 files changed

+213
-9
lines changed

15 files changed

+213
-9
lines changed

storops/unity/parser_configs.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,8 @@ UnityNfsServer:
443443
converter: UnityNasServer
444444
- label: fileInterfaces
445445
converter: UnityFileInterfaceList
446+
- label: nfsv3Enabled
447+
key: nfs_v3_enabled
446448
- label: nfsv4Enabled
447449
key: nfs_v4_enabled
448450
- label: isSecureEnabled

storops/unity/resource/cifs_server.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,21 @@ def delete(self, skip_domain_unjoin=None, username=None,
8080
resp.raise_if_err()
8181
return resp
8282

83+
def modify(self, netbios_name=None, name=None,
84+
domain=None, domain_username=None, domain_password=None,
85+
workgroup=None, local_password=None):
86+
req_body = self._cli.make_body(netbiosName=netbios_name,
87+
name=name,
88+
domain=domain,
89+
domainUsername=domain_username,
90+
domainPassword=domain_password,
91+
workgroup=workgroup,
92+
localAdminPassword=local_password)
93+
94+
resp = self.action('modify', **req_body)
95+
resp.raise_if_err()
96+
return resp
97+
8398

8499
class UnityCifsServerList(resource.UnityResourceList):
85100
@classmethod

storops/unity/resource/nas_server.py

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@
3535

3636
log = logging.getLogger(__name__)
3737

38+
FILE_TYPES = {
39+
"ldap_cfg": 1,
40+
"ldap_ca": 2,
41+
"virus_cfg": 4,
42+
"users": 5,
43+
"group": 6,
44+
"hosts": 7,
45+
"net_groups": 8,
46+
"home_dir": 11
47+
}
48+
3849

3950
class UnityNasServer(UnityResource):
4051
@classmethod
@@ -113,23 +124,28 @@ def enable_cifs_service(self, interfaces=None,
113124
local_password=local_password)
114125

115126
def create_nfs_server(self, host_name=None, nfs_v4_enabled=True,
116-
kdc_type=None, kdc_username=None, kdc_password=None):
127+
kdc_type=None, kdc_username=None, kdc_password=None,
128+
nfs_v3_enabled=None, credentials_cache_ttl=None):
117129
clz = storops.unity.resource.nfs_server.UnityNfsServer
118130
return clz.create(self._cli, self,
119131
host_name=host_name,
120132
nfs_v4_enabled=nfs_v4_enabled,
121133
kdc_type=kdc_type,
122134
kdc_username=kdc_username,
123-
kdc_password=kdc_password)
135+
kdc_password=kdc_password,
136+
nfs_v3_enabled=nfs_v3_enabled,
137+
credentials_cache_ttl=credentials_cache_ttl)
124138

125139
def enable_nfs_service(self, host_name=None, nfs_v4_enabled=True,
126-
kdc_type=None, kdc_username=None,
127-
kdc_password=None):
140+
kdc_type=None, kdc_username=None, kdc_password=None,
141+
nfs_v3_enabled=None, credentials_cache_ttl=None):
128142
self.create_nfs_server(host_name=host_name,
129143
nfs_v4_enabled=nfs_v4_enabled,
130144
kdc_type=kdc_type,
131145
kdc_username=kdc_username,
132-
kdc_password=kdc_password)
146+
kdc_password=kdc_password,
147+
nfs_v3_enabled=nfs_v3_enabled,
148+
credentials_cache_ttl=credentials_cache_ttl)
133149

134150
def create_dns_server(self, domain, *ip_list):
135151
clz = storops.unity.resource.dns_server.UnityFileDnsServer
@@ -264,6 +280,23 @@ def modify(self, name=None, sp=None, is_replication_destination=None,
264280
resp.raise_if_err()
265281
return resp
266282

283+
def upload_file(self, file_type, file_name):
284+
file_type_idx = FILE_TYPES.get(file_type)
285+
files = {'filename': file_name}
286+
resp = self._cli.rest_post('/upload/{}/nasServer/{}'.format(
287+
file_type_idx, self.get_id()), files=files)
288+
resp.raise_if_err()
289+
return resp
290+
291+
def download_file(self, file_type, file_name):
292+
file_type_idx = FILE_TYPES.get(file_type)
293+
resp = self._cli.rest_get('/download/{}/nasServer/{}'.format(
294+
file_type_idx, self.get_id()))
295+
resp.raise_if_err()
296+
with open(file_name, "w", encoding="utf-8") as f:
297+
f.write(resp.response.text)
298+
return resp
299+
267300

268301
class UnityNasServerList(UnityResourceList):
269302
def __init__(self, cli=None, home_sp=None, current_sp=None, **filters):

storops/unity/resource/nfs_server.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class UnityNfsServer(UnityResource):
3030
@classmethod
3131
def create(cls, cli, nas_server, host_name=None, nfs_v4_enabled=True,
3232
is_secure_enabled=None, is_extended_credentials_enabled=None,
33-
kdc_type=None, kdc_username=None, kdc_password=None):
33+
kdc_type=None, kdc_username=None, kdc_password=None,
34+
nfs_v3_enabled=None, credentials_cache_ttl=None):
3435
clz = storops.unity.resource.nas_server.UnityNasServer
3536
nas_server = clz.get(cli, nas_server)
3637

@@ -43,7 +44,9 @@ def create(cls, cli, nas_server, host_name=None, nfs_v4_enabled=True,
4344
isExtendedCredentialsEnabled=is_extended_credentials_enabled,
4445
kdcType=kdc_type,
4546
kdcUsername=kdc_username,
46-
kdcPassword=kdc_password)
47+
kdcPassword=kdc_password,
48+
nfsv3Enabled=nfs_v3_enabled,
49+
credentialsCacheTTL=credentials_cache_ttl)
4750

4851
resp.raise_if_err()
4952
return cls(_id=resp.resource_id, cli=cli)
@@ -59,6 +62,25 @@ def delete(self, skip_kdc_unjoin=None, username=None,
5962
resp.raise_if_err()
6063
return resp
6164

65+
def modify(self, host_name=None, nfs_v4_enabled=None,
66+
is_secure_enabled=None, is_extended_credentials_enabled=None,
67+
kdc_type=None, kdc_username=None, kdc_password=None,
68+
nfs_v3_enabled=None, credentials_cache_ttl=None):
69+
req_body = self._cli.make_body(
70+
hostName=host_name,
71+
nfsv4Enabled=nfs_v4_enabled,
72+
isSecureEnabled=is_secure_enabled,
73+
isExtendedCredentialsEnabled=is_extended_credentials_enabled,
74+
kdcType=kdc_type,
75+
kdcUsername=kdc_username,
76+
kdcPassword=kdc_password,
77+
nfsv3Enabled=nfs_v3_enabled,
78+
credentialsCacheTTL=credentials_cache_ttl)
79+
80+
resp = self.action('modify', **req_body)
81+
resp.raise_if_err()
82+
return resp
83+
6284

6385
class UnityNfsServerList(UnityResourceList):
6486
@classmethod

storops/unity/resource/system.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,11 @@ def get_resource_class(cls):
738738

739739

740740
class UnityVirusChecker(UnityResource):
741-
pass
741+
def modify(self, is_enabled):
742+
req_body = self._cli.make_body(isEnabled=is_enabled)
743+
resp = self.action('modify', **req_body)
744+
resp.raise_if_err()
745+
return resp
742746

743747

744748
class UnityVirusCheckerList(UnityResourceList):

storops_test/unity/resource/test_cifs_server.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import logging
1919
from unittest import TestCase
20+
2021
from hamcrest import assert_that, equal_to, none, instance_of, only_contains, \
2122
raises
2223

@@ -105,6 +106,24 @@ def f():
105106

106107
assert_that(f, raises(UnityNetBiosNameExistedError, 'already exists'))
107108

109+
@patch_rest
110+
def test_modify_success(self):
111+
server = UnityCifsServer(_id='cifs_5', cli=t_rest())
112+
resp = server.modify(netbios_name='nas_5',
113+
workgroup='test_wg_5')
114+
assert_that(resp.is_ok(), equal_to(True))
115+
server.update()
116+
assert_that(server.netbios_name, equal_to('nas_5'))
117+
assert_that(server.workgroup, equal_to('test_wg_5'))
118+
119+
@patch_rest
120+
def test_modify_not_found(self):
121+
def f():
122+
server = UnityCifsServer(_id='cifs_10', cli=t_rest())
123+
server.modify(netbios_name='nas_10', workgroup='test_wg_10')
124+
125+
assert_that(f, raises(UnityResourceNotFoundError))
126+
108127
@patch_rest
109128
def test_delete_cifs3(self):
110129
server = UnityCifsServer(_id='cifs_3', cli=t_rest())

storops_test/unity/resource/test_nfs_server.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# under the License.
1616
from __future__ import unicode_literals
1717

18+
import datetime
1819
from unittest import TestCase
1920

2021
from hamcrest import equal_to, assert_that, instance_of, raises
@@ -61,6 +62,27 @@ def f():
6162

6263
assert_that(f, raises(UnityNfsAlreadyEnabledError, 'already enabled'))
6364

65+
@patch_rest
66+
def test_modify_success(self):
67+
server = UnityNfsServer(_id='nfs_4', cli=t_rest())
68+
resp = server.modify(nfs_v4_enabled=False,
69+
nfs_v3_enabled=True,
70+
credentials_cache_ttl="00:12:00.000")
71+
assert_that(resp.is_ok(), equal_to(True))
72+
server.update()
73+
assert_that(server.nfs_v4_enabled, equal_to(False))
74+
assert_that(server.nfs_v3_enabled, equal_to(True))
75+
assert_that(server.credentials_cache_ttl,
76+
equal_to(datetime.timedelta(minutes=12)))
77+
78+
@patch_rest
79+
def test_modify_not_found(self):
80+
def f():
81+
server = UnityNfsServer(_id='nfs_5', cli=t_rest())
82+
server.delete()
83+
84+
assert_that(f, raises(UnityResourceNotFoundError))
85+
6486
@patch_rest
6587
def test_delete_success(self):
6688
server = UnityNfsServer(_id='nfs_3', cli=t_rest())

storops_test/unity/resource/test_system.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,6 +1166,14 @@ def test_get_all(self):
11661166
checker_list = UnityVirusCheckerList(cli=t_rest())
11671167
assert_that(len(checker_list), equal_to(1))
11681168

1169+
@patch_rest
1170+
def test_modify(self):
1171+
unity = t_unity()
1172+
resp = unity.modify_user_quota(
1173+
user_quota_id='userquota_171798692187_3_3',
1174+
hard_limit=8589934592, soft_limit=2147483648)
1175+
assert_that(resp.is_ok(), equal_to(True))
1176+
11691177

11701178
class UnityBasicSystemInfoTest(TestCase):
11711179
@patch_rest
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"content": {
3+
"id": "cifs_5",
4+
"instanceId": "root/emc:EMC_UEM_CIFSServerLeaf%InstanceID=cifs_5",
5+
"netbiosName": "nas_5",
6+
"workgroup": "test_wg_5",
7+
"isStandalone": true,
8+
"health": {
9+
"value": 5,
10+
"descriptionIds": [
11+
"ALRT_COMPONENT_OK"
12+
],
13+
"descriptions": [
14+
"The component is operating normally. No action is required."
15+
]
16+
},
17+
"smbcaSupported": true,
18+
"smbMultiChannelSupported": true,
19+
"smbProtocolVersions": [
20+
"1.0",
21+
"2.0",
22+
"2.1",
23+
"3.0"
24+
],
25+
"nasServer": {
26+
"id": "nas_5"
27+
}
28+
}
29+
}

storops_test/unity/rest_data/cifsServer/index.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
"url": "/api/instances/cifsServer/cifs_3?compact=True&fields=description,domain,fileInterfaces,health,id,instanceId,isStandalone,lastUsedOrganizationalUnit,name,nasServer,netbiosName,smbMultiChannelSupported,smbProtocolVersions,smbcaSupported,workgroup",
1313
"response": "cifs_3.json"
1414
},
15+
{
16+
"url": "/api/instances/cifsServer/cifs_5?compact=True&fields=description,domain,fileInterfaces,health,id,instanceId,isStandalone,lastUsedOrganizationalUnit,name,nasServer,netbiosName,smbMultiChannelSupported,smbProtocolVersions,smbcaSupported,workgroup",
17+
"response": "cifs_5.json"
18+
},
1519
{
1620
"url": "/api/instances/cifsServer/cifs_7?compact=True&fields=description,domain,fileInterfaces,health,id,instanceId,isStandalone,lastUsedOrganizationalUnit,name,nasServer,netbiosName,smbMultiChannelSupported,smbProtocolVersions,smbcaSupported,workgroup",
1721
"response": "cifs_7.json"
@@ -113,6 +117,22 @@
113117
{
114118
"url": "/api/instances/cifsServer/cifs_10?compact=True",
115119
"response": "not_found.json"
120+
},
121+
{
122+
"url": "/api/instances/cifsServer/cifs_5/action/modify?compact=True",
123+
"body": {
124+
"netbiosName": "nas_5",
125+
"workgroup": "test_wg_5"
126+
},
127+
"response": "success.json"
128+
},
129+
{
130+
"url": "/api/instances/cifsServer/cifs_10/action/modify?compact=True",
131+
"body": {
132+
"netbiosName": "nas_10",
133+
"workgroup": "test_wg_10"
134+
},
135+
"response": "not_found.json"
116136
}
117137
]
118138
}

0 commit comments

Comments
 (0)