package pxe import ( "context" "os" "testing" "github.com/stretchr/testify/suite" ctrl "sigs.k8s.io/controller-runtime" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "edge-infra.dev/pkg/k8s/runtime/controller" "edge-infra.dev/pkg/lib/logging" v1ien "edge-infra.dev/pkg/sds/ien/k8s/apis/v1" "edge-infra.dev/test" "edge-infra.dev/test/framework" "edge-infra.dev/test/framework/integration" "edge-infra.dev/test/framework/k8s" "edge-infra.dev/test/framework/k8s/envtest" ) var ( componentName = "pxe-controller" frameworkName = "pxe-controller" ienodeName = "edge-worker" ) type UnitTestSuite struct { *framework.Framework *k8s.K8s ctx context.Context *v1ien.IENode } type IntegrationTestSuite struct { *framework.Framework *k8s.K8s ctx context.Context *v1ien.IENode } func TestMain(m *testing.M) { framework.HandleFlags() // instantiate test logger ctrl.SetLogger(logging.NewLogger().Logger) os.Exit(m.Run()) } func TestControllerWithDefaults(t *testing.T) { testEnv := envtest.Setup() t.Setenv("HOSTNAME", ienodeName) t.Setenv("NODE_NAME", ienodeName) mgr, err := createManager(controller.WithCfg(testEnv.Config), controller.WithMetricsAddress("0")) test.NoError(err) k := k8s.New(testEnv.Config, k8s.WithCtrlManager(mgr)) f := framework.New(frameworkName).Component(componentName).Register(k) if integration.IsIntegrationTest() { s := IntegrationTestSuite{f, k, context.Background(), IENodeMock()} f.Setup(s.applyIENode).Teardown(s.deleteIENode) suite.Run(t, &s) } else { s := UnitTestSuite{f, k, context.Background(), IENodeMock()} suite.Run(t, &s) } t.Cleanup(func() { f.NoError(testEnv.Stop()) }) } func (s *UnitTestSuite) TestIENodeCreate() { ienode := IENodeMock() s.Framework.NoError(s.K8s.Client.Create(s.ctx, ienode)) ienodeReturn := v1ien.IENode{} err := s.K8s.Client.Get(s.ctx, types.NamespacedName{ Name: ienode.GetName(), }, &ienodeReturn) s.Framework.Assertions.Equal(ienode.Spec, ienodeReturn.Spec) s.Framework.NoError(err) } func IENodeMock() *v1ien.IENode { return &v1ien.IENode{ ObjectMeta: metav1.ObjectMeta{ Name: ienodeName, }, Spec: v1ien.IENodeSpec{ Role: "worker", Lane: "1", Network: []v1ien.Network{ { MacAddress: "90:74:c2:0f:d8:77", Addresses: make([]string, 0), Gateway4: "192.168.1.1", DHCP4: false, DHCP6: false, }, }, PrimaryInterface: &v1ien.PrimaryInterface{ InterfaceID: "9647e74f-aba3-447f-b327-31ecce7f8d4c", MacAddresses: []string{"90:74:c2:0f:d8:77"}, }, }, } } func (s *IntegrationTestSuite) applyIENode(_ *framework.Framework) { if err := s.K8s.Client.Create(s.ctx, s.IENode); err != nil { s.Framework.FailNow("failed to apply IENode object", err) } } func (s *IntegrationTestSuite) deleteIENode(_ *framework.Framework) { if err := s.K8s.Client.Delete(s.ctx, &v1ien.IENode{ObjectMeta: metav1.ObjectMeta{ Name: s.IENode.Name, }}); err != nil { s.Framework.FailNow("failed to cleanup IENode object", err) } }