diff --git a/firecracker.go b/firecracker.go index 0677951d..46526b01 100644 --- a/firecracker.go +++ b/firecracker.go @@ -273,3 +273,12 @@ func (f *Client) PatchGuestDriveByID(ctx context.Context, driveID, pathOnHost st return f.client.Operations.PatchGuestDriveByID(params) } + +// DescribeInstance is a wrapper for the swagger generated client to make +// calling of the API easier. +func (f *Client) DescribeInstance(ctx context.Context) (*ops.DescribeInstanceOK, error) { + params := ops.NewDescribeInstanceParams() + params.SetContext(ctx) + + return f.client.Operations.DescribeInstance(params) +} \ No newline at end of file diff --git a/firecracker_test.go b/firecracker_test.go index c729a40c..d2a8a436 100644 --- a/firecracker_test.go +++ b/firecracker_test.go @@ -52,4 +52,8 @@ func TestClient(t *testing.T) { if _, err := client.PutGuestDriveByID(ctx, "test", drive); err != nil { t.Errorf("unexpected error on PutGuestDriveByID, %v", err) } + + if _, err := client.DescribeInstance(ctx); err != nil { + t.Errorf("unexpected error on DescribeInstance, %v", err) + } } diff --git a/machine.go b/machine.go index cdff13d9..0d01013c 100644 --- a/machine.go +++ b/machine.go @@ -672,6 +672,18 @@ func (m *Machine) UpdateGuestDrive(ctx context.Context, driveID, pathOnHost stri return nil } +// DescribeInstance returns general information about an instance. +func (m *Machine) DescribeInstance(ctx context.Context) (*models.InstanceInfo, error) { + instance, err := m.client.DescribeInstance(ctx) + if err != nil { + m.logger.WithError(err).Error("Failed to describe instance") + return nil, err + } + + m.logger.Printf("DescribeInstance successful") + return instance.Payload, nil +} + // refreshMachineConfiguration synchronizes our cached representation of the machine configuration // with that reported by the Firecracker API func (m *Machine) refreshMachineConfiguration() error { diff --git a/machine_test.go b/machine_test.go index 30458402..9cce6f10 100644 --- a/machine_test.go +++ b/machine_test.go @@ -330,6 +330,7 @@ func TestMicroVMExecution(t *testing.T) { t.Run("TestAttachSecondaryDrive", func(t *testing.T) { testAttachSecondaryDrive(ctx, t, m) }) t.Run("TestAttachVsock", func(t *testing.T) { testAttachVsock(ctx, t, m) }) t.Run("SetMetadata", func(t *testing.T) { testSetMetadata(ctx, t, m) }) + t.Run("DescribeInstance", func(t *testing.T) { testDescribeInstance(ctx, t, m) }) t.Run("TestUpdateGuestDrive", func(t *testing.T) { testUpdateGuestDrive(ctx, t, m) }) t.Run("TestUpdateGuestNetworkInterface", func(t *testing.T) { testUpdateGuestNetworkInterface(ctx, t, m) }) t.Run("TestStartInstance", func(t *testing.T) { testStartInstance(ctx, t, m) }) @@ -667,6 +668,29 @@ func testSetMetadata(ctx context.Context, t *testing.T, m *Machine) { } } +func testDescribeInstance(ctx context.Context, t *testing.T, m *Machine) { + instanceInfo, err := m.DescribeInstance(ctx) + if err != nil { + t.Errorf("failed to describe instance: %v", err) + } + + if instanceInfo == nil { + t.Error("instance info is nil") + } + + if instanceInfo.ID == nil || *instanceInfo.ID == "" { + t.Error("invalid instance id") + } + + if instanceInfo.State == nil || *instanceInfo.State == "" { + t.Error("invalid vmm state") + } + + if instanceInfo.VmmVersion == nil || *instanceInfo.VmmVersion == "" { + t.Error("invalid vmm version") + } +} + func TestLogFiles(t *testing.T) { cfg := Config{ Debug: true, diff --git a/machineiface.go b/machineiface.go index 194eb6b3..7806bbc3 100644 --- a/machineiface.go +++ b/machineiface.go @@ -15,6 +15,8 @@ package firecracker import ( "context" + + models "github.com/firecracker-microvm/firecracker-go-sdk/client/models" ) // This ensures the interface method signatures match that of Machine @@ -30,4 +32,5 @@ type MachineIface interface { SetMetadata(context.Context, interface{}) error UpdateGuestDrive(context.Context, string, string, ...PatchGuestDriveByIDOpt) error UpdateGuestNetworkInterfaceRateLimit(context.Context, string, RateLimiterSet, ...PatchGuestNetworkInterfaceByIDOpt) error + DescribeInstance(ctx context.Context) (*models.InstanceInfo, error) }