#!/usr/bin/env -S bash set -e ############## # VARIABLES # ############# NAMESPACE=${NAMESPACE:="rook-ceph"} 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 EXTERNAL_COMMAND_CONFIGMAP_NAME=external-cluster-user-command 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=ceph-rbd RBD_TOPOLOGY_STORAGE_CLASS_NAME=ceph-rbd-topology CEPHFS_STORAGE_CLASS_NAME=cephfs 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 if [ -n "$KUBECONTEXT" ]; then echo "Using $KUBECONTEXT as the context value for kubectl commands" KUBECTL="kubectl --context=$KUBECONTEXT" else KUBECTL="kubectl" 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"="$userID" \ --from-literal="$MON_SECRET_CEPH_SECRET_KEYNAME"="$ROOK_EXTERNAL_USER_SECRET" else echo "secret $MON_SECRET_NAME already exists" $KUBECTL -n "$NAMESPACE" \ patch \ secret \ "$MON_SECRET_NAME" \ -p "{\"stringData\":{\"$MON_SECRET_CEPH_USERNAME_KEYNAME\":\"$userID\"}}" 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 createInputCommadConfigMap() { if ! $KUBECTL -n "$NAMESPACE" get configmap "$EXTERNAL_COMMAND_CONFIGMAP_NAME" &>/dev/null; then $KUBECTL -n "$NAMESPACE" \ create \ configmap \ "$EXTERNAL_COMMAND_CONFIGMAP_NAME" \ --from-literal=args="$ARGS" else echo "configmap $EXTERNAL_COMMAND_CONFIGMAP_NAME already exists, updating it" $KUBECTL -n "$NAMESPACE" \ patch \ configmap \ "$EXTERNAL_COMMAND_CONFIGMAP_NAME" \ -p "$(jq -n --arg args "$ARGS" '{"data": {"args": $args}}')" fi } function getUserId(){ id="$1" if [ -z "$CEPHX_KEY_GENERATION" ] || [ "$CEPHX_KEY_GENERATION" == 0 ]; then echo "$id" else result="$id.$CEPHX_KEY_GENERATION" echo "$result" fi } function importCsiRBDNodeSecret() { userID=$(getUserId "$CSI_RBD_NODE_SECRET_NAME") 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="$userID" \ --from-literal=userKey="$CSI_RBD_NODE_SECRET" else echo "secret 'rook-$CSI_RBD_NODE_SECRET_NAME' already exists" $KUBECTL -n "$NAMESPACE" \ patch \ secret \ "rook-$CSI_RBD_NODE_SECRET_NAME" \ -p "{\"stringData\":{\"userID\":\"$userID\",\"userKey\":\"$CSI_RBD_NODE_SECRET\"}}" fi } function importCsiRBDProvisionerSecret() { userID=$(getUserId "$CSI_RBD_PROVISIONER_SECRET_NAME") 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="$userID" \ --from-literal=userKey="$CSI_RBD_PROVISIONER_SECRET" else echo "secret 'rook-$CSI_RBD_PROVISIONER_SECRET_NAME' already exists" $KUBECTL -n "$NAMESPACE" \ patch \ secret \ "rook-$CSI_RBD_PROVISIONER_SECRET_NAME" \ -p "{\"stringData\":{\"userID\":\"$userID\",\"userKey\":\"$CSI_RBD_PROVISIONER_SECRET\"}}" fi } function importCsiCephFSNodeSecret() { userID=$(getUserId "$CSI_CEPHFS_NODE_SECRET_NAME") 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=userID="$userID" \ --from-literal=userKey="$CSI_CEPHFS_NODE_SECRET" else echo "secret 'rook-$CSI_CEPHFS_NODE_SECRET_NAME' already exists" $KUBECTL -n "$NAMESPACE" \ patch \ secret \ "rook-$CSI_CEPHFS_NODE_SECRET_NAME" \ -p "{\"stringData\":{\"userID\":\"$userID\",\"userKey\":\"$CSI_CEPHFS_NODE_SECRET\"}}" fi } function importCsiCephFSProvisionerSecret() { userID=$(getUserId "$CSI_CEPHFS_PROVISIONER_SECRET_NAME") 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=userID="$userID" \ --from-literal=userKey="$CSI_CEPHFS_PROVISIONER_SECRET" else echo "secret 'rook-$CSI_CEPHFS_PROVISIONER_SECRET_NAME' already exists" $KUBECTL -n "$NAMESPACE" \ patch \ secret \ "rook-$CSI_CEPHFS_PROVISIONER_SECRET_NAME" \ -p "{\"stringData\":{\"userID\":\"$userID\",\"userKey\":\"$CSI_CEPHFS_PROVISIONER_SECRET\"}}" 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 </dev/null; then cat <