cephadm/smb: convert config object to use a dataclass

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>
This commit is contained in:
John Mulligan 2024-10-29 16:19:13 -04:00
parent 13f4266694
commit 2b30c8e895

View 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)