package installation
import (
"fmt"
"strings"
"time"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"gitcode.com/openFuyao/e2e-auto-test/e2e/framework/executor"
config "gitcode.com/openFuyao/e2e-auto-test/e2e/installation/bke-config"
)
var _ = Describe("BKE 引导节点初始化测试", Label("guide-install", "pre-init"), func() {
var (
sshExecutor *executor.SSHExecutor
guideNode *config.GuideNodeConfig
)
BeforeEach(func() {
guideNode = config.LoadGuideNodeFromEnv()
var err error
sshExecutor, err = executor.NewSSHExecutor(guideNode.Host, guideNode.Port, guideNode.Username, guideNode.Password)
Expect(err).NotTo(HaveOccurred(), "连接引导节点失败")
By("重置引导节点环境 (bke reset)")
resetCmd := "echo Y | bke reset --all --mount"
result, err := sshExecutor.Exec(resetCmd)
if err != nil {
GinkgoWriter.Printf("Reset 命令执行返回错误 (可能环境已清理): %v\nStderr: %s\n", err, result.Stderr)
} else {
GinkgoWriter.Printf("Reset 命令执行成功: %s\n", result.Stdout)
}
time.Sleep(10 * time.Second)
})
AfterEach(func() {
By("测试后清理:重置引导节点环境")
resetCmd := "echo Y | bke reset --all --mount"
result, err := sshExecutor.Exec(resetCmd)
if err != nil {
GinkgoWriter.Printf("AfterEach Reset 失败: %v\nStderr: %s\n", err, result.Stderr)
} else {
GinkgoWriter.Printf("AfterEach Reset 成功: %s\n", result.Stdout)
}
time.Sleep(5 * time.Second)
})
runInit := func(args string) (*executor.ExecResult, error) {
cmd := fmt.Sprintf("echo Y | bke init %s", args)
GinkgoWriter.Printf("执行安装命令: %s\n", cmd)
res, err := sshExecutor.Exec(cmd)
if res != nil {
lines := strings.Split(res.Stdout, "\n")
start := 0
if len(lines) > 20 {
start = len(lines) - 20
}
GinkgoWriter.Printf("====== Last 20 lines of Stdout ======\n%s\n", strings.Join(lines[start:], "\n"))
if res.Stderr != "" {
GinkgoWriter.Printf("====== Stderr ======\n%s\n", res.Stderr)
}
GinkgoWriter.Printf("=====================================\n")
}
return res, err
}
checkPodsReady := func() {
By("检查引导集群 Pod 状态")
Eventually(func() bool {
cmd := "kubectl get pod -A --no-headers"
res, err := sshExecutor.Exec(cmd)
if err != nil || res.ExitCode != 0 {
return false
}
lines := strings.Split(strings.TrimSpace(res.Stdout), "\n")
if len(lines) == 0 {
return false
}
allReady := true
for _, line := range lines {
if strings.TrimSpace(line) == "" {
continue
}
fields := strings.Fields(line)
if len(fields) < 4 {
continue
}
status := fields[3]
if status != "Running" && status != "Completed" {
GinkgoWriter.Printf("Pod 未就绪: %s (Status: %s)\n", fields[1], status)
allReady = false
}
}
return allReady
}, 20*time.Minute, 10*time.Second).Should(BeTrue(), "引导集群所有 Pod 应该处于 Running 或 Completed 状态")
}
It("应该成功初始化:指定正确的 oFVersion 和 versionUrl", SpecTimeout(InstallationItTimeout), func(ctx SpecContext) {
args := "--onlineImage cr.openfuyao.cn/openfuyao/bke-online-installed:latest --oFVersion latest --versionUrl https://openfuyao.obs.cn-north-4.myhuaweicloud.com/openFuyao/version-config/"
res, err := runInit(args)
Expect(err).NotTo(HaveOccurred())
Expect(res.ExitCode).To(Equal(0), "安装命令应该成功退出")
Expect(res.Stdout).To(ContainSubstring("BKE initialization is complete"), "日志应包含初始化完成信息")
checkPodsReady()
})
It("应该成功初始化:指定正确的 oFVersion,使用默认 versionUrl", SpecTimeout(InstallationItTimeout), func(ctx SpecContext) {
args := "--onlineImage cr.openfuyao.cn/openfuyao/bke-online-installed:latest --oFVersion latest"
res, err := runInit(args)
Expect(err).NotTo(HaveOccurred())
Expect(res.ExitCode).To(Equal(0))
Expect(res.Stdout).To(ContainSubstring("BKE initialization is complete"))
checkPodsReady()
})
It("应该初始化失败:指定正确的 oFVersion 但 versionUrl 错误", SpecTimeout(InstallationItTimeout), func(ctx SpecContext) {
args := "--onlineImage cr.openfuyao.cn/openfuyao/bke-online-installed:latest --oFVersion latest --versionUrl https://openfuyao.obs.cn-north-4.myhuaweicloud.com/openFuyao/ext-components/version-config/error/"
res, err := runInit(args)
if err == nil && res.ExitCode == 0 {
Expect(res.Stdout).To(MatchRegexp("(?i)failed to start cluster API"))
} else {
output := res.Stdout + res.Stderr
Expect(output).To(MatchRegexp("(?i)failed to start cluster API"))
}
})
It("应该初始化失败:指定不存在的 oFVersion", SpecTimeout(InstallationItTimeout), func(ctx SpecContext) {
args := "--onlineImage cr.openfuyao.cn/openfuyao/bke-online-installed:latest --oFVersion v25.11"
res, err := runInit(args)
if err == nil && res.ExitCode == 0 {
Expect(res.Stdout).To(MatchRegexp("(?i)failed to start cluster API"))
} else {
output := res.Stdout + res.Stderr
Expect(output).To(MatchRegexp("(?i)failed to start cluster API"))
Expect(output).To(ContainSubstring("version v25.11 not in released version list"))
}
})
It("应该成功初始化:不指定 oFVersion (使用默认/latest)", SpecTimeout(InstallationItTimeout), func(ctx SpecContext) {
args := "--onlineImage cr.openfuyao.cn/openfuyao/bke-online-installed:latest"
res, err := runInit(args)
Expect(err).NotTo(HaveOccurred())
Expect(res.ExitCode).To(Equal(0))
Expect(res.Stdout).To(ContainSubstring("BKE initialization is complete"))
checkPodsReady()
})
})