> For the complete documentation index, see [llms.txt](https://brightzheng100.gitbook.io/tech-diary/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://brightzheng100.gitbook.io/tech-diary/kubernetes_ocp/useful-scripts.md).

# Useful Scripts

## cleanup\_ns.sh

To clean up all namespaced objects and eventually delete the namespace.

```
#!/bin/bash

ns=$1
if [[ -z "$ns" ]] ; then
  echo "Usage: $0 <NAMESPACE>"
  exit 1
fi

echo "---> namespace: $ns"

# Retrieve all potential namespaced types
all_types=$(kubectl api-resources --namespaced=true --verbs=delete -o name | tr "\n" "," | sed -e "s/,$//")
#all_types="helmreleases.apps.open-cluster-management.io"

# Retrieve all potential namespaced objects
all_objects=($(kubectl get "$all_types" -n $ns -o json | jq -r '.items[] | .apiVersion + ";" + .kind + ";" + .metadata.name'))
#echo "---> all_objects: ${all_objects[@]}"

# Iterate to delete all namespaced objects
tmpfile="$(mktemp /tmp/deleting-object.XXXXXX)"
for item in "${all_objects[@]}"; do
  k8s_kind1=$(echo "$item" | cut -d ";" -f 1 | cut -d "/" -f 1)
  k8s_kind2=$(echo "$item" | cut -d ";" -f 2)
  k8s_kind="$k8s_kind2.$k8s_kind1"            # make it a full name like TagLabelMap.infra.management.ibm.com
  k8s_name=$(echo "$item" | cut -d ";" -f 3)
  echo "---> kind:$k8s_kind; name: $k8s_name";

  # Remove the finalizers
  kubectl get "$k8s_kind/$k8s_name" -n $ns -o json | jq '.metadata.finalizers=[]' > "$tmpfile"

  # Replace the object with removed finalizers
  kubectl -n $ns replace -f "$tmpfile"

  # Finally delete it
  kubectl -n $ns delete "$k8s_kind/$k8s_name"
done

# delete the ns at the end
kubectl get ns $ns -o json | jq '.spec.finalizers=[]' > "$tmpfile"
kubectl replace --raw "/api/v1/namespaces/$ns/finalize" -f "$tmpfile"
kubectl delete ns $ns

rm "$tmpfile" || true
```

## Find out the CRDs

There are some default CRDs but sometimes it's important to find out what more CRDs are added after some specific installations.

For example, we can find out what CRDs have been installed within ROKS, with OCP v4.3.38\_1544, by default:

```
$ kg crd -o json | jq -r '.items[].metadata.name'
```

The default CRDs in ROKS include:

```
alertmanagers.monitoring.coreos.com
apiservers.config.openshift.io
authentications.config.openshift.io
authentications.operator.openshift.io
baremetalhosts.metal3.io
bgpconfigurations.crd.projectcalico.org
bgppeers.crd.projectcalico.org
blockaffinities.crd.projectcalico.org
builds.config.openshift.io
catalogsourceconfigs.operators.coreos.com
catalogsources.operators.coreos.com
clusterinformations.crd.projectcalico.org
clusteroperators.config.openshift.io
clusterresourcequotas.quota.openshift.io
clusterserviceversions.operators.coreos.com
clusterversions.config.openshift.io
configs.imageregistry.operator.openshift.io
configs.samples.operator.openshift.io
consoleclidownloads.console.openshift.io
consoleexternalloglinks.console.openshift.io
consolelinks.console.openshift.io
consolenotifications.console.openshift.io
consoles.config.openshift.io
consoles.operator.openshift.io
consoleyamlsamples.console.openshift.io
credentialsrequests.cloudcredential.openshift.io
dnses.config.openshift.io
dnses.operator.openshift.io
dnsrecords.ingress.operator.openshift.io
featuregates.config.openshift.io
felixconfigurations.crd.projectcalico.org
globalnetworkpolicies.crd.projectcalico.org
globalnetworksets.crd.projectcalico.org
hostendpoints.crd.projectcalico.org
imagecontentsourcepolicies.operator.openshift.io
images.config.openshift.io
infrastructures.config.openshift.io
ingresscontrollers.operator.openshift.io
ingresses.config.openshift.io
installations.operator.tigera.io
installplans.operators.coreos.com
ipamblocks.crd.projectcalico.org
ipamconfigs.crd.projectcalico.org
ipamhandles.crd.projectcalico.org
ippools.crd.projectcalico.org
ippools.whereabouts.cni.cncf.io
kubeapiservers.operator.openshift.io
kubecontrollermanagers.operator.openshift.io
kubeschedulers.operator.openshift.io
mcoconfigs.machineconfiguration.openshift.io
network-attachment-definitions.k8s.cni.cncf.io
networkpolicies.crd.projectcalico.org
networks.config.openshift.io
networks.operator.openshift.io
networksets.crd.projectcalico.org
oauths.config.openshift.io
openshiftapiservers.operator.openshift.io
openshiftcontrollermanagers.operator.openshift.io
operatorgroups.operators.coreos.com
operatorhubs.config.openshift.io
operatorpkis.network.operator.openshift.io
operatorsources.operators.coreos.com
podmonitors.monitoring.coreos.com
projects.config.openshift.io
prometheuses.monitoring.coreos.com
prometheusrules.monitoring.coreos.com
proxies.config.openshift.io
rbacsyncs.ibm.com
rolebindingrestrictions.authorization.openshift.io
schedulers.config.openshift.io
securitycontextconstraints.security.openshift.io
servicecas.operator.openshift.io
servicecatalogapiservers.operator.openshift.io
servicecatalogcontrollermanagers.operator.openshift.io
servicemonitors.monitoring.coreos.com
subscriptions.operators.coreos.com
tigerastatuses.operator.tigera.io
tuneds.tuned.openshift.io
```

We then can set a baseline as a file, say name `_crds_roks.txt`. After installation of RHACM, we can check what other CRDs have been added:

```
# List all CRDs added on top of default ones from ROKS
$ kg crd -o json | jq -r '.items[].metadata.name' | grep -Ev "$(cat _crds_roks.txt | tr '\n' '|')"
```

Then we would get a list like:

```
baremetalassets.inventory.open-cluster-management.io
channels.apps.open-cluster-management.io
checkpoints.hive.openshift.io
clusterdeployments.hive.openshift.io
clusterdeprovisions.hive.openshift.io
clusterimagesets.hive.openshift.io
clustermanagers.operator.open-cluster-management.io
clusterprovisions.hive.openshift.io
clusterrelocates.hive.openshift.io
clusterstates.hive.openshift.io
deployables.apps.open-cluster-management.io
dnszones.hive.openshift.io
helmreleases.apps.open-cluster-management.io
hiveconfigs.hive.openshift.io
klusterletaddonconfigs.agent.open-cluster-management.io
machinepoolnameleases.hive.openshift.io
machinepools.hive.openshift.io
managedclusteractions.action.open-cluster-management.io
managedclusterinfos.internal.open-cluster-management.io
managedclusters.cluster.open-cluster-management.io
managedclusterviews.view.open-cluster-management.io
manifestworks.work.open-cluster-management.io
multiclusterhubs.operator.open-cluster-management.io
placementbindings.policy.open-cluster-management.io
placementrules.apps.open-cluster-management.io
policies.policy.open-cluster-management.io
searchservices.search.acm.com
selectorsyncidentityproviders.hive.openshift.io
selectorsyncsets.hive.openshift.io
subscriptions.apps.open-cluster-management.io
syncidentityproviders.hive.openshift.io
syncsetinstances.hive.openshift.io
syncsets.hive.openshift.io
userpreferences.console.open-cluster-management.io
```

So if we want to check what extra CRDs are added, on top of the new baseline with ROKS + RHACM, do this:

```
# List all CRDs added on top of default ones from ROKS + RHACM
$ kg crd -o json | jq -r '.items[].metadata.name' | \
  grep -Ev "$(cat _crds_roks.txt | tr '\n' '|')""|""$(cat _crds_rhacm.txt | tr '\n' '|')"
```

And if one wants to delete those "extra" CRDs to reset something, do this:

```
$ kg crd -o json | jq -r '.items[].metadata.name' | \
  grep -Ev "$(cat _crds_roks.txt | tr '\n' '|')|$(cat _crds_rhacm.txt | tr '\n' '|')" | \
  xargs kubectl delete crd
```

## Clean Up \~/.kube/config

To clean up all kubeconfig within `~/.kube/config` except `docker-desktop`:

```
for c in `kctx | grep -v docker-desktop`; kctx -d $c
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://brightzheng100.gitbook.io/tech-diary/kubernetes_ocp/useful-scripts.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
