From c04d58b40af21284ddd265a5b5e7a19d4617f5d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20R=C3=B6hrich?= Date: Wed, 25 May 2022 15:13:05 +0200 Subject: [PATCH] feature: mixed disk drive layouts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provision mixed disk drive layouts when specifying `--num-disks` and `--disk-size` multiple times. fixes: #652 Signed-off-by: Moritz Röhrich --- sesdev/__init__.py | 8 ++++---- seslib/constant.py | 2 ++ seslib/deployment.py | 24 +++++++++++++++--------- seslib/settings.py | 8 ++++---- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/sesdev/__init__.py b/sesdev/__init__.py index 79a6f1cc..6cb2249d 100644 --- a/sesdev/__init__.py +++ b/sesdev/__init__.py @@ -152,9 +152,9 @@ def common_create_options(func): help='Number of virtual CPUs for the VMs'), click.option('--ram', default=None, type=int, help='Amount of RAM for each VM in gigabytes'), - click.option('--disk-size', default=None, type=int, + click.option('--disk-size', default=None, type=int, multiple=True, help='Size in gigabytes of storage disks (used by OSDs)'), - click.option('--num-disks', default=None, type=int, + click.option('--num-disks', default=None, type=int, multiple=True, help='Number of storage disks in OSD nodes'), click.option('--single-node/--no-single-node', default=False, help='Deploy a single node cluster. Overrides --roles'), @@ -478,13 +478,13 @@ def _gen_settings_dict( settings_dict['explicit_ram'] = False if num_disks is not None: - settings_dict['num_disks'] = num_disks + settings_dict['num_disks'] = [n for n in num_disks] settings_dict['explicit_num_disks'] = True else: settings_dict['explicit_num_disks'] = False if disk_size is not None: - settings_dict['disk_size'] = disk_size + settings_dict['disk_size'] = [s for s in disk_size] if bluestore is not None: if bluestore: diff --git a/seslib/constant.py b/seslib/constant.py index 223ddc4d..22638cd0 100644 --- a/seslib/constant.py +++ b/seslib/constant.py @@ -556,6 +556,8 @@ class Constant(): ZYPPER_PRIO_ELEVATED = 50 + DEFAULT_DISK_SIZE = 12 # in GiB + @classmethod def init_path_to_qa(cls, full_path_to_sesdev_executable): if full_path_to_sesdev_executable.startswith('/usr'): diff --git a/seslib/deployment.py b/seslib/deployment.py index 20791da8..a581621f 100644 --- a/seslib/deployment.py +++ b/seslib/deployment.py @@ -234,7 +234,7 @@ def __set_up_make_check(self): self.settings.override('single_node', True) self.settings.override('roles', Constant.ROLES_DEFAULT_BY_VERSION['makecheck']) if not self.settings.explicit_num_disks: - self.settings.override('num_disks', 0) + self.settings.override('num_disks', [0]) self.settings.override('explicit_num_disks', True) if not self.settings.explicit_ram: self.settings.override('ram', Constant.MAKECHECK_DEFAULT_RAM) @@ -283,7 +283,7 @@ def __maybe_adjust_num_disks(self): if self.settings.ssd and new_num_disks: new_num_disks += 1 if new_num_disks: - self.settings.override('num_disks', new_num_disks) + self.settings.override('num_disks', [new_num_disks]) @property def _dep_dir(self): @@ -423,8 +423,10 @@ def __generate_nodes(self): node.ram = 2 * 2**10 if self.settings.caasp_deploy_ses or self.settings.explicit_num_disks: if 'worker' in node_roles or single_node: - for _ in range(self.settings.num_disks): - node.storage_disks.append(Disk(self.settings.disk_size)) + for n in len(self.settings.num_disks): + for _ in range(self.settings.num_disks[n]): + node.storage_disks.append(Disk(self.settings.disk_size[n] + or Constant.DEFAULT_DISK_SIZE)) if self.settings.version in Constant.CORE_VERSIONS: if 'suma' in node_roles: @@ -433,12 +435,16 @@ def __generate_nodes(self): if self.settings.cluster_network: node.cluster_address = '{}{}'.format(self.settings.cluster_network, 200 + node_id) - for _ in range(self.settings.num_disks): - node.storage_disks.append(Disk(self.settings.disk_size)) + for i, n in enumerate(self.settings.num_disks): + for _ in range(n): + node.storage_disks.append(Disk(self.settings.disk_size[i] + or Constant.DEFAULT_DISK_SIZE)) elif self.settings.explicit_num_disks \ and not node.has_exactly_roles(['master', 'admin']): - for _ in range(self.settings.num_disks): - node.storage_disks.append(Disk(self.settings.disk_size)) + for i, n in enumerate(self.settings.num_disks): + for _ in range(n): + node.storage_disks.append(Disk(self.settings.disk_size[i] + or Constant.DEFAULT_DISK_SIZE)) if self.has_suma(): # if suma is deployed, we need to add client-tools to all nodes node.add_custom_repo(ZypperRepo( @@ -651,7 +657,7 @@ def _generate_vagrantfile(self): 'deepsea_need_stage_4': bool(self.node_counts["nfs"] or self.node_counts["igw"] or self.node_counts["mds"] or self.node_counts["rgw"] or self.node_counts["openattic"]), - 'total_osds': self.settings.num_disks * self.node_counts["storage"], + 'total_osds': sum(self.settings.num_disks) * self.node_counts["storage"], 'encrypted_osds': self.settings.encrypted_osds, 'filestore_osds': self.settings.filestore_osds, 'scc_username': self.settings.scc_username, diff --git a/seslib/settings.py b/seslib/settings.py index ad5b68c5..fd25a548 100644 --- a/seslib/settings.py +++ b/seslib/settings.py @@ -76,9 +76,9 @@ 'default': Constant.DEVELOPER_TOOLS_REPOS, }, 'disk_size': { - 'type': int, + 'type': list, 'help': 'Storage disk size in gigabytes', - 'default': 8, + 'default': [Constant.DEFAULT_DISK_SIZE], }, 'domain': { 'type': str, @@ -255,9 +255,9 @@ 'default': False, }, 'num_disks': { - 'type': int, + 'type': list, 'help': 'Number of additional disks in storage nodes', - 'default': 2, + 'default': [2], }, 'os': { 'type': str,