6.2. Validation サービスのカスタムルールの作成
Validation
サービスは Open Policy Agent (OPA) ポリシールールを使用して、移行に対する各仮想マシン (VM) の適合性を確認します。Validation
サービスは、各仮想マシンの concerns リストを生成します。これは、Provider Inventory
サービスに仮想マシン属性として保存されます。Web コンソールには、プロバイダーインベントリー内の各仮想マシンの concerns が表示されます。
カスタムルールを作成して、Validation
サービスのデフォルトルールセットを拡張できます。たとえば、仮想マシンに複数のディスクがあるかどうかを確認するルールを作成できます。
6.2.1. Rego ファイルについて リンクのコピーリンクがクリップボードにコピーされました!
検証ルールは、Open Policy Agent (OPA) のネイティブクエリー言語である Rego で記述されます。ルールは、Validation
Pod の /usr/share/opa/policies/io/konveyor/forklift/<provider>
ディレクトリーに .rego
ファイルとして保存されます。
各検証ルールは、個別の .rego
ファイルに定義され、特定の条件をテストします。条件が true
と評価された場合、ルールは {“category", “label", “assessment"}
ハッシュを concerns
に追加します。concerns
のコンテンツは、仮想マシンのインベントリーレコードの concerns
キーに追加されます。Web コンソールには、プロバイダーインベントリー内の各仮想マシンの concerns
キーのコンテンツが表示されます。
次の .rego
ファイルの例では、VMware 仮想マシンのクラスターで有効になっている分散リソーススケジューリングを確認します。
drs_enabled.rego の例
6.2.2. デフォルトの検証ルールの確認 リンクのコピーリンクがクリップボードにコピーされました!
カスタムルールを作成する前に、Validation
サービスのデフォルトルールを確認して、既存のデフォルト値を再定義するルールを作成しないようにする必要があります。
例: デフォルトのルールに default valid_input = false
の行が含まれていて、default valid_input = true
の行が含まれるカスタムルールを作成した場合、Validation
サービスは起動しません。
手順
Validation
Pod のターミナルに接続します。oc rsh <validation_pod>
$ oc rsh <validation_pod>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロバイダーの OPA ポリシーディレクトリーに移動します。
cd /usr/share/opa/policies/io/konveyor/forklift/<provider>
$ cd /usr/share/opa/policies/io/konveyor/forklift/<provider>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
vmware
またはovirt
を指定します。
デフォルトポリシーを検索します。
grep -R "default" *
$ grep -R "default" *
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.3. 検証ルールの作成 リンクのコピーリンクがクリップボードにコピーされました!
ルールを含む設定マップカスタムリソース (CR) を Validation
サービスに適用して、検証ルールを作成します。
-
既存のルールと同じ 名前 でルールを作成すると、
Validation
サービスは、それらのルールでOR
操作を実行します。 -
デフォルトのルールと矛盾するルールを作成すると、
Validation
サービスは開始しません。
検証ルールの例
検証ルールは、Provider Inventory
サービスが収集する仮想マシン (VM) 属性に基づいています。
たとえば、VMware API はこのパス (MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"]
) を使用して、VMware 仮想マシンに NUMA ノードアフィニティーが設定されているかどうかを確認します。
Provider Inventory
サービスは、この設定を簡素化し、テスト可能な属性を、リストの値で返します。
"numaNodeAffinity": [ "0", "1" ],
"numaNodeAffinity": [
"0",
"1"
],
この属性に基づいて Rego クエリーを作成し、それを forklift-validation-config
設定マップに追加します。
`count(input.numaNodeAffinity) != 0`
`count(input.numaNodeAffinity) != 0`
手順
以下の例に従って設定マップ CR を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow forklift-controller
デプロイメントを0
にスケーリングして、Validation
Pod を停止します。oc scale -n openshift-mtv --replicas=0 deployment/forklift-controller
$ oc scale -n openshift-mtv --replicas=0 deployment/forklift-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow forklift-controller
デプロイメントを1
にスケーリングして、Validation
Pod を起動します。oc scale -n openshift-mtv --replicas=1 deployment/forklift-controller
$ oc scale -n openshift-mtv --replicas=1 deployment/forklift-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Validation
Pod ログをチェックして、Pod が起動したことを確認します。oc logs -f <validation_pod>
$ oc logs -f <validation_pod>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムルールがデフォルトのルールと競合する場合、
Validation
Pod は起動しません。移行元プロバイダーを削除します。
oc delete provider <provider> -n openshift-mtv
$ oc delete provider <provider> -n openshift-mtv
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 移行元プロバイダーを追加して、新規ルールを適用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
カスタムルールを作成した後、ルールのバージョンを更新して、Inventory
サービスが変更を検出し、仮想マシンを検証できるようにする必要があります。
6.2.4. インベントリールールバージョンの更新 リンクのコピーリンクがクリップボードにコピーされました!
Provider Inventory
サービスが変更を検出して Validation
サービスをトリガーするように、ルールを更新するたびにインベントリールールのバージョンを更新する必要があります。
ルールバージョンは、各プロバイダーの rules_version.rego
ファイルに記録されます。
手順
現在のルールバージョンを取得します。
GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version
$ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
{ "result": { "rules_version": 5 } }
{ "result": { "rules_version": 5 } }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Validation
Pod のターミナルに接続します。oc rsh <validation_pod>
$ oc rsh <validation_pod>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
/usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego
ファイルでルールバージョンを更新します。 -
Validation
Pod ターミナルからログアウトします。 更新されたルールバージョンを検証します。
GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version
$ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
{ "result": { "rules_version": 6 } }
{ "result": { "rules_version": 6 } }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow