| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 |
- package gorm_test
- import (
- "testing"
- "time"
- "github.com/go-test/deep"
- "github.com/porter-dev/porter/api/types"
- "github.com/porter-dev/porter/internal/features"
- "github.com/porter-dev/porter/internal/models"
- ints "github.com/porter-dev/porter/internal/models/integrations"
- orm "gorm.io/gorm"
- )
- func TestCreateClusterCandidate(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_create_cc.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- defer cleanup(tester, t)
- cc := &models.ClusterCandidate{
- AuthMechanism: models.AWS,
- ProjectID: tester.initProjects[0].ID,
- CreatedClusterID: 0,
- Resolvers: []models.ClusterResolver{},
- Name: "cluster-test",
- Server: "https://localhost",
- ContextName: "context-test",
- AWSClusterIDGuess: []byte("example-cluster-0"),
- Kubeconfig: []byte("current-context: testing\n"),
- }
- expCC := *cc
- cc, err := tester.repo.Cluster().CreateClusterCandidate(cc)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- cc, err = tester.repo.Cluster().ReadClusterCandidate(tester.initProjects[0].ID, cc.Model.ID)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- // make sure id is 1
- if cc.Model.ID != 1 {
- t.Errorf("incorrect cluster candidate ID: expected %d, got %d\n", 1, cc.Model.ID)
- }
- // reset fields for deep.Equal
- cc.Model = orm.Model{}
- if diff := deep.Equal(expCC, *cc); diff != nil {
- t.Errorf("incorrect cluster candidate")
- t.Error(diff)
- }
- }
- func TestCreateClusterCandidateWithResolvers(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_create_cc.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- defer cleanup(tester, t)
- cc := &models.ClusterCandidate{
- AuthMechanism: models.AWS,
- ProjectID: tester.initProjects[0].ID,
- CreatedClusterID: 0,
- Resolvers: []models.ClusterResolver{
- {
- Name: types.ClusterLocalhost,
- Resolved: false,
- },
- },
- Name: "cluster-test",
- Server: "https://localhost",
- ContextName: "context-test",
- AWSClusterIDGuess: []byte("example-cluster-0"),
- Kubeconfig: []byte("current-context: testing\n"),
- }
- expCC := *cc
- cc, err := tester.repo.Cluster().CreateClusterCandidate(cc)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- cc, err = tester.repo.Cluster().ReadClusterCandidate(tester.initProjects[0].ID, cc.Model.ID)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- // make sure id is 1
- if cc.Model.ID != 1 {
- t.Errorf("incorrect cluster candidate ID: expected %d, got %d\n", 1, cc.Model.ID)
- }
- // make sure length of resolvers is 1
- if len(cc.Resolvers) != 1 {
- t.Fatalf("incorrect cluster candidate resolvers length: expected %d, got %d\n", 1, len(cc.Resolvers))
- }
- // make sure resolver cluster candidate id is 1
- if cc.Resolvers[0].ClusterCandidateID != 1 {
- t.Errorf("incorrect resolver ClusterCandidateID: expected %d, got %d\n", 1, cc.Resolvers[0].ClusterCandidateID)
- }
- // reset fields for deep.Equal
- cc.Model = orm.Model{}
- cc.Resolvers[0].Model = orm.Model{}
- expCC.Resolvers[0].Model = orm.Model{}
- expCC.Resolvers[0].ClusterCandidateID = 1
- if diff := deep.Equal(expCC, *cc); diff != nil {
- t.Errorf("incorrect cluster candidate")
- t.Error(diff)
- }
- }
- func TestListClusterCandidatesByProjectID(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_list_ccs.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- initClusterCandidate(tester, t)
- defer cleanup(tester, t)
- ccs, err := tester.repo.Cluster().ListClusterCandidatesByProjectID(
- tester.initProjects[0].Model.ID,
- )
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- if len(ccs) != 1 {
- t.Fatalf("length of cluster candidates incorrect: expected %d, got %d\n", 1, len(ccs))
- }
- // make sure data is correct
- expCC := models.ClusterCandidate{
- AuthMechanism: models.AWS,
- ProjectID: tester.initProjects[0].ID,
- CreatedClusterID: 0,
- Resolvers: []models.ClusterResolver{},
- Name: "cluster-test",
- Server: "https://localhost",
- ContextName: "context-test",
- AWSClusterIDGuess: []byte("example-cluster-0"),
- Kubeconfig: []byte("current-context: testing\n"),
- }
- cc := ccs[0]
- // reset fields for reflect.DeepEqual
- cc.Model = orm.Model{}
- if diff := deep.Equal(expCC, *cc); diff != nil {
- t.Errorf("incorrect cluster candidate")
- t.Error(diff)
- }
- }
- func TestUpdateClusterCandidateCreatedClusterID(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_update_cc_cluster_id.db",
- }
- setupTestEnv(tester, t)
- initClusterCandidate(tester, t)
- initCluster(tester, t)
- defer cleanup(tester, t)
- cc, err := tester.repo.Cluster().UpdateClusterCandidateCreatedClusterID(
- tester.initCCs[0].ID,
- tester.initClusters[0].ID,
- )
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- expCC := models.ClusterCandidate{
- AuthMechanism: models.AWS,
- ProjectID: tester.initProjects[0].ID,
- CreatedClusterID: tester.initClusters[0].ID,
- Name: "cluster-test",
- Server: "https://localhost",
- ContextName: "context-test",
- AWSClusterIDGuess: []byte("example-cluster-0"),
- Kubeconfig: []byte("current-context: testing\n"),
- }
- // reset fields for reflect.DeepEqual
- cc.Model = orm.Model{}
- if diff := deep.Equal(expCC, *cc); diff != nil {
- t.Errorf("incorrect cluster candidate")
- t.Error(diff)
- }
- }
- func TestCreateCluster(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_create_cluster.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- initKubeIntegration(tester, t)
- defer cleanup(tester, t)
- cluster := &models.Cluster{
- ProjectID: tester.initProjects[0].ID,
- Name: "cluster-test",
- Server: "https://localhost",
- KubeIntegrationID: tester.initKIs[0].ID,
- CertificateAuthorityData: []byte("-----BEGIN"),
- }
- expCluster := *cluster
- cluster, err := tester.repo.Cluster().CreateCluster(cluster, &features.Client{})
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- cluster, err = tester.repo.Cluster().ReadCluster(tester.initProjects[0].ID, cluster.Model.ID)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- // make sure id is 1
- if cluster.Model.ID != 1 {
- t.Errorf("incorrect cluster ID: expected %d, got %d\n", 1, cluster.Model.ID)
- }
- // reset fields for deep.Equal
- expCluster.TokenCacheID = 1
- expCluster.TokenCache.ClusterID = 1
- cluster.Model = orm.Model{}
- cluster.TokenCache.Model = orm.Model{}
- if diff := deep.Equal(expCluster, *cluster); diff != nil {
- t.Errorf("incorrect cluster")
- t.Error(diff)
- }
- }
- func TestListClustersByProjectID(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_list_clusters.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- initCluster(tester, t)
- defer cleanup(tester, t)
- clusters, err := tester.repo.Cluster().ListClustersByProjectID(
- tester.initProjects[0].Model.ID,
- )
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- if len(clusters) != 1 {
- t.Fatalf("length of clusters incorrect: expected %d, got %d\n", 1, len(clusters))
- }
- // make sure data is correct
- expCluster := models.Cluster{
- ProjectID: tester.initProjects[0].ID,
- Name: "cluster-test",
- Server: "https://localhost",
- KubeIntegrationID: tester.initKIs[0].ID,
- CertificateAuthorityData: []byte("-----BEGIN"),
- TokenCacheID: 1,
- }
- cluster := clusters[0]
- // reset fields for reflect.DeepEqual
- cluster.Model = orm.Model{}
- cluster.TokenCache.Model = orm.Model{}
- if diff := deep.Equal(expCluster, *cluster); diff != nil {
- t.Errorf("incorrect cluster")
- t.Error(diff)
- }
- }
- func TestUpdateCluster(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_update_cluster.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- initCluster(tester, t)
- defer cleanup(tester, t)
- cluster := tester.initClusters[0]
- cluster.Name = "cluster-new-name"
- cluster, err := tester.repo.Cluster().UpdateCluster(
- cluster,
- &features.Client{},
- )
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- cluster, err = tester.repo.Cluster().ReadCluster(tester.initProjects[0].ID, tester.initClusters[0].ID)
- // make sure data is correct
- expCluster := models.Cluster{
- ProjectID: tester.initProjects[0].ID,
- Name: "cluster-new-name",
- Server: "https://localhost",
- KubeIntegrationID: tester.initKIs[0].ID,
- CertificateAuthorityData: []byte("-----BEGIN"),
- TokenCacheID: 1,
- TokenCache: ints.ClusterTokenCache{
- ClusterID: 1,
- },
- }
- // reset fields for reflect.DeepEqual
- cluster.Model = orm.Model{}
- cluster.TokenCache.Model = orm.Model{}
- if diff := deep.Equal(expCluster, *cluster); diff != nil {
- t.Errorf("incorrect cluster")
- t.Error(diff)
- }
- }
- func TestUpdateClusterToken(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_test_update_cluster_token.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- initKubeIntegration(tester, t)
- defer cleanup(tester, t)
- cluster := &models.Cluster{
- ProjectID: tester.initProjects[0].ID,
- Name: "cluster-test",
- Server: "https://localhost",
- KubeIntegrationID: tester.initKIs[0].ID,
- CertificateAuthorityData: []byte("-----BEGIN"),
- TokenCache: ints.ClusterTokenCache{
- TokenCache: ints.TokenCache{
- Token: []byte("token-1"),
- Expiry: time.Now().Add(-1 * time.Hour),
- },
- },
- }
- cluster, err := tester.repo.Cluster().CreateCluster(cluster, &features.Client{})
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- cluster, err = tester.repo.Cluster().ReadCluster(tester.initProjects[0].ID, cluster.Model.ID)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- // make sure cluster id of token is 1
- if cluster.TokenCache.ClusterID != 1 {
- t.Fatalf("incorrect cluster id in token cache: expected %d, got %d\n", 1, cluster.TokenCache.ClusterID)
- }
- // make sure old token is token-1
- if string(cluster.TokenCache.Token) != "token-1" {
- t.Errorf("incorrect token in cache: expected %s, got %s\n", "token-1", cluster.TokenCache.Token)
- }
- // make sure old token is expired
- if isExpired := cluster.TokenCache.IsExpired(); !isExpired {
- t.Fatalf("token was not expired\n")
- }
- cluster.TokenCache.Token = []byte("token-2")
- cluster.TokenCache.Expiry = time.Now().Add(24 * time.Hour)
- cluster, err = tester.repo.Cluster().UpdateClusterTokenCache(&cluster.TokenCache)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- cluster, err = tester.repo.Cluster().ReadCluster(tester.initProjects[0].ID, cluster.Model.ID)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- // make sure id is 1
- if cluster.Model.ID != 1 {
- t.Errorf("incorrect service account ID: expected %d, got %d\n", 1, cluster.Model.ID)
- }
- // make sure new token is correct and not expired
- if cluster.TokenCache.ClusterID != 1 {
- t.Fatalf("incorrect service account ID in token cache: expected %d, got %d\n", 1, cluster.TokenCache.ClusterID)
- }
- if isExpired := cluster.TokenCache.IsExpired(); isExpired {
- t.Fatalf("token was expired\n")
- }
- if string(cluster.TokenCache.Token) != "token-2" {
- t.Errorf("incorrect token in cache: expected %s, got %s\n", "token-2", cluster.TokenCache.Token)
- }
- }
- func TestDeleteCluster(t *testing.T) {
- tester := &tester{
- dbFileName: "./porter_delete_cluster.db",
- }
- setupTestEnv(tester, t)
- initProject(tester, t)
- initCluster(tester, t)
- defer cleanup(tester, t)
- cluster, err := tester.repo.Cluster().ReadCluster(tester.initProjects[0].ID, tester.initClusters[0].Model.ID)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- err = tester.repo.Cluster().DeleteCluster(cluster)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- _, err = tester.repo.Cluster().ReadCluster(tester.initProjects[0].ID, tester.initClusters[0].Model.ID)
- if err != orm.ErrRecordNotFound {
- t.Fatalf("incorrect error: expected %v, got %v\n", orm.ErrRecordNotFound, err)
- }
- clusters, err := tester.repo.Cluster().ListClustersByProjectID(tester.initProjects[0].Model.ID)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- if len(clusters) != 0 {
- t.Fatalf("length of clusters was not 0")
- }
- }
|