12.2. Validation サービスのカスタムルールの作成
Validation
サービスは Open Policy Agent (OPA) ポリシールールを使用して、移行に対する各仮想マシン (VM) の適合性を確認します。Validation
サービスは、各仮想マシンの concerns リストを生成します。これは、Provider Inventory
サービスに仮想マシン属性として保存されます。Web コンソールには、プロバイダーインベントリー内の各仮想マシンの concerns が表示されます。
カスタムルールを作成して、Validation
サービスのデフォルトルールセットを拡張できます。たとえば、仮想マシンに複数のディスクがあるかどうかを確認するルールを作成できます。
12.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." } }
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."
}
}
12.2.2. デフォルトの検証ルールの確認
カスタムルールを作成する前に、Validation
サービスのデフォルトルールを確認して、既存のデフォルト値を再定義するルールを作成しないようにする必要があります。
例: デフォルトのルールに default valid_input = false
の行が含まれていて、default valid_input = true
の行が含まれるカスタムルールを作成した場合、Validation
サービスは起動しません。
手順
Validation
Pod のターミナルに接続します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rsh <validation_pod>
$ oc rsh <validation_pod>
プロバイダーの OPA ポリシーディレクトリーに移動します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cd /usr/share/opa/policies/io/konveyor/forklift/<provider>
$ cd /usr/share/opa/policies/io/konveyor/forklift/<provider>
1 - 1
vmware
またはovirt
を指定します。
デフォルトポリシーを検索します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow grep -R "default" *
$ grep -R "default" *
12.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 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> has_multiple_disks { count(input.disks) > 1 } concerns[flag] { has_multiple_disks flag := { "category": "<Information>", "label": "Multiple disks detected", "assessment": "Multiple disks detected on this VM." } } EOF
$ 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_disks
3 flag := { "category": "<Information>",
4 "label": "Multiple disks detected", "assessment": "Multiple disks detected on this VM." } } EOF
forklift-controller
デプロイメントを0
にスケーリングして、Validation
Pod を停止します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale -n openshift-mtv --replicas=0 deployment/forklift-controller
$ oc scale -n openshift-mtv --replicas=0 deployment/forklift-controller
forklift-controller
デプロイメントを1
にスケーリングして、Validation
Pod を起動します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale -n openshift-mtv --replicas=1 deployment/forklift-controller
$ oc scale -n openshift-mtv --replicas=1 deployment/forklift-controller
Validation
Pod ログをチェックして、Pod が起動したことを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc logs -f <validation_pod>
$ oc logs -f <validation_pod>
カスタムルールがデフォルトのルールと競合する場合、
Validation
Pod は起動しません。移行元プロバイダーを削除します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete provider <provider> -n openshift-mtv
$ oc delete provider <provider> -n openshift-mtv
移行元プロバイダーを追加して、新規ルールを適用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Provider metadata: name: <provider> namespace: openshift-mtv spec: type: <provider_type> url: <api_end_point> secret: name: <secret> namespace: openshift-mtv EOF
$ 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
サービスが変更を検出し、仮想マシンを検証できるようにする必要があります。
12.2.4. インベントリールールバージョンの更新
Provider Inventory
サービスが変更を検出して Validation
サービスをトリガーするように、ルールを更新するたびにインベントリールールのバージョンを更新する必要があります。
ルールバージョンは、各プロバイダーの rules_version.rego
ファイルに記録されます。
手順
現在のルールバージョンを取得します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 } }
Validation
Pod のターミナルに接続します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rsh <validation_pod>
$ oc rsh <validation_pod>
-
/usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego
ファイルでルールバージョンを更新します。 -
Validation
Pod ターミナルからログアウトします。 更新されたルールバージョンを検証します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 } }