Test Specs CL - MZC-CSC/mc-web-console GitHub Wiki
μμ±: 2026-10-16 Β· κΈ°μ€: v07 μ€μΉ ν ν΅ν© κ²μ¦(IV) Β· μλ³Έ: μ¬μ λ³ κ³νμ(Excel) β Test Scenarios Β· IV νλΈ Β· κΈ°λ₯ TC
Playwright(TypeScript) spec μμ€μ
λλ€. μλ리μ€λ§λ€ ## <μλ리μ€λ²νΈ> μΉμ
μ΄ μκ³ μ΅μ»€λ #<μλ리μ€λ²νΈ μλ¬Έμ> μ
λλ€. κ³΅μ© ν¬νΌλ Test-Specs-Common. λΉλ°λ²νΈ λ±μ λ§μ€νΉνμ΅λλ€.
| μλλ¦¬μ€ | νμΌ | μ€ | ν΄μ |
|---|---|---|---|
| CL_S01 | tests/cl/CL_S01.spec.ts |
49 | c3e26c64 |
| CL_S02 | tests/cl/CL_S02.spec.ts |
60 | e5ce6dfb |
tests/cl/CL_S01.spec.ts Β· 49μ€ Β· ν΄μ c3e26c64 Β· μλλ¦¬μ€ λ³΄κΈ°
import { test, expect } from '../../lib/fixtures';
import { activeCsps, tid, k8sName, k8sProject } from '../../lib/data';
import { openK8sList, deleteClusterFromList, clusterRow, waitList } from '../../lib/k8s';
// CL_S01 : CSP ν
μ€νΈ μμ μ 체 μμ (λΉμ© λ°©μ§, λ
Ήν μ ν) [CSPλ³]
// **νμ¬λ 5λ²(Project p{n} μ K8s μμ )λ§ κ΅¬ν**: λ€λ₯Έ λ¨κ³(NLB/MyImages/Disks/Infra/Projects/SSH Key/SG/vNet)λ 미ꡬν.
// K8s μμ : K8s Workloads ν΄λ¬μ€ν° λͺ©λ‘ β νμ action item β Delete (μ¬μ©μ μλ΄ 2026-10-05).
// λμ ν΄λ¬μ€ν°λ νκ²½λ³μ CL_K8S(μΌν ꡬλΆ)λ‘ μ§μ , μμΌλ©΄ k{n}d. μ) CL_K8S=k1d,k1f
for (const c of activeCsps()) {
test(`${tid('CL_S01', c)} CSP ν
μ€νΈ μμ μ 체 μμ (K8s λ¨κ³λ§ ꡬν)`, async ({ page }) => {
test.skip(c.code === 'KT', 'KT Credential μμ');
const project = k8sProject(c);
const targets = (process.env.CL_K8S ?? `${k8sName(c)}d`).split(',').map((s) => s.trim()).filter(Boolean);
test.info().annotations.push({ type: 'scope', description: `ws01 / ${project} / K8s=${targets.join(',')} (CL_S01 5λ²λ§)` });
await openK8sList(page, project);
for (const name of targets) {
// λͺ©λ‘μ μλ κ°±μ λμ§ μκ³ λ‘λ© μ€ μΌμμ μΌλ‘ λΉμ΄ λ³΄μΌ μ μλ€(μ§μ μμ μ§ν 'k1d μμ'μΌλ‘ μ€ν, 2026-10-08) β
// λ©λ΄λ‘ λ€μ μ§μ
ν΄ νμ΄ λνλλμ§ μ΅λ ~60μ΄ μ¬νμΈν λ€μλ μμ λλ§ 'μμ'μΌλ‘ λ³Έλ€
let found = (await clusterRow(page, name).count()) > 0;
for (let i = 0; i < 4 && !found; i++) {
await page.waitForTimeout(10_000);
await page.getByRole('link', { name: 'K8s Workloads' }).first().click();
await waitList(page);
found = (await clusterRow(page, name).count()) > 0;
}
if (!found) {
test.info().annotations.push({ type: 'skip-not-found', description: `${name} λͺ©λ‘μ μμ β 건λλ(μ‘΄μ¬νλ κ²λ§ μμ )` });
continue;
}
await deleteClusterFromList(page, name); // action item β Delete β νμΈ νμ
Confirm (μμ² μ§ν μνλ μ΄λ
Έν
μ΄μ
)
// μμ μμ² ν νμ΄ μ¬λΌμ§κ±°λ μμ μ§ν μν(Deleting λ±)λ‘ λ°λ λκΉμ§ μ΅λ ~2λΆ νμΈ.
// λͺ©λ‘μ μλ κ°±μ λμ§ μμ μ¬μ΄λ λ©λ΄λ‘ λ€μ μ§μ
(Workspace/Project μ ν μ μ§)ν΄μ λ³Έλ€.
const started = Date.now();
let state = '';
for (let i = 0; i < 8; i++) {
await page.getByRole('link', { name: 'K8s Workloads' }).first().click();
await waitList(page);
const row = clusterRow(page, name);
state = (await row.count()) ? (await row.first().innerText()).replace(/\s+/g, ' ') : '(ν μμ)';
if (/\(ν μμ\)|Delet|Terminat/i.test(state)) break;
await page.waitForTimeout(12_000);
}
test.info().annotations.push({ type: 'k8s-state-after', description: `${name}: ${state} (μμ² ν ${Math.round((Date.now() - started) / 1000)}s)` });
expect(state, `${name} μμ μμ² ν μν(μ κ±° λλ Deleting)`).toMatch(/\(ν μμ\)|Delet|Terminat/i);
}
});
}tests/cl/CL_S02.spec.ts Β· 60μ€ Β· ν΄μ e5ce6dfb Β· μλλ¦¬μ€ λ³΄κΈ°
// CL_S02: λ©ν° CSP Infra mc10 μμ (λΉμ© λ°©μ§, λ
Ήν μ ν) [μ μ, 곡ν΅] β TC-INFRA-056
// νλ©΄: Infra Workloads λͺ©λ‘ β mc10 ν μ ν β λͺ©λ‘ μΉ΄λ 'List of Infra' β Terminate β Confirm β (Terminated) β β Delete β Confirm β λͺ©λ‘μμ μ κ±°
// μμ μν: admin(mcmp) λ‘κ·ΈμΈ μν, Workspace=ws01 / Project=default μ νλ μνμμ μμ. IV μ’
λ£(IV3_S11 λ‘ λ§λ mc10 μ μ°λ IV4_S03Β·S06Β·S08 μλ£)
// λμ: Workspace ws01 / Project default(namespace default) μ Infra mc10 νλ(IV3_S11 μ΄ Workflow λ‘ λ§λ 8κ° CSP NodeGroup g10-<csp>, node κ° 1κ°)
// β λ€λ₯Έ Infra(mc1~mc9, mw*, mt1)Β·κ³΅μ© vNet/SG/SSH Key(default-shared-*)λ μμ νμ§ μμ
// μ μ°¨: 1.λͺ©λ‘μμ mc10 μ ν β β Terminate β Confirm β Status Terminated λκΈ° 2.β Delete β Confirm β μμ μλ΅(DelInfra) κΈ°λ‘ 3.λͺ©λ‘μμ mc10 μ κ±° νμΈ
// 4.μμ¬ μμ νμΈ: μμ μλ΅μ '[WARNING] β¦ node(s) may remain on the CSP' κ° μμ΄μΌ ν¨(Running μν force Delete μ μμ‘΄ κ²½κ³ μ¬λ‘ 2026-10-02 β Terminate λ¨Όμ )
// μ
λ ₯κ°: Infra=mc10 / Workspace=ws01 / Project=default
// κΈ°λκ²°κ³Ό: κ³ΌκΈ μμ μμ‘΄ μμ(mc10 λͺ©λ‘ μ κ±°, 8κ° CSP node μμ‘΄ κ²½κ³ μμ). νλ©΄μΌλ‘ νμΈν μ μλ CSP μ½μ μμ‘΄μ κ²°κ³Ό λ¬Έμμ μ¬μ©μ νμΈ μμ²μΌλ‘ λ¨κΉ
// μ€ν: μ¬μ©μ/λ©μΈ μΈμ
μ§μκ° μμ λλ§(2026-10-16 μμ± μμ μλ μ€ννμ§ μμ)
// λΉκ³ : 2026-10-16 ꡬν(stub λ체). Infra λ¨μ μ μ΄λ lib/iv3-mc10.ts infraListAction
import { test, expect } from '../../lib/fixtures';
import { tid } from '../../lib/data';
import { loginAsAdmin } from '../../lib/ui';
import { gotoInfraList, refreshInfraList, waitInfraListed, infraRow, infraRowText, waitInfraStatus } from '../../lib/iv4-infra';
import { MC10_NAME, infraListAction } from '../../lib/iv3-mc10';
test(`${tid('CL_S02')} λ©ν° CSP Infra mc10 μμ (λΉμ© λ°©μ§, λ
Ήν μ ν)`, async ({ page }) => {
test.setTimeout(60 * 60_000);
const name = process.env.CL_S02_INFRA ?? MC10_NAME;
test.info().annotations.push({ type: 'scope', description: `ws01 / default(namespace default) / Infra=${name} λ§ μμ ` });
await loginAsAdmin(page);
await gotoInfraList(page);
test.skip(!(await waitInfraListed(page, name)), `${name} λͺ©λ‘μ μμ(μ΄λ―Έ μμ λκ±°λ IV3_S11 λ―Έμ€ν)`);
const before = await infraRowText(page, name);
test.info().annotations.push({ type: 'list-before', description: before });
// 1. Terminate β Terminated
if (!/^Terminated/i.test(before)) {
await infraListAction(page, name, 'Terminate');
await gotoInfraList(page);
const t = await waitInfraStatus(page, name, /^Terminated/i, 30 * 60_000);
test.info().annotations.push({ type: 'terminated', description: t });
}
// 2. Delete β μλ΅ κΈ°λ‘
const del: string[] = [];
const onResp = async (r: import('@playwright/test').Response) => {
if (/DelInfra|DeleteInfra|DelMci/i.test(r.url())) del.push(`${r.status()} ${(await r.text().catch(() => '')).replace(/\s+/g, ' ').slice(0, 1500)}`);
};
page.on('response', onResp);
await infraListAction(page, name, 'Delete');
// 3. λͺ©λ‘μμ μ κ±°(μ΅λ 10λΆ)
let row = 'x';
for (let i = 0; i < 20 && row; i++) {
await page.waitForTimeout(30_000);
await refreshInfraList(page);
await page.waitForTimeout(3000);
row = (await infraRow(page, name).count()) ? await infraRowText(page, name) : '';
}
page.off('response', onResp);
test.info().annotations.push({ type: 'delete-response', description: del.join(' || ') || '(μλ΅ λ―Έμμ§)' });
test.info().annotations.push({ type: 'list-after', description: row || `${name} λͺ©λ‘μμ μ κ±°` });
expect(row, `${name} λͺ©λ‘μμ μ κ±°`).toBe('');
// 4. μμ¬ μμ κ²½κ³ μμ
expect(del.join(' '), 'μμ μλ΅μ CSP μμ‘΄ κ²½κ³ μμ').not.toMatch(/may remain|WARNING/i);
await page.waitForTimeout(3000); // λ
Ήν λ§λ¬΄λ¦¬
});