Ponz Dev Log

ゆるくてマイペースな開発日記

OpenShift WebコンソールのTopologyビューに出てくるアイコン画像の指定方法

OpenShift Web ConsoleでTopologyビューを眺めると、 Deployment、DeamonSet、StatefulSetといったワークロードにアイコンが表示されます。

テンプレートやHelmチャートでアプリケーションをデプロイした時は、 アイコン画像(以下の画像は公式ドキュメントに載っているもの)が出てきて素敵ですよね。

Application トポロジー

しかし、自前で適用するマニフェストの場合はデフォルトのアイコンが表示されます。 どの言語で何のフレームワークを使っているか一目で分かった方がカッコいいですよね。 そこでTopologyビューをかっこよく表示するために、アイコン画像の指定方法を探しました。

ドキュメント曰く

OpenShiftのドキュメント 2.1.5.2.7. Topology ビューに使用するラベルとアノテーション では、アイコン画像の指定方法は以下のように記載されています。

ノードに表示されるアイコン
ノードのアイコンは、最初に app.openshift.io/runtime ラベルを使用してから app.kubernetes.io/name ラベルを使用して一致するアイコンを検索して定義されます。このマッチングは、事前定義されたアイコンセットを使用して行われます。

ラベルをつければ良いだけでした。単純ですね。

それでは、 事前定義されたアイコンセットってどこにあるのでしょうか?何を指定すれば良いのでしょうか?

アイコンセットの場所

ネットの海を探したところ、以下の記事がヒットしました。OpenShift WebコンソールのGitHubリポジトリで、アイコンセットを定義したファイルを見ることが手っ取り早いようです。

https://gexperts.com/wp/empowering-developers-in-the-openshift-console/

Label app.openshift.io/runtime
...The topology view uses this to render the icon. A list of icons that are available in OpenShift can be found in github in the OpenShift console repo in the catalog-item-icon.tsx file. Note that you should select the branch that matches your OpenShift version, i.e. the “release-4.5” branch for OCP 4.5.

OpenShiftのバージョンに対応したブランチで該当ファイルを見てみます。

github.com

以下のようにKey-ValueのMapクラスに定義してありました。release-4.7 ブランチでは合計95種類のアイコンが定義されています。

この定義の後に記述されているTypescriptのコードを読み解く限り、 Mapのキーの文字列からプレフィックスicon- を除いた部分を、先のラベル(app.openshift.io/runtime)の値に指定すれば良いです。

const logos = new Map<string, any>()
  .set('icon-3scale', threeScaleImg)
  .set('icon-aerogear', aerogearImg)
  .set('icon-amq', amqImg)
  .set('icon-angularjs', angularjsImg)
  .set('icon-ansible', ansibleImg)
  .set('icon-apache', apacheImg)
  .set('icon-beaker', beakerImg)
  .set('icon-camel', camelImg)
  .set('icon-capedwarf', capedwarfImg)
  .set(...);

実際にアイコンを指定してみる

実際にアイコンを指定してみます。 今回はOpenShift Developer Sandboxで検証しました。

まずはoc new-appを実行してDeploymentにラベル指定しない場合です。 この場合はアイコン画像がデフォルト値(OpenShiftのアイコン)になります。

$ oc new-app liberty-oc-sample
...(中略)...
--> Creating resources ...
    deployment.apps "liberty-oc-sample" created
    service "liberty-oc-sample" created
--> Success

$ oc get deployment.apps/liberty-oc-sample --show-labels
NAME                READY   UP-TO-DATE   AVAILABLE   AGE     LABELS
liberty-oc-sample   1/1     1            1           4m46s   app.kubernetes.io/component=liberty-oc-sample,app.kubernetes.io/instance=liberty-oc-sample,app=liberty-oc-sample

f:id:accelerk:20210626175250p:plain
OpenShiftデフォルトのアイコンが表示される

続いてDeploymentにラベルを指定してアイコン画像を指定します。 デプロイしたアプリはJavaで作成したので、アイコンセットから app.openshift.io/runtime=java を指定します。 TopologyビューにはJavaのマスコットのDukeくんが表示されてますね。可愛いです。

$ oc label deployment.apps liberty-oc-sample app.openshift.io/runtime=java
deployment.apps/liberty-oc-sample labeled

f:id:accelerk:20210626175333p:plain
runtime=javaを指定した場合

また、このアプリはOpenLibertyで動作するアプリケーションでもあります。 OpenLibertyもアイコンセットにアイコン画像が定義されているので、app.openshift.io/runtime=openliberty を指定します。 TopologyビューにOpenLibertyのUFOアイコンが即時反映されました。

$ oc label deployment.apps liberty-oc-sample app.openshift.io/runtime=openliberty --overwrite
deployment.apps/liberty-oc-sample labeled

f:id:accelerk:20210626175404p:plain
runtime=openlibertyを指定した場合

ちなみにアイコンセットに定義されていないラベル名を誤って指定した場合は、 デフォルトのOpenShiftのアイコンになりました。

$ oc label deployment.apps liberty-oc-sample app.openshift.io/runtime=invalid --overwrite
deployment.apps/liberty-oc-sample labeled

f:id:accelerk:20210626175427p:plain
runtime=invalidを指定した場合


以上。