Skip to content
Back to skills

Operations

ASecurity

Guide the operator through post-activation verification: clusters connected, observability working, metrics flowing. > **Reference**: [docs/ACM_SWITCHOVER_RUNBOOK.md — Steps 6-10](../../../docs/ACM_SWITCHOVER_RUNBOOK.md#post-activation-common-steps-applies-to-both-methods) ---

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 3, 2026
devopsbashkubernetesgitapi

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 9 files and shows the line behind each finding

Scanned September 3, 2026

npx -y skills add tomazb/rh-acm-switchover --skill operations --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Operations?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Operations
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tomazb-operations-af6f7703/badge)](https://www.skillsdirectory.com/skills/tomazb-operations-af6f7703)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
# Verify Switchover Success

Guide the operator through post-activation verification: clusters connected, observability working, metrics flowing.

> **Reference**: [docs/ACM_SWITCHOVER_RUNBOOK.md — Steps 6-10](../../../docs/ACM_SWITCHOVER_RUNBOOK.md#post-activation-common-steps-applies-to-both-methods)

---

## Step 6: Verify ManagedClusters Are Connected

### Check cluster availability

```bash
oc get managedcluster.cluster.open-cluster-management.io --context <secondary> \
  -o custom-columns='NAME:.metadata.name,AVAILABLE:.status.conditions[?(@.type=="ManagedClusterConditionAvailable")].status,JOINED:.status.conditions[?(@.type=="ManagedClusterJoined")].status'
```

**Expected:** All clusters show `AVAILABLE=True` and `JOINED=True`

**Decision Tree:**
- ✅ All True → Proceed to Step 7
- ⚠️ Some Unknown → Wait 5-10 minutes, recheck (clusters are reconnecting)
- ❌ Pending Import → See "What If" section below

### Check for stuck clusters

```bash
oc get managedcluster.cluster.open-cluster-management.io --context <secondary> | grep -E "Pending|Unknown"
```

**Timeline:** Clusters should connect within 5-10 minutes. If still not connected after 15 minutes, investigate.

---

## Step 7: Reset Auto-Import Strategy (ACM 2.14+)

> Only if you set ImportAndSync in Step 4b or F4

### Check if ConfigMap exists

```bash
oc get configmap import-controller-config -n multicluster-engine --context <secondary> 2>/dev/null
```

### If exists, remove it

```bash
oc delete configmap import-controller-config -n multicluster-engine --context <secondary> --ignore-not-found
```

---

## Step 8: Restart Observatorium API

> Required to refresh stale tenant data after restore

```bash
oc rollout restart deployment observability-observatorium-api \
  -n open-cluster-management-observability --context <secondary>
```

### Wait for pods to be ready

```bash
oc wait --for=condition=Ready pod \
  -l app.kubernetes.io/name=observatorium-api \
  -n open-cluster-management-observability --context <secondary> --timeout=5m
```

---

## Step 9: Verify Observability Pods

### Check all pods running

```bash
oc get pods -n open-cluster-management-observability --context <secondary>
```

**Expected pods (all Running/Ready):**
- `observability-alertmanager-*`
- `observability-grafana-*`
- `observability-observatorium-api-*`
- `observability-thanos-compact-*`
- `observability-thanos-query-*`
- `observability-thanos-receive-*`
- `observability-thanos-store-*`

### Check for unhealthy pods

```bash
oc get pods -n open-cluster-management-observability --context <secondary> | grep -vE "Running|Completed"
```

**Decision Tree:**
- ✅ All Running/Completed → Proceed
- ❌ CrashLoopBackOff or Error → Check pod logs, see [troubleshooting/grafana-no-data.skill.md](../troubleshooting/grafana-no-data.skill.md)

---

## Step 10: Verify Metrics Collection

### Get Grafana URL

```bash
oc get route grafana -n open-cluster-management-observability --context <secondary> \
  -o jsonpath='{.spec.host}'
```

### In Grafana, verify:

1. Navigate to **"ACM - Clusters Overview"** dashboard
2. Check that data is visible for all clusters
3. Verify metrics are recent (within last 5-10 minutes)

### Alternative: Query metrics via CLI

```bash
# From OpenShift console: Observe > Metrics
# Query: acm_managed_cluster_info
# Should show entries for all managed clusters
```

**Decision Tree:**
- ✅ Recent data visible for all clusters → Success!
- ⚠️ Data visible but stale → Wait 5-10 minutes for collection to resume
- ❌ No data → See [troubleshooting/grafana-no-data.skill.md](../troubleshooting/grafana-no-data.skill.md)

---

## Optional: Disable Observability on Old Hub (between Steps 10-11)

> **Required when keeping the old hub as a secondary** (not decommissioning).
> Scaling Thanos/Observatorium to 0 is unreliable — the MCO operator will re-scale them back to defaults within minutes.
> If GitOps manages the MCO, pause or adjust GitOps before deleting to avoid drift.

```bash
oc delete multiclusterobservability.observability.open-cluster-management.io observability \
  --context <primary>
```

**Verify pods terminate:**
```bash
oc get pods -n open-cluster-management-observability --context <primary>
```

> **Note:** If Observability pods remain after MCO deletion (and GitOps is not recreating it), capture logs and open a support case (product bug).

---

## What If...

### "Clusters stuck in Pending Import"

See [troubleshooting/pending-import.skill.md](../troubleshooting/pending-import.skill.md)

Quick check:
```bash
oc get secrets -n <cluster-namespace> --context <secondary> | grep import
```

### "Clusters showing Unknown on BOTH hubs"

This indicates clusters haven't connected to either hub:
1. Check network connectivity from managed clusters to new hub
2. Verify klusterlet pods running on managed clusters
3. Check klusterlet logs for certificate issues

### "Grafana shows no data after 15 minutes"

See [troubleshooting/grafana-no-data.skill.md](../troubleshooting/grafana-no-data.skill.md)

Quick fix:
```bash
# Restart observatorium-api (if not done already)
oc rollout restart deployment observability-observatorium-api \
  -n open-cluster-management-observability --context <secondary>
```

### "Some observability pods in CrashLoopBackOff"

Check pod logs:
```bash
oc logs -n open-cluster-management-observability <pod-name> --context <secondary>
```

Common issues:
- Storage connectivity problems
- Missing secrets after restore
- Resource constraints

---

## Verification Summary

Present checklist to operator:

| Check | Status | Notes |
|-------|--------|-------|
| ManagedClusters Available | ✅/❌ | |
| ManagedClusters Joined | ✅/❌ | |
| ImportAndSync removed (2.14+) | ✅/N/A | |
| Observatorium API restarted | ✅/❌ | |
| Observability pods healthy | ✅/❌ | |
| Grafana showing recent data | ✅/❌ | |

---

## Automated Alternative

Use the post-flight validation script:

```bash
./scripts/postflight-check.sh \
  --new-hub-context <secondary> \
  --old-hub-context <primary>
```

---

## Next Steps

- ✅ All verified → Proceed to [enable-backups.skill.md](enable-backups.skill.md)
- ❌ Issues found → Address using troubleshooting guides, then re-verify

Files in this skill

  • activate-full-restore.skill.md5.8 KB
  • activate-passive-restore.skill.md8.2 KB
  • decommission.skill.md6.8 KB
  • enable-backups.skill.md6.4 KB
  • pause-backups.skill.md4.6 KB
  • preflight-validation.skill.md7.8 KB
  • rollback.skill.md7.8 KB
  • verify-switchover.skill.md6.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.