OpenshiftのAPIを使ってみよう！

# ＜目次＞
本記事の目次は、下記の通りです。
１．背景
２．Openshift上へのアプリケーションをデプロイ方法
３．CLIでOpenshift上のアプリケーションの情報を取得してみる
４．APIでOpenshift上のアプリケーションの情報を取得してみる
5．本記事のまとめ

# １．背景
こんにちは、望月です。今回はRedhat Openshift Container Platformにデプロイしたアプリケーションの情報をAPIを使って取得する情報について執筆したいと思います。
最近、Openshift Container Platformを他の製品から操作することが出来ないか試行錯誤しているので、
その過程で得たOpenshift Container PlatformのAPIの利用方法をアウトプットしようと思い執筆した次第です。

# ２．Openshift上へのアプリケーションのデプロイ方法
まずは、Openshift上にアプリケーションをデプロイしてみましょう。アプリケーションをデプロイしないことには情報を取得するも何もありません。
今回は、こちらの[ハンズオン資料](https://github.com/IBMDeveloperTokyo/openshift-s2i-lab)を参考にOpenshift上にアプリケーションをデプロイしてみました。
上記のハンズオン資料に従えば、アプリケーションのデプロイを体験できます。この記事ではOpenshiftへのアプリケーションのデプロイ方法を解説しないので、アプリケーションのデプロイ方法について詳しく知りたい方は上記の資料を参考にしてください。

[ハンズオン資料](https://github.com/IBMDeveloperTokyo/openshift-s2i-lab)に従ってデプロイしてみると、Openshiftのwebコンソール上で以下のようにアプリケーションがデプロイされていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634669/76838581-6b5c-6967-1b55-e3152fac2623.png)

アプリケーションをデプロイできたので、実際にデプロイしたアプリケーションの情報を取得していきたいと思います。

# ３．CLIでOpenshift上のアプリケーションの情報を取得してみる
まずは、コマンドラインインターフェイス(CLI)を使用して、デプロイしたアプリケーションの情報を取得してみたいと思います。
今回はデプロイしたアプリケーションのpodの情報を取得します。
ちなみに、このpodの情報はOpenshiftのwebコンソール上でも確認できます。
以下の写真のようにwebコンソールのトポロジーの画面でデプロイしたアプリケーション(今回の場合は青い丸で囲まれたnode)の部分をクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634669/1bd6746b-bf05-9fa8-76be-30110fbd9075.png)

クリックしてみると、以下の写真のように画面右側にポップアップが出てきて、その中の赤い四角で囲まれた部分でPodの状態を確認することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634669/14db95a6-75ad-df45-1d26-ec5823576547.png)

**node-build-config-openshift-d6676bccd-hzjs2**というpodがRunnningしていることが確認できますね。
それでは、このPodの状態をコマンドラインインからも確認したいと思います。

まず、OpenshiftのCLIをインストールしていない方はこちらの[サイト](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.2/html/cli_tools/openshift-cli-oc)などを参考にCLIをインストールしましょう。
CLIをインストールしたら、[サイト](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.2/html/cli_tools/openshift-cli-oc)の「CLIへのログイン」の項目を参考にログインしましょう。
もしwebコンソールを開いている場合は、以下のように簡単にログインできます。

## webコンソールを利用したCLIへのログイン
webコンソールの右上にあるユーザー名をクリックしてみましょう。すると、以下の写真のようにポップアップが出てくるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634669/4d4add42-d406-9580-8b63-561a04c2ae66.png)
そのポップアップの**ログインコマンドのコピー**をクリックしてみます。すると、ログイン情報を求められた後に、以下の写真のようなDisplay Tokenのみが書かれた画面が映ると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634669/d7567666-6623-def9-ec36-0b680ee891d8.png)
左上のDisplay tokenをクリックすると今度はAPI tokenなどが記載された以下のような画面が表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634669/e44d4b89-d23a-c027-16fb-5f187407d95f.png)
認証情報やServerのURLは念の為マスキングしていますが、API tokenなどが記載されていることが確認できるかと思います。
この写真の真ん中の赤く囲まれた部分に書かれているコマンドをコピーしましょう。
そして、自身のPCのCLI(筆者の場合はmacなのでターミナル)を開いて、コピーしたコマンドをペーストして実行しましょう。

```terminal:実行したコマンド
oc login --token=<API token> --server=<serverのURL>
```
コマンドを実行し上手く行った場合、以下のようなResponseが返ってきます。
```terminal:上手く行った場合のResponse
Logged into <serverのURL> as <ユーザー名> using the token provided.

You have access to ~~ projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".
```
これでOpenshiftのCLIにログインが成功しました。

## Podの情報の取得
CLIにログインできたら、　アプリケーションをデプロイしたプロジェクトに移動しましょう。
CLIにログインした直後のdefaultのプロジェクトでは、目的のpodの情報を取得することが出来ません。こちらの[ハンズオン資料](https://github.com/IBMDeveloperTokyo/openshift-s2i-lab)でアプリケーションをデプロイした際に作成したプロジェクト名を確認してください。
(Developper Sandboxでアプリケーションをデプロイした場合はprojectを移動する必要はありません。)
プロジェクト名を確認したら、CLIで以下のコマンドを叩いてください。
```terminal:プロジェクトを移動するためのコマンド
oc project <プロジェクト名>
```
コマンドを実行して、きちんとプロジェクトを移動できたら以下のようなResponseが返ってくるはずです。
```terminal:Response
Now using project <プロジェクト名> on server <serverのURL>.
```

では、いよいよPodの情報を取得してみたいと思います。
以下のコマンドを叩いてみましょう。
```terminal:podの情報を取得するコマンド
oc get pod
```
コマンドがうまく実行できれば以下のようなResponseが返ってくるはずです。
```terminal:Podの情報に関するResponse
NAME                                          READY   STATUS      RESTARTS   AGE
node-build-config-openshift-1-build           0/1     Completed   0          124m
node-build-config-openshift-d6676bccd-hzjs2   1/1     Running     0          123m
```

Responseの内容と、webコンソール上で確認したpodの情報を見比べてみると、どちらも**node-build-config-openshift-d6676bccd-hzjs2**の状態がRuninngであることが確認できたと思います。

このように、CLIからもデプロイしたアプリケーションの情報を取得することが可能です。


# ４．APIでOpenshift上のアプリケーションの情報を取得してみる
CLIでPodの情報を取得することが出来たので、次は本題のOpenshiftのAPIを叩いてPodの情報を取得していきたいと思います。
とはいえ、ここまで実行できていれば非常に簡単にAPIを叩けます。
先程のようにwebコンソールからログインコマンドを確認しにいくと、以下のような画面が出てくると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634669/9e4abe2c-b2b2-a41d-a80c-66dfc85d63e0.png)
今度は、先程コピーしたログインコマンドの一個下の赤い枠で囲まれた部分を見てみましょう
ここでは、OpenshiftのAPIを叩く際に必要なAPIトークンやサーバーのURLを記載した状態のCurlのコマンドを表示しています。
あとはこのコマンドを参考に、ServerのURLを欲しい情報が得られるAPIのエンドポイントに変更すれば、CurlでOpenshift上のアプリケーションの情報を取得することが出来ます。
今回はPodの情報を得たいので、Podに関連するエンドポイントが記載された[このサイト](https://docs.openshift.com/container-platform/4.14/rest_api/workloads_apis/pod-v1.html#api-endpoints)を確認し、以下のエンドポイントを利用することにしました。

```tex:APIエンドポイント
<ServerのURL>/api/v1/namespaces/<プロジェクト名>/pods/<情報を取得したいPodの名前>/status
```

そして、上記のエンドポイントから情報を取得するために以下のCurlコマンドを実行しました。

```terminal:実行したCurlコマンド
curl -H "Authorization: Bearer <API token>" '<ServerのURL>/api/v1/namespaces/<プロジェクト名>/pods/node-build-config-openshift-d6676bccd-hzjs2/status' | jq '.status'

```

実行したCurlコマンドの最後にある「**jq~**」の部分 はレスポンスとして返ってくるJsonには余計な情報が非常に多いため、本当に確認したい情報だけを抽出するために使用しました。

上記のCurlコマンドを実行したところ以下のようなResponseが帰ってきました。
```json:APIエンドポイントからのResponse

{
  "phase": "Running",
  "conditions": [
    {
      "type": "Initialized",
      "status": "True",
      "lastProbeTime": null,
      "lastTransitionTime": "2023-12-27T12:53:28Z"
    },
    {
      "type": "Ready",
      "status": "True",
      "lastProbeTime": null,
      "lastTransitionTime": "2023-12-27T12:53:40Z"
    },
    {
      "type": "ContainersReady",
      "status": "True",
      "lastProbeTime": null,
      "lastTransitionTime": "2023-12-27T12:53:40Z"
    },
    {
      "type": "PodScheduled",
      "status": "True",
      "lastProbeTime": null,
      "lastTransitionTime": "2023-12-27T12:53:28Z"
    }
  ],
  "hostIP": "192.168.252.11",
  "podIP": "10.128.0.154",
  "podIPs": [
    {
      "ip": "10.128.0.154"
    }
  ],
  "startTime": "2023-12-27T12:53:28Z",
  "containerStatuses": [
    {
      "name": "node-build-config-openshift",
      "state": {
        "running": {
          "startedAt": "2023-12-27T12:53:40Z"
        }
      },
      "lastState": {},
      "ready": true,
      "restartCount": 0,
      "image": "image-registry.openshift-image-registry.svc:5000/qiita/node-build-config-openshift@sha256:8a4fc2c277a6ee9cd378b0e75e21aa5536eadfb5c00c42a7f3c46c0aeb59885c",
      "imageID": "image-registry.openshift-image-registry.svc:5000/qiita/node-build-config-openshift@sha256:8a4fc2c277a6ee9cd378b0e75e21aa5536eadfb5c00c42a7f3c46c0aeb59885c",
      "containerID": "cri-o://56e6aae3a718d2f1b5da6867cc3a80990b14384ead3c122276de7f27a79c07ca",
      "started": true
    }
  ],
  "qosClass": "BestEffort"
}
```

Responseの中のPhaseがRunningであることから、
「**node-build-config-openshift-d6676bccd-hzjs2**」の状態がRunningであることをAPIを叩いても確認することができました。


# 5．本記事のまとめ
ここまで、Openshift上のアプリケーションの情報をAPIを叩くなどして確認する方法を説明してきました。
現在、私はこのOpenshiftのAPIを活用して、チャットボット上でOpenshift上のアプリケーションの情報を確認したり、アプリケーションのトラブルを解消したりすることが出来ないか試行錯誤中です。
もし上記のアイデア実現したら、この記事の続きとして改めて投稿したいと思います。





# 参考文献

### openshift-s2i-lab
https://github.com/IBMDeveloperTokyo/openshift-s2i-lab/tree/main

### 　Red Hat Customer Portal - CLIツール 第1章 OpenShift CLI (oc)
https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.2/html/cli_tools/openshift-cli-oc

### Red Hat Openshift - Dcumentation - API reference
https://docs.openshift.com/container-platform/4.14/rest_api/workloads_apis/pod-v1.html#api-endpoints