diff --git a/errors.go b/errors.go index 6bba23cf6..97f31ff5b 100644 --- a/errors.go +++ b/errors.go @@ -82,7 +82,7 @@ var ( // ErrInvalidConfigVersionID is returned when the configuration version ID is invalid. ErrInvalidConfigVersionID = errors.New("invalid value for configuration version ID") - // Cost Esimation Errors + // Cost Estimation Errors // ErrInvalidCostEstimateID is returned when the cost estimate ID is invalid. ErrInvalidCostEstimateID = errors.New("invalid value for cost estimate ID") @@ -105,4 +105,31 @@ var ( // ErrInvalidTerraformVersionType is returned when the type is not valid. ErrInvalidTerraformVersionType = errors.New("invalid type for terraform version. Please use 'terraform-version'") + + // Registry Errors + + // ErrInvalidNamespace is returned when the namespace is not valid. + ErrInvalidNamespace = errors.New("invalid value for namespace") + + // ErrPrivateProviderNamespaceDoesntMatchOrganization is returned if the provider namespace doesn't + // match the organization name + ErrPrivateProviderNamespaceDoesntMatchOrganization = errors.New("namespace must match organization name for private providers") + + // ErrInvalidProvider is returned when the provider is not valid. + ErrInvalidProvider = errors.New("invalid value for provider") + + // ErrInvalidRegistryName is returned when a registry-name is not valid. + ErrInvalidRegistryName = errors.New("invalid value for registry-name") + + // ErrInvalidRegistryNameType is returned when the type is not valid. + ErrInvalidRegistryNameType = errors.New("invalid type for registry-name. Please use 'RegistryName'") + + // ErrInvalidKeyID is returned when a key-id is not valid. + ErrInvalidKeyID = errors.New("invalid value for key-id") + + // ErrInvalidVersion is returned when the version is not valid. + ErrInvalidVersion = errors.New("invalid value for version") + + // ErrPrivateRegistryRequired is returned when private registry is required. + ErrPrivateRegistryRequired = errors.New("only private registry is allowed") ) diff --git a/registry_provider.go b/registry_provider.go index 531596ece..07ebf5bd3 100644 --- a/registry_provider.go +++ b/registry_provider.go @@ -2,7 +2,6 @@ package tfe import ( "context" - "errors" "fmt" "net/url" ) @@ -42,6 +41,14 @@ const ( PublicRegistry RegistryName = "public" ) +func (rn RegistryName) valid() error { + switch rn { + case PrivateRegistry, PublicRegistry: + return nil + } + return ErrInvalidRegistryName +} + // RegistryProvider represents a registry provider type RegistryProvider struct { ID string `jsonapi:"primary,registry-providers"` @@ -120,20 +127,14 @@ type RegistryProviderCreateOptions struct { } func (o RegistryProviderCreateOptions) valid() error { - if !validString(&o.Name) { - return ErrRequiredName - } if !validStringID(&o.Name) { return ErrInvalidName } - if !validString(&o.Namespace) { - return errors.New("namespace is required") - } if !validStringID(&o.Namespace) { - return errors.New("invalid value for namespace") + return ErrInvalidNamespace } - if !validString((*string)(&o.RegistryName)) { - return errors.New("registry-name is required") + if err := o.RegistryName.valid(); err != nil { + return err } return nil } @@ -148,7 +149,7 @@ func (r *registryProviders) Create(ctx context.Context, organization string, opt // Private providers must match their namespace and organization name // This is enforced by the API as well if options.RegistryName == PrivateRegistry && organization != options.Namespace { - return nil, errors.New("namespace must match organization name for private providers") + return nil, ErrPrivateProviderNamespaceDoesntMatchOrganization } u := fmt.Sprintf( @@ -180,20 +181,14 @@ func (id RegistryProviderID) valid() error { if !validStringID(&id.OrganizationName) { return ErrInvalidOrg } - if !validString(&id.Name) { - return ErrRequiredName - } if !validStringID(&id.Name) { return ErrInvalidName } - if !validString(&id.Namespace) { - return errors.New("namespace is required") - } if !validStringID(&id.Namespace) { - return errors.New("invalid value for namespace") + return ErrInvalidNamespace } - if !validString((*string)(&id.RegistryName)) { - return errors.New("registry-name is required") + if err := id.RegistryName.valid(); err != nil { + return err } return nil } diff --git a/registry_provider_integration_test.go b/registry_provider_integration_test.go index 635475742..0fc9d789c 100644 --- a/registry_provider_integration_test.go +++ b/registry_provider_integration_test.go @@ -198,7 +198,7 @@ func TestRegistryProvidersCreate(t *testing.T) { } rm, err := client.RegistryProviders.Create(ctx, orgTest.Name, options) assert.Nil(t, rm) - assert.EqualError(t, err, ErrRequiredName.Error()) + assert.EqualError(t, err, ErrInvalidName.Error()) }) t.Run("with an invalid name", func(t *testing.T) { @@ -219,7 +219,7 @@ func TestRegistryProvidersCreate(t *testing.T) { } rm, err := client.RegistryProviders.Create(ctx, orgTest.Name, options) assert.Nil(t, rm) - assert.EqualError(t, err, "namespace is required") + assert.EqualError(t, err, ErrInvalidNamespace.Error()) }) t.Run("with an invalid namespace", func(t *testing.T) { @@ -230,7 +230,7 @@ func TestRegistryProvidersCreate(t *testing.T) { } rm, err := client.RegistryProviders.Create(ctx, orgTest.Name, options) assert.Nil(t, rm) - assert.EqualError(t, err, "invalid value for namespace") + assert.EqualError(t, err, ErrInvalidNamespace.Error()) }) t.Run("without a registry-name", func(t *testing.T) { @@ -240,7 +240,18 @@ func TestRegistryProvidersCreate(t *testing.T) { } rm, err := client.RegistryProviders.Create(ctx, orgTest.Name, options) assert.Nil(t, rm) - assert.EqualError(t, err, "registry-name is required") + assert.EqualError(t, err, ErrInvalidRegistryName.Error()) + }) + + t.Run("with an invalid registry-name", func(t *testing.T) { + options := RegistryProviderCreateOptions{ + Name: "name", + Namespace: "namespace", + RegistryName: "invalid", + } + rm, err := client.RegistryProviders.Create(ctx, orgTest.Name, options) + assert.Nil(t, rm) + assert.EqualError(t, err, ErrInvalidRegistryName.Error()) }) }) @@ -263,7 +274,7 @@ func TestRegistryProvidersCreate(t *testing.T) { } rm, err := client.RegistryProviders.Create(ctx, orgTest.Name, options) assert.Nil(t, rm) - assert.EqualError(t, err, "namespace must match organization name for private providers") + assert.EqualError(t, err, ErrPrivateProviderNamespaceDoesntMatchOrganization.Error()) }) } @@ -424,7 +435,7 @@ func TestRegistryProvidersIDValidation(t *testing.T) { Namespace: "namespace", Name: "", } - assert.EqualError(t, id.valid(), ErrRequiredName.Error()) + assert.EqualError(t, id.valid(), ErrInvalidName.Error()) }) t.Run("with an invalid name", func(t *testing.T) { @@ -444,7 +455,7 @@ func TestRegistryProvidersIDValidation(t *testing.T) { Namespace: "", Name: "name", } - assert.EqualError(t, id.valid(), "namespace is required") + assert.EqualError(t, id.valid(), ErrInvalidNamespace.Error()) }) t.Run("with an invalid namespace", func(t *testing.T) { @@ -454,7 +465,7 @@ func TestRegistryProvidersIDValidation(t *testing.T) { Namespace: badIdentifier, Name: "name", } - assert.EqualError(t, id.valid(), "invalid value for namespace") + assert.EqualError(t, id.valid(), ErrInvalidNamespace.Error()) }) t.Run("without a registry-name", func(t *testing.T) { @@ -464,7 +475,17 @@ func TestRegistryProvidersIDValidation(t *testing.T) { Namespace: "namespace", Name: "name", } - assert.EqualError(t, id.valid(), "registry-name is required") + assert.EqualError(t, id.valid(), ErrInvalidRegistryName.Error()) + }) + + t.Run("with in invalid registry-name", func(t *testing.T) { + id := RegistryProviderID{ + OrganizationName: orgName, + RegistryName: "invalid registry name", + Namespace: "namespace", + Name: "name", + } + assert.EqualError(t, id.valid(), ErrInvalidRegistryName.Error()) }) t.Run("without a valid organization", func(t *testing.T) { diff --git a/registry_provider_version.go b/registry_provider_version.go index 23dff9264..5a21bdb75 100644 --- a/registry_provider_version.go +++ b/registry_provider_version.go @@ -58,10 +58,10 @@ type RegistryProviderVersionID struct { func (id RegistryProviderVersionID) valid() error { if !validStringID(&id.Version) { - return errors.New("version is required") + return ErrInvalidVersion } if id.RegistryName != PrivateRegistry { - return errors.New("only private registry is allowed") + return ErrPrivateRegistryRequired } if err := id.RegistryProviderID.valid(); err != nil { return err @@ -120,10 +120,10 @@ type RegistryProviderVersionCreateOptions struct { func (o RegistryProviderVersionCreateOptions) valid() error { if !validStringID(&o.Version) { - return errors.New("version is required") + return ErrInvalidVersion } if !validStringID(&o.KeyID) { - return errors.New("key-id is required") + return ErrInvalidKeyID } return nil } diff --git a/registry_provider_version_integration_test.go b/registry_provider_version_integration_test.go index 439658dc3..a7048968b 100644 --- a/registry_provider_version_integration_test.go +++ b/registry_provider_version_integration_test.go @@ -42,7 +42,7 @@ func TestRegistryProviderVersionsIDValidation(t *testing.T) { Version: "", RegistryProviderID: validRegistryProviderId, } - assert.EqualError(t, id.valid(), "version is required") + assert.EqualError(t, id.valid(), ErrInvalidVersion.Error()) }) t.Run("without a key-id", func(t *testing.T) { @@ -50,7 +50,7 @@ func TestRegistryProviderVersionsIDValidation(t *testing.T) { Version: "", RegistryProviderID: validRegistryProviderId, } - assert.EqualError(t, id.valid(), "version is required") + assert.EqualError(t, id.valid(), ErrInvalidVersion.Error()) }) t.Run("invalid version", func(t *testing.T) { @@ -59,7 +59,7 @@ func TestRegistryProviderVersionsIDValidation(t *testing.T) { Version: "foo", RegistryProviderID: validRegistryProviderId, } - assert.EqualError(t, id.valid(), "version is required") + assert.EqualError(t, id.valid(), ErrInvalidVersion.Error()) }) t.Run("invalid registry for parent provider", func(t *testing.T) { @@ -67,7 +67,7 @@ func TestRegistryProviderVersionsIDValidation(t *testing.T) { Version: version, RegistryProviderID: publicRegistryProviderId, } - assert.EqualError(t, id.valid(), "only private registry is allowed") + assert.EqualError(t, id.valid(), ErrPrivateRegistryRequired.Error()) }) t.Run("without a valid registry provider id", func(t *testing.T) { @@ -135,7 +135,7 @@ func TestRegistryProviderVersionsCreate(t *testing.T) { } rm, err := client.RegistryProviderVersions.Create(ctx, providerId, options) assert.Nil(t, rm) - assert.EqualError(t, err, "version is required") + assert.EqualError(t, err, ErrInvalidVersion.Error()) }) t.Run("without a key-id", func(t *testing.T) { @@ -145,7 +145,7 @@ func TestRegistryProviderVersionsCreate(t *testing.T) { } rm, err := client.RegistryProviderVersions.Create(ctx, providerId, options) assert.Nil(t, rm) - assert.EqualError(t, err, "key-id is required") + assert.EqualError(t, err, ErrInvalidKeyID.Error()) }) t.Run("with a public provider", func(t *testing.T) { @@ -161,7 +161,7 @@ func TestRegistryProviderVersionsCreate(t *testing.T) { } rm, err := client.RegistryProviderVersions.Create(ctx, providerId, options) assert.Nil(t, rm) - assert.EqualError(t, err, "only private registry is allowed") + assert.EqualError(t, err, ErrPrivateRegistryRequired.Error()) }) t.Run("without a valid provider id", func(t *testing.T) {