...
1 package pxe
2
3 import (
4 "context"
5 "os"
6 "testing"
7
8 "github.com/stretchr/testify/suite"
9 ctrl "sigs.k8s.io/controller-runtime"
10
11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12 "k8s.io/apimachinery/pkg/types"
13
14 "edge-infra.dev/pkg/k8s/runtime/controller"
15 "edge-infra.dev/pkg/lib/logging"
16 v1ien "edge-infra.dev/pkg/sds/ien/k8s/apis/v1"
17 "edge-infra.dev/test"
18 "edge-infra.dev/test/framework"
19 "edge-infra.dev/test/framework/integration"
20 "edge-infra.dev/test/framework/k8s"
21 "edge-infra.dev/test/framework/k8s/envtest"
22 )
23
24 var (
25 componentName = "pxe-controller"
26 frameworkName = "pxe-controller"
27 ienodeName = "edge-worker"
28 )
29
30 type UnitTestSuite struct {
31 *framework.Framework
32 *k8s.K8s
33 ctx context.Context
34 *v1ien.IENode
35 }
36
37 type IntegrationTestSuite struct {
38 *framework.Framework
39 *k8s.K8s
40 ctx context.Context
41 *v1ien.IENode
42 }
43
44 func TestMain(m *testing.M) {
45 framework.HandleFlags()
46
47 ctrl.SetLogger(logging.NewLogger().Logger)
48 os.Exit(m.Run())
49 }
50
51 func TestControllerWithDefaults(t *testing.T) {
52 testEnv := envtest.Setup()
53 t.Setenv("HOSTNAME", ienodeName)
54 t.Setenv("NODE_NAME", ienodeName)
55
56 mgr, err := createManager(controller.WithCfg(testEnv.Config), controller.WithMetricsAddress("0"))
57 test.NoError(err)
58
59 k := k8s.New(testEnv.Config, k8s.WithCtrlManager(mgr))
60 f := framework.New(frameworkName).Component(componentName).Register(k)
61
62 if integration.IsIntegrationTest() {
63 s := IntegrationTestSuite{f, k, context.Background(), IENodeMock()}
64 f.Setup(s.applyIENode).Teardown(s.deleteIENode)
65 suite.Run(t, &s)
66 } else {
67 s := UnitTestSuite{f, k, context.Background(), IENodeMock()}
68 suite.Run(t, &s)
69 }
70
71 t.Cleanup(func() {
72 f.NoError(testEnv.Stop())
73 })
74 }
75
76 func (s *UnitTestSuite) TestIENodeCreate() {
77 ienode := IENodeMock()
78 s.Framework.NoError(s.K8s.Client.Create(s.ctx, ienode))
79
80 ienodeReturn := v1ien.IENode{}
81 err := s.K8s.Client.Get(s.ctx, types.NamespacedName{
82 Name: ienode.GetName(),
83 }, &ienodeReturn)
84
85 s.Framework.Assertions.Equal(ienode.Spec, ienodeReturn.Spec)
86 s.Framework.NoError(err)
87 }
88
89 func IENodeMock() *v1ien.IENode {
90 return &v1ien.IENode{
91 ObjectMeta: metav1.ObjectMeta{
92 Name: ienodeName,
93 },
94 Spec: v1ien.IENodeSpec{
95 Role: "worker",
96 Lane: "1",
97 Network: []v1ien.Network{
98 {
99 MacAddress: "90:74:c2:0f:d8:77",
100 Addresses: make([]string, 0),
101 Gateway4: "192.168.1.1",
102 DHCP4: false,
103 DHCP6: false,
104 },
105 },
106 PrimaryInterface: &v1ien.PrimaryInterface{
107 InterfaceID: "9647e74f-aba3-447f-b327-31ecce7f8d4c",
108 MacAddresses: []string{"90:74:c2:0f:d8:77"},
109 },
110 },
111 }
112 }
113
114 func (s *IntegrationTestSuite) applyIENode(_ *framework.Framework) {
115 if err := s.K8s.Client.Create(s.ctx, s.IENode); err != nil {
116 s.Framework.FailNow("failed to apply IENode object", err)
117 }
118 }
119
120 func (s *IntegrationTestSuite) deleteIENode(_ *framework.Framework) {
121 if err := s.K8s.Client.Delete(s.ctx, &v1ien.IENode{ObjectMeta: metav1.ObjectMeta{
122 Name: s.IENode.Name,
123 }}); err != nil {
124 s.Framework.FailNow("failed to cleanup IENode object", err)
125 }
126 }
127
View as plain text