Skip to content

Commit

Permalink
update list node helper, add listuser
Browse files Browse the repository at this point in the history
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
  • Loading branch information
kradalby committed Jan 26, 2025
1 parent ef98f5e commit b12df05
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 186 deletions.
26 changes: 5 additions & 21 deletions integration/auth_key_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"testing"
"time"

v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/juanfont/headscale/integration/hsic"
"github.com/juanfont/headscale/integration/tsic"
"github.com/samber/lo"
Expand Down Expand Up @@ -59,12 +58,7 @@ func TestAuthKeyLogoutAndReloginSameUser(t *testing.T) {
headscale, err := scenario.Headscale()
assertNoErrGetHeadscale(t, err)

var listNodes []*v1.Node
for username := range spec {
nodes, err := headscale.ListNodesInUser(username)
assertNoErr(t, err)
listNodes = append(listNodes, nodes...)
}
listNodes, err := headscale.ListNodes()
assert.Equal(t, len(listNodes), len(allClients))
nodeCountBeforeLogout := len(listNodes)
t.Logf("node count before logout: %d", nodeCountBeforeLogout)
Expand Down Expand Up @@ -120,12 +114,7 @@ func TestAuthKeyLogoutAndReloginSameUser(t *testing.T) {
success := pingAllHelper(t, allClients, allAddrs)
t.Logf("%d successful pings out of %d", success, len(allClients)*len(allIps))

listNodes = nil
for username := range spec {
nodes, err := headscale.ListNodesInUser(username)
assertNoErr(t, err)
listNodes = append(listNodes, nodes...)
}
listNodes, err = headscale.ListNodes()
require.Equal(t, nodeCountBeforeLogout, len(listNodes))
t.Logf("node count first login: %d, after relogin: %d", nodeCountBeforeLogout, len(listNodes))

Expand Down Expand Up @@ -198,12 +187,7 @@ func TestAuthKeyLogoutAndReloginNewUser(t *testing.T) {
headscale, err := scenario.Headscale()
assertNoErrGetHeadscale(t, err)

var listNodes []*v1.Node
for username := range spec {
nodes, err := headscale.ListNodesInUser(username)
assertNoErr(t, err)
listNodes = append(listNodes, nodes...)
}
listNodes, err := headscale.ListNodes()
assert.Equal(t, len(listNodes), len(allClients))
nodeCountBeforeLogout := len(listNodes)
t.Logf("node count before logout: %d", nodeCountBeforeLogout)
Expand Down Expand Up @@ -235,12 +219,12 @@ func TestAuthKeyLogoutAndReloginNewUser(t *testing.T) {
}
}

user1Nodes, err := headscale.ListNodesInUser("user1")
user1Nodes, err := headscale.ListNodes("user1")
assertNoErr(t, err)
assert.Len(t, user1Nodes, len(allClients))

// Validate that all the old nodes are still present with user2
user2Nodes, err := headscale.ListNodesInUser("user2")
user2Nodes, err := headscale.ListNodes("user2")
assertNoErr(t, err)
assert.Len(t, user2Nodes, len(allClients)/2)

Expand Down
154 changes: 25 additions & 129 deletions integration/auth_oidc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,17 +116,7 @@ func TestOIDCAuthenticationPingAll(t *testing.T) {
headscale, err := scenario.Headscale()
assertNoErr(t, err)

var listUsers []v1.User
err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"users",
"list",
"--output",
"json",
},
&listUsers,
)
listUsers, err := headscale.ListUsers()
assertNoErr(t, err)

want := []v1.User{
Expand Down Expand Up @@ -249,7 +239,7 @@ func TestOIDC024UserCreation(t *testing.T) {
emailVerified bool
cliUsers []string
oidcUsers []string
want func(iss string) []v1.User
want func(iss string) []*v1.User
}{
{
name: "no-migration-verified-email",
Expand All @@ -259,8 +249,8 @@ func TestOIDC024UserCreation(t *testing.T) {
emailVerified: true,
cliUsers: []string{"user1", "user2"},
oidcUsers: []string{"user1", "user2"},
want: func(iss string) []v1.User {
return []v1.User{
want: func(iss string) []*v1.User {
return []*v1.User{
{
Id: 1,
Name: "user1",
Expand Down Expand Up @@ -296,8 +286,8 @@ func TestOIDC024UserCreation(t *testing.T) {
emailVerified: false,
cliUsers: []string{"user1", "user2"},
oidcUsers: []string{"user1", "user2"},
want: func(iss string) []v1.User {
return []v1.User{
want: func(iss string) []*v1.User {
return []*v1.User{
{
Id: 1,
Name: "user1",
Expand Down Expand Up @@ -332,8 +322,8 @@ func TestOIDC024UserCreation(t *testing.T) {
emailVerified: true,
cliUsers: []string{"user1", "user2"},
oidcUsers: []string{"user1", "user2"},
want: func(iss string) []v1.User {
return []v1.User{
want: func(iss string) []*v1.User {
return []*v1.User{
{
Id: 1,
Name: "user1",
Expand All @@ -360,8 +350,8 @@ func TestOIDC024UserCreation(t *testing.T) {
emailVerified: false,
cliUsers: []string{"user1", "user2"},
oidcUsers: []string{"user1", "user2"},
want: func(iss string) []v1.User {
return []v1.User{
want: func(iss string) []*v1.User {
return []*v1.User{
{
Id: 1,
Name: "user1",
Expand Down Expand Up @@ -396,8 +386,8 @@ func TestOIDC024UserCreation(t *testing.T) {
emailVerified: true,
cliUsers: []string{"user1.headscale.net", "user2.headscale.net"},
oidcUsers: []string{"user1", "user2"},
want: func(iss string) []v1.User {
return []v1.User{
want: func(iss string) []*v1.User {
return []*v1.User{
// Hmm I think we will have to overwrite the initial name here
// createuser with "user1.headscale.net", but oidc with "user1"
{
Expand Down Expand Up @@ -426,8 +416,8 @@ func TestOIDC024UserCreation(t *testing.T) {
emailVerified: false,
cliUsers: []string{"user1.headscale.net", "user2.headscale.net"},
oidcUsers: []string{"user1", "user2"},
want: func(iss string) []v1.User {
return []v1.User{
want: func(iss string) []*v1.User {
return []*v1.User{
{
Id: 1,
Name: "user1.headscale.net",
Expand Down Expand Up @@ -509,17 +499,7 @@ func TestOIDC024UserCreation(t *testing.T) {

want := tt.want(oidcConfig.Issuer)

var listUsers []v1.User
err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"users",
"list",
"--output",
"json",
},
&listUsers,
)
listUsers, err := headscale.ListUsers()
assertNoErr(t, err)

sort.Slice(listUsers, func(i, j int) bool {
Expand Down Expand Up @@ -587,23 +567,6 @@ func TestOIDCAuthenticationWithPKCE(t *testing.T) {
err = scenario.WaitForTailscaleSync()
assertNoErrSync(t, err)

// Verify PKCE was used in authentication
headscale, err := scenario.Headscale()
assertNoErr(t, err)

var listUsers []v1.User
err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"users",
"list",
"--output",
"json",
},
&listUsers,
)
assertNoErr(t, err)

allAddrs := lo.Map(allIps, func(x netip.Addr, index int) string {
return x.String()
})
Expand Down Expand Up @@ -664,17 +627,7 @@ func TestOIDCReloginSameNodeNewUser(t *testing.T) {
headscale, err := scenario.Headscale()
assertNoErr(t, err)

var listUsers []v1.User
err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"users",
"list",
"--output",
"json",
},
&listUsers,
)
listUsers, err := headscale.ListUsers()
assertNoErr(t, err)
assert.Len(t, listUsers, 0)

Expand All @@ -687,19 +640,10 @@ func TestOIDCReloginSameNodeNewUser(t *testing.T) {
_, err = doLoginURL(ts.Hostname(), u)
assertNoErr(t, err)

err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"users",
"list",
"--output",
"json",
},
&listUsers,
)
listUsers, err = headscale.ListUsers()
assertNoErr(t, err)
assert.Len(t, listUsers, 1)
wantUsers := []v1.User{
wantUsers := []*v1.User{
{
Id: 1,
Name: "user1",
Expand All @@ -717,17 +661,7 @@ func TestOIDCReloginSameNodeNewUser(t *testing.T) {
t.Fatalf("unexpected users: %s", diff)
}

var listNodes []v1.Node
err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"nodes",
"list",
"--output",
"json",
},
&listNodes,
)
listNodes, err := headscale.ListNodes()
assertNoErr(t, err)
assert.Len(t, listNodes, 1)

Expand All @@ -751,19 +685,10 @@ func TestOIDCReloginSameNodeNewUser(t *testing.T) {
_, err = doLoginURL(ts.Hostname(), u)
assertNoErr(t, err)

err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"users",
"list",
"--output",
"json",
},
&listUsers,
)
listUsers, err = headscale.ListUsers()
assertNoErr(t, err)
assert.Len(t, listUsers, 2)
wantUsers = []v1.User{
wantUsers = []*v1.User{
{
Id: 1,
Name: "user1",
Expand All @@ -788,17 +713,7 @@ func TestOIDCReloginSameNodeNewUser(t *testing.T) {
t.Fatalf("unexpected users: %s", diff)
}

var listNodesAfterNewUserLogin []v1.Node
err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"nodes",
"list",
"--output",
"json",
},
&listNodesAfterNewUserLogin,
)
listNodesAfterNewUserLogin, err := headscale.ListNodes()
assertNoErr(t, err)
assert.Len(t, listNodesAfterNewUserLogin, 2)

Expand Down Expand Up @@ -827,19 +742,10 @@ func TestOIDCReloginSameNodeNewUser(t *testing.T) {
_, err = doLoginURL(ts.Hostname(), u)
assertNoErr(t, err)

err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"users",
"list",
"--output",
"json",
},
&listUsers,
)
listUsers, err = headscale.ListUsers()
assertNoErr(t, err)
assert.Len(t, listUsers, 2)
wantUsers = []v1.User{
wantUsers = []*v1.User{
{
Id: 1,
Name: "user1",
Expand All @@ -864,17 +770,7 @@ func TestOIDCReloginSameNodeNewUser(t *testing.T) {
t.Fatalf("unexpected users: %s", diff)
}

var listNodesAfterLoggingBackIn []v1.Node
err = executeAndUnmarshal(headscale,
[]string{
"headscale",
"nodes",
"list",
"--output",
"json",
},
&listNodesAfterLoggingBackIn,
)
listNodesAfterLoggingBackIn, err := headscale.ListNodes()
assertNoErr(t, err)
assert.Len(t, listNodesAfterLoggingBackIn, 2)

Expand Down
15 changes: 2 additions & 13 deletions integration/auth_web_flow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"strings"
"testing"

v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/juanfont/headscale/integration/hsic"
"github.com/samber/lo"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -112,12 +111,7 @@ func TestAuthWebFlowLogoutAndRelogin(t *testing.T) {
headscale, err := scenario.Headscale()
assertNoErrGetHeadscale(t, err)

var listNodes []*v1.Node
for username := range spec {
nodes, err := headscale.ListNodesInUser(username)
assertNoErr(t, err)
listNodes = append(listNodes, nodes...)
}
listNodes, err := headscale.ListNodes()
assert.Equal(t, len(listNodes), len(allClients))
nodeCountBeforeLogout := len(listNodes)
t.Logf("node count before logout: %d", nodeCountBeforeLogout)
Expand Down Expand Up @@ -165,12 +159,7 @@ func TestAuthWebFlowLogoutAndRelogin(t *testing.T) {
success = pingAllHelper(t, allClients, allAddrs)
t.Logf("%d successful pings out of %d", success, len(allClients)*len(allIps))

listNodes = nil
for username := range spec {
nodes, err := headscale.ListNodesInUser(username)
assertNoErr(t, err)
listNodes = append(listNodes, nodes...)
}
listNodes, err = headscale.ListNodes()
require.Equal(t, nodeCountBeforeLogout, len(listNodes))
t.Logf("node count first login: %d, after relogin: %d", nodeCountBeforeLogout, len(listNodes))

Expand Down
3 changes: 2 additions & 1 deletion integration/control.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ type ControlServer interface {
WaitForRunning() error
CreateUser(user string) error
CreateAuthKey(user string, reusable bool, ephemeral bool) (*v1.PreAuthKey, error)
ListNodesInUser(user string) ([]*v1.Node, error)
ListNodes(users ...string) ([]*v1.Node, error)
ListUsers() ([]*v1.User, error)
GetCert() []byte
GetHostname() string
GetIP() string
Expand Down
Loading

0 comments on commit b12df05

Please sign in to comment.