...

Source file src/edge-infra.dev/pkg/edge/api/services/registration_service_test.go

Documentation: edge-infra.dev/pkg/edge/api/services

     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