Skip to content

CB-TUMBLEBUG v0.13.2 대응 및 보완사항 적용 - #101

Merged
MZC-CSC merged 111 commits into
m-cmp:mainfrom
MZC-CSC:develop
Sep 9, 2026
Merged

MZC-CSC merged 111 commits into
m-cmp:mainfrom
MZC-CSC:develop

Conversation

@MZC-CSC

@MZC-CSC MZC-CSC commented Sep 9, 2026

Copy link
Copy Markdown
Member

cb-tumblebug v0.13.2 대응

  • Infra/Template/Policy 부트스트랩 명령을 postCommand(단수 객체) → postCommands(phase 배열)로 전환. 구 필드는 무시되어 명령만 조용히 유실됨 (#257–#259)
  • Dynamic 경로 nodeUserPassword 폐지(v0.12.28). 비-dynamic PostInfra/PostInfraNode에는 v0.13.x에도 필드가 남아, Expert Mode(리소스 직접 선택) 가 패스워드 지정의 대체 경로 (#258, #260)
  • conf/api.yaml·프론트 operationId를 tumblebug 정본으로 통일: VNet CreateVNet→PostVNet 등 별칭 제거, 소문자-only 25건 케이싱, DataDisk/NLB/CommandStatus의 Vm→Node, Bastion 경로 파라미터 targetNodeId/bastionNodeId/bastionInfraId (#277, #279, #280, #286)
  • K8s Copy KubeConfig를 tumblebug CSP-native 엔드포인트로 전환. 백엔드에서 제거된 K8s Remote Command / PostFileToK8sCluster 정리 (#267, #268, #274)
  • Server Spec/Image CSP 조회 팝업: spider forward body·경로·응답 스키마 정정 (#288)
  • 프론트 API 모듈 명 mci→infra, pmk→k8s (tumblebug Infra 명명과 정합) (#289)

Added

  • 메뉴 카탈로그 재정의: priority/menunumber 체계, Members 항목 제거, 템플릿 id를 메뉴 id에 맞춤 (mciworkloads/pmkworkloads 등) (#281–#283)
  • 메뉴 아이콘 필드를 yaml/DB/UI에 연동 (#264)
  • Self mode(USE_IAM=false)에서 메뉴 목록을 로컬 yaml로 응답. IAM 없이 콘솔 메뉴 조회 가능 (#262, #284)
  • Setup Status 메뉴 재동기화를 명시적 force re-seed로 변경. IAM 최초 시드 가드와 맞춤 — 덮어쓰려면 force 필요 (#285)
  • Workspaces > Projects: 크로스-워크스페이스 프로젝트 관리 화면 (#265)
  • Groups 화면에 Platform Role 배정 UI (#253)
  • Infra JSON Export/Import: 기존 Infra 구성을 내보내고 NodeGroup으로 되가져오기 (#255)
  • Infra 배포 시 custom label (Infra/Node) + Node Password 편집 (#245)
  • Create Infra 마법사·Add Node에 Data Disk Attach 옵션 (#248)
  • Infra Review 실패 시 차단 대신 사용자 확인 (#247)
  • NLB 운영: Infra 탭 노드 Assign/UnAssign, NLBs 단건 조회·Edit·Health Checker (#252)
  • Cloud Drivers 조회 화면 보완, CSP definitions 화면 (#287)

Fixed

  • PMK 이미지 추천: matchedSpecId 누락, 중복 모달, OS Architecture read-only, 검색 osType 기본값 (#246, #270)
  • Cloud Resources Import: VNet/SSHKey operationId, CSP VNet/VM ForwardAnyReqToAny 요청 형식, Import 버튼 4화면 제거 (#249–#251)
  • Cloud Overview Resource Sync API (#254)
  • K8s NodeGroup 액션·AWS autoscaling (#256, #261)
  • unwrapResponse 204 No Content (#266)
  • MCI Spec 재선택 Apply (#271)
  • 모바일 네비게이션 toggler 복구, container-xl → container-fluid (#272, #273)

Chore / docs

  • README: mc-admin-cli 통합설치 안내, canonical 메뉴 소스 명시, 포트·링크 정정 (#275, #276)
  • webconsole_menu_permissions.csv 제거, menu export 파일명 타임스탬프 통일, selfiammenu.yaml 제거 (#263, #269, #278)

Migration notes

  • cb-tumblebug / mc-infra-manager v0.13.2 필요. 구버전은 postCommands, 정본 operationId, Bastion 파라미터명, kubeconfig native endpoint와 맞지 않음.
  • Dynamic Infra 생성 경로에서는 Node User Password를 넣을 수 없음. 지정하려면 Expert Mode(비-dynamic PostInfra).
  • K8s Remote Command 터미널 / 파일전송 API는 없음.
  • 메뉴 카탈로그: 메뉴 id/priority가 바뀜. IAM permission.yaml과 맞춰야 하며, 기존 DB 메뉴는 Setup Status force re-seed 또는 수동 갱신이 필요함.
  • Setup Status 재동기화: 기본 재동기화는 시드를 덮어쓰지 않음. 리셋하려면 force.
  • Self mode: USE_IAM=false이면 메뉴는 로컬 yaml. IAM 메뉴 API를 호출하지 않음.
  • Cloud Resources Import 버튼: 해당 4개 화면에서 제거됨.
  • API 경로 이름: 프론트에서 mci API 별칭이 infra로 바뀜. 북마크·외부 스크립트가 옛 경로를 쓰면 확인 필요.

yh-noh and others added 30 commits August 11, 2026 11:10
…ord 편집)

- Create Infra 카드에 Infra Labels 입력 블록 추가 — 기본 2종(project=mcmp,
  framework=mc-web-console)은 화면에 표시하지 않고 배포 시 코드에서 자동
  주입, 조회는 배포 후 Labels 탭에서. 사용자 label(key=value)은 Add/Remove
- NodeGroup 폼에 Node Labels 입력 블록 추가 — CreateNodeGroupDynamicReq
  label로 전송(Create/Extend 공유), 수정 모드 진입 시 기존 label 로드
- Node User Password를 모든 모드에서 입력 가능한 일반 입력으로 전환
  (기존엔 template 유래일 때만 read-only 표시) — 수정 모드 진입 시 기존
  값 로드, 초기화 시 리셋
- carry-through 섹션(zone/vNetTemplateId/sgTemplateId)은 template 유래
  값이 있을 때만 표시하도록 조건부 전환 — password·label이 일반 입력으로
  빠지며 상시 노출할 이유가 사라진 나머지 3필드만 대상
- 입력 검증 공통화: sys. prefix(백엔드가 시스템 label 덮어쓰기를 막지
  않음)·기본 label 키(Infra만)·중복 키·labelSelector 예약 문자(, = !) 차단
- mciDynamic/mciDynamicReview에 labels 파라미터 추가, Request top-level
  label 대칭 전송 — Done 단건 precheck 호출부 포함 3곳 모두 동일 전달
- Create 재진입·폼 초기화 시 label/password 입력 상태 리셋
feat: Infra 배포 시 custom label 설정 추가 (Infra/Node label + Node Password 편집)
…al from K8s page

- Image search sent no matchedSpecId because both setters store commonSpecId while the callers read a non-existent 'id' key (K8s and Infra paths alike) — read commonSpecId instead
- K8s Workloads page included the Infra image modal partial and its script on top of the K8s-only modal, loading imagerecommendation.js twice and building a hidden table plus modal listener that were never shown; removed the include, the duplicate script tag and the initImageModal() call
- Remove addNodeFormDone_btn(), referenced by no template
The field looked editable but never took effect: the K8s modal did not send osArchitecture at all, and once matchedSpecId is sent the server overrides provider/region/architecture with the spec's own values. Marking it read-only matches the provider/region fields already are, and keeps the search aligned with the selected spec.
…ment

Review is advisory — the deploy API never calls it — but the console treated an Error verdict as a hard stop: Done refused to add the NodeGroup and Deploy returned without sending the request. A single environmental failure (stock-out, missing dependency) is enough to mark a spec high-risk, which left users with no way through even when the configuration was fine.

Both points now show the reasons and let the user decide, matching how Warning already behaved. Confirmation stays at both steps since Done and Deploy mean different things, and Deploy summarises once instead of asking per node. All three paths now use the same modal, replacing the modal/toast/native-confirm mix, and a viable review with an unexpected status no longer falls through silently.
fix: 이미지 추천 화면 matchedSpecId 누락·중복 모달 제거·OS Architecture read-only
feat: Infra Review 실패시 차단 -> 사용자 확인으로 변경
Node Detail 탭에만 있던 Data Disk Attach를 Create Infra 마법사와
Add Node(Extend VM) 진입점에도 추가. 신규 API 없이 기존 disk_api.js를
재사용하고, NodeGroup 생성 성공 후 노드가 Running이 될 때까지 비동기로
대기했다가 attach를 실행하는 방식으로 구현했다(1차 범위: NodeGroup
Size 1개인 경우만 지원).

- 신규 disk 생성+attach / 기존 disk 선택 attach 두 모드 지원
- NodeGroup Size 2개 이상일 때는 disk attach 옵션 비활성화
- attach 작업은 sessionStorage에 기록되어 페이지 이동(Add Node 완료 후
  워크로드 목록으로 리다이렉트) 후에도 이어서 처리됨
- 페이지 새로고침 시 attach 요청이 중복 발생하지 않도록 가드 추가
feat: Create Infra 마법사·Add Node에 Data Disk Attach 옵션 추가
…된 요청 래핑 키 수정

import_api.js가 요청 바디를 body 키로 감쌌으나 BFF(CommonRequest)는 request 키를 기대해
Import 요청이 항상 빈 값으로 전달되고 있었다. 여기에 더해 registerCspVNet/registerCspSubnet/
registerCspResources가 호출하는 operationId(RegisterCspVNet/RegisterCspSubnet/
RegisterCspResourcesInNs)가 실제 mc-infra-manager 라우트 테이블에 존재하지 않아 항상 404였다.

request 키로 교정하고 operationId를 실제 등록된 이름(PostRegisterVNet/PostRegisterSubnet/
RegisterCspNativeResources)으로 교체해 Networks(VNet)와 SSH Keys 화면의 Import가 정상
동작하도록 수정. Security Groups/Disks/Node Import는 백엔드 옵션 의존성·요청 구조 자체가
달라 이번 수정 범위에서 제외.
fix: Cloud Resources Import VNet/SSHKey operationId 보완
- NLB 생성은 Cloud Resources > NLBs 화면으로 일원화
- Assign: 기존 NLB 선택 + 미할당 노드 다중 선택 → AddNLBVMs (기할당 제외, 비Running 비활성)
- UnAssign: 선택한 NLB의 할당 노드 해제 → RemoveNLBVMs
- 목록 Assigned Nodes 컬럼·Detail Assigned Nodes 항목 추가
- targetGroup 필드 nodes/vms, nodeGroupId/subGroupId 폴백 처리
Import VNet 모달의 미관리 VNet 목록 조회(getCspVNets)와 getCspVMs가
ForwardAnyReqToAny를 queryParams.targetUrl/method로 호출했으나, 이 엔드포인트는
실제로 resourcePath: /forward/{path} pathParam 기반이라 경로가 치환되지 않은 채
요청돼 항상 400이었다.

pathParams.path("vpc"/"vm")로 CB-Spider 대상 경로를 지정하고, request에
CB-Spider가 요구하는 PascalCase 필드(ConnectionName)를 담도록 수정. Playwright
검증으로 미관리 VNet 체크박스 목록이 실제로 렌더링됨을 확인.
…Edit 추가

- loadNlbInNsList() 신설: GetAllNLBInNs 단일 호출로 목록 구성 (기존 loadNlbList N+1 집계는 폴백용 유지)
- Edit selected: 정확히 1개 선택 → Edit 모달에서 할당 노드 해제/미할당 노드 추가 (AddNLBVMs/RemoveNLBVMs 순차 호출)
- 백엔드 필드명 편차 흡수: Type/Scope(대문자 키), targetGroup.nodeGroupId/nodes 폴백 접근자
  → 항상 '-'로 표시되던 Type/Scope/Target NodeGroup 컬럼·Detail 수정
- 목록 Assigned Nodes 컬럼, Detail Assigned Nodes 항목 추가
- api.yaml GetAllNLBInNs 등록, nlb_api.getAllNLBInNs 추가
… 결정)

- interval/timeout/threshold 입력(0 = provider default) 신설, 기존 0/0/0 하드코딩 대체
- Infra 선택 시 GetNLBSupport(supports[provider])로 커스텀 미지원 필드 비활성 + 안내 (예: AWS timeout)
- 지원 정보 조회 실패는 전 필드 활성으로 폴백 — 생성 차단 없음
- api.yaml GetNLBSupport 등록, nlb_api.getNLBSupport 추가, getInfraList가 provider 보존
Networks/Security Groups/Disks/SSH Keys 화면의 "Import" 아이콘 버튼은 CSP 리소스
등록(Registration) 기능인데, Settings > Cloud Resources > Resource Sync 화면이
동일 기능을 커넥션+리소스타입 단위로 이미 더 넓은 범위로, 올바른 API로 구현하고
있어 중복이었다.

카드 헤더 툴바의 Import 버튼만 제거. 모달 마크업과 관련 JS 함수(import_api.js
포함)는 향후 재사용 가능하도록 그대로 둔다.
…port-btn

fix: Cloud Resources 4개 화면의 Import 버튼 제거
fix: CSP VNet/VM 목록 조회(ForwardAnyReqToAny) 요청 형식 오류 수정
- 같은 Infra면 재조회를 건너뛰던 캐시로, 다른 화면(NLBs Edit 등)에서 노드 할당이
  바뀐 뒤 탭이 옛 목록(할당 노드 수 불일치)을 계속 보여주던 문제 수정
- 배포 백엔드가 Type/Scope를 대문자 키로 내려줘 빈칸이던 컬럼·상세·필터를 _type/_scope 정규화 필드로 표시
- Listener IP/DNS·CSP Resource ID의 ellipsis span에 Bootstrap 툴팁 부착 (즉시 표시, 재렌더 시 인스턴스 정리)
- 긴 DNS/ARN이 한눈에 보이도록 툴팁 폭 확장·강제 줄바꿈 스타일 추가
Settings > Cloud SPs > Cloud Overview 의 Sync 버튼이 서로 독립적인 결함 5개가
겹쳐 항상 실패하던 문제를 수정한다.

1. import_api.js 의 registerCspResources() 가 conf/api.yaml 에 존재하지 않는
   operationId RegisterCspResourcesInNs 를 호출 → cspimport_api.js 의
   registerCspNativeResources() (RegisterCspNativeResources) 로 교체
2. 같은 함수가 요청 바디를 body: 로 감싸는데 BFF CommonRequest 는 request: 를
   기대 → 교체된 함수가 request: 를 사용하므로 함께 해소
3. 자원유형 체크박스 value 가 vm 이나 cb-tumblebug 허용 옵션은 node →
   value 와 결과 표 키를 node 로 정정
4. option 쿼리파라미터를 배열로 넘겨 option=a&option=b 로 직렬화되는데
   cb-tumblebug 은 c.QueryParam("option") 으로 첫 값만 읽고 콤마로 분리한다.
   따라서 첫 자원유형만 처리되거나 선행 의존성 검증에 걸려 실패 →
   cspimport_api.js 에서 콤마로 이어붙인 단일 문자열로 전송
5. Connection 드롭다운을 mc-iam-manager CSP 계정 목록으로 채우는데 이 모델에는
   connectionName 이 없어 계정 이름이 전달되고, cb-tumblebug 은 이를 200 +
   전 항목 0건으로 조용히 넘긴다 → mc-infra-manager ConnConfig 목록으로 교체

추가로 cb-tumblebug 의 자원유형 선행 의존성(dataDisk→node,
node→securityGroup+sshKey, securityGroup→vNet)을 요청 전에 검증해 안내하고,
응답의 systemMessage 를 결과 영역에 노출한다. 결과 표는 선택한 자원유형만
표시한다.

cb-spider 직접 접속 없음 — RegisterCspNativeResources / GetConnConfigList 모두
mc-infra-manager(cb-tumblebug) 자체 API 다.
Settings > Cloud Resources > Resource Sync 의 동기화 실행이 All 모드에서 항상
실패하던 문제를 수정하고, 선행 의존성 검증을 Cloud Overview 와 공유한다.

- All 모드 자원유형 목록에 cb-tumblebug 이 지원하지 않는 vm 이 들어 있어
  unsupported option: 'vm' 로 요청 전체가 실패했다 → node 로 정정
- Partial 모드는 조합에 따라 선행 의존성 검증(dataDisk→node,
  node→securityGroup+sshKey, securityGroup→vNet)에 걸려 500 이 났다 →
  요청 전에 확인해 안내하고 중단
- 의존성 정의·라벨·검증 함수를 cspimport_api.js 로 옮겨 Cloud Overview 와
  공유한다 (cloudoverview.js 의 중복 정의 제거)
- InspectResourcesOverview 응답의 자원유형을 vm→node 로 바꾸던 매핑은
  실제 응답이 node(model.StrNode)라 도달하지 않는 코드여서 제거
- 실행 버튼 라벨을 Run Sync 로 영문화
cb-tumblebug 이 받는 자원유형은 node 이며 vm 은 CB-Spider 쪽 타입명이다
(model.StrNode="node" / model.StrSpiderVM="vm"). InspectResources 는 vm 을
"Invalid resourceType: vm" 으로, registerCspResources 는 "unsupported option: 'vm'"
으로 거부한다.

- csp.js: 미등록 자원 조회 타입 목록, 등록 해제 switch, 대상 체크박스 셀렉터,
  등록 분기의 vm 을 모두 node 로 정정. csp.html 체크박스 value 도 함께 변경
- cspschedule.js/html: 모달 체크박스 value 와 선택 판정을 node 로 정정
- 스케줄 생성 페이로드의 mciFlag/mciNamePrefix 를 infraFlag/infraNamePrefix 로
  정정. model.ScheduleJobRequest 가 쓰는 필드명이 달라 Node 이름 접두어가
  스케줄러에 전달되지 않고 조용히 버려지고 있었다
- cspschedule.js 커넥션 드롭다운이 ConnConfig 의 configName 을 읽지 않아
  전부 [object Object] 로 표시되던 문제 수정

Cloud Overview Sync:
- 대상 프로젝트가 현재 선택된 프로젝트로 고정돼 있어 관리자가 다른 프로젝트로
  등록할 수 없었다. 읽기전용 입력을 NS 선택 드롭다운으로 교체하고,
  현재 워크스페이스의 프로젝트는 이름을 함께 표시한다
- 대상 프로젝트를 모달에서 고르므로 현재 프로젝트 선택 여부로 버튼을 비활성화하지
  않는다. 비활성처럼 보이던 회색 버튼을 outline-primary 로 변경
- Listener IP/DNS·CSP Resource ID를 NLBs 화면과 동일한 truncate+tooltip+copy 렌더로 교체
- renderTruncatableCopyable 복제 (페이지 간 공통 모듈화는 회귀 위험으로 보류)
CSP Overview·CSP Schedule(RQ-CLOUD-ADMIN-007, 2026-04-07)은 2주 뒤 추가된
Resource Sync(RQ-CLOUD-ADMIN-005, 2026-04-22)와 미등록 자원 조회·등록 범위가
겹친다. Resource Sync 가 provider/region 필터와 다중 커넥션까지 더 넓게 커버하므로
두 화면의 고유 기능만 탭으로 옮기고 화면과 메뉴를 제거한다.

Resource Sync 탭 구성: Sync Status / Resources / Schedule / Sync Result / NS Sync

- Resources 탭 — 미등록 자원 개별 조회·선택 등록, 등록 자원 해제
  조회 대상을 Provider + Region 선택으로 좁힌다. 구 화면은 진입 즉시 전 커넥션
  177개 × 4타입 = 708회 InspectResources 를 호출했다
- Schedule 탭 — 스케줄 목록·생성·일시중지·재개·삭제, 실행 이력
- 등록 시 선행 의존성(securityGroup→vNet 등)을 자동으로 채워 요청한다.
  개별 등록 API 가 없는 securityGroup/sshKey 는 connection 단위로 등록하며,
  이때 필요한 선행 유형이 추가되면 사용자에게 알린다

이관 과정에서 함께 고친 것:
- 커넥션 드롭다운이 ConnConfig 의 configName 을 읽지 않아 전 항목이
  [object Object] 로 표시되던 문제 (구 csp.js). 이 값이 조회 대상이라
  미등록 자원 목록이 채워질 수 없었다
- deregisterVNet 이 withSubnets 쿼리 파라미터를 보내지 않아 서브넷이 있는 vNet
  등록 해제가 "has N subnet(s); set withSubnets=true" 로 실패하던 문제
- 미등록 자원 필터 체크박스가 vm 값을 써서 node 행이 걸러지던 문제

메뉴에서 csp/cspschedule 제거. selfiammenu.yaml 과 menu permissions csv 에는
원래 없어 변경 없음.
feat: NLB 운영 기능 정비 — Infra 탭 노드 Assign/UnAssign 전환 + NLBs 화면 단일 조회·Edit·Health Checker 입력
securityGroup / sshKey 는 개별 등록 API 가 없어 connection 단위로만 등록된다.
선택한 한 건이 아니라 해당 connection 의 그 유형 전체(및 선행 유형)가 등록되는데
이 사실이 실행 전에 드러나지 않았고, 결과 표시도 실제 등록 건수를 말해주지 않았다.

- 등록 전 확인: 대상 Namespace/Connection/자원유형과 "선택한 행이 아니라 전체가
  등록된다"는 점을 알리고 취소할 수 있게 한다. 개별 등록이 가능한 vNet/Node 만
  선택한 경우에는 확인창을 띄우지 않는다
- 결과 집계: 응답의 registerationOverview 를 자원유형별로 합산해 표시한다.
  기존에는 API 호출 성공 수를 세어 132개가 등록돼도 "1 succeeded" 로 보였다
- 실패 반영: registerationOverview.failed 와 registerationOutputs 의 [Failed]
  항목을 읽는다. 기존에는 200 이면 내부 실패가 있어도 성공으로 처리했다
- 409(이미 등록됨)는 실패로 세지 않는다
그룹에 Platform Role을 직접 배정하는 UI를 Settings > Organizations > Groups
상세 패널에 신설했다. 백엔드(assignGroupPlatformRole/getGroupPlatformRoles)와
BFF 프록시 등록은 이미 있었으나 프론트에 대응 UI가 전혀 없어 사용할 수 없었고,
Users 화면에는 이미 사용자 단위 Platform Role 배정 UI가 있어 비대칭 상태였다.

배정한 role은 mc-iam-manager FindEffectivePlatformRolesByUserID에서
source='group:{그룹명}'으로 소속 사용자 전원에게 상속되므로, 영향 범위를
3중으로 고지한다 — 상세 패널 배너, 모달 경고(역할 선택 시 영향 인원수),
Assign 시 confirm.

- groups_api.js: getGroupPlatformRoles, assignGroupPlatformRole 신설
- groups.html: Platform Roles 섹션(상속 배너 포함), Assign 모달, roles_api 로드
- groups.js: 목록 조회·배정, users.js의 filterRolesByType 패턴 재사용해
  platform 타입·미배정 role만 제시. 409/404 구분 안내

Platform Role 해제와 Workspace Role 배정은 필요한 오퍼레이션 9종이
conf/api.yaml에 미등록이라 별도 작업으로 분리했다.
BFF(proxy.go)는 c.JSON(resp.StatusCode, NewCommonResponse(...))로 응답하면서
status.message에 HTTP 상태문구를 넣고 백엔드 원본 에러는 responseData.error에
담는다. 에러 메시지 추출이 status.message를 먼저 보고 있어 일반 문구가
구체적 원인을 덮었다.

실측 사례 — 그룹에 workflow 계열 역할(wfoperator/wfadmin)을 배정하면
mc-iam-manager가 "realm role 'wfoperator' not found in Keycloak"으로 500을
반환하는데, 화면에는 "Internal Server Error"만 떠서 원인을 알 수 없었다.

responseData.error를 우선 참조하도록 순서를 바꿔 배정·조회 양쪽에 적용했다.
feat: Groups 화면에 Platform Role 배정 UI 추가
MZC-CSC and others added 29 commits September 2, 2026 16:54
DataDisk(Get/Post/Put)와 CommandStatus/SshHostKey 계열, NLB 노드 배정,
CSP Native 등록 등 11개 operationId가 cb-tumblebug 실제 스펙(Node 기준)과
어긋나 있던 것을 최신 스웨거 대조 후 정정. resourcePath는 이미 node
기준이라 기능 장애는 아니었으나 RegistryCache 동적 조회 경로에서는
깨지는 네이밍 기술부채였음. 실사용처 없는 죽은 함수 getVmDataDisk는 제거.
MC_WEB_CONSOLE_USE_IAM=false 로컬 메뉴 폴백은 f1a59103에서
webconsole_menu_resources.yaml을 참조하도록 구현되어 있었고,
selfiammenu.yaml은 코드/문서 어디서도 참조되지 않는 leftover였다.
VNet(CreateVNet→PostVNet, DeleteVNet→DelVNet), readyz-init
(GetInfraReadyzInit→SetSystemInitialized) 등 cb-tumblebug 실제
operationId와 다른 이름으로 지어낸 별칭 16개를 정본 이름으로 통일.
실제 호출되는 3건은 vpc_api.js/readyz_api.js의 operationId 문자열을
교체(함수명은 유지)하고, 같은 원인으로 추가됐지만 호출되지 않는
나머지 13건은 conf/api.yaml에서 삭제.

CreateVNet/DeleteVNet은 ADMINCLI-TECH-016(mc-admin-cli 번들 api.yaml
누락으로 인한 404 사고)의 재발을 구조적으로 예방한다.
api_spec.go의 GetAction()이 대소문자 무시 매칭이라 지금까지 조용히
동작해온 소문자-only operationId 25건을 8개 파일에서 정본 케이싱으로
교체(함수명은 유지). CreateOrUpdateLabel/GetLabels/RemoveLabel/
GetResourcesByLabelSelector(mci_api.js), DeleteK8sNodeGroup/
GetK8sCluster/GetVNet/GetAllSecurityGroup/GetAllSshKey/
PostK8sClusterDynamic(CheckRequest)/PostK8sNodeGroup(pmk_api.js/pmk.js/
requestId.js), Del/Get/PostImage(serverimage_api.js), Del/Fetch/Get/
PostSpec(serverspec_api.js), Del/GetAll/Get/PostSshKey(sshkey_api.js),
Del/GetAll/Get/PostSecurityGroup(securitygroup_api.js).

conf/api.yaml은 변경 없음 — 정본 키가 이미 존재해 손댈 것이 없었다.
진행 중인 operationId 정본화 원칙의 직접적 연장.
fix: 소문자-only operationId 25건을 cb-tumblebug 정본 케이싱으로 통일
vpc_api.js의 del()이 DELETE /ns/{nsId}/resources/vNet/{vNetId} 호출 시
action 쿼리파라미터(enum: withsubnets/force)를 전혀 보내지 않아, 서브넷이
있는 VNet 삭제 시 500(has N subnet(s); use action=withSubnets or
action=force)이 발생했다. 콘솔에서 생성하는 VPC는 Create 시 서브넷을
항상 포함하므로 콘솔 생성 VPC는 예외 없이 삭제가 실패하는 상태였다.

action: 'withsubnets'를 항상 포함해 VNet과 서브넷을 함께 삭제하도록
수정. 서브넷이 없는 VNet에도 안전하다.

실제 AWS 리소스로 재현: action 없이 500 확인 → action=withsubnets로
200 확인 (테스트용 VPC+subnet 생성 후 정리 완료).
- Data Migrations/Workflows/SW Catalogs 등 신규 메뉴 정리 및 하위 항목 확장
- 같은 부모 아래 priority를 1부터 순차 부여 (중복/역전 정리)
- menunumber를 4자리 체계로 재정의: 천의자리=대분류(Settings/Operations),
  백의자리=중분류(그 하위 컨테이너), 나머지=소분류(하위 전체 depth-first 순번)
feat(menu): 메뉴 priority/menunumber 체계 재정의
Members는 독립 페이지가 아니라 workspaces.html 상세 화면의 탭(#workspace-members)이라
isaction:true로 클릭 시 404가 나는 상태였음. 메뉴에서 제거하고 이후 항목 priority/menunumber 재정렬.
fix(menu): Members 메뉴 항목 제거
… rename

메뉴 카탈로그(#281)에서 id가 mciworkloads/pmkworkloads -> infraworkloads/k8sworkloads로
바뀌었는데 front 템플릿 파일명과 하드코딩된 리다이렉트 경로는 그대로 남아 있어
사이드바에서 Infra Workloads/K8s Workloads 클릭 시 404가 나는 상태였음.

- workloads/mciworkloads.html -> infraworkloads.html
- workloads/pmkworkloads.html -> k8sworkloads.html
- const.go, mci_api.js, mcicreate.js, mci_dashboard.js의 하드코딩 리다이렉트 7곳 경로 갱신
fix(web): rename mciworkloads/pmkworkloads templates to match menu id rename
With MC_WEB_CONSOLE_USE_IAM=false only GetAllAvailableMenus was served from
the local catalog; Getmenuresources (menus/roles screens) and listMenus
(setup status) were still proxied to mc-iam-manager and failed. Self mode
means full menu == role menu, so all three now share the local handler.

The local list also drops the IAM-only screens (Menus, Roles, CSP Roles,
Cloud Overview / Setup Status) and their descendants, since those call
mc-iam-manager management APIs that do not exist in self mode.

README: describe how the canonical catalog is consumed per mode (seeded
once into IAM at install, then DB-edited; read directly in self mode).
Menus are seeded from yaml once at install and then edited in the DB, so
the Setup Status "Re-sync ▶ Menu" button (a bare initial-menus call that
upserted every column) silently overwrote those edits. It is now
"Force re-seed ▶ Menu": asks for confirmation, sends ?force=true so
mc-iam-manager backs up role-menu mappings first, and shows the server's
result (skipped / registered count / backupPath / orphan ids /
missingPermissionMenuIDs) inside the card.

setup-yaml-check reports sourceType=local (no probe) when
MC_WEB_CONSOLE_MENUYAML is a mounted path instead of a URL, and the card
shows "Seed source: local (mounted copy)" instead of a failed reachability
badge.
…menus

feat(menu): answer all menu list queries locally in self mode
…ce-reseed

feat(setup-status): make menu re-sync an explicit force re-seed
…eanup

fix: mc-web-console operationId 별칭을 cb-tumblebug 정본으로 통일
targetVmId/bastionVmId/bastionMciId → targetNodeId/bastionNodeId/bastionInfraId
(GetBastionNodes, SetBastionNodes*, RemoveBastionNodes*)
…m-rename

fix: Bastion API 7종 operationId 파라미터명을 cb-tumblebug 정본으로 정정
Cloud Drivers 화면의 4개 기능이 cb-spider 전용 operationId를
mc-infra-manager subsystem으로 호출해 프록시 단계에서 404로 실패하고 있었다.
cb-spider 직접 호출은 원칙상 불가하므로 cb-tumblebug 경유 수단으로 재구성한다.

- Cloud Drivers: ForwardAnyReqToAny(GET 전용)로 조회 복구, 읽기 전용화
  등록/해제는 forward가 GET만 지원해 제공 불가
- CSP Definitions 신규: GetCloudInfo/RegisterCspDefinition/UnregisterCspDefinition
  등록 시 cb-tumblebug이 cb-spider에 driver와 region/zone을 대신 등록한다
- cloudPlatform이 비어 있으면 provider 자신이 플랫폼이므로 그대로 표시
- 500 응답 본문에 사용자 사유가 담기는 호출은 suppressErrorToast로
  공용 일반 오류 토스트를 억제하고 서버 메시지를 노출
feat(cloudsps): CSP Definitions 화면 신설 및 Cloud Drivers 조회 복구
ForwardAnyReqToAny로 cb-spider 목록을 가져오는 두 팝업이 상시 실패하고 있었다.
원격 백엔드 대조로 원인 4건을 확정하고 정정한다.

- 요청 body 누락 → tumblebug이 body를 JSON 파싱하므로 400 실패
- path의 spider/ 접두사 중복 → SpiderRestUrl이 이미 /spider로 끝나 404
- path 복수형 오기 → cb-spider 실제 라우트는 /vmspec, /vmimage
- ConnectionName을 queryParams로 전달 → forward는 쿼리스트링을 전달하지 않아 body로 이동

호출이 성공해도 화면이 비어 있던 문제(응답 스키마 불일치)도 함께 정정한다.

- spec 컬럼: Name / VCpu.Count / MemSizeMiB (MiB→GiB 환산, 소수 유지)
- image 컬럼: IId.SystemId / OSDistribution
- 행 선택 시 등록 모달 필수값이 빈 값으로 채워지던 문제 해결

추가로 spec 조회 팝업에 Provider 선택 단계를 둔다. 연결이 8개 CSP에
177개라 단일 목록에서 고를 수 없었다. Provider 미선택 시 Connection은
비활성이며, Provider 변경 시 목록과 결과 테이블을 초기화한다.
fix(cloudresources): Server Spec/Image의 CSP 조회 팝업 보완
Infra Workloads/K8s Workloads 등 여러 화면이 공유하는 VM/MCI lifecycle·
status API 래퍼 파일명을 프로젝트의 MCI→Infra 용어 매핑에 맞춰 변경.
기존 infratemplate_api.js와 접두사 통일.

webconsolejs['<경로>'] 문자열 키 기반 모듈 호출 구조상, 파일을 로드하는
템플릿의 javascriptTag() 12곳과 이를 호출하는 JS 20개 파일의
webconsolejs['common/api/services/mci_api'] 참조를 모두
'common/api/services/infra_api'로 함께 치환.

WEB-BUG-028(용어 변경 잔존 정리) 범위 중 이 한 파일만 우선 완결 —
pmk_api.js/mci.js/pmk.js 등 나머지 24개 파일은 별도 후속 작업.

검증: npm run build 성공(매니페스트에 infra_api 엔트리 확인),
Playwright로 Infra Workloads/K8s Workloads 페이지 로드해
infra_api.js 정상 로드·mci_api 잔재 없음·관련 콘솔 에러 없음 확인
(K8s 페이지의 mc-infra-manager 500 에러는 원격 백엔드 이슈로 무관 확인)
pmk_api.js → k8s_api.js, mci.js/pmk.js 페이지 컨트롤러 → infraworkloads.js/
k8sworkloads.js(각자 템플릿과 짝 맞춤, 디렉토리는 legacy 위치 유지 —
templates/pages/operations/manage/workloads/와의 경로 불일치는 별도 이슈),
그 외 partials 8개(mcicreate/mcilabels/mcinlb/mciserver_summary/mci_dashboard/
mciserver/pmk_imagerecommendation/pmk_serverrecommendation)와 대응 템플릿
13개를 모두 infra*/k8s*로 rename하고 참조 체인(javascriptTag/partial/
webconsolejs 모듈 키) 전부 갱신.

DOM id 등 파일 내부에서만 쓰이는 식별자는 그대로 둠(rename과 무관하게
자기완결적으로 동작, 별도 스코프).

검증: npm run build 성공, Playwright로 Infra Workloads(스크립트 47개)/
K8s Workloads(32개)/Disks(25개)/NLBs(23개) 전 화면 로드 확인 —
mci/pmk 이름 스크립트 0, 신규 에러 없음
…a-api

refactor(web): mci → infra 명 변경.
@MZC-CSC
MZC-CSC merged commit 887be41 into m-cmp:main Sep 9, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants