Menu Close
Settings Close

Language and Page Formatting Options

12.5. スコアカードを使用した Operator の検証

Operator の作成者は、Operator が適切にパッケージ化されていることと、構文エラーがないことを確認する必要があります。Operator の作成者は、Operator SDK のスコアカードツールを使用して Operator のパッケージ化を検証し、テストを実行できます。

注記

OpenShift Container Platform 4.4 は Operator SDK v0.15.0 をサポートします。

12.5.1. スコアカードツールについて

Operator を検証するには、Operator SDK のスコアカードツールを、関連するカスタムリソース (CR) および Operator に必要なすべてのリソースを作成して開始します。スコアカードは、その後に API サーバーへの呼び出しを記録し、一部のテストを実行するために使用されるプロキシーコンテナーを Operator の Deployment に作成します。実行されるテストは CR の一部のパラメーターも検査します。

12.5.2. スコアカードの設定

スコアカードツールでは、内部プラグインの設定を可能にする設定ファイルと、複数のグローバル設定オプションを使用します。

12.5.2.1. 設定ファイル

スコアカードツールの設定のデフォルトの場所は <project_dir>/.osdk-scorecard.* です。以下は、YAML 形式の設定ファイルの例になります。

スコアカード設定ファイル

scorecard:
  output: json
  plugins:
    - basic: 1
        cr-manifest:
          - "deploy/crds/cache.example.com_v1alpha1_memcached_cr.yaml"
          - "deploy/crds/cache.example.com_v1alpha1_memcachedrs_cr.yaml"
    - olm: 2
        cr-manifest:
          - "deploy/crds/cache.example.com_v1alpha1_memcached_cr.yaml"
          - "deploy/crds/cache.example.com_v1alpha1_memcachedrs_cr.yaml"
        csv-path: "deploy/olm-catalog/memcached-operator/0.0.3/memcached-operator.v0.0.3.clusterserviceversion.yaml"

1
2 つの CR をテストするために設定された basic テスト。
2
2 つの CR をテストするために設定された olm テスト。

グローバルオプションの設定方法の優先度は最も高いものから低いものへの順になります。

コマンド引数(利用可能な場合)→ 設定ファイル → デフォルト

設定ファイルは YAML 形式である必要があります。設定ファイルは、今後すべての operator-sdk サブコマンドの設定を許可するように拡張される可能性があるため、スコアカードの設定は scorecard サブセクションの下に置く必要があります。

注記

設定ファイルのサポートは viper パッケージで提供されます。viper 設定がどのように機能するかについての詳細は、viper パッケージの README を参照してください。

12.5.2.2. コマンド引数

ほとんどのスコアカードツールの設定は設定ファイルを使用して行われますが、以下の引数を使用することもできます。

表12.13 スコアカードツール引数

フラグタイプ説明

--bundle, -b

string

バンドル検証テストに使用するバンドルディレクトリーへのパス。

--config

string

スコアカード設定ファイルへのパス。デフォルトは <project_dir>/.osdk-scorecard です。ファイルタイプおよび拡張子は .yaml である必要があります。設定ファイルが指定されていないか、デフォルトの場所にある場合は、エラーを出して終了します。

--output, -o

string

出力形式有効なオプションは text および json です。デフォルトの形式は text です。これは人間が判読できることを目的として設計されています。json 形式は、後に定義されるプラグインに使用される JSON スキーマ出力形式を使用します。

--kubeconfig, -o

string

kubeconfig ファイルへのパス。内部プラグインの kubeconfig を設定します。

--version

string

実行するスコアカードのバージョン。デフォルトおよび唯一の有効なオプションは v1alpha2 です。

--selector, -l

string

テストのフィルターに使用するラベルセレクター。

--list, -L

bool

true の場合、セレクターのフィルターに基づいて実行されるテスト名のみを出力します。

12.5.2.3. 設定ファイルのオプション

スコアカード設定ファイルは以下のオプションを提供します。

表12.14 スコアカード設定ファイルのオプション

オプションタイプ説明

bundle

string

--bundle フラグと同等です。OLM バンドルディレクトリーパス (指定されている場合) はバンドルの検証を実行します。

output

string

--output フラグと同等です。このオプションが設定ファイルとフラグの両方で定義されている場合、フラグの値が優先されます。

kubeconfig

string

--kubeconfig フラグと同等です。このオプションが設定ファイルとフラグの両方で定義されている場合、フラグの値が優先されます。

plugins

array

プラグイン名の配列。

12.5.2.3.1. 基本的なプラグインおよび OLM プラグイン

スコアボードは、内部の basic プラグインおよび olm プラグインをサポートします。これは、設定ファイルの plugins セクションで設定されます。

表12.15 プラグインオプション

オプションタイプ説明

cr-manifest

[]string

テストされる CR のパス。olm-deployed が設定されていないか、または false の場合に必要です。

csv-path

string

Operator の CSV へのパス。OLM テストまたは olm-deployedtrue に設定されている場合に必要です。

olm-deployed

bool

CSV および関連する CRD が OLM によってクラスターにデプロイされていることを示します。

kubeconfig

string

kubeconfig ファイルへのパス。グローバルの kubeconfig とこのフィールドの両方が設定されている場合、このフィールドはプラグインに使用されます。

namespace

string

プラグインを実行する namespace。設定されていない場合、kubeconfig ファイルで指定されるデフォルトが使用されます。

init-timeout

int

Operator の初期化時のタイムアウトまでの時間(秒単位)。

crds-dir

string

クラスターにデプロイする必要のある CRD が含まれるディレクトリーへのパス。

namespaced-manifest

string

namespace 内で実行されるすべてのリソースが含まれるマニフェストファイル。デフォルトで、スコアカードは、service_account.yamlrole.yamlrole_binding.yaml、および operator.yaml ファイルを統合し、deploy ディレクトリーから、namespace を使用したマニフェストとして使用する一時的なマニフェストに移動します。

global-manifest

文字列

グローバルに実行される必須リソースが含まれるマニフェスト (namespace を使用したマニフェストではない)。デフォルトで、スコアカードは crds-dir ディレクトリーのすべての CRD を、グローバルマニフェストとして使用する一時的なマニフェストに統合します。

注記

現在、CSV でスコアカードを使用しても、複数の CR マニフェストを CLI、設定ファイル、または CSV アノテーションを使用して設定することはできません。Operator をクラスターで破棄し、再デプロイし、テストされる各 CR のスコアカードを再実行する必要があります。

追加リソース

  • cr-manifest または CSV の metadata.annotations['alm-examples'] のいずれかを設定し、CR をスコアカードに提供できますが、これらの両方を設定することはできません。詳細は、「CRD テンプレート」を参照してください。

12.5.3. 実行されるテスト

デフォルトでは、スコアカードツールには実行可能な 8 つの内部テストがあり、これらは 2 つの内部プラグインで利用できます。複数の CR がプラグインに対して指定される場合、各 CR がクリーンなテスト環境を取得できるように、テスト環境は完全にクリーンアップされます。

各テストには、テストを一意に識別する短縮名があります。これは、実行する特定のテストを選択する場合に役立ちます。以下は例になります。

$ operator-sdk scorecard -o text --selector=test=checkspectest
$ operator-sdk scorecard -o text --selector='test in (checkspectest,checkstatustest)'

12.5.3.1. 基本的なプラグイン

以下の基本的な Operator テストは、basic プラグインから入手できます。

表12.16 basic プラグインのテスト

テスト説明短縮名

Spec Block Exists

このテストは、クラスターで作成されたカスタムリソースをチェックし、すべての CR に spec ブロックがあることを確認します。このテストの最大スコアは 1 です。

checkspectest

Status Block Exists

このテストは、クラスターで作成されたカスタムリソースをチェックし、すべての CR に status ブロックがあることを確認します。このテストの最大スコアは 1 です。

checkstatustest

Writing Into CRs Has An Effect

このテストは、スコアカードプロキシーのログを読み取り、Operator が PUT または POST、またはその両方を API サーバーに対して要求していることを検証します。これは、リソースが変更されていることを示します。このテストの最大スコアは 1 です。

writingintocrshaseffecttest

12.5.3.2. OLM プラグイン

olm プラグインから、以下の OLM 統合テストを利用できます。

テスト説明短縮名

OLM Bundle Validation

このテストは、バンドルフラグで指定されたバンドルディレクトリーにある OLM バンドルマニフェストを検証します。バンドルの内容にエラーが含まれる場合、テスト結果の出力には検証ログと検証ライブラリーからのエラーメッセージが含まれます。

bundlevalidationtest

Provided APIs Have Validation

このテストは、提供された CR の CRD に検証セクションが含まれ、CR で検出される各 spec および status フィールドの検証があることを確認します。このテストの最大スコアは、cr-manifest オプションによって提供される CR 数と等しくなります。

crdshavevalidationtest

Owned CRDs Have Resources Listed

このテストでは、cr-manifest オプションが提供する各 CR の CRD に、CSV の owned CRD セクションの resources サブセクションがあることを確認します。テストで resources セクションに一覧表示されていない使用済みのリソースを検出する場合、テストの最後にある提案にそれらのリソースを一覧表示します。このテストの最大スコアは、cr-manifest オプションによって提供される CR 数と等しくなります。

crdshaveresourcestest

Spec Fields With Descriptors

このテストは、カスタムリソースの spec セクションのすべてのフィールドに、CSV に一覧表示される対応する記述子があることを確認します。このテストの最大スコアは、cr-manifest オプションで渡される各カスタムリソースの spec セクションにあるフィールドの合計数と等しくなります。

specdescriptorstest

Status Fields With Descriptors

このテストは、カスタムリソースの status セクションのすべてのフィールドに CSV に一覧表示される対応する記述子があることを確認します。このテストの最大スコアは、cr-manifest オプションで渡される各カスタムリソースの status セクションのフィールドの合計数と等しくなります。

statusdescriptorstest

追加リソース

12.5.4. スコアカードの実行

前提条件

Operator プロジェクトの以下の前提条件は、スコアカードツールでチェックされます。

  • Kubernetes 1.11.3 以降を実行するクラスターへのアクセス。
  • スコアカードを使用して Operator Lifecycle Manager (OLM) でOperator プロジェクトの統合をチェックする必要がある場合、ClusterServiceVersion (CSV) ファイルも必要になります。これは、olm-deployed オプションを使用する場合の要件です。
  • Operator SDK を使用して生成されなかった Operator (SDK Operator 以外) の場合:

    • Operator および CR のインストールおよび設定用のリソースマニフェスト。
    • clientcmd または controller-runtime 設定 getter などの KUBECONFIG 環境変数からの読み取りをサポートする設定 getter。これは、スコアカードプロキシーが正常に機能するために必要になります。

手順

  1. .osdk-scorecard.yaml 設定ファイルを Operator プロジェクトで定義します。
  2. RBAC ファイル (role_binding) で定義される namespace を作成します。
  3. Operator プロジェクトのルートディレクトリーからスコアカードを実行します。

    $ operator-sdk scorecard

    実行されたテキストのいずれかがパスしなかった場合、スコアカードのリターンコードは 1 になり、選択したすべてのテストにパスすると 0 になります。

12.5.5. OLM 管理の Operator を使用したスコアカードの実行

スコアカードは ClusterServiceVersion (CSV) を使用して実行でき、クラスター対応および SDK 以外の Operator をテストする方法を提供します。

手順

  1. スコアカードでは、Operator のログを読み取るために、Operator の Deployment Pod にプロキシーコンテナーが必要になります。OLM で Operator をデプロイする に、CSV の変更および 1 つの追加オブジェクトの作成が必要になります。

    この手順は、bash 関数を使用して、手動または自動で実行できます。以下の方法のいずれかを選択します。

    • 手動の方法:

      1. ローカル kubeconfig を含むプロキシーサーバーシークレットを作成します。

        1. スコアカードプロキシーの namespace を使用した所有者参照を使用してユーザー名を生成します。

          $ echo '{"apiVersion":"","kind":"","name":"scorecard","uid":"","Namespace":"'<namespace>'"}' | base64 -w 0 1
          1
          <namespace> を Operator がデプロイに使用する namespace に置き換えます。
        2. 以下のテンプレートを使用して Config マニフェスト scorecard-config.yaml を作成し、 <username> を直前の手順で生成される base64 ユーザー名に置き換えます。

          apiVersion: v1
          kind: Config
          clusters:
          - cluster:
              insecure-skip-tls-verify: true
              server: http://<username>@localhost:8889
            name: proxy-server
          contexts:
          - context:
              cluster: proxy-server
              user: admin/proxy-server
            name: <namespace>/proxy-server
          current-context: <namespace>/proxy-server
          preferences: {}
          users:
          - name: admin/proxy-server
            user:
              username: <username>
              password: unused
        3. Config を base64 としてエンコードします。

          $ cat scorecard-config.yaml | base64 -w 0
        4. Secret マニフェストの -secret.yaml を作成します。

          apiVersion: v1
          kind: Secret
          metadata:
            name: scorecard-kubeconfig
            namespace: <namespace> 1
          data:
            kubeconfig: <kubeconfig_base64> 2
          1
          <namespace> を Operator がデプロイに使用する namespace に置き換えます。
          2
          <kubeconfig_base64> を、base64 としてエンコードされる Config に置き換えます。
        5. シークレットを適用します。

          $ oc apply -f scorecard-secret.yaml
        6. Secret を参照するボリュームを Operator の Deployment に挿入します。

          spec:
            install:
              spec:
                deployments:
                - name: memcached-operator
                  spec:
                    ...
                    template:
                      ...
                      spec:
                        containers:
                        ...
                        volumes:
                        - name: scorecard-kubeconfig 1
                          secret:
                            secretName: scorecard-kubeconfig
                            items:
                            - key: kubeconfig
                              path: config
          1
          スコアカードの kubeconfig ボリューム。
      2. ボリュームマウントおよび KUBECONFIG 環境変数を Operator の Deployment の各コンテナーに挿入します。

        spec:
          install:
            spec:
              deployments:
              - name: memcached-operator
                spec:
                  ...
                  template:
                    ...
                    spec:
                      containers:
                      - name: container1
                        ...
                        volumeMounts:
                        - name: scorecard-kubeconfig 1
                          mountPath: /scorecard-secret
                        env:
                        - name: KUBECONFIG 2
                          value: /scorecard-secret/config
                      - name: container2 3
                        ...
        1
        スコアカードの kubeconfig ボリュームマウント。
        2
        スコアカードの kubeconfig 環境変数。
        3
        これと同じ手順を他のコンテナーについても繰り返します。
      3. スコアカードプロキシーコンテナーを Operator の Deployment に挿入します。

        spec:
          install:
            spec:
              deployments:
              - name: memcached-operator
                spec:
                  ...
                  template:
                    ...
                    spec:
                      containers:
                      ...
                      - name: scorecard-proxy 1
                        command:
                        - scorecard-proxy
                        env:
                        - name: WATCH_NAMESPACE
                          valueFrom:
                            fieldRef:
                              apiVersion: v1
                              fieldPath: metadata.namespace
                        image: quay.io/operator-framework/scorecard-proxy:master
                        imagePullPolicy: Always
                        ports:
                        - name: proxy
                          containerPort: 8889
        1
        スコアカードプロキシーコンテナー。
    • 自動的な方法:

      community-operators リポジトリーには、直前の手順を実行できるいくつかの bash 関数が含まれます。

      $ curl -Lo csv-manifest-modifiers.sh \
          https://raw.githubusercontent.com/operator-framework/community-operators/master/scripts/lib/file
      $ . ./csv-manifest-modifiers.sh
      $ create_kubeconfig_secret_file scorecard-secret.yaml "<namespace>" 1
      $ oc apply -f scorecard-secret.yaml
      $ insert_kubeconfig_volume "<csv_file>" 2
      $ insert_kubeconfig_secret_mount "<csv_file>"
      $ insert_proxy_container "<csv_file>" "quay.io/operator-framework/scorecard-proxy:master"
      1
      <namespace> を Operator がデプロイに使用する namespace に置き換えます。
      2
      <csv_file> を、Operator の CSV マニフェストへのパスに置き換えます。
  2. プロキシーコンテナーの挿入後に、「Operator SDK の使用を開始する」の手順に従い、CSV および CRD をバンドルし、Operator を OLM にデプロイします。
  3. Operator が OLM にデプロイされた後に、.osdk-scorecard.yaml 設定ファイルを Operator プロジェクトに定義し、csv-path: <csv_manifest_path> および olm-deployed オプションの両方が設定されていることを確認します。
  4. csv-path: <csv_manifest_path> および olm-deployed オプションの両方をスコアカード設定ファイルに設定した状態でスコアカードを実行します。

    $ operator-sdk scorecard