mirror of
https://github.com/juanfont/headscale.git
synced 2025-05-02 07:53:42 -04:00
notify nodes after owner change (#2543)
* proto: user id as identifier for move node Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * gen: regenr Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * grpc: move, use userid, one tx, send update Updates #2467 Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * integration: update move cli tests Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> --------- Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
parent
cfe9bbf829
commit
6b6509eeeb
@ -78,7 +78,7 @@ func init() {
|
|||||||
log.Fatal(err.Error())
|
log.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
moveNodeCmd.Flags().StringP("user", "u", "", "New user")
|
moveNodeCmd.Flags().Uint64P("user", "u", 0, "New user")
|
||||||
|
|
||||||
moveNodeCmd.Flags().StringP("namespace", "n", "", "User")
|
moveNodeCmd.Flags().StringP("namespace", "n", "", "User")
|
||||||
moveNodeNamespaceFlag := moveNodeCmd.Flags().Lookup("namespace")
|
moveNodeNamespaceFlag := moveNodeCmd.Flags().Lookup("namespace")
|
||||||
@ -470,7 +470,7 @@ var moveNodeCmd = &cobra.Command{
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
user, err := cmd.Flags().GetString("user")
|
user, err := cmd.Flags().GetUint64("user")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ErrorOutput(
|
ErrorOutput(
|
||||||
err,
|
err,
|
||||||
|
@ -1001,7 +1001,7 @@ func (x *ListNodesResponse) GetNodes() []*Node {
|
|||||||
type MoveNodeRequest struct {
|
type MoveNodeRequest struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
NodeId uint64 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
|
NodeId uint64 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
|
||||||
User string `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
|
User uint64 `protobuf:"varint,2,opt,name=user,proto3" json:"user,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
}
|
}
|
||||||
@ -1043,11 +1043,11 @@ func (x *MoveNodeRequest) GetNodeId() uint64 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *MoveNodeRequest) GetUser() string {
|
func (x *MoveNodeRequest) GetUser() uint64 {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.User
|
return x.User
|
||||||
}
|
}
|
||||||
return ""
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
type MoveNodeResponse struct {
|
type MoveNodeResponse struct {
|
||||||
@ -1365,7 +1365,7 @@ const file_headscale_v1_node_proto_rawDesc = "" +
|
|||||||
"\x05nodes\x18\x01 \x03(\v2\x12.headscale.v1.NodeR\x05nodes\">\n" +
|
"\x05nodes\x18\x01 \x03(\v2\x12.headscale.v1.NodeR\x05nodes\">\n" +
|
||||||
"\x0fMoveNodeRequest\x12\x17\n" +
|
"\x0fMoveNodeRequest\x12\x17\n" +
|
||||||
"\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12\x12\n" +
|
"\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12\x12\n" +
|
||||||
"\x04user\x18\x02 \x01(\tR\x04user\":\n" +
|
"\x04user\x18\x02 \x01(\x04R\x04user\":\n" +
|
||||||
"\x10MoveNodeResponse\x12&\n" +
|
"\x10MoveNodeResponse\x12&\n" +
|
||||||
"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"j\n" +
|
"\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"j\n" +
|
||||||
"\x16DebugCreateNodeRequest\x12\x12\n" +
|
"\x16DebugCreateNodeRequest\x12\x12\n" +
|
||||||
|
@ -800,7 +800,8 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"user": {
|
"user": {
|
||||||
"type": "string"
|
"type": "string",
|
||||||
|
"format": "uint64"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -547,21 +547,30 @@ func (api headscaleV1APIServer) MoveNode(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
request *v1.MoveNodeRequest,
|
request *v1.MoveNodeRequest,
|
||||||
) (*v1.MoveNodeResponse, error) {
|
) (*v1.MoveNodeResponse, error) {
|
||||||
// TODO(kradalby): This should be done in one tx.
|
node, err := db.Write(api.h.db.DB, func(tx *gorm.DB) (*types.Node, error) {
|
||||||
node, err := api.h.db.GetNodeByID(types.NodeID(request.GetNodeId()))
|
node, err := db.GetNodeByID(tx, types.NodeID(request.GetNodeId()))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.AssignNodeToUser(tx, node, types.UserID(request.GetUser()))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return node, nil
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
user, err := api.h.db.GetUserByName(request.GetUser())
|
ctx = types.NotifyCtx(ctx, "cli-movenode-self", node.Hostname)
|
||||||
if err != nil {
|
api.h.nodeNotifier.NotifyByNodeID(
|
||||||
return nil, err
|
ctx,
|
||||||
}
|
types.UpdateSelf(node.ID),
|
||||||
|
node.ID)
|
||||||
err = api.h.db.AssignNodeToUser(node, types.UserID(user.ID))
|
ctx = types.NotifyCtx(ctx, "cli-movenode", node.Hostname)
|
||||||
if err != nil {
|
api.h.nodeNotifier.NotifyWithIgnore(ctx, types.UpdatePeerChanged(node.ID), node.ID)
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &v1.MoveNodeResponse{Node: node.Proto()}, nil
|
return &v1.MoveNodeResponse{Node: node.Proto()}, nil
|
||||||
}
|
}
|
||||||
|
@ -1580,6 +1580,9 @@ func TestNodeMoveCommand(t *testing.T) {
|
|||||||
// Randomly generated node key
|
// Randomly generated node key
|
||||||
regID := types.MustRegistrationID()
|
regID := types.MustRegistrationID()
|
||||||
|
|
||||||
|
userMap, err := headscale.MapUsers()
|
||||||
|
assertNoErr(t, err)
|
||||||
|
|
||||||
_, err = headscale.Execute(
|
_, err = headscale.Execute(
|
||||||
[]string{
|
[]string{
|
||||||
"headscale",
|
"headscale",
|
||||||
@ -1628,9 +1631,9 @@ func TestNodeMoveCommand(t *testing.T) {
|
|||||||
"nodes",
|
"nodes",
|
||||||
"move",
|
"move",
|
||||||
"--identifier",
|
"--identifier",
|
||||||
nodeID,
|
strconv.FormatUint(node.GetId(), 10),
|
||||||
"--user",
|
"--user",
|
||||||
"new-user",
|
strconv.FormatUint(userMap["new-user"].GetId(), 10),
|
||||||
"--output",
|
"--output",
|
||||||
"json",
|
"json",
|
||||||
},
|
},
|
||||||
@ -1668,7 +1671,7 @@ func TestNodeMoveCommand(t *testing.T) {
|
|||||||
"--identifier",
|
"--identifier",
|
||||||
nodeID,
|
nodeID,
|
||||||
"--user",
|
"--user",
|
||||||
"non-existing-user",
|
"999",
|
||||||
"--output",
|
"--output",
|
||||||
"json",
|
"json",
|
||||||
},
|
},
|
||||||
@ -1689,7 +1692,7 @@ func TestNodeMoveCommand(t *testing.T) {
|
|||||||
"--identifier",
|
"--identifier",
|
||||||
nodeID,
|
nodeID,
|
||||||
"--user",
|
"--user",
|
||||||
"old-user",
|
strconv.FormatUint(userMap["old-user"].GetId(), 10),
|
||||||
"--output",
|
"--output",
|
||||||
"json",
|
"json",
|
||||||
},
|
},
|
||||||
@ -1708,7 +1711,7 @@ func TestNodeMoveCommand(t *testing.T) {
|
|||||||
"--identifier",
|
"--identifier",
|
||||||
nodeID,
|
nodeID,
|
||||||
"--user",
|
"--user",
|
||||||
"old-user",
|
strconv.FormatUint(userMap["old-user"].GetId(), 10),
|
||||||
"--output",
|
"--output",
|
||||||
"json",
|
"json",
|
||||||
},
|
},
|
||||||
|
@ -99,7 +99,7 @@ message ListNodesResponse { repeated Node nodes = 1; }
|
|||||||
|
|
||||||
message MoveNodeRequest {
|
message MoveNodeRequest {
|
||||||
uint64 node_id = 1;
|
uint64 node_id = 1;
|
||||||
string user = 2;
|
uint64 user = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message MoveNodeResponse { Node node = 1; }
|
message MoveNodeResponse { Node node = 1; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user