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()) + } +}