package serverlessdb_operator

import (
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	. "gitcode.com/openFuyao/e2e-auto-test/e2e/serverlessdb-operator/utils"
)

var _ = Describe("ServerlessDB 实例垂直扩缩容",
	Label("serverlessdb-operator", "with-workload-cluster", "26.01"), Label("P0"), func() {

		It("serverlessdb-IT-007:扩容 cpu 与 memory 后实例规格生效", func() {
			createPoolAndAwaitWarm("pool-it007", 1)
			appRef := "app-it007"
			allocateAndAwaitRunning(appRef)

			By("发起扩容请求 cpu=2, memory=512Mi")
			resp, status, err := apiClient.Resize(ctx, testNs, appRef, &ResizeInstanceRequest{
				Containers: []ContainerResource{{
					Name:      ContainerCompute,
					Resources: InstanceResources{Cpu: "2", Memory: "512Mi", CpuLimit: "2", MemoryLimit: "512Mi"},
				}},
			})
			Expect(err).NotTo(HaveOccurred())
			Expect(status).To(Equal(200), "扩容请求应当返回 200")

			By("实例进入 Scaling 后回到 Running")
			Eventually(func(g Gomega) string {
				return DBInstancePhase(dbInstanceByAppRef(appRef))
			}, reconcileWait, reconcilePoll).Should(Equal("Running"))

			By("校验 Pod compute 容器资源已变更")
			Eventually(func(g Gomega) {
				pods, perr := k8sClient.ListPods(ctx, testNs, metav1.ListOptions{LabelSelector: LabelEq(LabelAppRef, appRef)})
				g.Expect(perr).NotTo(HaveOccurred())
				g.Expect(pods.Items).NotTo(BeEmpty())
				for _, c := range pods.Items[0].Spec.Containers {
					if c.Name == ContainerCompute {
						g.Expect(c.Resources.Requests.Cpu().String()).To(Equal("2"))
						return
					}
				}
				g.Expect(false).To(BeTrue(), "应当存在 compute 容器")
			}, podResizeWait, podResizePoll).Should(Succeed())

			Expect(resp.Endpoint).NotTo(BeEmpty(), "扩容响应应包含 endpoint")
		})

		It("serverlessdb-IT-008:仅指定 cpu 部分字段扩容成功", func() {
			createPoolAndAwaitWarm("pool-it008", 1)
			appRef := "app-it008"
			allocateAndAwaitRunning(appRef)

			By("仅扩容 cpu=1(不指定 memory)")
			_, status, err := apiClient.Resize(ctx, testNs, appRef, &ResizeInstanceRequest{
				Containers: []ContainerResource{{
					Name:      ContainerCompute,
					Resources: InstanceResources{Cpu: "1"},
				}},
			})
			Expect(err).NotTo(HaveOccurred())
			Expect(status).To(Equal(200), "部分字段扩容请求应当返回 200")

			By("实例回到 Running")
			Eventually(func(g Gomega) string {
				return DBInstancePhase(dbInstanceByAppRef(appRef))
			}, reconcileWait, reconcilePoll).Should(Equal("Running"))
		})
	})