diff --git a/.gitignore b/.gitignore index 46dbe4d6..1ad1f26a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ hack/deployment-norbac.yaml hack/deployment-rbac.yaml hack/deployment-norbac-helm.yaml .vscode -.idea/ \ No newline at end of file +.idea/ +tests.out \ No newline at end of file diff --git a/Makefile b/Makefile index 1e55877c..0ce3d170 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,8 @@ arm: build-binaries compress fetch-certs armhf aarch64 test: go get github.com/mfridman/tparse - go test -json -v `go list ./... | egrep -v /tests` -cover | tparse -all -smallscreen + go test -json -v `go list ./... | egrep -v /tests` -cover > tests.out + tparse -all -smallscreen tests.out build: @echo "++ Building keel" diff --git a/bot/hipchat/hipchat_test.go b/bot/hipchat/hipchat_test.go index 0ac06bca..f66d7e1a 100644 --- a/bot/hipchat/hipchat_test.go +++ b/bot/hipchat/hipchat_test.go @@ -1,7 +1,9 @@ package hipchat import ( + "io/ioutil" "os" + "path/filepath" "regexp" "strings" "testing" @@ -11,7 +13,8 @@ import ( "github.com/keel-hq/keel/approvals" b "github.com/keel-hq/keel/bot" - "github.com/keel-hq/keel/cache/memory" + "github.com/keel-hq/keel/pkg/store/sql" + "github.com/keel-hq/keel/provider/kubernetes" "github.com/keel-hq/keel/types" @@ -104,12 +107,35 @@ func init() { log.SetLevel(log.DebugLevel) } +func newTestingUtils() (*sql.SQLStore, func()) { + dir, err := ioutil.TempDir("", "whstoretest") + if err != nil { + log.Fatal(err) + } + tmpfn := filepath.Join(dir, "gorm.db") + // defer + store, err := sql.New(sql.Opts{DatabaseType: "sqlite3", URI: tmpfn}) + if err != nil { + log.Fatal(err) + } + + teardown := func() { + os.RemoveAll(dir) // clean up + } + + return store, teardown +} + func TestHelpCommand(t *testing.T) { f8s := &testutil.FakeK8sImplementer{} fi := &fakeXmppImplementer{} fi.messages = make(chan *h.Message) - mem := memory.NewMemoryCache() - am := approvals.New(mem) + + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) NewBot(f8s, am, fi) defer b.Stop() @@ -138,8 +164,11 @@ func TestBotAproval(t *testing.T) { f8s := &testutil.FakeK8sImplementer{} fi := &fakeXmppImplementer{} fi.messages = make(chan *h.Message) - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) NewBot(f8s, am, fi) defer b.Stop() @@ -200,8 +229,11 @@ func TestBotReject(t *testing.T) { f8s := &testutil.FakeK8sImplementer{} fi := &fakeXmppImplementer{} fi.messages = make(chan *h.Message) - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) NewBot(f8s, am, fi) defer b.Stop() diff --git a/bot/slack/slack.go b/bot/slack/slack.go index 48229b48..32a996cc 100644 --- a/bot/slack/slack.go +++ b/bot/slack/slack.go @@ -130,7 +130,7 @@ func (b *Bot) startInternal() error { case *slack.PresenceChangeEvent: // nothing to do case *slack.RTMError: - log.Error("Error: %s", ev.Error()) + log.Errorf("Error: %s", ev.Error()) case *slack.InvalidAuthEvent: log.Error("Invalid credentials") return fmt.Errorf("invalid credentials") diff --git a/bot/slack/slack_test.go b/bot/slack/slack_test.go index 4bc4ede5..262a8462 100644 --- a/bot/slack/slack_test.go +++ b/bot/slack/slack_test.go @@ -2,17 +2,22 @@ package slack import ( "fmt" + "io/ioutil" + "log" "os" + "path/filepath" "time" "github.com/nlopes/slack" "github.com/keel-hq/keel/extension/approval" + "github.com/keel-hq/keel/pkg/store/sql" "github.com/keel-hq/keel/provider/kubernetes" "github.com/keel-hq/keel/approvals" b "github.com/keel-hq/keel/bot" - "github.com/keel-hq/keel/cache/memory" + + // "github.com/keel-hq/keel/cache/memory" "github.com/keel-hq/keel/constants" "github.com/keel-hq/keel/types" @@ -83,20 +88,42 @@ func (i *fakeSlackImplementer) PostMessage(channelID string, options ...slack.Ms return "", "", nil } +func newTestingUtils() (*sql.SQLStore, func()) { + dir, err := ioutil.TempDir("", "whstoretest") + if err != nil { + log.Fatal(err) + } + tmpfn := filepath.Join(dir, "gorm.db") + // defer + store, err := sql.New(sql.Opts{DatabaseType: "sqlite3", URI: tmpfn}) + if err != nil { + log.Fatal(err) + } + + teardown := func() { + os.RemoveAll(dir) // clean up + } + + return store, teardown +} + func TestBotRequest(t *testing.T) { os.Setenv(constants.EnvSlackToken, "") f8s := &testutil.FakeK8sImplementer{} fi := &fakeSlackImplementer{} - mem := memory.NewMemoryCache() token := os.Getenv(constants.EnvSlackToken) if token == "" { t.Skip() } - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) New("keel", token, "approvals", f8s, am, fi) defer b.Stop() @@ -133,14 +160,17 @@ func TestProcessApprovedResponse(t *testing.T) { f8s := &testutil.FakeK8sImplementer{} fi := &fakeSlackImplementer{} - mem := memory.NewMemoryCache() token := os.Getenv(constants.EnvSlackToken) if token == "" { t.Skip() } - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) New("keel", token, "approvals", f8s, am, fi) defer b.Stop() @@ -177,14 +207,17 @@ func TestProcessApprovalReply(t *testing.T) { f8s := &testutil.FakeK8sImplementer{} fi := &fakeSlackImplementer{} - mem := memory.NewMemoryCache() token := os.Getenv(constants.EnvSlackToken) if token == "" { t.Skip() } - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) identifier := "k8s/project/repo:1.2.3" @@ -245,7 +278,6 @@ func TestProcessRejectedReply(t *testing.T) { f8s := &testutil.FakeK8sImplementer{} fi := &fakeSlackImplementer{} - mem := memory.NewMemoryCache() token := os.Getenv(constants.EnvSlackToken) if token == "" { @@ -254,7 +286,11 @@ func TestProcessRejectedReply(t *testing.T) { identifier := "k8s/project/repo:1.2.3" - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) // creating initial approve request err := am.Create(&types.Approval{ Identifier: identifier, @@ -314,30 +350,7 @@ func TestProcessRejectedReply(t *testing.T) { } func TestIsApproval(t *testing.T) { - // f8s := &testutil.FakeK8sImplementer{} - // mem := memory.NewMemoryCache(100*time.Hour, 100*time.Hour, 100*time.Hour) - // - // identifier := "k8s/project/repo:1.2.3" - // - // am := approvals.New(mem) - // // creating initial approve request - // err := am.Create(&types.Approval{ - // Identifier: identifier, - // VotesRequired: 2, - // CurrentVersion: "2.3.4", - // NewVersion: "3.4.5", - // Event: &types.Event{ - // Repository: types.Repository{ - // Name: "project/repo", - // Tag: "2.3.4", - // }, - // }, - // }) - // - // if err != nil { - // t.Fatalf("unexpected error while creating : %s", err) - // } - // bot := New("keel", "random", "approvals", f8s, am, fi) + event := &slack.MessageEvent{ Msg: slack.Msg{ Channel: "approvals", diff --git a/provider/helm/helm_test.go b/provider/helm/helm_test.go index 159c8727..98e1fc27 100644 --- a/provider/helm/helm_test.go +++ b/provider/helm/helm_test.go @@ -1,14 +1,18 @@ package helm import ( + "io/ioutil" + "log" + "os" + "path/filepath" "reflect" "testing" "github.com/ghodss/yaml" "github.com/keel-hq/keel/approvals" - "github.com/keel-hq/keel/cache/memory" "github.com/keel-hq/keel/extension/notification" "github.com/keel-hq/keel/internal/policy" + "github.com/keel-hq/keel/pkg/store/sql" "github.com/keel-hq/keel/types" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/helm" @@ -17,10 +21,30 @@ import ( rls "k8s.io/helm/pkg/proto/hapi/services" ) -func approver() *approvals.DefaultManager { - cache := memory.NewMemoryCache() +func newTestingUtils() (*sql.SQLStore, func()) { + dir, err := ioutil.TempDir("", "whstoretest") + if err != nil { + log.Fatal(err) + } + tmpfn := filepath.Join(dir, "gorm.db") + // defer + store, err := sql.New(sql.Opts{DatabaseType: "sqlite3", URI: tmpfn}) + if err != nil { + log.Fatal(err) + } - return approvals.New(cache) + teardown := func() { + os.RemoveAll(dir) // clean up + } + + return store, teardown +} + +func approver() (*approvals.DefaultManager, func()) { + store, teardown := newTestingUtils() + return approvals.New(&approvals.Opts{ + Store: store, + }), teardown } type fakeSender struct { @@ -221,7 +245,9 @@ keel: }, } - prov := NewProvider(fakeImpl, &fakeSender{}, approver()) + approver, teardown := approver() + defer teardown() + prov := NewProvider(fakeImpl, &fakeSender{}, approver) tracked, _ := prov.TrackedImages() @@ -262,7 +288,9 @@ image2: }, } - prov := NewProvider(fakeImpl, &fakeSender{}, approver()) + approver, teardown := approver() + defer teardown() + prov := NewProvider(fakeImpl, &fakeSender{}, approver) tracked, _ := prov.TrackedImages() @@ -311,7 +339,9 @@ keel: }, } - prov := NewProvider(fakeImpl, &fakeSender{}, approver()) + approver, teardown := approver() + defer teardown() + prov := NewProvider(fakeImpl, &fakeSender{}, approver) tracked, _ := prov.TrackedImages() @@ -379,7 +409,6 @@ func TestGetImagesFromConfig(t *testing.T) { } func TestUpdateRelease(t *testing.T) { - // imp := NewHelmImplementer("192.168.99.100:30083") chartVals := ` name: al Rashid @@ -414,7 +443,9 @@ keel: }, } - provider := NewProvider(fakeImpl, &fakeSender{}, approver()) + approver, teardown := approver() + defer teardown() + provider := NewProvider(fakeImpl, &fakeSender{}, approver) err := provider.processEvent(&types.Event{ Repository: types.Repository{ diff --git a/provider/kubernetes/approvals_test.go b/provider/kubernetes/approvals_test.go index 75c96361..decafc5d 100644 --- a/provider/kubernetes/approvals_test.go +++ b/provider/kubernetes/approvals_test.go @@ -52,7 +52,8 @@ func TestCheckRequestedApproval(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - approver := approver() + approver, teardown := approver() + defer teardown() provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) @@ -127,7 +128,8 @@ func TestCheckRequestedApprovalAnnotation(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - approver := approver() + approver, teardown := approver() + defer teardown() provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) @@ -204,7 +206,8 @@ func TestApprovedCheck(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - approver := approver() + approver, teardown := approver() + defer teardown() provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) @@ -284,7 +287,8 @@ func TestApprovalsCleanup(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - approver := approver() + approver, teardown := approver() + defer teardown() provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) @@ -331,7 +335,8 @@ func TestApprovalsCleanup(t *testing.T) { t.Fatalf("failed to get a list of approvals: %s", err) } - if len(approvals) != 0 { - t.Errorf("expected to find 0 but found %d", len(approvals)) + if len(approvals) != 1 && !approvals[0].Archived { + t.Errorf("expected to find 1 archived approval but found %d", len(approvals)) + t.Logf("approval status: %v, identifier: %s", approvals[0].Archived, approvals[0].Identifier) } } diff --git a/provider/kubernetes/kubernetes.go b/provider/kubernetes/kubernetes.go index ea970c16..db6c5c53 100644 --- a/provider/kubernetes/kubernetes.go +++ b/provider/kubernetes/kubernetes.go @@ -329,7 +329,7 @@ func (p *Provider) updateDeployments(plans []*UpdatePlan) (updated []*k8s.Generi "name": resource.Name, "kind": resource.Kind(), "namespace": resource.Namespace, - }).Warn("provider.kubernetes: got error while resetting approvals counter after successful update") + }).Warn("provider.kubernetes: got error while archiving approvals counter after successful update") } var msg string @@ -340,7 +340,7 @@ func (p *Provider) updateDeployments(plans []*UpdatePlan) (updated []*k8s.Generi msg = fmt.Sprintf("Successfully updated %s %s/%s %s->%s (%s)", resource.Kind(), resource.Namespace, resource.Name, plan.CurrentVersion, plan.NewVersion, strings.Join(resource.GetImages(), ", ")) } - p.sender.Send(types.EventNotification{ + err = p.sender.Send(types.EventNotification{ ResourceKind: resource.Kind(), Identifier: resource.Identifier, Name: "update resource", @@ -355,6 +355,16 @@ func (p *Provider) updateDeployments(plans []*UpdatePlan) (updated []*k8s.Generi "name": resource.GetName(), }, }) + if err != nil { + log.WithFields(log.Fields{ + "error": err, + "name": resource.Name, + "kind": resource.Kind(), + "previous": plan.CurrentVersion, + "new": plan.NewVersion, + "namespace": resource.Namespace, + }).Error("provider.kubernetes: got error while sending notification") + } log.WithFields(log.Fields{ "name": resource.Name, diff --git a/provider/kubernetes/kubernetes_test.go b/provider/kubernetes/kubernetes_test.go index 76b62b7a..9fefa075 100644 --- a/provider/kubernetes/kubernetes_test.go +++ b/provider/kubernetes/kubernetes_test.go @@ -1,12 +1,16 @@ package kubernetes import ( + "io/ioutil" + "log" + "os" + "path/filepath" "testing" "github.com/keel-hq/keel/approvals" - "github.com/keel-hq/keel/cache/memory" "github.com/keel-hq/keel/extension/notification" "github.com/keel-hq/keel/internal/k8s" + "github.com/keel-hq/keel/pkg/store/sql" "github.com/keel-hq/keel/types" apps_v1 "k8s.io/api/apps/v1" @@ -107,9 +111,30 @@ func (s *fakeSender) Send(event types.EventNotification) error { return nil } -func approver() *approvals.DefaultManager { - cache := memory.NewMemoryCache() - return approvals.New(cache) +func NewTestingUtils() (*sql.SQLStore, func()) { + dir, err := ioutil.TempDir("", "whstoretest") + if err != nil { + log.Fatal(err) + } + tmpfn := filepath.Join(dir, "gorm.db") + // defer + store, err := sql.New(sql.Opts{DatabaseType: "sqlite3", URI: tmpfn}) + if err != nil { + log.Fatal(err) + } + + teardown := func() { + os.RemoveAll(dir) // clean up + } + + return store, teardown +} + +func approver() (*approvals.DefaultManager, func()) { + store, teardown := NewTestingUtils() + return approvals.New(&approvals.Opts{ + Store: store, + }), teardown } func TestGetNamespaces(t *testing.T) { @@ -128,7 +153,9 @@ func TestGetNamespaces(t *testing.T) { grc := &k8s.GenericResourceCache{} - provider, err := NewProvider(fi, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fi, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -232,7 +259,9 @@ func TestGetImpacted(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -328,7 +357,9 @@ func TestGetImpactedPolicyAnnotations(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -428,7 +459,9 @@ func TestPrereleaseGetImpactedA(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -518,7 +551,9 @@ func TestPrereleaseGetImpactedB(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -644,8 +679,9 @@ func TestProcessEvent(t *testing.T) { grs := MustParseGRS(deps) grc := &k8s.GenericResourceCache{} grc.Add(grs...) - - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -710,7 +746,9 @@ func TestProcessEventBuildNumber(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -772,7 +810,9 @@ func TestEventSent(t *testing.T) { grc.Add(grs...) fs := &fakeSender{} - provider, err := NewProvider(fp, fs, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, fs, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -838,7 +878,9 @@ func TestEventSentWithReleaseNotes(t *testing.T) { grc.Add(grs...) fs := &fakeSender{} - provider, err := NewProvider(fp, fs, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, fs, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -858,6 +900,10 @@ func TestEventSentWithReleaseNotes(t *testing.T) { t.Errorf("expected to find a deployment with updated image but found: %s", fp.updated.Containers()[0].Image) } + if fs.sentEvent.Level != types.LevelSuccess { + t.Errorf("expected level %s, got: %s", types.LevelSuccess, fs.sentEvent.Level) + } + if fs.sentEvent.Message != "Successfully updated deployment xxxx/deployment-1 10.0.0->11.0.0 (gcr.io/v2-namespace/hello-world:11.0.0). Release notes: https://github.com/keel-hq/keel/releases" { t.Errorf("expected 'Successfully updated deployment xxxx/deployment-1 10.0.0->11.0.0 (gcr.io/v2-namespace/hello-world:11.0.0). Release notes: https://github.com/keel-hq/keel/releases' sent message, got: %s", fs.sentEvent.Message) } @@ -926,7 +972,9 @@ func TestGetImpactedTwoContainersInSameDeployment(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -1027,7 +1075,9 @@ func TestGetImpactedTwoSameContainersInSameDeployment(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -1123,7 +1173,9 @@ func TestGetImpactedUntaggedImage(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -1220,7 +1272,9 @@ func TestGetImpactedUntaggedOneImage(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -1302,7 +1356,9 @@ func TestTrackedImages(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } @@ -1367,7 +1423,9 @@ func TestTrackedImagesWithSecrets(t *testing.T) { grc := &k8s.GenericResourceCache{} grc.Add(grs...) - provider, err := NewProvider(fp, &fakeSender{}, approver(), grc) + approver, teardown := approver() + defer teardown() + provider, err := NewProvider(fp, &fakeSender{}, approver, grc) if err != nil { t.Fatalf("failed to get provider: %s", err) } diff --git a/trigger/poll/manager_test.go b/trigger/poll/manager_test.go index fbb0ab8a..4b8e907c 100644 --- a/trigger/poll/manager_test.go +++ b/trigger/poll/manager_test.go @@ -2,10 +2,14 @@ package poll import ( "context" + "io/ioutil" + "log" "os" + "path/filepath" "github.com/keel-hq/keel/approvals" - "github.com/keel-hq/keel/cache/memory" + "github.com/keel-hq/keel/pkg/store/sql" + // "github.com/keel-hq/keel/cache/memory" "github.com/keel-hq/keel/provider" "github.com/keel-hq/keel/registry" "github.com/keel-hq/keel/types" @@ -24,6 +28,25 @@ func (g *FakeSecretsGetter) Get(image *types.TrackedImage) (*types.Credentials, return &types.Credentials{}, nil } +func newTestingUtils() (*sql.SQLStore, func()) { + dir, err := ioutil.TempDir("", "whstoretest") + if err != nil { + log.Fatal(err) + } + tmpfn := filepath.Join(dir, "gorm.db") + // defer + store, err := sql.New(sql.Opts{DatabaseType: "sqlite3", URI: tmpfn}) + if err != nil { + log.Fatal(err) + } + + teardown := func() { + os.RemoveAll(dir) // clean up + } + + return store, teardown +} + func TestCheckDeployment(t *testing.T) { // fake provider listening for events imgA, _ := image.Parse("gcr.io/v2-namespace/hello-world:1.1.1") @@ -46,8 +69,13 @@ func TestCheckDeployment(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) // returning some sha @@ -123,8 +151,12 @@ func TestCheckECRDeployment(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) rc := registry.New() diff --git a/trigger/poll/multi_tags_watcher_test.go b/trigger/poll/multi_tags_watcher_test.go index 2fd25020..b0640d6d 100644 --- a/trigger/poll/multi_tags_watcher_test.go +++ b/trigger/poll/multi_tags_watcher_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/keel-hq/keel/approvals" - "github.com/keel-hq/keel/cache/memory" + // "github.com/keel-hq/keel/cache/memory" "github.com/keel-hq/keel/internal/policy" "github.com/keel-hq/keel/provider" "github.com/keel-hq/keel/types" @@ -27,8 +27,12 @@ func TestWatchMultipleTagsWithSemver(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) // returning some sha @@ -64,8 +68,12 @@ func TestWatchAllTagsJobWithSemver(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -114,8 +122,12 @@ func TestWatchAllTagsPrerelease(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -168,8 +180,12 @@ func TestWatchAllTagsMixed(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -227,8 +243,12 @@ func TestWatchAllTagsMixedPolicyAll(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ diff --git a/trigger/poll/watcher_test.go b/trigger/poll/watcher_test.go index 84657188..cc0fae09 100644 --- a/trigger/poll/watcher_test.go +++ b/trigger/poll/watcher_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/keel-hq/keel/approvals" - "github.com/keel-hq/keel/cache/memory" + // "github.com/keel-hq/keel/cache/memory" "github.com/keel-hq/keel/extension/credentialshelper" "github.com/keel-hq/keel/internal/policy" "github.com/keel-hq/keel/provider" @@ -73,8 +73,12 @@ func (p *fakeProvider) TrackedImages() ([]*types.TrackedImage, error) { func TestWatchTagJob(t *testing.T) { fp := &fakeProvider{} - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -120,8 +124,12 @@ func TestWatchTagJob(t *testing.T) { func TestWatchTagJobLatest(t *testing.T) { fp := &fakeProvider{} - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -175,8 +183,12 @@ func TestWatchAllTagsJob(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -215,8 +227,12 @@ func TestWatchAllTagsJobCurrentLatest(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -282,8 +298,12 @@ func TestWatchMultipleTags(t *testing.T) { }, }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) // returning some sha @@ -358,8 +378,12 @@ func TestWatchTagJobCheckCredentials(t *testing.T) { defer credentialshelper.UnregisterCredentialsHelper("fake") fp := &fakeProvider{} - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) frc := &fakeRegistryClient{ @@ -407,8 +431,12 @@ func TestWatchTagJobLatestECR(t *testing.T) { }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) rc := registry.New() @@ -450,8 +478,12 @@ func TestWatchTagJobLatestECR(t *testing.T) { func TestUnwatchAfterNotTrackedAnymore(t *testing.T) { fp := &fakeProvider{} - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) // returning some sha diff --git a/trigger/pubsub/manager_test.go b/trigger/pubsub/manager_test.go index 872979c5..a1980699 100644 --- a/trigger/pubsub/manager_test.go +++ b/trigger/pubsub/manager_test.go @@ -1,13 +1,17 @@ package pubsub import ( + "io/ioutil" + "log" + "os" + "path/filepath" "sync" "time" "golang.org/x/net/context" "github.com/keel-hq/keel/approvals" - "github.com/keel-hq/keel/cache/memory" + "github.com/keel-hq/keel/pkg/store/sql" "github.com/keel-hq/keel/provider" "github.com/keel-hq/keel/types" "github.com/keel-hq/keel/util/image" @@ -15,6 +19,25 @@ import ( "testing" ) +func newTestingUtils() (*sql.SQLStore, func()) { + dir, err := ioutil.TempDir("", "whstoretest") + if err != nil { + log.Fatal(err) + } + tmpfn := filepath.Join(dir, "gorm.db") + // defer + store, err := sql.New(sql.Opts{DatabaseType: "sqlite3", URI: tmpfn}) + if err != nil { + log.Fatal(err) + } + + teardown := func() { + os.RemoveAll(dir) // clean up + } + + return store, teardown +} + type fakeSubscriber struct { TimesSubscribed int SubscribedTopicName string @@ -66,8 +89,12 @@ func TestCheckDeployment(t *testing.T) { }, } - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) + providers := provider.New([]provider.Provider{fp}, am) fs := &fakeSubscriber{} diff --git a/trigger/pubsub/pubsub_test.go b/trigger/pubsub/pubsub_test.go index 1fcbe39f..70698372 100644 --- a/trigger/pubsub/pubsub_test.go +++ b/trigger/pubsub/pubsub_test.go @@ -7,7 +7,6 @@ import ( "golang.org/x/net/context" "github.com/keel-hq/keel/approvals" - "github.com/keel-hq/keel/cache/memory" "github.com/keel-hq/keel/provider" "testing" @@ -23,8 +22,11 @@ func fakeDoneFunc(id string, done bool) { func TestCallback(t *testing.T) { fp := &fakeProvider{} - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) providers := provider.New([]provider.Provider{fp}, am) sub := &PubsubSubscriber{disableAck: true, providers: providers} @@ -50,8 +52,11 @@ func TestCallback(t *testing.T) { func TestCallbackTagNotSemver(t *testing.T) { fp := &fakeProvider{} - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) providers := provider.New([]provider.Provider{fp}, am) sub := &PubsubSubscriber{disableAck: true, providers: providers} @@ -78,8 +83,11 @@ func TestCallbackTagNotSemver(t *testing.T) { func TestCallbackNoTag(t *testing.T) { fp := &fakeProvider{} - mem := memory.NewMemoryCache() - am := approvals.New(mem) + store, teardown := newTestingUtils() + defer teardown() + am := approvals.New(&approvals.Opts{ + Store: store, + }) providers := provider.New([]provider.Provider{fp}, am) sub := &PubsubSubscriber{disableAck: true, providers: providers}