6.2. Validation 서비스에 대한 사용자 지정 규칙 생성
유효성 검사
서비스는 OCI(Open Policy Agent) 정책 규칙을 사용하여 마이그레이션을 위한 각 VM(가상 머신)의 적합성을 확인합니다. 유효성 검사
서비스는 공급자 인벤토리
서비스에 VM 속성으로 저장되는 각 VM에 대한 우려 목록을 생성합니다. 웹 콘솔에는 공급자 인벤토리의 각 VM에 대한 문제가 표시됩니다.
사용자 지정 규칙을 만들어 Validation
서비스의 기본 규칙 집합을 확장할 수 있습니다. 예를 들어 VM에 여러 디스크가 있는지 확인하는 규칙을 생성할 수 있습니다.
6.2.1. Rego 파일 정보
검증 규칙은 OCI(Open Policy Agent) 기본 쿼리 언어인 Rego 로 작성됩니다. 규칙은 Validation
Pod의 /usr/share/opa/policies/io/konveyor/forklift/<provider
> 디렉터리에 .rego
파일로 저장됩니다.
각 검증 규칙은 별도의 .rego
파일에 정의되고 특정 조건에 대한 테스트입니다. 조건이 true
로 평가되면 규칙은 {"category", "label", "assessment"}
해시를 문제에
추가합니다. 문제가
있는 콘텐츠는 VM의 인벤토리 레코드에 있는 concerns
키에 추가됩니다. 웹 콘솔에는 공급자 인벤토리의 각 VM에 대한 concerns
키 내용이 표시됩니다.
다음 .rego
파일 예제에서는 VMware VM 클러스터에서 활성화된 분산 리소스 스케줄링을 확인합니다.
drs_enabled.rego example
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."
}
}
6.2.2. 기본 검증 규칙 확인
사용자 지정 규칙을 만들기 전에 Validation
서비스의 기본 규칙을 확인하여 기존 기본값을 설명하는 규칙을 만들지 않아야 합니다.
예: 기본 규칙에 default valid_input = false
행이 포함되어 있고 default valid_input = true
줄이 포함된 사용자 정의 규칙을 생성하면 검증
서비스가 시작되지 않습니다.
프로세스
Validation
Pod의 터미널에 연결합니다.oc rsh <validation_pod>
$ oc rsh <validation_pod>
Copy to Clipboard Copied! 공급자의 OPA 정책 디렉터리로 이동합니다.
cd /usr/share/opa/policies/io/konveyor/forklift/<provider>
$ cd /usr/share/opa/policies/io/konveyor/forklift/<provider>
1 Copy to Clipboard Copied! - 1
vmware
또는ovirt
를 지정합니다.
기본 정책을 검색합니다.
grep -R "default" *
$ grep -R "default" *
Copy to Clipboard Copied!
6.2.3. 검증 규칙 생성
검증 서비스에 규칙이 포함된 구성 맵 CR(사용자 정의 리소스)을 적용하여 검증
규칙을 생성합니다.
-
기존 규칙과 동일한 이름으로 규칙을 만드는 경우
유효성 검사
서비스는 규칙을 사용하여OR
작업을 수행합니다. -
기본 규칙과 일치하지 않는 규칙을 생성하면
검증
서비스가 시작되지 않습니다.
검증 규칙 예
검증 규칙은 공급자 인벤토리
서비스에서 수집한 VM(가상 머신) 속성을 기반으로 합니다.
예를 들어 VMware API는 이 경로를 사용하여 VMware VM에 NUMA 노드 유사성이 MOR: Cryostat.config.extraConfig["numa.nodeAffinity"]
가 구성되어 있는지 확인합니다.
공급자 인벤토리
서비스는 이 구성을 단순화하고 목록 값을 사용하여 테스트 가능한 속성을 반환합니다.
"numaNodeAffinity": [ "0", "1" ],
"numaNodeAffinity": [
"0",
"1"
],
이 속성을 기반으로 Rego 쿼리를 생성하고 forklift-validation-config
구성 맵에 추가합니다.
`count(input.numaNodeAffinity) != 0`
`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> 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
Copy to Clipboard Copied! 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! 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! Validation
Pod 로그를 확인하여 Pod가 시작되었는지 확인합니다.oc logs -f <validation_pod>
$ oc logs -f <validation_pod>
Copy to Clipboard Copied! 사용자 정의 규칙이 기본 규칙과 충돌하면
Validation
Pod가 시작되지 않습니다.소스 공급자를 제거합니다.
oc delete provider <provider> -n openshift-mtv
$ oc delete provider <provider> -n openshift-mtv
Copy to Clipboard Copied! 소스 공급자를 추가하여 새 규칙을 적용합니다.
$ 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
Copy to Clipboard Copied!
인벤토리
서비스에서 변경 사항을 감지하고 VM의 유효성을 검사하도록 사용자 지정 규칙을 생성한 후 규칙 버전을 업데이트해야 합니다.
6.2.4. 인벤토리 규칙 버전 업데이트
공급자 인벤토리 서비스에서 변경 사항을 감지하고
규칙 버전을 업데이트해야 합니다.
검증
서비스를 트리거하도록 규칙을 업데이트할 때마다 인벤토리
규칙 버전은 각 공급자에 대한 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! 출력 예
{ "result": { "rules_version": 5 } }
{ "result": { "rules_version": 5 } }
Copy to Clipboard Copied! Validation
Pod의 터미널에 연결합니다.oc rsh <validation_pod>
$ oc rsh <validation_pod>
Copy to Clipboard Copied! -
/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! 출력 예
{ "result": { "rules_version": 6 } }
{ "result": { "rules_version": 6 } }
Copy to Clipboard Copied!