Skip to content

Commit

Permalink
Merge pull request #698 from GrigoriyMikhalkin/export-errors
Browse files Browse the repository at this point in the history
Export API errors
  • Loading branch information
juanfont authored Aug 9, 2022
2 parents 2c9dbe1 + aa2b927 commit ade4e23
Show file tree
Hide file tree
Showing 10 changed files with 57 additions and 57 deletions.
4 changes: 2 additions & 2 deletions api_key.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const (
apiPrefixLength = 7
apiKeyLength = 32

errAPIKeyFailedToParse = Error("Failed to parse ApiKey")
ErrAPIKeyFailedToParse = Error("Failed to parse ApiKey")
)

// APIKey describes the datamodel for API keys used to remotely authenticate with
Expand Down Expand Up @@ -116,7 +116,7 @@ func (h *Headscale) ExpireAPIKey(key *APIKey) error {
func (h *Headscale) ValidateAPIKey(keyStr string) (bool, error) {
prefix, hash, found := strings.Cut(keyStr, ".")
if !found {
return false, errAPIKeyFailedToParse
return false, ErrAPIKeyFailedToParse
}

key, err := h.GetAPIKey(prefix)
Expand Down
6 changes: 3 additions & 3 deletions db.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ func (hi *HostInfo) Scan(destination interface{}) error {
return json.Unmarshal([]byte(value), hi)

default:
return fmt.Errorf("%w: unexpected data type %T", errMachineAddressesInvalid, destination)
return fmt.Errorf("%w: unexpected data type %T", ErrMachineAddressesInvalid, destination)
}
}

Expand All @@ -270,7 +270,7 @@ func (i *IPPrefixes) Scan(destination interface{}) error {
return json.Unmarshal([]byte(value), i)

default:
return fmt.Errorf("%w: unexpected data type %T", errMachineAddressesInvalid, destination)
return fmt.Errorf("%w: unexpected data type %T", ErrMachineAddressesInvalid, destination)
}
}

Expand All @@ -292,7 +292,7 @@ func (i *StringList) Scan(destination interface{}) error {
return json.Unmarshal([]byte(value), i)

default:
return fmt.Errorf("%w: unexpected data type %T", errMachineAddressesInvalid, destination)
return fmt.Errorf("%w: unexpected data type %T", ErrMachineAddressesInvalid, destination)
}
}

Expand Down
24 changes: 12 additions & 12 deletions machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ import (
)

const (
errMachineNotFound = Error("machine not found")
errMachineRouteIsNotAvailable = Error("route is not available on machine")
errMachineAddressesInvalid = Error("failed to parse machine addresses")
errMachineNotFoundRegistrationCache = Error(
ErrMachineNotFound = Error("machine not found")
ErrMachineRouteIsNotAvailable = Error("route is not available on machine")
ErrMachineAddressesInvalid = Error("failed to parse machine addresses")
ErrMachineNotFoundRegistrationCache = Error(
"machine not found in registration cache",
)
errCouldNotConvertMachineInterface = Error("failed to convert machine interface")
errHostnameTooLong = Error("Hostname too long")
ErrCouldNotConvertMachineInterface = Error("failed to convert machine interface")
ErrHostnameTooLong = Error("Hostname too long")
MachineGivenNameHashLength = 8
MachineGivenNameTrimSize = 2
)
Expand Down Expand Up @@ -112,7 +112,7 @@ func (ma *MachineAddresses) Scan(destination interface{}) error {
return nil

default:
return fmt.Errorf("%w: unexpected data type %T", errMachineAddressesInvalid, destination)
return fmt.Errorf("%w: unexpected data type %T", ErrMachineAddressesInvalid, destination)
}
}

Expand Down Expand Up @@ -337,7 +337,7 @@ func (h *Headscale) GetMachine(namespace string, name string) (*Machine, error)
}
}

return nil, errMachineNotFound
return nil, ErrMachineNotFound
}

// GetMachineByID finds a Machine by ID and returns the Machine struct.
Expand Down Expand Up @@ -635,7 +635,7 @@ func (machine Machine) toNode(
return nil, fmt.Errorf(
"hostname %q is too long it cannot except 255 ASCII chars: %w",
hostname,
errHostnameTooLong,
ErrHostnameTooLong,
)
}
} else {
Expand Down Expand Up @@ -785,11 +785,11 @@ func (h *Headscale) RegisterMachineFromAuthCallback(

return machine, err
} else {
return nil, errCouldNotConvertMachineInterface
return nil, ErrCouldNotConvertMachineInterface
}
}

return nil, errMachineNotFoundRegistrationCache
return nil, ErrMachineNotFoundRegistrationCache
}

// RegisterMachine is executed from the CLI to register a new Machine using its MachineKey.
Expand Down Expand Up @@ -877,7 +877,7 @@ func (h *Headscale) EnableRoutes(machine *Machine, routeStrs ...string) error {
return fmt.Errorf(
"route (%s) is not available on node %s: %w",
machine.Hostname,
newRoute, errMachineRouteIsNotAvailable,
newRoute, ErrMachineRouteIsNotAvailable,
)
}
}
Expand Down
28 changes: 14 additions & 14 deletions namespaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ import (
)

const (
errNamespaceExists = Error("Namespace already exists")
errNamespaceNotFound = Error("Namespace not found")
errNamespaceNotEmptyOfNodes = Error("Namespace not empty: node(s) found")
errInvalidNamespaceName = Error("Invalid namespace name")
ErrNamespaceExists = Error("Namespace already exists")
ErrNamespaceNotFound = Error("Namespace not found")
ErrNamespaceNotEmptyOfNodes = Error("Namespace not empty: node(s) found")
ErrInvalidNamespaceName = Error("Invalid namespace name")
)

const (
Expand Down Expand Up @@ -47,7 +47,7 @@ func (h *Headscale) CreateNamespace(name string) (*Namespace, error) {
}
namespace := Namespace{}
if err := h.db.Where("name = ?", name).First(&namespace).Error; err == nil {
return nil, errNamespaceExists
return nil, ErrNamespaceExists
}
namespace.Name = name
if err := h.db.Create(&namespace).Error; err != nil {
Expand All @@ -67,15 +67,15 @@ func (h *Headscale) CreateNamespace(name string) (*Namespace, error) {
func (h *Headscale) DestroyNamespace(name string) error {
namespace, err := h.GetNamespace(name)
if err != nil {
return errNamespaceNotFound
return ErrNamespaceNotFound
}

machines, err := h.ListMachinesInNamespace(name)
if err != nil {
return err
}
if len(machines) > 0 {
return errNamespaceNotEmptyOfNodes
return ErrNamespaceNotEmptyOfNodes
}

keys, err := h.ListPreAuthKeys(name)
Expand Down Expand Up @@ -110,9 +110,9 @@ func (h *Headscale) RenameNamespace(oldName, newName string) error {
}
_, err = h.GetNamespace(newName)
if err == nil {
return errNamespaceExists
return ErrNamespaceExists
}
if !errors.Is(err, errNamespaceNotFound) {
if !errors.Is(err, ErrNamespaceNotFound) {
return err
}

Expand All @@ -132,7 +132,7 @@ func (h *Headscale) GetNamespace(name string) (*Namespace, error) {
result.Error,
gorm.ErrRecordNotFound,
) {
return nil, errNamespaceNotFound
return nil, ErrNamespaceNotFound
}

return &namespace, nil
Expand Down Expand Up @@ -272,7 +272,7 @@ func NormalizeToFQDNRules(name string, stripEmailDomain bool) (string, error) {
return "", fmt.Errorf(
"label %v is more than 63 chars: %w",
elt,
errInvalidNamespaceName,
ErrInvalidNamespaceName,
)
}
}
Expand All @@ -285,21 +285,21 @@ func CheckForFQDNRules(name string) error {
return fmt.Errorf(
"DNS segment must not be over 63 chars. %v doesn't comply with this rule: %w",
name,
errInvalidNamespaceName,
ErrInvalidNamespaceName,
)
}
if strings.ToLower(name) != name {
return fmt.Errorf(
"DNS segment should be lowercase. %v doesn't comply with this rule: %w",
name,
errInvalidNamespaceName,
ErrInvalidNamespaceName,
)
}
if invalidCharsInNamespaceRegex.MatchString(name) {
return fmt.Errorf(
"DNS segment should only be composed of lowercase ASCII letters numbers, hyphen and dots. %v doesn't comply with theses rules: %w",
name,
errInvalidNamespaceName,
ErrInvalidNamespaceName,
)
}

Expand Down
12 changes: 6 additions & 6 deletions namespaces_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (s *Suite) TestCreateAndDestroyNamespace(c *check.C) {

func (s *Suite) TestDestroyNamespaceErrors(c *check.C) {
err := app.DestroyNamespace("test")
c.Assert(err, check.Equals, errNamespaceNotFound)
c.Assert(err, check.Equals, ErrNamespaceNotFound)

namespace, err := app.CreateNamespace("test")
c.Assert(err, check.IsNil)
Expand Down Expand Up @@ -60,7 +60,7 @@ func (s *Suite) TestDestroyNamespaceErrors(c *check.C) {
app.db.Save(&machine)

err = app.DestroyNamespace("test")
c.Assert(err, check.Equals, errNamespaceNotEmptyOfNodes)
c.Assert(err, check.Equals, ErrNamespaceNotEmptyOfNodes)
}

func (s *Suite) TestRenameNamespace(c *check.C) {
Expand All @@ -76,20 +76,20 @@ func (s *Suite) TestRenameNamespace(c *check.C) {
c.Assert(err, check.IsNil)

_, err = app.GetNamespace("test")
c.Assert(err, check.Equals, errNamespaceNotFound)
c.Assert(err, check.Equals, ErrNamespaceNotFound)

_, err = app.GetNamespace("test-renamed")
c.Assert(err, check.IsNil)

err = app.RenameNamespace("test-does-not-exit", "test")
c.Assert(err, check.Equals, errNamespaceNotFound)
c.Assert(err, check.Equals, ErrNamespaceNotFound)

namespaceTest2, err := app.CreateNamespace("test2")
c.Assert(err, check.IsNil)
c.Assert(namespaceTest2.Name, check.Equals, "test2")

err = app.RenameNamespace("test2", "test-renamed")
c.Assert(err, check.Equals, errNamespaceExists)
c.Assert(err, check.Equals, ErrNamespaceExists)
}

func (s *Suite) TestGetMapResponseUserProfiles(c *check.C) {
Expand Down Expand Up @@ -402,7 +402,7 @@ func (s *Suite) TestSetMachineNamespace(c *check.C) {
c.Assert(machine.Namespace.Name, check.Equals, newNamespace.Name)

err = app.SetMachineNamespace(&machine, "non-existing-namespace")
c.Assert(err, check.Equals, errNamespaceNotFound)
c.Assert(err, check.Equals, ErrNamespaceNotFound)

err = app.SetMachineNamespace(&machine, newNamespace.Name)
c.Assert(err, check.IsNil)
Expand Down
2 changes: 1 addition & 1 deletion oidc.go
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ func (h *Headscale) OIDCCallback(
log.Debug().Msg("Registering new machine after successful callback")

namespace, err := h.GetNamespace(namespaceName)
if errors.Is(err, errNamespaceNotFound) {
if errors.Is(err, ErrNamespaceNotFound) {
namespace, err = h.CreateNamespace(namespaceName)

if err != nil {
Expand Down
16 changes: 8 additions & 8 deletions preauth_keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ import (
)

const (
errPreAuthKeyNotFound = Error("AuthKey not found")
errPreAuthKeyExpired = Error("AuthKey expired")
errSingleUseAuthKeyHasBeenUsed = Error("AuthKey has already been used")
errNamespaceMismatch = Error("namespace mismatch")
ErrPreAuthKeyNotFound = Error("AuthKey not found")
ErrPreAuthKeyExpired = Error("AuthKey expired")
ErrSingleUseAuthKeyHasBeenUsed = Error("AuthKey has already been used")
ErrNamespaceMismatch = Error("namespace mismatch")
)

// PreAuthKey describes a pre-authorization key usable in a particular namespace.
Expand Down Expand Up @@ -92,7 +92,7 @@ func (h *Headscale) GetPreAuthKey(namespace string, key string) (*PreAuthKey, er
}

if pak.Namespace.Name != namespace {
return nil, errNamespaceMismatch
return nil, ErrNamespaceMismatch
}

return pak, nil
Expand Down Expand Up @@ -135,11 +135,11 @@ func (h *Headscale) checkKeyValidity(k string) (*PreAuthKey, error) {
result.Error,
gorm.ErrRecordNotFound,
) {
return nil, errPreAuthKeyNotFound
return nil, ErrPreAuthKeyNotFound
}

if pak.Expiration != nil && pak.Expiration.Before(time.Now()) {
return nil, errPreAuthKeyExpired
return nil, ErrPreAuthKeyExpired
}

if pak.Reusable || pak.Ephemeral { // we don't need to check if has been used before
Expand All @@ -152,7 +152,7 @@ func (h *Headscale) checkKeyValidity(k string) (*PreAuthKey, error) {
}

if len(machines) != 0 || pak.Used {
return nil, errSingleUseAuthKeyHasBeenUsed
return nil, ErrSingleUseAuthKeyHasBeenUsed
}

return &pak, nil
Expand Down
10 changes: 5 additions & 5 deletions preauth_keys_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ func (*Suite) TestExpiredPreAuthKey(c *check.C) {
c.Assert(err, check.IsNil)

key, err := app.checkKeyValidity(pak.Key)
c.Assert(err, check.Equals, errPreAuthKeyExpired)
c.Assert(err, check.Equals, ErrPreAuthKeyExpired)
c.Assert(key, check.IsNil)
}

func (*Suite) TestPreAuthKeyDoesNotExist(c *check.C) {
key, err := app.checkKeyValidity("potatoKey")
c.Assert(err, check.Equals, errPreAuthKeyNotFound)
c.Assert(err, check.Equals, ErrPreAuthKeyNotFound)
c.Assert(key, check.IsNil)
}

Expand Down Expand Up @@ -86,7 +86,7 @@ func (*Suite) TestAlreadyUsedKey(c *check.C) {
app.db.Save(&machine)

key, err := app.checkKeyValidity(pak.Key)
c.Assert(err, check.Equals, errSingleUseAuthKeyHasBeenUsed)
c.Assert(err, check.Equals, ErrSingleUseAuthKeyHasBeenUsed)
c.Assert(key, check.IsNil)
}

Expand Down Expand Up @@ -174,7 +174,7 @@ func (*Suite) TestExpirePreauthKey(c *check.C) {
c.Assert(pak.Expiration, check.NotNil)

key, err := app.checkKeyValidity(pak.Key)
c.Assert(err, check.Equals, errPreAuthKeyExpired)
c.Assert(err, check.Equals, ErrPreAuthKeyExpired)
c.Assert(key, check.IsNil)
}

Expand All @@ -188,5 +188,5 @@ func (*Suite) TestNotReusableMarkedAsUsed(c *check.C) {
app.db.Save(&pak)

_, err = app.checkKeyValidity(pak.Key)
c.Assert(err, check.Equals, errSingleUseAuthKeyHasBeenUsed)
c.Assert(err, check.Equals, ErrSingleUseAuthKeyHasBeenUsed)
}
4 changes: 2 additions & 2 deletions routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
)

const (
errRouteIsNotAvailable = Error("route is not available")
ErrRouteIsNotAvailable = Error("route is not available")
)

// Deprecated: use machine function instead
Expand Down Expand Up @@ -106,7 +106,7 @@ func (h *Headscale) EnableNodeRoute(
}

if !available {
return errRouteIsNotAvailable
return ErrRouteIsNotAvailable
}

machine.EnabledRoutes = enabledRoutes
Expand Down
Loading

0 comments on commit ade4e23

Please sign in to comment.