import { expect, test, Page } from "@playwright/test";
import {
goToAppMarket,
installComponent,
checkComponent,
selectLog,
kubectlGetFirstPodByNamePrefix,
withKubectlSsh,
verifyUiLogWithKubectl,
verifyLogExport,
verifyResourceSortInResourceTab,
} from "./utils/application";
import { cleanupAfterEach } from "./utils/application-cleanup";
import type { DeployPlan } from "./test-application.constants";
import {
totalTimeout,
serviceClusterUrl,
appNameAiaio,
appNameMonitor,
componentNameMonitor,
PLAN_APP_AIAIO,
} from "./test-application.constants";
test.describe("应用管理-详情", () => {
let createdApps: DeployPlan[] = [];
test.beforeEach(async ({ page }) => {
await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
});
test.afterEach(async ({ page }) => {
await cleanupAfterEach(page, {
createdApps,
});
});
async function installComponentTracked(page: any, plan: DeployPlan) {
await installComponent(page, plan.componentName, plan.appName);
createdApps.push(plan);
}
async function deployComponents(page: any, plans: DeployPlan[]) {
for (const plan of plans) {
await test.step(`部署前置组件(${plan.componentName} -> ${plan.appName})`, async () => {
await goToAppMarket(page);
await installComponentTracked(page, plan);
await checkComponent(page, plan.appName, {
entry: plan.entry,
serviceClusterUrl,
});
});
}
}
async function verifyResourceInfoDisplay(
page: any,
_opts: { creationHeader: string; creationKind: "event" | "time" },
) {
const table = page.getByRole("table").first();
await expect(table).toBeVisible();
const empty = page.getByText(/暂无(内容|数据)/).first();
await expect(table.locator("tbody tr").first().or(empty)).toBeVisible();
}
async function filterEvents(page: Page, options: {
resourceName: string;
resourceType: string;
level: string;
namespace: string;
}) {
const selects = page.locator(".container-platform-select-selector");
await selects.nth(1).click();
await page.keyboard.type(options.resourceName);
await page.getByTitle(options.resourceName, { exact: true }).locator("div").click();
await selects.nth(2).click();
await page.getByTitle(options.resourceType, { exact: true }).locator("div").click();
await selects.nth(3).click();
await page.getByTitle(options.level, { exact: true }).locator("div").click();
await selects.nth(4).click();
await page.getByTitle(options.namespace, { exact: true }).locator("div").click();
await page.getByRole("button", { name: /查\s*询/ }).click();
}
test("【应用运维-应用详情-017】应用管理-详情-日志标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await test.step("进入应用管理-详情页面-日志标签页并筛选", async () => {
await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
await page.getByRole("textbox", { name: /搜索.*名称/ }).fill("local-harbor");
await page.getByRole("button", { name: "search" }).click();
await page.getByRole("link", { name: "local-harbor" }).click();
await page.getByRole("tab", { name: "日志" }).click();
await selectLog(page, "local-harbor-chartmuseum", "chartmuseum");
});
await test.step("验证筛选成功并重置", async () => {
await page.waitForTimeout(2000);
await expect(page.getByText("暂无日志")).not.toBeVisible();
await page.getByRole("button", { name: "重 置" }).click();
});
});
test("【应用运维-扩展详情-017】扩展管理-详情-日志标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入日志标签页并筛选", async () => {
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "日志" }).click();
await selectLog(page, "monitoring-dashboard-service", "monitoring-dashboard-service");
});
await test.step("验证筛选成功并重置", async () => {
await expect(page.getByText("暂无日志")).not.toBeVisible();
await page.getByRole("button", { name: "重 置" }).click();
});
});
test("【应用运维-应用详情-020】应用管理-详情-事件标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await test.step("进入事件标签页并筛选", async () => {
await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
await page.getByRole("textbox", { name: /搜索.*名称/ }).fill("local-harbor");
await page.getByRole("button", { name: "search" }).click();
await page.getByRole("link", { name: "local-harbor" }).click();
await page.getByRole("tab", { name: "事件" }).click();
await filterEvents(page, {
resourceName: "local-harbor-chartmuseum",
resourceType: "Deployment",
level: "正常",
namespace: "openfuyao-system",
});
});
await test.step("验证筛选结果并重置", async () => {
await page.getByRole("button", { name: "重 置" }).click();
await expect(page.locator(".container-platform-select-selector").nth(3)).toHaveText("全部");
});
});
test("【应用运维-扩展详情-020】扩展管理-详情-事件标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入事件标签页并筛选", async () => {
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "事件" }).click();
await filterEvents(page, {
resourceName: "monitoring-dashboard-service",
resourceType: "Deployment",
level: "正常",
namespace: "monitoring-dashboard",
});
});
await test.step("验证筛选成功并重置", async () => {
await page.getByRole("button", { name: "重 置" }).click();
await expect(page.locator(".container-platform-select-selector").nth(3)).toHaveText("全部");
});
});
test("【应用运维-应用详情-008】应用管理-概览-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await deployComponents(page, PLAN_APP_AIAIO);
await test.step("进入应用管理-Helm详情页面-资源标签页", async () => {
await page.getByRole("link", { name: "应用管理" }).click();
await page.getByRole("link", { name: appNameAiaio }).click();
await page.getByRole("tab", { name: "资源" }).click();
await expect(page.getByRole("table")).toBeVisible();
});
await test.step("校验资源信息展示正确(创建事件)", async () => {
await verifyResourceInfoDisplay(page, { creationHeader: "创建事件", creationKind: "event" });
});
});
test("【应用运维-扩展详情-008】扩展管理-概览-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入扩展组件管理-详情页面-资源标签页", async () => {
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "资源" }).click();
await expect(page.getByRole("table")).toBeVisible();
});
await test.step("校验资源信息展示正确(创建时间)", async () => {
await verifyResourceInfoDisplay(page, { creationHeader: "创建时间", creationKind: "time" });
});
});
test("【应用运维-扩展详情-014】扩展管理-详情-资源标签-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入扩展组件管理-详情页面-资源标签页", async () => {
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "资源" }).click();
await expect(page.getByRole("table")).toBeVisible();
});
await verifyResourceSortInResourceTab(page);
});
test("【应用运维-应用详情-014】应用管理-详情-资源标签-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await deployComponents(page, PLAN_APP_AIAIO);
await test.step("进入应用管理-Helm详情页面-资源标签页", async () => {
await page.getByRole("link", { name: "应用管理" }).click();
await page.getByRole("link", { name: appNameAiaio }).click();
await page.getByRole("tab", { name: "资源" }).click();
await expect(page.getByRole("table")).toBeVisible();
});
await verifyResourceSortInResourceTab(page);
});
test("【应用运维-扩展详情-015】扩展管理-详情-资源标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入扩展组件管理-详情页面-资源标签页", async () => {
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "资源" }).click();
await expect(page.getByRole("table")).toBeVisible();
});
await test.step("按资源名称搜索并校验结果", async () => {
await page.getByRole("textbox", { name: "资源名称" }).fill("monitoring-dashboard");
await page.getByRole("button", { name: "search" }).click();
await expect(page.getByRole("table")).toContainText("monitoring-dashboard");
});
await test.step("按类型与状态筛选并校验", async () => {
await page.getByLabel("类型").getByRole("button", { name: "filter" }).click();
await page.getByRole("menuitem", { name: "ClusterRole", exact: true }).click();
await page.getByRole("button", { name: /确\s*定/ }).click();
await expect(page.getByRole("table")).toContainText("ClusterRole");
await page.getByLabel("状态").getByRole("button", { name: "filter" }).click();
await page.getByText("运行中失败创建中删除中").click();
await page.getByRole("menuitem", { name: "运行中", exact: true }).click();
await page.getByRole("button", { name: /确\s*定/, exact: true }).click();
await expect(page.getByRole("table")).toContainText("运行中");
});
});
test("【应用运维-应用详情-015】应用管理-详情-资源标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await deployComponents(page, PLAN_APP_AIAIO);
await test.step("进入应用管理-Helm详情页面-资源标签页", async () => {
await page.getByRole("link", { name: "应用管理" }).click();
await page.getByRole("link", { name: appNameAiaio }).click();
await page.getByRole("tab", { name: "资源" }).click();
await expect(page.getByRole("table")).toBeVisible();
});
await test.step("按资源名称搜索并校验结果", async () => {
await page.getByRole("textbox", { name: "资源名称" }).fill("aiaio");
await page.getByRole("button", { name: "search" }).click();
await expect(page.getByRole("table")).toContainText("aiaio");
});
await test.step("按类型与状态筛选并校验", async () => {
await page.getByLabel("类型").getByRole("button", { name: "filter" }).click();
await page.getByRole("menuitem", { name: "ConfigMap", exact: true }).click();
await page.getByRole("button", { name: /确\s*定/ }).click();
await expect(page.getByRole("table")).toContainText("ConfigMap");
await page.getByLabel("状态").getByRole("button", { name: "filter" }).click();
await page.getByText("运行中失败创建中删除中").click();
await page.getByRole("menuitem", { name: "运行中", exact: true }).click();
await page.getByRole("button", { name: /确\s*定/, exact: true }).click();
await expect(page.getByRole("table")).toContainText("运行中");
});
});
test("【应用运维-应用详情-016】应用管理-详情-日志标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await deployComponents(page, PLAN_APP_AIAIO);
await test.step("进入应用管理-Helm详情页面-日志标签页", async () => {
await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
await expect(page.getByRole("table")).toBeVisible();
await page.getByRole("link", { name: appNameAiaio }).click();
await page.getByRole("tab", { name: "日志" }).click();
});
await test.step("对比 kubectl logs 与 UI 日志内容", async () => {
await withKubectlSsh(async (ssh) => {
const pod = await kubectlGetFirstPodByNamePrefix(ssh, "bke-cluster", "test-aiaio-node-feature-discovery-gc");
const podTitleLoc = page.getByTitle(pod.podName);
if ((await podTitleLoc.count()) > 0) {
await podTitleLoc.locator("div").first().click();
} else {
await page.getByText(/kuberay-operator-/).first().click().catch(() => {});
await podTitleLoc.locator("div").first().click();
}
const queryBtn = page.getByRole("button", { name: /查\s*询/ }).first();
await queryBtn.click();
await page.waitForTimeout(2000);
await verifyUiLogWithKubectl(page, ssh, {
kubectlNamespace: "bke-cluster",
kubectlPodNamePrefix: "test-aiaio-node-feature-discovery-gc",
});
});
});
});
test("【应用运维-扩展详情-016】扩展管理-详情-日志标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入扩展组件管理-详情页面-日志标签页", async () => {
await page.goto(serviceClusterUrl + "/container_platform/extendManage");
await expect(page.getByRole("table")).toBeVisible();
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "日志" }).click();
const queryBtn = page.getByRole("button", { name: /查\s*询/ });
if (await queryBtn.count()) {
await queryBtn.first().click();
}
await page.waitForTimeout(2000);
});
await test.step("对比 kubectl logs 与 UI 日志内容", async () => {
await withKubectlSsh(async (ssh) => {
await verifyUiLogWithKubectl(page, ssh, {
kubectlNamespace: "monitoring-dashboard",
kubectlPodNamePrefix: "monitoring-dashboard-service",
kubectlContainerName: "monitoring-dashboard-service",
});
});
});
});
test("【应用运维-扩展详情-024】扩展管理-详情-详情标签-扩展界面编辑-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await test.step("部署扩展组件并进入详情页", async () => {
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await page.getByRole("link", { name: appNameMonitor }).click();
});
await test.step("进入详情标签页", async () => {
await page.getByRole("tab", { name: "详情" }).click();
await expect(page.getByText("扩展界面启停")).toBeVisible();
});
await test.step("编辑扩展界面并保存", async () => {
await page.getByRole("img", { name: "edit" }).locator("svg").click();
await page.getByRole("button", { name: "保 存" }).click();
await page.locator("div").filter({ hasText: /^monitoring-dashboard$/ }).first().click();
const switchBtn = page.getByRole("switch");
const beforeChecked = (await switchBtn.getAttribute("aria-checked")) ?? "";
await page.getByRole("img", { name: "edit" }).locator("svg").click();
await switchBtn.click();
await page.getByRole("button", { name: "保 存" }).click();
await page.locator("div").filter({ hasText: /^monitoring-dashboard$/ }).click();
const refreshHint = page.getByText("扩展组件发生更新,请刷新以展示最新版本的页面。");
await expect(refreshHint).toBeVisible({ timeout: 60_000 });
await refreshHint.click();
await expect
.poll(async () => (await switchBtn.getAttribute("aria-checked")) ?? "", {
timeout: 60_000,
intervals: [500, 1000, 2000],
})
.not.toBe(beforeChecked);
});
});
test("【应用运维-应用详情-019】应用管理-详情-事件标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await deployComponents(page, PLAN_APP_AIAIO);
await test.step("进入应用管理-Helm详情页面-事件标签页", async () => {
await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
await expect(page.getByRole("link", { name: appNameAiaio })).toBeVisible();
await page.getByRole("link", { name: appNameAiaio }).click();
await page.getByRole("tab", { name: "事件" }).click();
await filterEvents(page, {
resourceName: "kuberay-operator",
resourceType: "Deployment",
level: "正常",
namespace: "bke-cluster",
});
});
await test.step("查询后确认展示时间线", async () => {
const eventTabPanel = page.getByRole("tabpanel", { name: "事件" });
const timelineFirstItem = eventTabPanel
.locator(".helm_event_timeLine .container-platform-timeline-item, .event_timeLine li")
.first();
await expect(timelineFirstItem).toBeVisible({ timeout: 30_000 });
});
});
test("【应用运维-扩展详情-019】扩展管理-详情-事件标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
test.setTimeout(totalTimeout);
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入扩展组件管理-详情页面-事件标签页", async () => {
await page.goto(serviceClusterUrl + "/container_platform/extendManage");
await expect(page.getByRole("link", { name: appNameMonitor })).toBeVisible();
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "事件" }).click();
await expect(page.getByRole("tab", { name: "事件" })).toBeVisible();
await filterEvents(page, {
resourceName: "monitoring-dashboard-service",
resourceType: "Deployment",
level: "正常",
namespace: "monitoring-dashboard",
});
});
await test.step("查询后确认展示时间线", async () => {
const eventTabPanel = page.getByRole("tabpanel", { name: "事件" });
const timelineFirstItem = eventTabPanel
.locator(".helm_event_timeLine .container-platform-timeline-item, .event_timeLine li")
.first();
await expect(timelineFirstItem).toBeVisible({ timeout: 30_000 });
});
});
test.use({ acceptDownloads: true });
test("【应用运维-应用详情-018】应用管理-详情-日志标签-导出-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await test.step("进入应用管理-Helm详情页面-日志标签页", async () => {
await page.getByRole("link", { name: "应用管理" }).click();
await page.getByRole("link", { name: "local-harbor" }).click();
await page.getByRole("tab", { name: "日志" }).click();
});
await test.step("等待日志就绪并导出校验下载文件", async () => {
await verifyLogExport(page, test.info().outputDir);
});
});
test("【应用运维-扩展详情-018】扩展管理-详情-日志标签-导出-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
await test.step("进入扩展组件管理-详情页面-日志标签页", async () => {
await page.goto(serviceClusterUrl + "/container_platform/extendManage");
await page.getByRole("link", { name: appNameMonitor }).click();
await page.getByRole("tab", { name: "日志" }).click();
});
await test.step("等待日志就绪并导出校验下载文件", async () => {
await verifyLogExport(page, test.info().outputDir);
});
});
});