| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- package keyrotate_test
- import (
- "os"
- "testing"
- "time"
- "github.com/porter-dev/porter/api/server/shared/config/env"
- "github.com/porter-dev/porter/api/types"
- "github.com/porter-dev/porter/internal/adapter"
- "github.com/porter-dev/porter/internal/models"
- ints "github.com/porter-dev/porter/internal/models/integrations"
- "github.com/porter-dev/porter/internal/repository"
- "github.com/porter-dev/porter/internal/repository/gorm"
- _gorm "gorm.io/gorm"
- )
- type tester struct {
- Key *[32]byte
- DB *_gorm.DB
- repo repository.Repository
- dbFileName string
- key *[32]byte
- initUsers []*models.User
- initProjects []*models.Project
- initGRs []*models.GitRepo
- initRegs []*models.Registry
- initClusters []*models.Cluster
- initHRs []*models.HelmRepo
- initInfras []*models.Infra
- initReleases []*models.Release
- initCCs []*models.ClusterCandidate
- initKIs []*ints.KubeIntegration
- initBasics []*ints.BasicIntegration
- initOIDCs []*ints.OIDCIntegration
- initOAuths []*ints.OAuthIntegration
- initGCPs []*ints.GCPIntegration
- initAWSs []*ints.AWSIntegration
- }
- func setupTestEnv(tester *tester, t *testing.T) {
- t.Helper()
- db, err := adapter.New(&env.DBConf{
- EncryptionKey: "__random_strong_encryption_key__",
- SQLLite: true,
- SQLLitePath: tester.dbFileName,
- })
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- err = db.AutoMigrate(
- &models.Project{},
- &models.Role{},
- &models.User{},
- &models.Session{},
- &models.GitRepo{},
- &models.Registry{},
- &models.Release{},
- &models.Environment{},
- &models.Deployment{},
- &models.HelmRepo{},
- &models.Cluster{},
- &models.ClusterCandidate{},
- &models.ClusterResolver{},
- &models.Infra{},
- &models.GitActionConfig{},
- &models.Onboarding{},
- &ints.KubeIntegration{},
- &ints.BasicIntegration{},
- &ints.OIDCIntegration{},
- &ints.OAuthIntegration{},
- &ints.GCPIntegration{},
- &ints.AWSIntegration{},
- &ints.ClusterTokenCache{},
- &ints.RegTokenCache{},
- &ints.HelmRepoTokenCache{},
- )
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- var key [32]byte
- for i, b := range []byte("__random_strong_encryption_key__") {
- key[i] = b
- }
- tester.key = &key
- tester.Key = &key
- tester.DB = db
- tester.repo = gorm.NewRepository(db, &key, nil)
- }
- func cleanup(tester *tester, t *testing.T) {
- t.Helper()
- // remove the created file file
- os.Remove(tester.dbFileName)
- }
- func initUser(tester *tester, t *testing.T) {
- t.Helper()
- user := &models.User{
- Email: "example@example.com",
- Password: "hello1234",
- }
- user, err := tester.repo.User().CreateUser(user)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initUsers = append(tester.initUsers, user)
- }
- func initProject(tester *tester, t *testing.T) {
- t.Helper()
- proj := &models.Project{
- Name: "project-test",
- }
- proj, err := tester.repo.Project().CreateProject(proj)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initProjects = append(tester.initProjects, proj)
- }
- func initProjectRole(tester *tester, t *testing.T) {
- t.Helper()
- role := &models.Role{
- Role: types.Role{
- Kind: types.RoleAdmin,
- UserID: tester.initUsers[0].Model.ID,
- ProjectID: tester.initProjects[0].Model.ID,
- },
- }
- role, err := tester.repo.Project().CreateProjectRole(tester.initProjects[0], role)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- }
- func initKubeIntegration(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initUsers) == 0 {
- initUser(tester, t)
- }
- ki := &ints.KubeIntegration{
- Mechanism: ints.KubeLocal,
- ProjectID: tester.initProjects[0].ID,
- UserID: tester.initUsers[0].ID,
- Kubeconfig: []byte("current-context: testing\n"),
- ClientCertificateData: []byte("clientcertdata"),
- ClientKeyData: []byte("clientkeydata"),
- Token: []byte("token"),
- Username: []byte("username"),
- Password: []byte("password"),
- }
- ki, err := tester.repo.KubeIntegration().CreateKubeIntegration(ki)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initKIs = append(tester.initKIs, ki)
- }
- func initBasicIntegration(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initUsers) == 0 {
- initUser(tester, t)
- }
- basic := &ints.BasicIntegration{
- ProjectID: tester.initProjects[0].ID,
- UserID: tester.initUsers[0].ID,
- Username: []byte("username"),
- Password: []byte("password"),
- }
- basic, err := tester.repo.BasicIntegration().CreateBasicIntegration(basic)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initBasics = append(tester.initBasics, basic)
- }
- func initOIDCIntegration(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initUsers) == 0 {
- initUser(tester, t)
- }
- oidc := &ints.OIDCIntegration{
- Client: ints.OIDCKube,
- ProjectID: tester.initProjects[0].ID,
- UserID: tester.initUsers[0].ID,
- IssuerURL: []byte("https://oidc.example.com"),
- ClientID: []byte("exampleclientid"),
- ClientSecret: []byte("exampleclientsecret"),
- CertificateAuthorityData: []byte("cadata"),
- IDToken: []byte("idtoken"),
- RefreshToken: []byte("refreshtoken"),
- }
- oidc, err := tester.repo.OIDCIntegration().CreateOIDCIntegration(oidc)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initOIDCs = append(tester.initOIDCs, oidc)
- }
- func initOAuthIntegration(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initUsers) == 0 {
- initUser(tester, t)
- }
- oauth := &ints.OAuthIntegration{
- SharedOAuthModel: ints.SharedOAuthModel{
- ClientID: []byte("exampleclientid"),
- AccessToken: []byte("idtoken"),
- RefreshToken: []byte("refreshtoken"),
- },
- Client: types.OAuthGithub,
- ProjectID: tester.initProjects[0].ID,
- UserID: tester.initUsers[0].ID,
- }
- oauth, err := tester.repo.OAuthIntegration().CreateOAuthIntegration(oauth)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initOAuths = append(tester.initOAuths, oauth)
- }
- func initGCPIntegration(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initUsers) == 0 {
- initUser(tester, t)
- }
- gcp := &ints.GCPIntegration{
- ProjectID: tester.initProjects[0].ID,
- UserID: tester.initUsers[0].ID,
- GCPProjectID: "test-proj-123456",
- GCPUserEmail: "test@test.it",
- GCPKeyData: []byte("{\"test\":\"key\"}"),
- }
- gcp, err := tester.repo.GCPIntegration().CreateGCPIntegration(gcp)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initGCPs = append(tester.initGCPs, gcp)
- }
- func initAWSIntegration(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initUsers) == 0 {
- initUser(tester, t)
- }
- aws := &ints.AWSIntegration{
- ProjectID: tester.initProjects[0].ID,
- UserID: tester.initUsers[0].ID,
- AWSClusterID: []byte("example-cluster-0"),
- AWSAccessKeyID: []byte("accesskey"),
- AWSSecretAccessKey: []byte("secret"),
- AWSSessionToken: []byte("optional"),
- }
- aws, err := tester.repo.AWSIntegration().CreateAWSIntegration(aws)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initAWSs = append(tester.initAWSs, aws)
- }
- func initClusterCandidate(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(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"),
- }
- cc, err := tester.repo.Cluster().CreateClusterCandidate(cc)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initCCs = append(tester.initCCs, cc)
- }
- func initCluster(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initKIs) == 0 {
- initKubeIntegration(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)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initClusters = append(tester.initClusters, cluster)
- }
- func initGitRepo(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- if len(tester.initOAuths) == 0 {
- initOAuthIntegration(tester, t)
- }
- gr := &models.GitRepo{
- ProjectID: tester.initProjects[0].ID,
- RepoEntity: "porter-dev",
- OAuthIntegrationID: tester.initOAuths[0].ID,
- }
- gr, err := tester.repo.GitRepo().CreateGitRepo(gr)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initGRs = append(tester.initGRs, gr)
- }
- func initRegistry(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- reg := &models.Registry{
- ProjectID: tester.initProjects[0].ID,
- Name: "registry-test",
- TokenCache: ints.RegTokenCache{
- TokenCache: ints.TokenCache{
- Token: []byte("token-1"),
- Expiry: time.Now().Add(-1 * time.Hour),
- },
- },
- }
- reg, err := tester.repo.Registry().CreateRegistry(reg)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initRegs = append(tester.initRegs, reg)
- }
- func initHelmRepo(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- hr := &models.HelmRepo{
- Name: "helm-repo-test",
- RepoURL: "https://example-repo.com",
- ProjectID: tester.initProjects[0].Model.ID,
- TokenCache: ints.HelmRepoTokenCache{
- TokenCache: ints.TokenCache{
- Token: []byte("token-1"),
- Expiry: time.Now().Add(-1 * time.Hour),
- },
- },
- }
- hr, err := tester.repo.HelmRepo().CreateHelmRepo(hr)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initHRs = append(tester.initHRs, hr)
- }
- func initInfra(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- infra := &models.Infra{
- Kind: types.InfraECR,
- ProjectID: tester.initProjects[0].Model.ID,
- Status: types.StatusCreated,
- LastApplied: []byte("testing"),
- }
- infra, err := tester.repo.Infra().CreateInfra(infra)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initInfras = append(tester.initInfras, infra)
- }
- func initRelease(tester *tester, t *testing.T) {
- t.Helper()
- if len(tester.initProjects) == 0 {
- initProject(tester, t)
- }
- release := &models.Release{
- Name: "denver-meister-dakota",
- Namespace: "default",
- ProjectID: 1,
- ClusterID: 1,
- WebhookToken: "abcdefgh",
- }
- release, err := tester.repo.Release().CreateRelease(release)
- if err != nil {
- t.Fatalf("%v\n", err)
- }
- tester.initReleases = append(tester.initReleases, release)
- }
|