chore(linting): Fixed all linter errors
All checks were successful
test / test (push) Successful in 46s
All checks were successful
test / test (push) Successful in 46s
This commit is contained in:
parent
f3cbfa3723
commit
9772a072e8
24 changed files with 240 additions and 158 deletions
14
cmd/app.go
14
cmd/app.go
|
|
@ -37,7 +37,7 @@ func validateBaseURL(baseURL string) error {
|
||||||
return fmt.Errorf("user and or password should not be set")
|
return fmt.Errorf("user and or password should not be set")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !(url.Path == "" || url.Path == "/") {
|
if url.Path != "" && url.Path != "/" {
|
||||||
return fmt.Errorf("should not contain any path '%s'", url.Path)
|
return fmt.Errorf("should not contain any path '%s'", url.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -291,12 +291,18 @@ func init() {
|
||||||
cmd.Flags().StringVarP(&appName, "name", "n", "", "application name")
|
cmd.Flags().StringVarP(&appName, "name", "n", "", "application name")
|
||||||
cmd.Flags().StringVarP(&appVersion, "version", "v", "", "application version")
|
cmd.Flags().StringVarP(&appVersion, "version", "v", "", "application version")
|
||||||
cmd.Flags().StringVarP(®ion, "region", "r", "", "region (required)")
|
cmd.Flags().StringVarP(®ion, "region", "r", "", "region (required)")
|
||||||
cmd.MarkFlagRequired("org")
|
if err := cmd.MarkFlagRequired("org"); err != nil {
|
||||||
cmd.MarkFlagRequired("region")
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := cmd.MarkFlagRequired("region"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add required name flag for specific commands
|
// Add required name flag for specific commands
|
||||||
for _, cmd := range []*cobra.Command{createAppCmd, showAppCmd, deleteAppCmd} {
|
for _, cmd := range []*cobra.Command{createAppCmd, showAppCmd, deleteAppCmd} {
|
||||||
cmd.MarkFlagRequired("name")
|
if err := cmd.MarkFlagRequired("name"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
22
cmd/apply.go
22
cmd/apply.go
|
|
@ -31,7 +31,7 @@ the necessary changes to deploy your applications across multiple cloudlets.`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if configFile == "" {
|
if configFile == "" {
|
||||||
fmt.Fprintf(os.Stderr, "Error: configuration file is required\n")
|
fmt.Fprintf(os.Stderr, "Error: configuration file is required\n")
|
||||||
cmd.Usage()
|
_ = cmd.Usage()
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -208,20 +208,6 @@ func runApplyV2(cfg *config.EdgeConnectConfig, manifestContent string, isDryRun
|
||||||
return displayDeploymentResults(deployResult)
|
return displayDeploymentResults(deployResult)
|
||||||
}
|
}
|
||||||
|
|
||||||
type deploymentResult interface {
|
|
||||||
IsSuccess() bool
|
|
||||||
GetDuration() string
|
|
||||||
GetCompletedActions() []actionResult
|
|
||||||
GetFailedActions() []actionResult
|
|
||||||
GetError() error
|
|
||||||
}
|
|
||||||
|
|
||||||
type actionResult interface {
|
|
||||||
GetType() string
|
|
||||||
GetTarget() string
|
|
||||||
GetError() error
|
|
||||||
}
|
|
||||||
|
|
||||||
func displayDeploymentResults(result interface{}) error {
|
func displayDeploymentResults(result interface{}) error {
|
||||||
// Use reflection or type assertion to handle both v1 and v2 result types
|
// Use reflection or type assertion to handle both v1 and v2 result types
|
||||||
// For now, we'll use a simple approach that works with both
|
// For now, we'll use a simple approach that works with both
|
||||||
|
|
@ -288,7 +274,7 @@ func displayDeploymentResultsV2(deployResult *applyv2.ExecutionResult) error {
|
||||||
func confirmDeployment() bool {
|
func confirmDeployment() bool {
|
||||||
fmt.Print("Do you want to proceed? (yes/no): ")
|
fmt.Print("Do you want to proceed? (yes/no): ")
|
||||||
var response string
|
var response string
|
||||||
fmt.Scanln(&response)
|
_, _ = fmt.Scanln(&response)
|
||||||
|
|
||||||
switch response {
|
switch response {
|
||||||
case "yes", "y", "YES", "Y":
|
case "yes", "y", "YES", "Y":
|
||||||
|
|
@ -305,5 +291,7 @@ func init() {
|
||||||
applyCmd.Flags().BoolVar(&dryRun, "dry-run", false, "preview changes without applying them")
|
applyCmd.Flags().BoolVar(&dryRun, "dry-run", false, "preview changes without applying them")
|
||||||
applyCmd.Flags().BoolVar(&autoApprove, "auto-approve", false, "automatically approve the deployment plan")
|
applyCmd.Flags().BoolVar(&autoApprove, "auto-approve", false, "automatically approve the deployment plan")
|
||||||
|
|
||||||
applyCmd.MarkFlagRequired("file")
|
if err := applyCmd.MarkFlagRequired("file"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ Instances are always deleted before the application.`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if deleteConfigFile == "" {
|
if deleteConfigFile == "" {
|
||||||
fmt.Fprintf(os.Stderr, "Error: configuration file is required\n")
|
fmt.Fprintf(os.Stderr, "Error: configuration file is required\n")
|
||||||
cmd.Usage()
|
_ = cmd.Usage()
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -273,7 +273,7 @@ func displayDeletionResultsV2(deleteResult *deletev2.DeletionResult) error {
|
||||||
func confirmDeletion() bool {
|
func confirmDeletion() bool {
|
||||||
fmt.Print("Do you want to proceed with deletion? (yes/no): ")
|
fmt.Print("Do you want to proceed with deletion? (yes/no): ")
|
||||||
var response string
|
var response string
|
||||||
fmt.Scanln(&response)
|
_, _ = fmt.Scanln(&response)
|
||||||
|
|
||||||
switch response {
|
switch response {
|
||||||
case "yes", "y", "YES", "Y":
|
case "yes", "y", "YES", "Y":
|
||||||
|
|
@ -290,5 +290,7 @@ func init() {
|
||||||
deleteCmd.Flags().BoolVar(&deleteDryRun, "dry-run", false, "preview deletion without actually deleting resources")
|
deleteCmd.Flags().BoolVar(&deleteDryRun, "dry-run", false, "preview deletion without actually deleting resources")
|
||||||
deleteCmd.Flags().BoolVar(&deleteAutoApprove, "auto-approve", false, "automatically approve the deletion plan")
|
deleteCmd.Flags().BoolVar(&deleteAutoApprove, "auto-approve", false, "automatically approve the deletion plan")
|
||||||
|
|
||||||
deleteCmd.MarkFlagRequired("file")
|
if err := deleteCmd.MarkFlagRequired("file"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -230,17 +230,31 @@ func init() {
|
||||||
cmd.Flags().StringVarP(&cloudletOrg, "cloudlet-org", "", "", "cloudlet organization (required)")
|
cmd.Flags().StringVarP(&cloudletOrg, "cloudlet-org", "", "", "cloudlet organization (required)")
|
||||||
cmd.Flags().StringVarP(®ion, "region", "r", "", "region (required)")
|
cmd.Flags().StringVarP(®ion, "region", "r", "", "region (required)")
|
||||||
|
|
||||||
cmd.MarkFlagRequired("org")
|
if err := cmd.MarkFlagRequired("org"); err != nil {
|
||||||
cmd.MarkFlagRequired("name")
|
panic(err)
|
||||||
cmd.MarkFlagRequired("cloudlet")
|
}
|
||||||
cmd.MarkFlagRequired("cloudlet-org")
|
if err := cmd.MarkFlagRequired("name"); err != nil {
|
||||||
cmd.MarkFlagRequired("region")
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := cmd.MarkFlagRequired("cloudlet"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := cmd.MarkFlagRequired("cloudlet-org"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := cmd.MarkFlagRequired("region"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add additional flags for create command
|
// Add additional flags for create command
|
||||||
createInstanceCmd.Flags().StringVarP(&appName, "app", "a", "", "application name (required)")
|
createInstanceCmd.Flags().StringVarP(&appName, "app", "a", "", "application name (required)")
|
||||||
createInstanceCmd.Flags().StringVarP(&appVersion, "version", "v", "", "application version")
|
createInstanceCmd.Flags().StringVarP(&appVersion, "version", "v", "", "application version")
|
||||||
createInstanceCmd.Flags().StringVarP(&flavorName, "flavor", "f", "", "flavor name (required)")
|
createInstanceCmd.Flags().StringVarP(&flavorName, "flavor", "f", "", "flavor name (required)")
|
||||||
createInstanceCmd.MarkFlagRequired("app")
|
if err := createInstanceCmd.MarkFlagRequired("app"); err != nil {
|
||||||
createInstanceCmd.MarkFlagRequired("flavor")
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := createInstanceCmd.MarkFlagRequired("flavor"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
32
cmd/root.go
32
cmd/root.go
|
|
@ -44,19 +44,35 @@ func init() {
|
||||||
rootCmd.PersistentFlags().StringVar(&apiVersion, "api-version", "v2", "API version to use (v1 or v2)")
|
rootCmd.PersistentFlags().StringVar(&apiVersion, "api-version", "v2", "API version to use (v1 or v2)")
|
||||||
rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "enable debug logging")
|
rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "enable debug logging")
|
||||||
|
|
||||||
viper.BindPFlag("base_url", rootCmd.PersistentFlags().Lookup("base-url"))
|
if err := viper.BindPFlag("base_url", rootCmd.PersistentFlags().Lookup("base-url")); err != nil {
|
||||||
viper.BindPFlag("username", rootCmd.PersistentFlags().Lookup("username"))
|
panic(err)
|
||||||
viper.BindPFlag("password", rootCmd.PersistentFlags().Lookup("password"))
|
}
|
||||||
viper.BindPFlag("api_version", rootCmd.PersistentFlags().Lookup("api-version"))
|
if err := viper.BindPFlag("username", rootCmd.PersistentFlags().Lookup("username")); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := viper.BindPFlag("password", rootCmd.PersistentFlags().Lookup("password")); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := viper.BindPFlag("api_version", rootCmd.PersistentFlags().Lookup("api-version")); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func initConfig() {
|
func initConfig() {
|
||||||
viper.AutomaticEnv()
|
viper.AutomaticEnv()
|
||||||
viper.SetEnvPrefix("EDGE_CONNECT")
|
viper.SetEnvPrefix("EDGE_CONNECT")
|
||||||
viper.BindEnv("base_url", "EDGE_CONNECT_BASE_URL")
|
if err := viper.BindEnv("base_url", "EDGE_CONNECT_BASE_URL"); err != nil {
|
||||||
viper.BindEnv("username", "EDGE_CONNECT_USERNAME")
|
panic(err)
|
||||||
viper.BindEnv("password", "EDGE_CONNECT_PASSWORD")
|
}
|
||||||
viper.BindEnv("api_version", "EDGE_CONNECT_API_VERSION")
|
if err := viper.BindEnv("username", "EDGE_CONNECT_USERNAME"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := viper.BindEnv("password", "EDGE_CONNECT_PASSWORD"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := viper.BindEnv("api_version", "EDGE_CONNECT_API_VERSION"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
if cfgFile != "" {
|
if cfgFile != "" {
|
||||||
viper.SetConfigFile(cfgFile)
|
viper.SetConfigFile(cfgFile)
|
||||||
|
|
|
||||||
|
|
@ -323,12 +323,7 @@ func (p *EdgeConnectPlanner) getCurrentAppState(ctx context.Context, desired *Ap
|
||||||
// Extract outbound connections from the app
|
// Extract outbound connections from the app
|
||||||
current.OutboundConnections = make([]SecurityRule, len(app.RequiredOutboundConnections))
|
current.OutboundConnections = make([]SecurityRule, len(app.RequiredOutboundConnections))
|
||||||
for i, conn := range app.RequiredOutboundConnections {
|
for i, conn := range app.RequiredOutboundConnections {
|
||||||
current.OutboundConnections[i] = SecurityRule{
|
current.OutboundConnections[i] = SecurityRule(conn)
|
||||||
Protocol: conn.Protocol,
|
|
||||||
PortRangeMin: conn.PortRangeMin,
|
|
||||||
PortRangeMax: conn.PortRangeMax,
|
|
||||||
RemoteCIDR: conn.RemoteCIDR,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return current, nil
|
return current, nil
|
||||||
|
|
@ -470,7 +465,9 @@ func (p *EdgeConnectPlanner) calculateManifestHash(manifestPath string) (string,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to open manifest file: %w", err)
|
return "", fmt.Errorf("failed to open manifest file: %w", err)
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer func() {
|
||||||
|
_ = file.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
hasher := sha256.New()
|
hasher := sha256.New()
|
||||||
if _, err := io.Copy(hasher, file); err != nil {
|
if _, err := io.Copy(hasher, file); err != nil {
|
||||||
|
|
@ -505,18 +502,20 @@ func (p *EdgeConnectPlanner) estimateDeploymentDuration(plan *DeploymentPlan) ti
|
||||||
var duration time.Duration
|
var duration time.Duration
|
||||||
|
|
||||||
// App operations
|
// App operations
|
||||||
if plan.AppAction.Type == ActionCreate {
|
switch plan.AppAction.Type {
|
||||||
|
case ActionCreate:
|
||||||
duration += 30 * time.Second
|
duration += 30 * time.Second
|
||||||
} else if plan.AppAction.Type == ActionUpdate {
|
case ActionUpdate:
|
||||||
duration += 15 * time.Second
|
duration += 15 * time.Second
|
||||||
}
|
}
|
||||||
|
|
||||||
// Instance operations (can be done in parallel)
|
// Instance operations (can be done in parallel)
|
||||||
instanceDuration := time.Duration(0)
|
instanceDuration := time.Duration(0)
|
||||||
for _, action := range plan.InstanceActions {
|
for _, action := range plan.InstanceActions {
|
||||||
if action.Type == ActionCreate {
|
switch action.Type {
|
||||||
|
case ActionCreate:
|
||||||
instanceDuration = max(instanceDuration, 2*time.Minute)
|
instanceDuration = max(instanceDuration, 2*time.Minute)
|
||||||
} else if action.Type == ActionUpdate {
|
case ActionUpdate:
|
||||||
instanceDuration = max(instanceDuration, 1*time.Minute)
|
instanceDuration = max(instanceDuration, 1*time.Minute)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -323,12 +323,7 @@ func (p *EdgeConnectPlanner) getCurrentAppState(ctx context.Context, desired *Ap
|
||||||
// Extract outbound connections from the app
|
// Extract outbound connections from the app
|
||||||
current.OutboundConnections = make([]SecurityRule, len(app.RequiredOutboundConnections))
|
current.OutboundConnections = make([]SecurityRule, len(app.RequiredOutboundConnections))
|
||||||
for i, conn := range app.RequiredOutboundConnections {
|
for i, conn := range app.RequiredOutboundConnections {
|
||||||
current.OutboundConnections[i] = SecurityRule{
|
current.OutboundConnections[i] = SecurityRule(conn)
|
||||||
Protocol: conn.Protocol,
|
|
||||||
PortRangeMin: conn.PortRangeMin,
|
|
||||||
PortRangeMax: conn.PortRangeMax,
|
|
||||||
RemoteCIDR: conn.RemoteCIDR,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return current, nil
|
return current, nil
|
||||||
|
|
@ -470,7 +465,9 @@ func (p *EdgeConnectPlanner) calculateManifestHash(manifestPath string) (string,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to open manifest file: %w", err)
|
return "", fmt.Errorf("failed to open manifest file: %w", err)
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer func() {
|
||||||
|
_ = file.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
hasher := sha256.New()
|
hasher := sha256.New()
|
||||||
if _, err := io.Copy(hasher, file); err != nil {
|
if _, err := io.Copy(hasher, file); err != nil {
|
||||||
|
|
@ -505,18 +502,20 @@ func (p *EdgeConnectPlanner) estimateDeploymentDuration(plan *DeploymentPlan) ti
|
||||||
var duration time.Duration
|
var duration time.Duration
|
||||||
|
|
||||||
// App operations
|
// App operations
|
||||||
if plan.AppAction.Type == ActionCreate {
|
switch plan.AppAction.Type {
|
||||||
|
case ActionCreate:
|
||||||
duration += 30 * time.Second
|
duration += 30 * time.Second
|
||||||
} else if plan.AppAction.Type == ActionUpdate {
|
case ActionUpdate:
|
||||||
duration += 15 * time.Second
|
duration += 15 * time.Second
|
||||||
}
|
}
|
||||||
|
|
||||||
// Instance operations (can be done in parallel)
|
// Instance operations (can be done in parallel)
|
||||||
instanceDuration := time.Duration(0)
|
instanceDuration := time.Duration(0)
|
||||||
for _, action := range plan.InstanceActions {
|
for _, action := range plan.InstanceActions {
|
||||||
if action.Type == ActionCreate {
|
switch action.Type {
|
||||||
|
case ActionCreate:
|
||||||
instanceDuration = max(instanceDuration, 2*time.Minute)
|
instanceDuration = max(instanceDuration, 2*time.Minute)
|
||||||
} else if action.Type == ActionUpdate {
|
case ActionUpdate:
|
||||||
instanceDuration = max(instanceDuration, 1*time.Minute)
|
instanceDuration = max(instanceDuration, 1*time.Minute)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,9 @@ func (c *Client) CreateAppInstance(ctx context.Context, input *NewAppInstanceInp
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CreateAppInstance failed: %w", err)
|
return fmt.Errorf("CreateAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "CreateAppInstance")
|
return c.handleErrorResponse(resp, "CreateAppInstance")
|
||||||
|
|
@ -56,7 +58,9 @@ func (c *Client) ShowAppInstance(ctx context.Context, appInstKey AppInstanceKey,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return AppInstance{}, fmt.Errorf("ShowAppInstance failed: %w", err)
|
return AppInstance{}, fmt.Errorf("ShowAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return AppInstance{}, fmt.Errorf("app instance %s/%s: %w",
|
return AppInstance{}, fmt.Errorf("app instance %s/%s: %w",
|
||||||
|
|
@ -96,7 +100,9 @@ func (c *Client) ShowAppInstances(ctx context.Context, appInstKey AppInstanceKey
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ShowAppInstances failed: %w", err)
|
return nil, fmt.Errorf("ShowAppInstances failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
return nil, c.handleErrorResponse(resp, "ShowAppInstances")
|
return nil, c.handleErrorResponse(resp, "ShowAppInstances")
|
||||||
|
|
@ -125,7 +131,9 @@ func (c *Client) UpdateAppInstance(ctx context.Context, input *UpdateAppInstance
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("UpdateAppInstance failed: %w", err)
|
return fmt.Errorf("UpdateAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "UpdateAppInstance")
|
return c.handleErrorResponse(resp, "UpdateAppInstance")
|
||||||
|
|
@ -152,7 +160,9 @@ func (c *Client) RefreshAppInstance(ctx context.Context, appInstKey AppInstanceK
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("RefreshAppInstance failed: %w", err)
|
return fmt.Errorf("RefreshAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "RefreshAppInstance")
|
return c.handleErrorResponse(resp, "RefreshAppInstance")
|
||||||
|
|
@ -179,7 +189,9 @@ func (c *Client) DeleteAppInstance(ctx context.Context, appInstKey AppInstanceKe
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DeleteAppInstance failed: %w", err)
|
return fmt.Errorf("DeleteAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// 404 is acceptable for delete operations (already deleted)
|
// 404 is acceptable for delete operations (already deleted)
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,7 @@ func TestCreateAppInstance(t *testing.T) {
|
||||||
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -207,7 +207,7 @@ func TestShowAppInstance(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -254,7 +254,7 @@ func TestShowAppInstances(t *testing.T) {
|
||||||
{"data": {"key": {"organization": "testorg", "name": "inst2"}, "state": "Creating"}}
|
{"data": {"key": {"organization": "testorg", "name": "inst2"}, "state": "Creating"}}
|
||||||
`
|
`
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
w.Write([]byte(response))
|
_, _ = w.Write([]byte(response))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -361,7 +361,7 @@ func TestUpdateAppInstance(t *testing.T) {
|
||||||
assert.Equal(t, tt.input.AppInst.Key.Organization, input.AppInst.Key.Organization)
|
assert.Equal(t, tt.input.AppInst.Key.Organization, input.AppInst.Key.Organization)
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,9 @@ func (c *Client) CreateApp(ctx context.Context, input *NewAppInput) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CreateApp failed: %w", err)
|
return fmt.Errorf("CreateApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "CreateApp")
|
return c.handleErrorResponse(resp, "CreateApp")
|
||||||
|
|
@ -55,7 +57,9 @@ func (c *Client) ShowApp(ctx context.Context, appKey AppKey, region string) (App
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return App{}, fmt.Errorf("ShowApp failed: %w", err)
|
return App{}, fmt.Errorf("ShowApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return App{}, fmt.Errorf("app %s/%s version %s in region %s: %w",
|
return App{}, fmt.Errorf("app %s/%s version %s in region %s: %w",
|
||||||
|
|
@ -95,7 +99,9 @@ func (c *Client) ShowApps(ctx context.Context, appKey AppKey, region string) ([]
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ShowApps failed: %w", err)
|
return nil, fmt.Errorf("ShowApps failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
return nil, c.handleErrorResponse(resp, "ShowApps")
|
return nil, c.handleErrorResponse(resp, "ShowApps")
|
||||||
|
|
@ -124,7 +130,9 @@ func (c *Client) UpdateApp(ctx context.Context, input *UpdateAppInput) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("UpdateApp failed: %w", err)
|
return fmt.Errorf("UpdateApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "UpdateApp")
|
return c.handleErrorResponse(resp, "UpdateApp")
|
||||||
|
|
@ -151,7 +159,9 @@ func (c *Client) DeleteApp(ctx context.Context, appKey AppKey, region string) er
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DeleteApp failed: %w", err)
|
return fmt.Errorf("DeleteApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// 404 is acceptable for delete operations (already deleted)
|
// 404 is acceptable for delete operations (already deleted)
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
|
|
@ -238,7 +248,9 @@ func (c *Client) handleErrorResponse(resp *http.Response, operation string) erro
|
||||||
bodyBytes := []byte{}
|
bodyBytes := []byte{}
|
||||||
|
|
||||||
if resp.Body != nil {
|
if resp.Body != nil {
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
bodyBytes, _ = io.ReadAll(resp.Body)
|
bodyBytes, _ = io.ReadAll(resp.Body)
|
||||||
messages = append(messages, string(bodyBytes))
|
messages = append(messages, string(bodyBytes))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ func TestCreateApp(t *testing.T) {
|
||||||
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -139,7 +139,7 @@ func TestShowApp(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -186,7 +186,7 @@ func TestShowApps(t *testing.T) {
|
||||||
{"data": {"key": {"organization": "testorg", "name": "app2", "version": "1.0.0"}, "deployment": "docker"}}
|
{"data": {"key": {"organization": "testorg", "name": "app2", "version": "1.0.0"}, "deployment": "docker"}}
|
||||||
`
|
`
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
w.Write([]byte(response))
|
_, _ = w.Write([]byte(response))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -277,7 +277,7 @@ func TestUpdateApp(t *testing.T) {
|
||||||
assert.Equal(t, tt.input.App.Key.Organization, input.App.Key.Organization)
|
assert.Equal(t, tt.input.App.Key.Organization, input.App.Key.Organization)
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -407,13 +407,3 @@ func TestAPIError(t *testing.T) {
|
||||||
assert.Equal(t, 400, err.StatusCode)
|
assert.Equal(t, 400, err.StatusCode)
|
||||||
assert.Len(t, err.Messages, 2)
|
assert.Len(t, err.Messages, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to create a test server that handles streaming JSON responses
|
|
||||||
func createStreamingJSONServer(responses []string, statusCode int) *httptest.Server {
|
|
||||||
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.WriteHeader(statusCode)
|
|
||||||
for _, response := range responses {
|
|
||||||
w.Write([]byte(response + "\n"))
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,9 @@ func (u *UsernamePasswordProvider) retrieveToken(ctx context.Context) (string, e
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// Read response body - same as existing implementation
|
// Read response body - same as existing implementation
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ func TestUsernamePasswordProvider_Success(t *testing.T) {
|
||||||
// Return token
|
// Return token
|
||||||
response := map[string]string{"token": "dynamic-token-456"}
|
response := map[string]string{"token": "dynamic-token-456"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -75,7 +75,7 @@ func TestUsernamePasswordProvider_LoginFailure(t *testing.T) {
|
||||||
// Mock login server that returns error
|
// Mock login server that returns error
|
||||||
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(http.StatusUnauthorized)
|
w.WriteHeader(http.StatusUnauthorized)
|
||||||
w.Write([]byte("Invalid credentials"))
|
_, _ = w.Write([]byte("Invalid credentials"))
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -99,7 +99,7 @@ func TestUsernamePasswordProvider_TokenCaching(t *testing.T) {
|
||||||
callCount++
|
callCount++
|
||||||
response := map[string]string{"token": "cached-token-789"}
|
response := map[string]string{"token": "cached-token-789"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -128,7 +128,7 @@ func TestUsernamePasswordProvider_TokenExpiry(t *testing.T) {
|
||||||
callCount++
|
callCount++
|
||||||
response := map[string]string{"token": "refreshed-token-999"}
|
response := map[string]string{"token": "refreshed-token-999"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -157,7 +157,7 @@ func TestUsernamePasswordProvider_InvalidateToken(t *testing.T) {
|
||||||
callCount++
|
callCount++
|
||||||
response := map[string]string{"token": "new-token-after-invalidation"}
|
response := map[string]string{"token": "new-token-after-invalidation"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -185,7 +185,7 @@ func TestUsernamePasswordProvider_BadJSONResponse(t *testing.T) {
|
||||||
// Mock server returning invalid JSON
|
// Mock server returning invalid JSON
|
||||||
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
w.Write([]byte("invalid json response"))
|
_, _ = w.Write([]byte("invalid json response"))
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,9 @@ func (c *Client) CreateCloudlet(ctx context.Context, input *NewCloudletInput) er
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CreateCloudlet failed: %w", err)
|
return fmt.Errorf("CreateCloudlet failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "CreateCloudlet")
|
return c.handleErrorResponse(resp, "CreateCloudlet")
|
||||||
|
|
@ -49,7 +51,9 @@ func (c *Client) ShowCloudlet(ctx context.Context, cloudletKey CloudletKey, regi
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Cloudlet{}, fmt.Errorf("ShowCloudlet failed: %w", err)
|
return Cloudlet{}, fmt.Errorf("ShowCloudlet failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return Cloudlet{}, fmt.Errorf("cloudlet %s/%s in region %s: %w",
|
return Cloudlet{}, fmt.Errorf("cloudlet %s/%s in region %s: %w",
|
||||||
|
|
@ -89,7 +93,9 @@ func (c *Client) ShowCloudlets(ctx context.Context, cloudletKey CloudletKey, reg
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ShowCloudlets failed: %w", err)
|
return nil, fmt.Errorf("ShowCloudlets failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
return nil, c.handleErrorResponse(resp, "ShowCloudlets")
|
return nil, c.handleErrorResponse(resp, "ShowCloudlets")
|
||||||
|
|
@ -123,7 +129,9 @@ func (c *Client) DeleteCloudlet(ctx context.Context, cloudletKey CloudletKey, re
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DeleteCloudlet failed: %w", err)
|
return fmt.Errorf("DeleteCloudlet failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// 404 is acceptable for delete operations (already deleted)
|
// 404 is acceptable for delete operations (already deleted)
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
|
|
@ -151,7 +159,9 @@ func (c *Client) GetCloudletManifest(ctx context.Context, cloudletKey CloudletKe
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("GetCloudletManifest failed: %w", err)
|
return nil, fmt.Errorf("GetCloudletManifest failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return nil, fmt.Errorf("cloudlet manifest %s/%s in region %s: %w",
|
return nil, fmt.Errorf("cloudlet manifest %s/%s in region %s: %w",
|
||||||
|
|
@ -189,7 +199,9 @@ func (c *Client) GetCloudletResourceUsage(ctx context.Context, cloudletKey Cloud
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("GetCloudletResourceUsage failed: %w", err)
|
return nil, fmt.Errorf("GetCloudletResourceUsage failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return nil, fmt.Errorf("cloudlet resource usage %s/%s in region %s: %w",
|
return nil, fmt.Errorf("cloudlet resource usage %s/%s in region %s: %w",
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ func TestCreateCloudlet(t *testing.T) {
|
||||||
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -140,7 +140,7 @@ func TestShowCloudlet(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -187,7 +187,7 @@ func TestShowCloudlets(t *testing.T) {
|
||||||
{"data": {"key": {"organization": "cloudletorg", "name": "cloudlet2"}, "state": "Creating"}}
|
{"data": {"key": {"organization": "cloudletorg", "name": "cloudlet2"}, "state": "Creating"}}
|
||||||
`
|
`
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
w.Write([]byte(response))
|
_, _ = w.Write([]byte(response))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -312,7 +312,7 @@ func TestGetCloudletManifest(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -380,7 +380,7 @@ func TestGetCloudletResourceUsage(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,9 @@ func (c *Client) CreateAppInstance(ctx context.Context, input *NewAppInstanceInp
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CreateAppInstance failed: %w", err)
|
return fmt.Errorf("CreateAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "CreateAppInstance")
|
return c.handleErrorResponse(resp, "CreateAppInstance")
|
||||||
|
|
@ -58,7 +60,9 @@ func (c *Client) ShowAppInstance(ctx context.Context, appInstKey AppInstanceKey,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return AppInstance{}, fmt.Errorf("ShowAppInstance failed: %w", err)
|
return AppInstance{}, fmt.Errorf("ShowAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return AppInstance{}, fmt.Errorf("app instance %s/%s: %w",
|
return AppInstance{}, fmt.Errorf("app instance %s/%s: %w",
|
||||||
|
|
@ -98,7 +102,9 @@ func (c *Client) ShowAppInstances(ctx context.Context, appInstKey AppInstanceKey
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ShowAppInstances failed: %w", err)
|
return nil, fmt.Errorf("ShowAppInstances failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
return nil, c.handleErrorResponse(resp, "ShowAppInstances")
|
return nil, c.handleErrorResponse(resp, "ShowAppInstances")
|
||||||
|
|
@ -127,7 +133,9 @@ func (c *Client) UpdateAppInstance(ctx context.Context, input *UpdateAppInstance
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("UpdateAppInstance failed: %w", err)
|
return fmt.Errorf("UpdateAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "UpdateAppInstance")
|
return c.handleErrorResponse(resp, "UpdateAppInstance")
|
||||||
|
|
@ -154,7 +162,9 @@ func (c *Client) RefreshAppInstance(ctx context.Context, appInstKey AppInstanceK
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("RefreshAppInstance failed: %w", err)
|
return fmt.Errorf("RefreshAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "RefreshAppInstance")
|
return c.handleErrorResponse(resp, "RefreshAppInstance")
|
||||||
|
|
@ -181,7 +191,9 @@ func (c *Client) DeleteAppInstance(ctx context.Context, appInstKey AppInstanceKe
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DeleteAppInstance failed: %w", err)
|
return fmt.Errorf("DeleteAppInstance failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// 404 is acceptable for delete operations (already deleted)
|
// 404 is acceptable for delete operations (already deleted)
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,7 @@ func TestCreateAppInstance(t *testing.T) {
|
||||||
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -207,7 +207,7 @@ func TestShowAppInstance(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -254,7 +254,7 @@ func TestShowAppInstances(t *testing.T) {
|
||||||
{"data": {"key": {"organization": "testorg", "name": "inst2"}, "state": "Creating"}}
|
{"data": {"key": {"organization": "testorg", "name": "inst2"}, "state": "Creating"}}
|
||||||
`
|
`
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
w.Write([]byte(response))
|
_, _ = w.Write([]byte(response))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -361,7 +361,7 @@ func TestUpdateAppInstance(t *testing.T) {
|
||||||
assert.Equal(t, tt.input.AppInst.Key.Organization, input.AppInst.Key.Organization)
|
assert.Equal(t, tt.input.AppInst.Key.Organization, input.AppInst.Key.Organization)
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,9 @@ func (c *Client) CreateApp(ctx context.Context, input *NewAppInput) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CreateApp failed: %w", err)
|
return fmt.Errorf("CreateApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "CreateApp")
|
return c.handleErrorResponse(resp, "CreateApp")
|
||||||
|
|
@ -56,7 +58,9 @@ func (c *Client) ShowApp(ctx context.Context, appKey AppKey, region string) (App
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return App{}, fmt.Errorf("ShowApp failed: %w", err)
|
return App{}, fmt.Errorf("ShowApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return App{}, fmt.Errorf("app %s/%s version %s in region %s: %w",
|
return App{}, fmt.Errorf("app %s/%s version %s in region %s: %w",
|
||||||
|
|
@ -96,7 +100,9 @@ func (c *Client) ShowApps(ctx context.Context, appKey AppKey, region string) ([]
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ShowApps failed: %w", err)
|
return nil, fmt.Errorf("ShowApps failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
return nil, c.handleErrorResponse(resp, "ShowApps")
|
return nil, c.handleErrorResponse(resp, "ShowApps")
|
||||||
|
|
@ -125,7 +131,9 @@ func (c *Client) UpdateApp(ctx context.Context, input *UpdateAppInput) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("UpdateApp failed: %w", err)
|
return fmt.Errorf("UpdateApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "UpdateApp")
|
return c.handleErrorResponse(resp, "UpdateApp")
|
||||||
|
|
@ -152,7 +160,9 @@ func (c *Client) DeleteApp(ctx context.Context, appKey AppKey, region string) er
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DeleteApp failed: %w", err)
|
return fmt.Errorf("DeleteApp failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// 404 is acceptable for delete operations (already deleted)
|
// 404 is acceptable for delete operations (already deleted)
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
|
|
@ -254,7 +264,9 @@ func (c *Client) handleErrorResponse(resp *http.Response, operation string) erro
|
||||||
bodyBytes := []byte{}
|
bodyBytes := []byte{}
|
||||||
|
|
||||||
if resp.Body != nil {
|
if resp.Body != nil {
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
bodyBytes, _ = io.ReadAll(resp.Body)
|
bodyBytes, _ = io.ReadAll(resp.Body)
|
||||||
messages = append(messages, string(bodyBytes))
|
messages = append(messages, string(bodyBytes))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ func TestCreateApp(t *testing.T) {
|
||||||
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -139,7 +139,7 @@ func TestShowApp(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -186,7 +186,7 @@ func TestShowApps(t *testing.T) {
|
||||||
{"data": {"key": {"organization": "testorg", "name": "app2", "version": "1.0.0"}, "deployment": "docker"}}
|
{"data": {"key": {"organization": "testorg", "name": "app2", "version": "1.0.0"}, "deployment": "docker"}}
|
||||||
`
|
`
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
w.Write([]byte(response))
|
_, _ = w.Write([]byte(response))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -277,7 +277,7 @@ func TestUpdateApp(t *testing.T) {
|
||||||
assert.Equal(t, tt.input.App.Key.Organization, input.App.Key.Organization)
|
assert.Equal(t, tt.input.App.Key.Organization, input.App.Key.Organization)
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -407,13 +407,3 @@ func TestAPIError(t *testing.T) {
|
||||||
assert.Equal(t, 400, err.StatusCode)
|
assert.Equal(t, 400, err.StatusCode)
|
||||||
assert.Len(t, err.Messages, 2)
|
assert.Len(t, err.Messages, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to create a test server that handles streaming JSON responses
|
|
||||||
func createStreamingJSONServer(responses []string, statusCode int) *httptest.Server {
|
|
||||||
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.WriteHeader(statusCode)
|
|
||||||
for _, response := range responses {
|
|
||||||
w.Write([]byte(response + "\n"))
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,9 @@ func (u *UsernamePasswordProvider) retrieveToken(ctx context.Context) (string, e
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// Read response body - same as existing implementation
|
// Read response body - same as existing implementation
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ func TestUsernamePasswordProvider_Success(t *testing.T) {
|
||||||
// Return token
|
// Return token
|
||||||
response := map[string]string{"token": "dynamic-token-456"}
|
response := map[string]string{"token": "dynamic-token-456"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -75,7 +75,7 @@ func TestUsernamePasswordProvider_LoginFailure(t *testing.T) {
|
||||||
// Mock login server that returns error
|
// Mock login server that returns error
|
||||||
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(http.StatusUnauthorized)
|
w.WriteHeader(http.StatusUnauthorized)
|
||||||
w.Write([]byte("Invalid credentials"))
|
_, _ = w.Write([]byte("Invalid credentials"))
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -99,7 +99,7 @@ func TestUsernamePasswordProvider_TokenCaching(t *testing.T) {
|
||||||
callCount++
|
callCount++
|
||||||
response := map[string]string{"token": "cached-token-789"}
|
response := map[string]string{"token": "cached-token-789"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -128,7 +128,7 @@ func TestUsernamePasswordProvider_TokenExpiry(t *testing.T) {
|
||||||
callCount++
|
callCount++
|
||||||
response := map[string]string{"token": "refreshed-token-999"}
|
response := map[string]string{"token": "refreshed-token-999"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -157,7 +157,7 @@ func TestUsernamePasswordProvider_InvalidateToken(t *testing.T) {
|
||||||
callCount++
|
callCount++
|
||||||
response := map[string]string{"token": "new-token-after-invalidation"}
|
response := map[string]string{"token": "new-token-after-invalidation"}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(response)
|
_ = json.NewEncoder(w).Encode(response)
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
@ -185,7 +185,7 @@ func TestUsernamePasswordProvider_BadJSONResponse(t *testing.T) {
|
||||||
// Mock server returning invalid JSON
|
// Mock server returning invalid JSON
|
||||||
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
loginServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
w.Write([]byte("invalid json response"))
|
_, _ = w.Write([]byte("invalid json response"))
|
||||||
}))
|
}))
|
||||||
defer loginServer.Close()
|
defer loginServer.Close()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,9 @@ func (c *Client) CreateCloudlet(ctx context.Context, input *NewCloudletInput) er
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("CreateCloudlet failed: %w", err)
|
return fmt.Errorf("CreateCloudlet failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 {
|
if resp.StatusCode >= 400 {
|
||||||
return c.handleErrorResponse(resp, "CreateCloudlet")
|
return c.handleErrorResponse(resp, "CreateCloudlet")
|
||||||
|
|
@ -49,7 +51,9 @@ func (c *Client) ShowCloudlet(ctx context.Context, cloudletKey CloudletKey, regi
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Cloudlet{}, fmt.Errorf("ShowCloudlet failed: %w", err)
|
return Cloudlet{}, fmt.Errorf("ShowCloudlet failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return Cloudlet{}, fmt.Errorf("cloudlet %s/%s in region %s: %w",
|
return Cloudlet{}, fmt.Errorf("cloudlet %s/%s in region %s: %w",
|
||||||
|
|
@ -89,7 +93,9 @@ func (c *Client) ShowCloudlets(ctx context.Context, cloudletKey CloudletKey, reg
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ShowCloudlets failed: %w", err)
|
return nil, fmt.Errorf("ShowCloudlets failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
return nil, c.handleErrorResponse(resp, "ShowCloudlets")
|
return nil, c.handleErrorResponse(resp, "ShowCloudlets")
|
||||||
|
|
@ -123,7 +129,9 @@ func (c *Client) DeleteCloudlet(ctx context.Context, cloudletKey CloudletKey, re
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DeleteCloudlet failed: %w", err)
|
return fmt.Errorf("DeleteCloudlet failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// 404 is acceptable for delete operations (already deleted)
|
// 404 is acceptable for delete operations (already deleted)
|
||||||
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
if resp.StatusCode >= 400 && resp.StatusCode != http.StatusNotFound {
|
||||||
|
|
@ -151,7 +159,9 @@ func (c *Client) GetCloudletManifest(ctx context.Context, cloudletKey CloudletKe
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("GetCloudletManifest failed: %w", err)
|
return nil, fmt.Errorf("GetCloudletManifest failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return nil, fmt.Errorf("cloudlet manifest %s/%s in region %s: %w",
|
return nil, fmt.Errorf("cloudlet manifest %s/%s in region %s: %w",
|
||||||
|
|
@ -189,7 +199,9 @@ func (c *Client) GetCloudletResourceUsage(ctx context.Context, cloudletKey Cloud
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("GetCloudletResourceUsage failed: %w", err)
|
return nil, fmt.Errorf("GetCloudletResourceUsage failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
return nil, fmt.Errorf("cloudlet resource usage %s/%s in region %s: %w",
|
return nil, fmt.Errorf("cloudlet resource usage %s/%s in region %s: %w",
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ func TestCreateCloudlet(t *testing.T) {
|
||||||
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -140,7 +140,7 @@ func TestShowCloudlet(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -187,7 +187,7 @@ func TestShowCloudlets(t *testing.T) {
|
||||||
{"data": {"key": {"organization": "cloudletorg", "name": "cloudlet2"}, "state": "Creating"}}
|
{"data": {"key": {"organization": "cloudletorg", "name": "cloudlet2"}, "state": "Creating"}}
|
||||||
`
|
`
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
w.Write([]byte(response))
|
_, _ = w.Write([]byte(response))
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
||||||
|
|
@ -312,7 +312,7 @@ func TestGetCloudletManifest(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
@ -380,7 +380,7 @@ func TestGetCloudletResourceUsage(t *testing.T) {
|
||||||
|
|
||||||
w.WriteHeader(tt.mockStatusCode)
|
w.WriteHeader(tt.mockStatusCode)
|
||||||
if tt.mockResponse != "" {
|
if tt.mockResponse != "" {
|
||||||
w.Write([]byte(tt.mockResponse))
|
_, _ = w.Write([]byte(tt.mockResponse))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer server.Close()
|
defer server.Close()
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,9 @@ func (t *Transport) CallJSON(ctx context.Context, method, url string, body inter
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// Read response body
|
// Read response body
|
||||||
respBody, err := io.ReadAll(resp.Body)
|
respBody, err := io.ReadAll(resp.Body)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue