Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

move all static error messages to errors.go #310

Merged
merged 1 commit into from Feb 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 1 addition & 2 deletions admin_run.go
Expand Up @@ -2,7 +2,6 @@ package tfe

import (
"context"
"errors"
"fmt"
"net/url"
"strings"
Expand Down Expand Up @@ -102,7 +101,7 @@ type AdminRunForceCancelOptions struct {
// https://www.terraform.io/docs/cloud/api/admin/runs.html#force-a-run-into-the-quot-cancelled-quot-state
func (s *adminRuns) ForceCancel(ctx context.Context, runID string, options AdminRunForceCancelOptions) error {
if !validStringID(&runID) {
return errors.New("invalid value for run ID")
return ErrInvalidRunID
}

u := fmt.Sprintf("admin/runs/%s/actions/force-cancel", url.QueryEscape(runID))
Expand Down
206 changes: 160 additions & 46 deletions errors.go
Expand Up @@ -12,17 +12,25 @@ var (
// ErrResourceNotFound is returned when receiving a 404.
ErrResourceNotFound = errors.New("resource not found")

// ErrRequiredName is returned when a name option is not present.
ErrRequiredName = errors.New("name is required")

// ErrInvalidName is returned when the name option has invalid value.
ErrInvalidName = errors.New("invalid value for name")

// ErrMissingDirectory is returned when the path does not have an existing directory.
ErrMissingDirectory = errors.New("path needs to be an existing directory")
)

// Resource Errors
// Options/fields that cannot be defined
var (
ErrUnsupportedOperations = errors.New("operations is deprecated and cannot be specified when execution mode is used")

ErrUnsupportedPrivateKey = errors.New("private Key can only be present with Azure DevOps Server service provider")
)

// internal errors
var (
ErrInvalidRequestBody = errors.New("go-tfe bug: DELETE/PATCH/POST body must be nil, ptr, or ptr slice")

ErrInvalidStructFormat = errors.New("go-tfe bug: struct can't use both json and jsonapi attributes")
)

// Run Errors
var (
// ErrWorkspaceLocked is returned when trying to lock a
// locked workspace.
Expand All @@ -35,74 +43,180 @@ var (
// ErrWorkspaceLockedByRun is returned when trying to unlock a
// workspace locked by a run
ErrWorkspaceLockedByRun = errors.New("unable to unlock workspace locked by run")
)

// ErrInvalidWorkspaceID is returned when the workspace ID is invalid.
// Invalid values for resources/struct fields
var (
ErrInvalidWorkspaceID = errors.New("invalid value for workspace ID")

// ErrInvalidWorkspaceValue is returned when workspace value is invalid.
ErrInvalidWorkspaceValue = errors.New("invalid value for workspace")

// ErrWorkspacesRequired is returned when the Workspaces are not present.
ErrWorkspacesRequired = errors.New("workspaces is required")
ErrInvalidTerraformVersionID = errors.New("invalid value for terraform version ID")

// ErrWorkspaceMinLimit is returned when the length of Workspaces is 0.
ErrWorkspaceMinLimit = errors.New("must provide at least one workspace")
ErrInvalidTerraformVersionType = errors.New("invalid type for terraform version. Please use 'terraform-version'")

// ErrMissingTagIdentifier is returned when tag resource identifiers are invalid
ErrMissingTagIdentifier = errors.New("must specify at least one tag by ID or name")
ErrInvalidConfigVersionID = errors.New("invalid value for configuration version ID")

// Run/Apply errors
ErrInvalidCostEstimateID = errors.New("invalid value for cost estimate ID")

ErrInvalidSMTPAuth = errors.New("invalid smtp auth type")

ErrInvalidAgentPoolID = errors.New("invalid value for agent pool ID")

ErrInvalidAgentTokenID = errors.New("invalid value for agent token ID")

// ErrInvalidRunID is returned when the run ID is invalid.
ErrInvalidRunID = errors.New("invalid value for run ID")

// ErrInvalidApplyID is returned when the apply ID is invalid.
ErrInvalidApplyID = errors.New("invalid value for apply ID")

// Organzation errors

// ErrInvalidOrg is returned when the organization option has an invalid value.
ErrInvalidOrg = errors.New("invalid value for organization")

// Agent errors
ErrInvalidName = errors.New("invalid value for name")

// ErrInvalidAgentPoolID is returned when the agent pool ID is invalid.
ErrInvalidAgentPoolID = errors.New("invalid value for agent pool ID")
ErrInvalidNotificationConfigID = errors.New("invalid value for notification configuration ID")

// ErrInvalidAgentTokenID is returned when the agent toek ID is invalid.
ErrInvalidAgentTokenID = errors.New("invalid value for agent token ID")
ErrInvalidMembership = errors.New("invalid value for membership")

// Token errors
ErrInvalidMembershipIDs = errors.New("invalid value for organization membership ids")

// ErrAgentTokenDescription is returned when the description is blank.
ErrAgentTokenDescription = errors.New("agent token description can't be blank")
ErrInvalidOauthClientID = errors.New("invalid value for OAuth client ID")

// Config errors
ErrInvalidOauthTokenID = errors.New("invalid value for OAuth token ID")

// ErrInvalidConfigVersionID is returned when the configuration version ID is invalid.
ErrInvalidConfigVersionID = errors.New("invalid value for configuration version ID")
ErrInvalidPolicySetID = errors.New("invalid value for policy set ID")

// Cost Esimation Errors
ErrInvalidPolicyCheckID = errors.New("invalid value for policy check ID")

// ErrInvalidCostEstimateID is returned when the cost estimate ID is invalid.
ErrInvalidCostEstimateID = errors.New("invalid value for cost estimate ID")
ErrInvalidTag = errors.New("invalid tag id")

ErrInvalidPlanExportID = errors.New("invalid value for plan export ID")

ErrInvalidPlanID = errors.New("invalid value for plan ID")

ErrInvalidParamID = errors.New("invalid value for parameter ID")

ErrInvalidPolicyID = errors.New("invalid value for policy ID")

ErrInvalidProvider = errors.New("invalid value for provider")

// User
ErrInvalidVersion = errors.New("invalid value for version")

ErrInvalidRunTriggerID = errors.New("invalid value for run trigger ID")

ErrInvalidSHHKeyID = errors.New("invalid value for SSH key ID")

ErrInvalidStateVerID = errors.New("invalid value for state version ID")

ErrInvalidAccessTeamID = errors.New("invalid value for team access ID")

ErrInvalidTeamID = errors.New("invalid value for team ID")

ErrInvalidUsernames = errors.New("invalid value for usernames")

ErrInvalidUserID = errors.New("invalid value for user ID")

// ErrInvalidUservalue is invalid.
ErrInvalidUserValue = errors.New("invalid value for user")

// Settings
ErrInvalidTokenID = errors.New("invalid value for token ID")

// ErrInvalidSMTPAuth is returned when the smtp auth type is not valid.
ErrInvalidSMTPAuth = errors.New("invalid smtp auth type")
ErrInvalidCategory = errors.New("category must be policy-set")

// Terraform Versions
ErrInvalidPolicies = errors.New("must provide at least one policy")

// ErrInvalidTerraformVersionID is returned when the ID for a terraform
// version is invalid.
ErrInvalidTerraformVersionID = errors.New("invalid value for terraform version ID")
ErrInvalidVariableID = errors.New("invalid value for variable ID")
)

// ErrInvalidTerraformVersionType is returned when the type is not valid.
ErrInvalidTerraformVersionType = errors.New("invalid type for terraform version. Please use 'terraform-version'")
// Missing required field/option
var (
ErrRequiredAccess = errors.New("access is required")

ErrRequiredAgentPoolID = errors.New("'agent' execution mode requires an agent pool ID to be specified")

ErrRequiredAgentMode = errors.New("specifying an agent pool ID requires 'agent' execution mode")

ErrRequiredCategory = errors.New("category is required")

ErrRequiredDestinationType = errors.New("destination type is required")

ErrRequiredDataType = errors.New("data type is required")

ErrRequiredKey = errors.New("key is required")

ErrRequiredName = errors.New("name is required")

ErrRequiredEnabled = errors.New("enabled is required")

ErrRequiredEnforce = errors.New("enforce is required")

ErrRequiredEnforcementPath = errors.New("enforcement path is required")

ErrRequiredEnforcementMode = errors.New("enforcement mode is required")

ErrRequiredEmail = errors.New("email is required")

ErrRequiredM5 = errors.New("MD5 is required")

ErrRequiredURL = errors.New("url is required")

ErrRequiredAPIURL = errors.New("API URL is required")

ErrRequiredHTTPURL = errors.New("HTTP URL is required")

ErrRequiredServiceProvider = errors.New("service provider is required")

ErrRequiredProvider = errors.New("provider is required")

ErrRequiredOauthToken = errors.New("OAuth token is required")

ErrRequiredOauthTokenID = errors.New("oauth token ID is required")

ErrMissingTagIdentifier = errors.New("must specify at least one tag by ID or name")

ErrAgentTokenDescription = errors.New("agent token description can't be blank")

ErrRequiredTagID = errors.New("you must specify at least one tag id to remove")

ErrRequiredTagWorkspaceID = errors.New("you must specify at least one workspace to add tag to")

ErrRequiredWorkspace = errors.New("workspace is required")

ErrRequiredWorkspaceID = errors.New("workspace ID is required")

ErrWorkspacesRequired = errors.New("workspaces is required")

ErrWorkspaceMinLimit = errors.New("must provide at least one workspace")

ErrRequiredPlan = errors.New("plan is required")

ErrRequiredPolicies = errors.New("policies is required")

ErrRequiredVersion = errors.New("version is required")

ErrRequiredVCSRepo = errors.New("vcs repo is required")

ErrRequiredIdentifier = errors.New("identifier is required")

ErrRequiredDisplayIdentifier = errors.New("display identifier is required")

ErrRequiredSourceable = errors.New("sourceable is required")

ErrRequiredValue = errors.New("value is required")

ErrRequiredOrg = errors.New("organization is required")

ErrRequiredTeam = errors.New("team is required")

ErrRequiredStateVerListOps = errors.New("StateVersionListOptions is required")

ErrRequireTeamAccessListOps = errors.New("TeamAccessListOptions is required")

ErrRequiredSerial = errors.New("serial is required")

ErrRequiredState = errors.New("state is required")

ErrRequiredSHHKeyID = errors.New("SSH key ID is required")

ErrRequiredOnlyOneField = errors.New("only one of usernames or organization membership ids can be provided")

ErrRequiredUsernameOrMembershipIds = errors.New("usernames or organization membership ids are required")
)
15 changes: 7 additions & 8 deletions notification_configuration.go
Expand Up @@ -2,7 +2,6 @@ package tfe

import (
"context"
"errors"
"fmt"
"net/url"
"time"
Expand Down Expand Up @@ -164,18 +163,18 @@ type NotificationConfigurationCreateOptions struct {

func (o NotificationConfigurationCreateOptions) valid() error {
if o.DestinationType == nil {
return errors.New("destination type is required")
return ErrRequiredDestinationType
}
if o.Enabled == nil {
return errors.New("enabled is required")
return ErrRequiredEnabled
}
if !validString(o.Name) {
return ErrRequiredName
}

if *o.DestinationType == NotificationDestinationTypeGeneric || *o.DestinationType == NotificationDestinationTypeSlack {
if o.URL == nil {
return errors.New("url is required")
return ErrRequiredURL
}
}
return nil
Expand Down Expand Up @@ -208,7 +207,7 @@ func (s *notificationConfigurations) Create(ctx context.Context, workspaceID str
// Read a notification configuration by its ID.
func (s *notificationConfigurations) Read(ctx context.Context, notificationConfigurationID string) (*NotificationConfiguration, error) {
if !validStringID(&notificationConfigurationID) {
return nil, errors.New("invalid value for notification configuration ID")
return nil, ErrInvalidNotificationConfigID
}

u := fmt.Sprintf("notification-configurations/%s", url.QueryEscape(notificationConfigurationID))
Expand Down Expand Up @@ -261,7 +260,7 @@ type NotificationConfigurationUpdateOptions struct {
// Updates a notification configuration with the given options.
func (s *notificationConfigurations) Update(ctx context.Context, notificationConfigurationID string, options NotificationConfigurationUpdateOptions) (*NotificationConfiguration, error) {
if !validStringID(&notificationConfigurationID) {
return nil, errors.New("invalid value for notification configuration ID")
return nil, ErrInvalidNotificationConfigID
}

u := fmt.Sprintf("notification-configurations/%s", url.QueryEscape(notificationConfigurationID))
Expand All @@ -282,7 +281,7 @@ func (s *notificationConfigurations) Update(ctx context.Context, notificationCon
// Delete a notifications configuration by its ID.
func (s *notificationConfigurations) Delete(ctx context.Context, notificationConfigurationID string) error {
if !validStringID(&notificationConfigurationID) {
return errors.New("invalid value for notification configuration ID")
return ErrInvalidNotificationConfigID
}

u := fmt.Sprintf("notification-configurations/%s", url.QueryEscape(notificationConfigurationID))
Expand All @@ -298,7 +297,7 @@ func (s *notificationConfigurations) Delete(ctx context.Context, notificationCon
// payload to the configured url.
func (s *notificationConfigurations) Verify(ctx context.Context, notificationConfigurationID string) (*NotificationConfiguration, error) {
if !validStringID(&notificationConfigurationID) {
return nil, errors.New("invalid value for notification configuration ID")
return nil, ErrInvalidNotificationConfigID
}

u := fmt.Sprintf(
Expand Down
10 changes: 5 additions & 5 deletions notification_configuration_integration_test.go
Expand Up @@ -125,7 +125,7 @@ func TestNotificationConfigurationCreate(t *testing.T) {

nc, err := client.NotificationConfigurations.Create(ctx, wTest.ID, options)
assert.Nil(t, nc)
assert.EqualError(t, err, "url is required")
assert.Equal(t, err, ErrRequiredURL)
})

t.Run("without a valid workspace", func(t *testing.T) {
Expand Down Expand Up @@ -178,7 +178,7 @@ func TestNotificationConfigurationRead(t *testing.T) {

t.Run("when the notification configuration ID is invalid", func(t *testing.T) {
_, err := client.NotificationConfigurations.Read(ctx, badIdentifier)
assert.EqualError(t, err, "invalid value for notification configuration ID")
assert.Equal(t, err, ErrInvalidNotificationConfigID)
})
}

Expand Down Expand Up @@ -265,7 +265,7 @@ func TestNotificationConfigurationUpdate(t *testing.T) {

t.Run("when the notification configuration ID is invalid", func(t *testing.T) {
_, err := client.NotificationConfigurations.Update(ctx, badIdentifier, NotificationConfigurationUpdateOptions{})
assert.EqualError(t, err, "invalid value for notification configuration ID")
assert.Equal(t, err, ErrInvalidNotificationConfigID)
})
}

Expand Down Expand Up @@ -293,7 +293,7 @@ func TestNotificationConfigurationDelete(t *testing.T) {

t.Run("when the notification configuration ID is invalid", func(t *testing.T) {
err := client.NotificationConfigurations.Delete(ctx, badIdentifier)
assert.EqualError(t, err, "invalid value for notification configuration ID")
assert.Equal(t, err, ErrInvalidNotificationConfigID)
})
}

Expand All @@ -316,6 +316,6 @@ func TestNotificationConfigurationVerify(t *testing.T) {

t.Run("when the notification configuration ID is invalid", func(t *testing.T) {
_, err := client.NotificationConfigurations.Verify(ctx, badIdentifier)
assert.EqualError(t, err, "invalid value for notification configuration ID")
assert.Equal(t, err, ErrInvalidNotificationConfigID)
})
}