@@ -5,12 +5,14 @@ import (
5
5
"encoding/json"
6
6
"fmt"
7
7
"net/netip"
8
+ "strconv"
8
9
"strings"
9
10
"testing"
10
11
"time"
11
12
12
13
v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
13
14
"github.com/juanfont/headscale/hscontrol/types"
15
+ "github.com/juanfont/headscale/hscontrol/util"
14
16
"github.com/juanfont/headscale/integration/hsic"
15
17
"github.com/juanfont/headscale/integration/tsic"
16
18
"github.com/rs/zerolog/log"
@@ -654,6 +656,134 @@ func TestTaildrop(t *testing.T) {
654
656
}
655
657
}
656
658
659
+ func TestUpdateHostnameFromClient (t * testing.T ) {
660
+ IntegrationSkip (t )
661
+ t .Parallel ()
662
+
663
+ user := "update-hostname-from-client"
664
+
665
+ hostnames := map [string ]string {
666
+ "1" : "user1-host" ,
667
+ "2" : "User2-Host" ,
668
+ "3" : "user3-host" ,
669
+ }
670
+
671
+ scenario , err := NewScenario (dockertestMaxWait ())
672
+ assertNoErrf (t , "failed to create scenario: %s" , err )
673
+ defer scenario .ShutdownAssertNoPanics (t )
674
+
675
+ spec := map [string ]int {
676
+ user : 3 ,
677
+ }
678
+
679
+ err = scenario .CreateHeadscaleEnv (spec , []tsic.Option {}, hsic .WithTestName ("updatehostname" ))
680
+ assertNoErrHeadscaleEnv (t , err )
681
+
682
+ allClients , err := scenario .ListTailscaleClients ()
683
+ assertNoErrListClients (t , err )
684
+
685
+ err = scenario .WaitForTailscaleSync ()
686
+ assertNoErrSync (t , err )
687
+
688
+ headscale , err := scenario .Headscale ()
689
+ assertNoErrGetHeadscale (t , err )
690
+
691
+ // update hostnames using the up command
692
+ for _ , client := range allClients {
693
+ status , err := client .Status ()
694
+ assertNoErr (t , err )
695
+
696
+ command := []string {
697
+ "tailscale" ,
698
+ "set" ,
699
+ "--hostname=" + hostnames [string (status .Self .ID )],
700
+ }
701
+ _ , _ , err = client .Execute (command )
702
+ assertNoErrf (t , "failed to set hostname: %s" , err )
703
+ }
704
+
705
+ err = scenario .WaitForTailscaleSync ()
706
+ assertNoErrSync (t , err )
707
+
708
+ var nodes []* v1.Node
709
+ err = executeAndUnmarshal (
710
+ headscale ,
711
+ []string {
712
+ "headscale" ,
713
+ "node" ,
714
+ "list" ,
715
+ "--output" ,
716
+ "json" ,
717
+ },
718
+ & nodes ,
719
+ )
720
+
721
+ assertNoErr (t , err )
722
+ assert .Len (t , nodes , 3 )
723
+
724
+ for _ , node := range nodes {
725
+ hostname := hostnames [strconv .FormatUint (node .GetId (), 10 )]
726
+ assert .Equal (t , hostname , node .GetName ())
727
+ assert .Equal (t , util .ConvertWithFQDNRules (hostname ), node .GetGivenName ())
728
+ }
729
+
730
+ // Rename givenName in nodes
731
+ for _ , node := range nodes {
732
+ givenName := fmt .Sprintf ("%d-givenname" , node .GetId ())
733
+ _ , err = headscale .Execute (
734
+ []string {
735
+ "headscale" ,
736
+ "node" ,
737
+ "rename" ,
738
+ givenName ,
739
+ "--identifier" ,
740
+ strconv .FormatUint (node .GetId (), 10 ),
741
+ })
742
+ assertNoErr (t , err )
743
+ }
744
+
745
+ time .Sleep (5 * time .Second )
746
+
747
+ // Verify that the clients can see the new hostname, but no givenName
748
+ for _ , client := range allClients {
749
+ status , err := client .Status ()
750
+ assertNoErr (t , err )
751
+
752
+ command := []string {
753
+ "tailscale" ,
754
+ "set" ,
755
+ "--hostname=" + hostnames [string (status .Self .ID )] + "NEW" ,
756
+ }
757
+ _ , _ , err = client .Execute (command )
758
+ assertNoErrf (t , "failed to set hostname: %s" , err )
759
+ }
760
+
761
+ err = scenario .WaitForTailscaleSync ()
762
+ assertNoErrSync (t , err )
763
+
764
+ err = executeAndUnmarshal (
765
+ headscale ,
766
+ []string {
767
+ "headscale" ,
768
+ "node" ,
769
+ "list" ,
770
+ "--output" ,
771
+ "json" ,
772
+ },
773
+ & nodes ,
774
+ )
775
+
776
+ assertNoErr (t , err )
777
+ assert .Len (t , nodes , 3 )
778
+
779
+ for _ , node := range nodes {
780
+ hostname := hostnames [strconv .FormatUint (node .GetId (), 10 )]
781
+ givenName := fmt .Sprintf ("%d-givenname" , node .GetId ())
782
+ assert .Equal (t , hostname + "NEW" , node .GetName ())
783
+ assert .Equal (t , givenName , node .GetGivenName ())
784
+ }
785
+ }
786
+
657
787
func TestExpireNode (t * testing.T ) {
658
788
IntegrationSkip (t )
659
789
t .Parallel ()
0 commit comments