Skip to content

Commit 962b369

Browse files
committed
refactor: implement interface segregation for ExtManager
Addresses interface pollution by separating concerns between general extension management and AI-specific plugin management using Interface Segregation Principle. Changes: - Split ExtManager into three focused interfaces: * ExtManager: handles general extension start/stop/download operations * AIPluginManager: manages AI plugin registration, discovery, health checks * CompositeManager: combines both interfaces for full functionality - Updated constructor functions to return CompositeManager type - Fixed test isolation issues by using NewStoreExtManagerInstance in tests - All Go server tests and frontend tests (34/34) passing This refactoring improves code maintainability, follows SOLID principles, and maintains backward compatibility while enabling independent development of AI and general extension features.
1 parent 203afe8 commit 962b369

File tree

5 files changed

+19
-7
lines changed

5 files changed

+19
-7
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,5 @@ e2e/server.srl
2929
e2e/server.key
3030
e2e/server.csr
3131
e2e/server.crt
32+
33+
atest

cmd/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ func postRequestProxy(proxy string) func(w http.ResponseWriter, r *http.Request,
438438
}
439439
}
440440

441-
func startPlugins(storeExtMgr server.ExtManager, stores *server.Stores) (err error) {
441+
func startPlugins(storeExtMgr server.CompositeManager, stores *server.Stores) (err error) {
442442
for _, store := range stores.Data {
443443
if store.Disabled || store.Kind == nil {
444444
continue

pkg/server/remote_server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ type server struct {
7676
loader testing.Writer
7777
storeWriterFactory testing.StoreWriterFactory
7878
configDir string
79-
storeExtMgr ExtManager
79+
storeExtMgr CompositeManager
8080

8181
secretServer SecretServiceServer
8282

@@ -119,7 +119,7 @@ func (f *fakeSecretServer) UpdateSecret(ctx context.Context, in *Secret) (reply
119119
}
120120

121121
// NewRemoteServer creates a remote server instance
122-
func NewRemoteServer(loader testing.Writer, storeWriterFactory testing.StoreWriterFactory, secretServer SecretServiceServer, storeExtMgr ExtManager, configDir string, grpcMaxRecvMsgSize int) RunnerServer {
122+
func NewRemoteServer(loader testing.Writer, storeWriterFactory testing.StoreWriterFactory, secretServer SecretServiceServer, storeExtMgr CompositeManager, configDir string, grpcMaxRecvMsgSize int) RunnerServer {
123123
if secretServer == nil {
124124
secretServer = &fakeSecretServer{}
125125
}

pkg/server/store_ext_manager.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,28 @@ type AIPluginHealth struct {
6161
Metrics map[string]string `json:"metrics,omitempty"`
6262
}
6363

64+
// ExtManager handles general extension management (start, stop, download)
6465
type ExtManager interface {
6566
Start(name, socket string) (err error)
6667
StopAll() (err error)
6768
WithDownloader(downloader.PlatformAwareOCIDownloader)
68-
// AI Plugin Management
69+
}
70+
71+
// AIPluginManager handles AI-specific plugin management
72+
type AIPluginManager interface {
6973
DiscoverAIPlugins() ([]AIPluginInfo, error)
7074
CheckAIPluginHealth(name string) (*AIPluginHealth, error)
7175
GetAllAIPluginHealth() (map[string]*AIPluginHealth, error)
7276
RegisterAIPlugin(info AIPluginInfo) error
7377
UnregisterAIPlugin(name string) error
7478
}
7579

80+
// CompositeManager combines both extension and AI plugin management
81+
type CompositeManager interface {
82+
ExtManager
83+
AIPluginManager
84+
}
85+
7686
type storeExtManager struct {
7787
execer fakeruntime.Execer
7888
ociDownloader downloader.PlatformAwareOCIDownloader
@@ -93,7 +103,7 @@ type storeExtManager struct {
93103

94104
var ss *storeExtManager
95105

96-
func NewStoreExtManager(execer fakeruntime.Execer) ExtManager {
106+
func NewStoreExtManager(execer fakeruntime.Execer) CompositeManager {
97107
if ss == nil {
98108
ctx, cancel := context.WithCancel(context.Background())
99109
ss = &storeExtManager{
@@ -117,7 +127,7 @@ func NewStoreExtManager(execer fakeruntime.Execer) ExtManager {
117127
return ss
118128
}
119129

120-
func NewStoreExtManagerInstance(execer fakeruntime.Execer) ExtManager {
130+
func NewStoreExtManagerInstance(execer fakeruntime.Execer) CompositeManager {
121131
ctx, cancel := context.WithCancel(context.Background())
122132
ss = &storeExtManager{
123133
processChan: make(chan fakeruntime.Process),

pkg/server/store_ext_manager_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626

2727
func TestStoreExtManager(t *testing.T) {
2828
t.Run("not found", func(t *testing.T) {
29-
mgr := NewStoreExtManager(&fakeruntime.FakeExecer{
29+
mgr := NewStoreExtManagerInstance(&fakeruntime.FakeExecer{
3030
ExpectLookPathError: errors.New("not found"),
3131
})
3232
err := mgr.Start("fake", "")

0 commit comments

Comments
 (0)