state: say a taken name is already taken

This commit is contained in:
Kristoffer Dalby committed 2026-10-28 18:28:22 +00:00
1 parent e66084195b
commit b1c142d9c9
2 files changed
+7 -3

No files matched your search

+1
View File
@@ -62,6 +62,7 @@ func TestNodeNameCannotShadowExtraRecord(t *testing.T) {
_, _, err = s.RenameNode(existing.ID(), "Svc")
require.ErrorIs(t, err, ErrNodeNameNotUnique)
require.EqualError(t, err, `name "Svc" is already taken`)
_, err = s.UpdateNodeFromMapRequest(existing.ID(), tailcfg.MapRequest{
NodeKey: existing.NodeKey(), Hostinfo: &tailcfg.Hostinfo{Hostname: "svc"},
})
+6 -3
View File
@@ -89,8 +89,9 @@ var ErrInvalidNodeView = errors.New("invalid node view provided")
// ErrNodeNotInNodeStore is returned when a node no longer exists in the [NodeStore].
var ErrNodeNotInNodeStore = errors.New("node no longer exists in NodeStore")
// ErrNodeNameNotUnique is returned when a node name is not unique.
var ErrNodeNameNotUnique = errors.New("node name is not unique")
// ErrNodeNameNotUnique is returned when a node name is not unique, wrapped
// as `name "X" is already taken`.
var ErrNodeNameNotUnique = errors.New("already taken")
// nodeUpdateColumns lists all Node columns that should be written
// during a struct-based GORM Updates() call. Listing them explicitly
@@ -1297,6 +1298,8 @@ func (s *State) updateApprovedRoutes(nodeID types.NodeID, set UpdateNodeFunc) (t
// auto-sanitisation) and collisions error out rather than silently
// bumping a user-facing label. See HOSTNAME.md for the CLI contract.
func (s *State) RenameNode(nodeID types.NodeID, newName string) (types.NodeView, change.Change, error) {
asked := newName
// DNS is case-insensitive but uniqueness and the client's certificate
// name match are not, so "Foo" and "foo" would share one name.
newName = strings.ToLower(newName)
@@ -1315,7 +1318,7 @@ func (s *State) RenameNode(nodeID types.NodeID, newName string) (types.NodeView,
if err != nil {
switch {
case errors.Is(err, ErrGivenNameTaken):
return types.NodeView{}, change.Change{}, fmt.Errorf("%w: %s", ErrNodeNameNotUnique, newName)
return types.NodeView{}, change.Change{}, fmt.Errorf("name %q is %w", asked, ErrNodeNameNotUnique)
case errors.Is(err, ErrNodeNotFound):
return types.NodeView{}, change.Change{}, fmt.Errorf("%w: %d", ErrNodeNotInNodeStore, nodeID)
default: