77 "fmt"
88 "slices"
99 "strings"
10+ "sync"
1011 "time"
1112
1213 "github.com/inspektor-gadget/inspektor-gadget/pkg/datasource"
@@ -15,7 +16,6 @@ import (
1516 gadgetcontext "github.com/inspektor-gadget/inspektor-gadget/pkg/gadget-context"
1617 "github.com/inspektor-gadget/inspektor-gadget/pkg/operators"
1718 "github.com/inspektor-gadget/inspektor-gadget/pkg/operators/simple"
18- "github.com/inspektor-gadget/inspektor-gadget/pkg/runtime"
1919 grpcruntime "github.com/inspektor-gadget/inspektor-gadget/pkg/runtime/grpc"
2020 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2121 "k8s.io/cli-runtime/pkg/genericclioptions"
@@ -40,8 +40,8 @@ type GadgetManager interface {
4040 ListGadgets (ctx context.Context ) ([]* GadgetInstance , error )
4141 // IsDeployed checks if the Inspektor Gadget is deployed in the environment
4242 IsDeployed (ctx context.Context ) (bool , string , error )
43- // Close closes the gadget manager and releases any resources
44- Close () error
43+ // GetVersion retrieves the version of Inspektor Gadget installed in the cluster
44+ GetVersion () ( string , error )
4545}
4646
4747// GadgetInstance represents a running gadget instance
@@ -60,25 +60,12 @@ func init() {
6060}
6161
6262// NewGadgetManager creates a new instance of GadgetManager
63- func NewGadgetManager () (GadgetManager , error ) {
64- rt := grpcruntime .New (grpcruntime .WithConnectUsingK8SProxy )
65- if err := rt .Init (nil ); err != nil {
66- return nil , fmt .Errorf ("initializing gadget runtime: %w" , err )
67- }
68-
69- restConfig , err := KubernetesFlags .ToRESTConfig ()
70- if err != nil {
71- return nil , fmt .Errorf ("creating REST config: %w" , err )
72- }
73- rt .SetRestConfig (restConfig )
74-
75- return & manager {
76- runtime : rt ,
77- }, nil
63+ func NewGadgetManager () GadgetManager {
64+ return & manager {}
7865}
7966
8067type manager struct {
81- runtime runtime. Runtime
68+ formatterMu sync. Mutex
8269}
8370
8471// RunGadget runs a gadget with the specified image and parameters for a given duration
@@ -88,15 +75,20 @@ func (g *manager) RunGadget(ctx context.Context, image string, params map[string
8875 ctx ,
8976 image ,
9077 gadgetcontext .WithDataOperators (
91- outputDataOperator (func (data []byte ) {
78+ g . outputDataOperator (func (data []byte ) {
9279 results .Write (data )
9380 results .WriteByte ('\n' )
9481 }),
9582 ),
9683 gadgetcontext .WithTimeout (duration ),
9784 )
9885
99- if err := g .runtime .RunGadget (gadgetCtx , g .runtime .ParamDescs ().ToParams (), params ); err != nil {
86+ rt , err := getRuntime ()
87+ if err != nil {
88+ return "" , fmt .Errorf ("getting runtime: %w" , err )
89+ }
90+
91+ if err := rt .RunGadget (gadgetCtx , rt .ParamDescs ().ToParams (), params ); err != nil {
10092 return "" , fmt .Errorf ("running gadget: %w" , err )
10193 }
10294
@@ -118,7 +110,7 @@ func truncateResults(results string, latest bool) string {
118110 return fmt .Sprintf ("\n <isTruncated>true</isTruncated>\n <results>%s</results>\n " , truncated )
119111}
120112
121- func outputDataOperator (cb func (data []byte )) operators.DataOperator {
113+ func ( g * manager ) outputDataOperator (cb func (data []byte )) operators.DataOperator {
122114 const opPriority = 50000
123115 return simple .New ("outputDataOperator" ,
124116 simple .OnInit (func (gadgetCtx operators.GadgetContext ) error {
@@ -135,6 +127,8 @@ func outputDataOperator(cb func(data []byte)) operators.DataOperator {
135127 }
136128
137129 err := d .Subscribe (func (source datasource.DataSource , data datasource.Data ) error {
130+ g .formatterMu .Lock ()
131+ defer g .formatterMu .Unlock ()
138132 jsonData := jsonFormatter .Marshal (data )
139133 cb (jsonData )
140134 return nil
@@ -155,10 +149,14 @@ func (g *manager) StartGadget(ctx context.Context, image string, params map[stri
155149 image ,
156150 )
157151
158- p := g .runtime .ParamDescs ().ToParams ()
152+ rt , err := getRuntime ()
153+ if err != nil {
154+ return "" , fmt .Errorf ("getting runtime: %w" , err )
155+ }
156+ p := rt .ParamDescs ().ToParams ()
159157
160158 newID := make ([]byte , 16 )
161- _ , err : = rand .Read (newID )
159+ _ , err = rand .Read (newID )
162160 if err != nil {
163161 return "" , fmt .Errorf ("generating new gadget ID: %w" , err )
164162 }
@@ -175,7 +173,7 @@ func (g *manager) StartGadget(ctx context.Context, image string, params map[stri
175173 if err = p .Set (grpcruntime .ParamTags , strings .Join (append (tags , "createdBy=aks-mcp" ), "," )); err != nil {
176174 return "" , fmt .Errorf ("setting gadget tags: %w" , err )
177175 }
178- if err := g . runtime .RunGadget (gadgetCtx , p , params ); err != nil {
176+ if err = rt .RunGadget (gadgetCtx , p , params ); err != nil {
179177 return "" , fmt .Errorf ("running gadget: %w" , err )
180178 }
181179
@@ -184,8 +182,13 @@ func (g *manager) StartGadget(ctx context.Context, image string, params map[stri
184182
185183// StopGadget stops a running gadget by its ID
186184func (g * manager ) StopGadget (ctx context.Context , id string ) error {
187- if err := g .runtime .(* grpcruntime.Runtime ).RemoveGadgetInstance (ctx , g .runtime .ParamDescs ().ToParams (), id ); err != nil {
188- return fmt .Errorf ("stopping to gadget: %w" , err )
185+ rt , err := getRuntime ()
186+ if err != nil {
187+ return fmt .Errorf ("getting runtime: %w" , err )
188+ }
189+
190+ if err = rt .RemoveGadgetInstance (ctx , rt .ParamDescs ().ToParams (), id ); err != nil {
191+ return fmt .Errorf ("stopping gadget: %w" , err )
189192 }
190193 return nil
191194}
@@ -200,7 +203,7 @@ func (g *manager) GetResults(ctx context.Context, id string) (string, error) {
200203 to ,
201204 id ,
202205 gadgetcontext .WithDataOperators (
203- outputDataOperator (func (data []byte ) {
206+ g . outputDataOperator (func (data []byte ) {
204207 results .Write (data )
205208 results .WriteByte ('\n' )
206209 }),
@@ -210,7 +213,12 @@ func (g *manager) GetResults(ctx context.Context, id string) (string, error) {
210213 gadgetcontext .WithTimeout (time .Second ),
211214 )
212215
213- if err := g .runtime .RunGadget (gadgetCtx , g .runtime .ParamDescs ().ToParams (), map [string ]string {}); err != nil {
216+ rt , err := getRuntime ()
217+ if err != nil {
218+ return "" , fmt .Errorf ("getting runtime: %w" , err )
219+ }
220+
221+ if err = rt .RunGadget (gadgetCtx , rt .ParamDescs ().ToParams (), map [string ]string {}); err != nil {
214222 return "" , fmt .Errorf ("attaching to gadget: %w" , err )
215223 }
216224
@@ -219,7 +227,12 @@ func (g *manager) GetResults(ctx context.Context, id string) (string, error) {
219227
220228// ListGadgets lists all running gadgets and returns their instances
221229func (g * manager ) ListGadgets (ctx context.Context ) ([]* GadgetInstance , error ) {
222- instances , err := g .runtime .(* grpcruntime.Runtime ).GetGadgetInstances (ctx , g .runtime .ParamDescs ().ToParams ())
230+ rt , err := getRuntime ()
231+ if err != nil {
232+ return nil , fmt .Errorf ("getting runtime: %w" , err )
233+ }
234+
235+ instances , err := rt .GetGadgetInstances (ctx , rt .ParamDescs ().ToParams ())
223236 if err != nil {
224237 return nil , fmt .Errorf ("listing gadgets: %w" , err )
225238 }
@@ -267,10 +280,31 @@ func (g *manager) IsDeployed(ctx context.Context) (bool, string, error) {
267280 return true , namespaces [0 ], nil
268281}
269282
270- // Close closes the gadget manager and releases any resources
271- func ( g * manager ) Close () error {
272- if g . runtime != nil {
273- return g . runtime . Close ( )
283+ func ( g * manager ) GetVersion () ( string , error ) {
284+ rt , err := getRuntime ()
285+ if err != nil {
286+ return "" , fmt . Errorf ( "getting runtime: %w" , err )
274287 }
275- return nil
288+
289+ info , err := rt .GetInfo ()
290+ if err != nil {
291+ return "" , fmt .Errorf ("getting info: %w" , err )
292+ }
293+ return info .ServerVersion , nil
294+ }
295+
296+ // getRuntime sets up a runtime, ensuring we always use the latest kubeconfig
297+ func getRuntime () (* grpcruntime.Runtime , error ) {
298+ rt := grpcruntime .New (grpcruntime .WithConnectUsingK8SProxy )
299+ if err := rt .Init (nil ); err != nil {
300+ return nil , fmt .Errorf ("initializing gadget runtime: %w" , err )
301+ }
302+
303+ restConfig , err := KubernetesFlags .ToRESTConfig ()
304+ if err != nil {
305+ return nil , fmt .Errorf ("creating REST config: %w" , err )
306+ }
307+ rt .SetRestConfig (restConfig )
308+
309+ return rt , nil
276310}
0 commit comments