Skip to content

Commit 4ef7a48

Browse files
mgr/smb: add a cluster resource field to manage clustering
Add a new `clustering` field to the smb cluster resource. This field can be used to select either automatic clustering with ctdb, or disable it, or require it. The default is automatic and is based on the count value in the placement spec. A count of 1 disables clustering and any other value it is enabled. Signed-off-by: John Mulligan <[email protected]>
1 parent 7272e5b commit 4ef7a48

File tree

5 files changed

+78
-16
lines changed

5 files changed

+78
-16
lines changed

src/pybind/mgr/smb/enums.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,9 @@ def expand(self) -> 'LoginAccess':
7777
if self == self.READ_WRITE_SHORT:
7878
return LoginAccess(self.READ_WRITE)
7979
return self
80+
81+
82+
class SMBClustering(_StrEnum):
83+
DEFAULT = 'default'
84+
ALWAYS = 'always'
85+
NEVER = 'never'

src/pybind/mgr/smb/module.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@
1717
sqlite_store,
1818
utils,
1919
)
20-
from .enums import AuthMode, JoinSourceType, UserGroupSourceType
20+
from .enums import (
21+
AuthMode,
22+
JoinSourceType,
23+
SMBClustering,
24+
UserGroupSourceType,
25+
)
2126
from .proto import AccessAuthorizer, ConfigStore, Simplified
2227

2328
if TYPE_CHECKING:
@@ -151,6 +156,7 @@ def cluster_create(
151156
define_user_pass: Optional[List[str]] = None,
152157
custom_dns: Optional[List[str]] = None,
153158
placement: Optional[str] = None,
159+
clustering: Optional[SMBClustering] = None,
154160
) -> results.Result:
155161
"""Create an smb cluster"""
156162
domain_settings = None
@@ -245,6 +251,7 @@ def cluster_create(
245251
user_group_settings=user_group_settings,
246252
custom_dns=custom_dns,
247253
placement=pspec,
254+
clustering=clustering,
248255
)
249256
to_apply.append(cluster)
250257
return self._handler.apply(to_apply, create_only=True).squash(cluster)

src/pybind/mgr/smb/resources.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
JoinSourceType,
1717
LoginAccess,
1818
LoginCategory,
19+
SMBClustering,
1920
UserGroupSourceType,
2021
)
2122
from .proto import Self, Simplified
@@ -358,6 +359,8 @@ class Cluster(_RBase):
358359
custom_smb_global_options: Optional[Dict[str, str]] = None
359360
# embedded orchestration placement spec
360361
placement: Optional[WrappedPlacementSpec] = None
362+
# control if the cluster is really a cluster
363+
clustering: Optional[SMBClustering] = None
361364

362365
def validate(self) -> None:
363366
if not self.cluster_id:
@@ -395,6 +398,23 @@ def _customize_resource(rc: resourcelib.Resource) -> resourcelib.Resource:
395398
def cleaned_custom_smb_global_options(self) -> Optional[Dict[str, str]]:
396399
return validation.clean_custom_options(self.custom_smb_global_options)
397400

401+
@property
402+
def clustering_mode(self) -> SMBClustering:
403+
return self.clustering if self.clustering else SMBClustering.DEFAULT
404+
405+
def is_clustered(self) -> bool:
406+
"""Return true if smbd instance should use (CTDB) clustering."""
407+
if self.clustering_mode == SMBClustering.ALWAYS:
408+
return True
409+
if self.clustering_mode == SMBClustering.NEVER:
410+
return False
411+
# do clustering automatically, based on the placement spec's count value
412+
count = 0
413+
if self.placement and self.placement.count:
414+
count = self.placement.count
415+
# clustering enabled unless we're deploying a single instance "cluster"
416+
return count != 1
417+
398418

399419
@resourcelib.resource('ceph.smb.join.auth')
400420
class JoinAuth(_RBase):

src/pybind/mgr/smb/tests/test_handler.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
import smb
44

55

6+
def _cluster(**kwargs):
7+
if 'clustering' not in kwargs:
8+
kwargs['clustering'] = smb.enums.SMBClustering.NEVER
9+
return smb.resources.Cluster(**kwargs)
10+
11+
612
@pytest.fixture
713
def thandler():
814
ext_store = smb.config_store.MemConfigStore()
@@ -26,7 +32,7 @@ def test_shares_empty(thandler):
2632

2733

2834
def test_internal_apply_cluster(thandler):
29-
cluster = smb.resources.Cluster(
35+
cluster = _cluster(
3036
cluster_id='foo',
3137
auth_mode=smb.enums.AuthMode.USER,
3238
user_group_settings=[
@@ -41,7 +47,7 @@ def test_internal_apply_cluster(thandler):
4147

4248

4349
def test_cluster_add(thandler):
44-
cluster = smb.resources.Cluster(
50+
cluster = _cluster(
4551
cluster_id='foo',
4652
auth_mode=smb.enums.AuthMode.USER,
4753
user_group_settings=[
@@ -59,7 +65,7 @@ def test_cluster_add(thandler):
5965

6066

6167
def test_internal_apply_cluster_and_share(thandler):
62-
cluster = smb.resources.Cluster(
68+
cluster = _cluster(
6369
cluster_id='foo',
6470
auth_mode=smb.enums.AuthMode.USER,
6571
user_group_settings=[
@@ -95,6 +101,7 @@ def test_internal_apply_remove_cluster(thandler):
95101
'cluster_id': 'foo',
96102
'auth_mode': 'user',
97103
'intent': 'present',
104+
'clustering': 'never',
98105
'user_group_settings': [
99106
{
100107
'source_type': 'empty',
@@ -126,6 +133,7 @@ def test_internal_apply_remove_shares(thandler):
126133
'cluster_id': 'foo',
127134
'auth_mode': 'user',
128135
'intent': 'present',
136+
'clustering': 'never',
129137
'user_group_settings': [
130138
{
131139
'source_type': 'empty',
@@ -206,6 +214,7 @@ def test_internal_apply_add_joinauth(thandler):
206214
'cluster_id': 'foo',
207215
'auth_mode': 'user',
208216
'intent': 'present',
217+
'clustering': 'never',
209218
'user_group_settings': [
210219
{
211220
'source_type': 'empty',
@@ -237,6 +246,7 @@ def test_internal_apply_add_usergroups(thandler):
237246
'cluster_id': 'foo',
238247
'auth_mode': 'user',
239248
'intent': 'present',
249+
'clustering': 'never',
240250
'user_group_settings': [
241251
{
242252
'source_type': 'empty',
@@ -583,7 +593,7 @@ def test_apply_full_cluster_create(thandler):
583593
password='Passw0rd',
584594
),
585595
),
586-
smb.resources.Cluster(
596+
_cluster(
587597
cluster_id='mycluster1',
588598
auth_mode=smb.enums.AuthMode.ACTIVE_DIRECTORY,
589599
domain_settings=smb.resources.DomainSettings(
@@ -708,7 +718,7 @@ def test_apply_update_password(thandler):
708718
def test_apply_add_second_cluster(thandler):
709719
test_apply_full_cluster_create(thandler)
710720
to_apply = [
711-
smb.resources.Cluster(
721+
_cluster(
712722
cluster_id='coolcluster',
713723
auth_mode=smb.enums.AuthMode.ACTIVE_DIRECTORY,
714724
domain_settings=smb.resources.DomainSettings(
@@ -880,7 +890,7 @@ def remove_smb_service(self, service_name):
880890
groups=[],
881891
),
882892
),
883-
smb.resources.Cluster(
893+
_cluster(
884894
cluster_id='mycluster2',
885895
auth_mode=smb.enums.AuthMode.USER,
886896
user_group_settings=[
@@ -890,7 +900,7 @@ def remove_smb_service(self, service_name):
890900
),
891901
],
892902
),
893-
smb.resources.Cluster(
903+
_cluster(
894904
cluster_id='mycluster3',
895905
auth_mode=smb.enums.AuthMode.USER,
896906
user_group_settings=[
@@ -1166,7 +1176,7 @@ def test_apply_cluster_linked_auth(thandler):
11661176
),
11671177
linked_to_cluster='mycluster1',
11681178
),
1169-
smb.resources.Cluster(
1179+
_cluster(
11701180
cluster_id='mycluster1',
11711181
auth_mode=smb.enums.AuthMode.ACTIVE_DIRECTORY,
11721182
domain_settings=smb.resources.DomainSettings(
@@ -1228,7 +1238,7 @@ def test_apply_cluster_bad_linked_auth(thandler):
12281238
),
12291239
linked_to_cluster='mycluster2',
12301240
),
1231-
smb.resources.Cluster(
1241+
_cluster(
12321242
cluster_id='mycluster1',
12331243
auth_mode=smb.enums.AuthMode.ACTIVE_DIRECTORY,
12341244
domain_settings=smb.resources.DomainSettings(
@@ -1261,7 +1271,7 @@ def test_apply_cluster_bad_linked_ug(thandler):
12611271
),
12621272
linked_to_cluster='mycluster2',
12631273
),
1264-
smb.resources.Cluster(
1274+
_cluster(
12651275
cluster_id='mycluster1',
12661276
auth_mode=smb.enums.AuthMode.USER,
12671277
user_group_settings=[
@@ -1287,7 +1297,7 @@ def test_apply_with_create_only(thandler):
12871297
test_apply_full_cluster_create(thandler)
12881298

12891299
to_apply = [
1290-
smb.resources.Cluster(
1300+
_cluster(
12911301
cluster_id='mycluster1',
12921302
auth_mode=smb.enums.AuthMode.ACTIVE_DIRECTORY,
12931303
domain_settings=smb.resources.DomainSettings(
@@ -1635,6 +1645,7 @@ def test_share_name_in_use(thandler, params):
16351645
'cluster_id': 'c1',
16361646
'auth_mode': 'user',
16371647
'intent': 'present',
1648+
'clustering': 'never',
16381649
'user_group_settings': [
16391650
{
16401651
'source_type': 'resource',
@@ -1647,6 +1658,7 @@ def test_share_name_in_use(thandler, params):
16471658
'cluster_id': 'c2',
16481659
'auth_mode': 'user',
16491660
'intent': 'present',
1661+
'clustering': 'never',
16501662
'user_group_settings': [
16511663
{
16521664
'source_type': 'resource',

src/pybind/mgr/smb/tests/test_smb.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
import smb
66

77

8+
def _cluster(**kwargs):
9+
if 'clustering' not in kwargs:
10+
kwargs['clustering'] = smb.enums.SMBClustering.NEVER
11+
return smb.resources.Cluster(**kwargs)
12+
13+
814
@pytest.fixture
915
def tmodule():
1016
internal_store = smb.config_store.MemConfigStore()
@@ -34,7 +40,7 @@ def test_share_ls_empty(tmodule):
3440

3541

3642
def test_internal_apply_cluster(tmodule):
37-
cluster = smb.resources.Cluster(
43+
cluster = _cluster(
3844
cluster_id='foo',
3945
auth_mode=smb.enums.AuthMode.USER,
4046
user_group_settings=[
@@ -49,7 +55,7 @@ def test_internal_apply_cluster(tmodule):
4955

5056

5157
def test_cluster_add_cluster_ls(tmodule):
52-
cluster = smb.resources.Cluster(
58+
cluster = _cluster(
5359
cluster_id='foo',
5460
auth_mode=smb.enums.AuthMode.USER,
5561
user_group_settings=[
@@ -67,7 +73,7 @@ def test_cluster_add_cluster_ls(tmodule):
6773

6874

6975
def test_internal_apply_cluster_and_share(tmodule):
70-
cluster = smb.resources.Cluster(
76+
cluster = _cluster(
7177
cluster_id='foo',
7278
auth_mode=smb.enums.AuthMode.USER,
7379
user_group_settings=[
@@ -134,6 +140,7 @@ def test_internal_apply_remove_shares(tmodule):
134140
'cluster_id': 'foo',
135141
'auth_mode': 'user',
136142
'intent': 'present',
143+
'clustering': 'never',
137144
'user_group_settings': [
138145
{
139146
'source_type': 'empty',
@@ -214,6 +221,7 @@ def test_internal_apply_add_joinauth(tmodule):
214221
'cluster_id': 'foo',
215222
'auth_mode': 'user',
216223
'intent': 'present',
224+
'clustering': 'never',
217225
'user_group_settings': [
218226
{
219227
'source_type': 'empty',
@@ -245,6 +253,7 @@ def test_internal_apply_add_usergroups(tmodule):
245253
'cluster_id': 'foo',
246254
'auth_mode': 'user',
247255
'intent': 'present',
256+
'clustering': 'never',
248257
'user_group_settings': [
249258
{
250259
'source_type': 'empty',
@@ -276,6 +285,7 @@ def _example_cfg_1(tmodule):
276285
'cluster_id': 'foo',
277286
'auth_mode': 'active-directory',
278287
'intent': 'present',
288+
'clustering': 'never',
279289
'domain_settings': {
280290
'realm': 'dom1.example.com',
281291
'join_sources': [
@@ -473,6 +483,7 @@ def test_cluster_create_ad1(tmodule):
473483
smb.enums.AuthMode.ACTIVE_DIRECTORY,
474484
domain_realm='fizzle.example.net',
475485
domain_join_user_pass=['Administrator%Passw0rd'],
486+
clustering='never',
476487
)
477488
assert result.success
478489
assert result.status['state'] == 'created'
@@ -519,6 +530,7 @@ def test_cluster_create_ad2(tmodule):
519530
smb.enums.AuthMode.ACTIVE_DIRECTORY,
520531
domain_realm='sizzle.example.net',
521532
domain_join_ref=['jaad2'],
533+
clustering='never',
522534
)
523535
assert result.success
524536
assert result.status['state'] == 'created'
@@ -549,6 +561,7 @@ def test_cluster_create_user1(tmodule):
549561
'dizzle',
550562
smb.enums.AuthMode.USER,
551563
user_group_ref=['ug1'],
564+
clustering='never',
552565
)
553566
assert result.success
554567
assert result.status['state'] == 'created'
@@ -563,6 +576,7 @@ def test_cluster_create_user2(tmodule):
563576
'dizzle',
564577
smb.enums.AuthMode.USER,
565578
define_user_pass=['alice%123letmein', 'bob%1n0wh4t1t15'],
579+
clustering='never',
566580
)
567581
assert result.success
568582
assert result.status['state'] == 'created'
@@ -583,6 +597,7 @@ def test_cluster_create_badpass(tmodule):
583597
smb.enums.AuthMode.ACTIVE_DIRECTORY,
584598
domain_realm='fizzle.example.net',
585599
domain_join_user_pass=['Administrator'],
600+
clustering='never',
586601
)
587602

588603

@@ -641,7 +656,8 @@ def test_cmd_show_resource_json(tmodule):
641656
"ref": "foo"
642657
}
643658
]
644-
}
659+
},
660+
"clustering": "never"
645661
}
646662
""".strip()
647663
)
@@ -666,6 +682,7 @@ def test_cmd_show_resource_yaml(tmodule):
666682
join_sources:
667683
- source_type: resource
668684
ref: foo
685+
clustering: never
669686
""".strip()
670687
)
671688

0 commit comments

Comments
 (0)