diff --git a/README.md b/README.md index 6ae6735..93e8b86 100644 --- a/README.md +++ b/README.md @@ -129,13 +129,13 @@ Tumblebug namespace can be created before infra or cluster creation. Seeded multi-CSP VM workflows include: ```text -aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm,kt +alibaba,aws,azure,gcp,ibm,kt,ncp,nhn,tencent ``` Seeded multi-CSP K8s workflows include: ```text -aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm +alibaba,aws,azure,gcp,ibm,ncp,nhn,tencent ``` OpenStack is not included in the seeded multi-CSP scenario lists. @@ -234,22 +234,30 @@ Status legend: ### VM Workflow Test Values +The values below match the VM defaults in `WorkflowForm.vue`, `TumblebugParamSelector.vue`, `WorkflowStageDto.java`, and `import.sql`. Scenario status rows retain the previously recorded results; these updated defaults have not been revalidated against live CSPs. + | Item | Alibaba | AWS | Azure | GCP | IBM | KT | NCP | NHN | OpenStack | Tencent | | --- | --- | --- | --- | --- | --- | --- |--------------------------------------------------| --- | --- | --- | | VM | O | O | O | O | O | Not yet | O | O | Not Support | O | -| VM Spec | `alibaba+ap-northeast-2+ecs.e-c1m1.large` / `ecs.e-c1m1.large` | `aws+ap-northeast-1+t3.small` / `t3.small` | `azure+koreacentral+Standard_D2s_v3` / `Standard_D2s_v3` | `gcp+asia-northeast3+e2-medium` / `e2-medium` | `ibm+jp-osa+bxf-2x8` / `bxf-2x8` | Not yet | `ncp+kr+c2-g3a` / `c2-g3` | `nhn+kr1+m2.c1m2` / `m2.c1m2` | Not Support | `tencent+ap-seoul+BF1.MEDIUM2` / `BF1.MEDIUM2` | -| VM Image | `ubuntu_22_04_x64_20G_alibase_20260615.vhd` / Ubuntu 22.04 64 bit | `ami-091de58da07595152` / ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20260610 | `Canonical:ubuntu-22_04-lts:server:22.04.202603110` / Server LTS | `https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20260623` / Canonical, Ubuntu, 22.04 LTS, amd64 jammy image built on 2026-06-23 | `r034-3cb1bb72-002d-45fe-8ac1-6e36906963c4` / Ubuntu Linux 22.04 LTS Jammy Jellyfish Minimal Install (amd64) | Not yet | `104630229` / ubuntu-24.04-base (Hypervisor:KVM) | `0f07c795-2a46-44fc-a61b-fa0d96763ce2` / Ubuntu Server 22.04.5 LTS (2026.03.10) | Not Support | `img-487zeit5` / Ubuntu Server 22.04 LTS 64bit | -| VM Zone | `ap-northeast-2a` | `ap-northeast-1a` | `1` | `asia-northeast3-a` | `jp-osa-1` | Not yet | `KR-1` | `kr-pub-a` | Not Support | `ap-seoul-1` | +| VM Region | `ap-northeast-2` | `ap-northeast-2` | `koreacentral` | `asia-northeast3` | `jp-tok` | `kr1` | `kr` | `kr1` | Not Support | `ap-seoul` | +| VM Connection | `alibaba-ap-northeast-2` | `aws-ap-northeast-2` | `azure-koreacentral` | `gcp-asia-northeast3` | `ibm-jp-tok` | `kt-kr1` | `ncp-kr` | `nhn-kr1` | Not Support | `tencent-ap-seoul` | +| VM Spec | `alibaba+ap-northeast-2+ecs.g9i.large` / `ecs.g9i.large` | `aws+ap-northeast-2+m8i.large` / `m8i.large` | `azure+koreacentral+Standard_D2s_v6` / `Standard_D2s_v6` | `gcp+asia-northeast3+n4-standard-2` / `n4-standard-2` | `ibm+jp-tok+bx2-2x8` / `bx2-2x8` | `kt+kr1+2x8.itl` / `2x8.itl` | `ncp+kr+s2-g3` / `s2-g3` | `nhn+kr1+r2.c2m8` / `r2.c2m8` | Not Support | `tencent+ap-seoul+S5.MEDIUM8` / `S5.MEDIUM8` | +| VM Image | `ubuntu_24_04_x64_20G_alibase_20260810.vhd` | `ami-01ed18897a4aadead` | `Canonical:ubuntu-24_04-lts:minimal:24.04.202608100` | `https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-minimal-2404-noble-amd64-v20260817` | `r022-9130f04e-631a-4e91-ae4c-b85d54621c24` | `e55c5985-b420-4a19-8c92-aa3461cda86e` | `104630229` | `5c38715f-0375-4167-af4e-56f75ba8b252` | Not Support | `img-mmytdhbn` | +| VM Zone | `ap-northeast-2a` | `ap-northeast-2a` | `1` | `asia-northeast3-a` | `jp-tok-1` | `DX-M1` | `KR-1` | `kr-pub-a` | Not Support | `ap-seoul-1` | ### K8s Workflow Test Values +K8s defaults are separate from VM defaults. An empty image ID (`""`) for Azure, IBM, or NCP uses the provider-managed image. + | Item | Alibaba | AWS | Azure | GCP | IBM | KT | NCP | NHN | OpenStack | Tencent | | --- | --- | --- |------------------------------------------------------------------| --- | --- | --- |-------------------------------------------------| --- | --- |-------------------------------------------------------| | K8s | O | O | O | O | X | Not yet | △ (app install issue) | O | Not Support | X | -| K8s Spec | `alibaba+ap-northeast-1+ecs.u1-c1m4.xlarge` / `ecs.u1-c1m4.xlarge` | `aws+ap-northeast-1+t3.small` / `t3.small` | `azure+koreacentral+Standard_D8ds_v5` / `Standard_D8ds_v5` | `gcp+asia-northeast3+e2-medium` / `e2-medium` | `ibm+jp-osa+bx2-2x8` / `bx2-2x8` | Not yet | `ncp+kr+c2-g3a` / `c2-g3` | `nhn+kr1+m2.c1m2` / `m2.c1m2` | Not Support | `tencent+ap-seoul+BF1.MEDIUM2` / `BF1.MEDIUM2` | -| K8s Image | `Ubuntu` / ACK Node - Ubuntu latest (ACK image_type alias, resolves dynamically), cgroup v2, x86_64 | `AL2023_x86_64_STANDARD` / EKS Node - AL2023, containerd, x86_64 | `Canonical:ubuntu-22_04-lts:server:22.04.202603110` / Server LTS | `UBUNTU_CONTAINERD` / GKE Node - Ubuntu 22.04, containerd, x86_64/ARM64 | `r034-ed053bf7-43c9-4b64-844b-77918ac3d597` / Ubuntu Linux 22.04 LTS Jammy Jellyfish Minimal Install (amd64) | Not yet | `23214590` / ubuntu-22.04-base (Hypervisor:KVM) | `0f07c795-2a46-44fc-a61b-fa0d96763ce2` / Ubuntu Server 22.04.5 LTS (2026.03.10) | Not Support | `ubuntu22.04x86_64` / TKE Node - Ubuntu 22.04, x86_64 | -| K8s Zone | `ap-northeast-1b` | `ap-northeast-1a` | `1` | `asia-northeast3-a` | `jp-osa-1` | Not yet | `KR-1` | `kr-pub-a` | Not Support | `Ap-seoul-2` | -| K8s Version | `1.34.3-aliyun.1` / `1.34` | `1.33` | `1.33.12` / `1.33` | `1.33.12-gke.1000000` / `1.33` | `1.33.6` / `1.33` | Not yet | `1.33.4-nks.1` / `1.33` | `v1.33.4` / `1.33` | Not Support | `1.32.2` / `1.32` | +| K8s Region | `ap-northeast-2` | `ap-northeast-2` | `koreacentral` | `asia-northeast3` | `jp-tok` | Not yet | `kr` | `kr1` | Not Support | `ap-seoul` | +| K8s Connection | `alibaba-ap-northeast-2` | `aws-ap-northeast-2` | `azure-koreacentral` | `gcp-asia-northeast3` | `ibm-jp-tok` | Not yet | `ncp-kr` | `nhn-kr1` | Not Support | `tencent-ap-seoul` | +| K8s Spec | `alibaba+ap-northeast-2+ecs.c9i.xlarge` / `ecs.c9i.xlarge` | `aws+ap-northeast-2+c8i.xlarge` / `c8i.xlarge` | `azure+koreacentral+Standard_D4ls_v6` / `Standard_D4ls_v6` | `gcp+asia-northeast3+n4-highcpu-4` / `n4-highcpu-4` | `ibm+jp-tok+cx2-4x8` / `cx2-4x8` | Not yet | `ncp+kr+c4-g3` / `c4-g3` | `nhn+kr1+m2.c4m8` / `m2.c4m8` | Not Support | `tencent+ap-seoul+S5.LARGE8` / `S5.LARGE8` | +| K8s Image | `Ubuntu` | `AL2023_x86_64_STANDARD` | `""` (provider-managed) | `UBUNTU_CONTAINERD` | `""` (provider-managed) | Not yet | `""` (provider-managed) | `107cc02d-02d8-44fd-84d6-6c316045b817` | Not Support | `ubuntu22.04x86_64` | +| K8s Zone | `ap-northeast-2a` | `ap-northeast-2a` | `1` | `asia-northeast3-a` | `jp-tok-1` | Not yet | `KR-1` | `kr-pub-a` | Not Support | `ap-seoul-1` | +| K8s Version | `1.35.7-aliyun.1` | `1.35` | `1.35.7` | `1.34.10-gke.1236000` | `1.35.7` | Not yet | `1.34.3-nks.1` | `v1.34.3` | Not Support | `1.34.1` | ## Requirements diff --git a/outputs/workflow-test-scenarios/build-workflow-test-scenarios.mjs b/outputs/workflow-test-scenarios/build-workflow-test-scenarios.mjs index 6358435..4ce4992 100644 --- a/outputs/workflow-test-scenarios/build-workflow-test-scenarios.mjs +++ b/outputs/workflow-test-scenarios/build-workflow-test-scenarios.mjs @@ -49,7 +49,7 @@ const rows = [ "TC-WF-FLOW-06", "Workflow 실행 (RUN)", "1. Workflow 목록 화면으로 이동한다.\n2. 실행 대상 Workflow의 RUN 버튼을 클릭한다.\n3. 실행 파라미터 입력 모달이 표시되는지 확인한다.\n4. Tumblebug Parameter Selection 영역이 필요한 Workflow에서 표시되는지 확인한다.\n5. Region, Connection, Zone, Image, Spec, K8s Version 값을 확인한다.\n6. 필요 시 실행 파라미터 값을 수정한다.\n7. Run 버튼을 클릭한다.\n8. 실행 요청 접수 메시지가 표시되는지 확인한다.\n9. 화면 새로고침 없이 Status 값이 자동 갱신되는지 확인한다.\n10. Jenkins Build가 시작되는지 확인한다.\n11. vm-mariadb-backup-import-data-init 실행 시 VM 1종 AWS 배포, MariaDB 설치, schema import, 초기 데이터 insert 단계가 순서대로 실행되는지 확인한다.\n12. multi-csp-vm-deploy 실행 시 CSP_LIST 기준 VM n종 배포가 실행되는지 확인한다.\n13. k8s-mariadb-backup-import-data-init 실행 시 K8s 1종 AWS 배포, MariaDB Helm 설치, schema import, 초기 데이터 insert 단계가 순서대로 실행되는지 확인한다.\n14. multi-csp-k8s-cluster-deploy 실행 시 CSP_LIST 기준 K8s n종 배포가 실행되는지 확인한다.\n15. 최종 Status가 SUCCESS 또는 실패 시 원인 확인 가능한 상태로 변경되는지 확인한다.", - "실행 대상 Workflow:\n1. vm-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- INFRA_ID: vm-mariadb-data-init\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- DB_PASSWORD: mariadb_pass\n- DB_BACKUP_FILE: schema.sql\n- INSERT_SQL: sample row\n\n2. multi-csp-vm-deploy\n- NAMESPACE: ns01\n- CSP_LIST: aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm,kt\n- INFRA_PREFIX: multi-csp-vm\n- INFRA_NODEGROUP_NAME: g1\n- INFRA_NODEGROUP_SIZE: 1\n\n3. k8s-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- K8S_CLUSTER_ID: k8s-mariadb-data-init\n- K8S_NODEGROUP_NAME: ng1\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- K8S_VERSION: 1.33\n- RELEASE_NAME: mariadb\n- DB_NAME: testdb\n\n4. multi-csp-k8s-cluster-deploy\n- NAMESPACE: ns01\n- CSP_LIST: aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm\n- CLUSTER_PREFIX: multi-csp-k8s\n- K8S_NODEGROUP_PREFIX: ng\n- K8S_VERSION: CSP별 유효 버전", + "실행 대상 Workflow:\n1. vm-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- INFRA_ID: vm-mariadb-data-init\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- DB_PASSWORD: mariadb_pass\n- DB_BACKUP_FILE: schema.sql\n- INSERT_SQL: sample row\n\n2. multi-csp-vm-deploy\n- NAMESPACE: ns01\n- CSP_LIST: alibaba,aws,azure,gcp,ibm,kt,ncp,nhn,tencent\n- INFRA_PREFIX: multi-csp-vm\n- INFRA_NODEGROUP_NAME: g1\n- INFRA_NODEGROUP_SIZE: 1\n\n3. k8s-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- K8S_CLUSTER_ID: k8s-mariadb-data-init\n- K8S_NODEGROUP_NAME: ng1\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- K8S_VERSION: 1.33\n- RELEASE_NAME: mariadb\n- DB_NAME: testdb\n\n4. multi-csp-k8s-cluster-deploy\n- NAMESPACE: ns01\n- CSP_LIST: alibaba,aws,azure,gcp,ibm,ncp,nhn,tencent\n- CLUSTER_PREFIX: multi-csp-k8s\n- K8S_NODEGROUP_PREFIX: ng\n- K8S_VERSION: CSP별 유효 버전", "1. Workflow 실행 요청이 접수됨\n2. Jenkins Build가 생성됨\n3. Status가 진행 상태로 표시됨\n4. 화면 새로고침 없이 목록 상태가 갱신됨\n5. vm-mariadb-backup-import-data-init 실행 시 AWS VM 생성, MariaDB 설치, Data Import, Data Insert 완료\n6. multi-csp-vm-deploy 실행 시 CSP별 VM 생성 요청 완료\n7. k8s-mariadb-backup-import-data-init 실행 시 AWS K8s Cluster/NodeGroup 생성, MariaDB Helm 설치, Data Import, Data Insert 완료\n8. multi-csp-k8s-cluster-deploy 실행 시 CSP별 K8s Cluster 생성 요청 완료\n9. 성공 시 최종 Status가 SUCCESS로 표시됨\n10. 실패 시 Jenkins Console Log에서 실패 원인 확인 가능", "1. TC-WF-FLOW-01 완료\n2. TC-WF-FLOW-02 완료\n3. Tumblebug API 접근 가능\n4. Jenkins에서 Tumblebug endpoint 접근 가능\n5. 대상 CSP credential/connection 준비\n6. VM/K8s 생성에 필요한 spec, image, zone, version 값 준비\n7. 테스트용 SQL 내용 준비", ], diff --git a/outputs/workflow-test-scenarios/mc-workflow-manager-test-scenarios.xlsx.inspect.ndjson b/outputs/workflow-test-scenarios/mc-workflow-manager-test-scenarios.xlsx.inspect.ndjson index 2e8bca0..76480e0 100644 --- a/outputs/workflow-test-scenarios/mc-workflow-manager-test-scenarios.xlsx.inspect.ndjson +++ b/outputs/workflow-test-scenarios/mc-workflow-manager-test-scenarios.xlsx.inspect.ndjson @@ -1,6 +1,6 @@ {"kind":"workbook","id":"wb/w2b7ou","sheets":2,"tables":2} {"kind":"sheet","id":"ws/d903xj","name":"Workflow Test Cases","index":0,"range":"A1:F17","address":"A1:F17","tables":1} -{"kind":"table","sheet":"Workflow Test Cases","address":"A1:F17","rows":17,"cols":6,"values":[["mc-workflow-manager Workflow / Event Listener Test Scenarios",null,null,null,null,null],["현재 소스 기준 workflow명 반영",null,null,null,null,null],["TC-ID","기능명","테스트 방법","입력값","출력값","선행작업"],["TC-WF-FLOW-01","Workflow Engine(Jenkins) 등록 및 연동 확인","1. M-CMP 포털에 로그인한다.\n2. 상단 Workspace 선택 영역에서 테스트 Workspace를 선택한다.\n3. Project 선택 영역에서 테스트 Project를 선택한다.\n4. Workflow 메뉴로 이동한다.\n5. Workflow Engine 또는 OSS/Jenkins 설정 영역을 확인한다.\n6. Jenkins OSS 정보가 등록되어 있는지 확인한다.\n7. Jenkins URL, 인증 정보, 연결 상태를 확인한다.\n8. Jenkins 연동 테스트 또는 Workflow 실행 준비 상태를 확인한다.","Workspace: ws01\nProject: 존재하는 project\nWorkflow Engine: Jenkins\nOSS: Jenkins 기본 등록 정보","1. Jenkins OSS 정보가 등록되어 있음\n2. mc-workflow-manager에서 Jenkins API 호출 가능\n3. Workflow 생성/수정/삭제/실행 시 Jenkins Job 연동 가능\n4. Jenkins 연동 오류 메시지가 표시되지 않음","1. 사용자 로그인 완료\n2. Workspace 생성 완료\n3. Project 생성 완료\n4. Jenkins 서버 구동 완료\n5. mc-workflow-manager 접근 권한 보유"],["TC-WF-FLOW-02","Workflow 목록 조회","1. M-CMP 포털에 로그인한다.\n2. 상단 Workspace 선택 영역에서 테스트 Workspace를 선택한다.\n3. Project 선택 영역에서 테스트 Project를 선택한다.\n4. Workflow 메뉴를 클릭한다.\n5. Workflow 목록 화면 제목과 목록 영역이 표시되는지 확인한다.\n6. Workflow Name, Purpose, Status, Params Count, Created Date, Action 컬럼이 표시되는지 확인한다.\n7. Action 영역에 Detail, DELETE, RUN, LOG 버튼이 표시되는지 확인한다.\n8. 기본 등록된 Workflow 4종이 표시되는지 확인한다.","Workspace: ws01\nProject: 존재하는 project\n확인 대상 Workflow:\n- vm-mariadb-backup-import-data-init\n- multi-csp-vm-deploy\n- k8s-mariadb-backup-import-data-init\n- multi-csp-k8s-cluster-deploy","1. 등록된 Workflow 목록이 테이블로 표시됨\n2. Status, Params Count, Created Date 값이 표시됨\n3. Detail/DELETE/RUN/LOG 버튼이 표시됨\n4. 기본 Workflow 4종이 목록에 표시됨","1. TC-WF-FLOW-01 완료\n2. Workflow 기본 seed 데이터 등록 완료"],["TC-WF-FLOW-03","신규 Workflow 생성","1. Workflow 목록 화면에서 New Workflow 버튼을 클릭한다.\n2. Workflow 생성 화면이 표시되는지 확인한다.\n3. Workflow Name을 입력한다.\n4. Purpose를 선택한다.\n5. Tumblebug Parameter Selection 사용 여부를 선택한다.\n6. Create Script 버튼을 클릭한다.\n7. Pipeline Generator 영역에서 필요한 Stage를 추가한다.\n8. Stage별 실행 파라미터를 구성한다.\n9. 생성된 Script에 Stage가 순서대로 포함되는지 확인한다.\n10. Param 영역에 실행 파라미터가 정상 표시되는지 확인한다.\n11. Regist 버튼을 클릭한다.\n12. Workflow 목록으로 이동 후 신규 Workflow가 표시되는지 확인한다.","Workflow Name: workflow-create-test\nPurpose: For Deployment\nStage 예시:\n- namespace-ensure\n- infra-create 또는 k8s-cluster-create\n- db-backup-import\n- db-data-insert\nTumblebug Selector: 필요 시 Y","1. Workflow 생성 성공 메시지가 표시됨\n2. Workflow 목록에 신규 Workflow가 표시됨\n3. Pipeline Script가 생성됨\n4. Jenkins Job이 생성됨\n5. Param Count가 입력한 파라미터 수와 일치함","1. TC-WF-FLOW-01 완료\n2. Jenkins OSS 연결 완료\n3. Workflow Stage 기본 데이터 등록 완료"],["TC-WF-FLOW-04","Workflow 상세 수정","1. Workflow 목록에서 수정 대상 Workflow를 찾는다.\n2. Detail 버튼을 클릭한다.\n3. Workflow 상세 화면이 표시되는지 확인한다.\n4. 기존 Workflow Name, Purpose, Pipeline, Parameter 값이 표시되는지 확인한다.\n5. Parameter 값을 수정한다.\n6. 필요 시 Pipeline Script 또는 Stage 설정을 수정한다.\n7. Tumblebug Parameter Selection 사용 여부를 수정한다.\n8. 수정된 값이 Script와 Param 영역에 반영되는지 확인한다.\n9. Edit 버튼을 클릭한다.\n10. 목록으로 이동 후 다시 Detail에 진입하여 수정값이 유지되는지 확인한다.","Workflow: vm-mariadb-backup-import-data-init\n수정 예시:\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- INSERT_SQL: sample row 추가\n- SPEC_ID 또는 IMAGE_ID 재선택","1. Workflow 수정 성공 메시지가 표시됨\n2. Jenkins Job Pipeline 설정이 갱신됨\n3. 상세 화면 재조회 시 수정된 값이 표시됨\n4. 수정된 Parameter가 유지됨\n5. Workflow 목록의 Params Count가 변경 내용과 일치함","1. TC-WF-FLOW-02 완료\n2. 수정 대상 Workflow 존재"],["TC-WF-FLOW-05","Workflow 삭제","1. 삭제 검증용 Workflow를 사전에 생성한다.\n2. Workflow 목록 화면으로 이동한다.\n3. 삭제 대상 Workflow를 찾는다.\n4. DELETE 버튼을 클릭한다.\n5. 삭제 확인 모달이 표시되는지 확인한다.\n6. 모달에 삭제 대상 Workflow Name이 표시되는지 확인한다.\n7. Delete 버튼을 클릭한다.\n8. 목록이 재조회되는지 확인한다.\n9. 삭제한 Workflow가 목록에서 제거되었는지 확인한다.\n10. 동일 이름으로 신규 Workflow 생성이 가능한지 확인한다.","Workflow: workflow-delete-test","1. 삭제 확인 모달이 표시됨\n2. Workflow 삭제 성공 메시지가 표시됨\n3. Workflow 목록에서 삭제 대상이 제거됨\n4. 연결된 Jenkins Job이 삭제됨\n5. 삭제 후 동일 Workflow Name 재사용 가능","1. TC-WF-FLOW-03 완료\n2. 삭제 검증용 Workflow 사전 생성\n3. Jenkins Job 생성 완료 상태"],["TC-WF-FLOW-06","Workflow 실행 (RUN)","1. Workflow 목록 화면으로 이동한다.\n2. 실행 대상 Workflow의 RUN 버튼을 클릭한다.\n3. 실행 파라미터 입력 모달이 표시되는지 확인한다.\n4. Tumblebug Parameter Selection 영역이 필요한 Workflow에서 표시되는지 확인한다.\n5. Region, Connection, Zone, Image, Spec, K8s Version 값을 확인한다.\n6. 필요 시 실행 파라미터 값을 수정한다.\n7. Run 버튼을 클릭한다.\n8. 실행 요청 접수 메시지가 표시되는지 확인한다.\n9. 화면 새로고침 없이 Status 값이 자동 갱신되는지 확인한다.\n10. Jenkins Build가 시작되는지 확인한다.\n11. vm-mariadb-backup-import-data-init 실행 시 VM 1종 AWS 배포, MariaDB 설치, schema import, 초기 데이터 insert 단계가 순서대로 실행되는지 확인한다.\n12. multi-csp-vm-deploy 실행 시 CSP_LIST 기준 VM n종 배포가 실행되는지 확인한다.\n13. k8s-mariadb-backup-import-data-init 실행 시 K8s 1종 AWS 배포, MariaDB Helm 설치, schema import, 초기 데이터 insert 단계가 순서대로 실행되는지 확인한다.\n14. multi-csp-k8s-cluster-deploy 실행 시 CSP_LIST 기준 K8s n종 배포가 실행되는지 확인한다.\n15. 최종 Status가 SUCCESS 또는 실패 시 원인 확인 가능한 상태로 변경되는지 확인한다.","실행 대상 Workflow:\n1. vm-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- INFRA_ID: vm-mariadb-data-init\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- DB_PASSWORD: mariadb_pass\n- DB_BACKUP_FILE: schema.sql\n- INSERT_SQL: sample row\n\n2. multi-csp-vm-deploy\n- NAMESPACE: ns01\n- CSP_LIST: aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm,kt\n- INFRA_PREFIX: multi-csp-vm\n- INFRA_NODEGROUP_NAME: g1\n- INFRA_NODEGROUP_SIZE: 1\n\n3. k8s-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- K8S_CLUSTER_ID: k8s-mariadb-data-init\n- K8S_NODEGROUP_NAME: ng1\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- K8S_VERSION: 1.33\n- RELEASE_NAME: mariadb\n- DB_NAME: testdb\n\n4. multi-csp-k8s-cluster-deploy\n- NAMESPACE: ns01\n- CSP_LIST: aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm\n- CLUSTER_PREFIX: multi-csp-k8s\n- K8S_NODEGROUP_PREFIX: ng\n- K8S_VERSION: CSP별 유효 버전","1. Workflow 실행 요청이 접수됨\n2. Jenkins Build가 생성됨\n3. Status가 진행 상태로 표시됨\n4. 화면 새로고침 없이 목록 상태가 갱신됨\n5. vm-mariadb-backup-import-data-init 실행 시 AWS VM 생성, MariaDB 설치, Data Import, Data Insert 완료\n6. multi-csp-vm-deploy 실행 시 CSP별 VM 생성 요청 완료\n7. k8s-mariadb-backup-import-data-init 실행 시 AWS K8s Cluster/NodeGroup 생성, MariaDB Helm 설치, Data Import, Data Insert 완료\n8. multi-csp-k8s-cluster-deploy 실행 시 CSP별 K8s Cluster 생성 요청 완료\n9. 성공 시 최종 Status가 SUCCESS로 표시됨\n10. 실패 시 Jenkins Console Log에서 실패 원인 확인 가능","1. TC-WF-FLOW-01 완료\n2. TC-WF-FLOW-02 완료\n3. Tumblebug API 접근 가능\n4. Jenkins에서 Tumblebug endpoint 접근 가능\n5. 대상 CSP credential/connection 준비\n6. VM/K8s 생성에 필요한 spec, image, zone, version 값 준비\n7. 테스트용 SQL 내용 준비"],["TC-WF-FLOW-07","Workflow 로그 모달 표시","1. TC-WF-FLOW-06으로 Workflow를 실행한다.\n2. Workflow 목록에서 실행한 Workflow의 LOG 버튼을 클릭한다.\n3. Workflow Log 모달이 표시되는지 확인한다.\n4. Build 번호 목록이 표시되는지 확인한다.\n5. 최신 Build 항목을 클릭한다.\n6. Jenkins Console Log가 표시되는지 확인한다.\n7. namespace-ensure 로그를 확인한다.\n8. VM 또는 K8s 생성 단계 로그를 확인한다.\n9. MariaDB 설치 단계 로그를 확인한다.\n10. Data Import 단계 로그를 확인한다.\n11. Data Insert 단계 로그를 확인한다.\n12. 실패한 단계가 있는 경우 오류 메시지가 로그에 표시되는지 확인한다.\n13. 모달 닫기 후 목록 화면으로 복귀되는지 확인한다.","Workflow:\n- vm-mariadb-backup-import-data-init\n- multi-csp-vm-deploy\n- k8s-mariadb-backup-import-data-init\n- multi-csp-k8s-cluster-deploy\nBuild: latest build","1. Workflow Log 모달이 표시됨\n2. Build 번호가 표시됨\n3. Jenkins Console Log가 표시됨\n4. Workflow별 Stage 로그가 표시됨\n5. 실패 시 오류 메시지가 표시됨\n6. 모달 닫기 시 목록 화면이 유지됨","1. TC-WF-FLOW-06 완료\n2. Jenkins Build 이력 존재"],["TC-WF-EL-01","Event Listener 목록 조회","1. M-CMP 포털에서 Workspace를 선택한다.\n2. Project를 선택한다.\n3. Workflow 메뉴로 이동한다.\n4. Event Listener 탭을 클릭한다.\n5. Event Listener 목록 화면이 표시되는지 확인한다.\n6. Event Listener Name, Connect Workflow Name, Event Listener Desc, Action URL, Action 컬럼이 표시되는지 확인한다.\n7. 등록된 Event Listener가 있는 경우 목록에 표시되는지 확인한다.\n8. 등록된 Event Listener가 없는 경우 빈 목록 또는 No Data 안내가 표시되는지 확인한다.","Workspace: ws01\nProject: 존재하는 project","1. Event Listener 목록 화면이 표시됨\n2. 등록된 Event Listener 목록이 표시됨\n3. 연결된 Workflow명이 표시됨\n4. Action URL이 표시됨\n5. 수정/삭제 버튼이 표시됨","1. 사용자 로그인 완료\n2. Workspace/Project 선택 완료\n3. Workflow 메뉴 접근 권한 보유"],["TC-WF-EL-02","신규 Event Listener 생성","1. Event Listener 목록 화면으로 이동한다.\n2. New Event Listener 버튼을 클릭한다.\n3. Event Listener 생성 화면이 표시되는지 확인한다.\n4. Event Listener Name을 입력한다.\n5. Description을 입력한다.\n6. Connect Workflow를 선택한다.\n7. Event Listener 실행 시 전달할 기본 파라미터를 입력한다.\n8. 저장 버튼을 클릭한다.\n9. Event Listener 목록으로 이동 후 신규 Event Listener가 표시되는지 확인한다.\n10. Action URL이 생성되었는지 확인한다.","Event Listener Name: el-vm-mariadb-backup-import-data-init\nDescription: VM MariaDB data init webhook\nWorkflow: vm-mariadb-backup-import-data-init\n기본 파라미터:\n- NAMESPACE: ns01\n- INFRA_ID: vm-mariadb-data-init\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- DB_PASSWORD: mariadb_pass","1. Event Listener 생성 성공 메시지가 표시됨\n2. Event Listener 목록에 신규 항목이 표시됨\n3. 연결된 Workflow명이 표시됨\n4. Action URL이 생성됨\n5. 실행 파라미터가 저장됨","1. TC-WF-EL-01 완료\n2. 연결 대상 Workflow 존재\n3. Jenkins OSS 연결 완료"],["TC-WF-EL-03","Event Listener 이름 중복 검사","1. Event Listener 목록 화면으로 이동한다.\n2. New Event Listener 버튼을 클릭한다.\n3. 기존에 등록된 Event Listener Name을 입력한다.\n4. Duplicate Check 버튼을 클릭한다.\n5. 중복 메시지가 표시되는지 확인한다.\n6. 미사용 이름으로 변경한다.\n7. Duplicate Check 버튼을 다시 클릭한다.\n8. 사용 가능 메시지가 표시되는지 확인한다.\n9. 중복 확인 전에는 저장이 제한되는지 확인한다.","기존 이름: el-vm-mariadb-backup-import-data-init\n신규 이름: el-vm-mariadb-backup-import-data-init-02","1. 기존 이름 입력 시 중복 안내 메시지가 표시됨\n2. 미사용 이름 입력 시 사용 가능 메시지가 표시됨\n3. 중복 확인 완료 후 저장 가능 상태가 됨\n4. 중복 확인 전 저장이 제한됨","1. TC-WF-EL-02 완료\n2. 기존 Event Listener 존재"],["TC-WF-EL-04","Event Listener 상세 수정","1. Event Listener 목록 화면으로 이동한다.\n2. 수정 대상 Event Listener를 찾는다.\n3. Detail 또는 Edit 버튼을 클릭한다.\n4. 기존 Event Listener Name, Description, Connect Workflow, Parameter 값이 표시되는지 확인한다.\n5. Description을 수정한다.\n6. 필요 시 Connect Workflow 또는 실행 파라미터를 수정한다.\n7. 저장 버튼을 클릭한다.\n8. 목록으로 이동 후 다시 상세 화면에 진입한다.\n9. 수정값이 유지되는지 확인한다.","Event Listener: el-vm-mariadb-backup-import-data-init\n수정 예시:\n- Description: updated webhook desc\n- DB_NAME: testdb\n- INSERT_SQL: INSERT INTO sample_data ...","1. Event Listener 수정 성공 메시지가 표시됨\n2. 수정된 Description이 표시됨\n3. 수정된 Workflow 연결 정보가 유지됨\n4. 수정된 실행 파라미터가 유지됨\n5. Action URL 호출 시 수정된 파라미터가 반영됨","1. TC-WF-EL-02 완료\n2. 수정 대상 Event Listener 존재"],["TC-WF-EL-05","Event Listener 삭제","1. 삭제 검증용 Event Listener를 사전에 생성한다.\n2. Event Listener 목록 화면으로 이동한다.\n3. 삭제 대상 Event Listener를 찾는다.\n4. 삭제 버튼을 클릭한다.\n5. 삭제 확인 모달이 표시되는지 확인한다.\n6. 모달에 삭제 대상 이름이 표시되는지 확인한다.\n7. Delete 버튼을 클릭한다.\n8. 목록이 재조회되는지 확인한다.\n9. 삭제한 Event Listener가 목록에서 제거되었는지 확인한다.\n10. 삭제된 Action URL 호출 시 Workflow가 실행되지 않는지 확인한다.","Event Listener: el-delete-test","1. 삭제 확인 모달이 표시됨\n2. Event Listener 삭제 성공 메시지가 표시됨\n3. 목록에서 삭제 대상이 제거됨\n4. 삭제된 Event Listener URL로 Workflow 실행 불가","1. 삭제 검증용 Event Listener 생성\n2. 연결 대상 Workflow 존재"],["TC-WF-EL-06","Event Listener를 통한 Workflow 실행 (GET)","1. TC-WF-EL-02로 생성한 Event Listener의 Action URL을 확인한다.\n2. GET 방식 호출 도구 또는 브라우저 주소창을 준비한다.\n3. Action URL 뒤에 Query Parameter를 추가한다.\n4. GET 요청을 실행한다.\n5. API 응답이 정상인지 확인한다.\n6. Workflow 목록 화면으로 이동한다.\n7. 연결된 Workflow의 Status가 갱신되는지 확인한다.\n8. Jenkins Build가 생성되었는지 확인한다.\n9. Workflow LOG에서 Event Listener로 전달한 파라미터가 반영되었는지 확인한다.","Method: GET\nURL: /eventlistener/run/{eventListenerIdx}\nQuery 예시:\nNAMESPACE=ns01\nINFRA_ID=vm-mariadb-data-init\nREGION=ap-northeast-2\nCONNECTION_NAME=aws-ap-northeast-2\nDB_NAME=testdb","1. Event Listener 실행 요청이 접수됨\n2. 연결된 Workflow가 실행됨\n3. Query Parameter 값이 Workflow 실행 파라미터로 반영됨\n4. Workflow Status가 갱신됨\n5. Jenkins Build 로그가 생성됨","1. TC-WF-EL-02 완료\n2. 연결된 Workflow 실행 가능 상태\n3. Jenkins OSS 연결 완료"],["TC-WF-EL-07","Event Listener를 통한 Workflow 실행 (POST)","1. TC-WF-EL-02로 생성한 Event Listener의 Action URL을 확인한다.\n2. API 호출 도구를 실행한다.\n3. Method를 POST로 설정한다.\n4. Request Body에 Workflow 실행 파라미터를 JSON 형식으로 입력한다.\n5. POST 요청을 실행한다.\n6. API 응답이 정상인지 확인한다.\n7. Workflow 목록 화면에서 연결된 Workflow의 Status 갱신을 확인한다.\n8. Jenkins Build가 생성되었는지 확인한다.\n9. Workflow LOG에서 Body로 전달한 파라미터가 반영되었는지 확인한다.\n10. 최종 실행 결과 또는 실패 원인이 확인되는지 확인한다.","Method: POST\nURL: /eventlistener/run/{eventListenerIdx}\nBody 예시:\n{\n \"NAMESPACE\": \"ns01\",\n \"INFRA_ID\": \"vm-mariadb-data-init\",\n \"REGION\": \"ap-northeast-2\",\n \"CONNECTION_NAME\": \"aws-ap-northeast-2\",\n \"DB_NAME\": \"testdb\",\n \"INSERT_SQL\": \"INSERT INTO sample_data (id, name) VALUES (2, 'event row');\"\n}","1. Event Listener 실행 요청이 접수됨\n2. 연결된 Workflow가 실행됨\n3. Request Body 값이 Workflow 실행 파라미터로 반영됨\n4. Workflow Status가 갱신됨\n5. Jenkins Build 로그가 생성됨\n6. 최종 실행 결과 또는 실패 원인이 LOG에서 확인됨","1. TC-WF-EL-02 완료\n2. 연결된 Workflow 실행 가능 상태\n3. Jenkins OSS 연결 완료"]]} +{"kind":"table","sheet":"Workflow Test Cases","address":"A1:F17","rows":17,"cols":6,"values":[["mc-workflow-manager Workflow / Event Listener Test Scenarios",null,null,null,null,null],["현재 소스 기준 workflow명 반영",null,null,null,null,null],["TC-ID","기능명","테스트 방법","입력값","출력값","선행작업"],["TC-WF-FLOW-01","Workflow Engine(Jenkins) 등록 및 연동 확인","1. M-CMP 포털에 로그인한다.\n2. 상단 Workspace 선택 영역에서 테스트 Workspace를 선택한다.\n3. Project 선택 영역에서 테스트 Project를 선택한다.\n4. Workflow 메뉴로 이동한다.\n5. Workflow Engine 또는 OSS/Jenkins 설정 영역을 확인한다.\n6. Jenkins OSS 정보가 등록되어 있는지 확인한다.\n7. Jenkins URL, 인증 정보, 연결 상태를 확인한다.\n8. Jenkins 연동 테스트 또는 Workflow 실행 준비 상태를 확인한다.","Workspace: ws01\nProject: 존재하는 project\nWorkflow Engine: Jenkins\nOSS: Jenkins 기본 등록 정보","1. Jenkins OSS 정보가 등록되어 있음\n2. mc-workflow-manager에서 Jenkins API 호출 가능\n3. Workflow 생성/수정/삭제/실행 시 Jenkins Job 연동 가능\n4. Jenkins 연동 오류 메시지가 표시되지 않음","1. 사용자 로그인 완료\n2. Workspace 생성 완료\n3. Project 생성 완료\n4. Jenkins 서버 구동 완료\n5. mc-workflow-manager 접근 권한 보유"],["TC-WF-FLOW-02","Workflow 목록 조회","1. M-CMP 포털에 로그인한다.\n2. 상단 Workspace 선택 영역에서 테스트 Workspace를 선택한다.\n3. Project 선택 영역에서 테스트 Project를 선택한다.\n4. Workflow 메뉴를 클릭한다.\n5. Workflow 목록 화면 제목과 목록 영역이 표시되는지 확인한다.\n6. Workflow Name, Purpose, Status, Params Count, Created Date, Action 컬럼이 표시되는지 확인한다.\n7. Action 영역에 Detail, DELETE, RUN, LOG 버튼이 표시되는지 확인한다.\n8. 기본 등록된 Workflow 4종이 표시되는지 확인한다.","Workspace: ws01\nProject: 존재하는 project\n확인 대상 Workflow:\n- vm-mariadb-backup-import-data-init\n- multi-csp-vm-deploy\n- k8s-mariadb-backup-import-data-init\n- multi-csp-k8s-cluster-deploy","1. 등록된 Workflow 목록이 테이블로 표시됨\n2. Status, Params Count, Created Date 값이 표시됨\n3. Detail/DELETE/RUN/LOG 버튼이 표시됨\n4. 기본 Workflow 4종이 목록에 표시됨","1. TC-WF-FLOW-01 완료\n2. Workflow 기본 seed 데이터 등록 완료"],["TC-WF-FLOW-03","신규 Workflow 생성","1. Workflow 목록 화면에서 New Workflow 버튼을 클릭한다.\n2. Workflow 생성 화면이 표시되는지 확인한다.\n3. Workflow Name을 입력한다.\n4. Purpose를 선택한다.\n5. Tumblebug Parameter Selection 사용 여부를 선택한다.\n6. Create Script 버튼을 클릭한다.\n7. Pipeline Generator 영역에서 필요한 Stage를 추가한다.\n8. Stage별 실행 파라미터를 구성한다.\n9. 생성된 Script에 Stage가 순서대로 포함되는지 확인한다.\n10. Param 영역에 실행 파라미터가 정상 표시되는지 확인한다.\n11. Regist 버튼을 클릭한다.\n12. Workflow 목록으로 이동 후 신규 Workflow가 표시되는지 확인한다.","Workflow Name: workflow-create-test\nPurpose: For Deployment\nStage 예시:\n- namespace-ensure\n- infra-create 또는 k8s-cluster-create\n- db-backup-import\n- db-data-insert\nTumblebug Selector: 필요 시 Y","1. Workflow 생성 성공 메시지가 표시됨\n2. Workflow 목록에 신규 Workflow가 표시됨\n3. Pipeline Script가 생성됨\n4. Jenkins Job이 생성됨\n5. Param Count가 입력한 파라미터 수와 일치함","1. TC-WF-FLOW-01 완료\n2. Jenkins OSS 연결 완료\n3. Workflow Stage 기본 데이터 등록 완료"],["TC-WF-FLOW-04","Workflow 상세 수정","1. Workflow 목록에서 수정 대상 Workflow를 찾는다.\n2. Detail 버튼을 클릭한다.\n3. Workflow 상세 화면이 표시되는지 확인한다.\n4. 기존 Workflow Name, Purpose, Pipeline, Parameter 값이 표시되는지 확인한다.\n5. Parameter 값을 수정한다.\n6. 필요 시 Pipeline Script 또는 Stage 설정을 수정한다.\n7. Tumblebug Parameter Selection 사용 여부를 수정한다.\n8. 수정된 값이 Script와 Param 영역에 반영되는지 확인한다.\n9. Edit 버튼을 클릭한다.\n10. 목록으로 이동 후 다시 Detail에 진입하여 수정값이 유지되는지 확인한다.","Workflow: vm-mariadb-backup-import-data-init\n수정 예시:\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- INSERT_SQL: sample row 추가\n- SPEC_ID 또는 IMAGE_ID 재선택","1. Workflow 수정 성공 메시지가 표시됨\n2. Jenkins Job Pipeline 설정이 갱신됨\n3. 상세 화면 재조회 시 수정된 값이 표시됨\n4. 수정된 Parameter가 유지됨\n5. Workflow 목록의 Params Count가 변경 내용과 일치함","1. TC-WF-FLOW-02 완료\n2. 수정 대상 Workflow 존재"],["TC-WF-FLOW-05","Workflow 삭제","1. 삭제 검증용 Workflow를 사전에 생성한다.\n2. Workflow 목록 화면으로 이동한다.\n3. 삭제 대상 Workflow를 찾는다.\n4. DELETE 버튼을 클릭한다.\n5. 삭제 확인 모달이 표시되는지 확인한다.\n6. 모달에 삭제 대상 Workflow Name이 표시되는지 확인한다.\n7. Delete 버튼을 클릭한다.\n8. 목록이 재조회되는지 확인한다.\n9. 삭제한 Workflow가 목록에서 제거되었는지 확인한다.\n10. 동일 이름으로 신규 Workflow 생성이 가능한지 확인한다.","Workflow: workflow-delete-test","1. 삭제 확인 모달이 표시됨\n2. Workflow 삭제 성공 메시지가 표시됨\n3. Workflow 목록에서 삭제 대상이 제거됨\n4. 연결된 Jenkins Job이 삭제됨\n5. 삭제 후 동일 Workflow Name 재사용 가능","1. TC-WF-FLOW-03 완료\n2. 삭제 검증용 Workflow 사전 생성\n3. Jenkins Job 생성 완료 상태"],["TC-WF-FLOW-06","Workflow 실행 (RUN)","1. Workflow 목록 화면으로 이동한다.\n2. 실행 대상 Workflow의 RUN 버튼을 클릭한다.\n3. 실행 파라미터 입력 모달이 표시되는지 확인한다.\n4. Tumblebug Parameter Selection 영역이 필요한 Workflow에서 표시되는지 확인한다.\n5. Region, Connection, Zone, Image, Spec, K8s Version 값을 확인한다.\n6. 필요 시 실행 파라미터 값을 수정한다.\n7. Run 버튼을 클릭한다.\n8. 실행 요청 접수 메시지가 표시되는지 확인한다.\n9. 화면 새로고침 없이 Status 값이 자동 갱신되는지 확인한다.\n10. Jenkins Build가 시작되는지 확인한다.\n11. vm-mariadb-backup-import-data-init 실행 시 VM 1종 AWS 배포, MariaDB 설치, schema import, 초기 데이터 insert 단계가 순서대로 실행되는지 확인한다.\n12. multi-csp-vm-deploy 실행 시 CSP_LIST 기준 VM n종 배포가 실행되는지 확인한다.\n13. k8s-mariadb-backup-import-data-init 실행 시 K8s 1종 AWS 배포, MariaDB Helm 설치, schema import, 초기 데이터 insert 단계가 순서대로 실행되는지 확인한다.\n14. multi-csp-k8s-cluster-deploy 실행 시 CSP_LIST 기준 K8s n종 배포가 실행되는지 확인한다.\n15. 최종 Status가 SUCCESS 또는 실패 시 원인 확인 가능한 상태로 변경되는지 확인한다.","실행 대상 Workflow:\n1. vm-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- INFRA_ID: vm-mariadb-data-init\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- DB_PASSWORD: mariadb_pass\n- DB_BACKUP_FILE: schema.sql\n- INSERT_SQL: sample row\n\n2. multi-csp-vm-deploy\n- NAMESPACE: ns01\n- CSP_LIST: alibaba,aws,azure,gcp,ibm,kt,ncp,nhn,tencent\n- INFRA_PREFIX: multi-csp-vm\n- INFRA_NODEGROUP_NAME: g1\n- INFRA_NODEGROUP_SIZE: 1\n\n3. k8s-mariadb-backup-import-data-init\n- NAMESPACE: ns01\n- K8S_CLUSTER_ID: k8s-mariadb-data-init\n- K8S_NODEGROUP_NAME: ng1\n- CSP/Provider: aws\n- REGION: ap-northeast-2\n- CONNECTION_NAME: aws-ap-northeast-2\n- K8S_VERSION: 1.33\n- RELEASE_NAME: mariadb\n- DB_NAME: testdb\n\n4. multi-csp-k8s-cluster-deploy\n- NAMESPACE: ns01\n- CSP_LIST: alibaba,aws,azure,gcp,ibm,ncp,nhn,tencent\n- CLUSTER_PREFIX: multi-csp-k8s\n- K8S_NODEGROUP_PREFIX: ng\n- K8S_VERSION: CSP별 유효 버전","1. Workflow 실행 요청이 접수됨\n2. Jenkins Build가 생성됨\n3. Status가 진행 상태로 표시됨\n4. 화면 새로고침 없이 목록 상태가 갱신됨\n5. vm-mariadb-backup-import-data-init 실행 시 AWS VM 생성, MariaDB 설치, Data Import, Data Insert 완료\n6. multi-csp-vm-deploy 실행 시 CSP별 VM 생성 요청 완료\n7. k8s-mariadb-backup-import-data-init 실행 시 AWS K8s Cluster/NodeGroup 생성, MariaDB Helm 설치, Data Import, Data Insert 완료\n8. multi-csp-k8s-cluster-deploy 실행 시 CSP별 K8s Cluster 생성 요청 완료\n9. 성공 시 최종 Status가 SUCCESS로 표시됨\n10. 실패 시 Jenkins Console Log에서 실패 원인 확인 가능","1. TC-WF-FLOW-01 완료\n2. TC-WF-FLOW-02 완료\n3. Tumblebug API 접근 가능\n4. Jenkins에서 Tumblebug endpoint 접근 가능\n5. 대상 CSP credential/connection 준비\n6. VM/K8s 생성에 필요한 spec, image, zone, version 값 준비\n7. 테스트용 SQL 내용 준비"],["TC-WF-FLOW-07","Workflow 로그 모달 표시","1. TC-WF-FLOW-06으로 Workflow를 실행한다.\n2. Workflow 목록에서 실행한 Workflow의 LOG 버튼을 클릭한다.\n3. Workflow Log 모달이 표시되는지 확인한다.\n4. Build 번호 목록이 표시되는지 확인한다.\n5. 최신 Build 항목을 클릭한다.\n6. Jenkins Console Log가 표시되는지 확인한다.\n7. namespace-ensure 로그를 확인한다.\n8. VM 또는 K8s 생성 단계 로그를 확인한다.\n9. MariaDB 설치 단계 로그를 확인한다.\n10. Data Import 단계 로그를 확인한다.\n11. Data Insert 단계 로그를 확인한다.\n12. 실패한 단계가 있는 경우 오류 메시지가 로그에 표시되는지 확인한다.\n13. 모달 닫기 후 목록 화면으로 복귀되는지 확인한다.","Workflow:\n- vm-mariadb-backup-import-data-init\n- multi-csp-vm-deploy\n- k8s-mariadb-backup-import-data-init\n- multi-csp-k8s-cluster-deploy\nBuild: latest build","1. Workflow Log 모달이 표시됨\n2. Build 번호가 표시됨\n3. Jenkins Console Log가 표시됨\n4. Workflow별 Stage 로그가 표시됨\n5. 실패 시 오류 메시지가 표시됨\n6. 모달 닫기 시 목록 화면이 유지됨","1. TC-WF-FLOW-06 완료\n2. Jenkins Build 이력 존재"],["TC-WF-EL-01","Event Listener 목록 조회","1. M-CMP 포털에서 Workspace를 선택한다.\n2. Project를 선택한다.\n3. Workflow 메뉴로 이동한다.\n4. Event Listener 탭을 클릭한다.\n5. Event Listener 목록 화면이 표시되는지 확인한다.\n6. Event Listener Name, Connect Workflow Name, Event Listener Desc, Action URL, Action 컬럼이 표시되는지 확인한다.\n7. 등록된 Event Listener가 있는 경우 목록에 표시되는지 확인한다.\n8. 등록된 Event Listener가 없는 경우 빈 목록 또는 No Data 안내가 표시되는지 확인한다.","Workspace: ws01\nProject: 존재하는 project","1. Event Listener 목록 화면이 표시됨\n2. 등록된 Event Listener 목록이 표시됨\n3. 연결된 Workflow명이 표시됨\n4. Action URL이 표시됨\n5. 수정/삭제 버튼이 표시됨","1. 사용자 로그인 완료\n2. Workspace/Project 선택 완료\n3. Workflow 메뉴 접근 권한 보유"],["TC-WF-EL-02","신규 Event Listener 생성","1. Event Listener 목록 화면으로 이동한다.\n2. New Event Listener 버튼을 클릭한다.\n3. Event Listener 생성 화면이 표시되는지 확인한다.\n4. Event Listener Name을 입력한다.\n5. Description을 입력한다.\n6. Connect Workflow를 선택한다.\n7. Event Listener 실행 시 전달할 기본 파라미터를 입력한다.\n8. 저장 버튼을 클릭한다.\n9. Event Listener 목록으로 이동 후 신규 Event Listener가 표시되는지 확인한다.\n10. Action URL이 생성되었는지 확인한다.","Event Listener Name: el-vm-mariadb-backup-import-data-init\nDescription: VM MariaDB data init webhook\nWorkflow: vm-mariadb-backup-import-data-init\n기본 파라미터:\n- NAMESPACE: ns01\n- INFRA_ID: vm-mariadb-data-init\n- DB_NAME: testdb\n- DB_USER: mariadb_user\n- DB_PASSWORD: mariadb_pass","1. Event Listener 생성 성공 메시지가 표시됨\n2. Event Listener 목록에 신규 항목이 표시됨\n3. 연결된 Workflow명이 표시됨\n4. Action URL이 생성됨\n5. 실행 파라미터가 저장됨","1. TC-WF-EL-01 완료\n2. 연결 대상 Workflow 존재\n3. Jenkins OSS 연결 완료"],["TC-WF-EL-03","Event Listener 이름 중복 검사","1. Event Listener 목록 화면으로 이동한다.\n2. New Event Listener 버튼을 클릭한다.\n3. 기존에 등록된 Event Listener Name을 입력한다.\n4. Duplicate Check 버튼을 클릭한다.\n5. 중복 메시지가 표시되는지 확인한다.\n6. 미사용 이름으로 변경한다.\n7. Duplicate Check 버튼을 다시 클릭한다.\n8. 사용 가능 메시지가 표시되는지 확인한다.\n9. 중복 확인 전에는 저장이 제한되는지 확인한다.","기존 이름: el-vm-mariadb-backup-import-data-init\n신규 이름: el-vm-mariadb-backup-import-data-init-02","1. 기존 이름 입력 시 중복 안내 메시지가 표시됨\n2. 미사용 이름 입력 시 사용 가능 메시지가 표시됨\n3. 중복 확인 완료 후 저장 가능 상태가 됨\n4. 중복 확인 전 저장이 제한됨","1. TC-WF-EL-02 완료\n2. 기존 Event Listener 존재"],["TC-WF-EL-04","Event Listener 상세 수정","1. Event Listener 목록 화면으로 이동한다.\n2. 수정 대상 Event Listener를 찾는다.\n3. Detail 또는 Edit 버튼을 클릭한다.\n4. 기존 Event Listener Name, Description, Connect Workflow, Parameter 값이 표시되는지 확인한다.\n5. Description을 수정한다.\n6. 필요 시 Connect Workflow 또는 실행 파라미터를 수정한다.\n7. 저장 버튼을 클릭한다.\n8. 목록으로 이동 후 다시 상세 화면에 진입한다.\n9. 수정값이 유지되는지 확인한다.","Event Listener: el-vm-mariadb-backup-import-data-init\n수정 예시:\n- Description: updated webhook desc\n- DB_NAME: testdb\n- INSERT_SQL: INSERT INTO sample_data ...","1. Event Listener 수정 성공 메시지가 표시됨\n2. 수정된 Description이 표시됨\n3. 수정된 Workflow 연결 정보가 유지됨\n4. 수정된 실행 파라미터가 유지됨\n5. Action URL 호출 시 수정된 파라미터가 반영됨","1. TC-WF-EL-02 완료\n2. 수정 대상 Event Listener 존재"],["TC-WF-EL-05","Event Listener 삭제","1. 삭제 검증용 Event Listener를 사전에 생성한다.\n2. Event Listener 목록 화면으로 이동한다.\n3. 삭제 대상 Event Listener를 찾는다.\n4. 삭제 버튼을 클릭한다.\n5. 삭제 확인 모달이 표시되는지 확인한다.\n6. 모달에 삭제 대상 이름이 표시되는지 확인한다.\n7. Delete 버튼을 클릭한다.\n8. 목록이 재조회되는지 확인한다.\n9. 삭제한 Event Listener가 목록에서 제거되었는지 확인한다.\n10. 삭제된 Action URL 호출 시 Workflow가 실행되지 않는지 확인한다.","Event Listener: el-delete-test","1. 삭제 확인 모달이 표시됨\n2. Event Listener 삭제 성공 메시지가 표시됨\n3. 목록에서 삭제 대상이 제거됨\n4. 삭제된 Event Listener URL로 Workflow 실행 불가","1. 삭제 검증용 Event Listener 생성\n2. 연결 대상 Workflow 존재"],["TC-WF-EL-06","Event Listener를 통한 Workflow 실행 (GET)","1. TC-WF-EL-02로 생성한 Event Listener의 Action URL을 확인한다.\n2. GET 방식 호출 도구 또는 브라우저 주소창을 준비한다.\n3. Action URL 뒤에 Query Parameter를 추가한다.\n4. GET 요청을 실행한다.\n5. API 응답이 정상인지 확인한다.\n6. Workflow 목록 화면으로 이동한다.\n7. 연결된 Workflow의 Status가 갱신되는지 확인한다.\n8. Jenkins Build가 생성되었는지 확인한다.\n9. Workflow LOG에서 Event Listener로 전달한 파라미터가 반영되었는지 확인한다.","Method: GET\nURL: /eventlistener/run/{eventListenerIdx}\nQuery 예시:\nNAMESPACE=ns01\nINFRA_ID=vm-mariadb-data-init\nREGION=ap-northeast-2\nCONNECTION_NAME=aws-ap-northeast-2\nDB_NAME=testdb","1. Event Listener 실행 요청이 접수됨\n2. 연결된 Workflow가 실행됨\n3. Query Parameter 값이 Workflow 실행 파라미터로 반영됨\n4. Workflow Status가 갱신됨\n5. Jenkins Build 로그가 생성됨","1. TC-WF-EL-02 완료\n2. 연결된 Workflow 실행 가능 상태\n3. Jenkins OSS 연결 완료"],["TC-WF-EL-07","Event Listener를 통한 Workflow 실행 (POST)","1. TC-WF-EL-02로 생성한 Event Listener의 Action URL을 확인한다.\n2. API 호출 도구를 실행한다.\n3. Method를 POST로 설정한다.\n4. Request Body에 Workflow 실행 파라미터를 JSON 형식으로 입력한다.\n5. POST 요청을 실행한다.\n6. API 응답이 정상인지 확인한다.\n7. Workflow 목록 화면에서 연결된 Workflow의 Status 갱신을 확인한다.\n8. Jenkins Build가 생성되었는지 확인한다.\n9. Workflow LOG에서 Body로 전달한 파라미터가 반영되었는지 확인한다.\n10. 최종 실행 결과 또는 실패 원인이 확인되는지 확인한다.","Method: POST\nURL: /eventlistener/run/{eventListenerIdx}\nBody 예시:\n{\n \"NAMESPACE\": \"ns01\",\n \"INFRA_ID\": \"vm-mariadb-data-init\",\n \"REGION\": \"ap-northeast-2\",\n \"CONNECTION_NAME\": \"aws-ap-northeast-2\",\n \"DB_NAME\": \"testdb\",\n \"INSERT_SQL\": \"INSERT INTO sample_data (id, name) VALUES (2, 'event row');\"\n}","1. Event Listener 실행 요청이 접수됨\n2. 연결된 Workflow가 실행됨\n3. Request Body 값이 Workflow 실행 파라미터로 반영됨\n4. Workflow Status가 갱신됨\n5. Jenkins Build 로그가 생성됨\n6. 최종 실행 결과 또는 실패 원인이 LOG에서 확인됨","1. TC-WF-EL-02 완료\n2. 연결된 Workflow 실행 가능 상태\n3. Jenkins OSS 연결 완료"]]} {"kind":"region","sheet":"Workflow Test Cases","address":"A1:F17","rows":17,"cols":6,"nonEmpty":92,"blank":10,"text":92,"maxTextLength":951,"preview":[["mc-workflow-manager Workflow / Event Listener Test Scenarios",null,null,null,null,null],["현재 소스 기준 workflow명 반영",null,null,null,null,null],["TC-ID","기능명","테스트 방법","입력값","출력값","선행작업"],["TC-WF-FLOW-01","Workflow Engine(Jenkins) 등록 및 연동 확인","1. M-CMP 포털에 로그인한다.\n2. 상단 Workspace 선택 영역에서 테스트 Workspace를 선택한다.\n3. Project 선...","Workspace: ws01\nProject: 존재하는 project\nWorkflow Engine: Jenkins\nOSS: Jenkins 기...","1. Jenkins OSS 정보가 등록되어 있음\n2. mc-workflow-manager에서 Jenkins API 호출 가능\n3. Work...","1. 사용자 로그인 완료\n2. Workspace 생성 완료\n3. Project 생성 완료\n4. Jenkins 서버 구동 완료\n5. mc-w..."],["TC-WF-FLOW-02","Workflow 목록 조회","1. M-CMP 포털에 로그인한다.\n2. 상단 Workspace 선택 영역에서 테스트 Workspace를 선택한다.\n3. Project 선...","Workspace: ws01\nProject: 존재하는 project\n확인 대상 Workflow:\n- vm-mariadb-backup-imp...","1. 등록된 Workflow 목록이 테이블로 표시됨\n2. Status, Params Count, Created Date 값이 표시됨\n3. ...","1. TC-WF-FLOW-01 완료\n2. Workflow 기본 seed 데이터 등록 완료"]],"previewAddress":"A1:F5","previewRows":5,"previewCols":6} {"kind":"computedStyle","sheet":"Workflow Test Cases","for":"A1","style":{"fill":{"type":1,"color":{"type":1,"value":"1F4E78"},"gradientStops":[],"pictureEffects":[]},"font":{"bold":true,"fontSize":14,"typeface":"Carlito","fill":{"type":0,"color":{"type":1,"value":"FFFFFF"},"gradientStops":[],"pictureEffects":[]}},"border":{},"wrapText":false,"horizontalAlignment":"center","styleId":4}} {"kind":"computedStyle","sheet":"Workflow Test Cases","for":"A2","style":{"fill":{"type":1,"color":{"type":1,"value":"EAF2F8"},"gradientStops":[],"pictureEffects":[]},"font":{"bold":true,"fontSize":11,"typeface":"Carlito","fill":{"type":0,"color":{"type":1,"value":"1F4E78"},"gradientStops":[],"pictureEffects":[]}},"border":{},"wrapText":false,"horizontalAlignment":"left","styleId":8}} diff --git a/src/main/java/kr/co/mcmp/workflowStage/dto/WorkflowStageDto.java b/src/main/java/kr/co/mcmp/workflowStage/dto/WorkflowStageDto.java index 801265a..3de2a55 100644 --- a/src/main/java/kr/co/mcmp/workflowStage/dto/WorkflowStageDto.java +++ b/src/main/java/kr/co/mcmp/workflowStage/dto/WorkflowStageDto.java @@ -376,7 +376,7 @@ private static List databaseParams(WorkflowParamDto... additio private static List multiCspVmParams() { List result = tumblebugParams( param("NAMESPACE", ""), - param("CSP_LIST", "aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm,kt"), + param("CSP_LIST", "alibaba,aws,azure,gcp,ibm,kt,ncp,nhn,tencent"), param("INFRA_ID", "multi-csp-vm"), param("INFRA_PREFIX", "multi-csp-vm"), param("INFRA_NODEGROUP_PREFIX", "ng"), @@ -386,25 +386,25 @@ private static List multiCspVmParams() { param("INSTALL_MON_AGENT", "no"), param("POLICY_ON_PARTIAL_FAILURE", "continue")); - addCspVmParams(result, "ALIBABA", "ap-northeast-1", "alibaba-ap-northeast-1", "ap-northeast-1a", - "alibaba+ap-northeast-1+ecs.u1-c1m2.large", "ubuntu_24_04_x64_20G_alibase_20260810.vhd"); - addCspVmParams(result, "AWS", "ap-northeast-1", "aws-ap-northeast-1", "ap-northeast-1a", - "aws+ap-northeast-1+t3.medium", "ami-0dc2aed7540019237"); - addCspVmParams(result, "AZURE", "koreasouth", "azure-koreasouth", "1", - "azure+koreasouth+Standard_D2s_v3", "Canonical:ubuntu-24_04-lts:minimal:24.04.202608100"); + addCspVmParams(result, "ALIBABA", "ap-northeast-2", "alibaba-ap-northeast-2", "ap-northeast-2a", + "alibaba+ap-northeast-2+ecs.g9i.large", "ubuntu_24_04_x64_20G_alibase_20260810.vhd"); + addCspVmParams(result, "AWS", "ap-northeast-2", "aws-ap-northeast-2", "ap-northeast-2a", + "aws+ap-northeast-2+m8i.large", "ami-01ed18897a4aadead"); + addCspVmParams(result, "AZURE", "koreacentral", "azure-koreacentral", "1", + "azure+koreacentral+Standard_D2s_v6", "Canonical:ubuntu-24_04-lts:minimal:24.04.202608100"); addCspVmParams(result, "GCP", "asia-northeast3", "gcp-asia-northeast3", "asia-northeast3-a", - "gcp+asia-northeast3+e2-medium", + "gcp+asia-northeast3+n4-standard-2", "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-minimal-2404-noble-amd64-v20260817"); - addCspVmParams(result, "IBM", "jp-osa", "ibm-jp-osa", "jp-osa-1", - "ibm+jp-osa+cx2-2x4", "r034-81a02369-9e59-4404-a922-30c110f1788d"); + addCspVmParams(result, "IBM", "jp-tok", "ibm-jp-tok", "jp-tok-1", + "ibm+jp-tok+bx2-2x8", "r022-9130f04e-631a-4e91-ae4c-b85d54621c24"); addCspVmParams(result, "KT", "kr1", "kt-kr1", "DX-M1", - "kt+kr1+2x4.itl", "e55c5985-b420-4a19-8c92-aa3461cda86e"); + "kt+kr1+2x8.itl", "e55c5985-b420-4a19-8c92-aa3461cda86e"); addCspVmParams(result, "NCP", "kr", "ncp-kr", "KR-1", - "ncp+kr+c2-g3a", "104630229"); + "ncp+kr+s2-g3", "104630229"); addCspVmParams(result, "NHN", "kr1", "nhn-kr1", "kr-pub-a", - "nhn+kr1+m2.c2m4", "5c38715f-0375-4167-af4e-56f75ba8b252"); + "nhn+kr1+r2.c2m8", "5c38715f-0375-4167-af4e-56f75ba8b252"); addCspVmParams(result, "TENCENT", "ap-seoul", "tencent-ap-seoul", "ap-seoul-1", - "tencent+ap-seoul+S5.MEDIUM4", "img-mmytdhbn"); + "tencent+ap-seoul+S5.MEDIUM8", "img-mmytdhbn"); return result; } @@ -420,7 +420,7 @@ private static List multiCspVmDeleteParams() { private static List multiCspK8sParams() { List result = tumblebugParams( param("NAMESPACE", ""), - param("CSP_LIST", "aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm"), + param("CSP_LIST", "alibaba,aws,azure,gcp,ibm,ncp,nhn,tencent"), param("CLUSTER_PREFIX", "multi-csp-k8s"), param("K8S_NODEGROUP_PREFIX", "ng"), param("K8S_VERSION", "1.35"), @@ -434,29 +434,29 @@ private static List multiCspK8sParams() { param("K8S_STATUS_INTERVAL_SECONDS", "10"), param("K8S_READY_STATUS", "Active,Running")); - addCspK8sParams(result, "AWS", "ap-northeast-1", "aws-ap-northeast-1", "ap-northeast-1a", - "aws+ap-northeast-1+t3.medium", "AL2023_x86_64_STANDARD", "1.35"); - addCspK8sParams(result, "AZURE", "koreasouth", "azure-koreasouth", "1", - "azure+koreasouth+Standard_D2s_v3", "", "1.35.7"); + addCspK8sParams(result, "ALIBABA", "ap-northeast-2", "alibaba-ap-northeast-2", "ap-northeast-2a", + "alibaba+ap-northeast-2+ecs.c9i.xlarge", "Ubuntu", "1.35.7-aliyun.1"); + addCspK8sParams(result, "AWS", "ap-northeast-2", "aws-ap-northeast-2", "ap-northeast-2a", + "aws+ap-northeast-2+c8i.xlarge", "AL2023_x86_64_STANDARD", "1.35"); + addCspK8sParams(result, "AZURE", "koreacentral", "azure-koreacentral", "1", + "azure+koreacentral+Standard_D4ls_v6", "", "1.35.7"); addCspK8sParams(result, "GCP", "asia-northeast3", "gcp-asia-northeast3", "asia-northeast3-a", - "gcp+asia-northeast3+e2-medium", "UBUNTU_CONTAINERD", "1.34.9-gke.1655001"); + "gcp+asia-northeast3+n4-highcpu-4", "UBUNTU_CONTAINERD", "1.34.10-gke.1236000"); + addCspK8sParams(result, "IBM", "jp-tok", "ibm-jp-tok", "jp-tok-1", + "ibm+jp-tok+cx2-4x8", "", "1.35.7"); addCspK8sParams(result, "NCP", "kr", "ncp-kr", "KR-1", - "ncp+kr+c2-g3a", "", "1.34.3-nks.1"); + "ncp+kr+c4-g3", "", "1.34.3-nks.1"); addCspK8sParams(result, "NHN", "kr1", "nhn-kr1", "kr-pub-a", - "nhn+kr1+m2.c2m4", "0f07c795-2a46-44fc-a61b-fa0d96763ce2", "v1.34.3"); - addCspK8sParams(result, "ALIBABA", "ap-northeast-1", "alibaba-ap-northeast-1", "ap-northeast-1a", - "alibaba+ap-northeast-1+ecs.u1-c1m2.xlarge", "AliyunLinux3ContainerOptimized", "1.35.7-aliyun.1"); + "nhn+kr1+m2.c4m8", "107cc02d-02d8-44fd-84d6-6c316045b817", "v1.34.3"); addCspK8sParams(result, "TENCENT", "ap-seoul", "tencent-ap-seoul", "ap-seoul-1", - "tencent+ap-seoul+S5.MEDIUM4", "ubuntu22.04x86_64", "1.34.1"); - addCspK8sParams(result, "IBM", "jp-osa", "ibm-jp-osa", "jp-osa-1", - "ibm+jp-osa+cx2-2x4", "", "1.35.7"); + "tencent+ap-seoul+S5.LARGE8", "ubuntu22.04x86_64", "1.34.1"); return result; } private static List multiCspK8sDeleteParams() { return tumblebugParams( param("NAMESPACE", ""), - param("CSP_LIST", "aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm"), + param("CSP_LIST", "alibaba,aws,azure,gcp,ibm,ncp,nhn,tencent"), param("CLUSTER_PREFIX", "multi-csp-k8s"), param("K8S_CLUSTER_ID_LIST", ""), param("K8S_NODEGROUP_PREFIX", "ng"), diff --git a/src/main/resources/import.sql b/src/main/resources/import.sql index 3589579..ff1aa3a 100644 --- a/src/main/resources/import.sql +++ b/src/main/resources/import.sql @@ -135,50 +135,50 @@ INSERT INTO workflow_stage (workflow_stage_idx, workflow_stage_type_idx, workflo def imageId, specId, rootDiskType, rootDiskSize, sgName if (CSP == "aws") { sgName = "g1" - imageId = "ami-03236529070b4a0a5" - specId = "aws+ap-northeast-2+t2.small" + imageId = "ami-01ed18897a4aadead" + specId = "aws+ap-northeast-2+m8i.large" rootDiskType = "gp3" rootDiskSize = 20 } else if (CSP == "azure") { sgName = "g2" - imageId = "Canonical:0001-com-ubuntu-server-jammy:22_04-lts:22.04.202505210" - specId = "azure+koreasouth+standard_b1s" + imageId = "Canonical:ubuntu-24_04-lts:minimal:24.04.202608100" + specId = "azure+koreacentral+Standard_D2s_v6" rootDiskType = "default" rootDiskSize = "default" } else if (CSP == "gcp") { sgName = "g3" - imageId = "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20250712" - specId = "gcp+asia-northeast3+g1-small" + imageId = "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-minimal-2404-noble-amd64-v20260817" + specId = "gcp+asia-northeast3+n4-standard-2" rootDiskType = "default" rootDiskSize = "default" } else if (CSP == "ncp") { sgName = "g4" - imageId = "23214590" - specId = "ncp+kr+c8-g3a" + imageId = "104630229" + specId = "ncp+kr+s2-g3" rootDiskType = "default" rootDiskSize = "default" } else if (CSP == "nhn") { sgName = "g5" - imageId = "abc5d0a0-4001-4e5b-ac28-de341b2a0834" - specId = "nhn+kr1+r2.c4m16" + imageId = "5c38715f-0375-4167-af4e-56f75ba8b252" + specId = "nhn+kr1+r2.c2m8" rootDiskType = "default" rootDiskSize = "default" } else if (CSP == "alibaba") { sgName = "g6" - imageId = "ubuntu_22_04_uefi_x64_20G_alibase_20240807.vhd" - specId = "alibaba+ap-northeast-2+ecs.t6-c1m4.xlarge" + imageId = "ubuntu_24_04_x64_20G_alibase_20260810.vhd" + specId = "alibaba+ap-northeast-2+ecs.g9i.large" rootDiskType = "default" rootDiskSize = "default" } else if (CSP == "tencent") { sgName = "g7" - imageId = "img-7rotv4ux" - specId = "tencent+ap-shanghai+m9.medium16" + imageId = "img-mmytdhbn" + specId = "tencent+ap-seoul+S5.MEDIUM8" rootDiskType = "default" rootDiskSize = "30" } else if (CSP == "ibm") { sgName = "g8" - imageId = "r034-76e0174f-fd2f-4c31-b95b-b859a403f85f" - specId = "ibm+jp-osa+cx2d-2x4" + imageId = "r022-9130f04e-631a-4e91-ae4c-b85d54621c24" + specId = "ibm+jp-tok+bx2-2x8" rootDiskType = "default" rootDiskSize = "default" } else { @@ -258,15 +258,15 @@ INSERT INTO workflow_stage (workflow_stage_idx, workflow_stage_type_idx, workflo if (CPS == "azure") { call_tumblebug_create_cluster_payload = """{ \ - "imageId": "default", \ - "specId": "azure+koreacentral+standard_b4ms", \ + "imageId": "", \ + "specId": "azure+koreacentral+Standard_D4ls_v6", \ "connectionName": "azure-koreacentral", \ "name": "${CLUSTER}", \ "nodeGroupName": "k8sng01" \ }""" } else if (CPS == "nhn") { call_tumblebug_create_cluster_payload = """{ \ - "imageId": "efe7f58f-5a32-4905-aa3b-e7839bd191d7", \ + "imageId": "107cc02d-02d8-44fd-84d6-6c316045b817", \ "specId": "nhn+kr1+m2.c4m8", \ "connectionName": "nhn-kr1", \ "name": "${CLUSTER}", \ @@ -274,41 +274,41 @@ INSERT INTO workflow_stage (workflow_stage_idx, workflow_stage_type_idx, workflo }""" } else if (CPS == "gcp") { call_tumblebug_create_cluster_payload = """{ \ - "imageId": "default", \ - "specId": "gcp+asia-northeast3+e2-medium", \ + "imageId": "UBUNTU_CONTAINERD", \ + "specId": "gcp+asia-northeast3+n4-highcpu-4", \ "connectionName": "gcp-asia-northeast3", \ "name": "${CLUSTER}", \ "nodeGroupName": "k8sng03", \ - "version": "1.34.3-gke.1051003" \ + "version": "1.34.10-gke.1236000" \ }""" } else if (CPS == "aws") { call_tumblebug_create_cluster_payload = """{ \ - "imageId": "default", \ - "specId": "aws+ap-northeast-2+t3a.xlarge", \ + "imageId": "AL2023_x86_64_STANDARD", \ + "specId": "aws+ap-northeast-2+c8i.xlarge", \ "connectionName": "aws-ap-northeast-2", \ "name": "${CLUSTER}", \ "nodeGroupName": "k8sng04" \ }""" } else if (CPS == "ncp") { call_tumblebug_create_cluster_payload = """{ \ - "imageId": "default", \ - "specId": "ncp+kr1+c4m8", \ - "connectionName": "ncp-kr1", \ + "imageId": "", \ + "specId": "ncp+kr+c4-g3", \ + "connectionName": "ncp-kr", \ "name": "${CLUSTER}", \ "nodeGroupName": "k8sng05" \ }""" } else if (CPS == "alibaba") { call_tumblebug_create_cluster_payload = """{ \ - "imageId": "aliyun_3_x64_20G_container_optimized_alibase_20250629.vhd", \ - "specId": "alibaba+ap-southeast-1+ecs.t6-c1m4.2xlarge", \ - "connectionName": "alibaba-ap-southeast-1", \ + "imageId": "Ubuntu", \ + "specId": "alibaba+ap-northeast-2+ecs.c9i.xlarge", \ + "connectionName": "alibaba-ap-northeast-2", \ "name": "${CLUSTER}", \ "nodeGroupName": "k8sng06" \ }""" } else if (CPS == "tencent") { call_tumblebug_create_cluster_payload = """{ \ - "imageId": "img-22trbn9x", \ - "specId": "tencent+ap-seoul+s5.medium4", \ + "imageId": "ubuntu22.04x86_64", \ + "specId": "tencent+ap-seoul+S5.LARGE8", \ "connectionName": "tencent-ap-seoul", \ "name": "${CLUSTER}", \ "nodeGroupName": "k8sng07" \ @@ -352,8 +352,8 @@ INSERT INTO workflow_stage (workflow_stage_idx, workflow_stage_type_idx, workflo if (CPS == "aws") { def call_tumblebug_create_nodegroup_url = """${TUMBLEBUG}/tumblebug/ns/${NAMESPACE}/k8sCluster/${CLUSTER}/k8sNodeGroupDynamic""" def call_tumblebug_create_nodegroup_payload = """{ \ - "imageId": "default", \ - "specId": "aws+ap-northeast-2+t3a.xlarge", \ + "imageId": "AL2023_x86_64_STANDARD", \ + "specId": "aws+ap-northeast-2+c8i.xlarge", \ "name": "k8sng01" \ }""" def tumblebug_create_nodegroup_response = sh(script: """curl -w "- Http_Status_code:%{http_code}" -X POST ${call_tumblebug_create_nodegroup_url} -H "Content-Type: application/json" -d ''${call_tumblebug_create_nodegroup_payload}'' --user ${USER}:${USERPASS}""", returnStdout: true).trim() @@ -368,8 +368,8 @@ INSERT INTO workflow_stage (workflow_stage_idx, workflow_stage_type_idx, workflo if (CPS == "tencent") { def call_tumblebug_create_nodegroup_url = """${TUMBLEBUG}/tumblebug/ns/${NAMESPACE}/k8sCluster/${CLUSTER}/k8sNodeGroupDynamic""" def call_tumblebug_create_nodegroup_payload = """{ \ - "imageId": "img-22trbn9x", \ - "specId": "tencent+ap-seoul+s5.medium4", \ + "imageId": "ubuntu22.04x86_64", \ + "specId": "tencent+ap-seoul+S5.LARGE8", \ "name": "k8sng07" \ }""" def tumblebug_create_nodegroup_response = sh(script: """curl -w "- Http_Status_code:%{http_code}" -X POST ${call_tumblebug_create_nodegroup_url} -H "Content-Type: application/json" -d ''${call_tumblebug_create_nodegroup_payload}'' --user ${USER}:${USERPASS}""", returnStdout: true).trim() @@ -384,8 +384,8 @@ INSERT INTO workflow_stage (workflow_stage_idx, workflow_stage_type_idx, workflo if (CPS == "alibaba") { def call_tumblebug_create_nodegroup_url = """${TUMBLEBUG}/tumblebug/ns/${NAMESPACE}/k8sCluster/${CLUSTER}/k8sNodeGroupDynamic""" def call_tumblebug_create_nodegroup_payload = """{ \ - "imageId": "default", \ - "specId": "alibaba+ap-southeast-1+ecs.t6-c1m4.2xlarge", \ + "imageId": "Ubuntu", \ + "specId": "alibaba+ap-northeast-2+ecs.c9i.xlarge", \ "nodeGroupName": "k8sng06", \ "RootDiskType": "cloud_efficiency", \ "RootDiskSize": "40" \ @@ -4829,13 +4829,13 @@ INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener (101, 'USERPASS', 'default', 'N'), (101, 'NAMESPACE', 'ns01', 'N'), (101, 'INFRA_ID', 'vm-mariadb-data-init', 'N'), -(101, 'REGION', 'ap-northeast-1', 'N'), -(101, 'CONNECTION_NAME', 'aws-ap-northeast-1', 'N'), -(101, 'ZONE', 'ap-northeast-1a', 'N'), -(101, 'IMAGE', 'ami-0dc2aed7540019237', 'N'), -(101, 'IMAGE_ID', 'ami-0dc2aed7540019237', 'N'), -(101, 'SPEC', 'aws+ap-northeast-1+t3.medium', 'N'), -(101, 'SPEC_ID', 'aws+ap-northeast-1+t3.medium', 'N'), +(101, 'REGION', 'ap-northeast-2', 'N'), +(101, 'CONNECTION_NAME', 'aws-ap-northeast-2', 'N'), +(101, 'ZONE', 'ap-northeast-2a', 'N'), +(101, 'IMAGE', 'ami-01ed18897a4aadead', 'N'), +(101, 'IMAGE_ID', 'ami-01ed18897a4aadead', 'N'), +(101, 'SPEC', 'aws+ap-northeast-2+m8i.large', 'N'), +(101, 'SPEC_ID', 'aws+ap-northeast-2+m8i.large', 'N'), (101, 'SSH_HOST', '', 'N'), (101, 'SSH_USER', 'cb-user', 'N'), (101, 'SSH_KEY_FILE', '', 'N'), @@ -4855,57 +4855,57 @@ INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener (102, 'USER', 'default', 'N'), (102, 'USERPASS', 'default', 'N'), (102, 'NAMESPACE', 'ns01', 'N'), -(102, 'CSP_LIST', 'aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm,kt', 'N'), +(102, 'CSP_LIST', 'alibaba,aws,azure,gcp,ibm,kt,ncp,nhn,tencent', 'N'), (102, 'INFRA_ID', 'multi-csp-vm', 'N'), (102, 'INFRA_PREFIX', 'multi-csp-vm', 'N'), (102, 'INFRA_NODEGROUP_PREFIX', 'ng', 'N'), (102, 'INFRA_NODEGROUP_SIZE', '1', 'N'), (102, 'ROOT_DISK_TYPE', 'default', 'N'), (102, 'ROOT_DISK_SIZE', '50', 'N'), -(102, 'ALIBABA_REGION', 'ap-northeast-1', 'N'), -(102, 'ALIBABA_CONNECTION_NAME', 'alibaba-ap-northeast-1', 'N'), -(102, 'ALIBABA_ZONE', 'ap-northeast-1a', 'N'), -(102, 'ALIBABA_SPEC_ID', 'alibaba+ap-northeast-1+ecs.u1-c1m2.large', 'N'), +(102, 'ALIBABA_REGION', 'ap-northeast-2', 'N'), +(102, 'ALIBABA_CONNECTION_NAME', 'alibaba-ap-northeast-2', 'N'), +(102, 'ALIBABA_ZONE', 'ap-northeast-2a', 'N'), +(102, 'ALIBABA_SPEC_ID', 'alibaba+ap-northeast-2+ecs.g9i.large', 'N'), (102, 'ALIBABA_IMAGE_ID', 'ubuntu_24_04_x64_20G_alibase_20260810.vhd', 'N'), -(102, 'AWS_REGION', 'ap-northeast-1', 'N'), -(102, 'AWS_CONNECTION_NAME', 'aws-ap-northeast-1', 'N'), -(102, 'AWS_ZONE', 'ap-northeast-1a', 'N'), -(102, 'AWS_SPEC_ID', 'aws+ap-northeast-1+t3.medium', 'N'), -(102, 'AWS_IMAGE_ID', 'ami-0dc2aed7540019237', 'N'), -(102, 'AZURE_REGION', 'koreasouth', 'N'), -(102, 'AZURE_CONNECTION_NAME', 'azure-koreasouth', 'N'), +(102, 'AWS_REGION', 'ap-northeast-2', 'N'), +(102, 'AWS_CONNECTION_NAME', 'aws-ap-northeast-2', 'N'), +(102, 'AWS_ZONE', 'ap-northeast-2a', 'N'), +(102, 'AWS_SPEC_ID', 'aws+ap-northeast-2+m8i.large', 'N'), +(102, 'AWS_IMAGE_ID', 'ami-01ed18897a4aadead', 'N'), +(102, 'AZURE_REGION', 'koreacentral', 'N'), +(102, 'AZURE_CONNECTION_NAME', 'azure-koreacentral', 'N'), (102, 'AZURE_ZONE', '1', 'N'), -(102, 'AZURE_SPEC_ID', 'azure+koreasouth+Standard_D2s_v3', 'N'), +(102, 'AZURE_SPEC_ID', 'azure+koreacentral+Standard_D2s_v6', 'N'), (102, 'AZURE_IMAGE_ID', 'Canonical:ubuntu-24_04-lts:minimal:24.04.202608100', 'N'), (102, 'GCP_REGION', 'asia-northeast3', 'N'), (102, 'GCP_CONNECTION_NAME', 'gcp-asia-northeast3', 'N'), (102, 'GCP_ZONE', 'asia-northeast3-a', 'N'), -(102, 'GCP_SPEC_ID', 'gcp+asia-northeast3+e2-medium', 'N'), +(102, 'GCP_SPEC_ID', 'gcp+asia-northeast3+n4-standard-2', 'N'), (102, 'GCP_IMAGE_ID', 'https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-minimal-2404-noble-amd64-v20260817', 'N'), -(102, 'IBM_REGION', 'jp-osa', 'N'), -(102, 'IBM_CONNECTION_NAME', 'ibm-jp-osa', 'N'), -(102, 'IBM_ZONE', 'jp-osa-1', 'N'), -(102, 'IBM_SPEC_ID', 'ibm+jp-osa+cx2-2x4', 'N'), -(102, 'IBM_IMAGE_ID', 'r034-81a02369-9e59-4404-a922-30c110f1788d', 'N'), +(102, 'IBM_REGION', 'jp-tok', 'N'), +(102, 'IBM_CONNECTION_NAME', 'ibm-jp-tok', 'N'), +(102, 'IBM_ZONE', 'jp-tok-1', 'N'), +(102, 'IBM_SPEC_ID', 'ibm+jp-tok+bx2-2x8', 'N'), +(102, 'IBM_IMAGE_ID', 'r022-9130f04e-631a-4e91-ae4c-b85d54621c24', 'N'), (102, 'KT_REGION', 'kr1', 'N'), (102, 'KT_CONNECTION_NAME', 'kt-kr1', 'N'), (102, 'KT_ZONE', 'DX-M1', 'N'), -(102, 'KT_SPEC_ID', 'kt+kr1+2x4.itl', 'N'), +(102, 'KT_SPEC_ID', 'kt+kr1+2x8.itl', 'N'), (102, 'KT_IMAGE_ID', 'e55c5985-b420-4a19-8c92-aa3461cda86e', 'N'), (102, 'NCP_REGION', 'kr', 'N'), (102, 'NCP_CONNECTION_NAME', 'ncp-kr', 'N'), (102, 'NCP_ZONE', 'KR-1', 'N'), -(102, 'NCP_SPEC_ID', 'ncp+kr+c2-g3a', 'N'), +(102, 'NCP_SPEC_ID', 'ncp+kr+s2-g3', 'N'), (102, 'NCP_IMAGE_ID', '104630229', 'N'), (102, 'NHN_REGION', 'kr1', 'N'), (102, 'NHN_CONNECTION_NAME', 'nhn-kr1', 'N'), (102, 'NHN_ZONE', 'kr-pub-a', 'N'), -(102, 'NHN_SPEC_ID', 'nhn+kr1+m2.c2m4', 'N'), +(102, 'NHN_SPEC_ID', 'nhn+kr1+r2.c2m8', 'N'), (102, 'NHN_IMAGE_ID', '5c38715f-0375-4167-af4e-56f75ba8b252', 'N'), (102, 'TENCENT_REGION', 'ap-seoul', 'N'), (102, 'TENCENT_CONNECTION_NAME', 'tencent-ap-seoul', 'N'), (102, 'TENCENT_ZONE', 'ap-seoul-1', 'N'), -(102, 'TENCENT_SPEC_ID', 'tencent+ap-seoul+S5.MEDIUM4', 'N'), +(102, 'TENCENT_SPEC_ID', 'tencent+ap-seoul+S5.MEDIUM8', 'N'), (102, 'TENCENT_IMAGE_ID', 'img-mmytdhbn', 'N'); INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener_yn) VALUES @@ -4916,14 +4916,14 @@ INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener (103, 'NAMESPACE', 'ns01', 'N'), (103, 'PROVIDER', 'aws', 'N'), (103, 'CSP', 'aws', 'N'), -(103, 'REGION', 'ap-northeast-1', 'N'), -(103, 'CONNECTION_NAME', 'aws-ap-northeast-1', 'N'), -(103, 'ZONE', 'ap-northeast-1a', 'N'), +(103, 'REGION', 'ap-northeast-2', 'N'), +(103, 'CONNECTION_NAME', 'aws-ap-northeast-2', 'N'), +(103, 'ZONE', 'ap-northeast-2a', 'N'), (103, 'K8S_CLUSTER_ID', 'k8s-mariadb-data-init', 'N'), (103, 'K8S_NODEGROUP_NAME', 'ng1', 'N'), (103, 'IMAGE', 'AL2023_x86_64_STANDARD', 'N'), -(103, 'SPEC_ID', 'aws+ap-northeast-1+t3.medium', 'N'), -(103, 'SPEC', 'aws+ap-northeast-1+t3.medium', 'N'), +(103, 'SPEC_ID', 'aws+ap-northeast-2+c8i.xlarge', 'N'), +(103, 'SPEC', 'aws+ap-northeast-2+c8i.xlarge', 'N'), (103, 'IMAGE_ID', 'AL2023_x86_64_STANDARD', 'N'), (103, 'K8S_VERSION', '1.35', 'N'), (103, 'K8S_DESIRED_NODE_SIZE', '1', 'N'), @@ -4967,7 +4967,7 @@ INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener (104, 'USER', 'default', 'N'), (104, 'USERPASS', 'default', 'N'), (104, 'NAMESPACE', 'ns01', 'N'), -(104, 'CSP_LIST', 'aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm', 'N'), +(104, 'CSP_LIST', 'alibaba,aws,azure,gcp,ibm,ncp,nhn,tencent', 'N'), (104, 'CLUSTER_PREFIX', 'multi-csp-k8s', 'N'), (104, 'K8S_NODEGROUP_PREFIX', 'ng', 'N'), (104, 'K8S_VERSION', '1.35', 'N'), @@ -4980,54 +4980,54 @@ INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener (104, 'K8S_STATUS_MAX_ATTEMPTS', '360', 'N'), (104, 'K8S_STATUS_INTERVAL_SECONDS', '10', 'N'), (104, 'K8S_READY_STATUS', 'Active,Running', 'N'), -(104, 'AWS_REGION', 'ap-northeast-1', 'N'), -(104, 'AWS_CONNECTION_NAME', 'aws-ap-northeast-1', 'N'), -(104, 'AWS_ZONE', 'ap-northeast-1a', 'N'), -(104, 'AWS_SPEC_ID', 'aws+ap-northeast-1+t3.medium', 'N'), +(104, 'ALIBABA_REGION', 'ap-northeast-2', 'N'), +(104, 'ALIBABA_CONNECTION_NAME', 'alibaba-ap-northeast-2', 'N'), +(104, 'ALIBABA_ZONE', 'ap-northeast-2a', 'N'), +(104, 'ALIBABA_SPEC_ID', 'alibaba+ap-northeast-2+ecs.c9i.xlarge', 'N'), +(104, 'ALIBABA_IMAGE_ID', 'Ubuntu', 'N'), +(104, 'ALIBABA_K8S_VERSION', '1.35.7-aliyun.1', 'N'), +(104, 'AWS_REGION', 'ap-northeast-2', 'N'), +(104, 'AWS_CONNECTION_NAME', 'aws-ap-northeast-2', 'N'), +(104, 'AWS_ZONE', 'ap-northeast-2a', 'N'), +(104, 'AWS_SPEC_ID', 'aws+ap-northeast-2+c8i.xlarge', 'N'), (104, 'AWS_IMAGE_ID', 'AL2023_x86_64_STANDARD', 'N'), (104, 'AWS_K8S_VERSION', '1.35', 'N'), -(104, 'AZURE_REGION', 'koreasouth', 'N'), -(104, 'AZURE_CONNECTION_NAME', 'azure-koreasouth', 'N'), +(104, 'AZURE_REGION', 'koreacentral', 'N'), +(104, 'AZURE_CONNECTION_NAME', 'azure-koreacentral', 'N'), (104, 'AZURE_ZONE', '1', 'N'), -(104, 'AZURE_SPEC_ID', 'azure+koreasouth+Standard_D2s_v3', 'N'), +(104, 'AZURE_SPEC_ID', 'azure+koreacentral+Standard_D4ls_v6', 'N'), (104, 'AZURE_IMAGE_ID', '', 'N'), (104, 'AZURE_K8S_VERSION', '1.35.7', 'N'), (104, 'GCP_REGION', 'asia-northeast3', 'N'), (104, 'GCP_CONNECTION_NAME', 'gcp-asia-northeast3', 'N'), (104, 'GCP_ZONE', 'asia-northeast3-a', 'N'), -(104, 'GCP_SPEC_ID', 'gcp+asia-northeast3+e2-medium', 'N'), +(104, 'GCP_SPEC_ID', 'gcp+asia-northeast3+n4-highcpu-4', 'N'), (104, 'GCP_IMAGE_ID', 'UBUNTU_CONTAINERD', 'N'), -(104, 'GCP_K8S_VERSION', '1.34.9-gke.1655001', 'N'), +(104, 'GCP_K8S_VERSION', '1.34.10-gke.1236000', 'N'), +(104, 'IBM_REGION', 'jp-tok', 'N'), +(104, 'IBM_CONNECTION_NAME', 'ibm-jp-tok', 'N'), +(104, 'IBM_ZONE', 'jp-tok-1', 'N'), +(104, 'IBM_SPEC_ID', 'ibm+jp-tok+cx2-4x8', 'N'), +(104, 'IBM_IMAGE_ID', '', 'N'), +(104, 'IBM_K8S_VERSION', '1.35.7', 'N'), (104, 'NCP_REGION', 'kr', 'N'), (104, 'NCP_CONNECTION_NAME', 'ncp-kr', 'N'), (104, 'NCP_ZONE', 'KR-1', 'N'), -(104, 'NCP_SPEC_ID', 'ncp+kr+c2-g3a', 'N'), +(104, 'NCP_SPEC_ID', 'ncp+kr+c4-g3', 'N'), (104, 'NCP_IMAGE_ID', '', 'N'), (104, 'NCP_K8S_VERSION', '1.34.3-nks.1', 'N'), (104, 'NHN_REGION', 'kr1', 'N'), (104, 'NHN_CONNECTION_NAME', 'nhn-kr1', 'N'), (104, 'NHN_ZONE', 'kr-pub-a', 'N'), -(104, 'NHN_SPEC_ID', 'nhn+kr1+m2.c2m4', 'N'), -(104, 'NHN_IMAGE_ID', '0f07c795-2a46-44fc-a61b-fa0d96763ce2', 'N'), +(104, 'NHN_SPEC_ID', 'nhn+kr1+m2.c4m8', 'N'), +(104, 'NHN_IMAGE_ID', '107cc02d-02d8-44fd-84d6-6c316045b817', 'N'), (104, 'NHN_K8S_VERSION', 'v1.34.3', 'N'), -(104, 'ALIBABA_REGION', 'ap-northeast-1', 'N'), -(104, 'ALIBABA_CONNECTION_NAME', 'alibaba-ap-northeast-1', 'N'), -(104, 'ALIBABA_ZONE', 'ap-northeast-1a', 'N'), -(104, 'ALIBABA_SPEC_ID', 'alibaba+ap-northeast-1+ecs.u1-c1m2.xlarge', 'N'), -(104, 'ALIBABA_IMAGE_ID', 'AliyunLinux3ContainerOptimized', 'N'), -(104, 'ALIBABA_K8S_VERSION', '1.35.7-aliyun.1', 'N'), (104, 'TENCENT_REGION', 'ap-seoul', 'N'), (104, 'TENCENT_CONNECTION_NAME', 'tencent-ap-seoul', 'N'), (104, 'TENCENT_ZONE', 'ap-seoul-1', 'N'), -(104, 'TENCENT_SPEC_ID', 'tencent+ap-seoul+S5.MEDIUM4', 'N'), +(104, 'TENCENT_SPEC_ID', 'tencent+ap-seoul+S5.LARGE8', 'N'), (104, 'TENCENT_IMAGE_ID', 'ubuntu22.04x86_64', 'N'), -(104, 'TENCENT_K8S_VERSION', '1.34.1', 'N'), -(104, 'IBM_REGION', 'jp-osa', 'N'), -(104, 'IBM_CONNECTION_NAME', 'ibm-jp-osa', 'N'), -(104, 'IBM_ZONE', 'jp-osa-1', 'N'), -(104, 'IBM_SPEC_ID', 'ibm+jp-osa+cx2-2x4', 'N'), -(104, 'IBM_IMAGE_ID', '', 'N'), -(104, 'IBM_K8S_VERSION', '1.35.7', 'N'); +(104, 'TENCENT_K8S_VERSION', '1.34.1', 'N'); INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener_yn) VALUES (105, 'TUMBLEBUG', 'http://mc-infra-manager:1323', 'N'), @@ -5068,7 +5068,7 @@ INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener (108, 'USER', 'default', 'N'), (108, 'USERPASS', 'default', 'N'), (108, 'NAMESPACE', 'ns01', 'N'), -(108, 'CSP_LIST', 'aws,azure,gcp,ncp,nhn,alibaba,tencent,ibm', 'N'), +(108, 'CSP_LIST', 'alibaba,aws,azure,gcp,ibm,ncp,nhn,tencent', 'N'), (108, 'CLUSTER_PREFIX', 'multi-csp-k8s', 'N'), (108, 'K8S_CLUSTER_ID_LIST', '', 'N'), (108, 'K8S_NODEGROUP_PREFIX', 'ng', 'N'), @@ -5090,13 +5090,13 @@ INSERT INTO workflow_param (workflow_idx, param_key, param_value, event_listener (109, 'INFRA_NODEGROUP_SIZE', '1', 'N'), (109, 'ROOT_DISK_TYPE', 'default', 'N'), (109, 'ROOT_DISK_SIZE', '50', 'N'), -(109, 'REGION', 'ap-northeast-1', 'N'), -(109, 'CONNECTION_NAME', 'aws-ap-northeast-1', 'N'), -(109, 'ZONE', 'ap-northeast-1a', 'N'), -(109, 'IMAGE', 'ami-0dc2aed7540019237', 'N'), -(109, 'IMAGE_ID', 'ami-0dc2aed7540019237', 'N'), -(109, 'SPEC', 'aws+ap-northeast-1+t3.medium', 'N'), -(109, 'SPEC_ID', 'aws+ap-northeast-1+t3.medium', 'N'), +(109, 'REGION', 'ap-northeast-2', 'N'), +(109, 'CONNECTION_NAME', 'aws-ap-northeast-2', 'N'), +(109, 'ZONE', 'ap-northeast-2a', 'N'), +(109, 'IMAGE', 'ami-01ed18897a4aadead', 'N'), +(109, 'IMAGE_ID', 'ami-01ed18897a4aadead', 'N'), +(109, 'SPEC', 'aws+ap-northeast-2+m8i.large', 'N'), +(109, 'SPEC_ID', 'aws+ap-northeast-2+m8i.large', 'N'), (109, 'SSH_HOST', '', 'N'), (109, 'SSH_USER', 'cb-user', 'N'), (109, 'SSH_KEY_FILE', '', 'N'), diff --git a/src/main/resources/static/assets/EventListenerList-XxjlV0iN.js b/src/main/resources/static/assets/EventListenerList-CskkLdjP.js similarity index 97% rename from src/main/resources/static/assets/EventListenerList-XxjlV0iN.js rename to src/main/resources/static/assets/EventListenerList-CskkLdjP.js index f82792d..3893884 100644 --- a/src/main/resources/static/assets/EventListenerList-XxjlV0iN.js +++ b/src/main/resources/static/assets/EventListenerList-CskkLdjP.js @@ -1,4 +1,4 @@ -import{_ as Z}from"./TableHeader.vue_vue_type_script_setup_true_lang-D78qmq0S.js";import{s as N,_ as ee}from"./request-DPzMytGP.js";import{d as M,u as B,l as te,w as ne,o as T,M as Y,m as ae,r as d,c as y,a as n,t as $,b as W,f as A,v as se,F as le,e as oe,p as G,j as O,h as S,g as w,s as re,i as D}from"./index-Woncnlsa.js";import{f as ie,P as de}from"./SearchableSelect-DlLPIFTu.js";import{T as ue}from"./TumblebugParamSelector-DeFn1gSY.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const ce=()=>N.get("/eventlistener/list");function ve(r){return N.get("/eventlistener/"+r)}function me(r){return N.get(`/eventlistener/duplicate?eventlistenerName=${encodeURIComponent(r)}`)}function we(r){return N.post("/eventlistener",r)}function fe(r){return N.patch(`/eventlistener/${r.eventListenerIdx}`,r)}function pe(r){return N.delete(`/eventlistener/${r}`)}const be={class:"modal-dialog modal-lg modal-dialog-centered",role:"document",style:{"max-width":"900px"}},Le={class:"modal-content"},ke={class:"modal-header"},ge={class:"modal-title"},ye={class:"modal-body py-4"},Ee={class:"row mb-3"},he={class:"grid gap-0 column-gap-3"},xe={key:1,class:"btn btn-success",style:{margin:"3px",width:"150px"}},Ne={class:"mb-3"},_e={class:"mb-3"},Ie=["value"],Ce={class:"modal-footer"},De=M({__name:"eventListenerForm",props:{mode:{},eventListenerIdx:{}},emits:["get-event-listener-list"],setup(r,{emit:_}){const s=B(),f=te(),v=d(),k=d(),i=r,c=_,C=S(()=>i.eventListenerIdx);ne(C,async()=>{await l(),await P()}),T(async()=>{v.value&&(k.value=new Y(v.value),v.value.addEventListener("show.bs.modal",E)),await l(),await P()}),ae(()=>{var e;(e=v.value)==null||e.removeEventListener("show.bs.modal",E)});const E=async()=>{await l(),await P()},a=d({}),p=d(!1),g=d(!1),u=d(0),l=async()=>{if(g.value=!1,i.mode==="new")a.value={eventListenerIdx:0,eventListenerName:"",eventListenerDesc:"",eventListenerUrl:"",eventListenerCallUrl:"",workflowIdx:0,workflowParams:[]},L.value=!1,x.value="",F.value="",p.value=!0;else{const{data:e}=await ve(i.eventListenerIdx);a.value=e,L.value=!0,x.value=I(e.eventListenerName),F.value=I(e.eventListenerName),p.value=!0,g.value=!!a.value.workflowIdx}u.value+=1},b=d([]),h=["vm-mariadb-backup-import-data-init","vm-mariadb-data-init-cleanup","k8s-mariadb-backup-import-data-init","k8s-mariadb-data-init-cleanup","multi-csp-vm-deploy","multi-csp-vm-cleanup","multi-csp-k8s-cluster-deploy","multi-csp-k8s-cluster-cleanup","vm-object-storage-data-lab-init","vm-object-storage-data-lab-cleanup"],R=new Map(h.map((e,t)=>[e,t])),P=async()=>{const{data:e}=await ie("N");b.value=[...e].sort((t,m)=>{const o=R.get(t.workflowInfo.workflowName)??h.length,U=R.get(m.workflowInfo.workflowName)??h.length;return o-U})},V=S(()=>b.value.find(e=>Number(e.workflowInfo.workflowIdx)===Number(a.value.workflowIdx))),j=S(()=>{var e;return((e=V.value)==null?void 0:e.workflowInfo.workflowName)||a.value.workflowName||""}),L=d(!1),x=d(""),F=d(""),I=e=>(e||"").trim(),H=()=>{const e=I(a.value.eventListenerName);L.value=!!(e&&e===x.value)},q=async()=>{const e=I(a.value.eventListenerName);if(!e){s.error("Please enter Event Listener name.");return}if(i.mode!=="new"&&e===F.value){s.success("Name is available."),L.value=!0,x.value=e;return}const{data:t}=await me(e);t?(s.error("Name is already in use."),L.value=!1):(s.success("Name is available."),L.value=!0,x.value=e)},K=async()=>{if(!a.value.eventListenerName){s.error("Please enter Event Listener name.");return}if(!L.value||x.value!==I(a.value.eventListenerName)){s.error("Please perform duplicate check for the name.");return}if(!a.value.eventListenerDesc){s.error("Please enter Event Listener description.");return}if(!a.value.workflowIdx||a.value.workflowIdx===0){s.error("Please select a Workflow.");return}let e=!1;i.mode==="new"?(a.value.workflowParams.forEach(t=>{t.paramIdx=0,t.eventListenerYn="Y"}),e=await z()):e=await J(),e&&(c("get-event-listener-list"),l(),k.value&&(k.value.hide(),setTimeout(()=>{document.body.classList.remove("modal-open");const t=document.querySelector(".modal-backdrop");t==null||t.remove()},150)))},z=async()=>{try{const{data:e}=await we(a.value);return e?(s.success("Registered successfully."),!0):(s.error("Failed to register."),!1)}catch{return s.error("Failed to register."),!1}},J=async()=>{try{const{data:e}=await fe(a.value);return e?(s.success("Updated successfully."),!0):(s.error("Failed to update."),!1)}catch{return s.error("Failed to update."),!1}},Q=e=>{g.value=!1;const t=b.value.find(m=>Number(m.workflowInfo.workflowIdx)===Number(e));if(!t){a.value.workflowParams=[];return}a.value.workflowParams=X(t.workflowParams),u.value+=1,g.value=!0},X=(e=[])=>{const t=(f.projectInfo.ns_id||f.projectInfo.name||"").trim();return e.map(m=>{var o;return{...m,paramIdx:0,paramValue:t&&((o=m.paramKey)==null?void 0:o.trim().toUpperCase())==="NAMESPACE"?t:m.paramValue,eventListenerYn:"Y"}})};return(e,t)=>{var m;return w(),y("div",{class:"modal modal-blur fade",id:"eventListenerForm",tabindex:"-1","aria-hidden":"true",ref_key:"modalElement",ref:v},[n("div",be,[n("div",Le,[n("div",ke,[n("h3",ge,"Event Listener "+$(i.mode==="new"?"New":"Edit"),1),t[6]||(t[6]=n("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"},null,-1))]),n("div",ye,[n("div",null,[n("div",Ee,[t[7]||(t[7]=n("label",{class:"form-label required"},"Event Listener Name",-1)),n("div",he,[W(n("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter Event Listener Name","onUpdate:modelValue":t[0]||(t[0]=o=>a.value.eventListenerName=o),onInput:H},null,544),[[A,a.value.eventListenerName]]),L.value?(w(),y("button",xe,"Duplicate Check")):(w(),y("button",{key:0,class:"btn btn-primary chk",onClick:q,style:{margin:"3px",width:"150px"}},"Duplicate Check"))])]),n("div",Ne,[t[8]||(t[8]=n("label",{class:"form-label required"},"Event Listener Description",-1)),W(n("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter Event Listener Description","onUpdate:modelValue":t[1]||(t[1]=o=>a.value.eventListenerDesc=o)},null,512),[[A,a.value.eventListenerDesc]])]),n("div",_e,[t[10]||(t[10]=n("label",{class:"form-label required"},"Workflow",-1)),W(n("select",{class:"form-select p-2 g-col-12","onUpdate:modelValue":t[2]||(t[2]=o=>a.value.workflowIdx=o),onChange:t[3]||(t[3]=o=>Q(a.value.workflowIdx))},[t[9]||(t[9]=n("option",{value:0},"Select Workflow",-1)),(w(!0),y(le,null,oe(b.value,(o,U)=>(w(),y("option",{value:o.workflowInfo.workflowIdx,key:U},$(o.workflowInfo.workflowName),9,Ie))),128))],544),[[se,a.value.workflowIdx]])]),p.value&&g.value&&a.value.workflowIdx&&a.value.workflowParams?(w(),G(ue,{key:`${a.value.workflowIdx}-${u.value}`,"workflow-name":j.value,"workflow-param-data":a.value.workflowParams,"workflow-stage-mappings":((m=V.value)==null?void 0:m.workflowStageMappings)||[]},null,8,["workflow-name","workflow-param-data","workflow-stage-mappings"])):O("",!0),p.value?(w(),G(de,{key:1,popup:!1,"workflow-param-data":a.value.workflowParams,"event-listener-yn":"Y",style:{margin:"0 !important"}},null,8,["workflow-param-data"])):O("",!0)])]),n("div",Ce,[n("button",{type:"button",class:"btn btn-link link-secondary","data-bs-dismiss":"modal",onClick:t[4]||(t[4]=o=>l())}," Cancel "),n("button",{type:"button",class:"btn btn-primary ms-auto",onClick:t[5]||(t[5]=o=>K())},$(i.mode==="new"?"Create":"Edit"),1)])])])],512)}}}),$e={class:"modal modal-blur fade",id:"deleteEventListener",tabindex:"-1","aria-hidden":"true"},Pe={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},Fe={class:"modal-content"},Ue={class:"modal-body py-4"},We={class:"modal-footer"},Se=M({__name:"deleteEventListener",props:{eventListenerName:{},eventListenerIdx:{}},emits:["get-event-listener-list"],setup(r,{emit:_}){const s=B(),f=r,v=_,k=async()=>{const{data:i}=await pe(f.eventListenerIdx);i?s.success("Deleted successfully."):s.error("Failed to delete."),v("get-event-listener-list")};return(i,c)=>(w(),y("div",$e,[n("div",Pe,[n("div",Fe,[c[2]||(c[2]=n("div",{class:"modal-status bg-danger"},null,-1)),c[3]||(c[3]=n("div",{class:"modal-header"},[n("h3",{class:"modal-title"},"Delete Event Listener"),n("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),n("div",Ue,[n("h4",null,"Are you sure you want to delete "+$(f.eventListenerName)+"?",1)]),n("div",We,[c[1]||(c[1]=n("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),n("a",{href:"#",class:"btn btn-primary ms-auto","data-bs-dismiss":"modal",onClick:c[0]||(c[0]=C=>k())},"Delete")])])])]))}}),Me={class:"card card-flush w-100"},Be={class:"card-body"},Re={class:"event-listener-table"},je=M({__name:"EventListenerList",setup(r){const _=B(),s=d([]),f=d([]);T(async()=>{C(),await v()});const v=async()=>{try{const{data:u}=await ce();s.value=u,s.value.forEach(l=>{l.eventListenerUrl=k(l.eventListenerCallUrl)})}catch(u){console.log(u),_.error("Failed to load data.")}},k=u=>window.location.origin+u,i=d(0),c=d(""),C=()=>{f.value=[{title:"Event Listener Name",field:"eventListenerName",minWidth:190,widthGrow:1.4,cssClass:"event-listener-text-cell",variableHeight:!0},{title:"Connect Workflow Name",field:"workflowName",minWidth:220,widthGrow:1.6,cssClass:"event-listener-text-cell",variableHeight:!0},{title:"Event Listener Desc",field:"eventListenerDesc",minWidth:220,widthGrow:1.8,cssClass:"event-listener-text-cell",variableHeight:!0},{title:"Action URL",field:"eventListenerUrl",minWidth:260,widthGrow:2.2,cssClass:"event-listener-url-cell",variableHeight:!0},{title:"Action",minWidth:180,widthGrow:1,formatter:a,cssClass:"event-listener-action-cell",headerSort:!1,variableHeight:!0,cellClick:async function(u,l){const b=u.target,h=b==null?void 0:b.getAttribute("id");i.value=l.getRow().getData().eventListenerIdx,h==="edit-btn"?(p.value="edit",await E("eventListenerForm")):h==="delete-btn"&&(c.value=l.getRow().getData().eventListenerName,await E("deleteEventListener"))}}]},E=async u=>{await re();const l=document.getElementById(u);l&&Y.getOrCreateInstance(l).show()},a=()=>` +import{_ as Z}from"./TableHeader.vue_vue_type_script_setup_true_lang-Dy8u8xlP.js";import{s as N,_ as ee}from"./request-CogRSUKp.js";import{d as M,u as B,l as te,w as ne,o as T,M as Y,m as ae,r as d,c as y,a as n,t as $,b as W,f as A,v as se,F as le,e as oe,p as G,j as O,h as S,g as w,s as re,i as D}from"./index-DbsXni7y.js";import{f as ie,P as de}from"./SearchableSelect-DIXeDCav.js";import{T as ue}from"./TumblebugParamSelector-DZVyXDc9.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const ce=()=>N.get("/eventlistener/list");function ve(r){return N.get("/eventlistener/"+r)}function me(r){return N.get(`/eventlistener/duplicate?eventlistenerName=${encodeURIComponent(r)}`)}function we(r){return N.post("/eventlistener",r)}function fe(r){return N.patch(`/eventlistener/${r.eventListenerIdx}`,r)}function pe(r){return N.delete(`/eventlistener/${r}`)}const be={class:"modal-dialog modal-lg modal-dialog-centered",role:"document",style:{"max-width":"900px"}},Le={class:"modal-content"},ke={class:"modal-header"},ge={class:"modal-title"},ye={class:"modal-body py-4"},Ee={class:"row mb-3"},he={class:"grid gap-0 column-gap-3"},xe={key:1,class:"btn btn-success",style:{margin:"3px",width:"150px"}},Ne={class:"mb-3"},_e={class:"mb-3"},Ie=["value"],Ce={class:"modal-footer"},De=M({__name:"eventListenerForm",props:{mode:{},eventListenerIdx:{}},emits:["get-event-listener-list"],setup(r,{emit:_}){const s=B(),f=te(),v=d(),k=d(),i=r,c=_,C=S(()=>i.eventListenerIdx);ne(C,async()=>{await l(),await P()}),T(async()=>{v.value&&(k.value=new Y(v.value),v.value.addEventListener("show.bs.modal",E)),await l(),await P()}),ae(()=>{var e;(e=v.value)==null||e.removeEventListener("show.bs.modal",E)});const E=async()=>{await l(),await P()},a=d({}),p=d(!1),g=d(!1),u=d(0),l=async()=>{if(g.value=!1,i.mode==="new")a.value={eventListenerIdx:0,eventListenerName:"",eventListenerDesc:"",eventListenerUrl:"",eventListenerCallUrl:"",workflowIdx:0,workflowParams:[]},L.value=!1,x.value="",F.value="",p.value=!0;else{const{data:e}=await ve(i.eventListenerIdx);a.value=e,L.value=!0,x.value=I(e.eventListenerName),F.value=I(e.eventListenerName),p.value=!0,g.value=!!a.value.workflowIdx}u.value+=1},b=d([]),h=["vm-mariadb-backup-import-data-init","vm-mariadb-data-init-cleanup","k8s-mariadb-backup-import-data-init","k8s-mariadb-data-init-cleanup","multi-csp-vm-deploy","multi-csp-vm-cleanup","multi-csp-k8s-cluster-deploy","multi-csp-k8s-cluster-cleanup","vm-object-storage-data-lab-init","vm-object-storage-data-lab-cleanup"],R=new Map(h.map((e,t)=>[e,t])),P=async()=>{const{data:e}=await ie("N");b.value=[...e].sort((t,m)=>{const o=R.get(t.workflowInfo.workflowName)??h.length,U=R.get(m.workflowInfo.workflowName)??h.length;return o-U})},V=S(()=>b.value.find(e=>Number(e.workflowInfo.workflowIdx)===Number(a.value.workflowIdx))),j=S(()=>{var e;return((e=V.value)==null?void 0:e.workflowInfo.workflowName)||a.value.workflowName||""}),L=d(!1),x=d(""),F=d(""),I=e=>(e||"").trim(),H=()=>{const e=I(a.value.eventListenerName);L.value=!!(e&&e===x.value)},q=async()=>{const e=I(a.value.eventListenerName);if(!e){s.error("Please enter Event Listener name.");return}if(i.mode!=="new"&&e===F.value){s.success("Name is available."),L.value=!0,x.value=e;return}const{data:t}=await me(e);t?(s.error("Name is already in use."),L.value=!1):(s.success("Name is available."),L.value=!0,x.value=e)},K=async()=>{if(!a.value.eventListenerName){s.error("Please enter Event Listener name.");return}if(!L.value||x.value!==I(a.value.eventListenerName)){s.error("Please perform duplicate check for the name.");return}if(!a.value.eventListenerDesc){s.error("Please enter Event Listener description.");return}if(!a.value.workflowIdx||a.value.workflowIdx===0){s.error("Please select a Workflow.");return}let e=!1;i.mode==="new"?(a.value.workflowParams.forEach(t=>{t.paramIdx=0,t.eventListenerYn="Y"}),e=await z()):e=await J(),e&&(c("get-event-listener-list"),l(),k.value&&(k.value.hide(),setTimeout(()=>{document.body.classList.remove("modal-open");const t=document.querySelector(".modal-backdrop");t==null||t.remove()},150)))},z=async()=>{try{const{data:e}=await we(a.value);return e?(s.success("Registered successfully."),!0):(s.error("Failed to register."),!1)}catch{return s.error("Failed to register."),!1}},J=async()=>{try{const{data:e}=await fe(a.value);return e?(s.success("Updated successfully."),!0):(s.error("Failed to update."),!1)}catch{return s.error("Failed to update."),!1}},Q=e=>{g.value=!1;const t=b.value.find(m=>Number(m.workflowInfo.workflowIdx)===Number(e));if(!t){a.value.workflowParams=[];return}a.value.workflowParams=X(t.workflowParams),u.value+=1,g.value=!0},X=(e=[])=>{const t=(f.projectInfo.ns_id||f.projectInfo.name||"").trim();return e.map(m=>{var o;return{...m,paramIdx:0,paramValue:t&&((o=m.paramKey)==null?void 0:o.trim().toUpperCase())==="NAMESPACE"?t:m.paramValue,eventListenerYn:"Y"}})};return(e,t)=>{var m;return w(),y("div",{class:"modal modal-blur fade",id:"eventListenerForm",tabindex:"-1","aria-hidden":"true",ref_key:"modalElement",ref:v},[n("div",be,[n("div",Le,[n("div",ke,[n("h3",ge,"Event Listener "+$(i.mode==="new"?"New":"Edit"),1),t[6]||(t[6]=n("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"},null,-1))]),n("div",ye,[n("div",null,[n("div",Ee,[t[7]||(t[7]=n("label",{class:"form-label required"},"Event Listener Name",-1)),n("div",he,[W(n("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter Event Listener Name","onUpdate:modelValue":t[0]||(t[0]=o=>a.value.eventListenerName=o),onInput:H},null,544),[[A,a.value.eventListenerName]]),L.value?(w(),y("button",xe,"Duplicate Check")):(w(),y("button",{key:0,class:"btn btn-primary chk",onClick:q,style:{margin:"3px",width:"150px"}},"Duplicate Check"))])]),n("div",Ne,[t[8]||(t[8]=n("label",{class:"form-label required"},"Event Listener Description",-1)),W(n("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter Event Listener Description","onUpdate:modelValue":t[1]||(t[1]=o=>a.value.eventListenerDesc=o)},null,512),[[A,a.value.eventListenerDesc]])]),n("div",_e,[t[10]||(t[10]=n("label",{class:"form-label required"},"Workflow",-1)),W(n("select",{class:"form-select p-2 g-col-12","onUpdate:modelValue":t[2]||(t[2]=o=>a.value.workflowIdx=o),onChange:t[3]||(t[3]=o=>Q(a.value.workflowIdx))},[t[9]||(t[9]=n("option",{value:0},"Select Workflow",-1)),(w(!0),y(le,null,oe(b.value,(o,U)=>(w(),y("option",{value:o.workflowInfo.workflowIdx,key:U},$(o.workflowInfo.workflowName),9,Ie))),128))],544),[[se,a.value.workflowIdx]])]),p.value&&g.value&&a.value.workflowIdx&&a.value.workflowParams?(w(),G(ue,{key:`${a.value.workflowIdx}-${u.value}`,"workflow-name":j.value,"workflow-param-data":a.value.workflowParams,"workflow-stage-mappings":((m=V.value)==null?void 0:m.workflowStageMappings)||[]},null,8,["workflow-name","workflow-param-data","workflow-stage-mappings"])):O("",!0),p.value?(w(),G(de,{key:1,popup:!1,"workflow-param-data":a.value.workflowParams,"event-listener-yn":"Y",style:{margin:"0 !important"}},null,8,["workflow-param-data"])):O("",!0)])]),n("div",Ce,[n("button",{type:"button",class:"btn btn-link link-secondary","data-bs-dismiss":"modal",onClick:t[4]||(t[4]=o=>l())}," Cancel "),n("button",{type:"button",class:"btn btn-primary ms-auto",onClick:t[5]||(t[5]=o=>K())},$(i.mode==="new"?"Create":"Edit"),1)])])])],512)}}}),$e={class:"modal modal-blur fade",id:"deleteEventListener",tabindex:"-1","aria-hidden":"true"},Pe={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},Fe={class:"modal-content"},Ue={class:"modal-body py-4"},We={class:"modal-footer"},Se=M({__name:"deleteEventListener",props:{eventListenerName:{},eventListenerIdx:{}},emits:["get-event-listener-list"],setup(r,{emit:_}){const s=B(),f=r,v=_,k=async()=>{const{data:i}=await pe(f.eventListenerIdx);i?s.success("Deleted successfully."):s.error("Failed to delete."),v("get-event-listener-list")};return(i,c)=>(w(),y("div",$e,[n("div",Pe,[n("div",Fe,[c[2]||(c[2]=n("div",{class:"modal-status bg-danger"},null,-1)),c[3]||(c[3]=n("div",{class:"modal-header"},[n("h3",{class:"modal-title"},"Delete Event Listener"),n("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),n("div",Ue,[n("h4",null,"Are you sure you want to delete "+$(f.eventListenerName)+"?",1)]),n("div",We,[c[1]||(c[1]=n("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),n("a",{href:"#",class:"btn btn-primary ms-auto","data-bs-dismiss":"modal",onClick:c[0]||(c[0]=C=>k())},"Delete")])])])]))}}),Me={class:"card card-flush w-100"},Be={class:"card-body"},Re={class:"event-listener-table"},je=M({__name:"EventListenerList",setup(r){const _=B(),s=d([]),f=d([]);T(async()=>{C(),await v()});const v=async()=>{try{const{data:u}=await ce();s.value=u,s.value.forEach(l=>{l.eventListenerUrl=k(l.eventListenerCallUrl)})}catch(u){console.log(u),_.error("Failed to load data.")}},k=u=>window.location.origin+u,i=d(0),c=d(""),C=()=>{f.value=[{title:"Event Listener Name",field:"eventListenerName",minWidth:190,widthGrow:1.4,cssClass:"event-listener-text-cell",variableHeight:!0},{title:"Connect Workflow Name",field:"workflowName",minWidth:220,widthGrow:1.6,cssClass:"event-listener-text-cell",variableHeight:!0},{title:"Event Listener Desc",field:"eventListenerDesc",minWidth:220,widthGrow:1.8,cssClass:"event-listener-text-cell",variableHeight:!0},{title:"Action URL",field:"eventListenerUrl",minWidth:260,widthGrow:2.2,cssClass:"event-listener-url-cell",variableHeight:!0},{title:"Action",minWidth:180,widthGrow:1,formatter:a,cssClass:"event-listener-action-cell",headerSort:!1,variableHeight:!0,cellClick:async function(u,l){const b=u.target,h=b==null?void 0:b.getAttribute("id");i.value=l.getRow().getData().eventListenerIdx,h==="edit-btn"?(p.value="edit",await E("eventListenerForm")):h==="delete-btn"&&(c.value=l.getRow().getData().eventListenerName,await E("deleteEventListener"))}}]},E=async u=>{await re();const l=document.getElementById(u);l&&Y.getOrCreateInstance(l).show()},a=()=>`
-
`};return(b,y)=>{const m=Rl("b-overlay");return Te(),Ie(Cn,null,[W.value?(Te(),Ie("div",yb,[y[0]||(y[0]=se("h3",{class:"card-title mb-3"},"History",-1)),ht(m,{show:I.value,id:"overlay-background",variant:"transparent",opacity:"1",blur:"1rem",rounded:"lg",style:{"z-index":"1000"}},null,8,["show"]),se("div",null,[ht(by,{columns:o.value,"table-data":v.value},null,8,["columns","table-data"])])])):pn("",!0),W.value?(Te(),Zm(mb,{key:1,"workflow-idx":h.workflowIdx,"build-name":r.value,"workflow-name":h.workflowName,"workflow-stages":t.value},null,8,["workflow-idx","build-name","workflow-name","workflow-stages"])):pn("",!0)],64)}}}),bb={class:"page-header"},Sb={class:"row align-items-center"},Cb={class:"col"},_b={class:"page-title"},$b={class:"card card-flush w-100",ref:"workflowForm"},Ab={key:0,class:"card-body"},Eb={class:"card-title"},Lb={class:"mb-3"},Mb={class:"grid gap-0 column-gap-3"},xb={key:1,class:"btn btn-success",style:{margin:"3px",width:"150px"}},Tb={class:"mb-3"},kb={class:"grid gap-0 column-gap-3"},Ib=["value"],Rb={key:0,class:"mb-3"},Nb={class:"d-flex align-items-center justify-content-between mb-2"},Db={class:"form-check form-switch mb-0"},Ob={class:"form-check-label"},Fb={key:1,class:"mb-3"},Pb={class:"grid gap-0 column-gap-3 mb-2"},Wb={class:"tumblebug-param-field g-col-4"},Bb={class:"tumblebug-param-label"},Hb={class:"tumblebug-param-field g-col-4"},zb={class:"tumblebug-param-label"},Vb={class:"tumblebug-param-field g-col-4"},Ub={class:"tumblebug-param-label"},Kb={class:"grid gap-0 column-gap-3 mb-2"},Gb={class:"tumblebug-param-field g-col-6"},Yb={class:"tumblebug-param-label"},jb={class:"tumblebug-param-field g-col-6"},Xb={class:"tumblebug-param-label"},Zb={class:"tumblebug-param-label-actions"},Qb={class:"form-check form-switch tumblebug-k8s-toggle",title:"Load Kubernetes node images"},Jb={class:"grid gap-0 column-gap-3 mb-2"},qb={class:"tumblebug-param-field g-col-5"},e0={class:"tumblebug-param-label"},t0={class:"tumblebug-param-field g-col-5"},n0={class:"tumblebug-param-label"},i0={class:"grid gap-0 column-gap-3 mb-2"},r0={class:"tumblebug-param-label"},o0={class:"tumblebug-param-label"},s0={key:0,class:"tumblebug-param-field g-col-4"},a0={class:"tumblebug-param-label"},l0={key:0,class:"grid gap-0 column-gap-3 mt-2"},u0={class:"tumblebug-param-field g-col-12"},c0={class:"tumblebug-param-label"},h0={key:0,class:"text-secondary"},f0={class:"row align-items-center"},d0={class:"col-auto ms-auto"},p0={class:"btn-list"},qc="CREATE TABLE IF NOT EXISTS sample_data (id INT PRIMARY KEY, name VARCHAR(100));",g0="INSERT INTO sample_data (id, name) VALUES (1, 'sample row');",v0=hi({__name:"WorkflowForm",setup(N){const I=Nl(),h=ey(),v=ny(),W=Qm(),T=we(!1);let E=!1;io(async()=>{u(),await l(),await vt(),Lo(),await zs(),Jn(),await vr(),Jn(),T.value=!0,E&&(E=!1,await pr())});const $=we("new"),u=()=>{$.value=h.params.workflowIdx===void 0?"new":"detail"};let c=ty({});const s=we([]),a=we([]),o={workflowIdx:0,workflowName:"",workflowPurpose:"",ossIdx:0,script:""},r=[{paramKey:"",paramValue:"",eventListenerYn:"N"}],t=()=>(W.projectInfo.ns_id||W.projectInfo.name||"").trim(),i=S=>{var le,Se;const G=t(),ne=((Se=(le=S.find(Xe=>{var rt;return((rt=Xe.paramKey)==null?void 0:rt.trim().toUpperCase())==="NAMESPACE"}))==null?void 0:le.paramValue)==null?void 0:Se.trim())||"",de=G||ne;return de?S.map(Xe=>{var Bt;const rt=(Bt=Xe.paramKey)==null?void 0:Bt.trim().toUpperCase();return{...Xe,paramValue:rt==="NAMESPACE"||rt==="OBJECT_STORAGE_NAMESPACE"?de:Xe.paramValue}}):[...S]},l=async()=>{if($.value==="new")c={...o},s.value=[...r],a.value=[],Be.value=!1,ze.value="";else{const{data:S}=await ay(h.params.workflowIdx,"N");c={...S.workflowInfo,workflowPurpose:Eo(S.workflowInfo.workflowPurpose)},s.value=i(S.workflowParams),a.value=[...S.workflowStageMappings],c={...c,workflowIdx:h.params.workflowIdx},Be.value=!0,ze.value=c.workflowName}},f=["aws","azure","gcp","ncp","nhn","alibaba","tencent","ibm","kt"],d=we(go(f.map(S=>({label:S,value:S})))),C=we("aws"),b=we(""),y=we(""),m=we(""),x=we(""),O=we(""),k=we(""),R=we(""),B=we(""),L=we(""),A=we(""),w=we(!1),g=we([]),_=we([]),D=we([]),P=we([]),H=we([]),U=we([]),Y=we([]),te=we([]),K=we(!1),X=we([]),Z=we([]),J=we({}),re=we({});let ae=0,he=0,pe=0,_e=0,De=0,je=0,it=0,Oe=0,lt=0,Yn=0,bt=0;const ao=["infra-create","k8s-cluster-create","k8s-kubeconfig-get","mariadb-install","infra-ssh-connect-check","ssh-command-exec"],Ws=["TUMBLEBUG_SELECTOR_YN","NAMESPACE","PROVIDER","CSP","REGION","IMAGE","IMAGE_ID","SPEC","SPEC_ID","K8S_VERSION","INFRA_ID","SSH_HOST","DB_HOST","K8S_CLUSTER_ID","CONNECTION_NAME","ZONE"],jn=["PROVIDER","CSP","REGION","CONNECTION_NAME","ZONE","IMAGE","IMAGE_ID","SPEC","SPEC_ID","K8S_VERSION"],Ot=["infra-create","k8s-cluster-create","multi-csp-vm-deploy","multi-csp-k8s-cluster-deploy"],fi=[...Ot,...ao],Ti=["k8s-cluster-create","k8s-nodegroup-add","multi-csp-k8s-cluster-deploy"],Bs=["object-storage-ensure","object-storage-delete","jupyter-object-storage-analysis-install","jupyter-object-storage-analysis-remove"],Mt=we(!1),ar=we(!1),Xn={label:"No zone required",value:"",searchText:"no zone optional blank"},Zn={alibaba:{region:"ap-northeast-1",connectionName:"alibaba-ap-northeast-1",zone:"ap-northeast-1a",specId:"alibaba+ap-northeast-1+ecs.u1-c1m2.large",imageId:"ubuntu_24_04_x64_20G_alibase_20260810.vhd"},aws:{region:"ap-northeast-1",connectionName:"aws-ap-northeast-1",zone:"ap-northeast-1a",specId:"aws+ap-northeast-1+t3.medium",imageId:"ami-0dc2aed7540019237"},azure:{region:"koreasouth",connectionName:"azure-koreasouth",zone:"1",specId:"azure+koreasouth+Standard_D2s_v3",imageId:"Canonical:ubuntu-24_04-lts:minimal:24.04.202608100"},gcp:{region:"asia-northeast3",connectionName:"gcp-asia-northeast3",zone:"asia-northeast3-a",specId:"gcp+asia-northeast3+e2-medium",imageId:"https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-minimal-2404-noble-amd64-v20260817"},ibm:{region:"jp-osa",connectionName:"ibm-jp-osa",zone:"jp-osa-1",specId:"ibm+jp-osa+cx2-2x4",imageId:"r034-81a02369-9e59-4404-a922-30c110f1788d"},kt:{region:"kr1",connectionName:"kt-kr1",zone:"DX-M1",specId:"kt+kr1+2x4.itl",imageId:"e55c5985-b420-4a19-8c92-aa3461cda86e"},ncp:{region:"kr",connectionName:"ncp-kr",zone:"KR-1",specId:"ncp+kr+c2-g3a",imageId:"104630229"},nhn:{region:"kr1",connectionName:"nhn-kr1",zone:"kr-pub-a",specId:"nhn+kr1+m2.c2m4",imageId:"5c38715f-0375-4167-af4e-56f75ba8b252"},tencent:{region:"ap-seoul",connectionName:"tencent-ap-seoul",zone:"ap-seoul-1",specId:"tencent+ap-seoul+S5.MEDIUM4",imageId:"img-mmytdhbn"}},ki={alibaba:{region:"ap-northeast-1",connectionName:"alibaba-ap-northeast-1",zone:"ap-northeast-1a",specId:"alibaba+ap-northeast-1+ecs.u1-c1m2.xlarge",imageId:"AliyunLinux3ContainerOptimized",k8sVersion:"1.35.7-aliyun.1"},aws:{region:"ap-northeast-1",connectionName:"aws-ap-northeast-1",zone:"ap-northeast-1a",specId:"aws+ap-northeast-1+t3.medium",imageId:"AL2023_x86_64_STANDARD",k8sVersion:"1.35"},azure:{region:"koreasouth",connectionName:"azure-koreasouth",zone:"1",specId:"azure+koreasouth+Standard_D2s_v3",imageId:"",k8sVersion:"1.35.7"},gcp:{region:"asia-northeast3",connectionName:"gcp-asia-northeast3",zone:"asia-northeast3-a",specId:"gcp+asia-northeast3+e2-medium",imageId:"UBUNTU_CONTAINERD",k8sVersion:"1.34.9-gke.1655001"},ibm:{region:"jp-osa",connectionName:"ibm-jp-osa",zone:"jp-osa-1",specId:"ibm+jp-osa+cx2-2x4",imageId:"",k8sVersion:"1.35.7"},ncp:{region:"kr",connectionName:"ncp-kr",zone:"KR-1",specId:"ncp+kr+c2-g3a",imageId:"",k8sVersion:"1.34.3-nks.1"},nhn:{region:"kr1",connectionName:"nhn-kr1",zone:"kr-pub-a",specId:"nhn+kr1+m2.c2m4",imageId:"0f07c795-2a46-44fc-a61b-fa0d96763ce2",k8sVersion:"v1.34.3"},tencent:{region:"ap-seoul",connectionName:"tencent-ap-seoul",zone:"ap-seoul-1",specId:"tencent+ap-seoul+S5.MEDIUM4",imageId:"ubuntu22.04x86_64",k8sVersion:"1.34.1"}},lr=nn(()=>$.value==="new"||a.value.some(S=>fi.includes(S.workflowStageName||""))||s.value.some(S=>{var G;return Ws.includes(((G=S.paramKey)==null?void 0:G.trim().toUpperCase())||"")})),ur=nn(()=>a.value.some(S=>Ot.includes(S.workflowStageName||""))),$t=nn(()=>a.value.some(S=>Ti.includes((S.workflowStageName||"").toLowerCase()))),xn=nn(()=>a.value.some(S=>Bs.includes((S.workflowStageName||"").toLowerCase()))),cr=nn(()=>C.value.toLowerCase()==="azure"),di=nn(()=>te.value.length>0?te.value:!K.value&&cr.value&&m.value&&b.value&&(R.value||Gt())?[Xn]:[]),hr=nn(()=>di.value.length===1&&di.value[0].value===""?Xn.label:"Zone"),Tn=nn({get:()=>{const S=Je("TUMBLEBUG_SELECTOR_YN").trim().toUpperCase();return["Y","YES","TRUE","1"].includes(S)?!0:["N","NO","FALSE","0"].includes(S)?!1:ur.value},set:S=>{Ve("TUMBLEBUG_SELECTOR_YN",S?"Y":"N"),S?gt():Er()}}),lo=nn(()=>lr.value),Hs=nn(()=>lo.value&&Tn.value);Vn(b,async(S,G)=>{w.value||(Vs(S,G),await mr(),await Di(),await gi(),await kn(),await Oi(),await vi(),gt())}),Vn(m,async(S,G)=>{w.value||(S!==G&&(y.value=""),await kn(),await Oi(),gt())}),Vn($t,async S=>{ar.value||Mt.value===S||(Mt.value=S,w.value||(y.value="",dr(),await Di(),await kn(),gt()))});const zs=async()=>{w.value=!0;try{const S=fr(Je("SPEC_ID")||Je("IMAGE_ID"));S.provider&&(C.value=S.provider),x.value=ft(),O.value=Je("INFRA_ID")||Je("K8S_CLUSTER_ID"),k.value=Je("SSH_HOST")||Je("DB_HOST"),b.value=Je("REGION")||S.region,y.value=Je("IMAGE_ID")||Je("IMAGE"),m.value=Je("SPEC_ID")||Je("SPEC"),L.value=Je("K8S_VERSION"),A.value=Je("OBJECT_STORAGE_BUCKET"),R.value=Je("CONNECTION_NAME"),B.value=Je("ZONE"),co(),ar.value||(Mt.value=$t.value)}finally{await Qr(),w.value=!1}},fr=S=>{const G=(S||"").split("+");return G.length<3?{provider:"",region:""}:{provider:G[0],region:G[1]}},Ii=S=>(S||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"_"),Gt=()=>C.value&&b.value?`${C.value}-${b.value}`:"",Vs=(S,G)=>{const ne=C.value&&G?`${C.value}-${G}`:"";(!S||R.value===ne||R.value&&!R.value.includes(S))&&(R.value=""),_r(),B.value="",L.value=""},Us=()=>Je("CSP_LIST").split(",").map(S=>S.trim()).filter(Boolean),Qn=()=>Us().length>0,uo=S=>{const G=S.trim().toUpperCase(),ne=["REGION","CONNECTION_NAME","ZONE","IMAGE_ID","SPEC_ID","K8S_VERSION"];if(Qn()&&ne.includes(G)){const de=Ii(C.value);return de?`${de}_${G}`:G}return G},xt=S=>(Array.isArray(S)?S:[S]).map(ne=>uo(ne)).join(" / "),Ks=()=>Qn()?xt("IMAGE_ID"):xt(["IMAGE","IMAGE_ID"]),Gs=()=>Qn()?xt("SPEC_ID"):xt(["SPEC","SPEC_ID"]),Ft=S=>{const G=Ii(C.value);return G?Je(`${G}_${S}`):""},Ys=()=>{if(!(Mt.value||$t.value))return Zn[C.value.toLowerCase()]},pi=()=>Mt.value||$t.value?ki[C.value.toLowerCase()]:Ys(),dr=()=>{const S=pi();S&&(b.value=b.value||S.region,R.value=R.value||S.connectionName,B.value=B.value||S.zone,m.value=m.value||S.specId,y.value=y.value||S.imageId,L.value=L.value||S.k8sVersion||"")},co=()=>{if(!Qn())return;const S=pi(),G=fr(Ft("SPEC_ID")||Ft("IMAGE_ID"));b.value=Ft("REGION")||G.region||(S==null?void 0:S.region)||"",y.value=Ft("IMAGE_ID")||(S==null?void 0:S.imageId)||"",m.value=Ft("SPEC_ID")||(S==null?void 0:S.specId)||"",L.value=Ft("K8S_VERSION")||(S==null?void 0:S.k8sVersion)||"",R.value=Ft("CONNECTION_NAME")||(S==null?void 0:S.connectionName)||"",B.value=Ft("ZONE")||(S==null?void 0:S.zone)||""},pr=async()=>{Ve("NAMESPACE",x.value),Jn(),k.value="",U.value=[],await Promise.all([gi(),po()]),await kn(),await vi(),O.value&&await Fi()};Vn(()=>[W.projectInfo.ns_id,W.projectInfo.name],async()=>{if($.value!=="detail"||s.value.length===0)return;const S=t();if(s.value=i(s.value),!S||x.value===S)return;const G=x.value;if(x.value=S,!T.value){E=!!G;return}await pr()});const js=async()=>{b.value="",y.value="",m.value="",R.value="",B.value="",L.value="",co(),dr(),Jn(),await vr(),gt()},gr=()=>{gt()},ho=async()=>{So(),k.value="",U.value=[],O.value&&await Fi()},Xs=()=>{var G;const S=U.value.find(ne=>ne.value===k.value);S&&(Ve("SSH_HOST",S.value),Ve("DB_HOST",S.value),(G=S.meta)!=null&&G.sshUser&&Ve("SSH_USER",S.meta.sshUser))},Zs=async()=>{_r(),L.value="",await gi(),await kn(),await Oi(),await vi(),gt()},fo=()=>{gt()},Qs=()=>{gt()},Js=()=>{A.value=(A.value||"").trim(),gt()},qs=async()=>{ar.value=!0,y.value="",D.value=[],await kn(),gt()},ea=async()=>{await vr()},vr=async()=>{const S=w.value;w.value=!0;try{await ta(),await Ri(),dr(),await na(),Ni(),await mr(),await Di(),await Promise.all([gi(),po()]),await kn(),await Oi(),await vi(),O.value&&await Fi()}finally{await Qr(),w.value=S,gt()}},ta=async()=>{var G;const S=++ae;d.value=[];try{const{data:ne}=await ly();if(S!==ae)return;const de=Yt(ne);d.value=de.length>0?de:f.map(le=>({label:le,value:le}))}catch{if(S!==ae)return;d.value=f.map(de=>({label:de,value:de}))}S===ae&&(d.value.some(ne=>ne.value===C.value)||(C.value=((G=d.value[0])==null?void 0:G.value)||""))},Ri=async()=>{const S=++he;g.value=[];try{const{data:G}=await uy();if(S!==he)return;g.value=Yt(G),x.value||(x.value=ft())}catch{if(S!==he)return;g.value=[]}},na=async()=>{const S=++pe;_.value=[];try{const{data:G}=await cy(C.value);if(S!==pe)return;_.value=Yt(G)}catch{if(S!==pe)return;_.value=[]}},Ni=()=>{var G;if(_.value.length===0||b.value&&Rn(b.value,_.value))return;const S=Ft("REGION");if(S&&Rn(S,_.value)){b.value=S;return}b.value=((G=_.value[0])==null?void 0:G.value)||b.value},ia=(S=!1)=>{if(Y.value.length===0){R.value="";return}if(!S&&R.value&&Rn(R.value,Y.value))return;const G=Gt(),ne=Y.value.find(Se=>Se.value===G);if(S&&!ne){R.value=G;return}const de=ne||Y.value[0];R.value=(de==null?void 0:de.value)||"";const le=ra(R.value);!b.value&&le&&(b.value=le)},ra=S=>{const G=`${C.value}-`;return S!=null&&S.startsWith(G)?S.slice(G.length):""},kn=async()=>{const S=++_e;if(D.value=[],!m.value){y.value="";return}try{const G={providerName:C.value,regionName:b.value,connectionName:R.value||Gt(),matchedSpecId:m.value,isKubernetesImage:Mt.value?"true":void 0},{data:ne}=await pl(Co(),"image",G);if(S!==_e)return;D.value=Yt(ne,"image"),yo()}catch{if(S!==_e)return;D.value=[]}},gi=async()=>{const S=++De;P.value=[];try{const G={providerName:C.value,regionName:b.value,connectionName:R.value||Gt()},{data:ne}=await pl(Co(),"spec",G);if(S!==De)return;P.value=Yt(ne,"spec"),In()}catch{if(S!==De)return;P.value=[],In()}},mr=async()=>{const S=++je;Y.value=[];try{const G={providerName:C.value,regionName:b.value,filterVerified:"true"},{data:ne}=await Pc(G);if(S!==je)return;let de=Yt(ne),le=!1;if(de.length===0&&b.value){const Se=await Pc({providerName:C.value,filterVerified:"true"});if(S!==je)return;de=Yt(Se.data),le=!0}Y.value=de,ia(le)}catch{if(S!==je)return;Y.value=[]}},Di=async()=>{const S=++Oe;if(X.value=[],!(!$t.value||!C.value||!b.value))try{const{data:G}=await hy({providerName:C.value,regionName:b.value});if(S!==Oe)return;X.value=Yt(G,"k8sVersion"),oa()}catch{if(S!==Oe)return;X.value=[]}},oa=()=>{var ne,de;if(!$t.value||X.value.length===0||L.value&&Rn(L.value,X.value))return;const S=Qn()?Ft("K8S_VERSION"):Je("K8S_VERSION");if(S&&Rn(S,X.value)){L.value=S,gt();return}const G=(ne=pi())==null?void 0:ne.k8sVersion;if(G&&Rn(G,X.value)){L.value=G,gt();return}L.value=((de=X.value[0])==null?void 0:de.value)||L.value,gt()},Oi=async()=>{const S=++it;if(te.value=[],!m.value){K.value=!1;return}K.value=!0;try{const{data:G}=await fy({specId:m.value,providerName:C.value,regionName:b.value,connectionName:R.value||Gt()});if(S!==it)return;te.value=Yt(G),B.value&&!te.value.some(ne=>ne.value===B.value)&&(B.value=""),K.value=!1}catch{if(S!==it)return;te.value=[],K.value=!1}},vi=async()=>{const S=++lt;if(Z.value=[],J.value={},re.value={},!xn.value)return;const G=Je("OBJECT_STORAGE_NAMESPACE")||x.value||ft(),ne=C.value;if(!(!G||!ne))try{const{data:de}=await pl(G,"objectStorage",{providerName:ne});if(S!==lt)return;const le=(de==null?void 0:de.data)??de,Se=Array.isArray(le)?le:[],Xe={},rt={};Z.value=Se.map(Qe=>{const Bt=String((Qe==null?void 0:Qe.id)||(Qe==null?void 0:Qe.name)||"").trim();if(!Bt)return null;Xe[Bt]=String((Qe==null?void 0:Qe.cspResourceName)||"").trim();const sn=String((Qe==null?void 0:Qe.region)||"").trim();return rt[Bt]=sn,{label:Bt,value:Bt}}).filter(Qe=>Qe!==null),J.value=Xe,re.value=rt}catch{if(S!==lt)return;Z.value=[],J.value={},re.value={}}},po=async()=>{const S=++Yn;if(H.value=[],!!x.value)try{const{data:G}=await dy(x.value,{option:"simple"});if(S!==Yn)return;H.value=Yt(G)}catch{if(S!==Yn)return;H.value=[]}},Fi=async()=>{const S=++bt;if(U.value=[],!(!x.value||!O.value))try{const{data:G}=await py(x.value,O.value,{option:"accessinfo",accessInfoOption:"showSshKey"});if(S!==bt)return;U.value=bo(G)}catch{if(S!==bt)return;U.value=[]}},Yt=(S,G="default")=>{const ne=(S==null?void 0:S.data)??S,de=$r(ne),le=new Set;return de.map(Se=>{const Xe=sa(Se,G),rt=vo(Se,Xe,G),Qe=Pi(Se,Xe,rt,G);return{label:rt,value:Xe,searchText:Qe}}).filter(Se=>!Se.value||le.has(Se.value)?!1:(le.add(Se.value),!0)).sort(mi)};function go(S){return[...S].sort(mi)}function mi(S,G){const ne=(S.label||S.value||"").trim(),de=(G.label||G.value||"").trim(),le=ne.localeCompare(de,void 0,{numeric:!0,sensitivity:"base"});return le!==0?le:(S.value||"").localeCompare(G.value||"",void 0,{numeric:!0,sensitivity:"base"})}const sa=(S,G)=>{if(G==="k8sVersion")return String(on([S==null?void 0:S.id,S==null?void 0:S.version,S==null?void 0:S.value,S==null?void 0:S.name,S]));if(G==="spec"){const ne=on([S==null?void 0:S.specId,S==null?void 0:S.id,S==null?void 0:S.cspSpecId,S==null?void 0:S.cspSpecName,S==null?void 0:S.CspSpecName,S==null?void 0:S.specName,S==null?void 0:S.Name,S==null?void 0:S.VMSpecName,S==null?void 0:S.name]);return String(Sr(S,ne))}return String(on(G==="image"?[S==null?void 0:S.imageId,S==null?void 0:S.id,S==null?void 0:S.cspImageId,S==null?void 0:S.name]:[],[S==null?void 0:S.id,S==null?void 0:S.specId,S==null?void 0:S.imageId,S==null?void 0:S.configName,S==null?void 0:S.connectionName,S==null?void 0:S.providerName,S==null?void 0:S.provider,S==null?void 0:S.csp,S==null?void 0:S.cspName,S==null?void 0:S.nsId,S==null?void 0:S.name,S==null?void 0:S.infraId,S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,S==null?void 0:S.zoneId,S==null?void 0:S.zoneName,S==null?void 0:S.zone,S==null?void 0:S.assignedZone,S]))},vo=(S,G,ne)=>{if(ne==="k8sVersion")return wr(G,Wi(G,[S==null?void 0:S.name,S==null?void 0:S.displayName,S==null?void 0:S.version,S==null?void 0:S.value]));if(ne==="image")return wr(G,Wi(G,[S==null?void 0:S.displayName,S==null?void 0:S.imageName,S==null?void 0:S.cspImageName,S==null?void 0:S.guestOS,S==null?void 0:S.GuestOS,S==null?void 0:S.guestOs,S==null?void 0:S.osDistribution,S==null?void 0:S.OSDistribution,S==null?void 0:S.osPlatform,S==null?void 0:S.OSPlatform,S==null?void 0:S.description,S==null?void 0:S.Description,S==null?void 0:S.name]));if(ne==="spec"){const le=Wi(G,[S==null?void 0:S.displayName,S==null?void 0:S.specName,S==null?void 0:S.cspSpecName,S==null?void 0:S.CspSpecName,S==null?void 0:S.Name,S==null?void 0:S.VMSpecName,S==null?void 0:S.description,S==null?void 0:S.Description,S==null?void 0:S.name])||br(S);return wr(G,le)}const de=on([S==null?void 0:S.name,S==null?void 0:S.id,S==null?void 0:S.configName,S==null?void 0:S.connectionName,S==null?void 0:S.providerName,S==null?void 0:S.provider,S==null?void 0:S.csp,S==null?void 0:S.cspName,S==null?void 0:S.nsId,S==null?void 0:S.infraId,S==null?void 0:S.specName,S==null?void 0:S.imageName,S==null?void 0:S.specId,S==null?void 0:S.imageId,S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,S==null?void 0:S.zoneId,S==null?void 0:S.zoneName,S==null?void 0:S.zone,S==null?void 0:S.assignedZone,G]);return String(de)},Pi=(S,G,ne,de)=>{const le=on([S==null?void 0:S.providerName,S==null?void 0:S.provider,S==null?void 0:S.csp,S==null?void 0:S.cspName,C.value]),Se=on([S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,b.value]),Xe=de==="image"?[S==null?void 0:S.displayName,S==null?void 0:S.imageName,S==null?void 0:S.cspImageName,S==null?void 0:S.guestOS,S==null?void 0:S.GuestOS,S==null?void 0:S.guestOs,S==null?void 0:S.osDistribution,S==null?void 0:S.OSDistribution,S==null?void 0:S.osPlatform,S==null?void 0:S.OSPlatform,S==null?void 0:S.description,S==null?void 0:S.Description]:[],rt=de==="spec"?[S==null?void 0:S.displayName,S==null?void 0:S.specName,S==null?void 0:S.cspSpecName,S==null?void 0:S.CspSpecName,S==null?void 0:S.Name,S==null?void 0:S.VMSpecName,S==null?void 0:S.description,S==null?void 0:S.Description,br(S)]:[],Qe=de==="k8sVersion"?[S==null?void 0:S.name,S==null?void 0:S.displayName,S==null?void 0:S.version,S==null?void 0:S.value]:[],Bt=yr([G,ne,S==null?void 0:S.id,S==null?void 0:S.name,S==null?void 0:S.imageId,S==null?void 0:S.specId,S==null?void 0:S.cspImageId,S==null?void 0:S.cspSpecId,S==null?void 0:S.configName,S==null?void 0:S.connectionName,S==null?void 0:S.infraId,S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,...Xe,...rt,...Qe]),sn=yr(Bt.flatMap(tt=>[le&&Se?`${le}+${Se}+${tt}`:"",le&&Se?`${le}-${Se}-${tt}`:"",le&&Se?`${le} ${Se} ${tt}`:""]));return[...Bt,...sn].join(` + `};return(b,y)=>{const m=Rl("b-overlay");return Te(),Ie(Cn,null,[W.value?(Te(),Ie("div",yb,[y[0]||(y[0]=se("h3",{class:"card-title mb-3"},"History",-1)),ht(m,{show:I.value,id:"overlay-background",variant:"transparent",opacity:"1",blur:"1rem",rounded:"lg",style:{"z-index":"1000"}},null,8,["show"]),se("div",null,[ht(by,{columns:o.value,"table-data":v.value},null,8,["columns","table-data"])])])):pn("",!0),W.value?(Te(),Zm(mb,{key:1,"workflow-idx":h.workflowIdx,"build-name":r.value,"workflow-name":h.workflowName,"workflow-stages":t.value},null,8,["workflow-idx","build-name","workflow-name","workflow-stages"])):pn("",!0)],64)}}}),bb={class:"page-header"},Sb={class:"row align-items-center"},Cb={class:"col"},_b={class:"page-title"},$b={class:"card card-flush w-100",ref:"workflowForm"},Ab={key:0,class:"card-body"},Eb={class:"card-title"},Lb={class:"mb-3"},Mb={class:"grid gap-0 column-gap-3"},xb={key:1,class:"btn btn-success",style:{margin:"3px",width:"150px"}},Tb={class:"mb-3"},kb={class:"grid gap-0 column-gap-3"},Ib=["value"],Rb={key:0,class:"mb-3"},Nb={class:"d-flex align-items-center justify-content-between mb-2"},Db={class:"form-check form-switch mb-0"},Ob={class:"form-check-label"},Fb={key:1,class:"mb-3"},Pb={class:"grid gap-0 column-gap-3 mb-2"},Wb={class:"tumblebug-param-field g-col-4"},Bb={class:"tumblebug-param-label"},Hb={class:"tumblebug-param-field g-col-4"},zb={class:"tumblebug-param-label"},Vb={class:"tumblebug-param-field g-col-4"},Ub={class:"tumblebug-param-label"},Kb={class:"grid gap-0 column-gap-3 mb-2"},Gb={class:"tumblebug-param-field g-col-6"},Yb={class:"tumblebug-param-label"},jb={class:"tumblebug-param-field g-col-6"},Xb={class:"tumblebug-param-label"},Zb={class:"tumblebug-param-label-actions"},Qb={class:"form-check form-switch tumblebug-k8s-toggle",title:"Load Kubernetes node images"},Jb={class:"grid gap-0 column-gap-3 mb-2"},qb={class:"tumblebug-param-field g-col-5"},e0={class:"tumblebug-param-label"},t0={class:"tumblebug-param-field g-col-5"},n0={class:"tumblebug-param-label"},i0={class:"grid gap-0 column-gap-3 mb-2"},r0={class:"tumblebug-param-label"},o0={class:"tumblebug-param-label"},s0={key:0,class:"tumblebug-param-field g-col-4"},a0={class:"tumblebug-param-label"},l0={key:0,class:"grid gap-0 column-gap-3 mt-2"},u0={class:"tumblebug-param-field g-col-12"},c0={class:"tumblebug-param-label"},h0={key:0,class:"text-secondary"},f0={class:"row align-items-center"},d0={class:"col-auto ms-auto"},p0={class:"btn-list"},qc="CREATE TABLE IF NOT EXISTS sample_data (id INT PRIMARY KEY, name VARCHAR(100));",g0="INSERT INTO sample_data (id, name) VALUES (1, 'sample row');",v0=hi({__name:"WorkflowForm",setup(N){const I=Nl(),h=ey(),v=ny(),W=Qm(),T=we(!1);let E=!1;io(async()=>{u(),await l(),await vt(),Lo(),await zs(),Jn(),await vr(),Jn(),T.value=!0,E&&(E=!1,await pr())});const $=we("new"),u=()=>{$.value=h.params.workflowIdx===void 0?"new":"detail"};let c=ty({});const s=we([]),a=we([]),o={workflowIdx:0,workflowName:"",workflowPurpose:"",ossIdx:0,script:""},r=[{paramKey:"",paramValue:"",eventListenerYn:"N"}],t=()=>(W.projectInfo.ns_id||W.projectInfo.name||"").trim(),i=S=>{var le,Se;const G=t(),ne=((Se=(le=S.find(Xe=>{var rt;return((rt=Xe.paramKey)==null?void 0:rt.trim().toUpperCase())==="NAMESPACE"}))==null?void 0:le.paramValue)==null?void 0:Se.trim())||"",de=G||ne;return de?S.map(Xe=>{var Bt;const rt=(Bt=Xe.paramKey)==null?void 0:Bt.trim().toUpperCase();return{...Xe,paramValue:rt==="NAMESPACE"||rt==="OBJECT_STORAGE_NAMESPACE"?de:Xe.paramValue}}):[...S]},l=async()=>{if($.value==="new")c={...o},s.value=[...r],a.value=[],Be.value=!1,ze.value="";else{const{data:S}=await ay(h.params.workflowIdx,"N");c={...S.workflowInfo,workflowPurpose:Eo(S.workflowInfo.workflowPurpose)},s.value=i(S.workflowParams),a.value=[...S.workflowStageMappings],c={...c,workflowIdx:h.params.workflowIdx},Be.value=!0,ze.value=c.workflowName}},f=["aws","azure","gcp","ncp","nhn","alibaba","tencent","ibm","kt"],d=we(go(f.map(S=>({label:S,value:S})))),C=we("aws"),b=we(""),y=we(""),m=we(""),x=we(""),O=we(""),k=we(""),R=we(""),B=we(""),L=we(""),A=we(""),w=we(!1),g=we([]),_=we([]),D=we([]),P=we([]),H=we([]),U=we([]),Y=we([]),te=we([]),K=we(!1),X=we([]),Z=we([]),J=we({}),re=we({});let ae=0,he=0,pe=0,_e=0,De=0,je=0,it=0,Oe=0,lt=0,Yn=0,bt=0;const ao=["infra-create","k8s-cluster-create","k8s-kubeconfig-get","mariadb-install","infra-ssh-connect-check","ssh-command-exec"],Ws=["TUMBLEBUG_SELECTOR_YN","NAMESPACE","PROVIDER","CSP","REGION","IMAGE","IMAGE_ID","SPEC","SPEC_ID","K8S_VERSION","INFRA_ID","SSH_HOST","DB_HOST","K8S_CLUSTER_ID","CONNECTION_NAME","ZONE"],jn=["PROVIDER","CSP","REGION","CONNECTION_NAME","ZONE","IMAGE","IMAGE_ID","SPEC","SPEC_ID","K8S_VERSION"],Ot=["infra-create","k8s-cluster-create","multi-csp-vm-deploy","multi-csp-k8s-cluster-deploy"],fi=[...Ot,...ao],Ti=["k8s-cluster-create","k8s-nodegroup-add","multi-csp-k8s-cluster-deploy"],Bs=["object-storage-ensure","object-storage-delete","jupyter-object-storage-analysis-install","jupyter-object-storage-analysis-remove"],Mt=we(!1),ar=we(!1),Xn={label:"No zone required",value:"",searchText:"no zone optional blank"},Zn={alibaba:{region:"ap-northeast-2",connectionName:"alibaba-ap-northeast-2",zone:"ap-northeast-2a",specId:"alibaba+ap-northeast-2+ecs.g9i.large",imageId:"ubuntu_24_04_x64_20G_alibase_20260810.vhd"},aws:{region:"ap-northeast-2",connectionName:"aws-ap-northeast-2",zone:"ap-northeast-2a",specId:"aws+ap-northeast-2+m8i.large",imageId:"ami-01ed18897a4aadead"},azure:{region:"koreacentral",connectionName:"azure-koreacentral",zone:"1",specId:"azure+koreacentral+Standard_D2s_v6",imageId:"Canonical:ubuntu-24_04-lts:minimal:24.04.202608100"},gcp:{region:"asia-northeast3",connectionName:"gcp-asia-northeast3",zone:"asia-northeast3-a",specId:"gcp+asia-northeast3+n4-standard-2",imageId:"https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-minimal-2404-noble-amd64-v20260817"},ibm:{region:"jp-tok",connectionName:"ibm-jp-tok",zone:"jp-tok-1",specId:"ibm+jp-tok+bx2-2x8",imageId:"r022-9130f04e-631a-4e91-ae4c-b85d54621c24"},kt:{region:"kr1",connectionName:"kt-kr1",zone:"DX-M1",specId:"kt+kr1+2x8.itl",imageId:"e55c5985-b420-4a19-8c92-aa3461cda86e"},ncp:{region:"kr",connectionName:"ncp-kr",zone:"KR-1",specId:"ncp+kr+s2-g3",imageId:"104630229"},nhn:{region:"kr1",connectionName:"nhn-kr1",zone:"kr-pub-a",specId:"nhn+kr1+r2.c2m8",imageId:"5c38715f-0375-4167-af4e-56f75ba8b252"},tencent:{region:"ap-seoul",connectionName:"tencent-ap-seoul",zone:"ap-seoul-1",specId:"tencent+ap-seoul+S5.MEDIUM8",imageId:"img-mmytdhbn"}},ki={alibaba:{region:"ap-northeast-2",connectionName:"alibaba-ap-northeast-2",zone:"ap-northeast-2a",specId:"alibaba+ap-northeast-2+ecs.c9i.xlarge",imageId:"Ubuntu",k8sVersion:"1.35.7-aliyun.1"},aws:{region:"ap-northeast-2",connectionName:"aws-ap-northeast-2",zone:"ap-northeast-2a",specId:"aws+ap-northeast-2+c8i.xlarge",imageId:"AL2023_x86_64_STANDARD",k8sVersion:"1.35"},azure:{region:"koreacentral",connectionName:"azure-koreacentral",zone:"1",specId:"azure+koreacentral+Standard_D4ls_v6",imageId:"",k8sVersion:"1.35.7"},gcp:{region:"asia-northeast3",connectionName:"gcp-asia-northeast3",zone:"asia-northeast3-a",specId:"gcp+asia-northeast3+n4-highcpu-4",imageId:"UBUNTU_CONTAINERD",k8sVersion:"1.34.10-gke.1236000"},ibm:{region:"jp-tok",connectionName:"ibm-jp-tok",zone:"jp-tok-1",specId:"ibm+jp-tok+cx2-4x8",imageId:"",k8sVersion:"1.35.7"},ncp:{region:"kr",connectionName:"ncp-kr",zone:"KR-1",specId:"ncp+kr+c4-g3",imageId:"",k8sVersion:"1.34.3-nks.1"},nhn:{region:"kr1",connectionName:"nhn-kr1",zone:"kr-pub-a",specId:"nhn+kr1+m2.c4m8",imageId:"107cc02d-02d8-44fd-84d6-6c316045b817",k8sVersion:"v1.34.3"},tencent:{region:"ap-seoul",connectionName:"tencent-ap-seoul",zone:"ap-seoul-1",specId:"tencent+ap-seoul+S5.LARGE8",imageId:"ubuntu22.04x86_64",k8sVersion:"1.34.1"}},lr=nn(()=>$.value==="new"||a.value.some(S=>fi.includes(S.workflowStageName||""))||s.value.some(S=>{var G;return Ws.includes(((G=S.paramKey)==null?void 0:G.trim().toUpperCase())||"")})),ur=nn(()=>a.value.some(S=>Ot.includes(S.workflowStageName||""))),$t=nn(()=>a.value.some(S=>Ti.includes((S.workflowStageName||"").toLowerCase()))),xn=nn(()=>a.value.some(S=>Bs.includes((S.workflowStageName||"").toLowerCase()))),cr=nn(()=>C.value.toLowerCase()==="azure"),di=nn(()=>te.value.length>0?te.value:!K.value&&cr.value&&m.value&&b.value&&(R.value||Gt())?[Xn]:[]),hr=nn(()=>di.value.length===1&&di.value[0].value===""?Xn.label:"Zone"),Tn=nn({get:()=>{const S=Je("TUMBLEBUG_SELECTOR_YN").trim().toUpperCase();return["Y","YES","TRUE","1"].includes(S)?!0:["N","NO","FALSE","0"].includes(S)?!1:ur.value},set:S=>{Ve("TUMBLEBUG_SELECTOR_YN",S?"Y":"N"),S?gt():Er()}}),lo=nn(()=>lr.value),Hs=nn(()=>lo.value&&Tn.value);Vn(b,async(S,G)=>{w.value||(Vs(S,G),await mr(),await Di(),await gi(),await kn(),await Oi(),await vi(),gt())}),Vn(m,async(S,G)=>{w.value||(S!==G&&(y.value=""),await kn(),await Oi(),gt())}),Vn($t,async S=>{ar.value||Mt.value===S||(Mt.value=S,w.value||(y.value="",dr(),await Di(),await kn(),gt()))});const zs=async()=>{w.value=!0;try{const S=fr(Je("SPEC_ID")||Je("IMAGE_ID"));S.provider&&(C.value=S.provider),x.value=ft(),O.value=Je("INFRA_ID")||Je("K8S_CLUSTER_ID"),k.value=Je("SSH_HOST")||Je("DB_HOST"),b.value=Je("REGION")||S.region,y.value=Je("IMAGE_ID")||Je("IMAGE"),m.value=Je("SPEC_ID")||Je("SPEC"),L.value=Je("K8S_VERSION"),A.value=Je("OBJECT_STORAGE_BUCKET"),R.value=Je("CONNECTION_NAME"),B.value=Je("ZONE"),co(),ar.value||(Mt.value=$t.value)}finally{await Qr(),w.value=!1}},fr=S=>{const G=(S||"").split("+");return G.length<3?{provider:"",region:""}:{provider:G[0],region:G[1]}},Ii=S=>(S||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"_"),Gt=()=>C.value&&b.value?`${C.value}-${b.value}`:"",Vs=(S,G)=>{const ne=C.value&&G?`${C.value}-${G}`:"";(!S||R.value===ne||R.value&&!R.value.includes(S))&&(R.value=""),_r(),B.value="",L.value=""},Us=()=>Je("CSP_LIST").split(",").map(S=>S.trim()).filter(Boolean),Qn=()=>Us().length>0,uo=S=>{const G=S.trim().toUpperCase(),ne=["REGION","CONNECTION_NAME","ZONE","IMAGE_ID","SPEC_ID","K8S_VERSION"];if(Qn()&&ne.includes(G)){const de=Ii(C.value);return de?`${de}_${G}`:G}return G},xt=S=>(Array.isArray(S)?S:[S]).map(ne=>uo(ne)).join(" / "),Ks=()=>Qn()?xt("IMAGE_ID"):xt(["IMAGE","IMAGE_ID"]),Gs=()=>Qn()?xt("SPEC_ID"):xt(["SPEC","SPEC_ID"]),Ft=S=>{const G=Ii(C.value);return G?Je(`${G}_${S}`):""},Ys=()=>{if(!(Mt.value||$t.value))return Zn[C.value.toLowerCase()]},pi=()=>Mt.value||$t.value?ki[C.value.toLowerCase()]:Ys(),dr=()=>{const S=pi();S&&(b.value=b.value||S.region,R.value=R.value||S.connectionName,B.value=B.value||S.zone,m.value=m.value||S.specId,y.value=y.value||S.imageId,L.value=L.value||S.k8sVersion||"")},co=()=>{if(!Qn())return;const S=pi(),G=fr(Ft("SPEC_ID")||Ft("IMAGE_ID"));b.value=Ft("REGION")||G.region||(S==null?void 0:S.region)||"",y.value=Ft("IMAGE_ID")||(S==null?void 0:S.imageId)||"",m.value=Ft("SPEC_ID")||(S==null?void 0:S.specId)||"",L.value=Ft("K8S_VERSION")||(S==null?void 0:S.k8sVersion)||"",R.value=Ft("CONNECTION_NAME")||(S==null?void 0:S.connectionName)||"",B.value=Ft("ZONE")||(S==null?void 0:S.zone)||""},pr=async()=>{Ve("NAMESPACE",x.value),Jn(),k.value="",U.value=[],await Promise.all([gi(),po()]),await kn(),await vi(),O.value&&await Fi()};Vn(()=>[W.projectInfo.ns_id,W.projectInfo.name],async()=>{if($.value!=="detail"||s.value.length===0)return;const S=t();if(s.value=i(s.value),!S||x.value===S)return;const G=x.value;if(x.value=S,!T.value){E=!!G;return}await pr()});const js=async()=>{b.value="",y.value="",m.value="",R.value="",B.value="",L.value="",co(),dr(),Jn(),await vr(),gt()},gr=()=>{gt()},ho=async()=>{So(),k.value="",U.value=[],O.value&&await Fi()},Xs=()=>{var G;const S=U.value.find(ne=>ne.value===k.value);S&&(Ve("SSH_HOST",S.value),Ve("DB_HOST",S.value),(G=S.meta)!=null&&G.sshUser&&Ve("SSH_USER",S.meta.sshUser))},Zs=async()=>{_r(),L.value="",await gi(),await kn(),await Oi(),await vi(),gt()},fo=()=>{gt()},Qs=()=>{gt()},Js=()=>{A.value=(A.value||"").trim(),gt()},qs=async()=>{ar.value=!0,y.value="",D.value=[],await kn(),gt()},ea=async()=>{await vr()},vr=async()=>{const S=w.value;w.value=!0;try{await ta(),await Ri(),dr(),await na(),Ni(),await mr(),await Di(),await Promise.all([gi(),po()]),await kn(),await Oi(),await vi(),O.value&&await Fi()}finally{await Qr(),w.value=S,gt()}},ta=async()=>{var G;const S=++ae;d.value=[];try{const{data:ne}=await ly();if(S!==ae)return;const de=Yt(ne);d.value=de.length>0?de:f.map(le=>({label:le,value:le}))}catch{if(S!==ae)return;d.value=f.map(de=>({label:de,value:de}))}S===ae&&(d.value.some(ne=>ne.value===C.value)||(C.value=((G=d.value[0])==null?void 0:G.value)||""))},Ri=async()=>{const S=++he;g.value=[];try{const{data:G}=await uy();if(S!==he)return;g.value=Yt(G),x.value||(x.value=ft())}catch{if(S!==he)return;g.value=[]}},na=async()=>{const S=++pe;_.value=[];try{const{data:G}=await cy(C.value);if(S!==pe)return;_.value=Yt(G)}catch{if(S!==pe)return;_.value=[]}},Ni=()=>{var G;if(_.value.length===0||b.value&&Rn(b.value,_.value))return;const S=Ft("REGION");if(S&&Rn(S,_.value)){b.value=S;return}b.value=((G=_.value[0])==null?void 0:G.value)||b.value},ia=(S=!1)=>{if(Y.value.length===0){R.value="";return}if(!S&&R.value&&Rn(R.value,Y.value))return;const G=Gt(),ne=Y.value.find(Se=>Se.value===G);if(S&&!ne){R.value=G;return}const de=ne||Y.value[0];R.value=(de==null?void 0:de.value)||"";const le=ra(R.value);!b.value&&le&&(b.value=le)},ra=S=>{const G=`${C.value}-`;return S!=null&&S.startsWith(G)?S.slice(G.length):""},kn=async()=>{const S=++_e;if(D.value=[],!m.value){y.value="";return}try{const G={providerName:C.value,regionName:b.value,connectionName:R.value||Gt(),matchedSpecId:m.value,isKubernetesImage:Mt.value?"true":void 0},{data:ne}=await pl(Co(),"image",G);if(S!==_e)return;D.value=Yt(ne,"image"),yo()}catch{if(S!==_e)return;D.value=[]}},gi=async()=>{const S=++De;P.value=[];try{const G={providerName:C.value,regionName:b.value,connectionName:R.value||Gt()},{data:ne}=await pl(Co(),"spec",G);if(S!==De)return;P.value=Yt(ne,"spec"),In()}catch{if(S!==De)return;P.value=[],In()}},mr=async()=>{const S=++je;Y.value=[];try{const G={providerName:C.value,regionName:b.value,filterVerified:"true"},{data:ne}=await Pc(G);if(S!==je)return;let de=Yt(ne),le=!1;if(de.length===0&&b.value){const Se=await Pc({providerName:C.value,filterVerified:"true"});if(S!==je)return;de=Yt(Se.data),le=!0}Y.value=de,ia(le)}catch{if(S!==je)return;Y.value=[]}},Di=async()=>{const S=++Oe;if(X.value=[],!(!$t.value||!C.value||!b.value))try{const{data:G}=await hy({providerName:C.value,regionName:b.value});if(S!==Oe)return;X.value=Yt(G,"k8sVersion"),oa()}catch{if(S!==Oe)return;X.value=[]}},oa=()=>{var ne,de;if(!$t.value||X.value.length===0||L.value&&Rn(L.value,X.value))return;const S=Qn()?Ft("K8S_VERSION"):Je("K8S_VERSION");if(S&&Rn(S,X.value)){L.value=S,gt();return}const G=(ne=pi())==null?void 0:ne.k8sVersion;if(G&&Rn(G,X.value)){L.value=G,gt();return}L.value=((de=X.value[0])==null?void 0:de.value)||L.value,gt()},Oi=async()=>{const S=++it;if(te.value=[],!m.value){K.value=!1;return}K.value=!0;try{const{data:G}=await fy({specId:m.value,providerName:C.value,regionName:b.value,connectionName:R.value||Gt()});if(S!==it)return;te.value=Yt(G),B.value&&!te.value.some(ne=>ne.value===B.value)&&(B.value=""),K.value=!1}catch{if(S!==it)return;te.value=[],K.value=!1}},vi=async()=>{const S=++lt;if(Z.value=[],J.value={},re.value={},!xn.value)return;const G=Je("OBJECT_STORAGE_NAMESPACE")||x.value||ft(),ne=C.value;if(!(!G||!ne))try{const{data:de}=await pl(G,"objectStorage",{providerName:ne});if(S!==lt)return;const le=(de==null?void 0:de.data)??de,Se=Array.isArray(le)?le:[],Xe={},rt={};Z.value=Se.map(Qe=>{const Bt=String((Qe==null?void 0:Qe.id)||(Qe==null?void 0:Qe.name)||"").trim();if(!Bt)return null;Xe[Bt]=String((Qe==null?void 0:Qe.cspResourceName)||"").trim();const sn=String((Qe==null?void 0:Qe.region)||"").trim();return rt[Bt]=sn,{label:Bt,value:Bt}}).filter(Qe=>Qe!==null),J.value=Xe,re.value=rt}catch{if(S!==lt)return;Z.value=[],J.value={},re.value={}}},po=async()=>{const S=++Yn;if(H.value=[],!!x.value)try{const{data:G}=await dy(x.value,{option:"simple"});if(S!==Yn)return;H.value=Yt(G)}catch{if(S!==Yn)return;H.value=[]}},Fi=async()=>{const S=++bt;if(U.value=[],!(!x.value||!O.value))try{const{data:G}=await py(x.value,O.value,{option:"accessinfo",accessInfoOption:"showSshKey"});if(S!==bt)return;U.value=bo(G)}catch{if(S!==bt)return;U.value=[]}},Yt=(S,G="default")=>{const ne=(S==null?void 0:S.data)??S,de=$r(ne),le=new Set;return de.map(Se=>{const Xe=sa(Se,G),rt=vo(Se,Xe,G),Qe=Pi(Se,Xe,rt,G);return{label:rt,value:Xe,searchText:Qe}}).filter(Se=>!Se.value||le.has(Se.value)?!1:(le.add(Se.value),!0)).sort(mi)};function go(S){return[...S].sort(mi)}function mi(S,G){const ne=(S.label||S.value||"").trim(),de=(G.label||G.value||"").trim(),le=ne.localeCompare(de,void 0,{numeric:!0,sensitivity:"base"});return le!==0?le:(S.value||"").localeCompare(G.value||"",void 0,{numeric:!0,sensitivity:"base"})}const sa=(S,G)=>{if(G==="k8sVersion")return String(on([S==null?void 0:S.id,S==null?void 0:S.version,S==null?void 0:S.value,S==null?void 0:S.name,S]));if(G==="spec"){const ne=on([S==null?void 0:S.specId,S==null?void 0:S.id,S==null?void 0:S.cspSpecId,S==null?void 0:S.cspSpecName,S==null?void 0:S.CspSpecName,S==null?void 0:S.specName,S==null?void 0:S.Name,S==null?void 0:S.VMSpecName,S==null?void 0:S.name]);return String(Sr(S,ne))}return String(on(G==="image"?[S==null?void 0:S.imageId,S==null?void 0:S.id,S==null?void 0:S.cspImageId,S==null?void 0:S.name]:[],[S==null?void 0:S.id,S==null?void 0:S.specId,S==null?void 0:S.imageId,S==null?void 0:S.configName,S==null?void 0:S.connectionName,S==null?void 0:S.providerName,S==null?void 0:S.provider,S==null?void 0:S.csp,S==null?void 0:S.cspName,S==null?void 0:S.nsId,S==null?void 0:S.name,S==null?void 0:S.infraId,S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,S==null?void 0:S.zoneId,S==null?void 0:S.zoneName,S==null?void 0:S.zone,S==null?void 0:S.assignedZone,S]))},vo=(S,G,ne)=>{if(ne==="k8sVersion")return wr(G,Wi(G,[S==null?void 0:S.name,S==null?void 0:S.displayName,S==null?void 0:S.version,S==null?void 0:S.value]));if(ne==="image")return wr(G,Wi(G,[S==null?void 0:S.displayName,S==null?void 0:S.imageName,S==null?void 0:S.cspImageName,S==null?void 0:S.guestOS,S==null?void 0:S.GuestOS,S==null?void 0:S.guestOs,S==null?void 0:S.osDistribution,S==null?void 0:S.OSDistribution,S==null?void 0:S.osPlatform,S==null?void 0:S.OSPlatform,S==null?void 0:S.description,S==null?void 0:S.Description,S==null?void 0:S.name]));if(ne==="spec"){const le=Wi(G,[S==null?void 0:S.displayName,S==null?void 0:S.specName,S==null?void 0:S.cspSpecName,S==null?void 0:S.CspSpecName,S==null?void 0:S.Name,S==null?void 0:S.VMSpecName,S==null?void 0:S.description,S==null?void 0:S.Description,S==null?void 0:S.name])||br(S);return wr(G,le)}const de=on([S==null?void 0:S.name,S==null?void 0:S.id,S==null?void 0:S.configName,S==null?void 0:S.connectionName,S==null?void 0:S.providerName,S==null?void 0:S.provider,S==null?void 0:S.csp,S==null?void 0:S.cspName,S==null?void 0:S.nsId,S==null?void 0:S.infraId,S==null?void 0:S.specName,S==null?void 0:S.imageName,S==null?void 0:S.specId,S==null?void 0:S.imageId,S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,S==null?void 0:S.zoneId,S==null?void 0:S.zoneName,S==null?void 0:S.zone,S==null?void 0:S.assignedZone,G]);return String(de)},Pi=(S,G,ne,de)=>{const le=on([S==null?void 0:S.providerName,S==null?void 0:S.provider,S==null?void 0:S.csp,S==null?void 0:S.cspName,C.value]),Se=on([S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,b.value]),Xe=de==="image"?[S==null?void 0:S.displayName,S==null?void 0:S.imageName,S==null?void 0:S.cspImageName,S==null?void 0:S.guestOS,S==null?void 0:S.GuestOS,S==null?void 0:S.guestOs,S==null?void 0:S.osDistribution,S==null?void 0:S.OSDistribution,S==null?void 0:S.osPlatform,S==null?void 0:S.OSPlatform,S==null?void 0:S.description,S==null?void 0:S.Description]:[],rt=de==="spec"?[S==null?void 0:S.displayName,S==null?void 0:S.specName,S==null?void 0:S.cspSpecName,S==null?void 0:S.CspSpecName,S==null?void 0:S.Name,S==null?void 0:S.VMSpecName,S==null?void 0:S.description,S==null?void 0:S.Description,br(S)]:[],Qe=de==="k8sVersion"?[S==null?void 0:S.name,S==null?void 0:S.displayName,S==null?void 0:S.version,S==null?void 0:S.value]:[],Bt=yr([G,ne,S==null?void 0:S.id,S==null?void 0:S.name,S==null?void 0:S.imageId,S==null?void 0:S.specId,S==null?void 0:S.cspImageId,S==null?void 0:S.cspSpecId,S==null?void 0:S.configName,S==null?void 0:S.connectionName,S==null?void 0:S.infraId,S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.assignedRegion,...Xe,...rt,...Qe]),sn=yr(Bt.flatMap(tt=>[le&&Se?`${le}+${Se}+${tt}`:"",le&&Se?`${le}-${Se}-${tt}`:"",le&&Se?`${le} ${Se} ${tt}`:""]));return[...Bt,...sn].join(` `)},yr=S=>{const G=new Set;return S.map(ne=>ne==null?"":String(ne).trim()).filter(ne=>!ne||G.has(ne)?!1:(G.add(ne),!0))},on=(...S)=>{for(const G of S)for(const ne of G){const de=ne==null?"":String(ne).trim();if(de)return de}return""},Wi=(S,G)=>{const ne=Pt(S);for(const de of G){const le=mo(de==null?"":String(de).trim(),S);if(le&&Pt(le)!==ne)return le}return""},mo=(S,G)=>!S||!G?S:S.replace(new RegExp(`\\s*\\(${Bi(G)}\\)\\s*$`),"").replace(new RegExp(`^${Bi(G)}\\s*/\\s*`),"").trim(),Bi=S=>S.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),wr=(S,G)=>G?`${S} / ${G}`:S,br=S=>{var le;const G=on([S==null?void 0:S.vCpu,(le=S==null?void 0:S.VCpu)==null?void 0:le.Count,S==null?void 0:S.VCpu,S==null?void 0:S.num_vCPU]),ne=on([S==null?void 0:S.memoryGiB,S==null?void 0:S.mem_GiB,Cr(S==null?void 0:S.MemSizeMib)]),de=[];return G&&de.push(`${G} vCPU`),ne&&de.push(`${ne} GiB`),de.join(" / ")},Sr=(S,G)=>{if(!G)return"";if(G.includes("+"))return G;const ne=on([S==null?void 0:S.providerName,S==null?void 0:S.provider,S==null?void 0:S.csp,S==null?void 0:S.cspName,C.value]),de=on([S==null?void 0:S.regionName,S==null?void 0:S.RegionName,S==null?void 0:S.region,S==null?void 0:S.Region,S==null?void 0:S.assignedRegion,b.value]);return ne&&de?`${ne}+${de}+${G}`:G},Cr=S=>{const G=S==null?"":String(S).trim();if(!G)return"";const ne=Number(G);if(Number.isNaN(ne))return"";const de=ne/1024;return Number.isInteger(de)?String(de):de.toFixed(2)},In=()=>{!m.value||!wo(m.value)||(m.value="",gt())},_r=()=>{y.value="",m.value=""},yo=()=>{!y.value||D.value.length===0||Rn(y.value,D.value)||(y.value="",gt())},Rn=(S,G)=>{const ne=Pt(S);return G.some(de=>Pt(de.value)===ne||Pt(de.label)===ne||Pt(de.searchText).split(` `).some(le=>le.trim()===ne))},wo=S=>{const G=Pt(S);if(!G)return!1;const ne=Pt(Gt()),de=Pt(R.value),le=Pt(b.value),Se=Pt(C.value);return G===ne||G===de||G===le||G===Se},Pt=S=>(S||"").trim().toLowerCase(),$r=S=>{if(Array.isArray(S))return S;if(!S||typeof S!="object")return[];const G=["ns","namespace","namespaces","namespaceList","provider","providers","providerList","connectionconfig","connConfig","connConfigs","connectionConfig","connectionConfigs","infra","infras","infraList","regions","region","regionList","availableZones","allVerifiedZones","zones","zoneList","availableK8sVersion","availableK8sVersions","k8sVersion","k8sVersions","versions","versionList","images","image","imageList","specs","spec","specList","idList","output","resources","resource","resourceList","items","list","result"];for(const ne of G)if(Array.isArray(S[ne]))return S[ne];for(const ne of Object.values(S)){const de=$r(ne);if(de.length>0)return de}return[]},bo=S=>{const G=(S==null?void 0:S.data)??S,ne=[];Ar(G,ne);const de=new Set;return ne.map(le=>{const Se=String((le==null?void 0:le.publicIP)??(le==null?void 0:le.publicIp)??(le==null?void 0:le.privateIP)??(le==null?void 0:le.privateIp)??(le==null?void 0:le.host)??""),Xe=String((le==null?void 0:le.nodeId)??(le==null?void 0:le.id)??(le==null?void 0:le.name)??""),rt=String((le==null?void 0:le.nodeUserName)??(le==null?void 0:le.userName)??(le==null?void 0:le.sshUser)??"");return{label:`${Xe?`${Xe} / `:""}${Se}`,value:Se,meta:{sshUser:rt,nodeId:Xe}}}).filter(le=>!le.value||de.has(le.value)?!1:(de.add(le.value),!0)).sort(mi)},Ar=(S,G)=>{if(Array.isArray(S)){S.forEach(de=>Ar(de,G));return}if(!S||typeof S!="object")return;(S.publicIP||S.publicIp||S.privateIP||S.privateIp||S.host)&&G.push(S),Object.values(S).forEach(de=>Ar(de,G))},Je=S=>{var G;return((G=s.value.find(ne=>{var de;return((de=ne.paramKey)==null?void 0:de.toUpperCase())===S.toUpperCase()}))==null?void 0:G.paramValue)||""},yi=S=>s.value.some(G=>{var ne;return((ne=G.paramKey)==null?void 0:ne.trim().toUpperCase())===S.toUpperCase()}),So=()=>{Ve("INFRA_ID",O.value),($t.value||yi("K8S_CLUSTER_ID"))&&Ve("K8S_CLUSTER_ID",O.value)},ft=()=>x.value||Je("NAMESPACE")||W.projectInfo.ns_id||"",Co=()=>x.value||ft()||"system",Jn=()=>{const S=x.value||ft();if(S&&yi("OBJECT_STORAGE_NAMESPACE")&&Ve("OBJECT_STORAGE_NAMESPACE",S),!xn.value)return;C.value&&yi("OBJECT_STORAGE_PROVIDER")&&Ve("OBJECT_STORAGE_PROVIDER",C.value);const G=re.value[A.value]||b.value;G&&yi("OBJECT_STORAGE_REGION")&&Ve("OBJECT_STORAGE_REGION",G)},gt=()=>{if(!Tn.value)return;const S=x.value||ft();if(S&&Ve("NAMESPACE",S),Ve("PROVIDER",C.value),Ve("CSP",C.value),Qn()){const G=Ii(C.value);G&&(Ve(`${G}_REGION`,b.value),Ve(`${G}_CONNECTION_NAME`,R.value||Gt()),Ve(`${G}_ZONE`,B.value),Ve(`${G}_IMAGE_ID`,y.value),Ve(`${G}_SPEC_ID`,m.value),$t.value&&Ve(`${G}_K8S_VERSION`,L.value));return}Ve("REGION",b.value),Ve("CONNECTION_NAME",R.value||Gt()),Ve("ZONE",B.value),Ve("IMAGE",y.value),Ve("IMAGE_ID",y.value),Ve("SPEC",m.value),Ve("SPEC_ID",m.value),$t.value&&Ve("K8S_VERSION",L.value),Jn(),xn.value&&A.value&&yi("OBJECT_STORAGE_BUCKET")&&Ve("OBJECT_STORAGE_BUCKET",A.value)},Er=()=>{s.value=s.value.filter(S=>{var ne;const G=((ne=S.paramKey)==null?void 0:ne.trim().toUpperCase())||"";return jn.includes(G)?!1:!jn.some(de=>G.endsWith(`_${de}`))}),y.value="",m.value="",b.value="",R.value="",B.value="",L.value=""},qn=(S,G)=>{var ne;return G?((ne=S.find(de=>de.value===G))==null?void 0:ne.label)||G:""},_o=()=>{var S;return((S=C.value)==null?void 0:S.trim().toLowerCase())==="alibaba"?"cloud_essd":"default"},aa=()=>{var S,G;return((G=ki[(S=C.value)==null?void 0:S.trim().toLowerCase()])==null?void 0:G.k8sVersion)||"1.33"},$o=S=>{const G=typeof S=="string"?S:S==null?void 0:S.workflowStageName;if(!G)return;const ne=c.workflowName||"workflow",de=`${ne}-infra`,le=`${ne}-cluster`,Se=`${ne}-bucket`,Xe=typeof S=="string"?[]:(S==null?void 0:S.defaultParams)||[],rt={"infra-create":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"INFRA_ID",paramValue:de,eventListenerYn:"N"},{paramKey:"REGION",paramValue:b.value,eventListenerYn:"N"},{paramKey:"CONNECTION_NAME",paramValue:Gt(),eventListenerYn:"N"},{paramKey:"ZONE",paramValue:"",eventListenerYn:"N"},{paramKey:"IMAGE",paramValue:y.value,eventListenerYn:"N"},{paramKey:"IMAGE_ID",paramValue:y.value,eventListenerYn:"N"},{paramKey:"SPEC",paramValue:m.value,eventListenerYn:"N"},{paramKey:"SPEC_ID",paramValue:m.value,eventListenerYn:"N"},{paramKey:"SSH_USER",paramValue:"cb-user",eventListenerYn:"N"},{paramKey:"INFRA_ACCESS_INFO_MAX_ATTEMPTS",paramValue:"30",eventListenerYn:"N"},{paramKey:"INFRA_ACCESS_INFO_INTERVAL_SECONDS",paramValue:"10",eventListenerYn:"N"}],"multi-csp-vm-delete":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"INFRA_ID",paramValue:"multi-csp-vm",eventListenerYn:"N"},{paramKey:"INFRA_PREFIX",paramValue:"multi-csp-vm",eventListenerYn:"N"},{paramKey:"INFRA_ID_LIST",paramValue:"",eventListenerYn:"N"},{paramKey:"INFRA_DELETE_OPTION",paramValue:"terminate",eventListenerYn:"N"}],"k8s-cluster-create":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"PROVIDER",paramValue:C.value,eventListenerYn:"N"},{paramKey:"CSP",paramValue:C.value,eventListenerYn:"N"},{paramKey:"REGION",paramValue:b.value,eventListenerYn:"N"},{paramKey:"CONNECTION_NAME",paramValue:Gt(),eventListenerYn:"N"},{paramKey:"K8S_CLUSTER_ID",paramValue:le,eventListenerYn:"N"},{paramKey:"K8S_NODEGROUP_NAME",paramValue:"ng1",eventListenerYn:"N"},{paramKey:"IMAGE",paramValue:y.value,eventListenerYn:"N"},{paramKey:"IMAGE_ID",paramValue:y.value,eventListenerYn:"N"},{paramKey:"SPEC",paramValue:m.value,eventListenerYn:"N"},{paramKey:"SPEC_ID",paramValue:m.value,eventListenerYn:"N"},{paramKey:"K8S_VERSION",paramValue:L.value||aa(),eventListenerYn:"N"},{paramKey:"K8S_DESIRED_NODE_SIZE",paramValue:"1",eventListenerYn:"N"},{paramKey:"K8S_MIN_NODE_SIZE",paramValue:"1",eventListenerYn:"N"},{paramKey:"K8S_MAX_NODE_SIZE",paramValue:"3",eventListenerYn:"N"},{paramKey:"ROOT_DISK_TYPE",paramValue:_o(),eventListenerYn:"N"},{paramKey:"ROOT_DISK_SIZE",paramValue:"30",eventListenerYn:"N"},{paramKey:"K8S_NODEGROUP_CREATE_IF_MISSING",paramValue:"true",eventListenerYn:"N"},{paramKey:"K8S_STATUS_MAX_ATTEMPTS",paramValue:"60",eventListenerYn:"N"},{paramKey:"K8S_STATUS_INTERVAL_SECONDS",paramValue:"60",eventListenerYn:"N"},{paramKey:"K8S_READY_STATUS",paramValue:"Active,Running",eventListenerYn:"N"}],"k8s-kubeconfig-get":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"K8S_CLUSTER_ID",paramValue:Je("K8S_CLUSTER_ID")||le,eventListenerYn:"N"},{paramKey:"K8S_KUBECONFIG_MAX_ATTEMPTS",paramValue:"30",eventListenerYn:"N"},{paramKey:"K8S_KUBECONFIG_INTERVAL_SECONDS",paramValue:"10",eventListenerYn:"N"},{paramKey:"KUBECONFIG_CONTENT",paramValue:"",eventListenerYn:"N"}],"app-deploy-helm":[{paramKey:"KUBECONFIG_CONTENT",paramValue:"",eventListenerYn:"N"},{paramKey:"KUBE_NAMESPACE",paramValue:"default",eventListenerYn:"N"},{paramKey:"RELEASE_NAME",paramValue:"mariadb",eventListenerYn:"N"},{paramKey:"HELM_REPO_NAME",paramValue:"groundhog2k",eventListenerYn:"N"},{paramKey:"HELM_REPO_URL",paramValue:"https://groundhog2k.github.io/helm-charts",eventListenerYn:"N"},{paramKey:"HELM_CHART",paramValue:"groundhog2k/mariadb",eventListenerYn:"N"},{paramKey:"HELM_CHART_VERSION",paramValue:"4.5.0",eventListenerYn:"N"},{paramKey:"HELM_RECREATE_ON_IMMUTABLE_ERROR",paramValue:"true",eventListenerYn:"N"},{paramKey:"K8S_API_READY_MAX_ATTEMPTS",paramValue:"360",eventListenerYn:"N"},{paramKey:"K8S_API_READY_INTERVAL_SECONDS",paramValue:"10",eventListenerYn:"N"},{paramKey:"K8S_NODE_READY_MIN_COUNT",paramValue:"1",eventListenerYn:"N"},{paramKey:"HELM_VALUES_ARGS",paramValue:"--set settings.rootPassword.value=mariadb_pass --set userDatabase.name.value=testdb --set userDatabase.user.value=mariadb_user --set userDatabase.password.value=mariadb_pass --wait --timeout 10m",eventListenerYn:"N"},{paramKey:"DB_EXEC_MODE",paramValue:"k8s",eventListenerYn:"N"},{paramKey:"DB_POD_SELECTOR",paramValue:"app.kubernetes.io/instance=mariadb,app.kubernetes.io/name=mariadb",eventListenerYn:"N"}],"app-deploy-manifest":[{paramKey:"KUBECONFIG_CONTENT",paramValue:"",eventListenerYn:"N"},{paramKey:"KUBE_NAMESPACE",paramValue:"default",eventListenerYn:"N"},{paramKey:"K8S_MANIFEST",paramValue:"",eventListenerYn:"N"}],"app-deploy-status-check":[{paramKey:"KUBECONFIG_CONTENT",paramValue:"",eventListenerYn:"N"},{paramKey:"KUBE_NAMESPACE",paramValue:"default",eventListenerYn:"N"},{paramKey:"DEPLOYMENT_NAME",paramValue:"",eventListenerYn:"N"},{paramKey:"ROLLOUT_TIMEOUT",paramValue:"300s",eventListenerYn:"N"}],"mariadb-install":[{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"INFRA_ID",paramValue:de,eventListenerYn:"N"},{paramKey:"DB_EXEC_MODE",paramValue:"ssh",eventListenerYn:"N"},{paramKey:"DB_HOST",paramValue:"",eventListenerYn:"N"},{paramKey:"DB_PORT",paramValue:"3306",eventListenerYn:"N"},{paramKey:"DB_NAME",paramValue:"testdb",eventListenerYn:"N"},{paramKey:"DB_USER",paramValue:"mariadb_user",eventListenerYn:"N"},{paramKey:"DB_PASSWORD",paramValue:"mariadb_pass",eventListenerYn:"N"},{paramKey:"SSH_HOST",paramValue:"",eventListenerYn:"N"},{paramKey:"SSH_USER",paramValue:"cb-user",eventListenerYn:"N"},{paramKey:"SSH_KEY_FILE",paramValue:"",eventListenerYn:"N"}],"db-backup-import":[{paramKey:"DB_EXEC_MODE",paramValue:"auto",eventListenerYn:"N"},{paramKey:"DB_HOST",paramValue:"",eventListenerYn:"N"},{paramKey:"DB_PORT",paramValue:"3306",eventListenerYn:"N"},{paramKey:"DB_NAME",paramValue:"testdb",eventListenerYn:"N"},{paramKey:"DB_USER",paramValue:"mariadb_user",eventListenerYn:"N"},{paramKey:"DB_PASSWORD",paramValue:"mariadb_pass",eventListenerYn:"N"},{paramKey:"DB_BACKUP_FILE",paramValue:"schema.sql",eventListenerYn:"N"},{paramKey:"SCHEMA_SQL_CONTENT",paramValue:qc,eventListenerYn:"N"},{paramKey:"KUBE_NAMESPACE",paramValue:"default",eventListenerYn:"N"},{paramKey:"RELEASE_NAME",paramValue:"mariadb",eventListenerYn:"N"},{paramKey:"DB_POD_SELECTOR",paramValue:"app.kubernetes.io/instance=mariadb,app.kubernetes.io/name=mariadb",eventListenerYn:"N"}],"db-schema-import":[{paramKey:"DB_EXEC_MODE",paramValue:"auto",eventListenerYn:"N"},{paramKey:"DB_HOST",paramValue:"",eventListenerYn:"N"},{paramKey:"DB_PORT",paramValue:"3306",eventListenerYn:"N"},{paramKey:"DB_NAME",paramValue:"testdb",eventListenerYn:"N"},{paramKey:"DB_USER",paramValue:"mariadb_user",eventListenerYn:"N"},{paramKey:"DB_PASSWORD",paramValue:"mariadb_pass",eventListenerYn:"N"},{paramKey:"SCHEMA_SQL_FILE",paramValue:"schema.sql",eventListenerYn:"N"},{paramKey:"SCHEMA_SQL_CONTENT",paramValue:qc,eventListenerYn:"N"},{paramKey:"KUBE_NAMESPACE",paramValue:"default",eventListenerYn:"N"},{paramKey:"RELEASE_NAME",paramValue:"mariadb",eventListenerYn:"N"},{paramKey:"DB_POD_SELECTOR",paramValue:"app.kubernetes.io/instance=mariadb,app.kubernetes.io/name=mariadb",eventListenerYn:"N"}],"db-data-insert":[{paramKey:"DB_EXEC_MODE",paramValue:"auto",eventListenerYn:"N"},{paramKey:"DB_HOST",paramValue:"",eventListenerYn:"N"},{paramKey:"DB_PORT",paramValue:"3306",eventListenerYn:"N"},{paramKey:"DB_NAME",paramValue:"testdb",eventListenerYn:"N"},{paramKey:"DB_USER",paramValue:"mariadb_user",eventListenerYn:"N"},{paramKey:"DB_PASSWORD",paramValue:"mariadb_pass",eventListenerYn:"N"},{paramKey:"INSERT_SQL",paramValue:g0,eventListenerYn:"N"},{paramKey:"KUBE_NAMESPACE",paramValue:"default",eventListenerYn:"N"},{paramKey:"RELEASE_NAME",paramValue:"mariadb",eventListenerYn:"N"},{paramKey:"DB_POD_SELECTOR",paramValue:"app.kubernetes.io/instance=mariadb,app.kubernetes.io/name=mariadb",eventListenerYn:"N"}],"object-storage-ensure":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_BUCKET",paramValue:Se,eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_NAMESPACE",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_PROVIDER",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_REGION",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_READY_MAX_ATTEMPTS",paramValue:"30",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_READY_INTERVAL_SECONDS",paramValue:"5",eventListenerYn:"N"}],"object-storage-delete":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_DELETE_ENABLED",paramValue:"true",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_BUCKET",paramValue:Se,eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_NAMESPACE",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_PROVIDER",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_REGION",paramValue:"",eventListenerYn:"N"}],"jupyter-inbound-rule-add":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"INFRA_ID",paramValue:de,eventListenerYn:"N"},{paramKey:"JUPYTER_BIND_HOST",paramValue:"0.0.0.0",eventListenerYn:"N"},{paramKey:"JUPYTER_PORT",paramValue:"8888",eventListenerYn:"N"},{paramKey:"JUPYTER_ALLOWED_CIDR",paramValue:"0.0.0.0/0",eventListenerYn:"N"}],"jupyter-inbound-rule-remove":[{paramKey:"TUMBLEBUG",paramValue:"http://mc-infra-manager:1323",eventListenerYn:"N"},{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"INFRA_ID",paramValue:de,eventListenerYn:"N"},{paramKey:"JUPYTER_PORT",paramValue:"",eventListenerYn:"N"},{paramKey:"JUPYTER_ALLOWED_CIDR",paramValue:"",eventListenerYn:"N"}],"jupyter-object-storage-analysis-remove":[{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"INFRA_ID",paramValue:de,eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_NAMESPACE",paramValue:"",eventListenerYn:"N"}],"jupyter-object-storage-analysis-install":[{paramKey:"USER",paramValue:"default",eventListenerYn:"N"},{paramKey:"USERPASS",paramValue:"default",eventListenerYn:"N"},{paramKey:"NAMESPACE",paramValue:ft(),eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_PROVIDER",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_BUCKET",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_NAMESPACE",paramValue:"",eventListenerYn:"N"},{paramKey:"OBJECT_STORAGE_REGION",paramValue:"",eventListenerYn:"N"},{paramKey:"PRESIGNED_URL_EXPIRES",paramValue:"600",eventListenerYn:"N"},{paramKey:"SSH_HOST",paramValue:"",eventListenerYn:"N"},{paramKey:"SSH_USER",paramValue:"cb-user",eventListenerYn:"N"},{paramKey:"SSH_KEY_FILE",paramValue:"",eventListenerYn:"N"},{paramKey:"DATA_PREFIX",paramValue:"",eventListenerYn:"N"},{paramKey:"RESULT_PREFIX",paramValue:"results",eventListenerYn:"N"},{paramKey:"WRITE_RESULT_ENABLED",paramValue:"true",eventListenerYn:"N"},{paramKey:"JUPYTER_IMAGE",paramValue:"quay.io/jupyter/scipy-notebook:2025-03-14",eventListenerYn:"N"},{paramKey:"DUCKDB_VERSION",paramValue:"1.3.2",eventListenerYn:"N"},{paramKey:"JUPYTER_BIND_HOST",paramValue:"0.0.0.0",eventListenerYn:"N"},{paramKey:"JUPYTER_PORT",paramValue:"8888",eventListenerYn:"N"}]},Qe=(sn,tt)=>{const jt=Je(sn);switch(sn.trim().toUpperCase()){case"NAMESPACE":return ft()||tt;case"PROVIDER":case"CSP":return C.value||tt;case"REGION":return b.value||tt;case"CONNECTION_NAME":return jt||R.value||Gt()||tt;case"ZONE":return B.value||jt||tt;case"IMAGE":case"IMAGE_ID":return y.value||tt;case"SPEC":case"SPEC_ID":return m.value||tt;case"K8S_VERSION":return L.value||jt||tt;case"ROOT_DISK_TYPE":return(G||"").trim().toLowerCase()==="k8s-cluster-create"?_o():jt||tt;case"INFRA_ID":return jt||tt||de;case"K8S_CLUSTER_ID":return jt||tt||le;case"SSH_HOST":case"DB_HOST":return k.value||jt||tt;default:return tt}};(Xe.length>0?Xe:rt[G]||[]).forEach(sn=>{var jt;const tt=(jt=sn.paramKey)==null?void 0:jt.trim().toUpperCase();tt&&Ve(tt,Qe(tt,sn.paramValue||""),sn.eventListenerYn,!1)})};Vn(()=>a.value.map(S=>S.workflowStageName).filter(Boolean).join("|"),()=>{a.value.filter(S=>!!S.workflowStageName).forEach(S=>$o(S))}),Vn(xn,async S=>{S&&(Jn(),await vi())});const Ve=(S,G,ne="N",de=!0)=>{if(!S)return;const le=S.trim().toUpperCase(),Se=s.value.find(Xe=>{var rt;return((rt=Xe.paramKey)==null?void 0:rt.trim().toUpperCase())===le});if(Se){(de||!Se.paramValue)&&(Se.paramValue=G),Se.eventListenerYn=Se.eventListenerYn||ne;return}s.value.push({paramIdx:0,paramKey:le,paramValue:G,eventListenerYn:ne})},Be=we(!1),ze=we(""),Lr=S=>(S||"").trim(),la=()=>{const S=Lr(c.workflowName);Be.value=!!(S&&S===ze.value)},ua=async S=>{const G=Lr(S);if(!G){I.error("Please enter Workflow Name.");return}const{data:ne}=await vy(G);ne?(I.error("Name is already in use."),Be.value=!1):(I.success("Name is available."),Be.value=!0,ze.value=G)},Ao=we([]),ca={deploy:"For Deployment",run:"For Execution",test:"For Testing",webhook:"For Webhook"},Eo=S=>ca[S||""]||S||"",Lo=()=>{Ao.value=[{name:"For Deployment",value:"For Deployment"},{name:"For Execution",value:"For Execution"},{name:"For Testing",value:"For Testing"},{name:"For Webhook",value:"For Webhook"}]},Mo=we(""),vt=async()=>{try{const{data:S}=await iy("JENKINS");S&&c&&($.value==="new"?(c.ossIdx=S?S[0].ossIdx:"No OSS information",Mo.value=S?S[0].ossUrl:"NULL"):S.forEach(G=>{G.ossIdx===c.ossIdx&&(Mo.value=G.ossUrl)}))}catch(S){console.log(S)}},Mr=async()=>{if(!c.workflowName){I.error("Please enter Workflow Name.");return}if(!Be.value||ze.value!==Lr(c.workflowName)){I.error("Please perform duplicate check for the name.");return}if(!c.workflowPurpose){I.error("Please select Purpose.");return}if(!a.value||a.value.length===0){I.error("Please create Pipeline script.");return}xr()&&($.value==="new"?await Nn():await xo())},Nn=async()=>{const S={workflowInfo:{...c},workflowParams:[...s.value],workflowStageMappings:[...a.value]},{data:G}=await my(S);G?(I.success("Registered successfully."),v.push("/web/workflows/workflow/list")):I.error("Failed to register.")},xo=async()=>{const S={workflowInfo:{...c},workflowParams:[...s.value],workflowStageMappings:[...a.value]},{data:G}=await yy(S);G?(I.success("Updated successfully."),v.push("/web/workflows/workflow/list")):I.error("Failed to update.")},xr=()=>(Wt(),Io()?(ko(),$.value=="new"&&To(),!0):!1),Wt=()=>{let S="";a.value.forEach(G=>{S+=G.stageContent,G.isDefaultScript||(S+=` -`)}),c={...c,workflowPurpose:Eo(c.workflowPurpose),script:S}},To=()=>{delete c.workflowIdx},ko=()=>{s.value.forEach(S=>{delete S.paramIdx})},Io=()=>{var ne;const S=new Set,G=[];for(const de of s.value){const le=(ne=de.paramKey)==null?void 0:ne.trim();if(!le)continue;const Se=le.toUpperCase();if(S.has(Se))return I.error(`Duplicate parameter key: ${Se}`),!1;S.add(Se),G.push({...de,paramKey:Se,paramValue:de.paramValue??"",eventListenerYn:de.eventListenerYn||"N"})}return s.value=G,!0},Ro=()=>{v.push("/web/workflows/workflow/list")},No=()=>{v.push("/web/workflows/workflow/list")},Tr=()=>{a.value=[]},Tt=async()=>{if(c.workflowName===""){I.error("Please enter workflow name.");return}else if(!c.workflowPurpose){I.error("Please select purpose.");return}await kt(c.workflowName)},ha=["DEFAULT_START","DEFAULT_END"],kt=async S=>{try{Tr();const{data:G}=await wy(S),ne=G||[];ne.forEach((de,le)=>{de.isDefaultScript=!0,de.defaultScriptTag=ha[le]}),a.value=[...ne]}catch(G){a.value=[],I.error(String(G))}},fa=S=>{a.value.splice(a.value.length-1,0,S),$o(S)};return(S,G)=>(Te(),Ie("div",null,[se("div",bb,[se("div",Sb,[se("div",Cb,[se("h2",_b,qe($.value==="new"?"New":"Detail")+" Workflow",1)])])]),se("div",$b,[pt(c)&&s.value&&a.value?(Te(),Ie("div",Ab,[se("div",Eb,[se("div",Lb,[G[16]||(G[16]=se("label",{class:"form-label required"}," Workflow Name ",-1)),se("div",Mb,[ms(se("input",{type:"text",ref:"workflowName",class:"form-control p-2 g-col-11",placeholder:"Enter the workflow name","onUpdate:modelValue":G[0]||(G[0]=ne=>pt(c).workflowName=ne),onInput:la},null,544),[[Jm,pt(c).workflowName]]),Be.value?(Te(),Ie("button",xb,"Duplicate Check")):(Te(),Ie("button",{key:0,class:"btn btn-primary chk",onClick:G[1]||(G[1]=ne=>ua(pt(c).workflowName)),style:{margin:"3px",width:"150px"}},"Duplicate Check"))])]),se("div",Tb,[G[18]||(G[18]=se("label",{class:"form-label required"},"Purpose",-1)),se("div",kb,[ms(se("select",{ref:"workflowPurpose","onUpdate:modelValue":G[2]||(G[2]=ne=>pt(c).workflowPurpose=ne),class:"form-select p-2 g-col-12"},[G[17]||(G[17]=se("option",{value:""},"Select Workflow Purpose.",-1)),(Te(!0),Ie(Cn,null,ci(Ao.value,(ne,de)=>(Te(),Ie("option",{value:ne.value,key:de},qe(ne.name),9,Ib))),128))],512),[[qm,pt(c).workflowPurpose]])])]),lo.value?(Te(),Ie("div",Rb,[se("div",Nb,[G[19]||(G[19]=se("label",{class:"form-label mb-0"},"Tumblebug Parameter Selection",-1)),se("label",Db,[ms(se("input",{class:"form-check-input",type:"checkbox","onUpdate:modelValue":G[3]||(G[3]=ne=>Tn.value=ne)},null,512),[[Oc,Tn.value]]),se("span",Ob,qe(Tn.value?"Enabled":"Disabled"),1)])])])):pn("",!0),Hs.value?(Te(),Ie("div",Fb,[se("div",Pb,[se("div",Wb,[se("label",Bb,[se("code",null,qe(xt("NAMESPACE")),1),G[20]||(G[20]=se("span",null,"Namespace",-1))]),ht(bn,{modelValue:x.value,"onUpdate:modelValue":G[4]||(G[4]=ne=>x.value=ne),options:g.value,placeholder:"Namespace",title:qn(g.value,x.value),"allow-custom":"",onChange:pr},null,8,["modelValue","options","title"])]),se("div",Hb,[se("label",zb,[se("code",null,qe(xt(["PROVIDER","CSP"])),1),G[21]||(G[21]=se("span",null,"CSP",-1))]),ht(bn,{modelValue:C.value,"onUpdate:modelValue":G[5]||(G[5]=ne=>C.value=ne),options:d.value,placeholder:"CSP",onChange:js},null,8,["modelValue","options"])]),se("div",Vb,[se("label",Ub,[se("code",null,qe(xt("REGION")),1),G[22]||(G[22]=se("span",null,"Region",-1))]),ht(bn,{modelValue:b.value,"onUpdate:modelValue":G[6]||(G[6]=ne=>b.value=ne),options:_.value,placeholder:"Region",onChange:gr},null,8,["modelValue","options"])])]),se("div",Kb,[se("div",Gb,[se("label",Yb,[se("code",null,qe(Gs()),1),G[23]||(G[23]=se("span",null,"VM/K8s Spec",-1))]),ht(bn,{modelValue:m.value,"onUpdate:modelValue":G[7]||(G[7]=ne=>m.value=ne),options:P.value,placeholder:"VM/K8s Spec",title:qn(P.value,m.value),onChange:gr},null,8,["modelValue","options","title"])]),se("div",jb,[se("label",Xb,[se("code",null,qe(Ks()),1),se("span",Zb,[G[25]||(G[25]=se("span",null,"Image",-1)),se("span",Qb,[ms(se("input",{class:"form-check-input",type:"checkbox","onUpdate:modelValue":G[8]||(G[8]=ne=>Mt.value=ne),onChange:qs},null,544),[[Oc,Mt.value]]),G[24]||(G[24]=se("span",{class:"form-check-label"},"K8s",-1))])])]),ht(bn,{modelValue:y.value,"onUpdate:modelValue":G[9]||(G[9]=ne=>y.value=ne),options:D.value,placeholder:m.value?Mt.value?"K8s Image":"Image":"Select Spec first",title:qn(D.value,y.value),onChange:gr},null,8,["modelValue","options","placeholder","title"])])]),se("div",Jb,[se("div",qb,[se("label",e0,[se("code",null,qe(xt("INFRA_ID")),1),G[26]||(G[26]=se("span",null,"Existing Infra",-1))]),ht(bn,{modelValue:O.value,"onUpdate:modelValue":G[10]||(G[10]=ne=>O.value=ne),options:H.value,placeholder:"Infra ID",title:qn(H.value,O.value),"allow-custom":"",onChange:ho},null,8,["modelValue","options","title"])]),se("div",t0,[se("label",n0,[se("code",null,qe(xt(["SSH_HOST","DB_HOST"])),1),G[27]||(G[27]=se("span",null,"SSH/DB Host",-1))]),ht(bn,{modelValue:k.value,"onUpdate:modelValue":G[11]||(G[11]=ne=>k.value=ne),options:U.value,placeholder:"SSH/DB Host",onChange:Xs},null,8,["modelValue","options"])]),se("div",{class:"tumblebug-param-field g-col-2"},[G[28]||(G[28]=se("label",{class:"tumblebug-param-label tumblebug-param-action-label"},[se("span",null,"Reload")],-1)),se("button",{class:"btn btn-outline-primary w-100",onClick:ea}," Refresh ")])]),se("div",i0,[se("div",{class:Ms(["tumblebug-param-field",$t.value?"g-col-4":"g-col-6"])},[se("label",r0,[se("code",null,qe(xt("CONNECTION_NAME")),1),G[29]||(G[29]=se("span",null,"Connection Config",-1))]),ht(bn,{modelValue:R.value,"onUpdate:modelValue":G[12]||(G[12]=ne=>R.value=ne),options:Y.value,placeholder:"Connection Config",onChange:Zs},null,8,["modelValue","options"])],2),se("div",{class:Ms(["tumblebug-param-field",$t.value?"g-col-4":"g-col-6"])},[se("label",o0,[se("code",null,qe(xt("ZONE")),1),G[30]||(G[30]=se("span",null,"Zone",-1))]),ht(bn,{modelValue:B.value,"onUpdate:modelValue":G[13]||(G[13]=ne=>B.value=ne),options:di.value,placeholder:hr.value,onChange:fo},null,8,["modelValue","options","placeholder"])],2),$t.value?(Te(),Ie("div",s0,[se("label",a0,[se("code",null,qe(xt("K8S_VERSION")),1),G[31]||(G[31]=se("span",null,"K8s Version",-1))]),ht(bn,{modelValue:L.value,"onUpdate:modelValue":G[14]||(G[14]=ne=>L.value=ne),options:X.value,placeholder:"K8s Version",title:qn(X.value,L.value),onChange:Qs},null,8,["modelValue","options","title"])])):pn("",!0)]),xn.value?(Te(),Ie("div",l0,[se("div",u0,[se("label",c0,[se("code",null,qe(xt("OBJECT_STORAGE_BUCKET")),1),G[32]||(G[32]=se("span",null,"Bucket Name",-1))]),ht(bn,{modelValue:A.value,"onUpdate:modelValue":G[15]||(G[15]=ne=>A.value=ne),options:Z.value,placeholder:"Bucket Name",title:qn(Z.value,A.value),"allow-custom":"",onChange:Js},null,8,["modelValue","options","title"]),A.value?(Te(),Ie("small",h0,[J.value[A.value]?(Te(),Ie(Cn,{key:0},[Fc(" CSP bucket: "+qe(J.value[A.value]),1)],64)):(Te(),Ie(Cn,{key:1},[Fc(" Not registered yet. The run creates it and resolves the CSP bucket name. ")],64))])):pn("",!0)])])):pn("",!0)])):pn("",!0),ht(Zw,{mode:$.value,"workflow-stage-mappings-form-data":a.value,onInitWorkflowStageMappings:Tr,onOnClickCreateScript:Tt,onSpliceWorkflowStageMappingsFormData:fa},null,8,["mode","workflow-stage-mappings-form-data"]),ht(gy,{popup:!1,"workflow-param-data":s.value,"event-listener-yn":"N"},null,8,["workflow-param-data"]),ht(wb,{"workflow-idx":pt(c).workflowIdx,"workflow-name":pt(c).workflowName},null,8,["workflow-idx","workflow-name"]),se("div",f0,[G[33]||(G[33]=se("div",{id:"gap",class:"col"},null,-1)),se("div",d0,[se("div",p0,[se("button",{class:"btn btn-primary",onClick:Mr},qe($.value==="new"?"Regist":"Edit"),1),se("button",{class:"btn btn-secondary",onClick:No}," Go Back "),se("button",{class:"btn btn-right border",onClick:Ro}," To List ")])])])])])):pn("",!0)],512)]))}}),C0=ro(v0,[["__scopeId","data-v-7b222cc6"]]);export{C0 as default}; +`)}),c={...c,workflowPurpose:Eo(c.workflowPurpose),script:S}},To=()=>{delete c.workflowIdx},ko=()=>{s.value.forEach(S=>{delete S.paramIdx})},Io=()=>{var ne;const S=new Set,G=[];for(const de of s.value){const le=(ne=de.paramKey)==null?void 0:ne.trim();if(!le)continue;const Se=le.toUpperCase();if(S.has(Se))return I.error(`Duplicate parameter key: ${Se}`),!1;S.add(Se),G.push({...de,paramKey:Se,paramValue:de.paramValue??"",eventListenerYn:de.eventListenerYn||"N"})}return s.value=G,!0},Ro=()=>{v.push("/web/workflows/workflow/list")},No=()=>{v.push("/web/workflows/workflow/list")},Tr=()=>{a.value=[]},Tt=async()=>{if(c.workflowName===""){I.error("Please enter workflow name.");return}else if(!c.workflowPurpose){I.error("Please select purpose.");return}await kt(c.workflowName)},ha=["DEFAULT_START","DEFAULT_END"],kt=async S=>{try{Tr();const{data:G}=await wy(S),ne=G||[];ne.forEach((de,le)=>{de.isDefaultScript=!0,de.defaultScriptTag=ha[le]}),a.value=[...ne]}catch(G){a.value=[],I.error(String(G))}},fa=S=>{a.value.splice(a.value.length-1,0,S),$o(S)};return(S,G)=>(Te(),Ie("div",null,[se("div",bb,[se("div",Sb,[se("div",Cb,[se("h2",_b,qe($.value==="new"?"New":"Detail")+" Workflow",1)])])]),se("div",$b,[pt(c)&&s.value&&a.value?(Te(),Ie("div",Ab,[se("div",Eb,[se("div",Lb,[G[16]||(G[16]=se("label",{class:"form-label required"}," Workflow Name ",-1)),se("div",Mb,[ms(se("input",{type:"text",ref:"workflowName",class:"form-control p-2 g-col-11",placeholder:"Enter the workflow name","onUpdate:modelValue":G[0]||(G[0]=ne=>pt(c).workflowName=ne),onInput:la},null,544),[[Jm,pt(c).workflowName]]),Be.value?(Te(),Ie("button",xb,"Duplicate Check")):(Te(),Ie("button",{key:0,class:"btn btn-primary chk",onClick:G[1]||(G[1]=ne=>ua(pt(c).workflowName)),style:{margin:"3px",width:"150px"}},"Duplicate Check"))])]),se("div",Tb,[G[18]||(G[18]=se("label",{class:"form-label required"},"Purpose",-1)),se("div",kb,[ms(se("select",{ref:"workflowPurpose","onUpdate:modelValue":G[2]||(G[2]=ne=>pt(c).workflowPurpose=ne),class:"form-select p-2 g-col-12"},[G[17]||(G[17]=se("option",{value:""},"Select Workflow Purpose.",-1)),(Te(!0),Ie(Cn,null,ci(Ao.value,(ne,de)=>(Te(),Ie("option",{value:ne.value,key:de},qe(ne.name),9,Ib))),128))],512),[[qm,pt(c).workflowPurpose]])])]),lo.value?(Te(),Ie("div",Rb,[se("div",Nb,[G[19]||(G[19]=se("label",{class:"form-label mb-0"},"Tumblebug Parameter Selection",-1)),se("label",Db,[ms(se("input",{class:"form-check-input",type:"checkbox","onUpdate:modelValue":G[3]||(G[3]=ne=>Tn.value=ne)},null,512),[[Oc,Tn.value]]),se("span",Ob,qe(Tn.value?"Enabled":"Disabled"),1)])])])):pn("",!0),Hs.value?(Te(),Ie("div",Fb,[se("div",Pb,[se("div",Wb,[se("label",Bb,[se("code",null,qe(xt("NAMESPACE")),1),G[20]||(G[20]=se("span",null,"Namespace",-1))]),ht(bn,{modelValue:x.value,"onUpdate:modelValue":G[4]||(G[4]=ne=>x.value=ne),options:g.value,placeholder:"Namespace",title:qn(g.value,x.value),"allow-custom":"",onChange:pr},null,8,["modelValue","options","title"])]),se("div",Hb,[se("label",zb,[se("code",null,qe(xt(["PROVIDER","CSP"])),1),G[21]||(G[21]=se("span",null,"CSP",-1))]),ht(bn,{modelValue:C.value,"onUpdate:modelValue":G[5]||(G[5]=ne=>C.value=ne),options:d.value,placeholder:"CSP",onChange:js},null,8,["modelValue","options"])]),se("div",Vb,[se("label",Ub,[se("code",null,qe(xt("REGION")),1),G[22]||(G[22]=se("span",null,"Region",-1))]),ht(bn,{modelValue:b.value,"onUpdate:modelValue":G[6]||(G[6]=ne=>b.value=ne),options:_.value,placeholder:"Region",onChange:gr},null,8,["modelValue","options"])])]),se("div",Kb,[se("div",Gb,[se("label",Yb,[se("code",null,qe(Gs()),1),G[23]||(G[23]=se("span",null,"VM/K8s Spec",-1))]),ht(bn,{modelValue:m.value,"onUpdate:modelValue":G[7]||(G[7]=ne=>m.value=ne),options:P.value,placeholder:"VM/K8s Spec",title:qn(P.value,m.value),onChange:gr},null,8,["modelValue","options","title"])]),se("div",jb,[se("label",Xb,[se("code",null,qe(Ks()),1),se("span",Zb,[G[25]||(G[25]=se("span",null,"Image",-1)),se("span",Qb,[ms(se("input",{class:"form-check-input",type:"checkbox","onUpdate:modelValue":G[8]||(G[8]=ne=>Mt.value=ne),onChange:qs},null,544),[[Oc,Mt.value]]),G[24]||(G[24]=se("span",{class:"form-check-label"},"K8s",-1))])])]),ht(bn,{modelValue:y.value,"onUpdate:modelValue":G[9]||(G[9]=ne=>y.value=ne),options:D.value,placeholder:m.value?Mt.value?"K8s Image":"Image":"Select Spec first",title:qn(D.value,y.value),onChange:gr},null,8,["modelValue","options","placeholder","title"])])]),se("div",Jb,[se("div",qb,[se("label",e0,[se("code",null,qe(xt("INFRA_ID")),1),G[26]||(G[26]=se("span",null,"Existing Infra",-1))]),ht(bn,{modelValue:O.value,"onUpdate:modelValue":G[10]||(G[10]=ne=>O.value=ne),options:H.value,placeholder:"Infra ID",title:qn(H.value,O.value),"allow-custom":"",onChange:ho},null,8,["modelValue","options","title"])]),se("div",t0,[se("label",n0,[se("code",null,qe(xt(["SSH_HOST","DB_HOST"])),1),G[27]||(G[27]=se("span",null,"SSH/DB Host",-1))]),ht(bn,{modelValue:k.value,"onUpdate:modelValue":G[11]||(G[11]=ne=>k.value=ne),options:U.value,placeholder:"SSH/DB Host",onChange:Xs},null,8,["modelValue","options"])]),se("div",{class:"tumblebug-param-field g-col-2"},[G[28]||(G[28]=se("label",{class:"tumblebug-param-label tumblebug-param-action-label"},[se("span",null,"Reload")],-1)),se("button",{class:"btn btn-outline-primary w-100",onClick:ea}," Refresh ")])]),se("div",i0,[se("div",{class:Ms(["tumblebug-param-field",$t.value?"g-col-4":"g-col-6"])},[se("label",r0,[se("code",null,qe(xt("CONNECTION_NAME")),1),G[29]||(G[29]=se("span",null,"Connection Config",-1))]),ht(bn,{modelValue:R.value,"onUpdate:modelValue":G[12]||(G[12]=ne=>R.value=ne),options:Y.value,placeholder:"Connection Config",onChange:Zs},null,8,["modelValue","options"])],2),se("div",{class:Ms(["tumblebug-param-field",$t.value?"g-col-4":"g-col-6"])},[se("label",o0,[se("code",null,qe(xt("ZONE")),1),G[30]||(G[30]=se("span",null,"Zone",-1))]),ht(bn,{modelValue:B.value,"onUpdate:modelValue":G[13]||(G[13]=ne=>B.value=ne),options:di.value,placeholder:hr.value,onChange:fo},null,8,["modelValue","options","placeholder"])],2),$t.value?(Te(),Ie("div",s0,[se("label",a0,[se("code",null,qe(xt("K8S_VERSION")),1),G[31]||(G[31]=se("span",null,"K8s Version",-1))]),ht(bn,{modelValue:L.value,"onUpdate:modelValue":G[14]||(G[14]=ne=>L.value=ne),options:X.value,placeholder:"K8s Version",title:qn(X.value,L.value),onChange:Qs},null,8,["modelValue","options","title"])])):pn("",!0)]),xn.value?(Te(),Ie("div",l0,[se("div",u0,[se("label",c0,[se("code",null,qe(xt("OBJECT_STORAGE_BUCKET")),1),G[32]||(G[32]=se("span",null,"Bucket Name",-1))]),ht(bn,{modelValue:A.value,"onUpdate:modelValue":G[15]||(G[15]=ne=>A.value=ne),options:Z.value,placeholder:"Bucket Name",title:qn(Z.value,A.value),"allow-custom":"",onChange:Js},null,8,["modelValue","options","title"]),A.value?(Te(),Ie("small",h0,[J.value[A.value]?(Te(),Ie(Cn,{key:0},[Fc(" CSP bucket: "+qe(J.value[A.value]),1)],64)):(Te(),Ie(Cn,{key:1},[Fc(" Not registered yet. The run creates it and resolves the CSP bucket name. ")],64))])):pn("",!0)])])):pn("",!0)])):pn("",!0),ht(Zw,{mode:$.value,"workflow-stage-mappings-form-data":a.value,onInitWorkflowStageMappings:Tr,onOnClickCreateScript:Tt,onSpliceWorkflowStageMappingsFormData:fa},null,8,["mode","workflow-stage-mappings-form-data"]),ht(gy,{popup:!1,"workflow-param-data":s.value,"event-listener-yn":"N"},null,8,["workflow-param-data"]),ht(wb,{"workflow-idx":pt(c).workflowIdx,"workflow-name":pt(c).workflowName},null,8,["workflow-idx","workflow-name"]),se("div",f0,[G[33]||(G[33]=se("div",{id:"gap",class:"col"},null,-1)),se("div",d0,[se("div",p0,[se("button",{class:"btn btn-primary",onClick:Mr},qe($.value==="new"?"Regist":"Edit"),1),se("button",{class:"btn btn-secondary",onClick:No}," Go Back "),se("button",{class:"btn btn-right border",onClick:Ro}," To List ")])])])])])):pn("",!0)],512)]))}}),C0=ro(v0,[["__scopeId","data-v-632682e2"]]);export{C0 as default}; diff --git a/src/main/resources/static/assets/WorkflowForm-DRmOmizc.css b/src/main/resources/static/assets/WorkflowForm-g9RENjB2.css similarity index 88% rename from src/main/resources/static/assets/WorkflowForm-DRmOmizc.css rename to src/main/resources/static/assets/WorkflowForm-g9RENjB2.css index a9eeb69..2eb7f78 100644 --- a/src/main/resources/static/assets/WorkflowForm-DRmOmizc.css +++ b/src/main/resources/static/assets/WorkflowForm-g9RENjB2.css @@ -1 +1 @@ -.hr[data-v-3dfd077a]{border-bottom:2px solid #ccc}.space-between[data-v-3dfd077a]{display:flex!important;justify-content:space-between!important}.palette[data-v-3dfd077a]{background-color:#ff0}.paletteItem[data-v-3dfd077a]{font-size:15px;cursor:pointer}.pipelineContour[data-v-3dfd077a]{border-top:2px dashed black}.paletteTitle[data-v-3dfd077a]{font-size:15px;font-weight:700}.w-90[data-v-3dfd077a]{width:95%}.btn-align[data-v-3dfd077a]{display:flex;align-items:flex-end}.hr[data-v-9bafe92a]{border-bottom:2px solid #ccc}.space-between[data-v-9bafe92a]{display:flex!important;justify-content:space-between!important}.palette[data-v-9bafe92a]{background-color:#ff0}.card[data-v-9bafe92a]{border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 1px 3px #0000001a}.accordion-item[data-v-9bafe92a]{border:none;border-bottom:1px solid #e5e7eb}.accordion-item[data-v-9bafe92a]:last-child{border-bottom:none}.accordion-button[data-v-9bafe92a]{background-color:#f8fafc;border:none;color:#374151;font-weight:600;padding:1rem 1.25rem;transition:all .3s ease}.accordion-button[data-v-9bafe92a]:not(.collapsed){background-color:#3b82f6;color:#fff;box-shadow:none}.accordion-button[data-v-9bafe92a]:hover{background-color:#e5e7eb}.accordion-button[data-v-9bafe92a]:not(.collapsed):hover{background-color:#2563eb}.accordion-button[data-v-9bafe92a]:focus{box-shadow:0 0 0 3px #3b82f61a;border-color:transparent}.accordion-button[data-v-9bafe92a]:after{transition:transform .3s ease}.accordion-body[data-v-9bafe92a]{background-color:#fff;max-height:300px;overflow-y:auto}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar{width:6px}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar-track{background:#f1f5f9}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar-thumb:hover{background:#94a3b8}.paletteItem[data-v-9bafe92a]{font-size:14px;cursor:grab;padding:.75rem 1rem;margin:0;border:none;border-bottom:1px solid #f1f5f9;background-color:#fff;color:#374151;transition:all .2s ease;position:relative}.paletteItem[data-v-9bafe92a]:last-child{border-bottom:none}.paletteItem[data-v-9bafe92a]:hover{background-color:#f8fafc;color:#1f2937;transform:translate(4px);border-left:3px solid #3b82f6}.paletteItem[data-v-9bafe92a]:active{cursor:grabbing;background-color:#e0e7ff;transform:scale(.98)}.paletteItem.sortable-ghost[data-v-9bafe92a]{opacity:.5;background-color:#dbeafe;border:2px dashed #3b82f6}.paletteItem.sortable-chosen[data-v-9bafe92a]{background-color:#eff6ff;box-shadow:0 4px 6px -1px #0000001a}.paletteItem.sortable-drag[data-v-9bafe92a]{opacity:.8;transform:rotate(5deg);background-color:#fff;box-shadow:0 10px 15px -3px #0000001a}.paletteItem[data-v-9bafe92a]:has-text("No registered stages."){color:#9ca3af;font-style:italic;text-align:center;cursor:default;background-color:#f9fafb}.pipelineContour[data-v-9bafe92a]{border-top:2px dashed black}.paletteTitle[data-v-9bafe92a]{font-size:15px;font-weight:700}.w-90[data-v-9bafe92a]{width:95%}.btn-align[data-v-9bafe92a]{display:flex;align-items:flex-end}@keyframes slideDown-9bafe92a{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.accordion-collapse.collapsing[data-v-9bafe92a],.accordion-collapse.show[data-v-9bafe92a]{animation:slideDown-9bafe92a .3s ease-out}.paletteItem[data-v-9bafe92a]:focus{outline:2px solid #3b82f6;outline-offset:-2px;background-color:#eff6ff}@media (max-width: 768px){.accordion-button[data-v-9bafe92a]{padding:.75rem 1rem;font-size:14px}.paletteItem[data-v-9bafe92a]{padding:.5rem .75rem;font-size:13px}}.hr[data-v-35dbfdb3]{border-bottom:2px solid #ccc}.space-between[data-v-35dbfdb3]{display:flex!important;justify-content:space-between!important}.palette[data-v-35dbfdb3]{background-color:#ff0}.paletteItem[data-v-35dbfdb3]{font-size:15px;cursor:pointer}.pipelineContour[data-v-35dbfdb3]{border-top:2px dashed black}.paletteTitle[data-v-35dbfdb3]{font-size:15px;font-weight:700}.w-90[data-v-35dbfdb3]{width:95%}.btn-align[data-v-35dbfdb3]{display:flex;align-items:flex-end}.stage-title[data-v-c559e65d]{font-weight:700;font-size:large}.tumblebug-param-field[data-v-7b222cc6]{min-width:0}.tumblebug-param-label[data-v-7b222cc6]{align-items:center;display:flex;gap:.5rem;justify-content:space-between;margin-bottom:.35rem;min-height:1.45rem}.tumblebug-param-label code[data-v-7b222cc6]{background:#eef4ff;border-radius:4px;color:#206bc4;font-size:.72rem;line-height:1.2;min-width:0;overflow-wrap:anywhere;padding:.14rem .38rem}.tumblebug-param-label span[data-v-7b222cc6]{color:#667085;flex:0 0 auto;font-size:.75rem;font-weight:500}.tumblebug-param-label-actions[data-v-7b222cc6]{align-items:center;display:flex;gap:.5rem}.tumblebug-k8s-toggle[data-v-7b222cc6]{align-items:center;display:flex;gap:.25rem;margin:0;min-height:0}.tumblebug-k8s-toggle .form-check-input[data-v-7b222cc6]{cursor:pointer;margin-top:0}.tumblebug-k8s-toggle .form-check-label[data-v-7b222cc6]{color:#475467;cursor:pointer;font-size:.72rem;font-weight:600}.tumblebug-param-action-label[data-v-7b222cc6]{justify-content:flex-end} +.hr[data-v-3dfd077a]{border-bottom:2px solid #ccc}.space-between[data-v-3dfd077a]{display:flex!important;justify-content:space-between!important}.palette[data-v-3dfd077a]{background-color:#ff0}.paletteItem[data-v-3dfd077a]{font-size:15px;cursor:pointer}.pipelineContour[data-v-3dfd077a]{border-top:2px dashed black}.paletteTitle[data-v-3dfd077a]{font-size:15px;font-weight:700}.w-90[data-v-3dfd077a]{width:95%}.btn-align[data-v-3dfd077a]{display:flex;align-items:flex-end}.hr[data-v-9bafe92a]{border-bottom:2px solid #ccc}.space-between[data-v-9bafe92a]{display:flex!important;justify-content:space-between!important}.palette[data-v-9bafe92a]{background-color:#ff0}.card[data-v-9bafe92a]{border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 1px 3px #0000001a}.accordion-item[data-v-9bafe92a]{border:none;border-bottom:1px solid #e5e7eb}.accordion-item[data-v-9bafe92a]:last-child{border-bottom:none}.accordion-button[data-v-9bafe92a]{background-color:#f8fafc;border:none;color:#374151;font-weight:600;padding:1rem 1.25rem;transition:all .3s ease}.accordion-button[data-v-9bafe92a]:not(.collapsed){background-color:#3b82f6;color:#fff;box-shadow:none}.accordion-button[data-v-9bafe92a]:hover{background-color:#e5e7eb}.accordion-button[data-v-9bafe92a]:not(.collapsed):hover{background-color:#2563eb}.accordion-button[data-v-9bafe92a]:focus{box-shadow:0 0 0 3px #3b82f61a;border-color:transparent}.accordion-button[data-v-9bafe92a]:after{transition:transform .3s ease}.accordion-body[data-v-9bafe92a]{background-color:#fff;max-height:300px;overflow-y:auto}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar{width:6px}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar-track{background:#f1f5f9}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.accordion-body[data-v-9bafe92a]::-webkit-scrollbar-thumb:hover{background:#94a3b8}.paletteItem[data-v-9bafe92a]{font-size:14px;cursor:grab;padding:.75rem 1rem;margin:0;border:none;border-bottom:1px solid #f1f5f9;background-color:#fff;color:#374151;transition:all .2s ease;position:relative}.paletteItem[data-v-9bafe92a]:last-child{border-bottom:none}.paletteItem[data-v-9bafe92a]:hover{background-color:#f8fafc;color:#1f2937;transform:translate(4px);border-left:3px solid #3b82f6}.paletteItem[data-v-9bafe92a]:active{cursor:grabbing;background-color:#e0e7ff;transform:scale(.98)}.paletteItem.sortable-ghost[data-v-9bafe92a]{opacity:.5;background-color:#dbeafe;border:2px dashed #3b82f6}.paletteItem.sortable-chosen[data-v-9bafe92a]{background-color:#eff6ff;box-shadow:0 4px 6px -1px #0000001a}.paletteItem.sortable-drag[data-v-9bafe92a]{opacity:.8;transform:rotate(5deg);background-color:#fff;box-shadow:0 10px 15px -3px #0000001a}.paletteItem[data-v-9bafe92a]:has-text("No registered stages."){color:#9ca3af;font-style:italic;text-align:center;cursor:default;background-color:#f9fafb}.pipelineContour[data-v-9bafe92a]{border-top:2px dashed black}.paletteTitle[data-v-9bafe92a]{font-size:15px;font-weight:700}.w-90[data-v-9bafe92a]{width:95%}.btn-align[data-v-9bafe92a]{display:flex;align-items:flex-end}@keyframes slideDown-9bafe92a{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.accordion-collapse.collapsing[data-v-9bafe92a],.accordion-collapse.show[data-v-9bafe92a]{animation:slideDown-9bafe92a .3s ease-out}.paletteItem[data-v-9bafe92a]:focus{outline:2px solid #3b82f6;outline-offset:-2px;background-color:#eff6ff}@media (max-width: 768px){.accordion-button[data-v-9bafe92a]{padding:.75rem 1rem;font-size:14px}.paletteItem[data-v-9bafe92a]{padding:.5rem .75rem;font-size:13px}}.hr[data-v-35dbfdb3]{border-bottom:2px solid #ccc}.space-between[data-v-35dbfdb3]{display:flex!important;justify-content:space-between!important}.palette[data-v-35dbfdb3]{background-color:#ff0}.paletteItem[data-v-35dbfdb3]{font-size:15px;cursor:pointer}.pipelineContour[data-v-35dbfdb3]{border-top:2px dashed black}.paletteTitle[data-v-35dbfdb3]{font-size:15px;font-weight:700}.w-90[data-v-35dbfdb3]{width:95%}.btn-align[data-v-35dbfdb3]{display:flex;align-items:flex-end}.stage-title[data-v-c559e65d]{font-weight:700;font-size:large}.tumblebug-param-field[data-v-632682e2]{min-width:0}.tumblebug-param-label[data-v-632682e2]{align-items:center;display:flex;gap:.5rem;justify-content:space-between;margin-bottom:.35rem;min-height:1.45rem}.tumblebug-param-label code[data-v-632682e2]{background:#eef4ff;border-radius:4px;color:#206bc4;font-size:.72rem;line-height:1.2;min-width:0;overflow-wrap:anywhere;padding:.14rem .38rem}.tumblebug-param-label span[data-v-632682e2]{color:#667085;flex:0 0 auto;font-size:.75rem;font-weight:500}.tumblebug-param-label-actions[data-v-632682e2]{align-items:center;display:flex;gap:.5rem}.tumblebug-k8s-toggle[data-v-632682e2]{align-items:center;display:flex;gap:.25rem;margin:0;min-height:0}.tumblebug-k8s-toggle .form-check-input[data-v-632682e2]{cursor:pointer;margin-top:0}.tumblebug-k8s-toggle .form-check-label[data-v-632682e2]{color:#475467;cursor:pointer;font-size:.72rem;font-weight:600}.tumblebug-param-action-label[data-v-632682e2]{justify-content:flex-end} diff --git a/src/main/resources/static/assets/WorkflowList-BTwN2T6N.js b/src/main/resources/static/assets/WorkflowList-rRz0HDH6.js similarity index 98% rename from src/main/resources/static/assets/WorkflowList-BTwN2T6N.js rename to src/main/resources/static/assets/WorkflowList-rRz0HDH6.js index 6146333..4fe1db7 100644 --- a/src/main/resources/static/assets/WorkflowList-BTwN2T6N.js +++ b/src/main/resources/static/assets/WorkflowList-rRz0HDH6.js @@ -1,4 +1,4 @@ -import{_ as Re}from"./TableHeader.vue_vue_type_script_setup_true_lang-D78qmq0S.js";import{_ as $e}from"./request-DPzMytGP.js";import{e as Oe,d as We,g as xe,P as Ae,r as De,a as Me,b as Ge,c as Fe,f as Ve}from"./SearchableSelect-DlLPIFTu.js";import{d as Q,u as ee,c as $,a as s,t as K,g as E,l as Te,w as Ie,o as se,m as re,n as Be,j as z,p as be,q as Ke,h as ae,r as S,M as ye,s as Ne,x as ze,F as je,e as Ue,y as _e,i as B,z as qe}from"./index-Woncnlsa.js";import{T as He}from"./TumblebugParamSelector-DeFn1gSY.js";import{_ as Ze}from"./_plugin-vue_export-helper-DlAUqK2U.js";const Ye={class:"modal modal-blur fade",id:"deleteWorkflow",tabindex:"-1","aria-hidden":"true"},Xe={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},Je={class:"modal-content"},Qe={class:"modal-body py-4"},et={class:"modal-footer"},tt=Q({__name:"DeleteWorkflow",props:{workflowName:{},workflowIdx:{}},emits:["get-workflow-list"],setup(F,{emit:x}){const p=ee(),L=F,C=x,N=async()=>{const{data:g}=await Oe(L.workflowIdx);if(g){p.error("Workflows linked to an Event Listener cannot be deleted."),C("get-workflow-list");return}const{data:l}=await We(L.workflowIdx);l?p.success("Deleted successfully."):p.error("Failed to delete."),C("get-workflow-list")};return(g,l)=>(E(),$("div",Ye,[s("div",Xe,[s("div",Je,[l[2]||(l[2]=s("div",{class:"modal-status bg-danger"},null,-1)),l[3]||(l[3]=s("div",{class:"modal-header"},[s("h3",{class:"modal-title"},"Delete Workflow"),s("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),s("div",Qe,[s("h4",null,"Are you sure you want to delete "+K(L.workflowName)+"?",1)]),s("div",et,[l[1]||(l[1]=s("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),s("a",{href:"#",class:"btn btn-primary ms-auto","data-bs-dismiss":"modal",onClick:l[0]||(l[0]=h=>N())}," Delete ")])])])]))}}),ot={class:"modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable",role:"document"},at={class:"modal-content"},st={key:0,class:"run-progress"},rt={class:"d-flex align-items-center justify-content-between mb-2"},nt={class:"text-muted"},lt={class:"text-muted"},it={class:"progress"},ct=["aria-valuenow"],ut={class:"modal-body py-4"},dt={key:0,class:"d-flex justify-content-center py-4"},ft={class:"modal-footer"},mt=["aria-disabled"],wt=Q({__name:"RunWorkflow",props:{workflowIdx:{}},emits:["get-workflow-list"],setup(F,{emit:x}){const p=ee(),L=Te(),C=F,N=x,g=ae(()=>C.workflowIdx),l=S({}),h=S(!1),_=S(!1),I=S(),w=S({active:!1,completed:0,total:0,message:""}),D=ae(()=>w.value.total?Math.min(100,Math.round(w.value.completed/w.value.total*100)):0);Ie(()=>g.value,async()=>{var e;(e=I.value)!=null&&e.classList.contains("show")&&await k()}),se(()=>{var e;(e=I.value)==null||e.addEventListener("show.bs.modal",M)}),re(()=>{var e;(e=I.value)==null||e.removeEventListener("show.bs.modal",M)});const M=async()=>{await k()},k=async()=>{if(!g.value){l.value={};return}_.value=!0;try{const{data:e}=await xe(g.value,"N");V(e),l.value=e}catch(e){console.log(e),p.error("Failed to load workflow run parameters.")}finally{_.value=!1}},V=e=>{var a;const t=(L.projectInfo.ns_id||L.projectInfo.name||"").trim();if(!t)return;const o=(a=e.workflowParams)==null?void 0:a.find(n=>{var f;return((f=n.paramKey)==null?void 0:f.trim().toUpperCase())==="NAMESPACE"});o&&(o.paramValue=t)},j=async()=>{if(!(h.value||_.value)){if(!l.value.workflowInfo){p.error("Failed to load workflow run parameters.");return}h.value=!0;try{if(await T(),!await he()||!await m())return;await d("Requesting workflow run");const{data:e}=await De(A());await b("Workflow run request completed"),e?(p.success("Workflow run request has been submitted."),O()):p.error("Failed to process workflow run request."),N("get-workflow-list")}catch(e){console.log(e),p.error("Failed to process workflow run request.")}finally{h.value=!1,u()}}},A=()=>{const e=l.value.workflowInfo;return{workflowInfo:{workflowIdx:e==null?void 0:e.workflowIdx},workflowParams:[...l.value.workflowParams||[]],workflowStageMappings:[]}},O=()=>{var e;I.value&&((e=ye.getInstance(I.value))==null||e.hide())},T=async()=>{w.value={active:!0,completed:0,total:i(),message:"Preparing pre-run validation"},await c()},u=()=>{w.value.active=!1},d=async e=>{w.value.message=e,await c()},b=async e=>{w.value.completed=Math.min(w.value.completed+1,w.value.total),w.value.message=e,await c()},c=async()=>{await Ne(),await new Promise(e=>{window.requestAnimationFrame(()=>e())})},i=()=>{const e=Y(),t=ie(e),o=ce(e),a=Math.max(1,ue().length),n=a*Number(t)+a*Number(o),f=P()&&G()?1:0;return Math.max(1,n+f+1)},m=async()=>{if(!P())return!0;const e=G();if(!e)return!0;try{await d("Running infra pre-run validation");const{data:t}=await Me(ve(),e);return await b("Infra pre-run validation completed"),q(t)?(p.error(`Infra pre-run validation failed: ${H(t)}`),!1):!0}catch(t){return console.log(t),p.error("Failed to process infra pre-run validation request."),!1}},P=()=>{const e=Y();return e.includes("infra-create")||e.includes("multi-csp-vm-deploy")},G=()=>{var a;const e=r("CSP_LIST").split(",").map(n=>n.trim()).filter(Boolean),o=(e.length>0?e.map(n=>U(`${te(n)}_`,n)):[U("",r("CSP")||r("PROVIDER"))]).filter(Boolean);return o.length===0?null:{name:r("INFRA_ID")||r("INFRA_PREFIX")||((a=l.value.workflowInfo)==null?void 0:a.workflowName)||"workflow-infra",description:r("INFRA_DESC")||"Workflow created infra",installMonAgent:r("INSTALL_MON_AGENT")||"no",policyOnPartialFailure:r("POLICY_ON_PARTIAL_FAILURE")||"continue",nodeGroups:o}},U=(e,t)=>{const o=r(`${e}REGION`)||r("REGION"),a=r(`${e}CONNECTION_NAME`)||r("CONNECTION_NAME")||oe(t,o),n=r(`${e}SPEC_ID`)||r("SPEC_ID"),f=r(`${e}IMAGE_ID`)||r("IMAGE_ID");if(!n||!f)return null;const v={name:R(e,t),nodeGroupSize:Number(r("INFRA_NODEGROUP_SIZE")||"1"),specId:n,imageId:f,rootDiskType:r("ROOT_DISK_TYPE")||"default",rootDiskSize:Number(r("ROOT_DISK_SIZE")||"50")};a&&(v.connectionName=a);const y=r(`${e}ZONE`)||r("ZONE");return y&&(v.zone=y),v},R=(e,t)=>{const o=r(`${e}NODEGROUP_NAME`);return o||(t?`${r("INFRA_NODEGROUP_PREFIX")||r("INFRA_NODEGROUP_NAME")||"ng"}-${te(t).toLowerCase().replace(/_/g,"-")}`:r("INFRA_NODEGROUP_NAME")||"g1")},q=e=>{if(!e||Z(e,["reviewStatus","status","validationStatus"]).map(a=>W(a)).some(a=>["error","failed","fail"].includes(a)))return!0;const o=JSON.stringify(e).toLowerCase();return o.includes('"reviewstatus":"error"')||o.includes('"status":"error"')||o.includes("sold out")},H=e=>Z(e,["message","details","detail","reason","errorMessage"]).map(o=>String(o||"").trim()).filter(Boolean)[0]||"The selected Image/Spec combination cannot create resources.",Z=(e,t)=>{if(Array.isArray(e))return e.flatMap(a=>Z(a,t));if(!e||typeof e!="object")return[];const o=t.map(a=>a.toLowerCase());return Object.entries(e).flatMap(([a,n])=>[...o.includes(a.toLowerCase())?[n]:[],...Z(n,t)])},he=async()=>{l.value.workflowParams;const e=Y(),t=ie(e),o=ce(e);if(!t&&!o)return!0;const a=ue(),n=[];if(a.length>0)for(const f of a){const v=`${te(f)}_`;o&&await le(v,f,n),t&&await ne(v,f,n)}else{const f=r("CSP")||r("PROVIDER");o&&await le("",f,n),t&&await ne("",f,n)}return n.length>0?(p.error(`Please reselect ${n.join(", ")} for the current Region/Connection.`),!1):!0},ne=async(e,t,o)=>{const a=`${e}SPEC_ID`,n=r(a),f=r(`${e}REGION`)||r("REGION"),v=r(`${e}CONNECTION_NAME`)||r("CONNECTION_NAME")||oe(t,f);if(!n||ke(n,v,f,t)){o.push(a);return}const y=ge(n);if(y.region&&f&&!pe(y.region,f)){o.push(a);return}await d(`Validating ${a} list`),await de("spec",n,t,f,v)||o.push(a),await b(`${a} list validation completed`)},le=async(e,t,o)=>{const a=`${e}IMAGE_ID`,n=r(a),f=r(`${e}SPEC_ID`),v=r(`${e}REGION`)||r("REGION"),y=r(`${e}CONNECTION_NAME`)||r("CONNECTION_NAME")||oe(t,v),X=Se(Y());if(X&&Ce(t))return;if(!n||ke(n,y,v,t)){o.push(a);return}const J=ge(n);if(J.region&&v&&!pe(J.region,v)){o.push(a);return}await d(`Validating ${a} list`),await de("image",n,t,v,y,f,X)||o.push(a),await b(`${a} list validation completed`)},Y=()=>(l.value.workflowStageMappings||[]).map(e=>String(e.workflowStageName||"").trim().toLowerCase()),ie=e=>e.some(t=>["infra-create","k8s-cluster-create","multi-csp-vm-deploy","multi-csp-k8s-cluster-deploy"].includes(t)),ce=e=>e.some(t=>["infra-create","k8s-cluster-create","multi-csp-vm-deploy","multi-csp-k8s-cluster-deploy"].includes(t)),Se=e=>e.some(t=>["k8s-cluster-create","k8s-nodegroup-add","multi-csp-k8s-cluster-deploy"].includes(t)),Ce=e=>["azure","ibm","ncp","tencent"].includes(W(e)),ue=()=>r("CSP_LIST").split(",").map(e=>e.trim()).filter(Boolean),de=async(e,t,o,a,n,f="",v=!1)=>{if(!t||!o||!a)return!1;try{const{data:y}=await Ge(ve(),e,{providerName:o,regionName:a,connectionName:n,matchedSpecId:e==="image"?f:"",isKubernetesImage:e==="image"&&v?"true":void 0}),X=fe((y==null?void 0:y.data)??y),J=W(t);return X.some(Pe=>Ee(Pe,e).some(Le=>W(Le)===J))}catch(y){return console.log(y),!1}},Ee=(e,t)=>e==null?[]:typeof e!="object"?[String(e)]:me(t==="image"?[e.id,e.name,e.imageId,e.cspImageId,e.cspImageName,e.imageName,e.displayName]:[e.id,e.name,e.specId,e.cspSpecId,e.cspSpecName,e.CspSpecName,e.specName,e.Name,e.VMSpecName]),fe=e=>{if(Array.isArray(e))return e;if(!e||typeof e!="object")return[];const t=["images","image","imageList","specs","spec","specList","resources","resource","resourceList","items","list","result","output"];for(const o of t)if(Array.isArray(e[o]))return e[o];for(const o of Object.values(e)){const a=fe(o);if(a.length>0)return a}return[]},me=e=>{const t=new Set;return e.map(o=>o==null?"":String(o).trim()).filter(o=>!o||t.has(o)?!1:(t.add(o),!0))},r=e=>{const t=we(e),o=(l.value.workflowParams||[]).find(a=>we(a.paramKey)===t);return String((o==null?void 0:o.paramValue)||"").trim()},we=e=>String(e||"").trim().toUpperCase(),te=e=>String(e||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"_"),W=e=>String(e||"").trim().toLowerCase(),pe=(e,t)=>{const o=W(e),a=W(t);return!o||!a?!0:o===a||o.startsWith(`${a}-`)||a.startsWith(`${o}-`)},oe=(e,t)=>e&&t?`${e}-${t}`:"",ge=e=>{const t=String(e||"").split("+");return t.length<3?{provider:"",region:""}:{provider:t[0],region:t[1]}},ve=()=>r("NAMESPACE")||"system",ke=(e,t,o,a)=>{const n=W(e);return n?n===W(t)||n===W(o)||n===W(a):!0};return(e,t)=>{var o;return E(),$("div",{class:"modal modal-blur fade",id:"runWorkflow",tabindex:"-1","aria-hidden":"true",ref_key:"modalElement",ref:I},[s("div",ot,[s("div",at,[t[3]||(t[3]=s("div",{class:"modal-status bg-info"},null,-1)),t[4]||(t[4]=s("div",{class:"modal-header"},[s("h3",{class:"modal-title"},"Run Workflow"),s("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),w.value.active?(E(),$("div",st,[s("div",rt,[s("span",nt,K(w.value.message),1),s("span",lt,K(w.value.completed)+" / "+K(w.value.total),1)]),s("div",it,[s("div",{class:"progress-bar progress-bar-striped progress-bar-animated",role:"progressbar",style:Be({width:`${D.value}%`}),"aria-valuenow":D.value,"aria-valuemin":"0","aria-valuemax":"100"},null,12,ct)])])):z("",!0),s("div",ut,[_.value?(E(),$("div",dt,[...t[1]||(t[1]=[s("div",{class:"spinner-border",role:"status"},[s("span",{class:"visually-hidden"},"Loading...")],-1)])])):z("",!0),!_.value&&l.value.workflowParams?(E(),be(He,{key:1,"workflow-name":(o=l.value.workflowInfo)==null?void 0:o.workflowName,"workflow-param-data":l.value.workflowParams,"workflow-stage-mappings":l.value.workflowStageMappings||[]},null,8,["workflow-name","workflow-param-data","workflow-stage-mappings"])):z("",!0),!_.value&&l.value.workflowParams?(E(),be(Ae,{key:2,popup:!0,"workflow-param-data":l.value.workflowParams,"event-listener-yn":"N"},null,8,["workflow-param-data"])):z("",!0)]),s("div",ft,[t[2]||(t[2]=s("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),s("button",{type:"button",class:Ke(["btn btn-primary ms-auto",{disabled:h.value||_.value}]),"aria-disabled":h.value||_.value,onClick:t[0]||(t[0]=a=>j())},K(h.value?"Running...":"Run"),11,mt)])])])],512)}}}),pt=Ze(wt,[["__scopeId","data-v-cdce1b7e"]]),gt={class:"modal-dialog modal-xl",role:"document"},vt={class:"modal-content"},kt={class:"modal-body text-left py-4"},bt={class:"mb-5"},_t={key:0,class:"spinner-border",role:"status"},It={key:0},yt={class:"card mb-3"},Nt=["onClick"],ht={class:"card-title"},St={key:0,class:"card-body"},Ct=["value"],Et=3e3,Pt=Q({__name:"WorkflowLog",props:{workflowIdx:{}},emits:["get-oss-list"],setup(F,{emit:x}){const p=ee(),L=F,C=S(!1),N=S(),g=ae(()=>L.workflowIdx);Ie(g,async()=>{var u;(u=N.value)!=null&&u.classList.contains("show")&&(O(),await I(!0),A())}),se(()=>{var u,d;(u=N.value)==null||u.addEventListener("show.bs.modal",w),(d=N.value)==null||d.addEventListener("hidden.bs.modal",D)}),re(()=>{var u,d;(u=N.value)==null||u.removeEventListener("show.bs.modal",w),(d=N.value)==null||d.removeEventListener("hidden.bs.modal",D),O()});const l=S([]);let h,_=!1;const I=async(u=!0)=>{if(!g.value){l.value=[],C.value=!0,O();return}_||(_=!0,u&&(C.value=!1,l.value=[]),await Fe(g.value).then(({data:d})=>{var i;const b=Array.isArray(d)?d:[],c=k.value;l.value=b,b.some(m=>m.buildIdx===c)||(k.value=((i=b[0])==null?void 0:i.buildIdx)??0)}).catch(d=>{console.log(d),u&&p.error("Failed to load workflow logs.")}).finally(()=>{u&&(C.value=!0),_=!1}))},w=async()=>{await I(!0),A()},D=()=>{M()},M=()=>{O(),l.value=[],k.value=1},k=S(1),V=u=>{k.value===u?k.value=0:k.value=u},j=u=>u===0?"DB History":u,A=()=>{O(),!(!T()||!g.value)&&(h=setInterval(async()=>{await I(!1),(!T()||!g.value)&&O()},Et))},O=()=>{h&&(clearInterval(h),h=void 0)},T=()=>{var u;return!!((u=N.value)!=null&&u.classList.contains("show"))};return(u,d)=>(E(),$("div",{class:"modal",id:"workflowLog",tabindex:"-1",ref_key:"modalElement",ref:N},[s("div",gt,[s("div",vt,[d[3]||(d[3]=s("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"},null,-1)),s("div",kt,[s("h3",bt,[d[1]||(d[1]=ze(" Workflow Log ",-1)),C.value?z("",!0):(E(),$("div",_t,[...d[0]||(d[0]=[s("span",{class:"visually-hidden"},"Loading...",-1)])]))]),s("div",null,[l.value.length<=0?(E(),$("div",It,[...d[2]||(d[2]=[s("p",{class:"text-secondary"},"No Data",-1)])])):(E(!0),$(je,{key:1},Ue(l.value,b=>(E(),$("div",{key:b.buildIdx},[s("div",yt,[s("div",{class:"card-header",onClick:c=>V(b.buildIdx),style:{cursor:"pointer"}},[s("h3",ht,K(j(b.buildIdx)),1)],8,Nt),k.value===b.buildIdx?(E(),$("div",St,[s("textarea",{value:b.buildLog,disabled:"",style:{width:"100%"},rows:"20"},null,8,Ct)])):z("",!0)])]))),128))])]),s("div",{class:"modal-footer"},[s("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal",onClick:M}," Cancel ")])])])],512))}}),Lt={class:"card card-flush w-100"},Rt={class:"card-body"},$t={class:"workflow-list-table"},Ot=3e4,Ft=Q({__name:"WorkflowList",setup(F){const x=S(!0);ee();const p=S([]),L=S([]),C=["vm-mariadb-backup-import-data-init","vm-mariadb-data-init-cleanup","k8s-mariadb-backup-import-data-init","k8s-mariadb-data-init-cleanup","multi-csp-vm-deploy","multi-csp-vm-cleanup","multi-csp-k8s-cluster-deploy","multi-csp-k8s-cluster-cleanup","vm-object-storage-data-lab-init","vm-object-storage-data-lab-cleanup"],N=new Map(C.map((c,i)=>[c,i]));se(async()=>{j(),await I(),h()}),re(()=>{_()});let g,l=!1;const h=()=>{_(),g=setInterval(()=>{I(!1)},Ot)},_=()=>{g&&(clearInterval(g),g=void 0)},I=async(c=!0)=>{if(!l){l=!0;try{c&&(x.value=!0),await Ve("N").then(({data:i})=>{p.value=D(M(i||[],!c))})}catch(i){console.log(i)}finally{c&&(x.value=!1),l=!1}}},w=c=>{var i,m;return String(((i=c.workflowInfo)==null?void 0:i.workflowIdx)||((m=c.workflowInfo)==null?void 0:m.workflowName)||"")},D=c=>[...c].sort((i,m)=>{const P=N.get(i.workflowInfo.workflowName)??C.length,G=N.get(m.workflowInfo.workflowName)??C.length;return P-G}),M=(c,i=!1)=>{if(p.value.length===0)return c;const m=new Map(c.map(R=>[w(R),R])),P=new Set,G=p.value.map(R=>{const q=w(R),H=m.get(q);return H?(P.add(q),H):i?R:null}).filter(R=>R!==null);if(i)return G;const U=c.filter(R=>!P.has(w(R)));return[...G,...U]},k=S(0),V=S(""),j=()=>{L.value=[{title:"Workflow Name",field:"workflowInfo.workflowName",minWidth:220,widthGrow:3,cssClass:"workflow-text-cell",variableHeight:!0},{title:"Purpose",field:"workflowInfo.workflowPurpose",minWidth:150,widthGrow:1.2,cssClass:"workflow-text-cell",variableHeight:!0},{title:"Status",field:"workflowInfo.status",minWidth:150,widthGrow:1,formatter:u,variableHeight:!0},{title:"Params Count",formatter:T,minWidth:120,widthGrow:.8,hozAlign:"center"},{title:"Last Run Date",field:"runDate",minWidth:170,widthGrow:1.6,formatter:d,cssClass:"workflow-text-cell",variableHeight:!0},{title:"Action",minWidth:260,widthGrow:2,formatter:b,cssClass:"workflow-action-cell",headerSort:!1,variableHeight:!0,cellClick:async(c,i)=>{const m=c.target,P=m==null?void 0:m.getAttribute("id");k.value=i.getRow().getData().workflowInfo.workflowIdx,P==="detail-btn"?_e.push("/web/workflows/workflow/detail/"+k.value):P==="delete-btn"?(V.value=i.getRow().getData().workflowInfo.workflowName,await A("deleteWorkflow")):P==="run-btn"?await A("runWorkflow"):P==="log-btn"&&await A("workflowLog")}}]},A=async c=>{await Ne();const i=document.getElementById(c);i&&ye.getOrCreateInstance(i).show()},O=()=>{_e.push("/web/workflows/workflow/new")},T=c=>`${(c._cell.row.data.workflowParams||[]).filter(m=>String((m==null?void 0:m.paramKey)||"").trim()).length}`,u=c=>{const i=c.getValue()||"-";return` +import{_ as Re}from"./TableHeader.vue_vue_type_script_setup_true_lang-Dy8u8xlP.js";import{_ as $e}from"./request-CogRSUKp.js";import{e as Oe,d as We,g as xe,P as Ae,r as De,a as Me,b as Ge,c as Fe,f as Ve}from"./SearchableSelect-DIXeDCav.js";import{d as Q,u as ee,c as $,a as s,t as K,g as E,l as Te,w as Ie,o as se,m as re,n as Be,j as z,p as be,q as Ke,h as ae,r as S,M as ye,s as Ne,x as ze,F as je,e as Ue,y as _e,i as B,z as qe}from"./index-DbsXni7y.js";import{T as He}from"./TumblebugParamSelector-DZVyXDc9.js";import{_ as Ze}from"./_plugin-vue_export-helper-DlAUqK2U.js";const Ye={class:"modal modal-blur fade",id:"deleteWorkflow",tabindex:"-1","aria-hidden":"true"},Xe={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},Je={class:"modal-content"},Qe={class:"modal-body py-4"},et={class:"modal-footer"},tt=Q({__name:"DeleteWorkflow",props:{workflowName:{},workflowIdx:{}},emits:["get-workflow-list"],setup(F,{emit:x}){const p=ee(),L=F,C=x,N=async()=>{const{data:g}=await Oe(L.workflowIdx);if(g){p.error("Workflows linked to an Event Listener cannot be deleted."),C("get-workflow-list");return}const{data:l}=await We(L.workflowIdx);l?p.success("Deleted successfully."):p.error("Failed to delete."),C("get-workflow-list")};return(g,l)=>(E(),$("div",Ye,[s("div",Xe,[s("div",Je,[l[2]||(l[2]=s("div",{class:"modal-status bg-danger"},null,-1)),l[3]||(l[3]=s("div",{class:"modal-header"},[s("h3",{class:"modal-title"},"Delete Workflow"),s("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),s("div",Qe,[s("h4",null,"Are you sure you want to delete "+K(L.workflowName)+"?",1)]),s("div",et,[l[1]||(l[1]=s("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),s("a",{href:"#",class:"btn btn-primary ms-auto","data-bs-dismiss":"modal",onClick:l[0]||(l[0]=h=>N())}," Delete ")])])])]))}}),ot={class:"modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable",role:"document"},at={class:"modal-content"},st={key:0,class:"run-progress"},rt={class:"d-flex align-items-center justify-content-between mb-2"},nt={class:"text-muted"},lt={class:"text-muted"},it={class:"progress"},ct=["aria-valuenow"],ut={class:"modal-body py-4"},dt={key:0,class:"d-flex justify-content-center py-4"},ft={class:"modal-footer"},mt=["aria-disabled"],wt=Q({__name:"RunWorkflow",props:{workflowIdx:{}},emits:["get-workflow-list"],setup(F,{emit:x}){const p=ee(),L=Te(),C=F,N=x,g=ae(()=>C.workflowIdx),l=S({}),h=S(!1),_=S(!1),I=S(),w=S({active:!1,completed:0,total:0,message:""}),D=ae(()=>w.value.total?Math.min(100,Math.round(w.value.completed/w.value.total*100)):0);Ie(()=>g.value,async()=>{var e;(e=I.value)!=null&&e.classList.contains("show")&&await k()}),se(()=>{var e;(e=I.value)==null||e.addEventListener("show.bs.modal",M)}),re(()=>{var e;(e=I.value)==null||e.removeEventListener("show.bs.modal",M)});const M=async()=>{await k()},k=async()=>{if(!g.value){l.value={};return}_.value=!0;try{const{data:e}=await xe(g.value,"N");V(e),l.value=e}catch(e){console.log(e),p.error("Failed to load workflow run parameters.")}finally{_.value=!1}},V=e=>{var a;const t=(L.projectInfo.ns_id||L.projectInfo.name||"").trim();if(!t)return;const o=(a=e.workflowParams)==null?void 0:a.find(n=>{var f;return((f=n.paramKey)==null?void 0:f.trim().toUpperCase())==="NAMESPACE"});o&&(o.paramValue=t)},j=async()=>{if(!(h.value||_.value)){if(!l.value.workflowInfo){p.error("Failed to load workflow run parameters.");return}h.value=!0;try{if(await T(),!await he()||!await m())return;await d("Requesting workflow run");const{data:e}=await De(A());await b("Workflow run request completed"),e?(p.success("Workflow run request has been submitted."),O()):p.error("Failed to process workflow run request."),N("get-workflow-list")}catch(e){console.log(e),p.error("Failed to process workflow run request.")}finally{h.value=!1,u()}}},A=()=>{const e=l.value.workflowInfo;return{workflowInfo:{workflowIdx:e==null?void 0:e.workflowIdx},workflowParams:[...l.value.workflowParams||[]],workflowStageMappings:[]}},O=()=>{var e;I.value&&((e=ye.getInstance(I.value))==null||e.hide())},T=async()=>{w.value={active:!0,completed:0,total:i(),message:"Preparing pre-run validation"},await c()},u=()=>{w.value.active=!1},d=async e=>{w.value.message=e,await c()},b=async e=>{w.value.completed=Math.min(w.value.completed+1,w.value.total),w.value.message=e,await c()},c=async()=>{await Ne(),await new Promise(e=>{window.requestAnimationFrame(()=>e())})},i=()=>{const e=Y(),t=ie(e),o=ce(e),a=Math.max(1,ue().length),n=a*Number(t)+a*Number(o),f=P()&&G()?1:0;return Math.max(1,n+f+1)},m=async()=>{if(!P())return!0;const e=G();if(!e)return!0;try{await d("Running infra pre-run validation");const{data:t}=await Me(ve(),e);return await b("Infra pre-run validation completed"),q(t)?(p.error(`Infra pre-run validation failed: ${H(t)}`),!1):!0}catch(t){return console.log(t),p.error("Failed to process infra pre-run validation request."),!1}},P=()=>{const e=Y();return e.includes("infra-create")||e.includes("multi-csp-vm-deploy")},G=()=>{var a;const e=r("CSP_LIST").split(",").map(n=>n.trim()).filter(Boolean),o=(e.length>0?e.map(n=>U(`${te(n)}_`,n)):[U("",r("CSP")||r("PROVIDER"))]).filter(Boolean);return o.length===0?null:{name:r("INFRA_ID")||r("INFRA_PREFIX")||((a=l.value.workflowInfo)==null?void 0:a.workflowName)||"workflow-infra",description:r("INFRA_DESC")||"Workflow created infra",installMonAgent:r("INSTALL_MON_AGENT")||"no",policyOnPartialFailure:r("POLICY_ON_PARTIAL_FAILURE")||"continue",nodeGroups:o}},U=(e,t)=>{const o=r(`${e}REGION`)||r("REGION"),a=r(`${e}CONNECTION_NAME`)||r("CONNECTION_NAME")||oe(t,o),n=r(`${e}SPEC_ID`)||r("SPEC_ID"),f=r(`${e}IMAGE_ID`)||r("IMAGE_ID");if(!n||!f)return null;const v={name:R(e,t),nodeGroupSize:Number(r("INFRA_NODEGROUP_SIZE")||"1"),specId:n,imageId:f,rootDiskType:r("ROOT_DISK_TYPE")||"default",rootDiskSize:Number(r("ROOT_DISK_SIZE")||"50")};a&&(v.connectionName=a);const y=r(`${e}ZONE`)||r("ZONE");return y&&(v.zone=y),v},R=(e,t)=>{const o=r(`${e}NODEGROUP_NAME`);return o||(t?`${r("INFRA_NODEGROUP_PREFIX")||r("INFRA_NODEGROUP_NAME")||"ng"}-${te(t).toLowerCase().replace(/_/g,"-")}`:r("INFRA_NODEGROUP_NAME")||"g1")},q=e=>{if(!e||Z(e,["reviewStatus","status","validationStatus"]).map(a=>W(a)).some(a=>["error","failed","fail"].includes(a)))return!0;const o=JSON.stringify(e).toLowerCase();return o.includes('"reviewstatus":"error"')||o.includes('"status":"error"')||o.includes("sold out")},H=e=>Z(e,["message","details","detail","reason","errorMessage"]).map(o=>String(o||"").trim()).filter(Boolean)[0]||"The selected Image/Spec combination cannot create resources.",Z=(e,t)=>{if(Array.isArray(e))return e.flatMap(a=>Z(a,t));if(!e||typeof e!="object")return[];const o=t.map(a=>a.toLowerCase());return Object.entries(e).flatMap(([a,n])=>[...o.includes(a.toLowerCase())?[n]:[],...Z(n,t)])},he=async()=>{l.value.workflowParams;const e=Y(),t=ie(e),o=ce(e);if(!t&&!o)return!0;const a=ue(),n=[];if(a.length>0)for(const f of a){const v=`${te(f)}_`;o&&await le(v,f,n),t&&await ne(v,f,n)}else{const f=r("CSP")||r("PROVIDER");o&&await le("",f,n),t&&await ne("",f,n)}return n.length>0?(p.error(`Please reselect ${n.join(", ")} for the current Region/Connection.`),!1):!0},ne=async(e,t,o)=>{const a=`${e}SPEC_ID`,n=r(a),f=r(`${e}REGION`)||r("REGION"),v=r(`${e}CONNECTION_NAME`)||r("CONNECTION_NAME")||oe(t,f);if(!n||ke(n,v,f,t)){o.push(a);return}const y=ge(n);if(y.region&&f&&!pe(y.region,f)){o.push(a);return}await d(`Validating ${a} list`),await de("spec",n,t,f,v)||o.push(a),await b(`${a} list validation completed`)},le=async(e,t,o)=>{const a=`${e}IMAGE_ID`,n=r(a),f=r(`${e}SPEC_ID`),v=r(`${e}REGION`)||r("REGION"),y=r(`${e}CONNECTION_NAME`)||r("CONNECTION_NAME")||oe(t,v),X=Se(Y());if(X&&Ce(t))return;if(!n||ke(n,y,v,t)){o.push(a);return}const J=ge(n);if(J.region&&v&&!pe(J.region,v)){o.push(a);return}await d(`Validating ${a} list`),await de("image",n,t,v,y,f,X)||o.push(a),await b(`${a} list validation completed`)},Y=()=>(l.value.workflowStageMappings||[]).map(e=>String(e.workflowStageName||"").trim().toLowerCase()),ie=e=>e.some(t=>["infra-create","k8s-cluster-create","multi-csp-vm-deploy","multi-csp-k8s-cluster-deploy"].includes(t)),ce=e=>e.some(t=>["infra-create","k8s-cluster-create","multi-csp-vm-deploy","multi-csp-k8s-cluster-deploy"].includes(t)),Se=e=>e.some(t=>["k8s-cluster-create","k8s-nodegroup-add","multi-csp-k8s-cluster-deploy"].includes(t)),Ce=e=>["azure","ibm","ncp","tencent"].includes(W(e)),ue=()=>r("CSP_LIST").split(",").map(e=>e.trim()).filter(Boolean),de=async(e,t,o,a,n,f="",v=!1)=>{if(!t||!o||!a)return!1;try{const{data:y}=await Ge(ve(),e,{providerName:o,regionName:a,connectionName:n,matchedSpecId:e==="image"?f:"",isKubernetesImage:e==="image"&&v?"true":void 0}),X=fe((y==null?void 0:y.data)??y),J=W(t);return X.some(Pe=>Ee(Pe,e).some(Le=>W(Le)===J))}catch(y){return console.log(y),!1}},Ee=(e,t)=>e==null?[]:typeof e!="object"?[String(e)]:me(t==="image"?[e.id,e.name,e.imageId,e.cspImageId,e.cspImageName,e.imageName,e.displayName]:[e.id,e.name,e.specId,e.cspSpecId,e.cspSpecName,e.CspSpecName,e.specName,e.Name,e.VMSpecName]),fe=e=>{if(Array.isArray(e))return e;if(!e||typeof e!="object")return[];const t=["images","image","imageList","specs","spec","specList","resources","resource","resourceList","items","list","result","output"];for(const o of t)if(Array.isArray(e[o]))return e[o];for(const o of Object.values(e)){const a=fe(o);if(a.length>0)return a}return[]},me=e=>{const t=new Set;return e.map(o=>o==null?"":String(o).trim()).filter(o=>!o||t.has(o)?!1:(t.add(o),!0))},r=e=>{const t=we(e),o=(l.value.workflowParams||[]).find(a=>we(a.paramKey)===t);return String((o==null?void 0:o.paramValue)||"").trim()},we=e=>String(e||"").trim().toUpperCase(),te=e=>String(e||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"_"),W=e=>String(e||"").trim().toLowerCase(),pe=(e,t)=>{const o=W(e),a=W(t);return!o||!a?!0:o===a||o.startsWith(`${a}-`)||a.startsWith(`${o}-`)},oe=(e,t)=>e&&t?`${e}-${t}`:"",ge=e=>{const t=String(e||"").split("+");return t.length<3?{provider:"",region:""}:{provider:t[0],region:t[1]}},ve=()=>r("NAMESPACE")||"system",ke=(e,t,o,a)=>{const n=W(e);return n?n===W(t)||n===W(o)||n===W(a):!0};return(e,t)=>{var o;return E(),$("div",{class:"modal modal-blur fade",id:"runWorkflow",tabindex:"-1","aria-hidden":"true",ref_key:"modalElement",ref:I},[s("div",ot,[s("div",at,[t[3]||(t[3]=s("div",{class:"modal-status bg-info"},null,-1)),t[4]||(t[4]=s("div",{class:"modal-header"},[s("h3",{class:"modal-title"},"Run Workflow"),s("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),w.value.active?(E(),$("div",st,[s("div",rt,[s("span",nt,K(w.value.message),1),s("span",lt,K(w.value.completed)+" / "+K(w.value.total),1)]),s("div",it,[s("div",{class:"progress-bar progress-bar-striped progress-bar-animated",role:"progressbar",style:Be({width:`${D.value}%`}),"aria-valuenow":D.value,"aria-valuemin":"0","aria-valuemax":"100"},null,12,ct)])])):z("",!0),s("div",ut,[_.value?(E(),$("div",dt,[...t[1]||(t[1]=[s("div",{class:"spinner-border",role:"status"},[s("span",{class:"visually-hidden"},"Loading...")],-1)])])):z("",!0),!_.value&&l.value.workflowParams?(E(),be(He,{key:1,"workflow-name":(o=l.value.workflowInfo)==null?void 0:o.workflowName,"workflow-param-data":l.value.workflowParams,"workflow-stage-mappings":l.value.workflowStageMappings||[]},null,8,["workflow-name","workflow-param-data","workflow-stage-mappings"])):z("",!0),!_.value&&l.value.workflowParams?(E(),be(Ae,{key:2,popup:!0,"workflow-param-data":l.value.workflowParams,"event-listener-yn":"N"},null,8,["workflow-param-data"])):z("",!0)]),s("div",ft,[t[2]||(t[2]=s("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),s("button",{type:"button",class:Ke(["btn btn-primary ms-auto",{disabled:h.value||_.value}]),"aria-disabled":h.value||_.value,onClick:t[0]||(t[0]=a=>j())},K(h.value?"Running...":"Run"),11,mt)])])])],512)}}}),pt=Ze(wt,[["__scopeId","data-v-cdce1b7e"]]),gt={class:"modal-dialog modal-xl",role:"document"},vt={class:"modal-content"},kt={class:"modal-body text-left py-4"},bt={class:"mb-5"},_t={key:0,class:"spinner-border",role:"status"},It={key:0},yt={class:"card mb-3"},Nt=["onClick"],ht={class:"card-title"},St={key:0,class:"card-body"},Ct=["value"],Et=3e3,Pt=Q({__name:"WorkflowLog",props:{workflowIdx:{}},emits:["get-oss-list"],setup(F,{emit:x}){const p=ee(),L=F,C=S(!1),N=S(),g=ae(()=>L.workflowIdx);Ie(g,async()=>{var u;(u=N.value)!=null&&u.classList.contains("show")&&(O(),await I(!0),A())}),se(()=>{var u,d;(u=N.value)==null||u.addEventListener("show.bs.modal",w),(d=N.value)==null||d.addEventListener("hidden.bs.modal",D)}),re(()=>{var u,d;(u=N.value)==null||u.removeEventListener("show.bs.modal",w),(d=N.value)==null||d.removeEventListener("hidden.bs.modal",D),O()});const l=S([]);let h,_=!1;const I=async(u=!0)=>{if(!g.value){l.value=[],C.value=!0,O();return}_||(_=!0,u&&(C.value=!1,l.value=[]),await Fe(g.value).then(({data:d})=>{var i;const b=Array.isArray(d)?d:[],c=k.value;l.value=b,b.some(m=>m.buildIdx===c)||(k.value=((i=b[0])==null?void 0:i.buildIdx)??0)}).catch(d=>{console.log(d),u&&p.error("Failed to load workflow logs.")}).finally(()=>{u&&(C.value=!0),_=!1}))},w=async()=>{await I(!0),A()},D=()=>{M()},M=()=>{O(),l.value=[],k.value=1},k=S(1),V=u=>{k.value===u?k.value=0:k.value=u},j=u=>u===0?"DB History":u,A=()=>{O(),!(!T()||!g.value)&&(h=setInterval(async()=>{await I(!1),(!T()||!g.value)&&O()},Et))},O=()=>{h&&(clearInterval(h),h=void 0)},T=()=>{var u;return!!((u=N.value)!=null&&u.classList.contains("show"))};return(u,d)=>(E(),$("div",{class:"modal",id:"workflowLog",tabindex:"-1",ref_key:"modalElement",ref:N},[s("div",gt,[s("div",vt,[d[3]||(d[3]=s("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"},null,-1)),s("div",kt,[s("h3",bt,[d[1]||(d[1]=ze(" Workflow Log ",-1)),C.value?z("",!0):(E(),$("div",_t,[...d[0]||(d[0]=[s("span",{class:"visually-hidden"},"Loading...",-1)])]))]),s("div",null,[l.value.length<=0?(E(),$("div",It,[...d[2]||(d[2]=[s("p",{class:"text-secondary"},"No Data",-1)])])):(E(!0),$(je,{key:1},Ue(l.value,b=>(E(),$("div",{key:b.buildIdx},[s("div",yt,[s("div",{class:"card-header",onClick:c=>V(b.buildIdx),style:{cursor:"pointer"}},[s("h3",ht,K(j(b.buildIdx)),1)],8,Nt),k.value===b.buildIdx?(E(),$("div",St,[s("textarea",{value:b.buildLog,disabled:"",style:{width:"100%"},rows:"20"},null,8,Ct)])):z("",!0)])]))),128))])]),s("div",{class:"modal-footer"},[s("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal",onClick:M}," Cancel ")])])])],512))}}),Lt={class:"card card-flush w-100"},Rt={class:"card-body"},$t={class:"workflow-list-table"},Ot=3e4,Ft=Q({__name:"WorkflowList",setup(F){const x=S(!0);ee();const p=S([]),L=S([]),C=["vm-mariadb-backup-import-data-init","vm-mariadb-data-init-cleanup","k8s-mariadb-backup-import-data-init","k8s-mariadb-data-init-cleanup","multi-csp-vm-deploy","multi-csp-vm-cleanup","multi-csp-k8s-cluster-deploy","multi-csp-k8s-cluster-cleanup","vm-object-storage-data-lab-init","vm-object-storage-data-lab-cleanup"],N=new Map(C.map((c,i)=>[c,i]));se(async()=>{j(),await I(),h()}),re(()=>{_()});let g,l=!1;const h=()=>{_(),g=setInterval(()=>{I(!1)},Ot)},_=()=>{g&&(clearInterval(g),g=void 0)},I=async(c=!0)=>{if(!l){l=!0;try{c&&(x.value=!0),await Ve("N").then(({data:i})=>{p.value=D(M(i||[],!c))})}catch(i){console.log(i)}finally{c&&(x.value=!1),l=!1}}},w=c=>{var i,m;return String(((i=c.workflowInfo)==null?void 0:i.workflowIdx)||((m=c.workflowInfo)==null?void 0:m.workflowName)||"")},D=c=>[...c].sort((i,m)=>{const P=N.get(i.workflowInfo.workflowName)??C.length,G=N.get(m.workflowInfo.workflowName)??C.length;return P-G}),M=(c,i=!1)=>{if(p.value.length===0)return c;const m=new Map(c.map(R=>[w(R),R])),P=new Set,G=p.value.map(R=>{const q=w(R),H=m.get(q);return H?(P.add(q),H):i?R:null}).filter(R=>R!==null);if(i)return G;const U=c.filter(R=>!P.has(w(R)));return[...G,...U]},k=S(0),V=S(""),j=()=>{L.value=[{title:"Workflow Name",field:"workflowInfo.workflowName",minWidth:220,widthGrow:3,cssClass:"workflow-text-cell",variableHeight:!0},{title:"Purpose",field:"workflowInfo.workflowPurpose",minWidth:150,widthGrow:1.2,cssClass:"workflow-text-cell",variableHeight:!0},{title:"Status",field:"workflowInfo.status",minWidth:150,widthGrow:1,formatter:u,variableHeight:!0},{title:"Params Count",formatter:T,minWidth:120,widthGrow:.8,hozAlign:"center"},{title:"Last Run Date",field:"runDate",minWidth:170,widthGrow:1.6,formatter:d,cssClass:"workflow-text-cell",variableHeight:!0},{title:"Action",minWidth:260,widthGrow:2,formatter:b,cssClass:"workflow-action-cell",headerSort:!1,variableHeight:!0,cellClick:async(c,i)=>{const m=c.target,P=m==null?void 0:m.getAttribute("id");k.value=i.getRow().getData().workflowInfo.workflowIdx,P==="detail-btn"?_e.push("/web/workflows/workflow/detail/"+k.value):P==="delete-btn"?(V.value=i.getRow().getData().workflowInfo.workflowName,await A("deleteWorkflow")):P==="run-btn"?await A("runWorkflow"):P==="log-btn"&&await A("workflowLog")}}]},A=async c=>{await Ne();const i=document.getElementById(c);i&&ye.getOrCreateInstance(i).show()},O=()=>{_e.push("/web/workflows/workflow/new")},T=c=>`${(c._cell.row.data.workflowParams||[]).filter(m=>String((m==null?void 0:m.paramKey)||"").trim()).length}`,u=c=>{const i=c.getValue()||"-";return`
v.get("/workflowStageType/list"),K=()=>v.get("/workflowStage/list");function Q(s){return v.get("/workflowStage/"+s)}function X(s){return v.get(`/workflowStage/duplicate?workflowStageName=${s.workflowStageName}&workflowStageTypeName=${s.workflowStageTypeName}`)}function Y(s){return v.post("/workflowStage",s)}function Z(s){return v.patch(`/workflowStage/${s.workflowStageIdx}`,s)}function ee(s){return v.delete(`/workflowStage/${s}`)}function te(s){return v.get(`/workflowStage/default/script/${s}`)}const oe={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},ae={class:"modal-content"},le={class:"modal-header"},se={class:"modal-title"},re={class:"modal-body py-4"},ne={class:"mb-3"},ie={style:{display:"flex","justify-content":"start"}},de={key:0},we={class:"grid gap-0 column-gap-3"},ue=["value"],fe={class:"mb-3"},ce={class:"grid gap-0 column-gap-3"},ge={class:"col"},me={key:1,class:"btn btn-success",style:{margin:"3px"}},ke={class:"mb-3"},Se={class:"mb-3"},pe={class:"modal-footer"},ve=C({__name:"WorkflowStageForm",props:{mode:{},workflowStageIdx:{},workflowStageName:{}},emits:["get-workflow-stage-list"],setup(s,{emit:N}){const l=D(),c=d(),g=d(),r=s,k=N,i=F(()=>r.workflowStageIdx),W=F(()=>r.workflowStageName),m=d(!1);$(i,async()=>{b(),await w()}),E(async()=>{c.value&&(g.value=new z(c.value)),b(),await w()});const t=d({}),w=async()=>{m.value=!0,r.mode==="new"?(t.value.workflowStageIdx=0,t.value.workflowStageTypeIdx=0,t.value.workflowStageTypeName="",t.value.workflowStageName="",t.value.workflowStageDesc="",t.value.workflowStageContent="",t.value.workflowStageOrder=0,p.value=!1,S.value=!1,m.value=!1,console.log("isInitializing",m.value)):await Q(r.workflowStageIdx).then(a=>{t.value=a.data,p.value=!0,m.value=!1})},y=d([]),b=async()=>{try{const{data:a}=await J();y.value=a}catch(a){console.log(a)}},S=d(!1),V=async()=>{S.value=!S.value,t.value.workflowStageTypeIdx=0,t.value.workflowStageTypeName=""},B=async()=>{p.value=!1,y.value.forEach(a=>{t.value.workflowStageTypeIdx===a.workflowStageTypeIdx&&(t.value.workflowStageTypeName=a.workflowStageTypeName)}),await I(t.value.workflowStageTypeName)},I=async a=>{const{data:o}=await te(a);t.value.workflowStageContent=o[0].workflowStageContent},p=d(!1),M=async()=>{const a={workflowStageName:t.value.workflowStageName,workflowStageTypeName:t.value.workflowStageTypeName},{data:o}=await X(a);o?l.error("Name is already in use."):(l.success("Name is available."),p.value=!0)};$(()=>[t.value.workflowStageName,t.value.workflowStageTypeName],()=>{if(!m.value){if(W.value===t.value.workflowStageName){p.value=!0;return}p.value=!1}});const P=async()=>{if(!S.value&&(!t.value.workflowStageTypeIdx||t.value.workflowStageTypeIdx===0)){l.error("Please select Workflow Stage Type.");return}if(S.value&&!t.value.workflowStageTypeName){l.error("Please enter new Workflow Stage Type.");return}if(!t.value.workflowStageName){l.error("Please enter Workflow Stage Name.");return}if(!p.value){l.error("Please perform duplicate check.");return}if(!t.value.workflowStageContent){l.error("Please enter Script.");return}let a=!1;r.mode==="new"?a=await U():a=await A(),a&&(k("get-workflow-stage-list"),w(),g.value&&(g.value.hide(),setTimeout(()=>{document.body.classList.remove("modal-open");const o=document.querySelector(".modal-backdrop");o==null||o.remove()},150)))},U=async()=>{try{const{data:a}=await Y(t.value);return a?(l.success("Registered successfully."),!0):(l.error("Failed to register."),!1)}catch{return l.error("Failed to register."),!1}},A=async()=>{try{const{data:a}=await Z(t.value);return a?(l.success("Updated successfully."),!0):(l.error("Failed to update."),!1)}catch{return l.error("Failed to update."),!1}};return(a,o)=>(f(),u("div",{class:"modal modal-blur fade",id:"workflowStageForm",tabindex:"-1","aria-hidden":"true",ref_key:"modalElement",ref:c},[e("div",oe,[e("div",ae,[e("div",le,[e("h3",se,h(r.mode==="new"?"New":"Edit")+" Workflow Stage",1),o[8]||(o[8]=e("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"},null,-1))]),e("div",re,[e("div",null,[e("div",ne,[e("div",ie,[o[10]||(o[10]=e("label",{class:"form-label required col"}," Workflow Stage Type ",-1)),r.mode==="new"?(f(),u("div",de,[e("input",{type:"checkBox",onChange:V},null,32),o[9]||(o[9]=e("label",{class:"ms-2"},"Add Workflow Type",-1))])):G("",!0)]),e("div",we,[S.value?T((f(),u("input",{key:1,type:"text",class:"form-control p-2 g-col-12",placeholder:"Please enter the Workflow Stage type you want to add","onUpdate:modelValue":o[1]||(o[1]=n=>t.value.workflowStageTypeName=n),onFocusout:o[2]||(o[2]=n=>I(t.value.workflowStageTypeName))},null,544)),[[_,t.value.workflowStageTypeName]]):T((f(),u("select",{key:0,"onUpdate:modelValue":o[0]||(o[0]=n=>t.value.workflowStageTypeIdx=n),class:"form-select p-2 g-col-12",onChange:B},[o[11]||(o[11]=e("option",{value:0},"Select Workflow Stage Type",-1)),(f(!0),u(L,null,H(y.value,(n,q)=>(f(),u("option",{value:n.workflowStageTypeIdx,key:q},h(n.workflowStageTypeName),9,ue))),128))],544)),[[O,t.value.workflowStageTypeIdx]])])]),e("div",fe,[o[12]||(o[12]=e("label",{class:"form-label required"},"Workflow Stage Name",-1)),e("div",ce,[T(e("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter the Workflow Stage Name","onUpdate:modelValue":o[3]||(o[3]=n=>t.value.workflowStageName=n)},null,512),[[_,t.value.workflowStageName]]),e("div",ge,[p.value?(f(),u("button",me,"Duplicate Check")):(f(),u("button",{key:0,class:"btn btn-primary chk",onClick:M},"Duplicate Check"))])])]),e("div",ke,[o[13]||(o[13]=e("label",{class:"form-label"},"Workflow Stage Description",-1)),T(e("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter the Workflow Stage Description","onUpdate:modelValue":o[4]||(o[4]=n=>t.value.workflowStageDesc=n)},null,512),[[_,t.value.workflowStageDesc]])]),e("div",Se,[o[14]||(o[14]=e("label",{class:"form-label required"},"Script",-1)),T(e("textarea",{rows:"10",class:"form-control p-2 g-col-11",placeholder:"Enter the Script","onUpdate:modelValue":o[5]||(o[5]=n=>t.value.workflowStageContent=n)},null,512),[[_,t.value.workflowStageContent]])])])]),e("div",pe,[e("button",{type:"button",class:"btn btn-link link-secondary","data-bs-dismiss":"modal",onClick:o[6]||(o[6]=n=>w())}," Cancel "),e("button",{type:"button",class:"btn btn-primary ms-auto",onClick:o[7]||(o[7]=n=>P())},h(r.mode==="new"?"Regist":"Edit"),1)])])])],512))}}),ye={class:"modal modal-blur fade",id:"deleteWorkflowStage",tabindex:"-1","aria-hidden":"true"},be={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},Ne={class:"modal-content"},Te={class:"modal-body py-4"},We={class:"modal-footer"},_e=C({__name:"DeleteWorkflowStage",props:{workflowStageName:{},workflowStageIdx:{}},emits:["get-workflow-stage-list"],setup(s,{emit:N}){const l=D(),c=s,g=N,r=async()=>{const{data:k}=await ee(c.workflowStageIdx);k?l.success("Deleted successfully."):l.error("Failed to delete."),g("get-workflow-stage-list")};return(k,i)=>(f(),u("div",ye,[e("div",be,[e("div",Ne,[i[2]||(i[2]=e("div",{class:"modal-status bg-danger"},null,-1)),i[3]||(i[3]=e("div",{class:"modal-header"},[e("h3",{class:"modal-title"},"Delete Workflow Stage"),e("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),e("div",Te,[e("h4",null,"Are you sure you want to delete "+h(c.workflowStageName)+"?",1)]),e("div",We,[i[1]||(i[1]=e("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),e("a",{href:"#",class:"btn btn-primary ms-auto","data-bs-dismiss":"modal",onClick:i[0]||(i[0]=W=>r())}," Delete ")])])])]))}}),xe={class:"card card-flush w-100"},Ie=C({__name:"WorkflowStageList",setup(s){const N=D(),l=d([]),c=d([]);E(async()=>{i(),await g()});const g=async()=>{try{const{data:w}=await K();l.value=w}catch(w){console.log(w),N.error("Failed to load data.")}},r=d(0),k=d(""),i=()=>{c.value=[{title:"Stage Type",field:"workflowStageTypeName",width:"27%"},{title:"Stage Name",field:"workflowStageName",width:"27%"},{title:"Stage Desc",field:"workflowStageDesc",width:"26%"},{title:"Action",width:"20%",formatter:W,cellClick:function(w,y){const b=w.target,S=b==null?void 0:b.getAttribute("id");r.value=y.getRow().getData().workflowStageIdx,k.value=y.getRow().getData().workflowStageName,S==="edit-btn"&&(m.value="edit")}}]},W=()=>` +import{_ as R}from"./TableHeader.vue_vue_type_script_setup_true_lang-Dy8u8xlP.js";import{s as v,_ as j}from"./request-CogRSUKp.js";import{d as C,u as D,w as $,o as E,M as z,r as d,c as u,a as e,t as h,j as G,b as T,v as O,F as L,e as H,f as _,g as f,h as F,i as x}from"./index-DbsXni7y.js";const J=()=>v.get("/workflowStageType/list"),K=()=>v.get("/workflowStage/list");function Q(s){return v.get("/workflowStage/"+s)}function X(s){return v.get(`/workflowStage/duplicate?workflowStageName=${s.workflowStageName}&workflowStageTypeName=${s.workflowStageTypeName}`)}function Y(s){return v.post("/workflowStage",s)}function Z(s){return v.patch(`/workflowStage/${s.workflowStageIdx}`,s)}function ee(s){return v.delete(`/workflowStage/${s}`)}function te(s){return v.get(`/workflowStage/default/script/${s}`)}const oe={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},ae={class:"modal-content"},le={class:"modal-header"},se={class:"modal-title"},re={class:"modal-body py-4"},ne={class:"mb-3"},ie={style:{display:"flex","justify-content":"start"}},de={key:0},we={class:"grid gap-0 column-gap-3"},ue=["value"],fe={class:"mb-3"},ce={class:"grid gap-0 column-gap-3"},ge={class:"col"},me={key:1,class:"btn btn-success",style:{margin:"3px"}},ke={class:"mb-3"},Se={class:"mb-3"},pe={class:"modal-footer"},ve=C({__name:"WorkflowStageForm",props:{mode:{},workflowStageIdx:{},workflowStageName:{}},emits:["get-workflow-stage-list"],setup(s,{emit:N}){const l=D(),c=d(),g=d(),r=s,k=N,i=F(()=>r.workflowStageIdx),W=F(()=>r.workflowStageName),m=d(!1);$(i,async()=>{b(),await w()}),E(async()=>{c.value&&(g.value=new z(c.value)),b(),await w()});const t=d({}),w=async()=>{m.value=!0,r.mode==="new"?(t.value.workflowStageIdx=0,t.value.workflowStageTypeIdx=0,t.value.workflowStageTypeName="",t.value.workflowStageName="",t.value.workflowStageDesc="",t.value.workflowStageContent="",t.value.workflowStageOrder=0,p.value=!1,S.value=!1,m.value=!1,console.log("isInitializing",m.value)):await Q(r.workflowStageIdx).then(a=>{t.value=a.data,p.value=!0,m.value=!1})},y=d([]),b=async()=>{try{const{data:a}=await J();y.value=a}catch(a){console.log(a)}},S=d(!1),V=async()=>{S.value=!S.value,t.value.workflowStageTypeIdx=0,t.value.workflowStageTypeName=""},B=async()=>{p.value=!1,y.value.forEach(a=>{t.value.workflowStageTypeIdx===a.workflowStageTypeIdx&&(t.value.workflowStageTypeName=a.workflowStageTypeName)}),await I(t.value.workflowStageTypeName)},I=async a=>{const{data:o}=await te(a);t.value.workflowStageContent=o[0].workflowStageContent},p=d(!1),M=async()=>{const a={workflowStageName:t.value.workflowStageName,workflowStageTypeName:t.value.workflowStageTypeName},{data:o}=await X(a);o?l.error("Name is already in use."):(l.success("Name is available."),p.value=!0)};$(()=>[t.value.workflowStageName,t.value.workflowStageTypeName],()=>{if(!m.value){if(W.value===t.value.workflowStageName){p.value=!0;return}p.value=!1}});const P=async()=>{if(!S.value&&(!t.value.workflowStageTypeIdx||t.value.workflowStageTypeIdx===0)){l.error("Please select Workflow Stage Type.");return}if(S.value&&!t.value.workflowStageTypeName){l.error("Please enter new Workflow Stage Type.");return}if(!t.value.workflowStageName){l.error("Please enter Workflow Stage Name.");return}if(!p.value){l.error("Please perform duplicate check.");return}if(!t.value.workflowStageContent){l.error("Please enter Script.");return}let a=!1;r.mode==="new"?a=await U():a=await A(),a&&(k("get-workflow-stage-list"),w(),g.value&&(g.value.hide(),setTimeout(()=>{document.body.classList.remove("modal-open");const o=document.querySelector(".modal-backdrop");o==null||o.remove()},150)))},U=async()=>{try{const{data:a}=await Y(t.value);return a?(l.success("Registered successfully."),!0):(l.error("Failed to register."),!1)}catch{return l.error("Failed to register."),!1}},A=async()=>{try{const{data:a}=await Z(t.value);return a?(l.success("Updated successfully."),!0):(l.error("Failed to update."),!1)}catch{return l.error("Failed to update."),!1}};return(a,o)=>(f(),u("div",{class:"modal modal-blur fade",id:"workflowStageForm",tabindex:"-1","aria-hidden":"true",ref_key:"modalElement",ref:c},[e("div",oe,[e("div",ae,[e("div",le,[e("h3",se,h(r.mode==="new"?"New":"Edit")+" Workflow Stage",1),o[8]||(o[8]=e("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"},null,-1))]),e("div",re,[e("div",null,[e("div",ne,[e("div",ie,[o[10]||(o[10]=e("label",{class:"form-label required col"}," Workflow Stage Type ",-1)),r.mode==="new"?(f(),u("div",de,[e("input",{type:"checkBox",onChange:V},null,32),o[9]||(o[9]=e("label",{class:"ms-2"},"Add Workflow Type",-1))])):G("",!0)]),e("div",we,[S.value?T((f(),u("input",{key:1,type:"text",class:"form-control p-2 g-col-12",placeholder:"Please enter the Workflow Stage type you want to add","onUpdate:modelValue":o[1]||(o[1]=n=>t.value.workflowStageTypeName=n),onFocusout:o[2]||(o[2]=n=>I(t.value.workflowStageTypeName))},null,544)),[[_,t.value.workflowStageTypeName]]):T((f(),u("select",{key:0,"onUpdate:modelValue":o[0]||(o[0]=n=>t.value.workflowStageTypeIdx=n),class:"form-select p-2 g-col-12",onChange:B},[o[11]||(o[11]=e("option",{value:0},"Select Workflow Stage Type",-1)),(f(!0),u(L,null,H(y.value,(n,q)=>(f(),u("option",{value:n.workflowStageTypeIdx,key:q},h(n.workflowStageTypeName),9,ue))),128))],544)),[[O,t.value.workflowStageTypeIdx]])])]),e("div",fe,[o[12]||(o[12]=e("label",{class:"form-label required"},"Workflow Stage Name",-1)),e("div",ce,[T(e("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter the Workflow Stage Name","onUpdate:modelValue":o[3]||(o[3]=n=>t.value.workflowStageName=n)},null,512),[[_,t.value.workflowStageName]]),e("div",ge,[p.value?(f(),u("button",me,"Duplicate Check")):(f(),u("button",{key:0,class:"btn btn-primary chk",onClick:M},"Duplicate Check"))])])]),e("div",ke,[o[13]||(o[13]=e("label",{class:"form-label"},"Workflow Stage Description",-1)),T(e("input",{type:"text",class:"form-control p-2 g-col-11",placeholder:"Enter the Workflow Stage Description","onUpdate:modelValue":o[4]||(o[4]=n=>t.value.workflowStageDesc=n)},null,512),[[_,t.value.workflowStageDesc]])]),e("div",Se,[o[14]||(o[14]=e("label",{class:"form-label required"},"Script",-1)),T(e("textarea",{rows:"10",class:"form-control p-2 g-col-11",placeholder:"Enter the Script","onUpdate:modelValue":o[5]||(o[5]=n=>t.value.workflowStageContent=n)},null,512),[[_,t.value.workflowStageContent]])])])]),e("div",pe,[e("button",{type:"button",class:"btn btn-link link-secondary","data-bs-dismiss":"modal",onClick:o[6]||(o[6]=n=>w())}," Cancel "),e("button",{type:"button",class:"btn btn-primary ms-auto",onClick:o[7]||(o[7]=n=>P())},h(r.mode==="new"?"Regist":"Edit"),1)])])])],512))}}),ye={class:"modal modal-blur fade",id:"deleteWorkflowStage",tabindex:"-1","aria-hidden":"true"},be={class:"modal-dialog modal-lg modal-dialog-centered",role:"document"},Ne={class:"modal-content"},Te={class:"modal-body py-4"},We={class:"modal-footer"},_e=C({__name:"DeleteWorkflowStage",props:{workflowStageName:{},workflowStageIdx:{}},emits:["get-workflow-stage-list"],setup(s,{emit:N}){const l=D(),c=s,g=N,r=async()=>{const{data:k}=await ee(c.workflowStageIdx);k?l.success("Deleted successfully."):l.error("Failed to delete."),g("get-workflow-stage-list")};return(k,i)=>(f(),u("div",ye,[e("div",be,[e("div",Ne,[i[2]||(i[2]=e("div",{class:"modal-status bg-danger"},null,-1)),i[3]||(i[3]=e("div",{class:"modal-header"},[e("h3",{class:"modal-title"},"Delete Workflow Stage"),e("button",{type:"button",class:"btn-close","data-bs-dismiss":"modal","aria-label":"Close"})],-1)),e("div",Te,[e("h4",null,"Are you sure you want to delete "+h(c.workflowStageName)+"?",1)]),e("div",We,[i[1]||(i[1]=e("a",{href:"#",class:"btn btn-link link-secondary","data-bs-dismiss":"modal"}," Cancel ",-1)),e("a",{href:"#",class:"btn btn-primary ms-auto","data-bs-dismiss":"modal",onClick:i[0]||(i[0]=W=>r())}," Delete ")])])])]))}}),xe={class:"card card-flush w-100"},Ie=C({__name:"WorkflowStageList",setup(s){const N=D(),l=d([]),c=d([]);E(async()=>{i(),await g()});const g=async()=>{try{const{data:w}=await K();l.value=w}catch(w){console.log(w),N.error("Failed to load data.")}},r=d(0),k=d(""),i=()=>{c.value=[{title:"Stage Type",field:"workflowStageTypeName",width:"27%"},{title:"Stage Name",field:"workflowStageName",width:"27%"},{title:"Stage Desc",field:"workflowStageDesc",width:"26%"},{title:"Action",width:"20%",formatter:W,cellClick:function(w,y){const b=w.target,S=b==null?void 0:b.getAttribute("id");r.value=y.getRow().getData().workflowStageIdx,k.value=y.getRow().getData().workflowStageName,S==="edit-btn"&&(m.value="edit")}}]},W=()=>`