Skip to content

Commit

Permalink
Add new error types and RegistryName validation
Browse files Browse the repository at this point in the history
  • Loading branch information
joekarl committed Feb 17, 2022
1 parent 32e3c83 commit 546d408
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 41 deletions.
29 changes: 28 additions & 1 deletion errors.go
Expand Up @@ -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")
Expand All @@ -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")
)
35 changes: 15 additions & 20 deletions registry_provider.go
Expand Up @@ -2,7 +2,6 @@ package tfe

import (
"context"
"errors"
"fmt"
"net/url"
)
Expand Down Expand Up @@ -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"`
Expand Down Expand Up @@ -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
}
Expand All @@ -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(
Expand Down Expand Up @@ -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
}
Expand Down
39 changes: 30 additions & 9 deletions registry_provider_integration_test.go
Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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())
})
})

Expand All @@ -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())
})
}

Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand Down
8 changes: 4 additions & 4 deletions registry_provider_version.go
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Expand Down
14 changes: 7 additions & 7 deletions registry_provider_version_integration_test.go
Expand Up @@ -42,15 +42,15 @@ 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) {
id := RegistryProviderVersionID{
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) {
Expand All @@ -59,15 +59,15 @@ 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) {
id := RegistryProviderVersionID{
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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand Down

0 comments on commit 546d408

Please sign in to comment.