Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions api/client/client.go
Comment thread
kiosion marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -3694,6 +3694,38 @@ func (c *Client) DeleteAllApps(ctx context.Context) error {
return trace.Wrap(err)
}

// ListAuthServers returns a paginated list of auth servers registered in the cluster.
func (c *Client) ListAuthServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) {
resp, err := c.PresenceServiceClient().ListAuthServers(ctx, &presencepb.ListAuthServersRequest{
PageSize: int32(pageSize),
PageToken: pageToken,
})
if err != nil {
return nil, "", trace.Wrap(err)
}
servers := make([]types.Server, 0, len(resp.Servers))
for _, server := range resp.Servers {
servers = append(servers, server)
}
return servers, resp.NextPageToken, nil
}

// ListProxyServers returns a paginated list of proxy servers registered in the cluster.
func (c *Client) ListProxyServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) {
resp, err := c.PresenceServiceClient().ListProxyServers(ctx, &presencepb.ListProxyServersRequest{
PageSize: int32(pageSize),
PageToken: pageToken,
})
if err != nil {
return nil, "", trace.Wrap(err)
}
servers := make([]types.Server, 0, len(resp.Servers))
for _, server := range resp.Servers {
servers = append(servers, server)
}
return servers, resp.NextPageToken, nil
}

// CreateKubernetesCluster creates a new kubernetes cluster resource.
func (c *Client) CreateKubernetesCluster(ctx context.Context, cluster types.KubeCluster) error {
kubeClusterV3, ok := cluster.(*types.KubernetesClusterV3)
Expand Down
334 changes: 293 additions & 41 deletions api/gen/proto/go/teleport/presence/v1/service.pb.go

Large diffs are not rendered by default.

80 changes: 80 additions & 0 deletions api/gen/proto/go/teleport/presence/v1/service_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 41 additions & 0 deletions api/proto/teleport/presence/v1/service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ service PresenceService {
rpc ListRelayServers(ListRelayServersRequest) returns (ListRelayServersResponse);
// DeleteRelayServer deletes a relay_server resource by name.
rpc DeleteRelayServer(DeleteRelayServerRequest) returns (DeleteRelayServerResponse);

// ListAuthServers returns a page of Auth servers.
rpc ListAuthServers(ListAuthServersRequest) returns (ListAuthServersResponse);
// ListProxyServers returns a page of Proxy servers.
rpc ListProxyServers(ListProxyServersRequest) returns (ListProxyServersResponse);
}

// Request for GetRemoteCluster
Expand Down Expand Up @@ -161,3 +166,39 @@ message DeleteRelayServerRequest {

// Response message for the PresenceService.DeleteRelayServer rpc.
message DeleteRelayServerResponse {}

// Request message for the PresenceService.ListAuthServers rpc.
message ListAuthServersRequest {
// The maximum number of items to return.
// The server may impose a different page size at its discretion.
int32 page_size = 1;
// The next_page_token value returned from a previous List request, if any.
string page_token = 2;
}

// Response message for the PresenceService.ListAuthServers rpc.
message ListAuthServersResponse {
// A list of auth server resources.
repeated types.ServerV2 servers = 1;
// Token to retrieve the next page of results, or empty if there are no
// more results in the list.
string next_page_token = 2;
}

// Request message for the PresenceService.ListProxyServers rpc.
message ListProxyServersRequest {
// The maximum number of items to return.
// The server may impose a different page size at its discretion.
int32 page_size = 1;
// The next_page_token value returned from a previous List request, if any.
string page_token = 2;
}

// Response message for the PresenceService.ListProxyServers rpc.
message ListProxyServersResponse {
// A list of proxy server resources.
repeated types.ServerV2 servers = 1;
// Token to retrieve the next page of results, or empty if there are no
// more results in the list.
string next_page_token = 2;
}
6 changes: 4 additions & 2 deletions integration/ec2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,15 @@ import (
"github.com/gravitational/teleport/api/client/proto"
apidefaults "github.com/gravitational/teleport/api/defaults"
"github.com/gravitational/teleport/api/types"
"github.com/gravitational/teleport/api/utils/clientutils"
"github.com/gravitational/teleport/integration/helpers"
"github.com/gravitational/teleport/lib"
"github.com/gravitational/teleport/lib/backend"
"github.com/gravitational/teleport/lib/backend/lite"
cloudimds "github.com/gravitational/teleport/lib/cloud/imds"
cloudaws "github.com/gravitational/teleport/lib/cloud/imds/aws"
"github.com/gravitational/teleport/lib/defaults"
"github.com/gravitational/teleport/lib/itertools/stream"
"github.com/gravitational/teleport/lib/labels"
"github.com/gravitational/teleport/lib/service"
"github.com/gravitational/teleport/lib/service/servicecfg"
Expand Down Expand Up @@ -260,7 +262,7 @@ func TestIAMNodeJoin(t *testing.T) {
require.NoError(t, err)

// sanity check there are no proxies to start with
proxies, err := authServer.GetProxies()
proxies, err := stream.Collect(clientutils.Resources(ctx, authServer.ListProxyServers))
require.NoError(t, err)
require.Empty(t, proxies)

Expand All @@ -274,7 +276,7 @@ func TestIAMNodeJoin(t *testing.T) {

// the proxy should eventually join the cluster and heartbeat
require.EventuallyWithT(t, func(t *assert.CollectT) {
proxies, err := authServer.GetProxies()
proxies, err := stream.Collect(clientutils.Resources(ctx, authServer.ListProxyServers))
require.NoError(t, err)
require.NotEmpty(t, proxies)
}, 10*time.Second, 50*time.Millisecond, "waiting for proxy to join cluster")
Expand Down
2 changes: 1 addition & 1 deletion lib/auth/accountrecovery_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1032,7 +1032,7 @@ func TestGetAccountRecoveryToken(t *testing.T) {
name: "invalid token type",
wantErr: true,
getRequest: func() *proto.GetAccountRecoveryTokenRequest {
wrongTokenType, err := srv.Auth().NewUserToken(authclient.CreateUserTokenRequest{
wrongTokenType, err := srv.Auth().NewUserToken(ctx, authclient.CreateUserTokenRequest{
Name: "llama",
TTL: 5 * time.Minute,
Type: authclient.UserTokenTypeResetPassword,
Expand Down
8 changes: 8 additions & 0 deletions lib/auth/apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,10 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) {
// Servers and presence heartbeat
srv.POST("/:version/namespaces/:namespace/nodes/keepalive", srv.WithAuth(srv.keepAliveNode))
srv.POST("/:version/authservers", srv.WithAuth(srv.upsertAuthServer))
// TODO(kiosion) DELETE IN 21.0.0
srv.GET("/:version/authservers", srv.WithScopedAuth(srv.getAuthServers))
srv.POST("/:version/proxies", srv.WithAuth(srv.upsertProxy))
// TODO(kiosion) DELETE IN 21.0.0
srv.GET("/:version/proxies", srv.WithScopedAuth(srv.getProxies))
srv.DELETE("/:version/proxies", srv.WithAuth(srv.deleteAllProxies))
srv.DELETE("/:version/proxies/:name", srv.WithAuth(srv.deleteProxy))
Expand Down Expand Up @@ -306,7 +308,10 @@ func (s *APIServer) upsertProxy(auth *ServerWithRoles, w http.ResponseWriter, r
}

// getProxies returns registered proxies
//
// TODO(kiosion) DELETE IN 21.0.0
func (s *APIServer) getProxies(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (any, error) {
//nolint:staticcheck // TODO(kiosion) DELETE IN 21.0.0
servers, err := auth.GetProxies()
if err != nil {
return nil, trace.Wrap(err)
Expand Down Expand Up @@ -342,7 +347,10 @@ func (s *APIServer) upsertAuthServer(auth *ServerWithRoles, w http.ResponseWrite
}

// getAuthServers returns registered auth servers
//
// TODO(kiosion) DELETE IN 21.0.0
func (s *APIServer) getAuthServers(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (any, error) {
//nolint:staticcheck // TODO(kiosion) DELETE IN 21.0.0
servers, err := auth.GetAuthServers()
if err != nil {
return nil, trace.Wrap(err)
Expand Down
2 changes: 2 additions & 0 deletions lib/auth/apiserver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,10 @@ func TestUpsertServer(t *testing.T) {
require.NoError(t, err)
allServers = append(allServers, servers...)
}
//nolint:staticcheck // TODO(kiosion) DELETE IN 21.0.0
addServers(s.GetAuthServers())
addServers(s.GetNodes(ctx, apidefaults.Namespace))
//nolint:staticcheck // TODO(kiosion) DELETE IN 21.0.0
addServers(s.GetProxies())
require.Empty(t, cmp.Diff(allServers, []types.Server{tt.wantServer}, cmpopts.IgnoreFields(types.Metadata{}, "Revision")))
})
Expand Down
12 changes: 7 additions & 5 deletions lib/auth/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -4435,7 +4435,7 @@ func (a *Server) createTOTPPrivilegeToken(ctx context.Context, username string)
return nil, trace.Wrap(err)
}

token, err := a.newUserToken(tokenReq)
token, err := a.newUserToken(ctx, tokenReq)
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down Expand Up @@ -4474,7 +4474,7 @@ func (a *Server) createRegisterChallenge(ctx context.Context, req *newRegisterCh
return nil, trace.BadParameter("all TOTP registrations require a privilege token")
}

otpKey, otpOpts, err := a.newTOTPKey(req.username)
otpKey, otpOpts, err := a.newTOTPKey(ctx, req.username)
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down Expand Up @@ -7517,7 +7517,7 @@ func (a *Server) Ping(ctx context.Context) (proto.PingResponse, error) {
ClusterName: cn.GetClusterName(),
ServerVersion: teleport.Version,
ServerFeatures: features,
ProxyPublicAddr: a.getProxyPublicAddr(),
ProxyPublicAddr: a.getProxyPublicAddr(ctx),
IsBoring: modules.GetModules().IsBoringBinary(),
LoadAllCAs: a.loadAllCAs,
SignatureAlgorithmSuite: authPref.GetSignatureAlgorithmSuite(),
Expand Down Expand Up @@ -8469,8 +8469,10 @@ func (a *Server) verifyAccessRequestMonthlyLimit(ctx context.Context) error {

// getProxyPublicAddr returns the first valid, non-empty proxy public address it
// finds, or empty otherwise.
func (a *Server) getProxyPublicAddr() string {
if proxies, err := a.GetProxies(); err == nil {
func (a *Server) getProxyPublicAddr(ctx context.Context) string {
if proxies, err := iterstream.Collect(
clientutils.Resources(ctx, a.ListProxyServers),
); err == nil {
for _, p := range proxies {
addr := p.GetPublicAddr()
if addr == "" {
Expand Down
8 changes: 4 additions & 4 deletions lib/auth/auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3211,7 +3211,7 @@ func TestDeleteMFADeviceSync(t *testing.T) {

deleteReqUsingToken := func(tokenReq authclient.CreateUserTokenRequest) func(t *testing.T) *proto.DeleteMFADeviceSyncRequest {
return func(t *testing.T) *proto.DeleteMFADeviceSyncRequest {
token, err := authServer.NewUserToken(tokenReq)
token, err := authServer.NewUserToken(ctx, tokenReq)
require.NoError(t, err, "newUserToken")

_, err = authServer.CreateUserToken(ctx, token)
Expand Down Expand Up @@ -3416,7 +3416,7 @@ func TestDeleteMFADeviceSync_WithErrors(t *testing.T) {
deleteReq := test.deleteReq

if test.tokenRequest != nil {
token, err := authServer.NewUserToken(*test.tokenRequest)
token, err := authServer.NewUserToken(ctx, *test.tokenRequest)
require.NoError(t, err)
_, err = authServer.CreateUserToken(context.Background(), token)
require.NoError(t, err)
Expand Down Expand Up @@ -3634,7 +3634,7 @@ func TestAddMFADeviceSync(t *testing.T) {
wantErr: true,
getReq: func(t *testing.T, deviceName string) *proto.AddMFADeviceSyncRequest {
// Obtain a non privilege token.
token, err := authServer.NewUserToken(authclient.CreateUserTokenRequest{
token, err := authServer.NewUserToken(ctx, authclient.CreateUserTokenRequest{
Name: u.username,
TTL: 5 * time.Minute,
Type: authclient.UserTokenTypeResetPassword,
Expand Down Expand Up @@ -3823,7 +3823,7 @@ func TestGetMFADevices_WithToken(t *testing.T) {
tokenID := "test-token-not-found"

if tc.tokenRequest != nil {
token, err := srv.Auth().NewUserToken(*tc.tokenRequest)
token, err := srv.Auth().NewUserToken(ctx, *tc.tokenRequest)
require.NoError(t, err)
_, err = srv.Auth().CreateUserToken(context.Background(), token)
require.NoError(t, err)
Expand Down
Loading
Loading