mirror of
https://github.com/juanfont/headscale.git
synced 2026-09-19 14:54:53 +09:00
cli: migrate the CLI and integration tests to the v1 HTTP API
Replace the gRPC client with the generated HTTP client across every command: locally over the unix socket without auth (matching the previous local gRPC socket), remotely over TLS with a Bearer API key. Output rendering and integration tests move to the HTTP client types; the transport changes, the assertions do not.
This commit is contained in:
@@ -1,11 +1,10 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
|
||||
clientv1 "github.com/juanfont/headscale/gen/client/v1"
|
||||
"github.com/juanfont/headscale/integration/hsic"
|
||||
"github.com/juanfont/headscale/integration/integrationutil"
|
||||
"github.com/juanfont/headscale/integration/tsic"
|
||||
@@ -55,7 +54,7 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
|
||||
assert.Len(t, keys, 5)
|
||||
|
||||
var listedAPIKeys []v1.ApiKey
|
||||
var listedAPIKeys []clientv1.ApiKey
|
||||
|
||||
assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
err = executeAndUnmarshal(headscale,
|
||||
@@ -73,43 +72,43 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
|
||||
assert.Len(t, listedAPIKeys, 5)
|
||||
|
||||
assert.Equal(t, uint64(1), listedAPIKeys[0].GetId())
|
||||
assert.Equal(t, uint64(2), listedAPIKeys[1].GetId())
|
||||
assert.Equal(t, uint64(3), listedAPIKeys[2].GetId())
|
||||
assert.Equal(t, uint64(4), listedAPIKeys[3].GetId())
|
||||
assert.Equal(t, uint64(5), listedAPIKeys[4].GetId())
|
||||
assert.Equal(t, "1", listedAPIKeys[0].Id)
|
||||
assert.Equal(t, "2", listedAPIKeys[1].Id)
|
||||
assert.Equal(t, "3", listedAPIKeys[2].Id)
|
||||
assert.Equal(t, "4", listedAPIKeys[3].Id)
|
||||
assert.Equal(t, "5", listedAPIKeys[4].Id)
|
||||
|
||||
assert.NotEmpty(t, listedAPIKeys[0].GetPrefix())
|
||||
assert.NotEmpty(t, listedAPIKeys[1].GetPrefix())
|
||||
assert.NotEmpty(t, listedAPIKeys[2].GetPrefix())
|
||||
assert.NotEmpty(t, listedAPIKeys[3].GetPrefix())
|
||||
assert.NotEmpty(t, listedAPIKeys[4].GetPrefix())
|
||||
assert.NotEmpty(t, listedAPIKeys[0].Prefix)
|
||||
assert.NotEmpty(t, listedAPIKeys[1].Prefix)
|
||||
assert.NotEmpty(t, listedAPIKeys[2].Prefix)
|
||||
assert.NotEmpty(t, listedAPIKeys[3].Prefix)
|
||||
assert.NotEmpty(t, listedAPIKeys[4].Prefix)
|
||||
|
||||
assert.True(t, listedAPIKeys[0].GetExpiration().AsTime().After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[1].GetExpiration().AsTime().After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[2].GetExpiration().AsTime().After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[3].GetExpiration().AsTime().After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[4].GetExpiration().AsTime().After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[0].Expiration.After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[1].Expiration.After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[2].Expiration.After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[3].Expiration.After(time.Now()))
|
||||
assert.True(t, listedAPIKeys[4].Expiration.After(time.Now()))
|
||||
|
||||
assert.True(
|
||||
t,
|
||||
listedAPIKeys[0].GetExpiration().AsTime().Before(time.Now().Add(time.Hour*26)),
|
||||
listedAPIKeys[0].Expiration.Before(time.Now().Add(time.Hour*26)),
|
||||
)
|
||||
assert.True(
|
||||
t,
|
||||
listedAPIKeys[1].GetExpiration().AsTime().Before(time.Now().Add(time.Hour*26)),
|
||||
listedAPIKeys[1].Expiration.Before(time.Now().Add(time.Hour*26)),
|
||||
)
|
||||
assert.True(
|
||||
t,
|
||||
listedAPIKeys[2].GetExpiration().AsTime().Before(time.Now().Add(time.Hour*26)),
|
||||
listedAPIKeys[2].Expiration.Before(time.Now().Add(time.Hour*26)),
|
||||
)
|
||||
assert.True(
|
||||
t,
|
||||
listedAPIKeys[3].GetExpiration().AsTime().Before(time.Now().Add(time.Hour*26)),
|
||||
listedAPIKeys[3].Expiration.Before(time.Now().Add(time.Hour*26)),
|
||||
)
|
||||
assert.True(
|
||||
t,
|
||||
listedAPIKeys[4].GetExpiration().AsTime().Before(time.Now().Add(time.Hour*26)),
|
||||
listedAPIKeys[4].Expiration.Before(time.Now().Add(time.Hour*26)),
|
||||
)
|
||||
|
||||
expiredPrefixes := make(map[string]bool)
|
||||
@@ -122,15 +121,15 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
"apikeys",
|
||||
"expire",
|
||||
"--prefix",
|
||||
listedAPIKeys[idx].GetPrefix(),
|
||||
listedAPIKeys[idx].Prefix,
|
||||
},
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
expiredPrefixes[listedAPIKeys[idx].GetPrefix()] = true
|
||||
expiredPrefixes[listedAPIKeys[idx].Prefix] = true
|
||||
}
|
||||
|
||||
var listedAfterExpireAPIKeys []v1.ApiKey
|
||||
var listedAfterExpireAPIKeys []clientv1.ApiKey
|
||||
|
||||
assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
err = executeAndUnmarshal(headscale,
|
||||
@@ -147,17 +146,17 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
}, integrationutil.ScaledTimeout(10*time.Second), integrationutil.FastPoll, "Waiting for API keys list after expire")
|
||||
|
||||
for index := range listedAfterExpireAPIKeys {
|
||||
if _, ok := expiredPrefixes[listedAfterExpireAPIKeys[index].GetPrefix()]; ok {
|
||||
if _, ok := expiredPrefixes[listedAfterExpireAPIKeys[index].Prefix]; ok {
|
||||
// Expired
|
||||
assert.True(
|
||||
t,
|
||||
listedAfterExpireAPIKeys[index].GetExpiration().AsTime().Before(time.Now()),
|
||||
listedAfterExpireAPIKeys[index].Expiration.Before(time.Now()),
|
||||
)
|
||||
} else {
|
||||
// Not expired
|
||||
assert.False(
|
||||
t,
|
||||
listedAfterExpireAPIKeys[index].GetExpiration().AsTime().Before(time.Now()),
|
||||
listedAfterExpireAPIKeys[index].Expiration.Before(time.Now()),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -168,11 +167,11 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
"apikeys",
|
||||
"delete",
|
||||
"--prefix",
|
||||
listedAPIKeys[0].GetPrefix(),
|
||||
listedAPIKeys[0].Prefix,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
var listedAPIKeysAfterDelete []v1.ApiKey
|
||||
var listedAPIKeysAfterDelete []clientv1.ApiKey
|
||||
|
||||
assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
err = executeAndUnmarshal(headscale,
|
||||
@@ -197,11 +196,11 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
"apikeys",
|
||||
"expire",
|
||||
"--id",
|
||||
strconv.FormatUint(listedAPIKeysAfterDelete[0].GetId(), 10),
|
||||
listedAPIKeysAfterDelete[0].Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
var listedAPIKeysAfterExpireByID []v1.ApiKey
|
||||
var listedAPIKeysAfterExpireByID []clientv1.ApiKey
|
||||
|
||||
assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
err = executeAndUnmarshal(headscale,
|
||||
@@ -219,25 +218,25 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
|
||||
// Verify the key was expired
|
||||
for idx := range listedAPIKeysAfterExpireByID {
|
||||
if listedAPIKeysAfterExpireByID[idx].GetId() == listedAPIKeysAfterDelete[0].GetId() {
|
||||
assert.True(t, listedAPIKeysAfterExpireByID[idx].GetExpiration().AsTime().Before(time.Now()),
|
||||
if listedAPIKeysAfterExpireByID[idx].Id == listedAPIKeysAfterDelete[0].Id {
|
||||
assert.True(t, listedAPIKeysAfterExpireByID[idx].Expiration.Before(time.Now()),
|
||||
"Key expired by ID should have expiration in the past")
|
||||
}
|
||||
}
|
||||
|
||||
// Test delete by ID (using key at index 1)
|
||||
deletedKeyID := listedAPIKeysAfterExpireByID[1].GetId()
|
||||
deletedKeyID := listedAPIKeysAfterExpireByID[1].Id
|
||||
_, err = headscale.Execute(
|
||||
[]string{
|
||||
"headscale",
|
||||
"apikeys",
|
||||
"delete",
|
||||
"--id",
|
||||
strconv.FormatUint(deletedKeyID, 10),
|
||||
deletedKeyID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
var listedAPIKeysAfterDeleteByID []v1.ApiKey
|
||||
var listedAPIKeysAfterDeleteByID []clientv1.ApiKey
|
||||
|
||||
assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
err = executeAndUnmarshal(headscale,
|
||||
@@ -257,7 +256,7 @@ func TestApiKeyCommand(t *testing.T) {
|
||||
|
||||
// Verify the specific key was deleted
|
||||
for idx := range listedAPIKeysAfterDeleteByID {
|
||||
assert.NotEqual(t, deletedKeyID, listedAPIKeysAfterDeleteByID[idx].GetId(),
|
||||
assert.NotEqual(t, deletedKeyID, listedAPIKeysAfterDeleteByID[idx].Id,
|
||||
"Deleted key should not be present in the list")
|
||||
}
|
||||
}
|
||||
@@ -277,7 +276,7 @@ func TestApiKeyCommandValidation(t *testing.T) {
|
||||
_, err := headscale.Execute([]string{"headscale", "apikeys", "create", "--output", "json"})
|
||||
require.NoError(t, err)
|
||||
|
||||
var listed []v1.ApiKey
|
||||
var listed []clientv1.ApiKey
|
||||
|
||||
assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
err := executeAndUnmarshal(headscale,
|
||||
@@ -288,8 +287,8 @@ func TestApiKeyCommandValidation(t *testing.T) {
|
||||
assert.Len(c, listed, 1)
|
||||
}, integrationutil.ScaledTimeout(10*time.Second), integrationutil.FastPoll, "Waiting for API key list")
|
||||
|
||||
prefix := listed[0].GetPrefix()
|
||||
id := strconv.FormatUint(listed[0].GetId(), 10)
|
||||
prefix := listed[0].Prefix
|
||||
id := listed[0].Id
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
|
||||
Reference in New Issue
Block a user