rollouts/pkg/controller/batchrelease/control/bluegreenstyle/hpa/hpa_test.go

150 lines
4.2 KiB
Go

package hpa
import (
"context"
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)
var (
scheme = runtime.NewScheme()
)
func TestHPAPackage(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "HPA Package Suite")
}
var _ = Describe("HPA Operations", func() {
var (
cli client.Client
object *unstructured.Unstructured
)
BeforeEach(func() {
object = &unstructured.Unstructured{}
object.SetGroupVersionKind(schema.GroupVersionKind{
Group: "apps",
Version: "v1",
Kind: "Deployment",
})
object.SetNamespace("default")
object.SetName("my-deployment")
cli = fake.NewClientBuilder().WithScheme(scheme).WithObjects(object).Build()
})
Context("when disabling and restoring HPA", func() {
It("should disable and restore HPA successfully", func() {
// Create a fake HPA
hpa := &unstructured.Unstructured{}
hpa.SetGroupVersionKind(schema.GroupVersionKind{
Group: "autoscaling",
Version: "v2",
Kind: "HorizontalPodAutoscaler",
})
hpa.SetNamespace("default")
hpa.SetName("my-hpa")
unstructured.SetNestedField(hpa.Object, map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"name": "my-deployment",
}, "spec", "scaleTargetRef")
Expect(cli.Create(context.TODO(), hpa)).To(Succeed())
// Disable HPA
DisableHPA(cli, object)
fetchedHPA := &unstructured.Unstructured{}
fetchedHPA.SetGroupVersionKind(schema.GroupVersionKind{
Group: "autoscaling",
Version: "v2",
Kind: "HorizontalPodAutoscaler",
})
Expect(cli.Get(context.TODO(), types.NamespacedName{
Namespace: "default",
Name: "my-hpa",
}, fetchedHPA)).To(Succeed())
targetRef, found, err := unstructured.NestedFieldCopy(fetchedHPA.Object, "spec", "scaleTargetRef")
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
ref := targetRef.(map[string]interface{})
Expect(ref["name"]).To(Equal("my-deployment" + HPADisableSuffix))
// Restore HPA
RestoreHPA(cli, object)
Expect(cli.Get(context.TODO(), types.NamespacedName{
Namespace: "default",
Name: "my-hpa",
}, fetchedHPA)).To(Succeed())
targetRef, found, err = unstructured.NestedFieldCopy(fetchedHPA.Object, "spec", "scaleTargetRef")
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
ref = targetRef.(map[string]interface{})
Expect(ref["name"]).To(Equal("my-deployment"))
})
})
Context("when finding HPA for workload", func() {
It("should find the correct HPA", func() {
// Create a fake HPA v2
hpaV2 := &unstructured.Unstructured{}
hpaV2.SetGroupVersionKind(schema.GroupVersionKind{
Group: "autoscaling",
Version: "v2",
Kind: "HorizontalPodAutoscaler",
})
hpaV2.SetNamespace("default")
hpaV2.SetName("my-hpa-v2")
unstructured.SetNestedField(hpaV2.Object, map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"name": "my-deployment",
}, "spec", "scaleTargetRef")
// Create a fake HPA v1
hpaV1 := &unstructured.Unstructured{}
hpaV1.SetGroupVersionKind(schema.GroupVersionKind{
Group: "autoscaling",
Version: "v1",
Kind: "HorizontalPodAutoscaler",
})
hpaV1.SetNamespace("default")
hpaV1.SetName("my-hpa-v1")
unstructured.SetNestedField(hpaV1.Object, map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"name": "my-deployment",
}, "spec", "scaleTargetRef")
Expect(cli.Create(context.TODO(), hpaV2)).To(Succeed())
Expect(cli.Create(context.TODO(), hpaV1)).To(Succeed())
// Test finding HPA for workload
foundHPA := findHPAForWorkload(cli, object)
Expect(foundHPA).NotTo(BeNil())
Expect(foundHPA.GetName()).To(Equal("my-hpa-v2"))
// Delete v2 HPA and check if v1 is found
Expect(cli.Delete(context.TODO(), hpaV2)).To(Succeed())
foundHPA = findHPAForWorkload(cli, object)
Expect(foundHPA).NotTo(BeNil())
Expect(foundHPA.GetName()).To(Equal("my-hpa-v1"))
})
})
})