이 문서에서는 AOSM(Azure Operator Service Manager) SUP(안전한 업그레이드 실행)를 소개합니다. 이 기능 집합을 사용하면 Azure 운영자 Nexus에서 호스트되는 복잡한 CNF(컨테이너 네트워크 함수)로 업그레이드할 수 있습니다. 이러한 업그레이드는 일반적으로 파트너 IN SERVICE SOFTWARE Upgrade(ISSU) 방법 및 요구 사항을 지원합니다. 이 글에서는 기본 개념을 소개합니다. 그러니 고급 SUP 기능과 역량에 대한 심화된 내용을 다루는 다른 문서를 찾아보세요.
안전한 업그레이드 소개
AOSM에서 지원하는 지정된 네트워크 서비스는 1~많은 CNF로 구성되며 시간이 지남에 따라 소프트웨어 및/또는 구성 변경이 필요한 구성 요소를 포함합니다. 이러한 구성 요소 수준을 변경하려면 하나에서 여러 Helm 작업을 실행하고 각 nfApp(네트워크 함수 애플리케이션)을 특정 순서로 업그레이드하며, 네트워크 서비스에 가장 적은 영향을 미치는 방식으로 진행해야 합니다. AOSM 안전한 업그레이드 방법은 업그레이드 프로세스 및 워크플로 요구 사항을 처리하기 위해 다음과 같은 높은 수준의 기능을 적용합니다.
- SNS Reput Support - NFDV(네트워크 함수 디자인 버전)의 모든 nfApp에서 helm 업그레이드 작업을 실행합니다.
- Nexus 플랫폼 - Nexus 플랫폼 대상에서 SNS 평판 작업을 지원합니다.
- 작업 시간 제한 - 각 nfApp 작업에 대한 작업 시간 제한을 설정하는 기능입니다.
- 동기 작업 - 한 번에 하나의 직렬 nfApp 작업을 실행하는 기능입니다.
- 업그레이드 순서 제어 - 설치 및 업그레이드를 위한 다양한 nfApp 시퀀스를 정의합니다.
- 실패시 일시 중지 - nfApp 작업 실패 후 기본 동작이 일시 중지됩니다.
- 실패 시 롤백 - 선택적 동작으로, 실패한 nfApp 전에 완료된 nfApps를 롤백합니다.
- 단일 차트 테스트 유효성 검사 - 만들기 또는 업데이트 후 Helm 테스트 작업을 실행합니다.
- 변경 내용 없음에서 nfApp 건너뛰기 - 변경 결과가 없는 nfApps 처리를 건너뜁니다.
- 이미지 미리 로드 - 에지 리포지토리에 이미지를 미리 로드하는 기능입니다.
안전한 업그레이드 방법
기존 AOSM SNS(사이트 네트워크 서비스)를 업데이트하기 위해 운영자는 배포된 SNS 리소스에 대해 평판 요청을 실행합니다. SNS에 여러 nfApps가 포함된 CNF가 있는 경우, 요청은 NFDV(네트워크 함수 정의 버전)에 정의된 모든 nfApp에 분산됩니다. 기본적으로 순서대로 표시되거나 선택적으로 매개 변수로 updateDependsOn 정의된 순서로 표시됩니다.
각 nfApp에 대해 reput 요청은 helm 차트 버전 증가, helm 값 추가/제거 및 nfApps 추가/제거 등 다양한 변경을 지원합니다. nfApp당 시간 제한은 알려진 허용 런타임에 따라 설정할 수 있지만 nfApps는 직렬 순서로만 처리할 수 있습니다. 평판 업데이트는 다음 처리 논리를 구현합니다.
- nfApps는
updateDependsOn순서에 따라 처리되거나 나타나는 순서대로 처리됩니다. - 사용하지 않도록 설정된 매개 변수
applicationEnabled가 있는 nfApps는 건너뜁니다. - 매개 변수
skipUpgrade가enabled로 설정된 nfApps는 변경 사항이 감지되지 않으면 건너뜁니다. - 이전 NFDV와 새 NFDV 간에 공통적인 nfApps는
helm upgrade를 사용하여 업그레이드됩니다. - 새로운 NFDV에만 있는 nfApps는
helm install을 사용하여 설치됩니다. - 배포되었지만 새 NFDV에서 참조하지 않는 nfApps는
helm delete을(를) 사용하여 삭제됩니다.
결과를 보장하기 위해 nfApp 테스트는 helm의 사전 또는 사후 훅에 의해 트리거되는 테스트나 독립 실행형 helm 테스트 훅을 사용하여 수행됩니다. 후크 이전 또는 이후에 실패가 발생하는 경우, 매개 변수 atomic이 적용됩니다. atomic/true를 사용하면 실패한 차트가 롤백됩니다. atomic/false를 사용하면 롤백이 실행되지 않습니다. 독립형 헬름 테스트 훅의 실패 시, rollbackOnTestFailure는 원자성과 유사한 논리에 따라 적용됩니다. 독립 실행형 Helm 테스트에 대한 자세한 내용은 다음 문서를 참조하세요. 설치 또는 업그레이드 후 테스트 실행
nfApp 작업 오류가 발생하고 실패한 nfApp이 atomic 또는 rollbackOnTestFailure 매개 변수를 통해 처리된 후, 운영자는 실패한 nfApp 이전에 변경된 모든 nfApp을 처리하는 방법의 동작을 제어할 수 있습니다. 일시 중지 시 오류 발생 시 운영자는 실패한 nfApp을 해결한 후 AOSM이 중단되도록 강제하여 혼합 버전 환경을 유지할 수 있습니다. 실패 시 롤백 기능을 통해 운영자는 AOSM이 이전의 nfApp 변경 사항을 롤백하여 원래 환경 스냅샷을 복원하도록 강제할 수 있습니다. 업그레이드 실패 동작을 제어하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요. 업그레이드 실패 동작 제어
서비스 내 업그레이드에 대한 고려 사항
Azure Operator Service Manager는 일반적으로 실행 중인 서비스를 중단하지 않고 배포 버전을 발전시키는 업그레이드 방법인 서비스 업그레이드를 지원합니다. ISSU 작업 중에 AOSM의 적절한 동작을 보장하기 위해 일부 네트워크 함수 소유자 고려 사항이 필요합니다.
- AOSM이 여러 nfApps의 정렬된 집합에 대해 업그레이드를 수행하는 경우 AOSM은 먼저 모든 새 nfApp을 업그레이드하거나 만든 다음 모든 이전 nfApps를 삭제합니다. 이 방법을 사용하면 모든 새 nfApps가 준비될 때까지 서비스가 영향을 받지 않지만 이전 및 새 nfApps의 임시 호스팅을 위한 추가 플랫폼 용량이 필요합니다.
- AOSM이 여러 복제본을 사용하여 nfApp을 업그레이드하는 경우 AOSM은 롤링 또는 다시 만들기 옵션에 대한 배포 프로필 설정을 적용합니다. 롤링이 사용되는 경우 값을
maxUnavailable노출하고maxSurgeCGS 매개 변수로 표시한 다음, 런타임에 연산자 CGV를 통해 설정할 수 있습니다.
궁극적으로 지정된 서비스를 중단 없이 업그레이드하는 기능은 서비스 자체의 기능입니다. 서비스 내 업그레이드 기능을 이해하고 적절한 AOSM 동작 옵션과 일치하는지 확인하려면 서비스 게시자와 추가로 문의하세요.
안전한 업그레이드 필수 구성 요소
AOSM을 사용하여 업그레이드를 계획할 때 업그레이드 실행 전에 다음 요구 사항을 해결하여 시도 시간을 최적화하고 업그레이드의 성공을 보장합니다.
- 게시자 및/또는 디자이너 워크플로를 사용하여 업데이트된 아티팩트를 온보딩합니다.
- 대부분의 경우 기존 게시자를 사용하여 새 버전 아티팩트 호스트합니다.
- 기존 게시자를 사용하면 SNS를
helm upgrade다른 버전으로 업데이트할 수 있습니다. - 새 게시자를 사용하려면 현재 SNS를
helm delete을(를) 하고 새 SNS 버전을 위해helm install을(를) 해야 합니다.
- 기존 게시자를 사용하면 SNS를
- 아티팩트 저장소, NSDG(네트워크 서비스 디자인 그룹) 및 NFDG(네트워크 함수 디자인 그룹)는 변경할 수 없으며 변경할 수 없습니다.
- 이러한 리소스 중 하나를 변경하려면 새 SNS를 배포해야 합니다.
- 새 차트와 이미지를 저장하려면 새 아티팩트 매니페스트가 필요합니다.
- 새 차트 및 이미지 업로드에 대한 자세한 내용은 온보딩 설명서를 참조하세요.
- 새 NFDV 및 선택적으로 NSDV(네트워크 서비스 디자인 버전)가 필요합니다.
- NFDV 변경은 복잡할 수 있습니다. 이 문서의 기본 변경 내용만 다룹니다.
- 새 NSDV는 새 CGS(구성 그룹 스키마) 버전이 도입되는 경우에만 필요합니다.
- 필요한 경우 새 CGS입니다.
- 업그레이드에서 노출된 새 구성 매개 변수를 도입하는 경우 필요합니다.
- 대부분의 경우 기존 게시자를 사용하여 새 버전 아티팩트 호스트합니다.
비고
주 버전이 다른 NSDV 및 NFDV는 동일한 NSDG 및 NFDG에서 지원될 수 있습니다.
- 운영자 워크플로를 사용하여 업데이트된 아티팩트를 만듭니다.
- 필요한 경우 새 CGS를 기반으로 새 CGV(구성 그룹 값)를 만듭니다.
- 기존 사이트 및 사이트 네트워크 서비스 개체를 확인하여 페이로드를 재사용하고 제작합니다.
- 업그레이드 매개변수가 업그레이드에 대한 신뢰도와 원하는 실패 동작에 따라 설정되도록 템플릿을 업데이트합니다다.
- 프로덕션에 사용되는 설정은 오류 세부 정보를 표시하지 않을 수 있지만, 디버깅 또는 테스트에 사용되는 설정은 이러한 세부 정보를 노출하도록 선택할 수 있습니다.
안전한 업그레이드 절차
다음 프로세스에 따라 AOSM으로 업그레이드를 트리거합니다.
- 새 NFDV 리소스 만들기
- 새 NFDV 버전의 경우 유효한 SemVer 형식이어야 합니다. 새 버전은 업그레이드, 배포된 버전에 비해 더 큰 값 또는 다운그레이드, 배포된 버전에 비해 더 낮은 값일 수 있습니다. 새 버전은 주, 부 또는 패치 값에 따라 다를 수 있습니다.
- 새 NFDV 매개 변수 업데이트
- Helm 차트 버전을 업데이트하거나, 필요에 따라 Helm 값을 업데이트하거나 매개 변수화할 수 있습니다. 배포된 버전에 없는 새 nfApps를 추가할 수도 있습니다.
- 원하는 nfApp 주문에 대한 NFDV 업데이트
- UpdateDependsOn은 업데이트 작업 중에 nfApps의 순서를 지정하는 데 사용되는 NFDV 매개 변수입니다.
updateDependsOn제공되지 않으면 NFDV에 표시되는 CNF 애플리케이션의 직렬 순서가 사용됩니다.
- UpdateDependsOn은 업데이트 작업 중에 nfApps의 순서를 지정하는 데 사용되는 NFDV 매개 변수입니다.
- 원하는 업그레이드 동작에 대한 ARM 템플릿 업데이트
- CNF 애플리케이션
timeout과atomic매개 변수,rollbackOnTestFailure매개 변수를 설정하십시오. 업그레이드에서 신뢰도가 높아지면 시간이 지남에 따라 이러한 매개 변수를 변경하는 것이 유용할 수 있습니다.
- CNF 애플리케이션
- 문제 SNS 평판
- 온보딩이 완료되면 평판 작업이 제출됩니다. nfApps의 수, 크기 및 복잡성에 따라 리푸트 작업을 완료하는 데 다소 시간이 걸릴 수 있습니다(여러 시간).
- 평판 결과 검사
- 평판이 성공적인 결과를 보고하는 경우 업그레이드가 완료되고 사용자가 서비스의 상태 및 가용성의 유효성을 검사해야 합니다. 평판에서 오류를 보고하는 경우 업그레이드 실패 복구 섹션의 단계에 따라 계속합니다.
안전한 업그레이드 재시도 절차
평판 업데이트가 실패하는 경우 다음 프로세스를 따라 작업을 다시 시도할 수 있습니다.
- nfApp 진단 실패
- 로그 및 기타 디버깅 정보를 분석하여 nfApp 오류의 근본 원인을 해결합니다.
- 완료된 차트를 수동으로 건너뛰기
- 실패한 nfApp을 수정한 후 업그레이드 재시도를 시도하기 전에 매개 변수를 변경
applicationEnablement하여 다시 시도 동작을 가속화하는 것이 좋습니다. 이 매개 변수는 nfApp을 건너뛰어야 하는 false로 설정할 수 있습니다. 이 매개 변수는 nfApp에 업그레이드가 필요하지 않은 경우에 유용할 수 있습니다.
- 실패한 nfApp을 수정한 후 업그레이드 재시도를 시도하기 전에 매개 변수를 변경
- SNS 평판 재시도 문제(성공할 때까지 반복)
- 기본적으로, 선언된 업데이트 순서대로 nfApps를 다시 시도하며, 이는
applicationEnablement플래그를 사용하여 건너뛰면 적용되지 않습니다.
- 기본적으로, 선언된 업데이트 순서대로 nfApps를 다시 시도하며, 이는
installOptions 및 UpgradeOptions를 사용하여 시간 제한 제어
SNS 작업이 helm install 또는 helm upgrade를 시작할 때, 27분의 기본 시간 제한 값이 사용됩니다. 이 값은 NF(전역 네트워크 함수) 수준에서 사용자 지정할 수 있지만 NF 페이로드 템플릿을 사용하여 roleOverrideValues 구성 요소 NF 수준에서 이 값을 사용자 지정하는 것이 좋습니다. CGS/CGV에서 roleOverrideValues를 추가로 노출함으로써 런타임에 연산자가 제어할 수 있게 됩니다. 다음 예제에서는 두 nfApp 구성 요소에 적용된 지원되는 installOptions 및 upgradeOptions 매개 변수를 보여 줍니다.
{
"roleOverrideValues": [
{
"name": "nfApplication1",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
} } } } },
{
"name": "nfApplication2",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
} } } } }
]
}
applicationEnablement를 사용하여 nfApps 건너뛰기
NFDV 리소스의 deployParametersMappingRuleProfile에는 열거형 형식의 지원되는 속성 applicationEnablement이 있으며, 이 속성은 알 수 없음, 사용 또는 사용 안 함의 값을 가질 수 있습니다. 네트워크 함수 배포 중에 nfApp 작업을 수동으로 제외하는 데 사용할 수 있습니다. 다음 예제는 매개 변수화된 값으로 applicationEnablement를 포함하는 roleOverrideValues 속성의 제네릭 메서드를 보여줍니다.
NFDV 템플릿 변경 내용
NFDV 변경이 반드시 필요하지는 않지만 필요에 따라 게시자는 NFDV를 사용하여 속성의 applicationEnablement 기본값을 설정할 수 있습니다. 기본값은 을 통해 roleOverrideValues변경되지 않는 한 사용됩니다. NFDV 템플릿을 사용하여 기본값 applicationEnablement을 설정합니다. 다음 예제에서는 networkfunctionApplication의 기본값 enabled 으로 상태를 설정합니다hellotest.
"location":"<location>",
"properties": {
"networkFunctionTemplate": {
"networkFunctionApplications": [
"deployParametersMappingRuleProfile": {
"applicationEnablement": "Enabled"
},
"name": "hellotest"
],
"nfviType": "AzureArcKubernetes"
},
}
값을 보다 동적으로 관리 applicationEnablement 하기 위해 연산자는 NF 템플릿 roleOverrideValues 속성을 사용하여 실시간 값을 전달할 수 있습니다. 연산자가 NF 템플릿을 직접 조작할 수는 있지만, 대신 roleOverrideValues을 매개변수화하여 런타임 시 CGV 템플릿을 통해 값을 전달할 수 있도록 하십시오. 다음 예제에서는 CGS, NF 템플릿 및 마지막으로 CGV를 수정해야 하는 방법을 보여 줍니다.
CGS 템플릿 변경 내용
CGS 템플릿은 roleOverrideValues 아래에서 매개 변수화를 하기 위해 각 줄에 대한 변수 선언을 하나씩 포함하도록 업데이트해야 합니다. 다음 예제에서는 세 가지 설정 값을 보여줍니다.
"roleOverrideValues0": {
"type": "string"
},
"roleOverrideValues1": {
"type": "string"
},
"roleOverrideValues2": {
"type": "string"
}
NF 페이로드 템플릿 변경
NF 템플릿은 세 가지 방법으로 업데이트해야 합니다. 먼저 암시적 구성 매개 변수를 형식 개체로 정의해야 합니다. 둘째, roleOverrideValues0, roleOverrideValues1및 roleOverrideValues2 구성 매개 변수에 매핑된 변수로 선언되어야 합니다. 셋째, roleOverrideValues0, roleOverrideValues1, 및 roleOverrideValues2는 적절한 순서와 구문에 따라 roleOverrideValues에서 대체 용도로 참조되어야 합니다.
"parameters": {
"config": {
"type": "object",
"defaultValue": {}
}
}
"variables": {
"roleOverrideValues0": "[string(parameters('config').roleOverrideValues1)]",
"roleOverrideValues1": "[string(parameters('config').roleOverrideValues1)]",
"roleOverrideValues2": "[string(parameters('config').roleOverrideValues2)]"
},
"resources": [
{
<snip>
"roleOverrideValues": [
"[variables('roleOverrideValues0')]",
"[variables('roleOverrideValues1')]",
"[variables('roleOverrideValues2')]"
]
}
CGV 템플릿 변경 내용
이제 각 변수가 런타임에 roleOverrideValues 속성으로 대체될 수 있도록 CGV 템플릿의 콘텐츠를 업데이트할 수 있습니다. 다음 예제에서는 rollbackEnabled를 true로 설정한 후, hellotest 및 hellotest1 nfApplications에 대한 재정의 설정을 따릅니다.
{
"roleOverrideValues0": "{\"nfConfiguration\":{\"rollbackEnabled\":true}}",
"roleOverrideValues1": "{\"name\":\"hellotest\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\":\"Enabled\",\"helmMappingRuleProfile\":{\"releaseName\":\"override-release\",\"releaseNamespace\":\"override-namespace\",\"helmPackageVersion\":\"1.0.0\",\"values\":\"\",\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"30\",\"injectArtifactStoreDetails\":\"true\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"30\",\"injectArtifactStoreDetails\":\"true\"}}}}}",
"roleOverrideValues2": "{\"name\":\"hellotest1\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\" : \"Enabled\"}}"
}
이 프레임워크를 사용하면 운영자는 CGV에 대한 간단한 업데이트를 통해 해당 roleOverrideValues CGV를 원하는 SNS 작업에 연결하여 관리할 수 있습니다.
변경되지 않은 nfApps 건너뛰기
이 skipUpgrade 기능은 CNF 업그레이드에 소요되는 시간을 최적화하도록 설계되었습니다. 게시자가 아래에서 roleOverrideValues이 플래그 upgradeOptions 를 사용하도록 설정하면 AOSM 서비스 계층은 특정 사전 검사를 수행하여 특정 nfApplication 업그레이드를 건너뛸 수 있는지 여부를 결정합니다. 모든 사전 검사 조건이 충족되면 해당 애플리케이션에 대한 업그레이드를 건너뜁니다. 그렇지 않으면 클러스터 수준에서 업그레이드가 실행됩니다.
조건 사전 검사
다음 조건이 모두 충족되면 업그레이드를 건너뛸 수 있습니다.
-
nfApplication프로비전 상태가 성공했습니다. - Helm 차트 이름 또는 버전은 변경되지 않습니다.
- Helm 값은 변경되지 않습니다.
skipUpgrade 기능 사용 또는 사용 안 함
이 skipUpgrade 기능은 기본적으로 사용하지 않도록 설정됩니다. 이 선택적 매개 변수가 roleOverrideValues 아래 upgradeOptions에 지정되지 않은 경우, CNF 업그레이드는 클러스터 수준에서 nfApplications가 업그레이드되는 기존 방식으로 진행됩니다.
네트워크 함수 리소스 내에서 SkipUpgrade 사용
SkipUpgrade 기능을 통해 roleOverrideValues사용하도록 설정하려면 다음 예제를 참조하세요.
{
"location": "eastus2euap",
"properties": {
"publisherName": "xyAzureArcRunnerPublisher",
"publisherScope": "Private",
"networkFunctionDefinitionGroupName": "AzureArcRunnerNFDGroup",
"networkFunctionDefinitionVersion": "1.0.0",
"networkFunctionDefinitionOfferingLocation": "eastus2euap",
"nfviType": "AzureArcKubernetes",
"nfviId": "/subscriptions/4a0479c0-b795-4d0f-96fd-c7edd2a2928f/resourcegroups/ashutosh_test_rg/providers/microsoft.extendedlocation/customlocations/ashutosh_test_cl",
"deploymentValues": "",
"roleOverrideValues": [
"{\"name\":\"hellotest\",\"deployParametersMappingRuleProfile\":{\"helmMappingRuleProfile\":{\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"1\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"4\",\"skipUpgrade\":\"true\"}}}}}",
"{\"name\":\"runnerTest\",\"deployParametersMappingRuleProfile\":{\"helmMappingRuleProfile\":{\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"5\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"5\"}}}}}"
]
}
}
예제 설명
-
nfApplication:
hellotest-
skipUpgrade플래그를 사용할 수 있습니다. 업그레이드 요청hellotest이 사전 검사 조건을 충족하면 업그레이드를 건너뜁니다.
-
-
nfApplication:
runnerTest- 플래그가
skipUpgrade지정되지 않았습니다. 따라서runnerTest사전 검사 조건이 충족되더라도 클러스터 수준에서 기존 Helm 업그레이드를 실행합니다.
- 플래그가
전체 roleOverrideValues의 옵션 참조
이 문서와 다른 문서의 모든 예제를 함께 가져오는 다음 참조는 메커니즘을 통해 roleOverrideValues 사용할 수 있는 현재 지원되는 모든 옵션을 보여 줍니다.
{
"roleOverrideValues": [
{
"nfConfiguration": {
"rollbackEnabled": "true"
}
},
{
"name": "nfApplication1",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"skipUpgrade": "true",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
}
}
}
}
},
{
"name": "nfApplication2",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"skipUpgrade": "true",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
}
}
}
}
}
]
}