diff --git a/capten/agent/internal/api/agent.go b/capten/agent/internal/api/agent.go index d1e373ee..c9c8cfe9 100644 --- a/capten/agent/internal/api/agent.go +++ b/capten/agent/internal/api/agent.go @@ -17,6 +17,21 @@ import ( var _ agentpb.AgentServer = &Agent{} +type pluginStore interface { + ConfigureStore(config *pluginstorepb.PluginStoreConfig) error + GetStoreConfig(storeType pluginstorepb.StoreType) (*pluginstorepb.PluginStoreConfig, error) + SyncPlugins(storeType pluginstorepb.StoreType) error + GetPlugins(storeType pluginstorepb.StoreType) ([]*pluginstorepb.Plugin, error) + GetPluginData(storeType pluginstorepb.StoreType, pluginName string) (*pluginstorepb.PluginData, error) + GetPluginValues(storeType pluginstorepb.StoreType, pluginName, version string) ([]byte, error) + DeployPlugin(storeType pluginstorepb.StoreType, pluginName, version string, values []byte) error + UnDeployPlugin(storeType pluginstorepb.StoreType, pluginName string) error + + GetClusterPluginData(pluginName string) (*clusterpluginspb.Plugin, error) + DeployClusterPlugin(ctx context.Context, pluginData *clusterpluginspb.Plugin) error + UnDeployClusterPlugin(ctx context.Context, request *clusterpluginspb.UnDeployClusterPluginRequest) error +} + type Agent struct { agentpb.UnimplementedAgentServer captenpluginspb.UnimplementedCaptenPluginsServer @@ -26,7 +41,7 @@ type Agent struct { as *captenstore.Store log logging.Logger cfg *config.SericeConfig - plugin pluginstore.PluginStoreInterface + plugin pluginStore createPr bool } @@ -48,6 +63,16 @@ func NewAgent(log logging.Logger, cfg *config.SericeConfig, as *captenstore.Stor if err != nil { return nil, err } + + // add default plugins configuration to plugin store + err = agent.plugin.ConfigureStore(&pluginstorepb.PluginStoreConfig{ + StoreType: pluginstorepb.StoreType_DEFAULT_STORE, + GitProjectId: "1cf5201d-5f35-4d5b-afe0-4b9d0e0d4cd2", + GitProjectURL: "https://github.com/intelops/capten-plugins", + }) + if err != nil { + return nil, err + } return agent, nil } diff --git a/capten/agent/internal/api/agent_cluster_apps.go b/capten/agent/internal/api/agent_cluster_apps.go index 92b4c873..9dc27ae9 100644 --- a/capten/agent/internal/api/agent_cluster_apps.go +++ b/capten/agent/internal/api/agent_cluster_apps.go @@ -3,8 +3,14 @@ package api import ( "context" "fmt" + "strings" "github.com/kube-tarian/kad/capten/common-pkg/pb/agentpb" + "github.com/kube-tarian/kad/capten/common-pkg/pb/pluginstorepb" +) + +const ( + deployedStatus = "deployed" ) func (a *Agent) SyncApp(ctx context.Context, request *agentpb.SyncAppRequest) ( @@ -151,10 +157,89 @@ func (a *Agent) GetClusterAppValues(ctx context.Context, request *agentpb.GetClu func (a *Agent) DeployDefaultApps(ctx context.Context, request *agentpb.DeployDefaultAppsRequest) ( *agentpb.DeployDefaultAppsResponse, error) { - return nil, fmt.Errorf("not implemented") + if err := a.plugin.SyncPlugins(pluginstorepb.StoreType_DEFAULT_STORE); err != nil { + a.log.Errorf("failed to synch providers, %v", err) + } + + plugins, err := a.plugin.GetPlugins(pluginstorepb.StoreType_DEFAULT_STORE) + if err != nil { + a.log.Errorf("failed to get plugins, %v", err) + } + + failedPlugins := []string{} + for _, plugin := range plugins { + if err := a.plugin.DeployPlugin(pluginstorepb.StoreType_DEFAULT_STORE, plugin.PluginName, plugin.Versions[0], []byte{}); err != nil { + a.log.Errorf("failed to deploy plugin, %v", err) + failedPlugins = append(failedPlugins, plugin.PluginName) + } + } + + if len(failedPlugins) == len(plugins) { + return &agentpb.DeployDefaultAppsResponse{ + Status: agentpb.StatusCode_INTERNRAL_ERROR, + StatusMessage: fmt.Sprintf("failed to deploy all default apps: %s", strings.Join(failedPlugins, ",")), + }, nil + } + + statusMessage := agentpb.StatusCode_name[int32(agentpb.StatusCode_OK)] + if len(failedPlugins) != 0 { + statusMessage = fmt.Sprintf("failed to deploy default apps: %s", strings.Join(failedPlugins, ",")) + } + + return &agentpb.DeployDefaultAppsResponse{ + Status: agentpb.StatusCode_OK, + StatusMessage: statusMessage, + }, nil } func (a *Agent) GetDefaultAppsStatus(ctx context.Context, request *agentpb.GetDefaultAppsStatusRequest) ( *agentpb.GetDefaultAppsStatusResponse, error) { - return nil, fmt.Errorf("not implemented") + plugins, err := a.plugin.GetPlugins(pluginstorepb.StoreType_DEFAULT_STORE) + if err != nil { + a.log.Errorf("failed to get plugins, %v", err) + } + + overallStatus := agentpb.DeploymentStatus_SUCCESS + anyPluginFailed := false + resp := []*agentpb.ApplicationStatus{} + for _, plugin := range plugins { + pluginData, err := a.plugin.GetClusterPluginData(plugin.PluginName) + if err != nil { + a.log.Errorf("failed to fetch plugin status, %v", err) + resp = append(resp, &agentpb.ApplicationStatus{ + AppName: plugin.PluginName, + Version: plugin.Versions[0], + Category: plugin.Category, + InstallStatus: "failed to fetch status", + RuntimeStatus: "Unknown", + }) + continue + } + + if !strings.Contains(pluginData.InstallStatus, "failed") { + anyPluginFailed = true + } else if pluginData.InstallStatus != deployedStatus { + overallStatus = agentpb.DeploymentStatus_ONGOING + } + + resp = append(resp, &agentpb.ApplicationStatus{ + AppName: pluginData.PluginName, + Version: pluginData.Version, + Category: pluginData.Category, + InstallStatus: pluginData.InstallStatus, + RuntimeStatus: pluginData.InstallStatus, + }) + } + + // if any plugin failed and other plugins status is success, set overall status will be failed + if anyPluginFailed && overallStatus == agentpb.DeploymentStatus_SUCCESS { + overallStatus = agentpb.DeploymentStatus_FAILED + } + + return &agentpb.GetDefaultAppsStatusResponse{ + Status: agentpb.StatusCode_OK, + StatusMessage: agentpb.StatusCode_name[int32(agentpb.StatusCode_OK)], + DeploymentStatus: overallStatus, + DefaultAppsStatus: resp, + }, nil } diff --git a/capten/agent/internal/app/app.go b/capten/agent/internal/app/app.go index 7c6d8c40..36167c59 100644 --- a/capten/agent/internal/app/app.go +++ b/capten/agent/internal/app/app.go @@ -20,7 +20,6 @@ import ( "github.com/kube-tarian/kad/capten/common-pkg/pb/captenpluginspb" "github.com/kube-tarian/kad/capten/common-pkg/pb/clusterpluginspb" "github.com/kube-tarian/kad/capten/common-pkg/pb/pluginstorepb" - pluginstore "github.com/kube-tarian/kad/capten/common-pkg/plugin-store" dbinit "github.com/kube-tarian/kad/capten/common-pkg/postgres/db-init" "github.com/pkg/errors" "google.golang.org/grpc" @@ -132,7 +131,7 @@ func configurePostgresDB() error { func initializeJobScheduler( cfg *config.SericeConfig, as *captenstore.Store, - handler pluginstore.PluginDeployHandler, + handler *agentapi.Agent, ) (*job.Scheduler, error) { s := job.NewScheduler(log) if cfg.CrossplaneSyncJobEnabled { @@ -147,7 +146,7 @@ func initializeJobScheduler( } // Add Default plugin deployer job - addDefualtPluginsDeployerJob(s, as, handler) + addDefualtPluginsDeployerJob(s, handler) log.Info("successfully initialized job scheduler") return s, nil @@ -155,10 +154,9 @@ func initializeJobScheduler( func addDefualtPluginsDeployerJob( s *job.Scheduler, - as *captenstore.Store, - handler pluginstore.PluginDeployHandler, + handler *agentapi.Agent, ) { - dpd, err := defaultplugindeployer.NewDefaultPluginsDeployer(log, "@every 10m", as, handler) + dpd, err := defaultplugindeployer.NewDefaultPluginsDeployer(log, "@every 10m", handler) if err != nil { log.Fatal("failed to init default plugins deployer job", err) } diff --git a/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer.go b/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer.go index 8f186faa..b847fa06 100644 --- a/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer.go +++ b/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer.go @@ -1,50 +1,31 @@ package defaultplugindeployer import ( + "context" + "github.com/intelops/go-common/logging" - "github.com/kelseyhightower/envconfig" - captenstore "github.com/kube-tarian/kad/capten/common-pkg/capten-store" - "github.com/kube-tarian/kad/capten/common-pkg/pb/pluginstorepb" - pluginstore "github.com/kube-tarian/kad/capten/common-pkg/plugin-store" + "github.com/kube-tarian/kad/capten/common-pkg/pb/agentpb" ) +type defaultPluginsDeployer interface { + DeployDefaultApps(ctx context.Context, request *agentpb.DeployDefaultAppsRequest) (*agentpb.DeployDefaultAppsResponse, error) +} + type DefaultPluginsDeployer struct { - pluginStore pluginstore.PluginStoreInterface - log logging.Logger - frequency string + agent defaultPluginsDeployer + log logging.Logger + frequency string } func NewDefaultPluginsDeployer( log logging.Logger, frequency string, - dbStore *captenstore.Store, - handler pluginstore.PluginDeployHandler, + agent defaultPluginsDeployer, ) (*DefaultPluginsDeployer, error) { - cfg := &pluginstore.Config{} - if err := envconfig.Process("", cfg); err != nil { - return nil, err - } - cfg.PluginFileName = "default-plugin-list.yaml" - - pluginStore, err := pluginstore.NewPluginStoreWithConfig(log, cfg, dbStore, handler) - if err != nil { - return nil, err - } - - // add default plugins configuration to plugin store - err = pluginStore.ConfigureStore(&pluginstorepb.PluginStoreConfig{ - StoreType: pluginstorepb.StoreType_DEFAULT_STORE, - GitProjectId: "1cf5201d-5f35-4d5b-afe0-4b9d0e0d4cd2", - GitProjectURL: "https://github.com/intelops/capten-plugins", - }) - if err != nil { - return nil, err - } - return &DefaultPluginsDeployer{ - log: log, - frequency: frequency, - pluginStore: pluginStore, + log: log, + frequency: frequency, + agent: agent, }, nil } @@ -54,24 +35,12 @@ func (p *DefaultPluginsDeployer) CronSpec() string { func (p *DefaultPluginsDeployer) Run() { p.log.Debug("started default plugins deployer job") - if err := p.pluginStore.SyncPlugins(pluginstorepb.StoreType_DEFAULT_STORE); err != nil { - p.log.Errorf("failed to synch providers, %v", err) + resp, _ := p.agent.DeployDefaultApps(context.TODO(), &agentpb.DeployDefaultAppsRequest{ + Upgrade: false, + }) + if resp.Status != agentpb.StatusCode_OK { + p.log.Errorf("failed to deploy default apps, %s", resp.StatusMessage) + return } - - p.deployPlugins() - p.log.Debug("defualt plugins deployer job completed") } - -func (p *DefaultPluginsDeployer) deployPlugins() { - plugins, err := p.pluginStore.GetPlugins(pluginstorepb.StoreType_DEFAULT_STORE) - if err != nil { - p.log.Errorf("failed to get plugins, %v", err) - } - - for _, plugin := range plugins { - if err := p.pluginStore.DeployPlugin(pluginstorepb.StoreType_DEFAULT_STORE, plugin.PluginName, plugin.Versions[0], []byte{}); err != nil { - p.log.Errorf("failed to deploy plugin, %v", err) - } - } -} diff --git a/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer_test.go b/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer_test.go index be10c5dc..7adb3782 100644 --- a/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer_test.go +++ b/capten/agent/internal/job/defaultplugindeployer/default_plugin_deployer_test.go @@ -1,12 +1,12 @@ package defaultplugindeployer import ( - "fmt" + "context" "testing" gomock "github.com/golang/mock/gomock" "github.com/intelops/go-common/logging" - "github.com/kube-tarian/kad/capten/common-pkg/pb/pluginstorepb" + "github.com/kube-tarian/kad/capten/common-pkg/pb/agentpb" "github.com/stretchr/testify/assert" ) @@ -15,13 +15,13 @@ func TestDefaultPluginsDeployer_CronSpec(t *testing.T) { logger := logging.NewLogger() // Create a mock plugin store - mockPluginStore := &MockpluginStore{} + mockAgent := &MockAgent{} // Create an instance of DefaultPluginsDeployer deployer := &DefaultPluginsDeployer{ - pluginStore: mockPluginStore, - log: logger, - frequency: "@every 10m", + log: logger, + frequency: "@every 10m", + agent: mockAgent, } // Call the CronSpec method @@ -39,72 +39,26 @@ func TestDefaultPluginsDeployer_Run(t *testing.T) { logger := logging.NewLogger() // Create a mock plugin store - mockPluginStore := NewMockpluginStore(ctrl) + mockAgent := NewMockAgent(ctrl) // Create an instance of DefaultPluginsDeployer deployer := &DefaultPluginsDeployer{ - pluginStore: mockPluginStore, - log: logger, - frequency: "@every 10m", + log: logger, + frequency: "@every 10m", + agent: mockAgent, } // Mock the SyncPlugins method of the mock plugin store - mockPluginStore.EXPECT().SyncPlugins(pluginstorepb.StoreType_DEFAULT_STORE).Return(nil).AnyTimes() - - // Mock the GetPlugins method of the mock plugin store - mockPluginStore.EXPECT().GetPlugins(pluginstorepb.StoreType_DEFAULT_STORE).Return([]*pluginstorepb.Plugin{ - { - PluginName: "plugin1", - Versions: []string{"1.0.0"}, - }, - }, nil) - - mockPluginStore.EXPECT().DeployPlugin(pluginstorepb.StoreType_DEFAULT_STORE, "plugin1", "1.0.0", []byte{}).Return(nil).AnyTimes() - - // Call the Run method - deployer.Run() -} - -func TestDefaultPluginsDeployer_Run_MultiplePlugins(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - // Create a mock logger - logger := logging.NewLogger() - - // Create a mock plugin store - mockPluginStore := NewMockpluginStore(ctrl) - - // Create an instance of DefaultPluginsDeployer - deployer := &DefaultPluginsDeployer{ - pluginStore: mockPluginStore, - log: logger, - frequency: "@every 10m", - } - - // Mock the SyncPlugins method of the mock plugin store - mockPluginStore.EXPECT().SyncPlugins(pluginstorepb.StoreType_DEFAULT_STORE).Return(nil).AnyTimes() - - // Mock the GetPlugins method of the mock plugin store - mockPluginStore.EXPECT().GetPlugins(pluginstorepb.StoreType_DEFAULT_STORE).Return([]*pluginstorepb.Plugin{ - { - PluginName: "plugin1", - Versions: []string{"1.0.0"}, - }, - { - PluginName: "plugin2", - Versions: []string{"1.0.0"}, - }, - }, nil) - - mockPluginStore.EXPECT().DeployPlugin(pluginstorepb.StoreType_DEFAULT_STORE, "plugin1", "1.0.0", []byte{}).Return(nil).AnyTimes() - mockPluginStore.EXPECT().DeployPlugin(pluginstorepb.StoreType_DEFAULT_STORE, "plugin2", "1.0.0", []byte{}).Return(nil).AnyTimes() + mockAgent.EXPECT().DeployDefaultApps(context.TODO(), &agentpb.DeployDefaultAppsRequest{Upgrade: false}).Return(&agentpb.DeployDefaultAppsResponse{ + Status: agentpb.StatusCode_OK, + StatusMessage: "", + }, nil).AnyTimes() // Call the Run method deployer.Run() } -func TestDefaultPluginsDeployer_Run_MultiplePlugins_OnePluginFail(t *testing.T) { +func TestDefaultPluginsDeployer_RunWithError(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -112,32 +66,20 @@ func TestDefaultPluginsDeployer_Run_MultiplePlugins_OnePluginFail(t *testing.T) logger := logging.NewLogger() // Create a mock plugin store - mockPluginStore := NewMockpluginStore(ctrl) + mockAgent := NewMockAgent(ctrl) // Create an instance of DefaultPluginsDeployer deployer := &DefaultPluginsDeployer{ - pluginStore: mockPluginStore, - log: logger, - frequency: "@every 10m", + log: logger, + frequency: "@every 10m", + agent: mockAgent, } // Mock the SyncPlugins method of the mock plugin store - mockPluginStore.EXPECT().SyncPlugins(pluginstorepb.StoreType_DEFAULT_STORE).Return(nil).AnyTimes() - - // Mock the GetPlugins method of the mock plugin store - mockPluginStore.EXPECT().GetPlugins(pluginstorepb.StoreType_DEFAULT_STORE).Return([]*pluginstorepb.Plugin{ - { - PluginName: "plugin1", - Versions: []string{"1.0.0"}, - }, - { - PluginName: "plugin2", - Versions: []string{"1.0.0"}, - }, - }, nil) - - mockPluginStore.EXPECT().DeployPlugin(pluginstorepb.StoreType_DEFAULT_STORE, "plugin1", "1.0.0", []byte{}).Return(nil).AnyTimes() - mockPluginStore.EXPECT().DeployPlugin(pluginstorepb.StoreType_DEFAULT_STORE, "plugin2", "1.0.0", []byte{}).Return(fmt.Errorf("error")).AnyTimes() + mockAgent.EXPECT().DeployDefaultApps(context.TODO(), &agentpb.DeployDefaultAppsRequest{Upgrade: false}).Return(&agentpb.DeployDefaultAppsResponse{ + Status: agentpb.StatusCode_INTERNRAL_ERROR, + StatusMessage: "failed", + }, nil).AnyTimes() // Call the Run method deployer.Run() diff --git a/capten/agent/internal/job/defaultplugindeployer/mock_agent_test.go b/capten/agent/internal/job/defaultplugindeployer/mock_agent_test.go new file mode 100644 index 00000000..fe1f2407 --- /dev/null +++ b/capten/agent/internal/job/defaultplugindeployer/mock_agent_test.go @@ -0,0 +1,47 @@ +package defaultplugindeployer + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + agentpb "github.com/kube-tarian/kad/capten/common-pkg/pb/agentpb" +) + +// MockAgent is a mock of defaultPluginsDeployer interface. +type MockAgent struct { + ctrl *gomock.Controller + recorder *MockAgentMockRecorder +} + +// MockAgentMockRecorder is the mock recorder for MockdefaultPluginsDeployer. +type MockAgentMockRecorder struct { + mock *MockAgent +} + +// NewMockdefaultPluginsDeployer creates a new mock instance. +func NewMockAgent(ctrl *gomock.Controller) *MockAgent { + mock := &MockAgent{ctrl: ctrl} + mock.recorder = &MockAgentMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAgent) EXPECT() *MockAgentMockRecorder { + return m.recorder +} + +// DeployDefaultApps mocks base method. +func (m *MockAgent) DeployDefaultApps(ctx context.Context, request *agentpb.DeployDefaultAppsRequest) (*agentpb.DeployDefaultAppsResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeployDefaultApps", ctx, request) + ret0, _ := ret[0].(*agentpb.DeployDefaultAppsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeployDefaultApps indicates an expected call of DeployDefaultApps. +func (mr *MockAgentMockRecorder) DeployDefaultApps(ctx, request interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeployDefaultApps", reflect.TypeOf((*MockAgent)(nil).DeployDefaultApps), ctx, request) +} diff --git a/capten/agent/internal/job/defaultplugindeployer/mock_plugin_store_test.go b/capten/agent/internal/job/defaultplugindeployer/mock_plugin_store_test.go deleted file mode 100644 index 0b0364d3..00000000 --- a/capten/agent/internal/job/defaultplugindeployer/mock_plugin_store_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package defaultplugindeployer - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - "github.com/kube-tarian/kad/capten/common-pkg/pb/pluginstorepb" -) - -// MockpluginStore is a mock of pluginStore interface. -type MockpluginStore struct { - ctrl *gomock.Controller - recorder *MockpluginStoreMockRecorder -} - -// MockpluginStoreMockRecorder is the mock recorder for MockpluginStore. -type MockpluginStoreMockRecorder struct { - mock *MockpluginStore -} - -// NewMockpluginStore creates a new mock instance. -func NewMockpluginStore(ctrl *gomock.Controller) *MockpluginStore { - mock := &MockpluginStore{ctrl: ctrl} - mock.recorder = &MockpluginStoreMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockpluginStore) EXPECT() *MockpluginStoreMockRecorder { - return m.recorder -} - -// ConfigureStore mocks base method. -func (m *MockpluginStore) ConfigureStore(config *pluginstorepb.PluginStoreConfig) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ConfigureStore", config) - ret0, _ := ret[0].(error) - return ret0 -} - -// ConfigureStore indicates an expected call of ConfigureStore. -func (mr *MockpluginStoreMockRecorder) ConfigureStore(config interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConfigureStore", reflect.TypeOf((*MockpluginStore)(nil).ConfigureStore), config) -} - -// DeployPlugin mocks base method. -func (m *MockpluginStore) DeployPlugin(storeType pluginstorepb.StoreType, pluginName, version string, values []byte) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeployPlugin", storeType, pluginName, version, values) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeployPlugin indicates an expected call of DeployPlugin. -func (mr *MockpluginStoreMockRecorder) DeployPlugin(storeType, pluginName, version, values interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeployPlugin", reflect.TypeOf((*MockpluginStore)(nil).DeployPlugin), storeType, pluginName, version, values) -} - -// GetPluginData mocks base method. -func (m *MockpluginStore) GetPluginData(storeType pluginstorepb.StoreType, pluginName string) (*pluginstorepb.PluginData, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetPluginData", storeType, pluginName) - ret0, _ := ret[0].(*pluginstorepb.PluginData) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetPluginData indicates an expected call of GetPluginData. -func (mr *MockpluginStoreMockRecorder) GetPluginData(storeType, pluginName interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPluginData", reflect.TypeOf((*MockpluginStore)(nil).GetPluginData), storeType, pluginName) -} - -// GetPluginValues mocks base method. -func (m *MockpluginStore) GetPluginValues(storeType pluginstorepb.StoreType, pluginName, version string) ([]byte, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetPluginValues", storeType, pluginName, version) - ret0, _ := ret[0].([]byte) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetPluginValues indicates an expected call of GetPluginValues. -func (mr *MockpluginStoreMockRecorder) GetPluginValues(storeType, pluginName, version interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPluginValues", reflect.TypeOf((*MockpluginStore)(nil).GetPluginValues), storeType, pluginName, version) -} - -// GetPlugins mocks base method. -func (m *MockpluginStore) GetPlugins(storeType pluginstorepb.StoreType) ([]*pluginstorepb.Plugin, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetPlugins", storeType) - ret0, _ := ret[0].([]*pluginstorepb.Plugin) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetPlugins indicates an expected call of GetPlugins. -func (mr *MockpluginStoreMockRecorder) GetPlugins(storeType interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPlugins", reflect.TypeOf((*MockpluginStore)(nil).GetPlugins), storeType) -} - -// GetStoreConfig mocks base method. -func (m *MockpluginStore) GetStoreConfig(storeType pluginstorepb.StoreType) (*pluginstorepb.PluginStoreConfig, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetStoreConfig", storeType) - ret0, _ := ret[0].(*pluginstorepb.PluginStoreConfig) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetStoreConfig indicates an expected call of GetStoreConfig. -func (mr *MockpluginStoreMockRecorder) GetStoreConfig(storeType interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStoreConfig", reflect.TypeOf((*MockpluginStore)(nil).GetStoreConfig), storeType) -} - -// SyncPlugins mocks base method. -func (m *MockpluginStore) SyncPlugins(storeType pluginstorepb.StoreType) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SyncPlugins", storeType) - ret0, _ := ret[0].(error) - return ret0 -} - -// SyncPlugins indicates an expected call of SyncPlugins. -func (mr *MockpluginStoreMockRecorder) SyncPlugins(storeType interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncPlugins", reflect.TypeOf((*MockpluginStore)(nil).SyncPlugins), storeType) -} - -// UnDeployPlugin mocks base method. -func (m *MockpluginStore) UnDeployPlugin(storeType pluginstorepb.StoreType, pluginName string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UnDeployPlugin", storeType, pluginName) - ret0, _ := ret[0].(error) - return ret0 -} - -// UnDeployPlugin indicates an expected call of UnDeployPlugin. -func (mr *MockpluginStoreMockRecorder) UnDeployPlugin(storeType, pluginName interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnDeployPlugin", reflect.TypeOf((*MockpluginStore)(nil).UnDeployPlugin), storeType, pluginName) -} diff --git a/capten/common-pkg/plugin-store/plugin_store_handler.go b/capten/common-pkg/plugin-store/plugin_store_handler.go index b66324ac..b34c96e9 100644 --- a/capten/common-pkg/plugin-store/plugin_store_handler.go +++ b/capten/common-pkg/plugin-store/plugin_store_handler.go @@ -21,6 +21,10 @@ import ( "gopkg.in/yaml.v2" ) +const ( + defaultPluginListFileName = "default-plugin-list.yaml" +) + type captenStore interface { GetGitProjects() ([]*captenpluginspb.GitProject, error) @@ -30,32 +34,19 @@ type captenStore interface { DeletePluginStoreData(storeType pluginstorepb.StoreType, gitProjectId, pluginName string) error UpsertPluginStoreData(gitProjectId string, plugin *pluginstorepb.PluginData) error GetPluginStoreData(storeType pluginstorepb.StoreType, gitProjectId, pluginName string) (*pluginstorepb.PluginData, error) -} -type PluginDeployHandler interface { - DeployClusterPlugin(context.Context, *clusterpluginspb.DeployClusterPluginRequest) (*clusterpluginspb.DeployClusterPluginResponse, error) - UnDeployClusterPlugin(context.Context, *clusterpluginspb.UnDeployClusterPluginRequest) (*clusterpluginspb.UnDeployClusterPluginResponse, error) -} - -type PluginStoreInterface interface { - ConfigureStore(config *pluginstorepb.PluginStoreConfig) error - GetStoreConfig(storeType pluginstorepb.StoreType) (*pluginstorepb.PluginStoreConfig, error) - SyncPlugins(storeType pluginstorepb.StoreType) error - GetPlugins(storeType pluginstorepb.StoreType) ([]*pluginstorepb.Plugin, error) - GetPluginData(storeType pluginstorepb.StoreType, pluginName string) (*pluginstorepb.PluginData, error) - GetPluginValues(storeType pluginstorepb.StoreType, pluginName, version string) ([]byte, error) - DeployPlugin(storeType pluginstorepb.StoreType, pluginName, version string, values []byte) error - UnDeployPlugin(storeType pluginstorepb.StoreType, pluginName string) error + UpsertClusterPluginConfig(plugin *clusterpluginspb.Plugin) error + GetClusterPluginConfig(pluginName string) (*clusterpluginspb.Plugin, error) } type PluginStore struct { - log logging.Logger - cfg *Config - dbStore captenStore - pluginHandler PluginDeployHandler + log logging.Logger + cfg *Config + dbStore captenStore + tc *temporalclient.Client } -func NewPluginStore(log logging.Logger, dbStore captenStore, pluginHandler PluginDeployHandler) (*PluginStore, error) { +func NewPluginStore(log logging.Logger, dbStore captenStore, tc *temporalclient.Client) (*PluginStore, error) { cfg := &Config{} if err := envconfig.Process("", cfg); err != nil { return nil, err @@ -69,15 +60,6 @@ func NewPluginStore(log logging.Logger, dbStore captenStore, pluginHandler Plugi }, nil } -func NewPluginStoreWithConfig(log logging.Logger, cfg *Config, dbStore captenStore, pluginHandler PluginDeployHandler) (*PluginStore, error) { - return &PluginStore{ - log: log, - cfg: cfg, - dbStore: dbStore, - pluginHandler: pluginHandler, - }, nil -} - func (p *PluginStore) ConfigureStore(config *pluginstorepb.PluginStoreConfig) error { return p.dbStore.UpsertPluginStoreConfig(config) } @@ -120,6 +102,14 @@ func (p *PluginStore) SyncPlugins(storeType pluginstorepb.StoreType) error { } defer os.RemoveAll(pluginStoreDir) + if storeType == pluginstorepb.StoreType_DEFAULT_STORE { + actualPluginFileName := p.cfg.PluginFileName + p.cfg.PluginFileName = defaultPluginListFileName + defer func() { + p.cfg.PluginFileName = actualPluginFileName + }() + } + pluginListFilePath := p.getPluginListFilePath(pluginStoreDir) p.log.Infof("Loading plugin data from %s", pluginListFilePath) pluginListData, err := os.ReadFile(pluginListFilePath) @@ -298,6 +288,10 @@ func (p *PluginStore) getPluginConfig(pluginStoreDir, pluginName, version string return pluginConfig, nil } +func (p *PluginStore) GetClusterPluginData(pluginName string) (*clusterpluginspb.Plugin, error) { + return p.dbStore.GetClusterPluginConfig(pluginName) +} + func (p *PluginStore) DeployPlugin(storeType pluginstorepb.StoreType, pluginName, version string, values []byte) error { config, err := p.GetStoreConfig(storeType)