1 package services
2
3 import (
4 "context"
5 "database/sql"
6 "errors"
7 "testing"
8
9 "github.com/DATA-DOG/go-sqlmock"
10 "github.com/google/uuid"
11 "github.com/stretchr/testify/assert"
12
13 "edge-infra.dev/pkg/edge/api/graph/model"
14 "edge-infra.dev/pkg/edge/api/services/artifacts"
15 clustersvc "edge-infra.dev/pkg/edge/api/services/cluster"
16 sqlquery "edge-infra.dev/pkg/edge/api/sql"
17 "edge-infra.dev/pkg/edge/api/types"
18 edgeCapabilities "edge-infra.dev/pkg/edge/capabilities"
19 edgeconstants "edge-infra.dev/pkg/edge/constants"
20 "edge-infra.dev/pkg/edge/constants/api/fleet"
21 "edge-infra.dev/pkg/lib/runtime/version"
22 )
23
24 func TestCreateCluster(t *testing.T) {
25 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
26 if err != nil {
27 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
28 }
29 defer db.Close()
30 clusterGUID := uuid.NewString()
31 mock.MatchExpectationsInOrder(false)
32 mock.ExpectBegin()
33 mock.ExpectExec(sqlquery.ClusterInsertQuery).WithArgs("test-cluster", "test-project", true, true, clusterGUID, "banner_edge_id", sql.NullString{String: "site_123", Valid: true}, edgeconstants.DefaultClusterLocation, version.New().SemVer).WillReturnResult(sqlmock.NewResult(1, 1))
34 mock.ExpectQuery(sqlquery.GetLabelTypeByKey).
35 WithArgs("gke", "edge-type").
36 WillReturnRows(mock.NewRows([]string{"uuid"}).
37 AddRow(1))
38 mock.ExpectExec(sqlquery.ClusterLabelInsertQuery).WithArgs(clusterGUID, "1").
39 WillReturnResult(sqlmock.NewResult(1, 1))
40 mock.ExpectQuery(sqlquery.GetLabelsByBannerQuery).
41 WithArgs("banner_edge_id").
42 WillReturnRows(mock.NewRows([]string{"labelid", "labelkey", "color", "visible", "editable", "banner", "unique", "description", "label_type"}).
43 AddRow(testLabelID, edgeCapabilities.EdgeIDPallet, "#eeeeee", true, false, "banner_edge_id", false, "optional pallet edge capability", edgeCapabilities.EdgeCapabilitiesLabel).
44 AddRow(testLabelID2, edgeCapabilities.BSLShimsPallet, "#eeeeee", true, false, "banner_edge_id", false, "optional pallet edge capability", edgeCapabilities.EdgeCapabilitiesLabel).
45 AddRow(testLabelID3, edgeCapabilities.MetricsPallet, "#eeeeee", true, false, "banner_edge_id", false, "optional pallet edge capability", edgeCapabilities.EdgeCapabilitiesLabel).
46 AddRow(testLabelID4, "non-edge-capability-label", "#000000", true, false, "banner_edge_id", false, "test-label", "test-label"))
47 mock.ExpectExec(sqlquery.ClusterLabelInsertQuery).WithArgs(clusterGUID, testLabelID).
48 WillReturnResult(sqlmock.NewResult(1, 1))
49 mock.ExpectExec(sqlquery.ClusterLabelInsertQuery).WithArgs(clusterGUID, testLabelID2).
50 WillReturnResult(sqlmock.NewResult(1, 1))
51 mock.ExpectExec(sqlquery.ClusterLabelInsertQuery).WithArgs(clusterGUID, testLabelID3).
52 WillReturnResult(sqlmock.NewResult(1, 1))
53 mock.ExpectQuery(sqlquery.GetLabelTypeByKey).
54 WithArgs("store", "edge-fleet").
55 WillReturnRows(mock.NewRows([]string{"uuid"}).
56 AddRow(2))
57 mock.ExpectExec(sqlquery.ClusterLabelInsertQuery).WithArgs(clusterGUID, "2").
58 WillReturnResult(sqlmock.NewResult(1, 1))
59 mock.ExpectExec(sqlquery.CreateClusterArtifactVersion).WithArgs(clusterGUID, fleet.Store, version.New().SemVer).
60 WillReturnResult(sqlmock.NewResult(1, 1))
61 mock.ExpectExec(sqlquery.UpdateClusterConfig).WithArgs(clusterGUID, AutoUpdateEnabledKey, "true", sqlmock.AnyArg()).
62 WillReturnResult(sqlmock.NewResult(1, 1))
63 mock.ExpectExec(sqlquery.CreateClusterArtifactVersion).WithArgs(clusterGUID, edgeCapabilities.EdgeIDPallet, version.New().SemVer).WillReturnResult(sqlmock.NewResult(1, 1))
64 mock.ExpectExec(sqlquery.CreateClusterArtifactVersion).WithArgs(clusterGUID, edgeCapabilities.BSLShimsPallet, version.New().SemVer).WillReturnResult(sqlmock.NewResult(1, 1))
65 mock.ExpectExec(sqlquery.CreateClusterArtifactVersion).WithArgs(clusterGUID, edgeCapabilities.MetricsPallet, version.New().SemVer).WillReturnResult(sqlmock.NewResult(1, 1))
66 mock.ExpectCommit()
67
68 clusterLabelSvc := clustersvc.NewLabelService(db)
69 artifactsService := artifacts.NewArtifactsService(db, clusterLabelSvc)
70 labelsvc := NewLabelService(artifactsService, db)
71
72 regService := NewRegistrationService(nil, "test", nil, nil, nil, nil, db, nil, nil, nil, nil, labelsvc)
73
74 latest := version.New().SemVer
75 autoUpdate := true
76 payload := &model.RegistrationPayload{
77 Name: "test-cluster",
78 ClusterType: "gke",
79 Fleet: fleet.Store,
80 FleetVersion: &latest,
81 AutoUpdateEnabled: &autoUpdate,
82 }
83 if err = regService.CreateClusterSQLEntry(context.Background(), payload, "test-project", clusterGUID, "site_123", "banner_edge_id", true, edgeconstants.DefaultClusterLocation); err != nil {
84 t.Errorf("error was not expected while adding cluster: %s", err)
85 }
86
87 if err := mock.ExpectationsWereMet(); err != nil {
88 t.Errorf("there were unfulfilled expectations: %s", err)
89 }
90 }
91
92 func TestCreateClusterError(t *testing.T) {
93 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
94 if err != nil {
95 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
96 }
97 defer db.Close()
98 clusterGUID := uuid.NewString()
99 mock.ExpectBegin()
100 mock.ExpectExec(sqlquery.ClusterInsertQuery).WillReturnError(errors.New("bad statement"))
101 mock.ExpectRollback()
102 regService := NewRegistrationService(nil, "test", nil, nil, nil, nil, db, nil, nil, nil, nil, nil)
103
104 latest := types.DefaultVersionTag
105 autoUpdate := true
106 payload := &model.RegistrationPayload{
107 Name: "test-cluster",
108 ClusterType: "gke",
109 Fleet: fleet.Store,
110 FleetVersion: &latest,
111 AutoUpdateEnabled: &autoUpdate,
112 }
113 if err = regService.CreateClusterSQLEntry(context.Background(), payload, "test-project", clusterGUID, "", "banner_edge_id", false, edgeconstants.DefaultClusterLocation); err == nil {
114 t.Fatal("Error was expected")
115 }
116
117 if err := mock.ExpectationsWereMet(); err != nil {
118 t.Errorf("there were unfulfilled expectations: %s", err)
119 }
120 }
121
122 func TestIsClusterSQLEntryExist(t *testing.T) {
123 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
124 if err != nil {
125 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
126 }
127 defer db.Close()
128
129 mock.ExpectQuery(sqlquery.IsClusterExistQuery).WithArgs("test-cluster", "test-project").WillReturnRows(mock.NewRows([]string{"exist"}).AddRow(true))
130 regService := NewRegistrationService(nil, "test", nil, nil, nil, nil, db, nil, nil, nil, nil, nil)
131 exist, err := regService.IsClusterSQLEntryExist(context.Background(), "test-cluster", "test-project")
132 if err != nil {
133 t.Errorf("error was not expected while updating cluster: %s", err)
134 }
135 if !exist {
136 t.Errorf("cluster was not expected to exist")
137 }
138 }
139
140 func TestUpdateCluster(t *testing.T) {
141 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
142 if err != nil {
143 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
144 }
145 defer db.Close()
146
147 mock.MatchExpectationsInOrder(false)
148 mock.ExpectExec(sqlquery.ClusterUpdateQuery).WithArgs(true, "mv8wx3jwjgtg").WillReturnResult(sqlmock.NewResult(1, 1))
149 regService := NewRegistrationService(nil, "test", nil, nil, nil, nil, db, nil, nil, nil, nil, nil)
150 if err = regService.UpdateClusterSQLEntry(context.Background(), true, "mv8wx3jwjgtg"); err != nil {
151 t.Errorf("error was not expected while updating cluster: %s", err)
152 }
153
154 if err := mock.ExpectationsWereMet(); err != nil {
155 t.Errorf("there were unfulfilled expectations: %s", err)
156 }
157 }
158
159 func TestUpdateClusterError(t *testing.T) {
160 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
161 if err != nil {
162 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
163 }
164 defer db.Close()
165 mock.ExpectExec(sqlquery.ClusterUpdateQuery).WillReturnError(errors.New("bad statement"))
166 regService := NewRegistrationService(nil, "test", nil, nil, nil, nil, db, nil, nil, nil, nil, nil)
167
168 if err = regService.UpdateClusterSQLEntry(context.Background(), false, ""); err == nil {
169 t.Fatal("Error was expected")
170 }
171
172 if err := mock.ExpectationsWereMet(); err != nil {
173 t.Errorf("there were unfulfilled expectations: %s", err)
174 }
175 }
176
177 func TestCreateAClusterCR(t *testing.T) {
178 regService := NewRegistrationService(nil, "test", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
179 optional := "test-value"
180 clusterInfo := &model.ClusterInfo{
181 Location: "test-location",
182 NodeVersion: &optional,
183 MachineType: "test-machine-type",
184 NumNodes: 3,
185 Autoscale: false,
186 MinNodes: nil,
187 MaxNodes: nil,
188 }
189
190 banner := &model.Banner{
191 Name: "test-banner",
192 BannerEdgeID: "test-banner-edge-id",
193 }
194
195 clusterCRBase64, err := regService.CreateAClusterCR(context.Background(), "gke", "test-cluster", "test-project", "store", "test-org", uuid.NewString(), banner, clusterInfo)
196 assert.NoError(t, err)
197 assert.NotEmpty(t, clusterCRBase64)
198 }
199
View as plain text