@@ -31,7 +31,10 @@ import (
31
31
. "github.com/onsi/ginkgo/v2"
32
32
. "github.com/onsi/gomega"
33
33
corev1 "k8s.io/api/core/v1"
34
+ "k8s.io/apimachinery/pkg/types"
34
35
"k8s.io/apimachinery/pkg/util/sets"
36
+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
37
+ expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
35
38
"sigs.k8s.io/cluster-api/test/framework"
36
39
"sigs.k8s.io/cluster-api/test/framework/clusterctl"
37
40
"sigs.k8s.io/cluster-api/util"
@@ -199,15 +202,15 @@ func dumpMachine(ctx context.Context, e2eCtx *E2EContext, machine infrav1.OpenSt
199
202
},
200
203
{
201
204
title : "containerd-info" ,
202
- cmd : "crictl info" ,
205
+ cmd : "crictl --runtime-endpoint unix:///run/containerd/containerd.sock info" ,
203
206
},
204
207
{
205
208
title : "containerd-containers" ,
206
- cmd : "crictl ps" ,
209
+ cmd : "crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps" ,
207
210
},
208
211
{
209
212
title : "containerd-pods" ,
210
- cmd : "crictl pods" ,
213
+ cmd : "crictl --runtime-endpoint unix:///run/containerd/containerd.sock pods" ,
211
214
},
212
215
{
213
216
title : "cloud-final" ,
@@ -262,3 +265,125 @@ func SetEnvVar(key, value string, private bool) {
262
265
Logf ("Setting environment variable: key=%s, value=%s" , key , printableValue )
263
266
_ = os .Setenv (key , value )
264
267
}
268
+
269
+ // getOpenStackClusterFromMachine gets the OpenStackCluster that is related to the given machine.
270
+ func getOpenStackClusterFromMachine (ctx context.Context , client client.Client , machine * clusterv1.Machine ) (* infrav1.OpenStackCluster , error ) {
271
+ key := types.NamespacedName {
272
+ Namespace : machine .Namespace ,
273
+ Name : machine .Spec .ClusterName ,
274
+ }
275
+ cluster := & clusterv1.Cluster {}
276
+ err := client .Get (ctx , key , cluster )
277
+ if err != nil {
278
+ return nil , err
279
+ }
280
+
281
+ key = types.NamespacedName {
282
+ Namespace : cluster .Spec .InfrastructureRef .Namespace ,
283
+ Name : cluster .Spec .InfrastructureRef .Name ,
284
+ }
285
+ openStackCluster := & infrav1.OpenStackCluster {}
286
+ err = client .Get (ctx , key , openStackCluster )
287
+ return openStackCluster , err
288
+ }
289
+
290
+ type OpenStackLogCollector struct {
291
+ E2EContext E2EContext
292
+ }
293
+
294
+ // CollectMachineLog gets logs for the OpenStack resources related to the given machine.
295
+ func (o OpenStackLogCollector ) CollectMachineLog (ctx context.Context , managementClusterClient client.Client , m * clusterv1.Machine , outputPath string ) error {
296
+ machineLogBase := path .Join (outputPath , "instances" , m .Namespace , m .Name )
297
+ metaLog := path .Join (machineLogBase , "instance.log" )
298
+
299
+ if err := os .MkdirAll (filepath .Dir (metaLog ), 0o750 ); err != nil {
300
+ _ , _ = fmt .Fprintf (GinkgoWriter , "couldn't create directory %q for file: %s\n " , metaLog , err )
301
+ }
302
+
303
+ f , err := os .OpenFile (metaLog , os .O_APPEND | os .O_CREATE | os .O_WRONLY , 0o644 )
304
+ if err != nil {
305
+ _ , _ = fmt .Fprintf (GinkgoWriter , "couldn't open file %q: %s\n " , metaLog , err )
306
+ return nil
307
+ }
308
+ defer f .Close ()
309
+
310
+ openStackCluster , err := getOpenStackClusterFromMachine (ctx , managementClusterClient , m )
311
+ if err != nil {
312
+ return fmt .Errorf ("error getting OpenStackCluster for Machine: %s" , err )
313
+ }
314
+
315
+ if len (m .Status .Addresses ) < 1 {
316
+ return fmt .Errorf ("unable to get logs for machine since it has no address" )
317
+ }
318
+ ip := m .Status .Addresses [0 ].Address
319
+
320
+ srvs , err := GetOpenStackServers (& o .E2EContext , openStackCluster , sets .New (m .Spec .InfrastructureRef .Name ))
321
+ if err != nil {
322
+ return fmt .Errorf ("cannot dump machines, could not get servers from OpenStack: %v" , err )
323
+ }
324
+ if len (srvs ) != 1 {
325
+ return fmt .Errorf ("expected exactly 1 server but got %d" , len (srvs ))
326
+ }
327
+ srv := srvs [m .Spec .InfrastructureRef .Name ]
328
+
329
+ serverJSON , err := json .MarshalIndent (srv , "" , " " )
330
+ if err != nil {
331
+ return fmt .Errorf ("error marshalling server %v: %s" , srv , err )
332
+ }
333
+ if err := os .WriteFile (path .Join (machineLogBase , "server.txt" ), serverJSON , 0o600 ); err != nil {
334
+ return fmt .Errorf ("error writing server JSON %s: %s" , serverJSON , err )
335
+ }
336
+ _ , _ = fmt .Fprintf (f , "instance found: %q\n " , srv .ID )
337
+
338
+ srvUser := o .E2EContext .E2EConfig .GetVariable (SSHUserMachine )
339
+ executeCommands (
340
+ ctx ,
341
+ o .E2EContext .Settings .ArtifactFolder ,
342
+ o .E2EContext .Settings .Debug ,
343
+ filepath .Dir (f .Name ()),
344
+ ip ,
345
+ openStackCluster .Status .Bastion .FloatingIP ,
346
+ srvUser ,
347
+ []command {
348
+ // don't do this for now, it just takes to long
349
+ // {
350
+ // title: "systemd",
351
+ // cmd: "journalctl --no-pager --output=short-precise | grep -v 'audit:\\|audit\\['",
352
+ // },
353
+ {
354
+ title : "kern" ,
355
+ cmd : "journalctl --no-pager --output=short-precise -k" ,
356
+ },
357
+ {
358
+ title : "containerd-info" ,
359
+ cmd : "crictl --runtime-endpoint unix:///run/containerd/containerd.sock info" ,
360
+ },
361
+ {
362
+ title : "containerd-containers" ,
363
+ cmd : "crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps" ,
364
+ },
365
+ {
366
+ title : "containerd-pods" ,
367
+ cmd : "crictl --runtime-endpoint unix:///run/containerd/containerd.sock pods" ,
368
+ },
369
+ {
370
+ title : "cloud-final" ,
371
+ cmd : "journalctl --no-pager -u cloud-final" ,
372
+ },
373
+ {
374
+ title : "kubelet" ,
375
+ cmd : "journalctl --no-pager -u kubelet.service" ,
376
+ },
377
+ {
378
+ title : "containerd" ,
379
+ cmd : "journalctl --no-pager -u containerd.service" ,
380
+ },
381
+ },
382
+ )
383
+ return nil
384
+ }
385
+
386
+ // CollectMachinePoolLog is not yet implemented for the OpenStack provider.
387
+ func (o OpenStackLogCollector ) CollectMachinePoolLog (_ context.Context , _ client.Client , _ * expv1.MachinePool , _ string ) error {
388
+ return fmt .Errorf ("not implemented" )
389
+ }
0 commit comments