1+ #! /usr/bin/env bash
2+
3+ # Import a managed cluster into ACM
4+ # Usage: ./import-cluster.sh <cluster-name> <kubeconfig-path>
5+
6+ set -euo pipefail
7+
8+ CLUSTER_NAME=" ${1:- } "
9+ MANAGED_KUBECONFIG=" ${2:- } "
10+
11+ # Validate inputs
12+ if [ -z " $CLUSTER_NAME " ]; then
13+ echo " Error: CLUSTER_NAME is required"
14+ echo " Usage: $0 <cluster-name> <kubeconfig-path>"
15+ exit 1
16+ fi
17+
18+ if [ -z " $MANAGED_KUBECONFIG " ]; then
19+ echo " Error: MANAGED_KUBECONFIG is required"
20+ echo " Usage: $0 <cluster-name> <kubeconfig-path>"
21+ exit 1
22+ fi
23+
24+ if [ ! -f " $MANAGED_KUBECONFIG " ]; then
25+ echo " Error: Kubeconfig file not found: $MANAGED_KUBECONFIG "
26+ exit 1
27+ fi
28+
29+ echo " ==========================================="
30+ echo " Importing cluster: $CLUSTER_NAME "
31+ echo " ==========================================="
32+
33+ # Step 1: Create ManagedCluster resource
34+ echo " Step 1: Creating ManagedCluster resource on hub..."
35+ cat << EOF | oc apply -f -
36+ apiVersion: cluster.open-cluster-management.io/v1
37+ kind: ManagedCluster
38+ metadata:
39+ name: $CLUSTER_NAME
40+ labels:
41+ cloud: auto-detect
42+ vendor: auto-detect
43+ spec:
44+ hubAcceptsClient: true
45+ EOF
46+
47+ # Step 2: Wait for import secret
48+ echo " Step 2: Waiting for import secret to be created..."
49+ for i in {1..60}; do
50+ if oc get secret -n " $CLUSTER_NAME " " $CLUSTER_NAME -import" 2> /dev/null; then
51+ echo " ✅ Import secret created!"
52+ break
53+ fi
54+ echo " Waiting for import secret ($i /60)..."
55+ sleep 2
56+ done
57+
58+ # Step 3: Extract import manifests
59+ echo " Step 3: Extracting import manifests..."
60+ mkdir -p _output/acm-import
61+ oc get secret -n " $CLUSTER_NAME " " $CLUSTER_NAME -import" -o jsonpath=' {.data.crds\.yaml}' | base64 -d > " _output/acm-import/${CLUSTER_NAME} -crds.yaml"
62+ oc get secret -n " $CLUSTER_NAME " " $CLUSTER_NAME -import" -o jsonpath=' {.data.import\.yaml}' | base64 -d > " _output/acm-import/${CLUSTER_NAME} -import.yaml"
63+ echo " Import manifests saved to _output/acm-import/"
64+
65+ # Step 4: Apply CRDs to managed cluster
66+ echo " Step 4: Applying CRDs to managed cluster..."
67+ KUBECONFIG=" $MANAGED_KUBECONFIG " oc apply -f " _output/acm-import/${CLUSTER_NAME} -crds.yaml"
68+ echo " Waiting for CRDs to be established..."
69+ sleep 5
70+
71+ # Step 5: Apply import manifest
72+ echo " Step 5: Applying import manifest to managed cluster..."
73+ KUBECONFIG=" $MANAGED_KUBECONFIG " oc apply -f " _output/acm-import/${CLUSTER_NAME} -import.yaml"
74+
75+ # Step 6: Wait for klusterlet to be ready
76+ echo " Step 6: Waiting for klusterlet to be ready..."
77+ for i in {1..120}; do
78+ if oc get managedcluster " $CLUSTER_NAME " -o jsonpath=' {.status.conditions[?(@.type=="ManagedClusterConditionAvailable")].status}' 2> /dev/null | grep -q " True" ; then
79+ echo " ✅ Cluster $CLUSTER_NAME is now available!"
80+ break
81+ fi
82+ echo " Waiting for cluster to become available ($i /120)..."
83+ sleep 5
84+ done
85+
86+ echo " ==========================================="
87+ echo " ✓ Cluster import complete!"
88+ echo " ==========================================="
89+ oc get managedcluster " $CLUSTER_NAME "
0 commit comments