]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephadm/smb: convert config object to use a dataclass 60549/head
authorJohn Mulligan <jmulligan@redhat.com>
Tue, 29 Oct 2024 20:19:13 +0000 (16:19 -0400)
committerJohn Mulligan <jmulligan@redhat.com>
Tue, 29 Oct 2024 21:37:16 +0000 (17:37 -0400)
While working on the smb.py file I began to be annoyed at the Config
class and the need to repeat myself. Now that cephadm is not expected to
run on python versions older than 3.7 I think it's safe to convert
Config to use a dataclass.

While making the change to a dataclass I also chose to make it a frozen
dataclass to help eliminate any future bugs wrt mutating the config object.

Signed-off-by: John Mulligan <jmulligan@redhat.com>
src/cephadm/cephadmlib/daemons/smb.py

index 82f886e72ecd4d1c6f28dc25bf0680910ec2ff53..02f5c4760bf59c5cffa0b0c3f3c182a65d01ff9b 100644 (file)
@@ -1,3 +1,4 @@
+import dataclasses
 import enum
 import json
 import logging
@@ -67,83 +68,32 @@ class ClusterPublicIP(NamedTuple):
         return cls(address, destinations)
 
 
+@dataclasses.dataclass(frozen=True)
 class Config:
     identity: DaemonIdentity
     instance_id: str
     source_config: str
-    samba_debug_level: int
-    ctdb_log_level: str
-    debug_delay: int
     domain_member: bool
     clustered: bool
-    join_sources: List[str]
-    user_sources: List[str]
-    custom_dns: List[str]
-    smb_port: int
-    ceph_config_entity: str
-    vhostname: str
-    metrics_image: str
-    metrics_port: int
+    samba_debug_level: int = 0
+    ctdb_log_level: str = ''
+    debug_delay: int = 0
+    join_sources: List[str] = dataclasses.field(default_factory=list)
+    user_sources: List[str] = dataclasses.field(default_factory=list)
+    custom_dns: List[str] = dataclasses.field(default_factory=list)
+    smb_port: int = 0
+    ceph_config_entity: str = 'client.admin'
+    vhostname: str = ''
+    metrics_image: str = ''
+    metrics_port: int = 0
     # clustering related values
-    rank: int
-    rank_generation: int
-    cluster_meta_uri: str
-    cluster_lock_uri: str
-
-    def __init__(
-        self,
-        *,
-        identity: DaemonIdentity,
-        instance_id: str,
-        source_config: str,
-        domain_member: bool,
-        clustered: bool,
-        samba_debug_level: int = 0,
-        ctdb_log_level: str = '',
-        debug_delay: int = 0,
-        join_sources: Optional[List[str]] = None,
-        user_sources: Optional[List[str]] = None,
-        custom_dns: Optional[List[str]] = None,
-        smb_port: int = 0,
-        ceph_config_entity: str = 'client.admin',
-        vhostname: str = '',
-        metrics_image: str = '',
-        metrics_port: int = 0,
-        rank: int = -1,
-        rank_generation: int = -1,
-        cluster_meta_uri: str = '',
-        cluster_lock_uri: str = '',
-        cluster_public_addrs: Optional[List[ClusterPublicIP]] = None,
-    ) -> None:
-        self.identity = identity
-        self.instance_id = instance_id
-        self.source_config = source_config
-        self.domain_member = domain_member
-        self.clustered = clustered
-        self.samba_debug_level = samba_debug_level
-        self.ctdb_log_level = ctdb_log_level
-        self.debug_delay = debug_delay
-        self.join_sources = join_sources or []
-        self.user_sources = user_sources or []
-        self.custom_dns = custom_dns or []
-        self.smb_port = smb_port
-        self.ceph_config_entity = ceph_config_entity
-        self.vhostname = vhostname
-        self.metrics_image = metrics_image
-        self.metrics_port = metrics_port
-        self.rank = rank
-        self.rank_generation = rank_generation
-        self.cluster_meta_uri = cluster_meta_uri
-        self.cluster_lock_uri = cluster_lock_uri
-        self.cluster_public_addrs = cluster_public_addrs
-
-    def __str__(self) -> str:
-        return (
-            f'SMB Config[id={self.instance_id},'
-            f' source_config={self.source_config},'
-            f' domain_member={self.domain_member},'
-            f' clustered={self.clustered}]'
-        )
+    rank: int = -1
+    rank_generation: int = -1
+    cluster_meta_uri: str = ''
+    cluster_lock_uri: str = ''
+    cluster_public_addrs: List[ClusterPublicIP] = dataclasses.field(
+        default_factory=list
+    )
 
     def config_uris(self) -> List[str]:
         uris = [self.source_config]
@@ -432,7 +382,7 @@ class SMB(ContainerDaemonForm):
         self._raw_configs: Dict[str, Any] = context_getters.fetch_configs(ctx)
         self._config_keyring = context_getters.get_config_and_keyring(ctx)
         self._cached_layout: Optional[ContainerLayout] = None
-        self._rank_info = context_getters.fetch_rank_info(ctx)
+        self._rank_info = context_getters.fetch_rank_info(ctx) or (-1, -1)
         self.smb_port = 445
         self.metrics_port = 9922
         self._network_mapper = _NetworkMapper(ctx)
@@ -502,6 +452,7 @@ class SMB(ContainerDaemonForm):
             # cache the cephadm networks->devices mapping for later
             self._network_mapper.load()
 
+        rank, rank_gen = self._rank_info
         self._instance_cfg = Config(
             identity=self._identity,
             instance_id=instance_id,
@@ -516,15 +467,12 @@ class SMB(ContainerDaemonForm):
             vhostname=vhostname,
             metrics_image=metrics_image,
             metrics_port=metrics_port,
+            rank=rank,
+            rank_generation=rank_gen,
             cluster_meta_uri=cluster_meta_uri,
             cluster_lock_uri=cluster_lock_uri,
             cluster_public_addrs=_public_addrs,
         )
-        if self._rank_info:
-            (
-                self._instance_cfg.rank,
-                self._instance_cfg.rank_generation,
-            ) = self._rank_info
         self._files = files
         logger.debug('SMB Instance Config: %s', self._instance_cfg)
         logger.debug('Configured files: %s', self._files)