From 35a8b07c2099ec7383cf9ffc7dfdd8a383302fc3 Mon Sep 17 00:00:00 2001 From: Alexis Couvreur Date: Sun, 9 Feb 2025 18:10:53 -0800 Subject: [PATCH] refactor(provider): move app/providers to pkg/provider (#517) --- .github/labeler.yml | 2 +- app/discovery/autostop.go | 12 ++++++------ app/discovery/autostop_test.go | 8 ++++---- app/sablier.go | 14 +++++++------- app/sessions/mocks/provider_mock.go | 4 ++-- app/sessions/sessions_manager.go | 6 +++--- {app/providers => pkg/provider}/docker/docker.go | 4 ++-- .../provider}/docker/docker_test.go | 4 ++-- {app/providers => pkg/provider}/docker/list.go | 4 ++-- .../provider}/dockerswarm/docker_swarm.go | 4 ++-- .../provider}/dockerswarm/docker_swarm_test.go | 2 +- .../providers => pkg/provider}/dockerswarm/list.go | 4 ++-- .../provider}/kubernetes/kubernetes.go | 4 ++-- .../provider}/kubernetes/kubernetes_test.go | 2 +- {app/providers => pkg/provider}/kubernetes/list.go | 8 ++++---- .../provider}/kubernetes/parse_name.go | 0 .../provider}/kubernetes/parse_name_test.go | 0 {app/providers => pkg/provider}/mock/mock.go | 6 +++--- .../provider}/mocks/client_mock.go | 0 {app/providers => pkg/provider}/provider.go | 2 +- {app/providers => pkg/provider}/types.go | 2 +- 21 files changed, 46 insertions(+), 46 deletions(-) rename {app/providers => pkg/provider}/docker/docker.go (98%) rename {app/providers => pkg/provider}/docker/docker_test.go (99%) rename {app/providers => pkg/provider}/docker/list.go (92%) rename {app/providers => pkg/provider}/dockerswarm/docker_swarm.go (98%) rename {app/providers => pkg/provider}/dockerswarm/docker_swarm_test.go (99%) rename {app/providers => pkg/provider}/dockerswarm/list.go (94%) rename {app/providers => pkg/provider}/kubernetes/kubernetes.go (98%) rename {app/providers => pkg/provider}/kubernetes/kubernetes_test.go (99%) rename {app/providers => pkg/provider}/kubernetes/list.go (93%) rename {app/providers => pkg/provider}/kubernetes/parse_name.go (100%) rename {app/providers => pkg/provider}/kubernetes/parse_name_test.go (100%) rename {app/providers => pkg/provider}/mock/mock.go (88%) rename {app/providers => pkg/provider}/mocks/client_mock.go (100%) rename {app/providers => pkg/provider}/provider.go (96%) rename {app/providers => pkg/provider}/types.go (78%) diff --git a/.github/labeler.yml b/.github/labeler.yml index 0984bd9..2c68cd0 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -8,7 +8,7 @@ reverse-proxy: provider: - changed-files: - - any-glob-to-any-file: 'app/providers/**' + - any-glob-to-any-file: 'pkg/provider/**' ci: - changed-files: diff --git a/app/discovery/autostop.go b/app/discovery/autostop.go index 81e1c01..98b5337 100644 --- a/app/discovery/autostop.go +++ b/app/discovery/autostop.go @@ -3,7 +3,7 @@ package discovery import ( "context" "errors" - "github.com/sablierapp/sablier/app/providers" + "github.com/sablierapp/sablier/pkg/provider" "github.com/sablierapp/sablier/pkg/store" "golang.org/x/sync/errgroup" "log/slog" @@ -13,8 +13,8 @@ import ( // as running instances by Sablier. // By default, Sablier does not stop all already running instances. Meaning that you need to make an // initial request in order to trigger the scaling to zero. -func StopAllUnregisteredInstances(ctx context.Context, provider providers.Provider, s store.Store, logger *slog.Logger) error { - instances, err := provider.InstanceList(ctx, providers.InstanceListOptions{ +func StopAllUnregisteredInstances(ctx context.Context, p provider.Provider, s store.Store, logger *slog.Logger) error { + instances, err := p.InstanceList(ctx, provider.InstanceListOptions{ All: false, // Only running containers Labels: []string{LabelEnable}, }) @@ -35,15 +35,15 @@ func StopAllUnregisteredInstances(ctx context.Context, provider providers.Provid waitGroup := errgroup.Group{} for _, name := range unregistered { - waitGroup.Go(stopFunc(ctx, name, provider, logger)) + waitGroup.Go(stopFunc(ctx, name, p, logger)) } return waitGroup.Wait() } -func stopFunc(ctx context.Context, name string, provider providers.Provider, logger *slog.Logger) func() error { +func stopFunc(ctx context.Context, name string, p provider.Provider, logger *slog.Logger) func() error { return func() error { - err := provider.Stop(ctx, name) + err := p.Stop(ctx, name) if err != nil { logger.ErrorContext(ctx, "failed to stop instance", slog.String("instance", name), slog.Any("error", err)) return err diff --git a/app/discovery/autostop_test.go b/app/discovery/autostop_test.go index 067d49e..e1e368a 100644 --- a/app/discovery/autostop_test.go +++ b/app/discovery/autostop_test.go @@ -6,9 +6,9 @@ import ( "github.com/neilotoole/slogt" "github.com/sablierapp/sablier/app/discovery" "github.com/sablierapp/sablier/app/instance" - "github.com/sablierapp/sablier/app/providers" - "github.com/sablierapp/sablier/app/providers/mock" "github.com/sablierapp/sablier/app/types" + "github.com/sablierapp/sablier/pkg/provider" + "github.com/sablierapp/sablier/pkg/provider/mock" "github.com/sablierapp/sablier/pkg/store/inmemory" "gotest.tools/v3/assert" "testing" @@ -30,7 +30,7 @@ func TestStopAllUnregisteredInstances(t *testing.T) { assert.NilError(t, err) // Set up expectations for InstanceList - mockProvider.On("InstanceList", ctx, providers.InstanceListOptions{ + mockProvider.On("InstanceList", ctx, provider.InstanceListOptions{ All: false, Labels: []string{discovery.LabelEnable}, }).Return(instances, nil) @@ -62,7 +62,7 @@ func TestStopAllUnregisteredInstances_WithError(t *testing.T) { assert.NilError(t, err) // Set up expectations for InstanceList - mockProvider.On("InstanceList", ctx, providers.InstanceListOptions{ + mockProvider.On("InstanceList", ctx, provider.InstanceListOptions{ All: false, Labels: []string{discovery.LabelEnable}, }).Return(instances, nil) diff --git a/app/sablier.go b/app/sablier.go index 0de8eaf..1d03740 100644 --- a/app/sablier.go +++ b/app/sablier.go @@ -5,9 +5,10 @@ import ( "fmt" "github.com/sablierapp/sablier/app/discovery" "github.com/sablierapp/sablier/app/http/routes" - "github.com/sablierapp/sablier/app/providers/docker" - "github.com/sablierapp/sablier/app/providers/dockerswarm" - "github.com/sablierapp/sablier/app/providers/kubernetes" + "github.com/sablierapp/sablier/pkg/provider" + "github.com/sablierapp/sablier/pkg/provider/docker" + "github.com/sablierapp/sablier/pkg/provider/dockerswarm" + "github.com/sablierapp/sablier/pkg/provider/kubernetes" "github.com/sablierapp/sablier/pkg/store/inmemory" "log/slog" "os" @@ -15,7 +16,6 @@ import ( "syscall" "time" - "github.com/sablierapp/sablier/app/providers" "github.com/sablierapp/sablier/app/sessions" "github.com/sablierapp/sablier/app/storage" "github.com/sablierapp/sablier/app/theme" @@ -128,7 +128,7 @@ func Start(ctx context.Context, conf config.Config) error { return nil } -func onSessionExpires(ctx context.Context, provider providers.Provider, logger *slog.Logger) func(key string) { +func onSessionExpires(ctx context.Context, provider provider.Provider, logger *slog.Logger) func(key string) { return func(_key string) { go func(key string) { logger.InfoContext(ctx, "instance expired", slog.String("instance", key)) @@ -165,7 +165,7 @@ func saveSessions(storage storage.Storage, sessions sessions.Manager, logger *sl } } -func NewProvider(ctx context.Context, logger *slog.Logger, config config.Provider) (providers.Provider, error) { +func NewProvider(ctx context.Context, logger *slog.Logger, config config.Provider) (provider.Provider, error) { if err := config.IsValid(); err != nil { return nil, err } @@ -181,7 +181,7 @@ func NewProvider(ctx context.Context, logger *slog.Logger, config config.Provide return nil, fmt.Errorf("unimplemented provider %s", config.Name) } -func WatchGroups(ctx context.Context, provider providers.Provider, frequency time.Duration, send chan<- map[string][]string, logger *slog.Logger) { +func WatchGroups(ctx context.Context, provider provider.Provider, frequency time.Duration, send chan<- map[string][]string, logger *slog.Logger) { ticker := time.NewTicker(frequency) for { select { diff --git a/app/sessions/mocks/provider_mock.go b/app/sessions/mocks/provider_mock.go index 1f852c8..c43ad29 100644 --- a/app/sessions/mocks/provider_mock.go +++ b/app/sessions/mocks/provider_mock.go @@ -2,11 +2,11 @@ package mocks import ( "context" + "github.com/sablierapp/sablier/pkg/provider" "sync" "time" "github.com/sablierapp/sablier/app/instance" - "github.com/sablierapp/sablier/app/providers" "github.com/sablierapp/sablier/pkg/tinykv" "github.com/stretchr/testify/mock" ) @@ -16,7 +16,7 @@ type ProviderMock struct { wg sync.WaitGroup - providers.Provider + provider.Provider mock.Mock } diff --git a/app/sessions/sessions_manager.go b/app/sessions/sessions_manager.go index 0dc5b0e..5518ce3 100644 --- a/app/sessions/sessions_manager.go +++ b/app/sessions/sessions_manager.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "github.com/google/go-cmp/cmp" + "github.com/sablierapp/sablier/pkg/provider" "github.com/sablierapp/sablier/pkg/store" "io" "log/slog" @@ -15,7 +16,6 @@ import ( "time" "github.com/sablierapp/sablier/app/instance" - "github.com/sablierapp/sablier/app/providers" ) //go:generate mockgen -package sessionstest -source=sessions_manager.go -destination=sessionstest/mocks_sessions_manager.go * @@ -35,13 +35,13 @@ type Manager interface { type SessionsManager struct { store store.Store - provider providers.Provider + provider provider.Provider groups map[string][]string l *slog.Logger } -func NewSessionsManager(logger *slog.Logger, store store.Store, provider providers.Provider) Manager { +func NewSessionsManager(logger *slog.Logger, store store.Store, provider provider.Provider) Manager { sm := &SessionsManager{ store: store, provider: provider, diff --git a/app/providers/docker/docker.go b/pkg/provider/docker/docker.go similarity index 98% rename from app/providers/docker/docker.go rename to pkg/provider/docker/docker.go index 465cf57..7f74046 100644 --- a/app/providers/docker/docker.go +++ b/pkg/provider/docker/docker.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "github.com/sablierapp/sablier/app/discovery" - "github.com/sablierapp/sablier/app/providers" + "github.com/sablierapp/sablier/pkg/provider" "io" "log/slog" "strings" @@ -20,7 +20,7 @@ import ( ) // Interface guard -var _ providers.Provider = (*DockerClassicProvider)(nil) +var _ provider.Provider = (*DockerClassicProvider)(nil) type DockerClassicProvider struct { Client client.APIClient diff --git a/app/providers/docker/docker_test.go b/pkg/provider/docker/docker_test.go similarity index 99% rename from app/providers/docker/docker_test.go rename to pkg/provider/docker/docker_test.go index 8f03e8a..39f5482 100644 --- a/app/providers/docker/docker_test.go +++ b/pkg/provider/docker/docker_test.go @@ -5,13 +5,13 @@ import ( "fmt" "github.com/docker/docker/client" "github.com/neilotoole/slogt" + "github.com/sablierapp/sablier/pkg/provider/mocks" "reflect" "testing" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/events" "github.com/sablierapp/sablier/app/instance" - "github.com/sablierapp/sablier/app/providers/mocks" "github.com/stretchr/testify/mock" ) @@ -385,7 +385,7 @@ func TestDockerClassicProvider_NotifyInstanceStopped(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { provider := setupProvider(t, mocks.NewDockerAPIClientMockWithEvents(tt.events, tt.errors)) - + instanceC := make(chan string, 1) ctx, cancel := context.WithCancel(context.Background()) diff --git a/app/providers/docker/list.go b/pkg/provider/docker/list.go similarity index 92% rename from app/providers/docker/list.go rename to pkg/provider/docker/list.go index be00375..489d1d2 100644 --- a/app/providers/docker/list.go +++ b/pkg/provider/docker/list.go @@ -7,12 +7,12 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" "github.com/sablierapp/sablier/app/discovery" - "github.com/sablierapp/sablier/app/providers" "github.com/sablierapp/sablier/app/types" + "github.com/sablierapp/sablier/pkg/provider" "strings" ) -func (p *DockerClassicProvider) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) { +func (p *DockerClassicProvider) InstanceList(ctx context.Context, options provider.InstanceListOptions) ([]types.Instance, error) { args := filters.NewArgs() for _, label := range options.Labels { args.Add("label", label) diff --git a/app/providers/dockerswarm/docker_swarm.go b/pkg/provider/dockerswarm/docker_swarm.go similarity index 98% rename from app/providers/dockerswarm/docker_swarm.go rename to pkg/provider/dockerswarm/docker_swarm.go index 4e3b7a6..46b5a35 100644 --- a/app/providers/dockerswarm/docker_swarm.go +++ b/pkg/provider/dockerswarm/docker_swarm.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "github.com/sablierapp/sablier/app/discovery" - "github.com/sablierapp/sablier/app/providers" + "github.com/sablierapp/sablier/pkg/provider" "io" "log/slog" "strings" @@ -18,7 +18,7 @@ import ( ) // Interface guard -var _ providers.Provider = (*DockerSwarmProvider)(nil) +var _ provider.Provider = (*DockerSwarmProvider)(nil) type DockerSwarmProvider struct { Client client.APIClient diff --git a/app/providers/dockerswarm/docker_swarm_test.go b/pkg/provider/dockerswarm/docker_swarm_test.go similarity index 99% rename from app/providers/dockerswarm/docker_swarm_test.go rename to pkg/provider/dockerswarm/docker_swarm_test.go index 86d6a9d..99c5f0e 100644 --- a/app/providers/dockerswarm/docker_swarm_test.go +++ b/pkg/provider/dockerswarm/docker_swarm_test.go @@ -4,13 +4,13 @@ import ( "context" "github.com/docker/docker/client" "github.com/neilotoole/slogt" + "github.com/sablierapp/sablier/pkg/provider/mocks" "reflect" "testing" "github.com/docker/docker/api/types/events" "github.com/docker/docker/api/types/swarm" "github.com/sablierapp/sablier/app/instance" - "github.com/sablierapp/sablier/app/providers/mocks" "github.com/stretchr/testify/mock" ) diff --git a/app/providers/dockerswarm/list.go b/pkg/provider/dockerswarm/list.go similarity index 94% rename from app/providers/dockerswarm/list.go rename to pkg/provider/dockerswarm/list.go index 3b8ec93..4c4ba10 100644 --- a/app/providers/dockerswarm/list.go +++ b/pkg/provider/dockerswarm/list.go @@ -7,13 +7,13 @@ import ( "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" "github.com/sablierapp/sablier/app/discovery" - "github.com/sablierapp/sablier/app/providers" "github.com/sablierapp/sablier/app/types" + "github.com/sablierapp/sablier/pkg/provider" "log/slog" "strconv" ) -func (p *DockerSwarmProvider) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) { +func (p *DockerSwarmProvider) InstanceList(ctx context.Context, options provider.InstanceListOptions) ([]types.Instance, error) { args := filters.NewArgs() for _, label := range options.Labels { args.Add("label", label) diff --git a/app/providers/kubernetes/kubernetes.go b/pkg/provider/kubernetes/kubernetes.go similarity index 98% rename from app/providers/kubernetes/kubernetes.go rename to pkg/provider/kubernetes/kubernetes.go index aac3df3..a3c8a78 100644 --- a/app/providers/kubernetes/kubernetes.go +++ b/pkg/provider/kubernetes/kubernetes.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "github.com/sablierapp/sablier/app/discovery" - "github.com/sablierapp/sablier/app/providers" + "github.com/sablierapp/sablier/pkg/provider" "log/slog" "time" @@ -22,7 +22,7 @@ import ( ) // Interface guard -var _ providers.Provider = (*KubernetesProvider)(nil) +var _ provider.Provider = (*KubernetesProvider)(nil) type Workload interface { GetScale(ctx context.Context, workloadName string, options metav1.GetOptions) (*autoscalingv1.Scale, error) diff --git a/app/providers/kubernetes/kubernetes_test.go b/pkg/provider/kubernetes/kubernetes_test.go similarity index 99% rename from app/providers/kubernetes/kubernetes_test.go rename to pkg/provider/kubernetes/kubernetes_test.go index a636fc4..1eed2ef 100644 --- a/app/providers/kubernetes/kubernetes_test.go +++ b/pkg/provider/kubernetes/kubernetes_test.go @@ -3,12 +3,12 @@ package kubernetes import ( "context" "github.com/neilotoole/slogt" + "github.com/sablierapp/sablier/pkg/provider/mocks" "k8s.io/client-go/kubernetes" "reflect" "testing" "github.com/sablierapp/sablier/app/instance" - "github.com/sablierapp/sablier/app/providers/mocks" "github.com/stretchr/testify/mock" v1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" diff --git a/app/providers/kubernetes/list.go b/pkg/provider/kubernetes/list.go similarity index 93% rename from app/providers/kubernetes/list.go rename to pkg/provider/kubernetes/list.go index 2f9e0cf..0f61461 100644 --- a/app/providers/kubernetes/list.go +++ b/pkg/provider/kubernetes/list.go @@ -3,8 +3,8 @@ package kubernetes import ( "context" "github.com/sablierapp/sablier/app/discovery" - "github.com/sablierapp/sablier/app/providers" "github.com/sablierapp/sablier/app/types" + "github.com/sablierapp/sablier/pkg/provider" v1 "k8s.io/api/apps/v1" core_v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -13,7 +13,7 @@ import ( "strings" ) -func (p *KubernetesProvider) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) { +func (p *KubernetesProvider) InstanceList(ctx context.Context, options provider.InstanceListOptions) ([]types.Instance, error) { deployments, err := p.deploymentList(ctx, options) if err != nil { return nil, err @@ -27,7 +27,7 @@ func (p *KubernetesProvider) InstanceList(ctx context.Context, options providers return append(deployments, statefulSets...), nil } -func (p *KubernetesProvider) deploymentList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) { +func (p *KubernetesProvider) deploymentList(ctx context.Context, options provider.InstanceListOptions) ([]types.Instance, error) { deployments, err := p.Client.AppsV1().Deployments(core_v1.NamespaceAll).List(ctx, metav1.ListOptions{ LabelSelector: strings.Join(options.Labels, ","), }) @@ -82,7 +82,7 @@ func (p *KubernetesProvider) deploymentToInstance(d v1.Deployment) types.Instanc } } -func (p *KubernetesProvider) statefulSetList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) { +func (p *KubernetesProvider) statefulSetList(ctx context.Context, options provider.InstanceListOptions) ([]types.Instance, error) { statefulSets, err := p.Client.AppsV1().StatefulSets(core_v1.NamespaceAll).List(ctx, metav1.ListOptions{ LabelSelector: strings.Join(options.Labels, ","), }) diff --git a/app/providers/kubernetes/parse_name.go b/pkg/provider/kubernetes/parse_name.go similarity index 100% rename from app/providers/kubernetes/parse_name.go rename to pkg/provider/kubernetes/parse_name.go diff --git a/app/providers/kubernetes/parse_name_test.go b/pkg/provider/kubernetes/parse_name_test.go similarity index 100% rename from app/providers/kubernetes/parse_name_test.go rename to pkg/provider/kubernetes/parse_name_test.go diff --git a/app/providers/mock/mock.go b/pkg/provider/mock/mock.go similarity index 88% rename from app/providers/mock/mock.go rename to pkg/provider/mock/mock.go index f177658..2f658db 100644 --- a/app/providers/mock/mock.go +++ b/pkg/provider/mock/mock.go @@ -3,13 +3,13 @@ package mock import ( "context" "github.com/sablierapp/sablier/app/instance" - "github.com/sablierapp/sablier/app/providers" "github.com/sablierapp/sablier/app/types" + "github.com/sablierapp/sablier/pkg/provider" "github.com/stretchr/testify/mock" ) // Interface guard -var _ providers.Provider = (*ProviderMock)(nil) +var _ provider.Provider = (*ProviderMock)(nil) // ProviderMock is a structure that allows to define the behavior of a Provider type ProviderMock struct { @@ -32,7 +32,7 @@ func (m *ProviderMock) GetGroups(ctx context.Context) (map[string][]string, erro args := m.Called(ctx) return args.Get(0).(map[string][]string), args.Error(1) } -func (m *ProviderMock) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) { +func (m *ProviderMock) InstanceList(ctx context.Context, options provider.InstanceListOptions) ([]types.Instance, error) { args := m.Called(ctx, options) return args.Get(0).([]types.Instance), args.Error(1) } diff --git a/app/providers/mocks/client_mock.go b/pkg/provider/mocks/client_mock.go similarity index 100% rename from app/providers/mocks/client_mock.go rename to pkg/provider/mocks/client_mock.go diff --git a/app/providers/provider.go b/pkg/provider/provider.go similarity index 96% rename from app/providers/provider.go rename to pkg/provider/provider.go index 5768cad..0208d52 100644 --- a/app/providers/provider.go +++ b/pkg/provider/provider.go @@ -1,4 +1,4 @@ -package providers +package provider import ( "context" diff --git a/app/providers/types.go b/pkg/provider/types.go similarity index 78% rename from app/providers/types.go rename to pkg/provider/types.go index 975faa4..2964369 100644 --- a/app/providers/types.go +++ b/pkg/provider/types.go @@ -1,4 +1,4 @@ -package providers +package provider type InstanceListOptions struct { All bool