diff --git a/cluster/examples/kubernetes/ceph/create-external-cluster-resources.py b/cluster/examples/kubernetes/ceph/create-external-cluster-resources.py index 465ccab2218bd..1fe04b1508a9f 100644 --- a/cluster/examples/kubernetes/ceph/create-external-cluster-resources.py +++ b/cluster/examples/kubernetes/ceph/create-external-cluster-resources.py @@ -193,6 +193,8 @@ def gen_arg_parser(cls, args_to_parse=None): help="Ceph Manager prometheus exporter endpoints (comma separated list of entries of active and standby mgrs)") output_group.add_argument("--monitoring-endpoint-port", default="", required=False, help="Ceph Manager prometheus exporter port") + output_group.add_argument("---rbd-metadata-ec-pool-name", default="", required=False, + help="Provides the name of erasure coded RBD metadata pool") upgrade_group = argP.add_argument_group('upgrade') upgrade_group.add_argument("--upgrade", action='store_true', default=False, @@ -205,6 +207,41 @@ def gen_arg_parser(cls, args_to_parse=None): args_to_parse = sys.argv[1:] return argP.parse_args(args_to_parse) + def validate_rgw_metadata_ec_pool_name(self): + if self._arg_parser.rbd_metadata_ec_pool_name: + rbd_metadata_ec_pool_name = self._arg_parser.rbd_metadata_ec_pool_name + rbd_pool_name = self._arg_parser.rbd_data_pool_name + + if rbd_pool_name == "" or rbd_metadata_ec_pool_name == "": + raise ExecutionFailureException( + "Flag '--rbd-data-pool-name' or '--rbd-metadata-ec-pool-name' should not be empty" + ) + + cmd_json = { + "prefix": "osd pool ls detail" + } + ret_val, json_out, err_msg = self._common_cmd_json_gen(cmd_json) + if ret_val != 0 or len(json_out) == 0: + raise ExecutionFailureException( + "'osd pool ls detail' command failed.\n" + + "Error: {}".format(err_msg if ret_val != + 0 else self.EMPTY_OUTPUT_LIST) + ) + metadata_pool_exist, pools_exist = False, False + for keys in json_out: + if rbd_metadata_ec_pool_name in keys['pool_name']: + metadata_pool_exist = True + if keys['erasure_code_profile'] and keys['pool_name'] == rbd_pool_name: + pool_exist = True + + if not metadata_pool_exist: + raise ExecutionFailureException( + "Provided rbd_ec_metadata_pool name, {}, does not exists".format(rbd_metadata_ec_pool_name)) + if not pool_exist: + raise ExecutionFailureException( + "Provided rbd_data_pool name, {}, does not exists".format(rbd_pool_name)) + return json_out[rbd_metadata_ec_pool_name] + def validate_rgw_endpoint_tls_cert(self): if self._arg_parser.rgw_tls_cert_path: with open(self._arg_parser.rgw_tls_cert_path, encoding='utf8') as f: @@ -458,7 +495,7 @@ def create_cephCSIKeyring_cephFSProvisioner(self): if self._arg_parser.restricted_auth_permission: if metadata_pool == "": raise ExecutionFailureException( - "'cephfs_metadata_pool_name' not found, please set the '--cephfs-metadata-pool-name' flag") + "'cephfs_metadata_pool_name' not found, please set the '--cephfs-metadata-pool-name' flag") cmd_json = {"prefix": "auth get-or-create", "entity": entity, "caps": ["mon", "allow r", "mgr", "allow rw", @@ -492,9 +529,10 @@ def create_cephCSIKeyring_cephFSNode(self): cmd_json = {"prefix": "auth get-or-create", "entity": entity, "caps": ["mon", "allow r", - "mgr", "allow rw", - "osd", "allow rw tag cephfs data={}".format(data_pool), - "mds", "allow rw"], + "mgr", "allow rw", + "osd", "allow rw tag cephfs data={}".format( + data_pool), + "mds", "allow rw"], "format": "json"} else: cmd_json = {"prefix": "auth get-or-create", @@ -518,7 +556,7 @@ def create_cephCSIKeyring_RBDProvisioner(self): entity = "client.csi-rbd-provisioner" if cluster_name: entity = "client.csi-rbd-provisioner-{}".format(cluster_name) - cmd_json={} + cmd_json = {} if self._arg_parser.restricted_auth_permission: if rbd_pool_name == "": raise ExecutionFailureException( @@ -597,8 +635,10 @@ def get_cephfs_data_pool_details(self): return if matching_json_out: - self._arg_parser.cephfs_filesystem_name = str(matching_json_out['name']) - self._arg_parser.cephfs_metadata_pool_name = str(matching_json_out['metadata_pool']) + self._arg_parser.cephfs_filesystem_name = str( + matching_json_out['name']) + self._arg_parser.cephfs_metadata_pool_name = str( + matching_json_out['metadata_pool']) if type(matching_json_out['data_pools']) == list: # if the user has already provided data-pool-name, @@ -635,7 +675,7 @@ def create_cephCSIKeyring_RBDNode(self): entity = "client.csi-rbd-node" if cluster_name: entity = "client.csi-rbd-node-{}".format(cluster_name) - cmd_json={} + cmd_json = {} if self._arg_parser.restricted_auth_permission: if rbd_pool_name == "": raise ExecutionFailureException( @@ -751,13 +791,15 @@ def _gen_output_map(self): self.out_map['CSI_CEPHFS_PROVISIONER_SECRET'] = '' # create CephFS node and provisioner keyring only when MDS exists if self.out_map['CEPHFS_FS_NAME'] and self.out_map['CEPHFS_POOL_NAME']: - self.out_map['CSI_CEPHFS_NODE_SECRET'] = self.create_cephCSIKeyring_cephFSNode() + self.out_map['CSI_CEPHFS_NODE_SECRET'] = self.create_cephCSIKeyring_cephFSNode( + ) self.out_map['CSI_CEPHFS_PROVISIONER_SECRET'] = self.create_cephCSIKeyring_cephFSProvisioner() self.out_map['RGW_ENDPOINT'] = self._arg_parser.rgw_endpoint self.out_map['RGW_TLS_CERT'] = '' self.out_map['MONITORING_ENDPOINT'], \ self.out_map['MONITORING_ENDPOINT_PORT'] = self.get_active_and_standby_mgrs() self.out_map['RBD_POOL_NAME'] = self._arg_parser.rbd_data_pool_name + self.out_map['RBD_METADATA_EC_POOL_NAME'] = self.validate_rgw_metadata_ec_pool_name() self.out_map['RGW_POOL_PREFIX'] = self._arg_parser.rgw_pool_prefix if self._arg_parser.rgw_endpoint: self.out_map['ACCESS_KEY'], self.out_map['SECRET_KEY'] = self.create_rgw_admin_ops_user() @@ -811,13 +853,7 @@ def gen_json_out(self): "userKey": self.out_map['CSI_RBD_NODE_SECRET_SECRET'] } }, - { - "name": "ceph-rbd", - "kind": "StorageClass", - "data": { - "pool": self.out_map['RBD_POOL_NAME'] - } - }, + { "name": "monitoring-endpoint", "kind": "CephCluster", @@ -828,6 +864,26 @@ def gen_json_out(self): } ] + if self.out.map['RBD_METADATA_EC_POOL_NAME']: + json_out.append({ + "name": "ceph-rbd", + "kind": "StorageClass", + "data": { + "dataPool": self.out_map['RBD_POOL_NAME'], + "pool": self.out_map['RBD_METADATA_EC_POOL_NAME'] + }, + }) + else: + json_out.append({ + { + "name": "ceph-rbd", + "kind": "StorageClass", + "data": { + "pool": self.out_map['RBD_POOL_NAME'] + } + }, + }) + # if 'ROOK_EXTERNAL_DASHBOARD_LINK' exists, then only add 'rook-ceph-dashboard-link' Secret if self.out_map['ROOK_EXTERNAL_DASHBOARD_LINK']: json_out.append({ @@ -1035,14 +1091,16 @@ def test_method_main_output(self): def test_method_create_cephCSIKeyring_cephFSProvisioner(self): csiKeyring = self.rjObj.create_cephCSIKeyring_cephFSProvisioner() - print("cephCSIKeyring without restricting it to a metadata pool. {}".format(csiKeyring)) + print("cephCSIKeyring without restricting it to a metadata pool. {}".format( + csiKeyring)) self.rjObj._arg_parser.restricted_auth_permission = True self.rjObj._arg_parser.cephfs_metadata_pool_name = "myfs-metadata" csiKeyring = self.rjObj.create_cephCSIKeyring_cephFSProvisioner() print("cephCSIKeyring for a specific metadata pool. {}".format(csiKeyring)) self.rjObj._arg_parser.cluster_name = "openshift-storage" csiKeyring = self.rjObj.create_cephCSIKeyring_cephFSProvisioner() - print("cephCSIKeyring for a specific metadata pool and cluster. {}".format(csiKeyring)) + print("cephCSIKeyring for a specific metadata pool and cluster. {}".format( + csiKeyring)) def test_non_zero_return_and_error(self): self.rjObj.cluster.return_val = 1