From 0274f7788f0f15e1bee3a446db5802bae0fffdec Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 23 Jan 2025 23:56:02 +0000
Subject: [PATCH] feat(api): api update (#45)
---
.stats.yml | 4 +-
README.md | 8 ++--
api.md | 6 +++
client_test.go | 16 +++----
usage_test.go | 2 +-
vms/vm.go | 2 +-
vms/vm_test.go | 2 +-
volumes/volume.go | 68 +++++++++++++++++++++++++++++
volumes/volume_test.go | 98 ++++++++++++++++++++++++++++++++++++++++++
9 files changed, 189 insertions(+), 17 deletions(-)
create mode 100644 volumes/volume_test.go
diff --git a/.stats.yml b/.stats.yml
index dd32019..b80f985 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,2 +1,2 @@
-configured_endpoints: 17
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/nirvana-labs%2Fnirvana-901357ab068797fff926718b5f7f307dc332f52a1d494ee340352e50bc09b641.yml
+configured_endpoints: 20
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/nirvana-labs%2Fnirvana-88eef6692dd2f29d0734587b0a255ce12fff9fa28b6c1d66d2b61364d2d0c311.yml
diff --git a/README.md b/README.md
index 1c40db3..9d93515 100644
--- a/README.md
+++ b/README.md
@@ -61,7 +61,7 @@ func main() {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -202,7 +202,7 @@ _, err := client.VMs.New(context.TODO(), vms.VMNewParams{
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -248,7 +248,7 @@ client.VMs.New(
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -303,7 +303,7 @@ client.VMs.New(
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
diff --git a/api.md b/api.md
index a55b075..353f905 100644
--- a/api.md
+++ b/api.md
@@ -83,6 +83,12 @@ Response Types:
- volumes.StorageType
- volumes.Volume
+Methods:
+
+- client.Volumes.New(ctx context.Context, body volumes.VolumeNewParams) (operations.Operation, error)
+- client.Volumes.Update(ctx context.Context, volumeID string, body volumes.VolumeUpdateParams) (operations.Operation, error)
+- client.Volumes.Delete(ctx context.Context, volumeID string, body volumes.VolumeDeleteParams) (operations.Operation, error)
+
# Operations
Response Types:
diff --git a/client_test.go b/client_test.go
index fda53b9..4096aff 100644
--- a/client_test.go
+++ b/client_test.go
@@ -48,7 +48,7 @@ func TestUserAgentHeader(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -90,7 +90,7 @@ func TestRetryAfter(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -143,7 +143,7 @@ func TestDeleteRetryCountHeader(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -191,7 +191,7 @@ func TestOverwriteRetryCountHeader(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -238,7 +238,7 @@ func TestRetryAfterMs(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -279,7 +279,7 @@ func TestContextCancel(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -317,7 +317,7 @@ func TestContextCancelDelay(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
@@ -361,7 +361,7 @@ func TestContextDeadline(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
diff --git a/usage_test.go b/usage_test.go
index f625fa6..2a80e9f 100644
--- a/usage_test.go
+++ b/usage_test.go
@@ -35,7 +35,7 @@ func TestUsage(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
diff --git a/vms/vm.go b/vms/vm.go
index 4c43b9b..5a10c75 100644
--- a/vms/vm.go
+++ b/vms/vm.go
@@ -258,7 +258,7 @@ type VMNewParams struct {
CPU param.Field[CPUParam] `json:"cpu,required"`
Name param.Field[string] `json:"name,required"`
NeedPublicIP param.Field[bool] `json:"need_public_ip,required"`
- OSImageID param.Field[int64] `json:"os_image_id,required"`
+ OSImageName param.Field[string] `json:"os_image_name,required"`
Ports param.Field[[]string] `json:"ports,required"`
// RAM details.
Ram param.Field[RamParam] `json:"ram,required"`
diff --git a/vms/vm_test.go b/vms/vm_test.go
index 033a3fd..ae25ed3 100644
--- a/vms/vm_test.go
+++ b/vms/vm_test.go
@@ -37,7 +37,7 @@ func TestVMNewWithOptionalParams(t *testing.T) {
}),
Name: nirvana.F("my-vm"),
NeedPublicIP: nirvana.F(true),
- OSImageID: nirvana.F(int64(1)),
+ OSImageName: nirvana.F("noble-2024-12-06"),
Ports: nirvana.F([]string{"22", "80", "443"}),
Ram: nirvana.F(vms.RamParam{
Size: nirvana.F(int64(2)),
diff --git a/volumes/volume.go b/volumes/volume.go
index f254ec4..4840b8c 100644
--- a/volumes/volume.go
+++ b/volumes/volume.go
@@ -3,7 +3,15 @@
package volumes
import (
+ "context"
+ "errors"
+ "fmt"
+ "net/http"
+
"github.com/nirvana-labs/nirvana-go/internal/apijson"
+ "github.com/nirvana-labs/nirvana-go/internal/param"
+ "github.com/nirvana-labs/nirvana-go/internal/requestconfig"
+ "github.com/nirvana-labs/nirvana-go/operations"
"github.com/nirvana-labs/nirvana-go/option"
)
@@ -26,6 +34,38 @@ func NewVolumeService(opts ...option.RequestOption) (r *VolumeService) {
return
}
+// Create a Volume. Only data volumes can be created.
+func (r *VolumeService) New(ctx context.Context, body VolumeNewParams, opts ...option.RequestOption) (res *operations.Operation, err error) {
+ opts = append(r.Options[:], opts...)
+ path := "volumes"
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...)
+ return
+}
+
+// Update a Volume. Boot or data volumes can be updated.
+func (r *VolumeService) Update(ctx context.Context, volumeID string, body VolumeUpdateParams, opts ...option.RequestOption) (res *operations.Operation, err error) {
+ opts = append(r.Options[:], opts...)
+ if volumeID == "" {
+ err = errors.New("missing required volume_id parameter")
+ return
+ }
+ path := fmt.Sprintf("volumes/%s", volumeID)
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodPatch, path, body, &res, opts...)
+ return
+}
+
+// Delete a Volume. Boot or data volumes can be deleted.
+func (r *VolumeService) Delete(ctx context.Context, volumeID string, body VolumeDeleteParams, opts ...option.RequestOption) (res *operations.Operation, err error) {
+ opts = append(r.Options[:], opts...)
+ if volumeID == "" {
+ err = errors.New("missing required volume_id parameter")
+ return
+ }
+ path := fmt.Sprintf("volumes/%s", volumeID)
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodDelete, path, body, &res, opts...)
+ return
+}
+
// Storage type.
type StorageType string
@@ -66,3 +106,31 @@ func (r *Volume) UnmarshalJSON(data []byte) (err error) {
func (r volumeJSON) RawJSON() string {
return r.raw
}
+
+type VolumeNewParams struct {
+ Size param.Field[int64] `json:"size,required"`
+ VMID param.Field[string] `json:"vm_id,required"`
+ // Storage type.
+ Type param.Field[StorageType] `json:"type"`
+}
+
+func (r VolumeNewParams) MarshalJSON() (data []byte, err error) {
+ return apijson.MarshalRoot(r)
+}
+
+type VolumeUpdateParams struct {
+ Size param.Field[int64] `json:"size,required"`
+ VMID param.Field[string] `json:"vm_id,required"`
+}
+
+func (r VolumeUpdateParams) MarshalJSON() (data []byte, err error) {
+ return apijson.MarshalRoot(r)
+}
+
+type VolumeDeleteParams struct {
+ VMID param.Field[string] `json:"vm_id,required"`
+}
+
+func (r VolumeDeleteParams) MarshalJSON() (data []byte, err error) {
+ return apijson.MarshalRoot(r)
+}
diff --git a/volumes/volume_test.go b/volumes/volume_test.go
new file mode 100644
index 0000000..72c70a7
--- /dev/null
+++ b/volumes/volume_test.go
@@ -0,0 +1,98 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package volumes_test
+
+import (
+ "context"
+ "errors"
+ "os"
+ "testing"
+
+ "github.com/nirvana-labs/nirvana-go"
+ "github.com/nirvana-labs/nirvana-go/internal/testutil"
+ "github.com/nirvana-labs/nirvana-go/option"
+ "github.com/nirvana-labs/nirvana-go/volumes"
+)
+
+func TestVolumeNewWithOptionalParams(t *testing.T) {
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := nirvana.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithAuthToken("My Auth Token"),
+ )
+ _, err := client.Volumes.New(context.TODO(), volumes.VolumeNewParams{
+ Size: nirvana.F(int64(100)),
+ VMID: nirvana.F("vm_id"),
+ Type: nirvana.F(volumes.StorageTypeNvme),
+ })
+ if err != nil {
+ var apierr *nirvana.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}
+
+func TestVolumeUpdate(t *testing.T) {
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := nirvana.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithAuthToken("My Auth Token"),
+ )
+ _, err := client.Volumes.Update(
+ context.TODO(),
+ "volume_id",
+ volumes.VolumeUpdateParams{
+ Size: nirvana.F(int64(100)),
+ VMID: nirvana.F("vm_id"),
+ },
+ )
+ if err != nil {
+ var apierr *nirvana.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}
+
+func TestVolumeDelete(t *testing.T) {
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := nirvana.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithAuthToken("My Auth Token"),
+ )
+ _, err := client.Volumes.Delete(
+ context.TODO(),
+ "volume_id",
+ volumes.VolumeDeleteParams{
+ VMID: nirvana.F("vm_id"),
+ },
+ )
+ if err != nil {
+ var apierr *nirvana.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}