@@ -10,6 +10,9 @@ import (
10
10
11
11
"github.com/spf13/cobra"
12
12
13
+ "github.com/stacklok/toolhive/pkg/client"
14
+ runtime "github.com/stacklok/toolhive/pkg/container/runtime"
15
+ "github.com/stacklok/toolhive/pkg/core"
13
16
"github.com/stacklok/toolhive/pkg/groups"
14
17
"github.com/stacklok/toolhive/pkg/validation"
15
18
"github.com/stacklok/toolhive/pkg/workloads"
@@ -141,10 +144,15 @@ func groupRmCmdFunc(cmd *cobra.Command, args []string) error {
141
144
return fmt .Errorf ("failed to create workloads manager: %w" , err )
142
145
}
143
146
144
- // Get all workloads in the group
145
- groupWorkloads , err := workloadsManager .ListWorkloadsInGroup (ctx , groupName )
147
+ // Get all workloads and filter for the group
148
+ allWorkloads , err := workloadsManager .ListWorkloads (ctx , true ) // listAll=true to include stopped workloads
146
149
if err != nil {
147
- return fmt .Errorf ("failed to list workloads in group: %w" , err )
150
+ return fmt .Errorf ("failed to list workloads: %w" , err )
151
+ }
152
+
153
+ groupWorkloads , err := workloads .FilterByGroup (allWorkloads , groupName )
154
+ if err != nil {
155
+ return fmt .Errorf ("failed to filter workloads by group: %w" , err )
148
156
}
149
157
150
158
// Show warning and get user confirmation
@@ -160,9 +168,9 @@ func groupRmCmdFunc(cmd *cobra.Command, args []string) error {
160
168
// Handle workloads if any exist
161
169
if len (groupWorkloads ) > 0 {
162
170
if withWorkloadsFlag {
163
- err = deleteWorkloadsInGroup (ctx , groupWorkloads , groupName )
171
+ err = deleteWorkloadsInGroup (ctx , workloadsManager , groupWorkloads , groupName )
164
172
} else {
165
- err = removeWorkloadsMembershipFromGroup (ctx , groupWorkloads , groupName )
173
+ err = moveWorkloadsToGroup (ctx , workloadsManager , groupWorkloads , groupName , groups . DefaultGroup )
166
174
}
167
175
}
168
176
if err != nil {
@@ -177,7 +185,7 @@ func groupRmCmdFunc(cmd *cobra.Command, args []string) error {
177
185
return nil
178
186
}
179
187
180
- func showWarningAndGetConfirmation (groupName string , groupWorkloads []string ) (bool , error ) {
188
+ func showWarningAndGetConfirmation (groupName string , groupWorkloads []core. Workload ) (bool , error ) {
181
189
if len (groupWorkloads ) == 0 {
182
190
return true , nil
183
191
}
@@ -192,9 +200,9 @@ func showWarningAndGetConfirmation(groupName string, groupWorkloads []string) (b
192
200
fmt .Printf (" The following %d workload(s) will be affected:\n " , len (groupWorkloads ))
193
201
for _ , workload := range groupWorkloads {
194
202
if withWorkloadsFlag {
195
- fmt .Printf (" - %s (will be DELETED)\n " , workload )
203
+ fmt .Printf (" - %s (will be DELETED)\n " , workload . Name )
196
204
} else {
197
- fmt .Printf (" - %s (will be moved to the 'default' group)\n " , workload )
205
+ fmt .Printf (" - %s (will be moved to the 'default' group)\n " , workload . Name )
198
206
}
199
207
}
200
208
@@ -221,15 +229,20 @@ func showWarningAndGetConfirmation(groupName string, groupWorkloads []string) (b
221
229
return true , nil
222
230
}
223
231
224
- func deleteWorkloadsInGroup (ctx context.Context , groupWorkloads []string , groupName string ) error {
225
- // Delete workloads
226
- workloadManager , err := workloads .NewManager (ctx )
227
- if err != nil {
228
- return fmt .Errorf ("failed to create workload manager: %w" , err )
232
+ func deleteWorkloadsInGroup (
233
+ ctx context.Context ,
234
+ workloadManager workloads.Manager ,
235
+ groupWorkloads []core.Workload ,
236
+ groupName string ,
237
+ ) error {
238
+ // Extract workload names for deletion
239
+ var workloadNames []string
240
+ for _ , workload := range groupWorkloads {
241
+ workloadNames = append (workloadNames , workload .Name )
229
242
}
230
243
231
244
// Delete all workloads in the group
232
- group , err := workloadManager .DeleteWorkloads (ctx , groupWorkloads )
245
+ group , err := workloadManager .DeleteWorkloads (ctx , workloadNames )
233
246
if err != nil {
234
247
return fmt .Errorf ("failed to delete workloads in group: %w" , err )
235
248
}
@@ -243,20 +256,56 @@ func deleteWorkloadsInGroup(ctx context.Context, groupWorkloads []string, groupN
243
256
return nil
244
257
}
245
258
246
- // removeWorkloadsFromGroup removes the group membership from the workloads
247
- // in the group.
248
- func removeWorkloadsMembershipFromGroup (ctx context.Context , groupWorkloads []string , groupName string ) error {
249
- workloadManager , err := workloads .NewManager (ctx )
250
- if err != nil {
251
- return fmt .Errorf ("failed to create workload manager: %w" , err )
259
+ // moveWorkloadsToGroup moves all workloads in the specified group to a new group.
260
+ func moveWorkloadsToGroup (
261
+ ctx context.Context ,
262
+ workloadManager workloads.Manager ,
263
+ groupWorkloads []core.Workload ,
264
+ groupFrom string ,
265
+ groupTo string ,
266
+ ) error {
267
+
268
+ // Extract workload names for the move operation
269
+ var workloadNames []string
270
+ for _ , workload := range groupWorkloads {
271
+ workloadNames = append (workloadNames , workload .Name )
252
272
}
253
273
254
- // Remove group membership from all workloads
255
- if err := workloadManager .MoveToDefaultGroup (ctx , groupWorkloads , groupName ); err != nil {
274
+ // Update workload runconfigs to point to the new group
275
+ if err := workloadManager .MoveToGroup (ctx , workloadNames , groupFrom , groupTo ); err != nil {
256
276
return fmt .Errorf ("failed to move workloads to default group: %w" , err )
257
277
}
258
278
259
- fmt .Printf ("Removed %d workload(s) from group '%s'\n " , len (groupWorkloads ), groupName )
279
+ // Update client configurations for the moved workloads
280
+ err := updateClientConfigurations (ctx , groupWorkloads , groupFrom , groupTo )
281
+ if err != nil {
282
+ return fmt .Errorf ("failed to update client configurations with new group: %w" , err )
283
+ }
284
+
285
+ fmt .Printf ("Moved %d workload(s) from group '%s' to group '%s'\n " , len (groupWorkloads ), groupFrom , groupTo )
286
+ return nil
287
+ }
288
+
289
+ func updateClientConfigurations (ctx context.Context , groupWorkloads []core.Workload , groupFrom string , groupTo string ) error {
290
+ clientManager , err := client .NewManager (ctx )
291
+ if err != nil {
292
+ return fmt .Errorf ("failed to create client manager: %w" , err )
293
+ }
294
+
295
+ for _ , w := range groupWorkloads {
296
+ // Only update client configurations for running workloads
297
+ if w .Status != runtime .WorkloadStatusRunning {
298
+ continue
299
+ }
300
+
301
+ if err := clientManager .RemoveServerFromClients (ctx , w .Name , groupFrom ); err != nil {
302
+ return fmt .Errorf ("failed to remove server %s from client configurations: %w" , w .Name , err )
303
+ }
304
+ if err := clientManager .AddServerToClients (ctx , w .Name , w .URL , string (w .TransportType ), groupTo ); err != nil {
305
+ return fmt .Errorf ("failed to add server %s to client configurations: %w" , w .Name , err )
306
+ }
307
+ }
308
+
260
309
return nil
261
310
}
262
311
0 commit comments