@@ -106,6 +106,52 @@ func (e *ExternalDriver) Start() error {
106
106
return nil
107
107
}
108
108
109
+ func (e * ExternalDriver ) cleanup () {
110
+ if e .cancelFunc != nil {
111
+ e .cancelFunc ()
112
+ }
113
+ if e .Stdin != nil {
114
+ e .Stdin .Close ()
115
+ }
116
+ if e .Stdout != nil {
117
+ e .Stdout .Close ()
118
+ }
119
+ e .Command = nil
120
+ e .Client = nil
121
+ e .ctx = nil
122
+ e .cancelFunc = nil
123
+ }
124
+
125
+ func (e * ExternalDriver ) Stop () error {
126
+ if e .Command == nil || e .Command .Process == nil {
127
+ return fmt .Errorf ("external driver %s is not running" , e .Name )
128
+ }
129
+
130
+ e .logger .Infof ("Stopping external driver %s" , e .Name )
131
+ e .cleanup ()
132
+
133
+ e .logger .Infof ("External driver %s stopped successfully" , e .Name )
134
+ return nil
135
+ }
136
+
137
+ func (r * Registry ) StopAllExternalDrivers () {
138
+ r .mu .Lock ()
139
+ defer r .mu .Unlock ()
140
+
141
+ for name , driver := range r .externalDrivers {
142
+ // Only try to stop if the driver is actually running
143
+ if driver .Command != nil && driver .Command .Process != nil {
144
+ if err := driver .Stop (); err != nil {
145
+ logrus .Errorf ("Failed to stop external driver %s: %v" , name , err )
146
+ } else {
147
+ logrus .Infof ("External driver %s stopped successfully" , name )
148
+ }
149
+ }
150
+ // Always remove from registry
151
+ delete (r .externalDrivers , name )
152
+ }
153
+ }
154
+
109
155
func (r * Registry ) List () []string {
110
156
r .mu .RLock ()
111
157
defer r .mu .RUnlock ()
@@ -130,13 +176,18 @@ func (r *Registry) Get(name string) (driver.Driver, bool) {
130
176
externalDriver , exists := r .externalDrivers [name ]
131
177
if exists {
132
178
externalDriver .logger .Debugf ("Using external driver %q" , name )
133
- if err := externalDriver .Start (); err != nil {
134
- externalDriver .logger .Errorf ("Failed to start external driver %q: %v" , name , err )
135
- return nil , false
179
+ if externalDriver .Client == nil || externalDriver .Command == nil || externalDriver .Command .Process == nil {
180
+ logrus .Infof ("Starting new instance of external driver %q" , name )
181
+ if err := externalDriver .Start (); err != nil {
182
+ externalDriver .logger .Errorf ("Failed to start external driver %q: %v" , name , err )
183
+ return nil , false
184
+ }
185
+ } else {
186
+ logrus .Infof ("Reusing existing external driver %q instance" , name )
136
187
}
188
+
137
189
return externalDriver .Client , true
138
190
}
139
-
140
191
}
141
192
return driver , exists
142
193
}
0 commit comments