非接続環境での GPU Operator のデプロイ

以下の手順を参照しましたが、自分の希望する完全な非接続環境を想定した手順でなかったため、Red Hatのガイドと照合しながら実行しました。

https://docs.nvidia.com/datacenter/cloud-native/openshift/23.9.2/mirror-gpu-ocp-disconnected.html#verify-the-mirrored-catalog-source

注）上のガイドのとおり実施したものの、今回の実行手順の場合、実際には不要だったと思われる手順も含まれています。

## 環境
- OCP 4.12
- プライベート・コンテナー・レジストリー：myregistry.domain.com:5001
    - docker registry使用
    - --publish 5001:5000 として起動

## 前提

jump host にて：
   - podman version 1.9.3+
   - grpcurl
   - Install the OpenShift CLI (oc).
   - Red Hat Enterprise Linux (RHEL) on your jump host. The jump host when configured becomes the private registry host.
   - Install the opm CLI (opm version 1.12.3+) used to prune the default catalog. Refer to opm CLI reference in the Red Hat OpenShift Container Platform documentation for information about using the CLI.

### podman
```
# podman version
Client:       Podman Engine
Version:      4.4.1
API Version:  4.4.1
Go Version:   go1.19.6
Built:        Wed Mar 22 01:45:49 2023
OS/Arch:      linux/amd64
```

### grpcurl
[こちら](https://github.com/fullstorydev/grpcurl/releases)から `grpcurl_1.9.1_linux_amd64.rpm` をダウンロードしインストール

```
# rpm -ihv grpcurl_1.9.1_linux_amd64.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:grpcurl-0:1.9.1-1                ################################# [100%]
```

### oc
```
# oc version
Client Version: 4.12.0-202310201022.p0.ga55beda.assembly.stream-a55beda
Kustomize Version: v4.5.7
```

### opm

https://docs.openshift.com/container-platform/4.12/cli_reference/opm/cli-opm-install.html

[OpenShift mirror site](https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/latest-4.12/?extIdCarryOver=true&sc_cid=701f2000001Css5AAC) から最新版をダウンロードし解凍、`/usr/local/sbin` に置きます。

```
# tar xvf opm-linux-4.12.57.tar.gz
opm
# mv opm /usr/local/sbin/
# opm version
Version: version.Version{OpmVersion:"9dd28b413", GitCommit:"9dd28b4133df91b7c14b48d1ca6e7042c5dab25b", BuildDate:"2024-05-09T20:31:13Z", GoOs:"linux", GoArch:"amd64"}
```


## ベーシックHTTPサーバーのセットアップ
（この手順は不要でした）
イメージのミラーリングにはベーシックHTTP サーバーが必要です。ベーシックWeb サーバーを設定するには、以下のガイドラインに従ってください。
```
# yum install httpd -y

# systemctl restart httpd
```

## プライベート・コンテナー・レジストリーの作成
今回、既存のプライベート・コンテナー・レジストリーを使用しました。

## ミラーレジストリの認証
ミラーレジストリを認証するには、Openshift Container Platform クラスターでイメージレジストリへのアクセス用に追加の信頼ストアを構成する必要があります。openshift-config 名前空間に `ConfigMap` を作成し `image.config.openshift.io` リソースの `AdditionalTrustedCA` でその名前を使用できます。これにより、外部レジストリに接続するときに信頼される追加の CA が提供されます。

1. 次の環境変数をセットします。
    ```
    export JUMP_HOST=<Your_jump_hostname>
    ```
2. `openshift-config` 名前空間にConfigMapを作成します。
    ```
    oc create configmap registry-config \
       --from-file=${JUMP_HOST}..5000=/etc/pki/ca-trust/source/anchors/domain.crt  \
       -n openshift-config
    ```
3. `image.config.openshift.io` リソース内の `AdditionalTrustedCA` をupdateします。
    ```
    oc patch image.config.openshift.io/cluster \
    --patch '{"spec":{"additionalTrustedCA":{"name":"registry-config"}}}' --type=merge \
    --type=merge
    ```

## イメージのミラーリングを可能にする認証情報の設定
Red Hat からミラーレジストリにイメージをミラーリングできるようにするコンテナイメージレジストリ資格情報ファイルを作成します。

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.12/html/installing/installing-mirroring-installation-images

1. [Red Hat OpenShift Cluster Manager サイトの Pull Secret ページ](https://console.redhat.com/openshift/install/pull-secret) から `registry.redhat.io` プルシークレットをダウンロードします。

2. JSON 形式でプルシークレットのコピーを作成します。 

    ファイルの内容は以下の例のようになります。
    ```
    {
      "auths": {
        "cloud.openshift.com": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "quay.io": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "registry.connect.redhat.com": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        },
        "registry.redhat.io": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        }
      }
    }
    ```
    
3. ファイルを、~/.docker/config.json または $XDG_RUNTIME_DIR/containers/auth.json として保存します。今回の場合、oc-mirrorコマンドを実行するインターネット接続マシン上に `~/.docker/config.json` として保存しました。
 
4. ミラーレジストリーの base64 でエンコードされたユーザー名およびパスワードまたはトークンを生成します。 
`<user_name>` および `<password>` については、レジストリーに設定したユーザー名およびパスワードを指定します。 
    ```
    echo -n '<user_name>:<password>' | base64 -w0
    ```
5. JSON ファイルを編集し、レジストリーについて記述するセクションをこれに追加します。 
    ```
      "auths": {
        "<mirror_registry>": { 
          "auth": "<credentials>", 
          "email": "you@example.com"
        }
      },
    ```
    ファイルは以下の例のようになります。
    ```
    {
      "auths": {
        "registry.example.com": {
          "auth": "BGVtbYk3ZHAtqXs=",
          "email": "you@example.com"
        },
        "cloud.openshift.com": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "quay.io": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "registry.connect.redhat.com": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        },
        "registry.redhat.io": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        }
      }
    }
    ```


## 参考： 非接続クラスターへのオペレーター・カタログのミラーリング
https://docs.openshift.com/container-platform/4.12/operators/admin/olm-restricted-networks.html

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.12/html/installing/installing-mirroring-disconnected#doc-wrapper

## デフォルト OperatorHub ソースの無効化

```
oc patch OperatorHub cluster --type json \
    -p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'
```

## Node Feature Discovery (NFD) と NVIDIA GPU Operator カタログのミラーリング
今回、完全な非接続環境でのイメージセットのミラーリングを実施します。

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.12/html/installing/installing-mirroring-disconnected#mirroring-image-set-full

インターネット接続マシンのディスクにイメージセットをミラーリングし、そのディスク上のイメージセットを非接続環境に移動しプライベート・コンテナー・レジストリーにミラーリングします。

前提
- `oc-mirror` プラグインのインストール
- `pull-secret.json` を作成し、`~/.docker/config.json` として配置してあること




### Node Feature Discovery (NFD) Operator カタログのミラーリング
作業前の状態
![operator_nfd_original.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/6e86a2b3-6b40-a2a7-0fcb-937df3375d88.png)

#### 1. イメージセット設定の作成

イメージセット設定ファイルは、コンテンツをミラーリングするときに oc mirror コマンドで必要です。
【インターネットに接続できるマシンで実行します】
1. oc mirror init コマンドを使用して、イメージセット設定のテンプレートファイルを作成します。
    ```
    oc mirror init > imageset-config-nfd.yaml
    ```
    
2. イメージセット設定のテンプレートファイル `imageset-config-nfd.yaml` を編集します。

    参考）ImageSetConfiguration パラメーター の説明は[こちら](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.12/html/installing/installing-mirroring-disconnected#oc-mirror-imageset-config-params_installing-mirroring-disconnected)
    
    変更点：
    - StorageConfig: ディスク上のローカルパス `/repo` にイメージを保存する例です。
    - mirror.operators.packages.channels.name: `stable-4.12`
    - mirror.operators.catalog: `registry.redhat.io/redhat/redhat-operator-index:v4.12`
    - mirror.operators.packages.name: `nfd`
    
    ```text:imageset-config-nfd.yaml
    kind: ImageSetConfiguration
    apiVersion: mirror.openshift.io/v1alpha2
    storageConfig:
      local:
        path: /repo
    mirror:
      platform:
        channels:
        - name: stable-4.12
          type: ocp
      operators:
      - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.12
        packages:
        - name: nfd
          channels:
          - name: stable
      additionalImages:
      - name: registry.redhat.io/ubi8/ubi:latest
      helm: {}
    ```
    


#### 2. ミラーからディスクへのミラーリング

1. `oc mirror` コマンドを実行して、前のステップで作成したイメージセット設定ファイル `imageset-config-nfd.yaml` を指定して、ターゲットディレクトリー `/repo` にイメージをミラーリングします。
    ```
    oc mirror --dest-skip-tls=true --config=./imageset-config-nfd.yaml file:///repo
    ```

    ```text:実行例
    # oc mirror --dest-skip-tls=true --config=./imageset-config-nfd.yaml file:///repo
    Creating directory: /repo/oc-mirror-workspace/src/publish
    Creating directory: /repo/oc-mirror-workspace/src/v2
    Creating directory: /repo/oc-mirror-workspace/src/charts
    Creating directory: /repo/oc-mirror-workspace/src/release-signatures
    No metadata detected, creating new workspace
    wrote mirroring manifests to /repo/oc-mirror-workspace/operators.1716987251/manifests-redhat-operator-index
    
    To upload local images to a registry, run:
    
            oc adm catalog mirror file://redhat/redhat-operator-index:v4.12 REGISTRY/REPOSITORY
    <dir>
      openshift/release
        blobs:
          quay.io/openshift-release-dev/ocp-v4.0-art-dev sha256:d8190195889efb5333eeec18af9b6c82313edd4db62989bd3a357caca4f13f0e 1.404KiB
          quay.io/openshift-release-dev/ocp-v4.0-art-dev sha256:c112a1b211ef5d4b547c70a949f69921382696f9f0264d2c361bcf448be8c9e2 2.174KiB
    :
    :
    sha256:e5ecc5c85b148bce8f319f500b3c93246c6cc0ddec6468e2c3d77949f42d90ff file://openshift/release:4.12.57-x86_64-prometheus-node-exporter
    sha256:fb37416ef085af33568f69176265a2fc1eb7623589ff120b6b28eadf3c55843b file://openshift/release:4.12.57-x86_64-csi-driver-manila-operator
    mounted: file://openshift/release-images sha256:2b7a510adf4536bd1348c70c9464045245b6fc320a323ac47d61f3c13294fcc3 24.37MiB
    mounted: file://openshift/release-images sha256:f30f3c670a52324bd0fd7d057c7d61f9518318d33132d95719b5cbf267864135 64.93MiB
    mounted: file://openshift/release-images sha256:be07ad4c7a081399ed6d61dcc8b21ccf61049d791914a9861cbdc51c957d80db 11.24MiB
    mounted: file://openshift/release-images sha256:97da74cc6d8fa5d1634eb1760fd1da5c6048619c264c23e62d75f3bf6b8ef5c4 75.84MiB
    uploading: file://openshift/release-images sha256:2ee02691586c07f3982e172778b813ab4f2d8929ab2f393c025fce6e52cc7389 933.7KiB
    sha256:ebd20cd66e0bbb5bcd7d16559ff4856918b7172e29d6a7bd34d8cc49a556b8f7 file://openshift/release-images:4.12.57-x86_64
    info: Mirroring completed in 7m16.34s (42.08MB/s)
    Creating archive /repo/mirror_seq1_000000.tar
    ```
    
2. [結果の検証] ターゲットディレクトリーに `.tar` ファイルが作成されています。
    ```
    # ls -l /repo/mirror_seq1_000000.tar
    -rw-r--r-- 1 root root 20811304960 May 29 22:07 /repo/mirror_seq1_000000.tar
    ```
#### 3. イメージセットの `.tar` ファイルをプライベート・コンテナー・レジストリーに接続できる非接続環境に転送します。

#### 4. ディスクからミラーレジストリー（プライベート・コンテナー・レジストリー）へのミラーリング
【プライベート・コンテナー・レジストリーに接続できるマシンで実行します】
1. `oc mirror` コマンドを実行して、ディスク上のイメージセットファイルを処理し、その内容をターゲットミラーレジストリーにミラーリングします。 
このコマンドは、ミラーレジストリーをイメージセットで更新し、`ImageContentSourcePolicy` および `CatalogSource` リソースのYAMLファイルを生成します。

    ```
    # oc mirror --from=/repo/mirror_seq1_000000.tar docker://myregistry.domain.com:5001
    Checking push permissions for myregistry.domain.com:5001
    Publishing image set from archive "/repo/mirror_seq1_000000.tar" to registry "myregistry.domain.com:5001"
    myregistry.domain.com:5001/
      openshift/release
        blobs:
          file://openshift/release sha256:d8190195889efb5333eeec18af9b6c82313edd4db62989bd3a357caca4f13f0e 1.404KiB
          file://openshift/release sha256:68fc710a0ea28d8da39e4420617a6a577c34c12a7e931887f5fa966b5fb3d16c 18.42KiB
          file://openshift/release sha256:be07ad4c7a081399ed6d61dcc8b21ccf61049d791914a9861cbdc51c957d80db 11.24MiB
          file://openshift/release sha256:f30f3c670a52324bd0fd7d057c7d61f9518318d33132d95719b5cbf267864135 64.93MiB
          file://openshift/release sha256:97da74cc6d8fa5d1634eb1760fd1da5c6048619c264c23e62d75f3bf6b8ef5c4 75.84MiB
          file://openshift/release sha256:249ac243f3b4a45e9ab4e7e9ef4074d671c258b21625a22645c9c2a5f90fac8d 128.5MiB
        manifests:
          sha256:2a6b88829b1a21aaf5e4e0cf71669143e25bc9a6d9ffa3d2eda27e611a12bc89 -> 4.12.57-x86_64-hyperkube
      stats: shared=0 unique=6 size=280.5MiB ratio=1.00
      :
      :
    catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.12/layout/blobs/sha256/f4d5c29748400d5eaee8f273ad62ceee7c95a107278fe4ef5a7b9fa92b3bb3c1
    catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.12/layout/index.json
    catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.12/layout/oci-layout
    Rendering catalog image "myregistry.domain.com:5001/redhat/redhat-operator-index:v4.12" with file-based catalog
    Writing image mapping to oc-mirror-workspace/results-1717040630/mapping.txt
    Writing CatalogSource manifests to oc-mirror-workspace/results-1717040630
    Writing ICSP manifests to oc-mirror-workspace/results-1717040630
    ```

2. [結果の検証] 実行ディレクトリー下に `oc-mirror-workspace` ディレクトリーができています。この下の `results` ディレクトリー下に、`ImageContentSourcePolicy` および `CatalogSource` リソースのYAMLファイルが存在することを確認します。
    
    ```
    # ls -l oc-mirror-workspace
    合計 0
    drwxr-x--- 2 root root  28  5月 30 12:50 publish
    drwxr-xr-x 4 root root 153  5月 30 12:50 results-1717040630
    
    # ls -l oc-mirror-workspace/results-1717040630/
    合計 48
    -rwxr-xr-x 1 root root   241  5月 30 12:50 catalogSource-cs-redhat-operator-index.yaml
    drwxr-xr-x 2 root root     6  5月 30 12:43 charts
    -rwxr-xr-x 1 root root   926  5月 30 12:50 imageContentSourcePolicy.yaml
    -rw-r--r-- 1 root root 39274  5月 30 12:50 mapping.txt
    drwxr-xr-x 2 root root    52  5月 30 12:50 release-signatures
    ```

#### 5. oc-mirror が生成したリソースを使用するためのクラスター設定 
イメージセットをミラーレジストリーにミラーリングした後、生成された`ImageContentSourcePolicy` および `CatalogSource` リソースをクラスターに適用します。

:::note info
ImageContentSourcePolicy リソースは、ミラーレジストリーをソースレジストリーに関連付け、イメージプル要求をオンラインレジストリーからミラーレジストリーにリダイレクトします。
CatalogSource リソースは、Operator Lifecycle Manager (OLM) によって使用され、ミラーレジストリーで使用可能な Operator に関する情報を取得します。
:::

1. cluster-admin ロールを持つユーザーとして OpenShift CLI にログインします。

2. 以下のコマンドを実行して、results ディレクトリーからクラスターに YAML ファイルを適用します。     
    ```text:実行例
    # oc apply -f ./oc-mirror-workspace/results-1717040630/
    catalogsource.operators.coreos.com/cs-redhat-operator-index created
    imagecontentsourcepolicy.operator.openshift.io/generic-0 created
    imagecontentsourcepolicy.operator.openshift.io/operator-0 configured
    imagecontentsourcepolicy.operator.openshift.io/release-0 created
    ```
3. [結果の検証] 
a. 以下のコマンドを実行して、ImageContentSourcePolicy リソースが正常にインストールされたことを確認します。 
    ```
    oc get imagecontentsourcepolicy
    ```
    b. 以下のコマンドを実行して、CatalogSource リソースが正常にインストールされたことを確認します。
    ```
    oc get catalogsource -n openshift-marketplace
    ```

#### 6.確認
ここまで完了すると、OperatorHubに `Node Feature Discovery Operator` が表示されるようになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/ad7a9e3c-09ba-06fd-aa12-c38fa56181d1.png)

### NVIDIA GPU Operator カタログのミラーリング
作業前の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/8445c32a-2c13-6339-f868-7f0386cf0b6c.png)
 
#### 1. イメージセット設定の作成

イメージセット設定ファイルは、コンテンツをミラーリングするときに oc mirror コマンドで必要です。
【インターネットに接続できるマシンで実行します】
1. oc mirror init コマンドを使用して、イメージセット設定のテンプレートファイルを作成します。
    ```
    oc mirror init > imageset-config-gpu.yaml
    ```
2. イメージセット設定のテンプレートファイル `imageset-config-gpu.yaml` を編集します。

    参考）ImageSetConfiguration パラメーター の説明は[こちら](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.12/html/installing/installing-mirroring-disconnected#oc-mirror-imageset-config-params_installing-mirroring-disconnected)
    
    変更点：
    - StorageConfig: ディスク上のローカルパス `/repo/oc-mirror-gpu` にイメージを保存する例です。
    - mirror.operators.packages.channels.name: `stable-4.12`
    - mirror.operators.catalog: `registry.redhat.io/redhat/certified-operator-index:v4.12`
    - mirror.operators.packages.name: `gpu-operator-certified`
    - mirror.operators.packages.minversion: `"23.9.0"`
    
    ```text:imageset-config-gpu.yaml    
    kind: ImageSetConfiguration
    apiVersion: mirror.openshift.io/v1alpha2
    storageConfig:
      local:
        path: /repo/oc-mirror-gpu
    mirror:
      platform:
        channels:
        - name: stable-4.12
          type: ocp
      operators:
      - catalog: registry.redhat.io/redhat/certified-operator-index:v4.12
        packages:
        - name: gpu-operator-certified
          channels:
          - name: stable
            minversion: "23.9.0"
      additionalImages:
      - name: registry.redhat.io/ubi8/ubi:latest
      helm: {}
    ```
#### 2. ミラーからディスクへのミラーリング

1. `oc mirror` コマンドを実行して、前のステップで作成したイメージセット設定ファイル `imageset-config-gpu.yaml` を指定して、ターゲットディレクトリー `/repo/oc-mirror-gpu` にイメージをミラーリングします。
    ```
    oc mirror --config=./imageset-config-gpu.yaml file:///repo/oc-mirror-gpu
    ```

    ```text:実行例
    # oc mirror --config=./imageset-config-gpu.yaml file:///repo/oc-mirror-gpu
    Creating directory: /repo/oc-mirror-gpu/oc-mirror-workspace/src/publish
    Creating directory: /repo/oc-mirror-gpu/oc-mirror-workspace/src/v2
    Creating directory: /repo/oc-mirror-gpu/oc-mirror-workspace/src/charts
    Creating directory: /repo/oc-mirror-gpu/oc-mirror-workspace/src/release-signatures
    No metadata detected, creating new workspace
    wrote mirroring manifests to /repo/oc-mirror-gpu/oc-mirror-workspace/operators.1717063776/manifests-certified-operator-index
    
    To upload local images to a registry, run:
    
            oc adm catalog mirror file://redhat/certified-operator-index:v4.12 REGISTRY/REPOSITORY
    <dir>
      nvidia/cloud-native/dcgm
        blobs:
          nvcr.io/nvidia/cloud-native/dcgm sha256:ca8f57e564a0ad2f53a57dab6364abe4753c9b7492303209c4f07d5cf034dea2 186B
          nvcr.io/nvidia/cloud-native/dcgm sha256:0e330b1bb7948fe0370a609840bff63ff837f8cd6da2c4ca85b28a966654e2b3 187B
          :
          :
    sha256:91f240e026be5e7cae1cc41e795b9a95b4beb85dd2b8f5a772ab2e1576a9e0e8 file://nvidia/driver:c1f6ef75
    info: Mirroring completed in 18m4.36s (34.27MB/s)
    Creating archive /repo/oc-mirror-gpu/mirror_seq1_000000.tar      
    ```
2. [結果の検証] ターゲットディレクトリーに `.tar` ファイルが作成されています。
    ```
    # ls -l /repo/oc-mirror-gpu/mirror_seq1_000000.tar
    -rw-r--r-- 1 root root 38846590976 May 30 19:33 /repo/oc-mirror-gpu/mirror_seq1_000000.tar
    ```
#### 3. イメージセットの `.tar` ファイルをプライベート・コンテナー・レジストリーに接続できる非接続環境に転送します。

#### 4. ディスクからミラーレジストリー（プライベート・コンテナー・レジストリー）へのミラーリング
【プライベート・コンテナー・レジストリーに接続できるマシンで実行します】
1. `oc mirror` コマンドを実行して、ディスク上のイメージセットファイルを処理し、その内容をターゲットミラーレジストリーにミラーリングします。 
このコマンドは、ミラーレジストリーをイメージセットで更新し、`ImageContentSourcePolicy` および `CatalogSource` リソースのYAMLファイルを生成します。

    ```
   # oc mirror --from=/repo/oc-mirror-odf/mirror_seq1_000000.tar docker://myregistry.domain.com:5001
    Checking push permissions for myregistry.domain.com:5001
    Publishing image set from archive "/repo/oc-mirror-odf/mirror_seq1_000000.tar" to registry "myregistry.domain.com:5001"
    myregistry.domain.com:5001/
      /cpopen/odr-cluster-operator-bundle
        blobs:
          file://cpopen/odr-cluster-operator-bundle sha256:fd7b1a1c88907db576ccb6cce8c87e258dd167366e482811b02a47a6e5b99938 5.896KiB
          file://cpopen/odr-cluster-operator-bundle sha256:4d6ddf64b2eb275b0c3262b6853a5f827b58f4a9b0e8aab1d1bd3739df72b48d 5.898KiB
      :
      :
    catalogs/registry.redhat.io/redhat/certified-operator-index/v4.12/layout/blobs/sha256/e9e5d387bb78ec54911b40df0312b51875078de2300718c0420a4f3982c946a5
    catalogs/registry.redhat.io/redhat/certified-operator-index/v4.12/layout/index.json
    catalogs/registry.redhat.io/redhat/certified-operator-index/v4.12/layout/oci-layout
    Rendering catalog image "myregistry.domain.com:5001/redhat/certified-operator-index:v4.12" with file-based catalog
    Writing image mapping to oc-mirror-workspace/results-1717070037/mapping.txt
    Writing CatalogSource manifests to oc-mirror-workspace/results-1717070037
    Writing ICSP manifests to oc-mirror-workspace/results-1717070037
    ```

2. [結果の検証] 実行ディレクトリー下に `oc-mirror-workspace` ディレクトリーができています。この下の `results` ディレクトリー下に、`ImageContentSourcePolicy` および `CatalogSource` リソースのYAMLファイルが存在することを確認します。
    
    ```
    # ls -l oc-mirror-workspace
    合計 0
    drwxr-x--- 2 root root  28  5月 30 12:50 publish
    drwxr-xr-x 4 root root 153  5月 30 12:50 results-1717040630
    
    # ls -l oc-mirror-workspace/results-1717070037
    合計 56
    -rwxr-xr-x 1 root root   247  5月 30 21:03 catalogSource-cs-certified-operator-index.yaml
    drwxr-xr-x 2 root root     6  5月 30 20:53 charts
    -rwxr-xr-x 1 root root  1012  5月 30 21:03 imageContentSourcePolicy.yaml
    -rw-r--r-- 1 root root 47670  5月 30 21:03 mapping.txt
    drwxr-xr-x 2 root root    60  5月 30 21:03 release-signatures
    ```

#### 5. oc-mirror が生成したリソースを使用するためのクラスター設定 
イメージセットをミラーレジストリーにミラーリングした後、生成された`ImageContentSourcePolicy` および `CatalogSource` リソースをクラスターに適用します。

1. cluster-admin ロールを持つユーザーとして OpenShift CLI にログインします。

2. 以下のコマンドを実行して、results ディレクトリーからクラスターに YAML ファイルを適用します。     
    ```text:実行例
    # oc apply -f ./oc-mirror-workspace/results-1717070037/
    catalogsource.operators.coreos.com/cs-certified-operator-index created
    imagecontentsourcepolicy.operator.openshift.io/generic-0 unchanged
    imagecontentsourcepolicy.operator.openshift.io/operator-0 configured
    imagecontentsourcepolicy.operator.openshift.io/release-0 unchanged
    ```
3. [結果の検証] 
a. 以下のコマンドを実行して、`ImageContentSourcePolicy` リソースが正常にインストールされたことを確認します。 
    ```
    oc get imagecontentsourcepolicy
    ```
    b. 以下のコマンドを実行して、`CatalogSource` リソースが正常にインストールされたことを確認します。
    ```
    oc get catalogsource -n openshift-marketplace
    ```

#### 6.確認
ここまで完了すると、OperatorHubに `NVIDIA GPU Operator` が表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/bc5f099b-39e5-842c-9beb-124425f3a25d.png)

この後、非接続でない環境と同じ手順（↓）で、各Operatorをインストールすることが可能です。

https://qiita.com/mizutan/items/055316c39f3c5bf78ed6

## 参考：関連コマンド

カタログイメージインデックスのリスト
```
# oc-mirror list operators --catalogs --version=4.12
Available OpenShift OperatorHub catalogs:
OpenShift 4.12:
registry.redhat.io/redhat/redhat-operator-index:v4.12
registry.redhat.io/redhat/certified-operator-index:v4.12
registry.redhat.io/redhat/community-operator-index:v4.12
registry.redhat.io/redhat/redhat-marketplace-index:v4.12
```
カタログイメージインデックス内のOperator名のリスト

```
# oc-mirror list operators --catalog=registry.redhat.io/redhat/certified-operator-index:v4.12 --version=4.12
NAME                                                 DISPLAY NAME                                                          DEFAULT CHANNEL
abinitio-runtime-operator                            Co>Operating System Runtime Operator                                  release-4.3
acc-operator                                         netapp-acc-operator                                                   stable
accuknox-operator-certified                          Accuknox Operator                                                     alpha
aci-containers-operator                              Cisco ACI Containers Operator                                         stable
aikit-operator                                       Intel® oneAPI AI Analytics Toolkit Operator                           alpha
ako-operator                                         AKO Operator                                                          stable
alloy                                                Alloy                                                                 alpha
anchore-engine                                       Anchore Engine Operator                                               alpha
antrea-operator-for-kubernetes                       Antrea Operator                                                       alpha
anzo-operator                                        Anzo Operator                                                         stable
anzograph-operator                                   AnzoGraph Operator                                                    stable
anzounstructured-operator                            Anzo Unstructured Operator                                            stable
app-insights-operator                                App Insights                                                          stable
appdynamics-cloud-operator                           Cisco AppDynamics Cloud Operator                                      alpha
appdynamics-operator                                 AppDynamics Operator for Kubernetes                                   alpha
aqua-operator-certified                              Aqua Security Operator                                                2022.4
bookkeeper-operator                                  BookKeeper Operator                                                   alpha
cass-operator                                        DataStax Kubernetes Operator for Apache Cassandra                     stable
ccm-node-agent-dcap-operator                         CCM Node Agent DCAP Operator                                          alpha
ccm-node-agent-operator                              CCM Node Agent Operator                                               alpha
cilium                                               Cilium                                                                1.15
cilium-enterprise                                    Isovalent Enterprise for Cilium                                       1.15
citrix-adc-istio-ingress-gateway-operator            Citrix ADC Istio Ingress Gateway Operator                             alpha
citrix-cpx-istio-sidecar-injector-operator           Citrix ADC CPX Istio Sidecar Injector Operator                        alpha
citrix-cpx-with-ingress-controller-operator          Citrix ADC CPX with Ingress Controller                                stable
citrix-ingress-controller-operator                   Citrix Ingress Controller                                             stable
cloud-native-postgresql                              EDB Postgres for Kubernetes                                           stable-v1.23
cloudbees-ci                                         CloudBees CI                                                          alpha
cloudcasa-operator                                   CloudCasa                                                             alpha
cloudnative-pg                                       CloudNativePG                                                         stable-v1
cnfv-operator                                        CloudNFV                                                              alpha
cockroachdb-certified                                CockroachDB Operator                                                  stable
confluent-for-kubernetes                             Confluent for Kubernetes                                              2.8
conjur-follower-operator                             Conjur Enterprise Follower Operator                                   stable
contrail-k8s-deployer                                contrail-k8s-deployer                                                 23.1.0
couchbase-enterprise-certified                       Couchbase Operator                                                    2.6.2
crunchy-postgres-operator                            Crunchy Postgres for Kubernetes                                       v5
cte-k8s-operator                                     CipherTrust Transparent Encryption for Kubernetes (CTE-K8s) Operator  stable
datadog-operator-certified                           Datadog Operator                                                      stable
dell-csi-operator-certified                          Dell CSI Operator                                                     stable
dell-csm-operator-certified                          Dell Container Storage Modules                                        stable
digitalai-deploy-operator                            Digital.ai Deploy                                                     beta
digitalai-release-operator                           Digital.ai Release                                                    beta
dynatrace-operator                                   Dynatrace Operator                                                    alpha
edgelabs-ai-sensor-operator                          Edgelabs AI Security                                                  alpha
eginnovations-operator                               eG Innovations Universal Agent Operator                               beta
elasticsearch-eck-operator-certified                 Elasticsearch (ECK) Operator                                          stable
entando-k8s-operator                                 Entando Operator                                                      stable
f5-bigip-ctlr-operator                               F5 Container Ingress Services                                         beta
federatorai-certified                                Federator.ai                                                          stable
fujitsu-enterprise-operator                          FUJITSU Enterprise Postgres 13 Operator                               stable-13
fujitsu-enterprise-postgres-operator                 Fujitsu Enterprise Postgres Operator                                  stable
fujitsu-enterprise-postgres-operator-with-cg-module  Fujitsu Enterprise Postgres Operator with Cryptographic Module        stable
function-mesh                                        Function Mesh Operator                                                alpha
gitlab-operator-kubernetes                           GitLab                                                                stable
gitlab-runner-operator                               GitLab Runner                                                         stable
gpu-operator-certified                               NVIDIA GPU Operator                                                   v24.3
habana-ai-operator                                   Habana AI                                                             stable
:

```
パッケージのCHANNELのリスト
```
# oc-mirror list operators --catalog=registry.redhat.io/redhat/certified-operator-index:v4.12 --package=gpu-operator-certified
NAME                    DISPLAY NAME         DEFAULT CHANNEL
gpu-operator-certified  NVIDIA GPU Operator  v24.3

PACKAGE                 CHANNEL  HEAD
gpu-operator-certified  stable   gpu-operator-certified.v24.3.0
gpu-operator-certified  v1.10    gpu-operator-certified.v1.10.1
gpu-operator-certified  v1.11    gpu-operator-certified.v1.11.1
gpu-operator-certified  v22.9    gpu-operator-certified.v22.9.2
gpu-operator-certified  v23.3    gpu-operator-certified.v23.3.2
gpu-operator-certified  v23.6    gpu-operator-certified.v23.6.1
gpu-operator-certified  v23.9    gpu-operator-certified.v23.9.2
gpu-operator-certified  v24.3    gpu-operator-certified.v24.3.0
```
OperatorHub からクラスターで利用できる Operator の一覧
```
# oc get packagemanifest -n openshift-marketplace
NAME                          CATALOG                      AGE
isf-operator                  IBM Storage Fusion Catalog   6d22h
nfd                                                        19h
gpu-operator-certified                                     117m
kubernetes-nmstate-operator   Red Hat Operators            6d22h
kubevirt-hyperconverged       Red Hat Operators            6d22h
redhat-oadp-operator          Red Hat Operators            6d22h
amq-streams                   Red Hat Operators            6d22h
```