Commit 4b92daaf authored by psaromanola1's avatar psaromanola1
Browse files

Functionality for addinf/removing managedClusters

parent 18469fba
Loading
Loading
Loading
Loading
+47 −7
Changes for chart/ocm-scheduler-chart/templates/cleanup-job.yaml: 47 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -33,12 +33,13 @@ rules:
    resources: ["customresourcedefinitions"]
    resourceNames: ["hyposchedulingmanifests.scheduling.hypo.eu"]
    verbs: ["delete"]
  {{- if .Values.clusterSet.enabled }}
  - apiGroups: ["cluster.open-cluster-management.io"]
    resources: ["managedclustersets/join"]
    resourceNames:
      - {{ .Values.clusterSet.name | quote }}
    verbs: ["create"]

  {{- end }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
@@ -57,6 +58,40 @@ subjects:
    name: {{ .Release.Name }}-cleanup
    namespace: {{ .Release.Namespace | quote }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: {{ .Release.Name }}-cleanup-inventory
  namespace: {{ .Release.Namespace | quote }}
  annotations:
    "helm.sh/hook": pre-delete
    "helm.sh/hook-weight": "-10"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
rules:
  - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames:
      - {{ printf "%s-cluster-inventory" .Release.Name | quote }}
    verbs: ["get", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: {{ .Release.Name }}-cleanup-inventory
  namespace: {{ .Release.Namespace | quote }}
  annotations:
    "helm.sh/hook": pre-delete
    "helm.sh/hook-weight": "-10"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
subjects:
  - kind: ServiceAccount
    name: {{ .Release.Name }}-cleanup
    namespace: {{ .Release.Namespace | quote }}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: {{ .Release.Name }}-cleanup-inventory
---
apiVersion: batch/v1
kind: Job
metadata:
@@ -78,21 +113,25 @@ spec:
          command: ["/bin/sh", "-ec"]
          args:
            - |
              # Let the running scheduler finalize its own resources first.
              # Let the running Scheduler finalize its resources first.
              kubectl delete hyposchedulingmanifests --all -n {{ .Values.namespace.name | quote }} --ignore-not-found --wait=true --timeout=180s
              # Delete any remaining scheduler-owned ManifestWorks, never unrelated works.
              # Delete only Scheduler-owned ManifestWorks.
              kubectl delete manifestworks -A -l scheduling.hypo.eu/owner --ignore-not-found --wait=true --timeout=180s
              {{- range $i, $cluster := .Values.managedClusters }}
              kubectl --kubeconfig=/kubeconfigs/{{ $i }}/kubeconfig delete clusterclaim hypo.filter.location --ignore-not-found --wait=true
              # Remove only the membership assigned by this release.
              kubectl --kubeconfig=/kubeconfigs/{{ $i }}/kubeconfig \
                delete clusterclaim hypo.filter.location --ignore-not-found --wait=true
              {{- if $.Values.clusterSet.enabled }}
              current=$(kubectl get managedcluster {{ $cluster.name | quote }} -o jsonpath='{.metadata.labels.cluster\.open-cluster-management\.io/clusterset}')
              current=$(kubectl get managedcluster {{ $cluster.name | quote }} \
                -o jsonpath='{.metadata.labels.cluster\.open-cluster-management\.io/clusterset}')
              if [ "$current" = {{ $.Values.clusterSet.name | quote }} ]; then
                kubectl label managedcluster {{ $cluster.name | quote }} cluster.open-cluster-management.io/clusterset- 
                kubectl label managedcluster {{ $cluster.name | quote }} \
                  cluster.open-cluster-management.io/clusterset-
              fi
              {{- end }}
              {{- end }}
              kubectl delete crd hyposchedulingmanifests.scheduling.hypo.eu --ignore-not-found --wait=false
              kubectl delete configmap {{ printf "%s-cluster-inventory" .Release.Name | quote }} \
                -n {{ .Release.Namespace | quote }} --ignore-not-found
          {{- if .Values.managedClusters }}
          volumeMounts:
            {{- range $i, $cluster := .Values.managedClusters }}
@@ -112,3 +151,4 @@ spec:
                path: kubeconfig
        {{- end }}
      {{- end }}
+94 −6
Changes for chart/ocm-scheduler-chart/templates/managed-clusters-job.yaml: 94 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ metadata:
rules:
  - apiGroups: ["cluster.open-cluster-management.io"]
    resources: ["managedclusters"]
    verbs: ["get", "patch"]
    verbs: ["get", "list", "patch"]
  - apiGroups: ["cluster.open-cluster-management.io"]
    resources: ["managedclustersets/join"]
    resourceNames:
@@ -32,15 +32,42 @@ subjects:
    name: {{ .Release.Name }}-setup
    namespace: {{ .Release.Namespace | quote }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: {{ .Release.Name }}-inventory
  namespace: {{ .Release.Namespace | quote }}
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "create", "patch", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: {{ .Release.Name }}-inventory
  namespace: {{ .Release.Namespace | quote }}
subjects:
  - kind: ServiceAccount
    name: {{ .Release.Name }}-setup
    namespace: {{ .Release.Namespace | quote }}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: {{ .Release.Name }}-inventory
---
apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Release.Name }}-configure-clusters
  namespace: {{ .Release.Namespace | quote }}
  annotations:
    helm.sh/hook: post-install,post-upgrade
    helm.sh/hook-weight: "5"
    helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    "helm.sh/hook": post-install,post-upgrade
    "helm.sh/hook-weight": "5"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
  backoffLimit: 2
  template:
@@ -53,9 +80,64 @@ spec:
          command: ["/bin/sh", "-ec"]
          args:
            - |
              CLUSTERSET={{ .Values.clusterSet.name | quote }}
              INVENTORY={{ printf "%s-cluster-inventory" .Release.Name | quote }}
              NAMESPACE={{ .Release.Namespace | quote }}
              DESIRED_CLUSTERS="{{ range .Values.managedClusters }}{{ .name }} {{ end }}"

              echo "Reconciling ClusterSet ${CLUSTERSET}"
              echo "Desired clusters: ${DESIRED_CLUSTERS}"

              # Validate every desired Hub ManagedCluster before making changes.
              for cluster in ${DESIRED_CLUSTERS}; do
                kubectl get managedcluster "${cluster}" >/dev/null
              done

              # Load previous inventory. An absent inventory is normal on first install.
              PREVIOUS_CLUSTERS=""
              if kubectl get configmap "${INVENTORY}" -n "${NAMESPACE}" >/dev/null 2>&1; then
                PREVIOUS_CLUSTERS=$(kubectl get configmap "${INVENTORY}" \
                  -n "${NAMESPACE}" -o jsonpath='{.data.clusters}')
              fi
              echo "Previously managed clusters: ${PREVIOUS_CLUSTERS}"

              # Remove Scheduler-owned state from clusters removed from values.yaml.
              for cluster in ${PREVIOUS_CLUSTERS}; do
                case " ${DESIRED_CLUSTERS} " in
                  *" ${cluster} "*)
                    echo "Keeping ${cluster}"
                    ;;
                  *)
                    echo "Cleaning removed cluster ${cluster}"
                    # HypO must retain this Secret until the upgrade succeeds.
                    SECRET_DATA=$(kubectl get secret "${cluster}" -n "${NAMESPACE}" \
                      -o jsonpath='{.data.kubeconfig}')
                    test -n "${SECRET_DATA}"
                    printf '%s' "${SECRET_DATA}" | base64 -d > /tmp/removed-kubeconfig
                    test -s /tmp/removed-kubeconfig

                    kubectl --kubeconfig=/tmp/removed-kubeconfig \
                      delete clusterclaim hypo.filter.location --ignore-not-found --wait=true
                    rm -f /tmp/removed-kubeconfig

                    # Never remove a label if another controller moved this cluster.
                    CURRENT_SET=$(kubectl get managedcluster "${cluster}" \
                      -o jsonpath='{.metadata.labels.cluster\.open-cluster-management\.io/clusterset}')
                    if [ "${CURRENT_SET}" = "${CLUSTERSET}" ]; then
                      kubectl label managedcluster "${cluster}" \
                        cluster.open-cluster-management.io/clusterset-
                    fi
                    echo "Cleaned ${cluster}"
                    ;;
                esac
              done

              # Reconcile all currently configured clusters and their location claims.
              {{- range $i, $cluster := .Values.managedClusters }}
              kubectl get managedcluster {{ $cluster.name | quote }} >/dev/null
              kubectl label managedcluster {{ $cluster.name | quote }} 'cluster.open-cluster-management.io/clusterset={{ $.Values.clusterSet.name }}' --overwrite
              echo "Configuring {{ $cluster.name }}"
              kubectl label managedcluster {{ $cluster.name | quote }} \
                "cluster.open-cluster-management.io/clusterset=${CLUSTERSET}" --overwrite

              cat <<'CLAIM_{{ $i }}' | kubectl --kubeconfig=/kubeconfigs/{{ $i }}/kubeconfig apply -f -
              apiVersion: cluster.open-cluster-management.io/v1alpha1
              kind: ClusterClaim
@@ -65,6 +147,12 @@ spec:
                value: {{ $cluster.location | quote }}
              CLAIM_{{ $i }}
              {{- end }}

              # Commit the inventory only after all operations succeeded.
              kubectl create configmap "${INVENTORY}" -n "${NAMESPACE}" \
                --from-literal=clusters="${DESIRED_CLUSTERS}" \
                --dry-run=client -o yaml | kubectl apply -f -
              echo "Reconciliation completed"
          {{- if .Values.managedClusters }}
          volumeMounts:
            {{- range $i, $cluster := .Values.managedClusters }}
+0 −1
Changes for chart/ocm-scheduler-chart/values.yaml: 0 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ managedClusters:
  - name: managed-1
    location: athens
    kubeconfigSecretId: 97b71df0-650a-4410-8b5f-10dfc08c031a

  - name: managed-2
    location: patra
    kubeconfigSecretId: f55cfe33-18ef-46dc-a3ab-e095dd2af0b1