From d1446c0b8fb4b4be95fe56313142959b7c5040bf Mon Sep 17 00:00:00 2001 From: Joost Buskermolen Date: Mon, 18 Dec 2023 16:22:32 +0100 Subject: [PATCH 1/2] feat(vps): filter Operating Systems without needing a VPS. Signed-off-by: Joost Buskermolen --- vps/repository.go | 10 ++++++++++ vps/repository_test.go | 38 ++++++++++++++++++++++++++++++++++++++ vps/vps.go | 10 +++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/vps/repository.go b/vps/repository.go index 2f78b4e..7e3d98d 100644 --- a/vps/repository.go +++ b/vps/repository.go @@ -296,6 +296,16 @@ func (r *Repository) GetOperatingSystems(vpsName string) ([]OperatingSystem, err return response.OperatingSystems, err } +// FilterOperatingSystems allows you to filter Operating Systems without needing a VPS +func (r *Repository) FilterOperatingSystems(productName string, addons []string) ([]OperatingSystem, error) { + var response operatingSystemsWrapper + requestBody := operatingSystemsRequest{ProductName: productName, Addons: addons} + restRequest := rest.Request{Endpoint: "/operating-systems", Body: &requestBody} + err := r.Client.Get(restRequest, &response) + fmt.Printf("%+v\n", response) + return response.OperatingSystems, err +} + // InstallOperatingSystem allows you to install an operating system to a Vps, // optionally you can specify a hostname and a base64InstallText, // which would be the automatic installation configuration of your Vps diff --git a/vps/repository_test.go b/vps/repository_test.go index e80fb69..0f497a2 100644 --- a/vps/repository_test.go +++ b/vps/repository_test.go @@ -531,6 +531,44 @@ func TestRepository_GetOperatingSystems(t *testing.T) { assert.Equal(t, 1250, oses[0].Price) } +func TestRepository_FilterOperatingSystems(t *testing.T) { + const apiResponse = `{ + "operatingSystems": [ + { + "name": "ubuntu-18.04", + "description": "Ubuntu 18.04 LTS", + "version": "18.04 LTS", + "price": 1250, + "installFlavours": [ + "installer", + "preinstallable", + "cloudinit" + ], + "licenses": [] + } + ] +}` + server := testutil.MockServer{T: t, ExpectedURL: "/operating-systems", ExpectedMethod: "GET", StatusCode: 200, Response: apiResponse, ExpectedRequest: `{"productName":"vps-bladevps-x8","addons":["vpsAddon-1-extra-cpu-core"]}`} + client, tearDown := server.GetClient() + defer tearDown() + repo := Repository{Client: *client} + + oses, err := repo.FilterOperatingSystems("vps-bladevps-x8", []string{"vpsAddon-1-extra-cpu-core"}) + fmt.Printf("%+v", oses) + require.NoError(t, err) + require.Equal(t, 1, len(oses)) + + assert.Equal(t, "ubuntu-18.04", oses[0].Name) + assert.Equal(t, "Ubuntu 18.04 LTS", oses[0].Description) + assert.Equal(t, false, oses[0].IsPreinstallableImage) + assert.Contains(t, oses[0].InstallFlavours, InstallFlavourInstaller) + assert.Contains(t, oses[0].InstallFlavours, InstallFlavourPreinstallable) + assert.Contains(t, oses[0].InstallFlavours, InstallFlavourCloudInit) + assert.Equal(t, "18.04 LTS", oses[0].Version) + assert.Equal(t, 1250, oses[0].Price) + assert.Equal(t, 0, len(oses[0].Licenses)) +} + func TestRepository_InstallOperatingSystemOptionalFields(t *testing.T) { const expectedRequest = `{"operatingSystemName":"ubuntu-18.04"}` server := testutil.MockServer{T: t, ExpectedURL: "/vps/example-vps/operating-systems", ExpectedMethod: "POST", StatusCode: 201, ExpectedRequest: expectedRequest} diff --git a/vps/vps.go b/vps/vps.go index 161b346..cd5249d 100644 --- a/vps/vps.go +++ b/vps/vps.go @@ -1,10 +1,11 @@ package vps import ( + "net" + "github.com/transip/gotransip/v6/ipaddress" "github.com/transip/gotransip/v6/product" "github.com/transip/gotransip/v6/rest" - "net" ) // BackupStatus is one of the following strings @@ -178,6 +179,13 @@ type upgradesWrapper struct { Upgrades []product.Product `json:"upgrades"` } +// operatingSystemsRequest struct contains a productName and an optional list of addons +// this is solely used for marshalling +type operatingSystemsRequest struct { + ProductName string `json:"productName"` + Addons []string `json:"addons,omitempty"` +} + // operatingSystemsWrapper struct contains a list with OperatingSystems in it, // this is solely used for marshalling type operatingSystemsWrapper struct { From 9e1f50621d35ce8d8dc097e80b2fd3b9e68892e6 Mon Sep 17 00:00:00 2001 From: Joost Buskermolen Date: Tue, 19 Dec 2023 09:38:03 +0100 Subject: [PATCH 2/2] chore: Remove debug logging Signed-off-by: Joost Buskermolen --- vps/repository.go | 2 +- vps/repository_test.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/vps/repository.go b/vps/repository.go index 7e3d98d..763352e 100644 --- a/vps/repository.go +++ b/vps/repository.go @@ -302,7 +302,7 @@ func (r *Repository) FilterOperatingSystems(productName string, addons []string) requestBody := operatingSystemsRequest{ProductName: productName, Addons: addons} restRequest := rest.Request{Endpoint: "/operating-systems", Body: &requestBody} err := r.Client.Get(restRequest, &response) - fmt.Printf("%+v\n", response) + return response.OperatingSystems, err } diff --git a/vps/repository_test.go b/vps/repository_test.go index 0f497a2..32e8a05 100644 --- a/vps/repository_test.go +++ b/vps/repository_test.go @@ -554,7 +554,6 @@ func TestRepository_FilterOperatingSystems(t *testing.T) { repo := Repository{Client: *client} oses, err := repo.FilterOperatingSystems("vps-bladevps-x8", []string{"vpsAddon-1-extra-cpu-core"}) - fmt.Printf("%+v", oses) require.NoError(t, err) require.Equal(t, 1, len(oses))