From 6df7648cd87c9342d62009f10e2c68d1652fce6f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 16 Feb 2024 22:27:39 +0000 Subject: [PATCH] Include external ceph import script Signed-off-by: Tim Olow --- scripts/import-external-cluster.sh | 353 +++++++++++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100755 scripts/import-external-cluster.sh diff --git a/scripts/import-external-cluster.sh b/scripts/import-external-cluster.sh new file mode 100755 index 000000000..802ad1549 --- /dev/null +++ b/scripts/import-external-cluster.sh @@ -0,0 +1,353 @@ +#!/usr/bin/env -S bash +set -e + +############## +# VARIABLES # +############# +NAMESPACE=${NAMESPACE:="rook-ceph-external"} +MON_SECRET_NAME=rook-ceph-mon +RGW_ADMIN_OPS_USER_SECRET_NAME=rgw-admin-ops-user +MON_SECRET_CLUSTER_NAME_KEYNAME=cluster-name +MON_SECRET_FSID_KEYNAME=fsid +MON_SECRET_ADMIN_KEYRING_KEYNAME=admin-secret +MON_SECRET_MON_KEYRING_KEYNAME=mon-secret +MON_SECRET_CEPH_USERNAME_KEYNAME=ceph-username +MON_SECRET_CEPH_SECRET_KEYNAME=ceph-secret +MON_ENDPOINT_CONFIGMAP_NAME=rook-ceph-mon-endpoints +ROOK_EXTERNAL_CLUSTER_NAME=$NAMESPACE +ROOK_RBD_FEATURES=${ROOK_RBD_FEATURES:-"layering"} +ROOK_EXTERNAL_MAX_MON_ID=2 +ROOK_EXTERNAL_MAPPING={} +RBD_STORAGE_CLASS_NAME=general +CEPHFS_STORAGE_CLASS_NAME=general-multi-attach +ROOK_EXTERNAL_MONITOR_SECRET=mon-secret +OPERATOR_NAMESPACE=rook-ceph # default set to rook-ceph +CSI_DRIVER_NAME_PREFIX=${CSI_DRIVER_NAME_PREFIX:-$OPERATOR_NAMESPACE} +RBD_PROVISIONER=$CSI_DRIVER_NAME_PREFIX".rbd.csi.ceph.com" # csi-provisioner-name +CEPHFS_PROVISIONER=$CSI_DRIVER_NAME_PREFIX".cephfs.csi.ceph.com" # csi-provisioner-name +CLUSTER_ID_RBD=$NAMESPACE +CLUSTER_ID_CEPHFS=$NAMESPACE +: "${ROOK_EXTERNAL_ADMIN_SECRET:=admin-secret}" + +############# +# FUNCTIONS # +############# + +function checkEnvVars() { + if [ -z "$NAMESPACE" ]; then + echo "Please populate the environment variable NAMESPACE" + exit 1 + fi + if [ -z "$ROOK_RBD_FEATURES" ] || [[ ! "$ROOK_RBD_FEATURES" =~ .*"layering".* ]]; then + echo "Please populate the environment variable ROOK_RBD_FEATURES" + echo "For a kernel earlier than 5.4 use a value of 'layering'; for 5.4 or later" + echo "use 'layering,fast-diff,object-map,deep-flatten,exclusive-lock'" + exit 1 + fi + if [ -z "$ROOK_EXTERNAL_FSID" ]; then + echo "Please populate the environment variable ROOK_EXTERNAL_FSID" + exit 1 + fi + if [ -z "$ROOK_EXTERNAL_CEPH_MON_DATA" ]; then + echo "Please populate the environment variable ROOK_EXTERNAL_CEPH_MON_DATA" + exit 1 + fi + if [[ "$ROOK_EXTERNAL_ADMIN_SECRET" == "admin-secret" ]]; then + if [ -z "$ROOK_EXTERNAL_USER_SECRET" ]; then + echo "Please populate the environment variable ROOK_EXTERNAL_USER_SECRET" + exit 1 + fi + if [ -z "$ROOK_EXTERNAL_USERNAME" ]; then + echo "Please populate the environment variable ROOK_EXTERNAL_USERNAME" + exit 1 + fi + fi + if [[ "$ROOK_EXTERNAL_ADMIN_SECRET" != "admin-secret" ]] && [ -n "$ROOK_EXTERNAL_USER_SECRET" ]; then + echo "Providing both ROOK_EXTERNAL_ADMIN_SECRET and ROOK_EXTERNAL_USER_SECRET is not supported, choose one only." + exit 1 + fi +} + +function createClusterNamespace() { + if ! kubectl get namespace "$NAMESPACE" &>/dev/null; then + kubectl \ + create \ + namespace \ + "$NAMESPACE" + else + echo "cluster namespace $NAMESPACE already exists" + fi +} + +function createRadosNamespaceCR() { + if ! kubectl -n "$NAMESPACE" get CephBlockPoolRadosNamespace $RADOS_NAMESPACE &>/dev/null; then + cat </dev/null; then + cat </dev/null; then + kubectl -n "$NAMESPACE" \ + create \ + secret \ + generic \ + --type="kubernetes.io/rook" \ + "$MON_SECRET_NAME" \ + --from-literal="$MON_SECRET_CLUSTER_NAME_KEYNAME"="$ROOK_EXTERNAL_CLUSTER_NAME" \ + --from-literal="$MON_SECRET_FSID_KEYNAME"="$ROOK_EXTERNAL_FSID" \ + --from-literal="$MON_SECRET_ADMIN_KEYRING_KEYNAME"="$ROOK_EXTERNAL_ADMIN_SECRET" \ + --from-literal="$MON_SECRET_MON_KEYRING_KEYNAME"="$ROOK_EXTERNAL_MONITOR_SECRET" \ + --from-literal="$MON_SECRET_CEPH_USERNAME_KEYNAME"="$ROOK_EXTERNAL_USERNAME" \ + --from-literal="$MON_SECRET_CEPH_SECRET_KEYNAME"="$ROOK_EXTERNAL_USER_SECRET" + else + echo "secret $MON_SECRET_NAME already exists" + fi +} + +function importConfigMap() { + if ! kubectl -n "$NAMESPACE" get configmap "$MON_ENDPOINT_CONFIGMAP_NAME" &>/dev/null; then + kubectl -n "$NAMESPACE" \ + create \ + configmap \ + "$MON_ENDPOINT_CONFIGMAP_NAME" \ + --from-literal=data="$ROOK_EXTERNAL_CEPH_MON_DATA" \ + --from-literal=mapping="$ROOK_EXTERNAL_MAPPING" \ + --from-literal=maxMonId="$ROOK_EXTERNAL_MAX_MON_ID" + else + echo "configmap $MON_ENDPOINT_CONFIGMAP_NAME already exists" + fi +} + +function importCsiRBDNodeSecret() { + if ! kubectl -n "$NAMESPACE" get secret "rook-$CSI_RBD_NODE_SECRET_NAME" &>/dev/null; then + kubectl -n "$NAMESPACE" \ + create \ + secret \ + generic \ + --type="kubernetes.io/rook" \ + "rook-""$CSI_RBD_NODE_SECRET_NAME" \ + --from-literal=userID="$CSI_RBD_NODE_SECRET_NAME" \ + --from-literal=userKey="$CSI_RBD_NODE_SECRET" + else + echo "secret rook-$CSI_RBD_NODE_SECRET_NAME already exists" + fi +} + +function importCsiRBDProvisionerSecret() { + if ! kubectl -n "$NAMESPACE" get secret "rook-$CSI_RBD_PROVISIONER_SECRET_NAME" &>/dev/null; then + kubectl -n "$NAMESPACE" \ + create \ + secret \ + generic \ + --type="kubernetes.io/rook" \ + "rook-""$CSI_RBD_PROVISIONER_SECRET_NAME" \ + --from-literal=userID="$CSI_RBD_PROVISIONER_SECRET_NAME" \ + --from-literal=userKey="$CSI_RBD_PROVISIONER_SECRET" + else + echo "secret $CSI_RBD_PROVISIONER_SECRET_NAME already exists" + fi +} + +function importCsiCephFSNodeSecret() { + if ! kubectl -n "$NAMESPACE" get secret "rook-$CSI_CEPHFS_NODE_SECRET_NAME" &>/dev/null; then + kubectl -n "$NAMESPACE" \ + create \ + secret \ + generic \ + --type="kubernetes.io/rook" \ + "rook-""$CSI_CEPHFS_NODE_SECRET_NAME" \ + --from-literal=adminID="$CSI_CEPHFS_NODE_SECRET_NAME" \ + --from-literal=adminKey="$CSI_CEPHFS_NODE_SECRET" + else + echo "secret $CSI_CEPHFS_NODE_SECRET_NAME already exists" + fi +} + +function importCsiCephFSProvisionerSecret() { + if ! kubectl -n "$NAMESPACE" get secret "rook-$CSI_CEPHFS_PROVISIONER_SECRET_NAME" &>/dev/null; then + kubectl -n "$NAMESPACE" \ + create \ + secret \ + generic \ + --type="kubernetes.io/rook" \ + "rook-""$CSI_CEPHFS_PROVISIONER_SECRET_NAME" \ + --from-literal=adminID="$CSI_CEPHFS_PROVISIONER_SECRET_NAME" \ + --from-literal=adminKey="$CSI_CEPHFS_PROVISIONER_SECRET" + else + echo "secret $CSI_CEPHFS_PROVISIONER_SECRET_NAME already exists" + fi +} + +function importRGWAdminOpsUser() { + if ! kubectl -n "$NAMESPACE" get secret "$RGW_ADMIN_OPS_USER_SECRET_NAME" &>/dev/null; then + kubectl -n "$NAMESPACE" \ + create \ + secret \ + generic \ + --type="kubernetes.io/rook" \ + "$RGW_ADMIN_OPS_USER_SECRET_NAME" \ + --from-literal=accessKey="$RGW_ADMIN_OPS_USER_ACCESS_KEY" \ + --from-literal=secretKey="$RGW_ADMIN_OPS_USER_SECRET_KEY" + else + echo "secret $RGW_ADMIN_OPS_USER_SECRET_NAME already exists" + fi +} + +function createECRBDStorageClass() { + if ! kubectl -n "$NAMESPACE" get storageclass $RBD_STORAGE_CLASS_NAME &>/dev/null; then + cat </dev/null; then + cat </dev/null; then + cat <