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 の例
package io.konveyor.forklift.vmware
has_drs_enabled {
input.host.cluster.drsEnabled
}
concerns[flag] {
has_drs_enabled
flag := {
"category": "Information",
"label": "VM running in a DRS-enabled cluster",
"assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
}
}
6.2.2. デフォルトの検証ルールの確認 リンクのコピーリンクがクリップボードにコピーされました!
カスタムルールを作成する前に、Validation サービスのデフォルトルールを確認して、既存のデフォルト値を再定義するルールを作成しないようにする必要があります。
例: デフォルトのルールに default valid_input = false の行が含まれていて、default valid_input = true の行が含まれるカスタムルールを作成した場合、Validation サービスは起動しません。
手順
ValidationPod のターミナルに接続します。$ oc rsh <validation_pod>プロバイダーの OPA ポリシーディレクトリーに移動します。
$ cd /usr/share/opa/policies/io/konveyor/forklift/<provider>1 - 1
vmwareまたはovirtを指定します。
デフォルトポリシーを検索します。
$ grep -R "default" *
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"
],
この属性に基づいて Rego クエリーを作成し、それを forklift-validation-config 設定マップに追加します。
`count(input.numaNodeAffinity) != 0`
手順
以下の例に従って設定マップ CR を作成します。
$ cat << EOF | oc apply -f - apiVersion: v1 kind: ConfigMap metadata: name: <forklift-validation-config> namespace: openshift-mtv data: vmware_multiple_disks.rego: |- package <provider_package>1 has_multiple_disks {2 count(input.disks) > 1 } concerns[flag] { has_multiple_disks3 flag := { "category": "<Information>",4 "label": "Multiple disks detected", "assessment": "Multiple disks detected on this VM." } } EOFforklift-controllerデプロイメントを0にスケーリングして、ValidationPod を停止します。$ oc scale -n openshift-mtv --replicas=0 deployment/forklift-controllerforklift-controllerデプロイメントを1にスケーリングして、ValidationPod を起動します。$ oc scale -n openshift-mtv --replicas=1 deployment/forklift-controllerValidationPod ログをチェックして、Pod が起動したことを確認します。$ oc logs -f <validation_pod>カスタムルールがデフォルトのルールと競合する場合、
ValidationPod は起動しません。移行元プロバイダーを削除します。
$ oc delete provider <provider> -n openshift-mtv移行元プロバイダーを追加して、新規ルールを適用します。
$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Provider metadata: name: <provider> namespace: openshift-mtv spec: type: <provider_type>1 url: <api_end_point>2 secret: name: <secret>3 namespace: openshift-mtv EOF
カスタムルールを作成した後、ルールのバージョンを更新して、Inventory サービスが変更を検出し、仮想マシンを検証できるようにする必要があります。
6.2.4. インベントリールールバージョンの更新 リンクのコピーリンクがクリップボードにコピーされました!
Provider Inventory サービスが変更を検出して Validation サービスをトリガーするように、ルールを更新するたびにインベントリールールのバージョンを更新する必要があります。
ルールバージョンは、各プロバイダーの rules_version.rego ファイルに記録されます。
手順
現在のルールバージョンを取得します。
$ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version1 出力例
{ "result": { "rules_version": 5 } }ValidationPod のターミナルに接続します。$ oc rsh <validation_pod>-
/usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.regoファイルでルールバージョンを更新します。 -
ValidationPod ターミナルからログアウトします。 更新されたルールバージョンを検証します。
$ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version1 出力例
{ "result": { "rules_version": 6 } }