Repository navigation
[Europa][4.23][S7] UI·브랜딩·한국어 및 릴리즈 문서 통합 #998
Description
목적과 범위
부모 Epic: #987
독립 UI/UX·현지화·브랜딩 변경을 반영하고 S3~S6 기능별 UI 누락을 통합 검토한다. 기능 소유 이슈가 API/DB/UI를 함께 적용하며 이 이슈는 최종 사용자 흐름 정합성을 책임진다.
기준과 선행 조건
- Europa 시작:
014895d8f3dc2f062f379b51ee62d36a0adae88a - Apache 범위:
3166e64891fc75d4d32b66d874cff3f613b09b52..463f8d0294702a920e8020b62ae3b67f52ae1473(4.23.0.0) - 작업 코드:
S7 - 선행/연계: [Europa][4.23][S1] 원본 커밋 추적표·merge 해결 내역·의존성 기준 확정 #989, [Europa][4.23][S2] Rocky 9.8 검증 기반·빌드 의존성·CI 및 라이선스 정비 #990
- S2는 전체 이슈 종료가 아니라
baseline_ready게이트(기준 실패 분리·검증 환경 확보)를 착수 조건으로 한다. 기능별 소스/DB/API 의존성은 추적표가 우선한다. - 현재 상태: DONE — PR [Europa][4.23][S7] UI·로그인 테마·동일 버전 DB 및 릴리즈 문서 통합 #1039·fix(build): restore Veeam build and license checks after S7 merge #1040 정상 병합·자동 검증·원격/로컬 동기화 완료
완료 기준
- ABLESTACK 브랜딩·한국어·light/dark 테마·권한별 메뉴가 유지된다.
- API 키/KMS/Quota/DNS 등 기능 UI가 최종 API 계약과 일치한다.
- 삭제 확인·whitelabel 로그인·계정/템플릿/네트워크 화면의 회귀를 검증한다.
- 지원 기능/범위 제외/알려진 제약·설정 변경·업그레이드 가이드를 릴리즈 노트에 기록한다.
검증
UI lint·unit·정식 production build 및 로그인/관리자/일반 사용자 핵심 E2E. 로컬 소스맵 제외 빌드를 공식 build 성공으로 대체하지 않는다.
공통 진행 규칙
- 해당 작업 코드의 원본 SHA는 Epic의
developer/history/추적표로 관리한다. 원본 SHA별 판정/PR/적용 SHA/검증 근거를 갱신한다. - 체리픽·적응 수정은 원본 의도와 Europa 계약을 보존하며, patch-id/같은 제목/역적용 성공만으로 완료 처리하지 않는다.
- PR base는
ablecloud-team/ablestack-cloud:ablestack-europa이다. PR은 이 하위 이슈를 연결하고 부모 Epic을 자동 종료하지 않는다. - 소스/Git/설치/로컬 검증은 Docker 내부에서 진행하며, 공식 산출물은 Actions 결과를 사용한다. 기존 DB/볼륨은 초기화하지 않는다.
- 구현·병합·검증이 완료되면 부모 Epic의 진행표와 추적표를 함께 갱신한다. 새로운 발견과 범위 변경 근거는 코멘트로 남긴다.
S1 확정 추적 자료 (2026-09-10)
- 초기 추적 기준 / 299개 inventory / 의존성
- 이 이슈의 직접 배정 원본 SHA: 8개.
workstream=S7로 필터링한다. 관련 기능 변경은related_workstreams와 의존성도 함께 확인한다. - merge 해결 분석: merges.tsv. S2가 19개를 총괄하고 기능 소유 이슈가 공동 검증한다.
- 사용자 확정 DB 출발점:
014895d8f3; 신규 설치·기존 데이터 업그레이드·동일 버전 재실행을 검증한다. - S1 작성 당시 원본은 Pending이었다. S7 최종 판정은 아래 완료 기록을 따른다.
코드 통합 완료와 실물 테스트 인수 (2026-09-11)
사용자 확정 및 Epic #987의 공통 원칙: 이 기능 이슈는 Apache 변경을 Europa 코드에 안전하게 통합하고 코드 검토·자동 테스트·CI를 통과한 뒤 정상 병합하는 것을 완료 기준으로 한다. 본문에 포함된 실물 환경 테스트는 코드 병합의 선행 조건이 아니다. 실물 미실행을 이유로 기능 PR을 Draft로 유지하거나 기능 이슈 종료를 보류하지 않는다.
이 배치에서 필요한 실물 시나리오·기대 결과·미확인 위험은 #1025에 누적한다. 모든 기능 코드 병합 후 최종 SHA에서 S8 #999가 실행·판정한다. 미실행을 PASS로 표시하지 않으며 최종 RC/릴리즈 게이트는 유지한다.
S6 완료 기준 인수
PR #1037 병합 SHA f1b520f. DB 출발점 014895d 유지. 검증 보고 · 원본44개 판정 · 공유 merge · DB 결과 · 후속 계약 · 전체299개.
- S7 직접8개와 S2 잔여4개를 후속 검토한다. 공유 merge fb5e24f / b3b9caddc191은 각각 8e933b7 / a951ac61d090의 기능 완료 후 판정한다.
- 기존 Complete S4/S5A/S5B/S5C/S6 DB 단계를 수정해 기존 설치에 다시 적용될 것으로 가정하지 않는다.
- DNS/Network Extension UI와 Europa Storage Service·DR·Desktop·Automation, NIC link-state·VPN 설정 제외/편집값, throttle10000 기본을 보존한다.
- 실물 시나리오는 #1025에 누적하며 코드 PR은 자동 검증 후 정상 병합한다. 최종 실물 시험은 #999에서 실행한다.
S7 코드 통합 완료 (2026-09-11)
PR #1039 및 후속 호환 PR #1040 정상 병합. 최종 병합 SHA ec2a659, 최종 호환 PR HEAD 7e1f24c.
ablecloud-team/upstream Europa, dhslove/origin Europa와 로컬 codex/ablestack-cloud-dev를 같은 SHA로 동기화했다. 검증 보고 · 원본10행 · DB 결과 · 릴리즈 노트 · 전체299개.
- S7 원래 검증 HEAD fe4a198eea6161790e2ba3ce48097de53ac1524e는 #1039의 88d3be1090af51fcb5daec77fc8de3a83926dcf9로 병합됐다. 그 직전 별도 Veeam #1038이 들어와 실제 첫 부모가 03a26033ef로 바뀌었다. S7 파일 보존과 자동 merge-tree 일치를 확인했고, Veeam의 4.22 부모 POM 및 compiler 전체 override 문제를 #1040에서 최소 수정했다. 함께 들어온 텍스트15개의 라이선스 헤더와 raw key 데이터의 정확한 RAT 제외 경로를 정리해 미승인0개를 확인했다. 실행 코드/설정 값과 키는 변경하지 않았다. 변경된 mount helper에 맞춰 구형 mock을 수정하고 실제 실패 응답과 임시 디렉터리 정리를 검증했다. 복원14/KVM972/이전 미실행 의존223 tests도 통과했다. 기본/noredist effective POM,179개 reactor install,기본 clean18/noredist22 tests와 실제 합쳐진 UI382 tests가 통과했다.
- 직접 원본8개 Applied4 / Adapted4, 공유 merge2개 Already Satisfied. 고정299개는 Applied101 / Adapted106 / Already Satisfied62 / Excluded28 / Pending2다.
- 프로젝트 삭제 이름 확인·준비된 이미지 배포·계정 링크·SAML MS cookie·검색 아이콘·번역을 통합했다. 기존 CSV/일괄 흐름, 프로젝트 계정명과 ABLESTACK 제품명·한국어·Storage Service/FTCTL/DR/Desktop/Automation 구성을 보존했다.
- 테마 loginbasedomain API와 독립 S7 DB 단계를 추가했다. 기존 정적 설정과 JSON validator, 비밀번호/OAuth 입력을 보존하고 공급자 조회에도 기본 도메인을 적용했다. 삭제 확인1개와 DNS/KMS/OAuth 한국어75개를 추가했다.
- MySQL 신규/014895d8f3/S6 경로473 table/view, 반복 전체 snapshot 동일, 실제 DDL 커밋 후 실패/재시도 및 기존 theme/journal 보존 통과. 실제 관리 API theme8개 계약과 API discovery32개 대조 통과.
- 최종 공식 Java 14,695 tests / failures0 / errors0 / skipped17; UI382/36 suites·production build, License, Rocky9.8/9.7 RPM 통과. Build / UI Build / License Check / Rocky 9.8 RPM Packaging / Rocky 9.7 RPM Packaging.
- 로컬 전체 Java 14,695 tests / failures0 / errors0 / skipped15 통과. S7 HEAD의 Chromium 소프트웨어 E2E 9개 항목 통과: admin-login-after-password-change, admin-role-menus-and-korean-branding, light-dark-settings-and-rendered-colors, project-account-link, project-delete-name-enter-cancel-reset, volume-template-network-navigation, regular-user-login-and-role-menu-filtering, hostname-theme-base-domain-login-and-provider-query, hostname-theme-child-domain-login.
- Chromium에서 실제 삭제 요청 접수는 확인했으나 외부 계정 정리의 Connection refused로 async job이 실패했다. Wall 알림도 시험 DB 토큰 미설정으로 530을 반환했다. 두 외부 연동 완료는 성공에 포함하지 않고 #1025에 NOT_RUN과 관측 오류를 기록했다.
- 일반 사용자 화면의 기존 관리자 전용 API 탐색(listNetworkServiceProviders/listConfigurations/listWallAlertRules)은 432로 거부되며 일부 Promise 오류가 콘솔에 남는다. 권한 상승이나 메뉴 노출은 없음을 확인하고, 불필요한 탐색/콘솔 정리는 S8 인수 사항으로 남긴다. 모든 API/콘솔 무오류를 주장하지 않는다.
- 연속 화면 이동 시 Axios 요청 취소가 네트워크 오류로 오인돼 로그아웃되던 기존 회귀를 수정했다. 실제 취소 객체로 실패를 재현하고 취소 시 세션 유지/실제 네트워크 장애 시 기존 처리 유지 단위 테스트2개를 추가했다.
- S7 HEAD 전체 Lint는 이전13개 실패 범주와 같고 변경 경로 추가 진단0개였다. 후속 #1040도 별도 #1038의 기존 실패와 비교했으며 변경 경로의 추가 진단0개다. 헤더만 추가한 파일의 기존 진단은 줄 번호 이동을 구분해 대조했다. 로컬 pre-commit의 Markdown 도구는 Node14에서 새 문법을 해석하지 못하는 제약이 있으며, 공식 CI의 baseline 비교를 별도 확인했다. skipped workflow를 PASS로 합산하지 않았다.
- 실물 시나리오는 [Europa][4.23][S8] 전체 코드 병합 후 실물 인프라 회귀 테스트 #1025 S7 표에 NOT_RUN으로 기록했다. 실물 미실행을 Draft/코드 병합 보류 조건으로 사용하지 않았으며 정식 릴리즈/배포는 수행하지 않았다.
다음은 S8 #999다. S2 #990의 realhostip 제거 a7f9756d6267과 최종 버전463f8d029470을 마무리한 뒤 최종 코드에서 실물/RC/복구 검증을 수행한다. Epic #987, S2 #990, S8 #999, 실물 #1025는 OPEN 유지한다.
Activity
dhslove commentedon Sep 10, 2026
S2 #990 검토에서 이 이슈와 함께 처리할 후속 변경을 확인했습니다. 원본 소유 행은 S2에 유지하며 자동 적용/제외하지 않았습니다. PR #1002의
s2-review.tsv와merges.tsv를 함께 확인해 주세요.67b849f3efd1— Merge release branch 4.22 to maine1cf0f335a7f— Merge branch 4.22 to mainefa58cc52fca— Merge remote-tracking branch 'origin/4.22'이들 항목은 공동 검토/검증 대상이며, 번호 순서만으로 모든 변경의 hard dependency를 의미하지 않습니다. 구현 시 해당 원본 행의 최종 판정·적용 SHA·검증 근거를 함께 갱신해야 S2도 마감할 수 있습니다.
dhslove commentedon Sep 11, 2026
S7 Chromium 회귀 검증에서 기존 Axios 0.31.1 요청 취소가
isAxiosError=true인 점 때문에 화면 이동 중 취소가 네트워크 오류로 처리되어 로그아웃되는 문제를 발견했습니다. PR #1039의 df859ac8cb에서 명시적 취소를 오류 처리 첫 단계에서 구분하고, 원래 Promise rejection은 호출자에게 유지했습니다.실제 Axios 취소 객체로 수정 전 실패를 재현했고, 취소 시 세션 유지·실제 네트워크 오류 시 기존 처리를 검사하는 테스트2개를 추가했습니다. 수정 후 UI36 suites/382 tests, 실제 API를 사용하는 볼륨→템플릿→네트워크 연속 화면 이동이 통과했습니다. 최종 HEAD fe4a198eea6161790e2ba3ce48097de53ac1524e로 공식 CI를 확인 중입니다.
또한 호스트명 테마의 기본/하위 도메인 로그인과 OAuth 공급자 조회를 실제 API에서 확인했습니다. 일반 사용자의 기존 관리자 API 탐색 거부(432, 일부 콘솔 Promise 오류)는 권한 상승 없이 유지되며 정리는 S8에 인수합니다. 실제 프로젝트 삭제의 외부 계정 정리 실패 및 Wall 토큰 미설정은 #1025에 기록했고, 외부 연동 완료를 PASS로 계산하지 않습니다.
dhslove commentedon Sep 11, 2026
PR #1039는 88d3be1090af51fcb5daec77fc8de3a83926dcf9로 정상 병합됐습니다. 병합 후 tree 검사에서 실제 첫 부모가 예정 f1b520f8f4가 아니라, 별도 Veeam PR #1038을 포함한 03a26033ef096c75c5143bf48bcf05702973aba6임을 확인했습니다. GitHub PR 응답의 base SHA는 이전 값을 반환했으므로 실제 merge parent와 tree를 기준으로 다시 검증했습니다.
자동 merge-tree 결과와 실제 병합 tree는 동일합니다. 두 작업의 공유 파일은 ApiConstants.java 하나이며 S7 loginbasedomain 상수 추가와 Veeam 상수 추가는 겹치지 않습니다. 나머지 S7 변경 파일은 검증한 PR HEAD와 byte-identical이고, 실제 병합 결과의 UI36 suites/382 tests가 통과했습니다.
다만 PR #1038에서 새로 추가한 plugins/backup/ablestack-veeam/pom.xml이 4.22.0.0-SNAPSHOT 부모를 참조해 해당 PR의 전체 Build/RPM이 이미 실패한 상태였습니다. 현재 4.23 부모와 일치시키는 최소 호환 수정을 후속 PR로 진행하며, 전체 소스 컴파일과 CI를 다시 확인한 뒤 origin/로컬 동기화 및 #998 종료를 마무리합니다. Veeam 기능 자체의 추가 변경은 수행하지 않습니다.