From c54d28f111462661f054237a4c2d358464fba109 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Thu, 3 Nov 2022 15:31:01 +0100 Subject: [PATCH 01/18] BMA-5998 Display error information from response body --- leaseweb/api_client.go | 82 +++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index fadd1fd4..6bac8e59 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "net/http" "strconv" "strings" @@ -122,6 +123,29 @@ type Job struct { Payload Payload } +// ErrorInfo - +type ErrorInfo struct { + Context string + Code string `json:"errorCode"` + Message string `json:"errorMessage"` +} + +func (ei *ErrorInfo) Error() string { + return "(" + ei.Code + ") " + ei.Context + ": " + ei.Message +} + +func parseErrorInfo(r io.Reader, ctx string) error { + ei := ErrorInfo{ + Context: ctx, + } + + if err := json.NewDecoder(r).Decode(&ei); err != nil { + return err + } + + return &ei +} + func getServer(serverID string) (*Server, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID), nil) if err != nil { @@ -136,7 +160,7 @@ func getServer(serverID string) (*Server, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting server, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting server") } var server Server @@ -165,7 +189,7 @@ func getServerIP(serverID string, ip string) (*IP, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting ip, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting server IP") } var ipData IP @@ -191,7 +215,7 @@ func getServerLease(serverID string) (*DHCPLease, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting leases, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting server lease") } var dhcpLease DHCPLease @@ -217,7 +241,7 @@ func getPowerInfo(serverID string) (*PowerInfo, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting leases, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting server power info") } var powerInfo PowerInfo @@ -243,7 +267,7 @@ func getNetworkInterfaceInfo(serverID string, networkType string) (*NetworkInter defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting network interface info, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting server network interface info") } var networkInterfaceInfo NetworkInterfaceInfo @@ -279,7 +303,7 @@ func updateReference(serverID string, reference string) error { } if response.StatusCode != http.StatusNoContent { - return fmt.Errorf("error updating reference, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "updating server reference") } return nil @@ -309,7 +333,7 @@ func updateReverseLookup(serverID string, ip string, reverseLookup string) error } if response.StatusCode != http.StatusOK { - return fmt.Errorf("error updating reverse lookup, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "updating server reverse lookup") } return nil @@ -328,7 +352,7 @@ func powerOnServer(serverID string) error { } if response.StatusCode != http.StatusAccepted { - return fmt.Errorf("error powering on server, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "powering on server") } return nil @@ -347,7 +371,7 @@ func powerOffServer(serverID string) error { } if response.StatusCode != http.StatusAccepted { - return fmt.Errorf("error powering off server, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "powering off server") } return nil @@ -377,7 +401,7 @@ func addDHCPLease(serverID string, bootfile string) error { } if response.StatusCode != http.StatusNoContent { - return fmt.Errorf("error adding dhcp lease, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "adding server lease") } return nil @@ -396,7 +420,7 @@ func removeDHCPLease(serverID string) error { } if response.StatusCode != http.StatusNoContent { - return fmt.Errorf("error removing dhcp lease, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "removing server lease") } return nil @@ -415,7 +439,7 @@ func openNetworkInterface(serverID string, networkType string) error { } if response.StatusCode != http.StatusNoContent { - return fmt.Errorf("error opening network interface, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "opening server network interface") } return nil @@ -434,7 +458,7 @@ func closeNetworkInterface(serverID string, networkType string) error { } if response.StatusCode != http.StatusNoContent { - return fmt.Errorf("error closing network interface, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "closing server network interface") } return nil @@ -453,7 +477,7 @@ func nullIP(serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - return fmt.Errorf("error nulling ip of the server, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "nulling server IP") } return nil @@ -472,7 +496,7 @@ func unnullIP(serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - return fmt.Errorf("error unnulling server ip of the server, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "unnulling server IP") } return nil @@ -499,7 +523,7 @@ func createDedicatedServerNotificationSetting(serverID string, notificationType defer response.Body.Close() if response.StatusCode != http.StatusCreated { - return nil, fmt.Errorf("error creating server notification setting, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "creating server notification setting") } var createdNotificationSetting NotificationSetting @@ -525,7 +549,7 @@ func getDedicatedServerNotificationSetting(serverID string, notificationType str defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting server notification setting, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting server notification setting") } var notificationSetting NotificationSetting @@ -558,7 +582,7 @@ func updateDedicatedServerNotificationSetting(serverID string, notificationType defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error updating server notification setting, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "updating server notification setting") } var updatedNotificationSetting NotificationSetting @@ -584,7 +608,7 @@ func deleteDedicatedServerNotificationSetting(serverID string, notificationType defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - return fmt.Errorf("error deleting server notification setting, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "deleting server notification setting") } return nil @@ -611,7 +635,7 @@ func createDedicatedServerCredential(serverID string, credential *Credential) (* defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error creating server credential, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "creating server credential") } var createdCredential Credential @@ -637,7 +661,7 @@ func getDedicatedServerCredential(serverID string, credentialType string, userna defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting server credential, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting server credential") } var credential Credential @@ -674,7 +698,7 @@ func updateDedicatedServerCredential(serverID string, credential *Credential) (* defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error updating server credential, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "updating server credential") } var updatedCredential Credential @@ -700,7 +724,7 @@ func deleteDedicatedServerCredential(serverID string, credential *Credential) er defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - return fmt.Errorf("error deleting server credential, api response %v", response.StatusCode) + return parseErrorInfo(response.Body, "deleting server credential") } return nil @@ -720,7 +744,7 @@ func getOperatingSystems() ([]OperatingSystem, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting operating systems, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting operating systems") } var operatingSystems struct { @@ -757,7 +781,7 @@ func getControlPanels(operatingSystemID string) ([]ControlPanel, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting control panels, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting control panels") } var controlPanels struct { @@ -793,7 +817,7 @@ func launchInstallationJob(serverID string, payload *Payload) (*Job, error) { defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - return nil, fmt.Errorf("error launching installation job, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "launching installation job") } var installationJob Job @@ -824,7 +848,7 @@ func getLatestInstallationJob(serverID string) (*Job, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting latest installation job, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting latest installation job") } var jobs struct { @@ -853,7 +877,7 @@ func getJob(serverID string, jobUUID string) (*Job, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting job status, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting job status") } var job Job @@ -898,7 +922,7 @@ func getServersBatch(offset int, limit int, site string) ([]Server, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error getting server list, api response %v", response.StatusCode) + return nil, parseErrorInfo(response.Body, "getting servers list") } var serverList struct { From fa45ae55bd38af93e2d8f23db7859dd175b28a80 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Fri, 4 Nov 2022 08:40:03 +0100 Subject: [PATCH 02/18] BMA-5998 Improve error message context with more specific information --- leaseweb/api_client.go | 58 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 6bac8e59..0e97337a 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -160,7 +160,7 @@ func getServer(serverID string) (*Server, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting server") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s", serverID)) } var server Server @@ -189,7 +189,7 @@ func getServerIP(serverID string, ip string) (*IP, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting server IP") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s IP %s", serverID, ip)) } var ipData IP @@ -215,7 +215,7 @@ func getServerLease(serverID string) (*DHCPLease, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting server lease") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s lease", serverID)) } var dhcpLease DHCPLease @@ -241,7 +241,7 @@ func getPowerInfo(serverID string) (*PowerInfo, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting server power info") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s power info", serverID)) } var powerInfo PowerInfo @@ -267,7 +267,7 @@ func getNetworkInterfaceInfo(serverID string, networkType string) (*NetworkInter defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting server network interface info") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server network interface info")) } var networkInterfaceInfo NetworkInterfaceInfo @@ -303,7 +303,7 @@ func updateReference(serverID string, reference string) error { } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, "updating server reference") + return parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reference", serverID)) } return nil @@ -333,7 +333,7 @@ func updateReverseLookup(serverID string, ip string, reverseLookup string) error } if response.StatusCode != http.StatusOK { - return parseErrorInfo(response.Body, "updating server reverse lookup") + return parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip)) } return nil @@ -352,7 +352,7 @@ func powerOnServer(serverID string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, "powering on server") + return parseErrorInfo(response.Body, fmt.Sprintf("powering on server %s", serverID)) } return nil @@ -371,7 +371,7 @@ func powerOffServer(serverID string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, "powering off server") + return parseErrorInfo(response.Body, fmt.Sprintf("powering off server %s", serverID)) } return nil @@ -401,7 +401,7 @@ func addDHCPLease(serverID string, bootfile string) error { } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, "adding server lease") + return parseErrorInfo(response.Body, fmt.Sprintf("adding server %s lease", serverID)) } return nil @@ -420,7 +420,7 @@ func removeDHCPLease(serverID string) error { } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, "removing server lease") + return parseErrorInfo(response.Body, fmt.Sprintf("removing server %s lease", serverID)) } return nil @@ -439,7 +439,7 @@ func openNetworkInterface(serverID string, networkType string) error { } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, "opening server network interface") + return parseErrorInfo(response.Body, fmt.Sprintf("opening server %s network interface %s", serverID, networkType)) } return nil @@ -458,7 +458,7 @@ func closeNetworkInterface(serverID string, networkType string) error { } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, "closing server network interface") + return parseErrorInfo(response.Body, fmt.Sprintf("closing server %s network interface %s", serverID, networkType)) } return nil @@ -477,7 +477,7 @@ func nullIP(serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, "nulling server IP") + return parseErrorInfo(response.Body, fmt.Sprintf("nulling server %s IP %s", serverID, IP)) } return nil @@ -496,7 +496,7 @@ func unnullIP(serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, "unnulling server IP") + return parseErrorInfo(response.Body, fmt.Sprintf("unnulling server %s IP %s", serverID, IP)) } return nil @@ -523,7 +523,7 @@ func createDedicatedServerNotificationSetting(serverID string, notificationType defer response.Body.Close() if response.StatusCode != http.StatusCreated { - return nil, parseErrorInfo(response.Body, "creating server notification setting") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("creating server %s notification setting %s", serverID, notificationType)) } var createdNotificationSetting NotificationSetting @@ -549,7 +549,7 @@ func getDedicatedServerNotificationSetting(serverID string, notificationType str defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting server notification setting") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s notification setting %s", serverID, notificationType)) } var notificationSetting NotificationSetting @@ -582,7 +582,7 @@ func updateDedicatedServerNotificationSetting(serverID string, notificationType defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "updating server notification setting") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("updating server %s notification setting %s", serverID, notificationType)) } var updatedNotificationSetting NotificationSetting @@ -608,7 +608,7 @@ func deleteDedicatedServerNotificationSetting(serverID string, notificationType defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, "deleting server notification setting") + return parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s notification setting %s", serverID, notificationType)) } return nil @@ -635,7 +635,7 @@ func createDedicatedServerCredential(serverID string, credential *Credential) (* defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "creating server credential") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("creating server %s credential %s", serverID, credential.Type)) } var createdCredential Credential @@ -661,7 +661,7 @@ func getDedicatedServerCredential(serverID string, credentialType string, userna defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting server credential") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s credential %s", serverID, credentialType)) } var credential Credential @@ -698,7 +698,7 @@ func updateDedicatedServerCredential(serverID string, credential *Credential) (* defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "updating server credential") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("updating server %s credential %s", serverID, credential.Type)) } var updatedCredential Credential @@ -724,7 +724,7 @@ func deleteDedicatedServerCredential(serverID string, credential *Credential) er defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, "deleting server credential") + return parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s credential %s", serverID, credential.Type)) } return nil @@ -744,7 +744,7 @@ func getOperatingSystems() ([]OperatingSystem, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting operating systems") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting operating systems")) } var operatingSystems struct { @@ -781,7 +781,7 @@ func getControlPanels(operatingSystemID string) ([]ControlPanel, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting control panels") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting control panels")) } var controlPanels struct { @@ -817,7 +817,7 @@ func launchInstallationJob(serverID string, payload *Payload) (*Job, error) { defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - return nil, parseErrorInfo(response.Body, "launching installation job") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("launching installation job for server %s", serverID)) } var installationJob Job @@ -848,7 +848,7 @@ func getLatestInstallationJob(serverID string) (*Job, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting latest installation job") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting latest installation job for server %s", serverID)) } var jobs struct { @@ -877,7 +877,7 @@ func getJob(serverID string, jobUUID string) (*Job, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting job status") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting job status for server %s", serverID)) } var job Job @@ -922,7 +922,7 @@ func getServersBatch(offset int, limit int, site string) ([]Server, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, "getting servers list") + return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting servers list")) } var serverList struct { From 6791274eb60c4b93f25e74510289b89bea9a87fd Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Thu, 3 Nov 2022 17:27:07 +0100 Subject: [PATCH 03/18] BMA-5988 Pass context to all API client functions Preparation for logging --- leaseweb/api_client.go | 65 ++++++++++--------- ..._source_dedicated_server_control_panels.go | 2 +- ...urce_dedicated_server_operating_systems.go | 2 +- leaseweb/data_source_dedicated_servers.go | 2 +- leaseweb/resource_dedicated_server.go | 30 ++++----- .../resource_dedicated_server_credential.go | 8 +-- .../resource_dedicated_server_installation.go | 6 +- ...d_server_notification_setting_bandwidth.go | 8 +-- ...server_notification_setting_datatraffic.go | 8 +-- 9 files changed, 66 insertions(+), 65 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 0e97337a..54eb8627 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -2,6 +2,7 @@ package leaseweb import ( "bytes" + "context" "encoding/json" "fmt" "io" @@ -146,7 +147,7 @@ func parseErrorInfo(r io.Reader, ctx string) error { return &ei } -func getServer(serverID string) (*Server, error) { +func getServer(ctx context.Context, serverID string) (*Server, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID), nil) if err != nil { return nil, err @@ -175,7 +176,7 @@ func getServer(serverID string) (*Server, error) { return &server, nil } -func getServerIP(serverID string, ip string) (*IP, error) { +func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip), nil) if err != nil { return nil, err @@ -201,7 +202,7 @@ func getServerIP(serverID string, ip string) (*IP, error) { return &ipData, nil } -func getServerLease(serverID string) (*DHCPLease, error) { +func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID), nil) if err != nil { return nil, err @@ -227,7 +228,7 @@ func getServerLease(serverID string) (*DHCPLease, error) { return &dhcpLease, nil } -func getPowerInfo(serverID string) (*PowerInfo, error) { +func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerInfo", leasewebAPIURL, serverID), nil) if err != nil { return nil, err @@ -253,7 +254,7 @@ func getPowerInfo(serverID string) (*PowerInfo, error) { return &powerInfo, nil } -func getNetworkInterfaceInfo(serverID string, networkType string) (*NetworkInterfaceInfo, error) { +func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType string) (*NetworkInterfaceInfo, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s", leasewebAPIURL, serverID, networkType), nil) if err != nil { return nil, err @@ -279,7 +280,7 @@ func getNetworkInterfaceInfo(serverID string, networkType string) (*NetworkInter return &networkInterfaceInfo, nil } -func updateReference(serverID string, reference string) error { +func updateReference(ctx context.Context, serverID string, reference string) error { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { Reference string `json:"reference"` @@ -309,7 +310,7 @@ func updateReference(serverID string, reference string) error { return nil } -func updateReverseLookup(serverID string, ip string, reverseLookup string) error { +func updateReverseLookup(ctx context.Context, serverID string, ip string, reverseLookup string) error { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { ReverseLookup string `json:"reverseLookup"` @@ -339,7 +340,7 @@ func updateReverseLookup(serverID string, ip string, reverseLookup string) error return nil } -func powerOnServer(serverID string) error { +func powerOnServer(ctx context.Context, serverID string) error { request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOn", leasewebAPIURL, serverID), nil) if err != nil { return err @@ -358,7 +359,7 @@ func powerOnServer(serverID string) error { return nil } -func powerOffServer(serverID string) error { +func powerOffServer(ctx context.Context, serverID string) error { request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOff", leasewebAPIURL, serverID), nil) if err != nil { return err @@ -377,7 +378,7 @@ func powerOffServer(serverID string) error { return nil } -func addDHCPLease(serverID string, bootfile string) error { +func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { Bootfile string `json:"bootfile"` @@ -407,7 +408,7 @@ func addDHCPLease(serverID string, bootfile string) error { return nil } -func removeDHCPLease(serverID string) error { +func removeDHCPLease(ctx context.Context, serverID string) error { request, err := http.NewRequest("DELETE", fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID), nil) if err != nil { return err @@ -426,7 +427,7 @@ func removeDHCPLease(serverID string) error { return nil } -func openNetworkInterface(serverID string, networkType string) error { +func openNetworkInterface(ctx context.Context, serverID string, networkType string) error { request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/open", leasewebAPIURL, serverID, networkType), nil) if err != nil { return err @@ -445,7 +446,7 @@ func openNetworkInterface(serverID string, networkType string) error { return nil } -func closeNetworkInterface(serverID string, networkType string) error { +func closeNetworkInterface(ctx context.Context, serverID string, networkType string) error { request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/close", leasewebAPIURL, serverID, networkType), nil) if err != nil { return err @@ -464,7 +465,7 @@ func closeNetworkInterface(serverID string, networkType string) error { return nil } -func nullIP(serverID string, IP string) error { +func nullIP(ctx context.Context, serverID string, IP string) error { request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/null", leasewebAPIURL, serverID, IP), nil) if err != nil { return err @@ -483,7 +484,7 @@ func nullIP(serverID string, IP string) error { return nil } -func unnullIP(serverID string, IP string) error { +func unnullIP(ctx context.Context, serverID string, IP string) error { request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/unnull", leasewebAPIURL, serverID, IP), nil) if err != nil { return err @@ -502,7 +503,7 @@ func unnullIP(serverID string, IP string) error { return nil } -func createDedicatedServerNotificationSetting(serverID string, notificationType string, notificationSetting *NotificationSetting) (*NotificationSetting, error) { +func createDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSetting *NotificationSetting) (*NotificationSetting, error) { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(notificationSetting) if err != nil { @@ -535,7 +536,7 @@ func createDedicatedServerNotificationSetting(serverID string, notificationType return &createdNotificationSetting, nil } -func getDedicatedServerNotificationSetting(serverID string, notificationType string, notificationSettingID string) (*NotificationSetting, error) { +func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) (*NotificationSetting, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID), nil) if err != nil { return nil, err @@ -561,7 +562,7 @@ func getDedicatedServerNotificationSetting(serverID string, notificationType str return ¬ificationSetting, nil } -func updateDedicatedServerNotificationSetting(serverID string, notificationType string, notificationSettingID string, notificationSetting *NotificationSetting) (*NotificationSetting, error) { +func updateDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string, notificationSetting *NotificationSetting) (*NotificationSetting, error) { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(notificationSetting) if err != nil { @@ -594,7 +595,7 @@ func updateDedicatedServerNotificationSetting(serverID string, notificationType return &updatedNotificationSetting, nil } -func deleteDedicatedServerNotificationSetting(serverID string, notificationType string, notificationSettingID string) error { +func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) error { request, err := http.NewRequest("DELETE", fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID), nil) if err != nil { return err @@ -614,7 +615,7 @@ func deleteDedicatedServerNotificationSetting(serverID string, notificationType return nil } -func createDedicatedServerCredential(serverID string, credential *Credential) (*Credential, error) { +func createDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) (*Credential, error) { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(credential) if err != nil { @@ -647,7 +648,7 @@ func createDedicatedServerCredential(serverID string, credential *Credential) (* return &createdCredential, nil } -func getDedicatedServerCredential(serverID string, credentialType string, username string) (*Credential, error) { +func getDedicatedServerCredential(ctx context.Context, serverID string, credentialType string, username string) (*Credential, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credentialType, username), nil) if err != nil { return nil, err @@ -673,7 +674,7 @@ func getDedicatedServerCredential(serverID string, credentialType string, userna return &credential, nil } -func updateDedicatedServerCredential(serverID string, credential *Credential) (*Credential, error) { +func updateDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) (*Credential, error) { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { Password string `json:"password"` @@ -710,7 +711,7 @@ func updateDedicatedServerCredential(serverID string, credential *Credential) (* return &updatedCredential, nil } -func deleteDedicatedServerCredential(serverID string, credential *Credential) error { +func deleteDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) error { request, err := http.NewRequest("DELETE", fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username), nil) if err != nil { return err @@ -730,7 +731,7 @@ func deleteDedicatedServerCredential(serverID string, credential *Credential) er return nil } -func getOperatingSystems() ([]OperatingSystem, error) { +func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/operatingSystems", leasewebAPIURL), nil) if err != nil { return nil, err @@ -762,7 +763,7 @@ func getOperatingSystems() ([]OperatingSystem, error) { return operatingSystems.OperatingSystems, nil } -func getControlPanels(operatingSystemID string) ([]ControlPanel, error) { +func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlPanel, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/controlPanels", leasewebAPIURL), nil) if err != nil { return nil, err @@ -796,7 +797,7 @@ func getControlPanels(operatingSystemID string) ([]ControlPanel, error) { return controlPanels.ControlPanels, nil } -func launchInstallationJob(serverID string, payload *Payload) (*Job, error) { +func launchInstallationJob(ctx context.Context, serverID string, payload *Payload) (*Job, error) { requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(payload) if err != nil { @@ -830,7 +831,7 @@ func launchInstallationJob(serverID string, payload *Payload) (*Job, error) { return &installationJob, nil } -func getLatestInstallationJob(serverID string) (*Job, error) { +func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs", leasewebAPIURL, serverID), nil) if err != nil { return nil, err @@ -863,7 +864,7 @@ func getLatestInstallationJob(serverID string) (*Job, error) { return &jobs.Jobs[0], nil } -func getJob(serverID string, jobUUID string) (*Job, error) { +func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs/%s", leasewebAPIURL, serverID, jobUUID), nil) if err != nil { return nil, err @@ -890,7 +891,7 @@ func getJob(serverID string, jobUUID string) (*Job, error) { return &job, nil } -func getServersBatch(offset int, limit int, site string) ([]Server, error) { +func getServersBatch(ctx context.Context, offset int, limit int, site string) ([]Server, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers", leasewebAPIURL), nil) if err != nil { return nil, err @@ -937,12 +938,12 @@ func getServersBatch(offset int, limit int, site string) ([]Server, error) { return serverList.Servers, nil } -func getAllServers(site string) ([]Server, error) { +func getAllServers(ctx context.Context, site string) ([]Server, error) { var allServers []Server offset := 0 limit := 20 - serversBatch, err := getServersBatch(offset, limit, site) + serversBatch, err := getServersBatch(ctx, offset, limit, site) if err != nil { return nil, err } @@ -950,7 +951,7 @@ func getAllServers(site string) ([]Server, error) { for len(serversBatch) != 0 { offset += limit - serversBatch, err = getServersBatch(offset, limit, site) + serversBatch, err = getServersBatch(ctx, offset, limit, site) if err != nil { return nil, err } diff --git a/leaseweb/data_source_dedicated_server_control_panels.go b/leaseweb/data_source_dedicated_server_control_panels.go index bbe13fc2..aab8d49e 100644 --- a/leaseweb/data_source_dedicated_server_control_panels.go +++ b/leaseweb/data_source_dedicated_server_control_panels.go @@ -45,7 +45,7 @@ control panels available for installation on a dedicated server. func dataSourceDedicatedServerControlPanelsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { var diags diag.Diagnostics operatingSystemID := d.Get("operating_system_id").(string) - controlPanels, err := getControlPanels(operatingSystemID) + controlPanels, err := getControlPanels(ctx, operatingSystemID) if err != nil { return diag.FromErr(err) } diff --git a/leaseweb/data_source_dedicated_server_operating_systems.go b/leaseweb/data_source_dedicated_server_operating_systems.go index 025090cd..4e381cd8 100644 --- a/leaseweb/data_source_dedicated_server_operating_systems.go +++ b/leaseweb/data_source_dedicated_server_operating_systems.go @@ -40,7 +40,7 @@ operating systems available for installation on a dedicated server. func dataSourceDedicatedServerOperatingSystemsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { var diags diag.Diagnostics - operatingSystems, err := getOperatingSystems() + operatingSystems, err := getOperatingSystems(ctx) if err != nil { return diag.FromErr(err) } diff --git a/leaseweb/data_source_dedicated_servers.go b/leaseweb/data_source_dedicated_servers.go index 4a2bf160..0264d87f 100644 --- a/leaseweb/data_source_dedicated_servers.go +++ b/leaseweb/data_source_dedicated_servers.go @@ -38,7 +38,7 @@ func dataSourceDedicatedServersRead(ctx context.Context, d *schema.ResourceData, var diags diag.Diagnostics site := d.Get("site").(string) - servers, err := getAllServers(site) + servers, err := getAllServers(ctx, site) if err != nil { return diag.FromErr(err) } diff --git a/leaseweb/resource_dedicated_server.go b/leaseweb/resource_dedicated_server.go index 41b01ef5..214f3205 100644 --- a/leaseweb/resource_dedicated_server.go +++ b/leaseweb/resource_dedicated_server.go @@ -101,7 +101,7 @@ func resourceDedicatedServerRead(ctx context.Context, d *schema.ResourceData, m var diags diag.Diagnostics // get basic data - server, err := getServer(serverID) + server, err := getServer(ctx, serverID) if err != nil { return diag.FromErr(err) } @@ -117,7 +117,7 @@ func resourceDedicatedServerRead(ctx context.Context, d *schema.ResourceData, m }) // get IP data - ip, err := getServerIP(serverID, server.NetworkInterfaces.Public.IP) + ip, err := getServerIP(ctx, serverID, server.NetworkInterfaces.Public.IP) if err != nil { return diag.FromErr(err) } @@ -125,21 +125,21 @@ func resourceDedicatedServerRead(ctx context.Context, d *schema.ResourceData, m d.Set("public_ip_null_routed", ip.NullRouted) // get lease data - lease, err := getServerLease(serverID) + lease, err := getServerLease(ctx, serverID) if err != nil { return diag.FromErr(err) } d.Set("dhcp_lease", lease.GetBootfile()) // get power data - powerInfo, err := getPowerInfo(serverID) + powerInfo, err := getPowerInfo(ctx, serverID) if err != nil { return diag.FromErr(err) } d.Set("powered_on", powerInfo.IsPoweredOn()) // get public network interface data - publicNetworkInterfaceInfo, err := getNetworkInterfaceInfo(serverID, "public") + publicNetworkInterfaceInfo, err := getNetworkInterfaceInfo(ctx, serverID, "public") d.Set("public_network_interface_opened", publicNetworkInterfaceInfo.IsOpened()) return diags @@ -150,7 +150,7 @@ func resourceDedicatedServerUpdate(ctx context.Context, d *schema.ResourceData, if d.HasChange("reference") { reference := d.Get("reference").(string) - if err := updateReference(serverID, reference); err != nil { + if err := updateReference(ctx, serverID, reference); err != nil { return diag.FromErr(err) } @@ -161,7 +161,7 @@ func resourceDedicatedServerUpdate(ctx context.Context, d *schema.ResourceData, if d.HasChange("reverse_lookup") { publicIP := d.Get("public_ip").(string) reverseLookup := d.Get("reverse_lookup").(string) - if err := updateReverseLookup(serverID, publicIP, reverseLookup); err != nil { + if err := updateReverseLookup(ctx, serverID, publicIP, reverseLookup); err != nil { return diag.FromErr(err) } } @@ -169,11 +169,11 @@ func resourceDedicatedServerUpdate(ctx context.Context, d *schema.ResourceData, if d.HasChange("dhcp_lease") { bootFile := d.Get("dhcp_lease").(string) if bootFile != "" { - if err := addDHCPLease(serverID, bootFile); err != nil { + if err := addDHCPLease(ctx, serverID, bootFile); err != nil { return diag.FromErr(err) } } else { - if err := removeDHCPLease(serverID); err != nil { + if err := removeDHCPLease(ctx, serverID); err != nil { return diag.FromErr(err) } } @@ -181,11 +181,11 @@ func resourceDedicatedServerUpdate(ctx context.Context, d *schema.ResourceData, if d.HasChange("powered_on") { if d.Get("powered_on").(bool) { - if err := powerOnServer(serverID); err != nil { + if err := powerOnServer(ctx, serverID); err != nil { return diag.FromErr(err) } } else { - if err := powerOffServer(serverID); err != nil { + if err := powerOffServer(ctx, serverID); err != nil { return diag.FromErr(err) } } @@ -193,11 +193,11 @@ func resourceDedicatedServerUpdate(ctx context.Context, d *schema.ResourceData, if d.HasChange("public_network_interface_opened") { if d.Get("public_network_interface_opened").(bool) { - if err := openNetworkInterface(serverID, "public"); err != nil { + if err := openNetworkInterface(ctx, serverID, "public"); err != nil { return diag.FromErr(err) } } else { - if err := closeNetworkInterface(serverID, "public"); err != nil { + if err := closeNetworkInterface(ctx, serverID, "public"); err != nil { return diag.FromErr(err) } } @@ -206,11 +206,11 @@ func resourceDedicatedServerUpdate(ctx context.Context, d *schema.ResourceData, if d.HasChange("public_ip_null_routed") { publicIP := d.Get("public_ip").(string) if d.Get("public_ip_null_routed").(bool) { - if err := nullIP(serverID, publicIP); err != nil { + if err := nullIP(ctx, serverID, publicIP); err != nil { return diag.FromErr(err) } } else { - if err := unnullIP(serverID, publicIP); err != nil { + if err := unnullIP(ctx, serverID, publicIP); err != nil { return diag.FromErr(err) } } diff --git a/leaseweb/resource_dedicated_server_credential.go b/leaseweb/resource_dedicated_server_credential.go index 74343916..75b31bfe 100644 --- a/leaseweb/resource_dedicated_server_credential.go +++ b/leaseweb/resource_dedicated_server_credential.go @@ -77,7 +77,7 @@ func resourceDedicatedServerCredentialCreate(ctx context.Context, d *schema.Reso Password: d.Get("password").(string), } - createdCredential, err := createDedicatedServerCredential(serverID, &credential) + createdCredential, err := createDedicatedServerCredential(ctx, serverID, &credential) if err != nil { return diag.FromErr(err) } @@ -94,7 +94,7 @@ func resourceDedicatedServerCredentialRead(ctx context.Context, d *schema.Resour var diags diag.Diagnostics - credential, err := getDedicatedServerCredential(serverID, credentialType, username) + credential, err := getDedicatedServerCredential(ctx, serverID, credentialType, username) if err != nil { return diag.FromErr(err) } @@ -113,7 +113,7 @@ func resourceDedicatedServerCredentialUpdate(ctx context.Context, d *schema.Reso Password: d.Get("password").(string), } - if _, err := updateDedicatedServerCredential(serverID, &credential); err != nil { + if _, err := updateDedicatedServerCredential(ctx, serverID, &credential); err != nil { return diag.FromErr(err) } @@ -131,7 +131,7 @@ func resourceDedicatedServerCredentialDelete(ctx context.Context, d *schema.Reso Password: d.Get("password").(string), } - if err := deleteDedicatedServerCredential(serverID, &credential); err != nil { + if err := deleteDedicatedServerCredential(ctx, serverID, &credential); err != nil { return diag.FromErr(err) } diff --git a/leaseweb/resource_dedicated_server_installation.go b/leaseweb/resource_dedicated_server_installation.go index 957c236b..ef94e9bd 100644 --- a/leaseweb/resource_dedicated_server_installation.go +++ b/leaseweb/resource_dedicated_server_installation.go @@ -254,7 +254,7 @@ func resourceDedicatedServerInstallationCreate(ctx context.Context, d *schema.Re payload["partitions"] = partitions } - installationJob, err := launchInstallationJob(serverID, &payload) + installationJob, err := launchInstallationJob(ctx, serverID, &payload) if err != nil { return diag.FromErr(err) } @@ -266,7 +266,7 @@ func resourceDedicatedServerInstallationCreate(ctx context.Context, d *schema.Re Pending: []string{"ACTIVE"}, Target: []string{"FINISHED"}, Refresh: func() (interface{}, string, error) { - job, err := getJob(serverID, installationJob.UUID) + job, err := getJob(ctx, serverID, installationJob.UUID) if err != nil { return nil, "error", err } @@ -288,7 +288,7 @@ func resourceDedicatedServerInstallationRead(ctx context.Context, d *schema.Reso var diags diag.Diagnostics - installationJob, err := getLatestInstallationJob(serverID) + installationJob, err := getLatestInstallationJob(ctx, serverID) if err != nil { return diag.FromErr(err) } diff --git a/leaseweb/resource_dedicated_server_notification_setting_bandwidth.go b/leaseweb/resource_dedicated_server_notification_setting_bandwidth.go index a5551519..1a104ede 100644 --- a/leaseweb/resource_dedicated_server_notification_setting_bandwidth.go +++ b/leaseweb/resource_dedicated_server_notification_setting_bandwidth.go @@ -83,7 +83,7 @@ func resourceDedicatedServerNotificationSettingBandwidthCreate(ctx context.Conte Unit: d.Get("unit").(string), } - createdNotificationSetting, err := createDedicatedServerNotificationSetting(serverID, "bandwidth", ¬ificationSetting) + createdNotificationSetting, err := createDedicatedServerNotificationSetting(ctx, serverID, "bandwidth", ¬ificationSetting) if err != nil { return diag.FromErr(err) } @@ -99,7 +99,7 @@ func resourceDedicatedServerNotificationSettingBandwidthRead(ctx context.Context var diags diag.Diagnostics - notificationSetting, err := getDedicatedServerNotificationSetting(serverID, "bandwidth", notificationSettingID) + notificationSetting, err := getDedicatedServerNotificationSetting(ctx, serverID, "bandwidth", notificationSettingID) if err != nil { return diag.FromErr(err) } @@ -120,7 +120,7 @@ func resourceDedicatedServerNotificationSettingBandwidthUpdate(ctx context.Conte Unit: d.Get("unit").(string), } - if _, err := updateDedicatedServerNotificationSetting(serverID, "bandwidth", notificationSettingID, ¬ificationSetting); err != nil { + if _, err := updateDedicatedServerNotificationSetting(ctx, serverID, "bandwidth", notificationSettingID, ¬ificationSetting); err != nil { return diag.FromErr(err) } @@ -133,7 +133,7 @@ func resourceDedicatedServerNotificationSettingBandwidthDelete(ctx context.Conte serverID := d.Get("dedicated_server_id").(string) notificationSettingID := d.Get("id").(string) - if err := deleteDedicatedServerNotificationSetting(serverID, "bandwidth", notificationSettingID); err != nil { + if err := deleteDedicatedServerNotificationSetting(ctx, serverID, "bandwidth", notificationSettingID); err != nil { return diag.FromErr(err) } diff --git a/leaseweb/resource_dedicated_server_notification_setting_datatraffic.go b/leaseweb/resource_dedicated_server_notification_setting_datatraffic.go index 0e3c8a7d..8b507d00 100644 --- a/leaseweb/resource_dedicated_server_notification_setting_datatraffic.go +++ b/leaseweb/resource_dedicated_server_notification_setting_datatraffic.go @@ -83,7 +83,7 @@ func resourceDedicatedServerNotificationSettingDatatrafficCreate(ctx context.Con Unit: d.Get("unit").(string), } - createdNotificationSetting, err := createDedicatedServerNotificationSetting(serverID, "datatraffic", ¬ificationSetting) + createdNotificationSetting, err := createDedicatedServerNotificationSetting(ctx, serverID, "datatraffic", ¬ificationSetting) if err != nil { return diag.FromErr(err) } @@ -99,7 +99,7 @@ func resourceDedicatedServerNotificationSettingDatatrafficRead(ctx context.Conte var diags diag.Diagnostics - notificationSetting, err := getDedicatedServerNotificationSetting(serverID, "datatraffic", notificationSettingID) + notificationSetting, err := getDedicatedServerNotificationSetting(ctx, serverID, "datatraffic", notificationSettingID) if err != nil { return diag.FromErr(err) } @@ -120,7 +120,7 @@ func resourceDedicatedServerNotificationSettingDatatrafficUpdate(ctx context.Con Unit: d.Get("unit").(string), } - if _, err := updateDedicatedServerNotificationSetting(serverID, "datatraffic", notificationSettingID, ¬ificationSetting); err != nil { + if _, err := updateDedicatedServerNotificationSetting(ctx, serverID, "datatraffic", notificationSettingID, ¬ificationSetting); err != nil { return diag.FromErr(err) } @@ -133,7 +133,7 @@ func resourceDedicatedServerNotificationSettingDatatrafficDelete(ctx context.Con serverID := d.Get("dedicated_server_id").(string) notificationSettingID := d.Get("id").(string) - if err := deleteDedicatedServerNotificationSetting(serverID, "datatraffic", notificationSettingID); err != nil { + if err := deleteDedicatedServerNotificationSetting(ctx, serverID, "datatraffic", notificationSettingID); err != nil { return diag.FromErr(err) } From 43655fb5c7e6e6743c7d8f91513a17dcf30368a8 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Fri, 4 Nov 2022 09:20:46 +0100 Subject: [PATCH 04/18] BMA-5988 Extract API URL and method to variables Preparation for logging --- leaseweb/api_client.go | 145 ++++++++++++++++++++++++++++++++--------- 1 file changed, 116 insertions(+), 29 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 54eb8627..2bd9c467 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -148,7 +148,10 @@ func parseErrorInfo(r io.Reader, ctx string) error { } func getServer(ctx context.Context, serverID string) (*Server, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -177,7 +180,10 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { } func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -203,7 +209,10 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { } func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -229,7 +238,10 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { } func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerInfo", leasewebAPIURL, serverID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerInfo", leasewebAPIURL, serverID) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -255,7 +267,10 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { } func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType string) (*NetworkInterfaceInfo, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s", leasewebAPIURL, serverID, networkType), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s", leasewebAPIURL, serverID, networkType) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -291,7 +306,10 @@ func updateReference(ctx context.Context, serverID string, reference string) err return err } - request, err := http.NewRequest("PUT", fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) + method := "PUT" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return err } @@ -321,7 +339,10 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers return err } - request, err := http.NewRequest("PUT", fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) + method := "PUT" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return err } @@ -341,7 +362,10 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers } func powerOnServer(ctx context.Context, serverID string) error { - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOn", leasewebAPIURL, serverID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOn", leasewebAPIURL, serverID) + method := "POST" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -360,7 +384,10 @@ func powerOnServer(ctx context.Context, serverID string) error { } func powerOffServer(ctx context.Context, serverID string) error { - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOff", leasewebAPIURL, serverID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOff", leasewebAPIURL, serverID) + method := "POST" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -389,7 +416,10 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { return err } - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) + method := "POST" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return err } @@ -409,7 +439,10 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { } func removeDHCPLease(ctx context.Context, serverID string) error { - request, err := http.NewRequest("DELETE", fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) + method := "DELETE" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -428,7 +461,10 @@ func removeDHCPLease(ctx context.Context, serverID string) error { } func openNetworkInterface(ctx context.Context, serverID string, networkType string) error { - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/open", leasewebAPIURL, serverID, networkType), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/open", leasewebAPIURL, serverID, networkType) + method := "POST" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -447,7 +483,10 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri } func closeNetworkInterface(ctx context.Context, serverID string, networkType string) error { - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/close", leasewebAPIURL, serverID, networkType), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/close", leasewebAPIURL, serverID, networkType) + method := "POST" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -466,7 +505,10 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str } func nullIP(ctx context.Context, serverID string, IP string) error { - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/null", leasewebAPIURL, serverID, IP), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/null", leasewebAPIURL, serverID, IP) + method := "POST" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -485,7 +527,10 @@ func nullIP(ctx context.Context, serverID string, IP string) error { } func unnullIP(ctx context.Context, serverID string, IP string) error { - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/unnull", leasewebAPIURL, serverID, IP), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/unnull", leasewebAPIURL, serverID, IP) + method := "POST" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -510,7 +555,10 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri return nil, err } - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s", leasewebAPIURL, serverID, notificationType), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s", leasewebAPIURL, serverID, notificationType) + method := "POST" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return nil, err } @@ -537,7 +585,10 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri } func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) (*NotificationSetting, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -569,7 +620,10 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri return nil, err } - request, err := http.NewRequest("PUT", fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) + method := "PUT" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return nil, err } @@ -596,7 +650,10 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri } func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) error { - request, err := http.NewRequest("DELETE", fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) + method := "DELETE" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -622,7 +679,10 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede return nil, err } - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials", leasewebAPIURL, serverID), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials", leasewebAPIURL, serverID) + method := "POST" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return nil, err } @@ -649,7 +709,10 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede } func getDedicatedServerCredential(ctx context.Context, serverID string, credentialType string, username string) (*Credential, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credentialType, username), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credentialType, username) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -685,7 +748,10 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede return nil, err } - request, err := http.NewRequest("PUT", fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) + method := "PUT" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return nil, err } @@ -712,7 +778,10 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede } func deleteDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) error { - request, err := http.NewRequest("DELETE", fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) + method := "DELETE" + + request, err := http.NewRequest(method, url, nil) if err != nil { return err } @@ -732,7 +801,10 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede } func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/operatingSystems", leasewebAPIURL), nil) + url := fmt.Sprintf("%s/bareMetals/v2/operatingSystems", leasewebAPIURL) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -764,7 +836,10 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { } func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlPanel, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/controlPanels", leasewebAPIURL), nil) + url := fmt.Sprintf("%s/bareMetals/v2/controlPanels", leasewebAPIURL) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -804,7 +879,10 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa return nil, err } - request, err := http.NewRequest("POST", fmt.Sprintf("%s/bareMetals/v2/servers/%s/install", leasewebAPIURL, serverID), requestBody) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/install", leasewebAPIURL, serverID) + method := "POST" + + request, err := http.NewRequest(method, url, requestBody) if err != nil { return nil, err } @@ -832,7 +910,10 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa } func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs", leasewebAPIURL, serverID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs", leasewebAPIURL, serverID) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -865,7 +946,10 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error } func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs/%s", leasewebAPIURL, serverID, jobUUID), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs/%s", leasewebAPIURL, serverID, jobUUID) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } @@ -892,7 +976,10 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) } func getServersBatch(ctx context.Context, offset int, limit int, site string) ([]Server, error) { - request, err := http.NewRequest("GET", fmt.Sprintf("%s/bareMetals/v2/servers", leasewebAPIURL), nil) + url := fmt.Sprintf("%s/bareMetals/v2/servers", leasewebAPIURL) + method := "GET" + + request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } From 9ffefd9a4f098844238ccd762f68e4ed3e506872 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Fri, 4 Nov 2022 10:16:45 +0100 Subject: [PATCH 05/18] BMA-5998 Add logging of API requests --- leaseweb/api_client.go | 70 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 2bd9c467..fe6d5e88 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -9,6 +9,8 @@ import ( "net/http" "strconv" "strings" + + "github.com/hashicorp/terraform-plugin-log/tflog" ) var ( @@ -147,6 +149,16 @@ func parseErrorInfo(r io.Reader, ctx string) error { return &ei } +func logAPIRequest(ctx context.Context, method, url string) { + tflog.Trace( + ctx, + "executing API request", + map[string]interface{}{ + "url": url, + "method": method, + }) +} + func getServer(ctx context.Context, serverID string) (*Server, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) method := "GET" @@ -157,6 +169,8 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -189,6 +203,8 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -218,6 +234,8 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -247,6 +265,8 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -276,6 +296,8 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -316,6 +338,8 @@ func updateReference(ctx context.Context, serverID string, reference string) err request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -349,6 +373,8 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -371,6 +397,8 @@ func powerOnServer(ctx context.Context, serverID string) error { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -393,6 +421,8 @@ func powerOffServer(ctx context.Context, serverID string) error { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -426,6 +456,8 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -448,6 +480,8 @@ func removeDHCPLease(ctx context.Context, serverID string) error { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -470,6 +504,8 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -492,6 +528,8 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -514,6 +552,8 @@ func nullIP(ctx context.Context, serverID string, IP string) error { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -536,6 +576,8 @@ func unnullIP(ctx context.Context, serverID string, IP string) error { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -565,6 +607,8 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -594,6 +638,8 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -630,6 +676,8 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -659,6 +707,8 @@ func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID stri } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -689,6 +739,8 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -718,6 +770,8 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -758,6 +812,8 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -787,6 +843,8 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return err @@ -810,6 +868,8 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -850,6 +910,8 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP request.URL.RawQuery = q.Encode() } + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -889,6 +951,8 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -923,6 +987,8 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error q.Add("type", "install") request.URL.RawQuery = q.Encode() + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -955,6 +1021,8 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err @@ -1003,6 +1071,8 @@ func getServersBatch(ctx context.Context, offset int, limit int, site string) ([ request.URL.RawQuery = q.Encode() } + logAPIRequest(ctx, method, url) + response, err := leasewebClient.Do(request) if err != nil { return nil, err From 79c3355c64d46601bb385c7a779b6cfe62c83a02 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Fri, 4 Nov 2022 12:12:39 +0100 Subject: [PATCH 06/18] BMA-5998 Add logging of API requests error --- leaseweb/api_client.go | 133 ++++++++++++++++++++++++++++++++--------- 1 file changed, 104 insertions(+), 29 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index fe6d5e88..cc99a1b9 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -159,6 +159,23 @@ func logAPIRequest(ctx context.Context, method, url string) { }) } +func logAPIError(ctx context.Context, method, url string, e error) { + fields := map[string]interface{}{ + "url": url, + "method": method, + } + + if ei, ok := e.(*ErrorInfo); ok { + fields["context"] = ei.Context + fields["code"] = ei.Code + fields["message"] = ei.Message + } else { + fields["message"] = e.Error() + } + + tflog.Error(ctx, "API request error", fields) +} + func getServer(ctx context.Context, serverID string) (*Server, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) method := "GET" @@ -178,7 +195,9 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s", serverID)) + logAPIError(ctx, method, url, e) + return nil, e } var server Server @@ -212,7 +231,9 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s IP %s", serverID, ip)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s IP %s", serverID, ip)) + logAPIError(ctx, method, url, e) + return nil, e } var ipData IP @@ -243,7 +264,9 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s lease", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s lease", serverID)) + logAPIError(ctx, method, url, e) + return nil, e } var dhcpLease DHCPLease @@ -274,7 +297,9 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s power info", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s power info", serverID)) + logAPIError(ctx, method, url, e) + return nil, e } var powerInfo PowerInfo @@ -305,7 +330,9 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server network interface info")) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting server network interface info")) + logAPIError(ctx, method, url, e) + return nil, e } var networkInterfaceInfo NetworkInterfaceInfo @@ -346,7 +373,9 @@ func updateReference(ctx context.Context, serverID string, reference string) err } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reference", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reference", serverID)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -381,7 +410,9 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers } if response.StatusCode != http.StatusOK { - return parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip)) + e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -405,7 +436,9 @@ func powerOnServer(ctx context.Context, serverID string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, fmt.Sprintf("powering on server %s", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("powering on server %s", serverID)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -429,7 +462,9 @@ func powerOffServer(ctx context.Context, serverID string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, fmt.Sprintf("powering off server %s", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("powering off server %s", serverID)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -464,7 +499,9 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, fmt.Sprintf("adding server %s lease", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("adding server %s lease", serverID)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -488,7 +525,9 @@ func removeDHCPLease(ctx context.Context, serverID string) error { } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, fmt.Sprintf("removing server %s lease", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("removing server %s lease", serverID)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -512,7 +551,9 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, fmt.Sprintf("opening server %s network interface %s", serverID, networkType)) + e := parseErrorInfo(response.Body, fmt.Sprintf("opening server %s network interface %s", serverID, networkType)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -536,7 +577,9 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str } if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, fmt.Sprintf("closing server %s network interface %s", serverID, networkType)) + e := parseErrorInfo(response.Body, fmt.Sprintf("closing server %s network interface %s", serverID, networkType)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -560,7 +603,9 @@ func nullIP(ctx context.Context, serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, fmt.Sprintf("nulling server %s IP %s", serverID, IP)) + e := parseErrorInfo(response.Body, fmt.Sprintf("nulling server %s IP %s", serverID, IP)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -584,7 +629,9 @@ func unnullIP(ctx context.Context, serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - return parseErrorInfo(response.Body, fmt.Sprintf("unnulling server %s IP %s", serverID, IP)) + e := parseErrorInfo(response.Body, fmt.Sprintf("unnulling server %s IP %s", serverID, IP)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -616,7 +663,9 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusCreated { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("creating server %s notification setting %s", serverID, notificationType)) + e := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, e) + return nil, e } var createdNotificationSetting NotificationSetting @@ -647,7 +696,9 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s notification setting %s", serverID, notificationType)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, e) + return nil, e } var notificationSetting NotificationSetting @@ -685,7 +736,9 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("updating server %s notification setting %s", serverID, notificationType)) + e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, e) + return nil, e } var updatedNotificationSetting NotificationSetting @@ -716,7 +769,9 @@ func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s notification setting %s", serverID, notificationType)) + e := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -748,7 +803,9 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("creating server %s credential %s", serverID, credential.Type)) + e := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s credential %s", serverID, credential.Type)) + logAPIError(ctx, method, url, e) + return nil, e } var createdCredential Credential @@ -779,7 +836,9 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting server %s credential %s", serverID, credentialType)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s credential %s", serverID, credentialType)) + logAPIError(ctx, method, url, e) + return nil, e } var credential Credential @@ -821,7 +880,9 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("updating server %s credential %s", serverID, credential.Type)) + e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s credential %s", serverID, credential.Type)) + logAPIError(ctx, method, url, e) + return nil, e } var updatedCredential Credential @@ -852,7 +913,9 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - return parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s credential %s", serverID, credential.Type)) + e := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s credential %s", serverID, credential.Type)) + logAPIError(ctx, method, url, e) + return e } return nil @@ -877,7 +940,9 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting operating systems")) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting operating systems")) + logAPIError(ctx, method, url, e) + return nil, e } var operatingSystems struct { @@ -919,7 +984,9 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting control panels")) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting control panels")) + logAPIError(ctx, method, url, e) + return nil, e } var controlPanels struct { @@ -960,7 +1027,9 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("launching installation job for server %s", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("launching installation job for server %s", serverID)) + logAPIError(ctx, method, url, e) + return nil, e } var installationJob Job @@ -996,7 +1065,9 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting latest installation job for server %s", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting latest installation job for server %s", serverID)) + logAPIError(ctx, method, url, e) + return nil, e } var jobs struct { @@ -1030,7 +1101,9 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting job status for server %s", serverID)) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting job status for server %s", serverID)) + logAPIError(ctx, method, url, e) + return nil, e } var job Job @@ -1080,7 +1153,9 @@ func getServersBatch(ctx context.Context, offset int, limit int, site string) ([ defer response.Body.Close() if response.StatusCode != http.StatusOK { - return nil, parseErrorInfo(response.Body, fmt.Sprintf("getting servers list")) + e := parseErrorInfo(response.Body, fmt.Sprintf("getting servers list")) + logAPIError(ctx, method, url, e) + return nil, e } var serverList struct { From 4b40408044463557ed38b6ec1a5d8ffbbc116b3d Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Fri, 4 Nov 2022 12:23:14 +0100 Subject: [PATCH 07/18] BMA-5998 Add error details in API request error logging --- leaseweb/api_client.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index cc99a1b9..12633085 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -129,8 +129,9 @@ type Job struct { // ErrorInfo - type ErrorInfo struct { Context string - Code string `json:"errorCode"` - Message string `json:"errorMessage"` + Code string `json:"errorCode"` + Message string `json:"errorMessage"` + Details map[string][]string `json:"errorDetails"` } func (ei *ErrorInfo) Error() string { @@ -169,6 +170,12 @@ func logAPIError(ctx context.Context, method, url string, e error) { fields["context"] = ei.Context fields["code"] = ei.Code fields["message"] = ei.Message + + if len(ei.Details) != 0 { + for field, details := range ei.Details { + fields["detail_"+field] = details + } + } } else { fields["message"] = e.Error() } From 06351fe458faff5848ce97be8a2308f427dc7177 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Fri, 4 Nov 2022 12:27:42 +0100 Subject: [PATCH 08/18] BMA-5998 Add correlation ID in API request error logging --- leaseweb/api_client.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 12633085..e4ec9589 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -128,10 +128,11 @@ type Job struct { // ErrorInfo - type ErrorInfo struct { - Context string - Code string `json:"errorCode"` - Message string `json:"errorMessage"` - Details map[string][]string `json:"errorDetails"` + Context string + CorrelationID string `json:"correlationId"` + Code string `json:"errorCode"` + Message string `json:"errorMessage"` + Details map[string][]string `json:"errorDetails"` } func (ei *ErrorInfo) Error() string { @@ -170,6 +171,7 @@ func logAPIError(ctx context.Context, method, url string, e error) { fields["context"] = ei.Context fields["code"] = ei.Code fields["message"] = ei.Message + fields["correlation_id"] = ei.CorrelationID if len(ei.Details) != 0 { for field, details := range ei.Details { From d28dd801672e3e22d96560d8efb9a2949a9e789c Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Fri, 4 Nov 2022 16:37:45 +0100 Subject: [PATCH 09/18] BMA-5988 Fix confusing error variables name --- leaseweb/api_client.go | 202 ++++++++++++++++++++--------------------- 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index e4ec9589..fd2737be 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -135,20 +135,20 @@ type ErrorInfo struct { Details map[string][]string `json:"errorDetails"` } -func (ei *ErrorInfo) Error() string { - return "(" + ei.Code + ") " + ei.Context + ": " + ei.Message +func (erri *ErrorInfo) Error() string { + return "(" + erri.Code + ") " + erri.Context + ": " + erri.Message } func parseErrorInfo(r io.Reader, ctx string) error { - ei := ErrorInfo{ + erri := ErrorInfo{ Context: ctx, } - if err := json.NewDecoder(r).Decode(&ei); err != nil { + if err := json.NewDecoder(r).Decode(&erri); err != nil { return err } - return &ei + return &erri } func logAPIRequest(ctx context.Context, method, url string) { @@ -161,25 +161,25 @@ func logAPIRequest(ctx context.Context, method, url string) { }) } -func logAPIError(ctx context.Context, method, url string, e error) { +func logAPIError(ctx context.Context, method, url string, err error) { fields := map[string]interface{}{ "url": url, "method": method, } - if ei, ok := e.(*ErrorInfo); ok { - fields["context"] = ei.Context - fields["code"] = ei.Code - fields["message"] = ei.Message - fields["correlation_id"] = ei.CorrelationID + if erri, ok := err.(*ErrorInfo); ok { + fields["context"] = erri.Context + fields["code"] = erri.Code + fields["message"] = erri.Message + fields["correlation_id"] = erri.CorrelationID - if len(ei.Details) != 0 { - for field, details := range ei.Details { + if len(erri.Details) != 0 { + for field, details := range erri.Details { fields["detail_"+field] = details } } } else { - fields["message"] = e.Error() + fields["message"] = err.Error() } tflog.Error(ctx, "API request error", fields) @@ -204,9 +204,9 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s", serverID)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s", serverID)) + logAPIError(ctx, method, url, err) + return nil, err } var server Server @@ -240,9 +240,9 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s IP %s", serverID, ip)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s IP %s", serverID, ip)) + logAPIError(ctx, method, url, err) + return nil, err } var ipData IP @@ -273,9 +273,9 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s lease", serverID)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s lease", serverID)) + logAPIError(ctx, method, url, err) + return nil, err } var dhcpLease DHCPLease @@ -306,9 +306,9 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s power info", serverID)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s power info", serverID)) + logAPIError(ctx, method, url, err) + return nil, err } var powerInfo PowerInfo @@ -339,9 +339,9 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting server network interface info")) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting server network interface info")) + logAPIError(ctx, method, url, err) + return nil, err } var networkInterfaceInfo NetworkInterfaceInfo @@ -382,9 +382,9 @@ func updateReference(ctx context.Context, serverID string, reference string) err } if response.StatusCode != http.StatusNoContent { - e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reference", serverID)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reference", serverID)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -419,9 +419,9 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers } if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -445,9 +445,9 @@ func powerOnServer(ctx context.Context, serverID string) error { } if response.StatusCode != http.StatusAccepted { - e := parseErrorInfo(response.Body, fmt.Sprintf("powering on server %s", serverID)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("powering on server %s", serverID)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -471,9 +471,9 @@ func powerOffServer(ctx context.Context, serverID string) error { } if response.StatusCode != http.StatusAccepted { - e := parseErrorInfo(response.Body, fmt.Sprintf("powering off server %s", serverID)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("powering off server %s", serverID)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -508,9 +508,9 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { } if response.StatusCode != http.StatusNoContent { - e := parseErrorInfo(response.Body, fmt.Sprintf("adding server %s lease", serverID)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("adding server %s lease", serverID)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -534,9 +534,9 @@ func removeDHCPLease(ctx context.Context, serverID string) error { } if response.StatusCode != http.StatusNoContent { - e := parseErrorInfo(response.Body, fmt.Sprintf("removing server %s lease", serverID)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("removing server %s lease", serverID)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -560,9 +560,9 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri } if response.StatusCode != http.StatusNoContent { - e := parseErrorInfo(response.Body, fmt.Sprintf("opening server %s network interface %s", serverID, networkType)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("opening server %s network interface %s", serverID, networkType)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -586,9 +586,9 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str } if response.StatusCode != http.StatusNoContent { - e := parseErrorInfo(response.Body, fmt.Sprintf("closing server %s network interface %s", serverID, networkType)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("closing server %s network interface %s", serverID, networkType)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -612,9 +612,9 @@ func nullIP(ctx context.Context, serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - e := parseErrorInfo(response.Body, fmt.Sprintf("nulling server %s IP %s", serverID, IP)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("nulling server %s IP %s", serverID, IP)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -638,9 +638,9 @@ func unnullIP(ctx context.Context, serverID string, IP string) error { } if response.StatusCode != http.StatusAccepted { - e := parseErrorInfo(response.Body, fmt.Sprintf("unnulling server %s IP %s", serverID, IP)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("unnulling server %s IP %s", serverID, IP)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -672,9 +672,9 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusCreated { - e := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s notification setting %s", serverID, notificationType)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, err) + return nil, err } var createdNotificationSetting NotificationSetting @@ -705,9 +705,9 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s notification setting %s", serverID, notificationType)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, err) + return nil, err } var notificationSetting NotificationSetting @@ -745,9 +745,9 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s notification setting %s", serverID, notificationType)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, err) + return nil, err } var updatedNotificationSetting NotificationSetting @@ -778,9 +778,9 @@ func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - e := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s notification setting %s", serverID, notificationType)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s notification setting %s", serverID, notificationType)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -812,9 +812,9 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s credential %s", serverID, credential.Type)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s credential %s", serverID, credential.Type)) + logAPIError(ctx, method, url, err) + return nil, err } var createdCredential Credential @@ -845,9 +845,9 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s credential %s", serverID, credentialType)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s credential %s", serverID, credentialType)) + logAPIError(ctx, method, url, err) + return nil, err } var credential Credential @@ -889,9 +889,9 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s credential %s", serverID, credential.Type)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s credential %s", serverID, credential.Type)) + logAPIError(ctx, method, url, err) + return nil, err } var updatedCredential Credential @@ -922,9 +922,9 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - e := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s credential %s", serverID, credential.Type)) - logAPIError(ctx, method, url, e) - return e + err := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s credential %s", serverID, credential.Type)) + logAPIError(ctx, method, url, err) + return err } return nil @@ -949,9 +949,9 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting operating systems")) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting operating systems")) + logAPIError(ctx, method, url, err) + return nil, err } var operatingSystems struct { @@ -993,9 +993,9 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting control panels")) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting control panels")) + logAPIError(ctx, method, url, err) + return nil, err } var controlPanels struct { @@ -1036,9 +1036,9 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - e := parseErrorInfo(response.Body, fmt.Sprintf("launching installation job for server %s", serverID)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("launching installation job for server %s", serverID)) + logAPIError(ctx, method, url, err) + return nil, err } var installationJob Job @@ -1074,9 +1074,9 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting latest installation job for server %s", serverID)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting latest installation job for server %s", serverID)) + logAPIError(ctx, method, url, err) + return nil, err } var jobs struct { @@ -1110,9 +1110,9 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting job status for server %s", serverID)) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting job status for server %s", serverID)) + logAPIError(ctx, method, url, err) + return nil, err } var job Job @@ -1162,9 +1162,9 @@ func getServersBatch(ctx context.Context, offset int, limit int, site string) ([ defer response.Body.Close() if response.StatusCode != http.StatusOK { - e := parseErrorInfo(response.Body, fmt.Sprintf("getting servers list")) - logAPIError(ctx, method, url, e) - return nil, e + err := parseErrorInfo(response.Body, fmt.Sprintf("getting servers list")) + logAPIError(ctx, method, url, err) + return nil, err } var serverList struct { From 543aa6f78f055fa344d9a2ab0bd32df48aee009a Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Mon, 14 Nov 2022 13:38:31 +0100 Subject: [PATCH 10/18] BMA-5998 Use http method constants --- leaseweb/api_client.go | 58 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index fd2737be..82f32a39 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -187,7 +187,7 @@ func logAPIError(ctx context.Context, method, url string, err error) { func getServer(ctx context.Context, serverID string) (*Server, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -223,7 +223,7 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -256,7 +256,7 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -289,7 +289,7 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerInfo", leasewebAPIURL, serverID) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -322,7 +322,7 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType string) (*NetworkInterfaceInfo, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s", leasewebAPIURL, serverID, networkType) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -365,7 +365,7 @@ func updateReference(ctx context.Context, serverID string, reference string) err } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) - method := "PUT" + method := http.MethodPut request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -402,7 +402,7 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) - method := "PUT" + method := http.MethodPut request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -429,7 +429,7 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers func powerOnServer(ctx context.Context, serverID string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOn", leasewebAPIURL, serverID) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, nil) if err != nil { @@ -455,7 +455,7 @@ func powerOnServer(ctx context.Context, serverID string) error { func powerOffServer(ctx context.Context, serverID string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOff", leasewebAPIURL, serverID) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, nil) if err != nil { @@ -491,7 +491,7 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -518,7 +518,7 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { func removeDHCPLease(ctx context.Context, serverID string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) - method := "DELETE" + method := http.MethodDelete request, err := http.NewRequest(method, url, nil) if err != nil { @@ -544,7 +544,7 @@ func removeDHCPLease(ctx context.Context, serverID string) error { func openNetworkInterface(ctx context.Context, serverID string, networkType string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/open", leasewebAPIURL, serverID, networkType) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, nil) if err != nil { @@ -570,7 +570,7 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri func closeNetworkInterface(ctx context.Context, serverID string, networkType string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/close", leasewebAPIURL, serverID, networkType) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, nil) if err != nil { @@ -596,7 +596,7 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str func nullIP(ctx context.Context, serverID string, IP string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/null", leasewebAPIURL, serverID, IP) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, nil) if err != nil { @@ -622,7 +622,7 @@ func nullIP(ctx context.Context, serverID string, IP string) error { func unnullIP(ctx context.Context, serverID string, IP string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/unnull", leasewebAPIURL, serverID, IP) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, nil) if err != nil { @@ -654,7 +654,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s", leasewebAPIURL, serverID, notificationType) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -688,7 +688,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) (*NotificationSetting, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -727,7 +727,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) - method := "PUT" + method := http.MethodPut request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -761,7 +761,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) - method := "DELETE" + method := http.MethodDelete request, err := http.NewRequest(method, url, nil) if err != nil { @@ -794,7 +794,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials", leasewebAPIURL, serverID) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -828,7 +828,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede func getDedicatedServerCredential(ctx context.Context, serverID string, credentialType string, username string) (*Credential, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credentialType, username) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -871,7 +871,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) - method := "PUT" + method := http.MethodPut request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -905,7 +905,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede func deleteDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) - method := "DELETE" + method := http.MethodDelete request, err := http.NewRequest(method, url, nil) if err != nil { @@ -932,7 +932,7 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { url := fmt.Sprintf("%s/bareMetals/v2/operatingSystems", leasewebAPIURL) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -971,7 +971,7 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlPanel, error) { url := fmt.Sprintf("%s/bareMetals/v2/controlPanels", leasewebAPIURL) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -1018,7 +1018,7 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/install", leasewebAPIURL, serverID) - method := "POST" + method := http.MethodPost request, err := http.NewRequest(method, url, requestBody) if err != nil { @@ -1053,7 +1053,7 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs", leasewebAPIURL, serverID) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -1093,7 +1093,7 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs/%s", leasewebAPIURL, serverID, jobUUID) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { @@ -1127,7 +1127,7 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) func getServersBatch(ctx context.Context, offset int, limit int, site string) ([]Server, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers", leasewebAPIURL) - method := "GET" + method := http.MethodGet request, err := http.NewRequest(method, url, nil) if err != nil { From f9c85eb0c4becfc4c9748bf6a63b1c1a93471d50 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Mon, 14 Nov 2022 15:20:27 +0100 Subject: [PATCH 11/18] BMA-5998 Log URL query parameters as part of the URL --- leaseweb/api_client.go | 65 ++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 82f32a39..32927212 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "net/http" + "net/url" "strconv" "strings" @@ -970,7 +971,18 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { } func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlPanel, error) { - url := fmt.Sprintf("%s/bareMetals/v2/controlPanels", leasewebAPIURL) + u, err := url.Parse(fmt.Sprintf("%s/bareMetals/v2/controlPanels", leasewebAPIURL)) + if err != nil { + return nil, err + } + + if operatingSystemID != "" { + v := url.Values{} + v.Set("operatingSystemId", operatingSystemID) + u.RawQuery = v.Encode() + } + + url := u.String() method := http.MethodGet request, err := http.NewRequest(method, url, nil) @@ -978,11 +990,6 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP return nil, err } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - if operatingSystemID != "" { - q := request.URL.Query() - q.Add("operatingSystemId", operatingSystemID) - request.URL.RawQuery = q.Encode() - } logAPIRequest(ctx, method, url) @@ -1052,7 +1059,16 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa } func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error) { - url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs", leasewebAPIURL, serverID) + u, err := url.Parse(fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs", leasewebAPIURL, serverID)) + if err != nil { + return nil, err + } + + v := url.Values{} + v.Set("type", "install") + u.RawQuery = v.Encode() + + url := u.String() method := http.MethodGet request, err := http.NewRequest(method, url, nil) @@ -1061,10 +1077,6 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error } request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - q := request.URL.Query() - q.Add("type", "install") - request.URL.RawQuery = q.Encode() - logAPIRequest(ctx, method, url) response, err := leasewebClient.Do(request) @@ -1126,32 +1138,35 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) } func getServersBatch(ctx context.Context, offset int, limit int, site string) ([]Server, error) { - url := fmt.Sprintf("%s/bareMetals/v2/servers", leasewebAPIURL) - method := http.MethodGet - - request, err := http.NewRequest(method, url, nil) + u, err := url.Parse(fmt.Sprintf("%s/bareMetals/v2/servers", leasewebAPIURL)) if err != nil { return nil, err } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + + v := url.Values{} if offset >= 0 { - q := request.URL.Query() - q.Add("offset", strconv.Itoa(offset)) - request.URL.RawQuery = q.Encode() + v.Set("offset", strconv.Itoa(offset)) } if limit >= 0 { - q := request.URL.Query() - q.Add("limit", strconv.Itoa(limit)) - request.URL.RawQuery = q.Encode() + v.Set("limit", strconv.Itoa(limit)) } if site != "" { - q := request.URL.Query() - q.Add("site", site) - request.URL.RawQuery = q.Encode() + v.Set("site", site) + } + + u.RawQuery = v.Encode() + + url := u.String() + method := http.MethodGet + + request, err := http.NewRequest(method, url, nil) + if err != nil { + return nil, err } + request.Header.Set("X-Lsw-Auth", leasewebAPIToken) logAPIRequest(ctx, method, url) From 753fbaa3f9ce54433c299952ff0eeec7f4bc465d Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Mon, 14 Nov 2022 16:28:04 +0100 Subject: [PATCH 12/18] BMA-5998 Add some missing deferred closing of response.Body --- leaseweb/api_client.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 32927212..46b1d511 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -381,6 +381,7 @@ func updateReference(ctx context.Context, serverID string, reference string) err if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusNoContent { err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reference", serverID)) @@ -418,6 +419,7 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusOK { err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip)) @@ -444,6 +446,7 @@ func powerOnServer(ctx context.Context, serverID string) error { if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusAccepted { err := parseErrorInfo(response.Body, fmt.Sprintf("powering on server %s", serverID)) @@ -470,6 +473,7 @@ func powerOffServer(ctx context.Context, serverID string) error { if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusAccepted { err := parseErrorInfo(response.Body, fmt.Sprintf("powering off server %s", serverID)) @@ -507,6 +511,7 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusNoContent { err := parseErrorInfo(response.Body, fmt.Sprintf("adding server %s lease", serverID)) @@ -533,6 +538,7 @@ func removeDHCPLease(ctx context.Context, serverID string) error { if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusNoContent { err := parseErrorInfo(response.Body, fmt.Sprintf("removing server %s lease", serverID)) @@ -559,6 +565,7 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusNoContent { err := parseErrorInfo(response.Body, fmt.Sprintf("opening server %s network interface %s", serverID, networkType)) @@ -585,6 +592,7 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusNoContent { err := parseErrorInfo(response.Body, fmt.Sprintf("closing server %s network interface %s", serverID, networkType)) @@ -611,6 +619,7 @@ func nullIP(ctx context.Context, serverID string, IP string) error { if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusAccepted { err := parseErrorInfo(response.Body, fmt.Sprintf("nulling server %s IP %s", serverID, IP)) @@ -637,6 +646,7 @@ func unnullIP(ctx context.Context, serverID string, IP string) error { if err != nil { return err } + defer response.Body.Close() if response.StatusCode != http.StatusAccepted { err := parseErrorInfo(response.Body, fmt.Sprintf("unnulling server %s IP %s", serverID, IP)) From 9ddf32d29cdd6a931fa9293b3de846bc497add17 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Mon, 14 Nov 2022 17:18:28 +0100 Subject: [PATCH 13/18] BMA-5998 Introduce doAPIRequest helper function Remove some of the copy pasted code --- leaseweb/api_client.go | 320 +++++++---------------------------------- 1 file changed, 51 insertions(+), 269 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 46b1d511..6ca1173b 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -152,6 +152,28 @@ func parseErrorInfo(r io.Reader, ctx string) error { return &erri } +func doAPIRequest(ctx context.Context, method, url string, body io.Reader) (*http.Response, error) { + request, err := http.NewRequest(method, url, body) + if err != nil { + return nil, err + } + request.Header.Set("X-Lsw-Auth", leasewebAPIToken) + + if method == http.MethodPost || method == http.MethodPut { + // not always needed even for those methods but this is simpler for now + request.Header.Set("Content-Type", "application/json") + } + + logAPIRequest(ctx, method, url) + + response, err := leasewebClient.Do(request) + if err != nil { + return nil, err + } + + return response, nil +} + func logAPIRequest(ctx context.Context, method, url string) { tflog.Trace( ctx, @@ -190,15 +212,7 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -226,15 +240,7 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -259,15 +265,7 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -292,15 +290,7 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerInfo", leasewebAPIURL, serverID) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -325,15 +315,7 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s", leasewebAPIURL, serverID, networkType) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -368,16 +350,7 @@ func updateReference(ctx context.Context, serverID string, reference string) err url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) method := http.MethodPut - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return err } @@ -406,16 +379,7 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) method := http.MethodPut - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return err } @@ -434,15 +398,7 @@ func powerOnServer(ctx context.Context, serverID string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOn", leasewebAPIURL, serverID) method := http.MethodPost - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -461,15 +417,7 @@ func powerOffServer(ctx context.Context, serverID string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOff", leasewebAPIURL, serverID) method := http.MethodPost - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -498,16 +446,7 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) method := http.MethodPost - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return err } @@ -526,15 +465,7 @@ func removeDHCPLease(ctx context.Context, serverID string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) method := http.MethodDelete - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -553,15 +484,7 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/open", leasewebAPIURL, serverID, networkType) method := http.MethodPost - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -580,15 +503,7 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/close", leasewebAPIURL, serverID, networkType) method := http.MethodPost - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -607,15 +522,7 @@ func nullIP(ctx context.Context, serverID string, IP string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/null", leasewebAPIURL, serverID, IP) method := http.MethodPost - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -634,15 +541,7 @@ func unnullIP(ctx context.Context, serverID string, IP string) error { url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/unnull", leasewebAPIURL, serverID, IP) method := http.MethodPost - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -667,16 +566,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s", leasewebAPIURL, serverID, notificationType) method := http.MethodPost - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return nil, err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return nil, err } @@ -701,15 +591,7 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -740,16 +622,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) method := http.MethodPut - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return nil, err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return nil, err } @@ -774,15 +647,7 @@ func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID stri url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) method := http.MethodDelete - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -807,16 +672,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials", leasewebAPIURL, serverID) method := http.MethodPost - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return nil, err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return nil, err } @@ -841,15 +697,7 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credentialType, username) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -884,16 +732,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) method := http.MethodPut - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return nil, err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return nil, err } @@ -918,15 +757,7 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) method := http.MethodDelete - request, err := http.NewRequest(method, url, nil) - if err != nil { - return err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return err } @@ -945,15 +776,7 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { url := fmt.Sprintf("%s/bareMetals/v2/operatingSystems", leasewebAPIURL) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -995,15 +818,7 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP url := u.String() method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -1037,16 +852,7 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/install", leasewebAPIURL, serverID) method := http.MethodPost - request, err := http.NewRequest(method, url, requestBody) - if err != nil { - return nil, err - } - request.Header.Set("Content-Type", "application/json") - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, requestBody) if err != nil { return nil, err } @@ -1081,15 +887,7 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error url := u.String() method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -1117,15 +915,7 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs/%s", leasewebAPIURL, serverID, jobUUID) method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } @@ -1172,15 +962,7 @@ func getServersBatch(ctx context.Context, offset int, limit int, site string) ([ url := u.String() method := http.MethodGet - request, err := http.NewRequest(method, url, nil) - if err != nil { - return nil, err - } - request.Header.Set("X-Lsw-Auth", leasewebAPIToken) - - logAPIRequest(ctx, method, url) - - response, err := leasewebClient.Do(request) + response, err := doAPIRequest(ctx, method, url, nil) if err != nil { return nil, err } From 67e687696621c4018d38e43d03ea39490e1095be Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Mon, 14 Nov 2022 17:20:47 +0100 Subject: [PATCH 14/18] BMA-5998 Remove separate logAPIRequest function Not needed anymore since only used in doAPIRequest now --- leaseweb/api_client.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 6ca1173b..5f6b271f 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -164,7 +164,10 @@ func doAPIRequest(ctx context.Context, method, url string, body io.Reader) (*htt request.Header.Set("Content-Type", "application/json") } - logAPIRequest(ctx, method, url) + tflog.Trace(ctx, "executing API request", map[string]interface{}{ + "url": url, + "method": method, + }) response, err := leasewebClient.Do(request) if err != nil { @@ -174,16 +177,6 @@ func doAPIRequest(ctx context.Context, method, url string, body io.Reader) (*htt return response, nil } -func logAPIRequest(ctx context.Context, method, url string) { - tflog.Trace( - ctx, - "executing API request", - map[string]interface{}{ - "url": url, - "method": method, - }) -} - func logAPIError(ctx context.Context, method, url string, err error) { fields := map[string]interface{}{ "url": url, From 5cb035be23a6974ccf8695d9a45792e90003a773 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Tue, 15 Nov 2022 12:01:06 +0100 Subject: [PATCH 15/18] BMA-5998 Add prefix message to response body JSON decoding error --- leaseweb/api_client.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index 5f6b271f..fc144cb2 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -146,7 +146,7 @@ func parseErrorInfo(r io.Reader, ctx string) error { } if err := json.NewDecoder(r).Decode(&erri); err != nil { - return err + return fmt.Errorf("error while decoding JSON error response body: %v", err) } return &erri @@ -220,7 +220,7 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { var server Server err = json.NewDecoder(response.Body).Decode(&server) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } server.NetworkInterfaces.Public.IP = strings.SplitN(server.NetworkInterfaces.Public.IP, "/", 2)[0] @@ -248,7 +248,7 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { var ipData IP err = json.NewDecoder(response.Body).Decode(&ipData) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &ipData, nil @@ -273,7 +273,7 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { var dhcpLease DHCPLease err = json.NewDecoder(response.Body).Decode(&dhcpLease) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &dhcpLease, nil @@ -298,7 +298,7 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { var powerInfo PowerInfo err = json.NewDecoder(response.Body).Decode(&powerInfo) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &powerInfo, nil @@ -323,7 +323,7 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s var networkInterfaceInfo NetworkInterfaceInfo err = json.NewDecoder(response.Body).Decode(&networkInterfaceInfo) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &networkInterfaceInfo, nil @@ -574,7 +574,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri var createdNotificationSetting NotificationSetting err = json.NewDecoder(response.Body).Decode(&createdNotificationSetting) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &createdNotificationSetting, nil @@ -599,7 +599,7 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, var notificationSetting NotificationSetting err = json.NewDecoder(response.Body).Decode(¬ificationSetting) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return ¬ificationSetting, nil @@ -630,7 +630,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri var updatedNotificationSetting NotificationSetting err = json.NewDecoder(response.Body).Decode(&updatedNotificationSetting) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &updatedNotificationSetting, nil @@ -680,7 +680,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede var createdCredential Credential err = json.NewDecoder(response.Body).Decode(&createdCredential) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &createdCredential, nil @@ -705,7 +705,7 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti var credential Credential err = json.NewDecoder(response.Body).Decode(&credential) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &credential, nil @@ -740,7 +740,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede var updatedCredential Credential err = json.NewDecoder(response.Body).Decode(&updatedCredential) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &updatedCredential, nil @@ -787,7 +787,7 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { err = json.NewDecoder(response.Body).Decode(&operatingSystems) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } // to be exact we would need to support pagination by checking the metadata and make multiple requests if needed @@ -829,7 +829,7 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP err = json.NewDecoder(response.Body).Decode(&controlPanels) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return controlPanels.ControlPanels, nil @@ -861,7 +861,7 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa err = json.NewDecoder(response.Body).Decode(&installationJob) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &installationJob, nil @@ -898,7 +898,7 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error err = json.NewDecoder(response.Body).Decode(&jobs) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &jobs.Jobs[0], nil @@ -924,7 +924,7 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) err = json.NewDecoder(response.Body).Decode(&job) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return &job, nil @@ -973,7 +973,7 @@ func getServersBatch(ctx context.Context, offset int, limit int, site string) ([ err = json.NewDecoder(response.Body).Decode(&serverList) if err != nil { - return nil, err + return nil, fmt.Errorf("error while decoding JSON response body: %v", err) } return serverList.Servers, nil From 112da1ef1e3a894fdd1b959267b4f872d535f088 Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Tue, 15 Nov 2022 13:59:30 +0100 Subject: [PATCH 16/18] BMA-5998 Extract API context message to variable Preparation for reuse --- leaseweb/api_client.go | 98 +++++++++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index fc144cb2..fb3ef322 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -202,6 +202,7 @@ func logAPIError(ctx context.Context, method, url string, err error) { } func getServer(ctx context.Context, serverID string) (*Server, error) { + apiCtx := fmt.Sprintf("getting server %s", serverID) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) method := http.MethodGet @@ -212,7 +213,7 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -230,6 +231,7 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { } func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { + apiCtx := fmt.Sprintf("getting server %s IP %s", serverID, ip) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) method := http.MethodGet @@ -240,7 +242,7 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s IP %s", serverID, ip)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -255,6 +257,7 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { } func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { + apiCtx := fmt.Sprintf("getting server %s lease", serverID) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) method := http.MethodGet @@ -265,7 +268,7 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s lease", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -280,6 +283,7 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { } func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { + apiCtx := fmt.Sprintf("getting server %s power info", serverID) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerInfo", leasewebAPIURL, serverID) method := http.MethodGet @@ -290,7 +294,7 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s power info", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -305,6 +309,7 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { } func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType string) (*NetworkInterfaceInfo, error) { + apiCtx := fmt.Sprintf("getting server network interface info") url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s", leasewebAPIURL, serverID, networkType) method := http.MethodGet @@ -315,7 +320,7 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting server network interface info")) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -330,6 +335,8 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s } func updateReference(ctx context.Context, serverID string, reference string) error { + apiCtx := fmt.Sprintf("updating server %s reference", serverID) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { Reference string `json:"reference"` @@ -350,7 +357,7 @@ func updateReference(ctx context.Context, serverID string, reference string) err defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reference", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -359,6 +366,8 @@ func updateReference(ctx context.Context, serverID string, reference string) err } func updateReverseLookup(ctx context.Context, serverID string, ip string, reverseLookup string) error { + apiCtx := fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { ReverseLookup string `json:"reverseLookup"` @@ -379,7 +388,7 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s reverse lookup for IP %s", serverID, ip)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -388,6 +397,7 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers } func powerOnServer(ctx context.Context, serverID string) error { + apiCtx := fmt.Sprintf("powering on server %s", serverID) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOn", leasewebAPIURL, serverID) method := http.MethodPost @@ -398,7 +408,7 @@ func powerOnServer(ctx context.Context, serverID string) error { defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - err := parseErrorInfo(response.Body, fmt.Sprintf("powering on server %s", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -407,6 +417,7 @@ func powerOnServer(ctx context.Context, serverID string) error { } func powerOffServer(ctx context.Context, serverID string) error { + apiCtx := fmt.Sprintf("powering off server %s", serverID) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/powerOff", leasewebAPIURL, serverID) method := http.MethodPost @@ -417,7 +428,7 @@ func powerOffServer(ctx context.Context, serverID string) error { defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - err := parseErrorInfo(response.Body, fmt.Sprintf("powering off server %s", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -426,6 +437,8 @@ func powerOffServer(ctx context.Context, serverID string) error { } func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { + apiCtx := fmt.Sprintf("adding server %s lease", serverID) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { Bootfile string `json:"bootfile"` @@ -446,7 +459,7 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - err := parseErrorInfo(response.Body, fmt.Sprintf("adding server %s lease", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -455,6 +468,7 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { } func removeDHCPLease(ctx context.Context, serverID string) error { + apiCtx := fmt.Sprintf("removing server %s lease", serverID) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) method := http.MethodDelete @@ -465,7 +479,7 @@ func removeDHCPLease(ctx context.Context, serverID string) error { defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - err := parseErrorInfo(response.Body, fmt.Sprintf("removing server %s lease", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -474,6 +488,7 @@ func removeDHCPLease(ctx context.Context, serverID string) error { } func openNetworkInterface(ctx context.Context, serverID string, networkType string) error { + apiCtx := fmt.Sprintf("opening server %s network interface %s", serverID, networkType) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/open", leasewebAPIURL, serverID, networkType) method := http.MethodPost @@ -484,7 +499,7 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - err := parseErrorInfo(response.Body, fmt.Sprintf("opening server %s network interface %s", serverID, networkType)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -493,6 +508,7 @@ func openNetworkInterface(ctx context.Context, serverID string, networkType stri } func closeNetworkInterface(ctx context.Context, serverID string, networkType string) error { + apiCtx := fmt.Sprintf("closing server %s network interface %s", serverID, networkType) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/networkInterfaces/%s/close", leasewebAPIURL, serverID, networkType) method := http.MethodPost @@ -503,7 +519,7 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - err := parseErrorInfo(response.Body, fmt.Sprintf("closing server %s network interface %s", serverID, networkType)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -512,6 +528,7 @@ func closeNetworkInterface(ctx context.Context, serverID string, networkType str } func nullIP(ctx context.Context, serverID string, IP string) error { + apiCtx := fmt.Sprintf("nulling server %s IP %s", serverID, IP) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/null", leasewebAPIURL, serverID, IP) method := http.MethodPost @@ -522,7 +539,7 @@ func nullIP(ctx context.Context, serverID string, IP string) error { defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - err := parseErrorInfo(response.Body, fmt.Sprintf("nulling server %s IP %s", serverID, IP)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -531,6 +548,7 @@ func nullIP(ctx context.Context, serverID string, IP string) error { } func unnullIP(ctx context.Context, serverID string, IP string) error { + apiCtx := fmt.Sprintf("unnulling server %s IP %s", serverID, IP) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s/unnull", leasewebAPIURL, serverID, IP) method := http.MethodPost @@ -541,7 +559,7 @@ func unnullIP(ctx context.Context, serverID string, IP string) error { defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - err := parseErrorInfo(response.Body, fmt.Sprintf("unnulling server %s IP %s", serverID, IP)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -550,6 +568,8 @@ func unnullIP(ctx context.Context, serverID string, IP string) error { } func createDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSetting *NotificationSetting) (*NotificationSetting, error) { + apiCtx := fmt.Sprintf("creating server %s notification setting %s", serverID, notificationType) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(notificationSetting) if err != nil { @@ -566,7 +586,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusCreated { - err := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s notification setting %s", serverID, notificationType)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -581,6 +601,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri } func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) (*NotificationSetting, error) { + apiCtx := fmt.Sprintf("getting server %s notification setting %s", serverID, notificationType) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) method := http.MethodGet @@ -591,7 +612,7 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s notification setting %s", serverID, notificationType)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -606,6 +627,8 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, } func updateDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string, notificationSetting *NotificationSetting) (*NotificationSetting, error) { + apiCtx := fmt.Sprintf("updating server %s notification setting %s", serverID, notificationType) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(notificationSetting) if err != nil { @@ -622,7 +645,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s notification setting %s", serverID, notificationType)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -637,6 +660,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri } func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID string, notificationType string, notificationSettingID string) error { + apiCtx := fmt.Sprintf("deleting server %s notification setting %s", serverID, notificationType) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) method := http.MethodDelete @@ -647,7 +671,7 @@ func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID stri defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - err := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s notification setting %s", serverID, notificationType)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -656,6 +680,8 @@ func deleteDedicatedServerNotificationSetting(ctx context.Context, serverID stri } func createDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) (*Credential, error) { + apiCtx := fmt.Sprintf("creating server %s credential %s", serverID, credential.Type) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(credential) if err != nil { @@ -672,7 +698,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("creating server %s credential %s", serverID, credential.Type)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -687,6 +713,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede } func getDedicatedServerCredential(ctx context.Context, serverID string, credentialType string, username string) (*Credential, error) { + apiCtx := fmt.Sprintf("getting server %s credential %s", serverID, credentialType) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credentialType, username) method := http.MethodGet @@ -697,7 +724,7 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting server %s credential %s", serverID, credentialType)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -712,6 +739,8 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti } func updateDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) (*Credential, error) { + apiCtx := fmt.Sprintf("updating server %s credential %s", serverID, credential.Type) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(struct { Password string `json:"password"` @@ -732,7 +761,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("updating server %s credential %s", serverID, credential.Type)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -747,6 +776,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede } func deleteDedicatedServerCredential(ctx context.Context, serverID string, credential *Credential) error { + apiCtx := fmt.Sprintf("deleting server %s credential %s", serverID, credential.Type) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) method := http.MethodDelete @@ -757,7 +787,7 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede defer response.Body.Close() if response.StatusCode != http.StatusNoContent { - err := parseErrorInfo(response.Body, fmt.Sprintf("deleting server %s credential %s", serverID, credential.Type)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return err } @@ -766,6 +796,7 @@ func deleteDedicatedServerCredential(ctx context.Context, serverID string, crede } func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { + apiCtx := fmt.Sprintf("getting operating systems") url := fmt.Sprintf("%s/bareMetals/v2/operatingSystems", leasewebAPIURL) method := http.MethodGet @@ -776,7 +807,7 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting operating systems")) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -797,6 +828,8 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { } func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlPanel, error) { + apiCtx := fmt.Sprintf("getting control panels") + u, err := url.Parse(fmt.Sprintf("%s/bareMetals/v2/controlPanels", leasewebAPIURL)) if err != nil { return nil, err @@ -818,7 +851,7 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting control panels")) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -836,6 +869,8 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP } func launchInstallationJob(ctx context.Context, serverID string, payload *Payload) (*Job, error) { + apiCtx := fmt.Sprintf("launching installation job for server %s", serverID) + requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(payload) if err != nil { @@ -852,7 +887,7 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa defer response.Body.Close() if response.StatusCode != http.StatusAccepted { - err := parseErrorInfo(response.Body, fmt.Sprintf("launching installation job for server %s", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -868,6 +903,8 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa } func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error) { + apiCtx := fmt.Sprintf("getting latest installation job for server %s", serverID) + u, err := url.Parse(fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs", leasewebAPIURL, serverID)) if err != nil { return nil, err @@ -887,7 +924,7 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting latest installation job for server %s", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -905,6 +942,7 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error } func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) { + apiCtx := fmt.Sprintf("getting job status for server %s", serverID) url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/jobs/%s", leasewebAPIURL, serverID, jobUUID) method := http.MethodGet @@ -915,7 +953,7 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting job status for server %s", serverID)) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } @@ -931,6 +969,8 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) } func getServersBatch(ctx context.Context, offset int, limit int, site string) ([]Server, error) { + apiCtx := fmt.Sprintf("getting servers list") + u, err := url.Parse(fmt.Sprintf("%s/bareMetals/v2/servers", leasewebAPIURL)) if err != nil { return nil, err @@ -962,7 +1002,7 @@ func getServersBatch(ctx context.Context, offset int, limit int, site string) ([ defer response.Body.Close() if response.StatusCode != http.StatusOK { - err := parseErrorInfo(response.Body, fmt.Sprintf("getting servers list")) + err := parseErrorInfo(response.Body, apiCtx) logAPIError(ctx, method, url, err) return nil, err } From 26985b104d67dc6a020ba123ca2dc48c96bef66f Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Tue, 15 Nov 2022 14:46:34 +0100 Subject: [PATCH 17/18] BMA-5998 Add API context to response body decoding error --- leaseweb/api_client.go | 55 ++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index fb3ef322..d649198c 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -140,13 +140,26 @@ func (erri *ErrorInfo) Error() string { return "(" + erri.Code + ") " + erri.Context + ": " + erri.Message } +// DecodingError - +type DecodingError struct { + Context string + Message string +} + +func (errd *DecodingError) Error() string { + return errd.Context + ": error while decoding JSON response body (" + errd.Message + ")" +} + +// NewDecodingError - +func NewDecodingError(ctx string, err error) *DecodingError { + return &DecodingError{Context: ctx, Message: err.Error()} +} + func parseErrorInfo(r io.Reader, ctx string) error { - erri := ErrorInfo{ - Context: ctx, - } + erri := ErrorInfo{Context: ctx} if err := json.NewDecoder(r).Decode(&erri); err != nil { - return fmt.Errorf("error while decoding JSON error response body: %v", err) + return NewDecodingError(ctx, err) } return &erri @@ -221,7 +234,7 @@ func getServer(ctx context.Context, serverID string) (*Server, error) { var server Server err = json.NewDecoder(response.Body).Decode(&server) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } server.NetworkInterfaces.Public.IP = strings.SplitN(server.NetworkInterfaces.Public.IP, "/", 2)[0] @@ -250,7 +263,7 @@ func getServerIP(ctx context.Context, serverID string, ip string) (*IP, error) { var ipData IP err = json.NewDecoder(response.Body).Decode(&ipData) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &ipData, nil @@ -276,7 +289,7 @@ func getServerLease(ctx context.Context, serverID string) (*DHCPLease, error) { var dhcpLease DHCPLease err = json.NewDecoder(response.Body).Decode(&dhcpLease) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &dhcpLease, nil @@ -302,7 +315,7 @@ func getPowerInfo(ctx context.Context, serverID string) (*PowerInfo, error) { var powerInfo PowerInfo err = json.NewDecoder(response.Body).Decode(&powerInfo) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &powerInfo, nil @@ -328,7 +341,7 @@ func getNetworkInterfaceInfo(ctx context.Context, serverID string, networkType s var networkInterfaceInfo NetworkInterfaceInfo err = json.NewDecoder(response.Body).Decode(&networkInterfaceInfo) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &networkInterfaceInfo, nil @@ -594,7 +607,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri var createdNotificationSetting NotificationSetting err = json.NewDecoder(response.Body).Decode(&createdNotificationSetting) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &createdNotificationSetting, nil @@ -620,7 +633,7 @@ func getDedicatedServerNotificationSetting(ctx context.Context, serverID string, var notificationSetting NotificationSetting err = json.NewDecoder(response.Body).Decode(¬ificationSetting) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return ¬ificationSetting, nil @@ -653,7 +666,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri var updatedNotificationSetting NotificationSetting err = json.NewDecoder(response.Body).Decode(&updatedNotificationSetting) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &updatedNotificationSetting, nil @@ -706,7 +719,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede var createdCredential Credential err = json.NewDecoder(response.Body).Decode(&createdCredential) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &createdCredential, nil @@ -732,7 +745,7 @@ func getDedicatedServerCredential(ctx context.Context, serverID string, credenti var credential Credential err = json.NewDecoder(response.Body).Decode(&credential) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &credential, nil @@ -769,7 +782,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede var updatedCredential Credential err = json.NewDecoder(response.Body).Decode(&updatedCredential) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &updatedCredential, nil @@ -818,7 +831,7 @@ func getOperatingSystems(ctx context.Context) ([]OperatingSystem, error) { err = json.NewDecoder(response.Body).Decode(&operatingSystems) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } // to be exact we would need to support pagination by checking the metadata and make multiple requests if needed @@ -862,7 +875,7 @@ func getControlPanels(ctx context.Context, operatingSystemID string) ([]ControlP err = json.NewDecoder(response.Body).Decode(&controlPanels) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return controlPanels.ControlPanels, nil @@ -896,7 +909,7 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa err = json.NewDecoder(response.Body).Decode(&installationJob) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &installationJob, nil @@ -935,7 +948,7 @@ func getLatestInstallationJob(ctx context.Context, serverID string) (*Job, error err = json.NewDecoder(response.Body).Decode(&jobs) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &jobs.Jobs[0], nil @@ -962,7 +975,7 @@ func getJob(ctx context.Context, serverID string, jobUUID string) (*Job, error) err = json.NewDecoder(response.Body).Decode(&job) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return &job, nil @@ -1013,7 +1026,7 @@ func getServersBatch(ctx context.Context, offset int, limit int, site string) ([ err = json.NewDecoder(response.Body).Decode(&serverList) if err != nil { - return nil, fmt.Errorf("error while decoding JSON response body: %v", err) + return nil, NewDecodingError(apiCtx, err) } return serverList.Servers, nil From a6dc796b8c6a9b33b6f1126b0148b3b319cc477c Mon Sep 17 00:00:00 2001 From: Damien Tardy-Panis Date: Tue, 15 Nov 2022 15:24:20 +0100 Subject: [PATCH 18/18] BMA-5998 Display JSON request encoding errors similar to response decoding ones --- leaseweb/api_client.go | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/leaseweb/api_client.go b/leaseweb/api_client.go index d649198c..0095bce2 100644 --- a/leaseweb/api_client.go +++ b/leaseweb/api_client.go @@ -155,6 +155,21 @@ func NewDecodingError(ctx string, err error) *DecodingError { return &DecodingError{Context: ctx, Message: err.Error()} } +// EncodingError - +type EncodingError struct { + Context string + Message string +} + +func (erre *EncodingError) Error() string { + return erre.Context + ": error while encoding JSON request body (" + erre.Message + ")" +} + +// NewEncodingError - +func NewEncodingError(ctx string, err error) *EncodingError { + return &EncodingError{Context: ctx, Message: err.Error()} +} + func parseErrorInfo(r io.Reader, ctx string) error { erri := ErrorInfo{Context: ctx} @@ -357,7 +372,7 @@ func updateReference(ctx context.Context, serverID string, reference string) err Reference: reference, }) if err != nil { - return err + return NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s", leasewebAPIURL, serverID) @@ -388,7 +403,7 @@ func updateReverseLookup(ctx context.Context, serverID string, ip string, revers ReverseLookup: reverseLookup, }) if err != nil { - return err + return NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/ips/%s", leasewebAPIURL, serverID, ip) @@ -459,7 +474,7 @@ func addDHCPLease(ctx context.Context, serverID string, bootfile string) error { Bootfile: bootfile, }) if err != nil { - return err + return NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/leases", leasewebAPIURL, serverID) @@ -586,7 +601,7 @@ func createDedicatedServerNotificationSetting(ctx context.Context, serverID stri requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(notificationSetting) if err != nil { - return nil, err + return nil, NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s", leasewebAPIURL, serverID, notificationType) @@ -645,7 +660,7 @@ func updateDedicatedServerNotificationSetting(ctx context.Context, serverID stri requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(notificationSetting) if err != nil { - return nil, err + return nil, NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/notificationSettings/%s/%s", leasewebAPIURL, serverID, notificationType, notificationSettingID) @@ -698,7 +713,7 @@ func createDedicatedServerCredential(ctx context.Context, serverID string, crede requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(credential) if err != nil { - return nil, err + return nil, NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials", leasewebAPIURL, serverID) @@ -761,7 +776,7 @@ func updateDedicatedServerCredential(ctx context.Context, serverID string, crede Password: credential.Password, }) if err != nil { - return nil, err + return nil, NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/credentials/%s/%s", leasewebAPIURL, serverID, credential.Type, credential.Username) @@ -887,7 +902,7 @@ func launchInstallationJob(ctx context.Context, serverID string, payload *Payloa requestBody := new(bytes.Buffer) err := json.NewEncoder(requestBody).Encode(payload) if err != nil { - return nil, err + return nil, NewEncodingError(apiCtx, err) } url := fmt.Sprintf("%s/bareMetals/v2/servers/%s/install", leasewebAPIURL, serverID)