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

Check errors for Database calls #597

Merged
merged 7 commits into from
Jun 3, 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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,16 @@ func (h *Headscale) handleMachineRefreshKey(
Str("machine", machine.Hostname).
Msg("We have the OldNodeKey in the database. This is a key refresh")
machine.NodeKey = NodePublicKeyStripPrefix(registerRequest.NodeKey)
h.db.Save(&machine)

if err := h.db.Save(&machine).Error; err != nil {
log.Error().
Caller().
Err(err).
Msg("Failed to update machine key in the database")
ctx.String(http.StatusInternalServerError, "Internal server error")

return
}

resp.AuthURL = ""
resp.User = *machine.Namespace.toUser()
Expand All @@ -484,7 +493,7 @@ func (h *Headscale) handleMachineRefreshKey(
Caller().
Err(err).
Msg("Cannot encode message")
ctx.String(http.StatusInternalServerError, "Extremely sad!")
ctx.String(http.StatusInternalServerError, "Internal server error")

return
}
Expand Down
5 changes: 4 additions & 1 deletion api_key.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,10 @@ func (h *Headscale) CreateAPIKey(
Hash: hash,
Expiration: expiration,
}
h.db.Save(&key)

if err := h.db.Save(&key).Error; err != nil {
return "", nil, fmt.Errorf("failed to save API key to database: %w", err)
}

return keyStr, &key, nil
}
Expand Down
4 changes: 3 additions & 1 deletion db.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,9 @@ func (h *Headscale) setValue(key string, value string) error {
return nil
}

h.db.Create(keyValue)
if err := h.db.Create(keyValue).Error; err != nil {
return fmt.Errorf("failed to create key value pair in the database: %w", err)
}

return nil
}
Expand Down
2 changes: 1 addition & 1 deletion integration_cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func (s *IntegrationCLITestSuite) SetupTest() {
}

headscaleOptions := &dockertest.RunOptions{
Name: "headscale",
Name: "headscale-cli",
Mounts: []string{
fmt.Sprintf("%s/integration_test/etc:/etc/headscale", currentPath),
},
Expand Down
37 changes: 29 additions & 8 deletions machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,19 +378,26 @@ func (h *Headscale) SetTags(machine *Machine, tags []string) error {
return err
}
h.setLastStateChangeToNow(machine.Namespace.Name)
h.db.Save(machine)

if err := h.db.Save(machine).Error; err != nil {
return fmt.Errorf("failed to update tags for machine in the database: %w", err)
}

return nil
}

// ExpireMachine takes a Machine struct and sets the expire field to now.
func (h *Headscale) ExpireMachine(machine *Machine) {
func (h *Headscale) ExpireMachine(machine *Machine) error {
now := time.Now()
machine.Expiry = &now

h.setLastStateChangeToNow(machine.Namespace.Name)

h.db.Save(machine)
if err := h.db.Save(machine).Error; err != nil {
return fmt.Errorf("failed to expire machine in the database: %w", err)
}

return nil
}

// RenameMachine takes a Machine struct and a new GivenName for the machines
Expand All @@ -413,21 +420,30 @@ func (h *Headscale) RenameMachine(machine *Machine, newName string) error {

h.setLastStateChangeToNow(machine.Namespace.Name)

h.db.Save(machine)
if err := h.db.Save(machine).Error; err != nil {
return fmt.Errorf("failed to rename machine in the database: %w", err)
}

return nil
}

// RefreshMachine takes a Machine struct and sets the expire field to now.
func (h *Headscale) RefreshMachine(machine *Machine, expiry time.Time) {
func (h *Headscale) RefreshMachine(machine *Machine, expiry time.Time) error {
now := time.Now()

machine.LastSuccessfulUpdate = &now
machine.Expiry = &expiry

h.setLastStateChangeToNow(machine.Namespace.Name)

h.db.Save(machine)
if err := h.db.Save(machine).Error; err != nil {
return fmt.Errorf(
"failed to refresh machine (update expiration) in the database: %w",
err,
)
}

return nil
}

// DeleteMachine softs deletes a Machine from the database.
Expand Down Expand Up @@ -793,7 +809,9 @@ func (h *Headscale) RegisterMachine(machine Machine,

machine.IPAddresses = ips

h.db.Save(&machine)
if err := h.db.Save(&machine).Error; err != nil {
return nil, fmt.Errorf("failed register(save) machine in the database: %w", err)
}

log.Trace().
Caller().
Expand Down Expand Up @@ -853,7 +871,10 @@ func (h *Headscale) EnableRoutes(machine *Machine, routeStrs ...string) error {
}

machine.EnabledRoutes = newRoutes
h.db.Save(&machine)

if err := h.db.Save(machine).Error; err != nil {
return fmt.Errorf("failed enable routes for machine in the database: %w", err)
}

return nil
}
Expand Down
15 changes: 14 additions & 1 deletion poll.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,20 @@ func (h *Headscale) PollNetMapHandler(ctx *gin.Context) {
machine.Endpoints = req.Endpoints
machine.LastSeen = &now
}
h.db.Updates(machine)

if err := h.db.Updates(machine).Error; err != nil {
if err != nil {
log.Error().
Str("handler", "PollNetMap").
Str("id", ctx.Param("id")).
Str("machine", machine.Hostname).
Err(err).
Msg("Failed to persist/update machine in the database")
ctx.String(http.StatusInternalServerError, ":(")

return
}
}

data, err := h.getMapResponse(machineKey, req, machine)
if err != nil {
Expand Down
14 changes: 11 additions & 3 deletions preauth_keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"crypto/rand"
"encoding/hex"
"errors"
"fmt"
"strconv"
"time"

Expand Down Expand Up @@ -60,7 +61,10 @@ func (h *Headscale) CreatePreAuthKey(
CreatedAt: &now,
Expiration: expiration,
}
h.db.Save(&key)

if err := h.db.Save(&key).Error; err != nil {
return nil, fmt.Errorf("failed to create key in the database: %w", err)
}

return &key, nil
}
Expand Down Expand Up @@ -114,9 +118,13 @@ func (h *Headscale) ExpirePreAuthKey(k *PreAuthKey) error {
}

// UsePreAuthKey marks a PreAuthKey as used.
func (h *Headscale) UsePreAuthKey(k *PreAuthKey) {
func (h *Headscale) UsePreAuthKey(k *PreAuthKey) error {
k.Used = true
h.db.Save(k)
if err := h.db.Save(k).Error; err != nil {
return fmt.Errorf("failed to update key used status in the database: %w", err)
}

return nil
}

// checkKeyValidity does the heavy lifting for validation of the PreAuthKey coming from a node
Expand Down
7 changes: 6 additions & 1 deletion routes.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package headscale

import (
"fmt"

"inet.af/netaddr"
)

Expand Down Expand Up @@ -108,7 +110,10 @@ func (h *Headscale) EnableNodeRoute(
}

machine.EnabledRoutes = enabledRoutes
h.db.Save(&machine)

if err := h.db.Save(&machine).Error; err != nil {
return fmt.Errorf("failed to update node routes in the database: %w", err)
}

return nil
}