Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: move NATS message definitions into separate package #465

Merged
merged 2 commits into from
Aug 16, 2024
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
29 changes: 29 additions & 0 deletions internal/bus/ssh.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Package bus contains the definitions of the messages passed across NATS.
package bus

import "log/slog"

const (
// SubjectSSHAccessQuery defines the NATS subject for SSH access queries.
SubjectSSHAccessQuery = "lagoon.sshportal.api"
)

// SSHAccessQuery defines the structure of an SSH access query.
type SSHAccessQuery struct {
SSHFingerprint string
NamespaceName string
ProjectID int
EnvironmentID int
SessionID string
}

// LogValue implements the slog.LogValuer interface.
func (q SSHAccessQuery) LogValue() slog.Value {
return slog.GroupValue(
slog.String("sshFingerprint", q.SSHFingerprint),
slog.String("namespaceName", q.NamespaceName),
slog.Int("projectID", q.ProjectID),
slog.Int("environmentID", q.EnvironmentID),
slog.String("sessionID", q.SessionID),
)
}
14 changes: 11 additions & 3 deletions internal/sshportalapi/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/google/uuid"
"github.com/nats-io/nats.go"
"github.com/uselagoon/ssh-portal/internal/bus"
"github.com/uselagoon/ssh-portal/internal/lagoon"
"github.com/uselagoon/ssh-portal/internal/lagoondb"
"github.com/uselagoon/ssh-portal/internal/rbac"
Expand All @@ -36,8 +37,15 @@ type KeycloakService interface {
}

// ServeNATS sshportalapi NATS requests.
func ServeNATS(ctx context.Context, stop context.CancelFunc, log *slog.Logger,
p *rbac.Permission, l LagoonDBService, k KeycloakService, natsURL string) error {
func ServeNATS(
ctx context.Context,
stop context.CancelFunc,
log *slog.Logger,
p *rbac.Permission,
l LagoonDBService,
k KeycloakService,
natsURL string,
) error {
// setup synchronisation
wg := sync.WaitGroup{}
wg.Add(1)
Expand Down Expand Up @@ -65,7 +73,7 @@ func ServeNATS(ctx context.Context, stop context.CancelFunc, log *slog.Logger,
}
defer nc.Close()
// set up request/response callback for sshportal
_, err = nc.QueueSubscribe(SubjectSSHAccessQuery, queue,
_, err = nc.QueueSubscribe(bus.SubjectSSHAccessQuery, queue,
sshportal(ctx, log, nc, p, l, k))
if err != nil {
return fmt.Errorf("couldn't subscribe to queue: %v", err)
Expand Down
30 changes: 3 additions & 27 deletions internal/sshportalapi/sshportal.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,37 +9,13 @@ import (
"github.com/nats-io/nats.go"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/uselagoon/ssh-portal/internal/bus"
"github.com/uselagoon/ssh-portal/internal/lagoon"
"github.com/uselagoon/ssh-portal/internal/lagoondb"
"github.com/uselagoon/ssh-portal/internal/rbac"
"go.opentelemetry.io/otel"
)

const (
// SubjectSSHAccessQuery defines the NATS subject for SSH access queries.
SubjectSSHAccessQuery = "lagoon.sshportal.api"
)

// SSHAccessQuery defines the structure of an SSH access query.
type SSHAccessQuery struct {
SSHFingerprint string
NamespaceName string
ProjectID int
EnvironmentID int
SessionID string
}

// LogValue implements the slog.LogValuer interface.
func (q SSHAccessQuery) LogValue() slog.Value {
return slog.GroupValue(
slog.String("sshFingerprint", q.SSHFingerprint),
slog.String("namespaceName", q.NamespaceName),
slog.Int("projectID", q.ProjectID),
slog.Int("environmentID", q.EnvironmentID),
slog.String("sessionID", q.SessionID),
)
}

var (
requestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "sshportalapi_requests_total",
Expand All @@ -55,10 +31,10 @@ func sshportal(
l LagoonDBService,
k KeycloakService,
) nats.Handler {
return func(_, replySubject string, query *SSHAccessQuery) {
return func(_, replySubject string, query *bus.SSHAccessQuery) {
var realmRoles, userGroups []string
// set up tracing and update metrics
ctx, span := otel.Tracer(pkgName).Start(ctx, SubjectSSHAccessQuery)
ctx, span := otel.Tracer(pkgName).Start(ctx, bus.SubjectSSHAccessQuery)
defer span.End()
requestsCounter.Inc()
log := log.With(slog.Any("query", query))
Expand Down
6 changes: 3 additions & 3 deletions internal/sshserver/authhandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import (
"github.com/nats-io/nats.go"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/uselagoon/ssh-portal/internal/bus"
"github.com/uselagoon/ssh-portal/internal/k8s"
"github.com/uselagoon/ssh-portal/internal/sshportalapi"
gossh "golang.org/x/crypto/ssh"
)

Expand Down Expand Up @@ -60,7 +60,7 @@ func pubKeyAuth(log *slog.Logger, nc *nats.EncodedConn,
}
// construct ssh access query
fingerprint := gossh.FingerprintSHA256(pubKey)
q := sshportalapi.SSHAccessQuery{
q := bus.SSHAccessQuery{
SSHFingerprint: fingerprint,
NamespaceName: ctx.User(),
ProjectID: pid,
Expand All @@ -69,7 +69,7 @@ func pubKeyAuth(log *slog.Logger, nc *nats.EncodedConn,
}
// send query
var ok bool
err = nc.Request(sshportalapi.SubjectSSHAccessQuery, q, &ok, natsTimeout)
err = nc.Request(bus.SubjectSSHAccessQuery, q, &ok, natsTimeout)
if err != nil {
log.Warn("couldn't make NATS request", slog.Any("error", err))
return false
Expand Down
2 changes: 1 addition & 1 deletion internal/sshserver/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func Serve(
log.Warn("couldn't shutdown cleanly", slog.Any("error", err))
}
}()
if err := srv.Serve(l); !errors.Is(ssh.ErrServerClosed, err) {
if err := srv.Serve(l); !errors.Is(err, ssh.ErrServerClosed) {
return err
}
return nil
Expand Down
2 changes: 1 addition & 1 deletion internal/sshtoken/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func Serve(
log.Warn("couldn't shutdown cleanly", slog.Any("error", err))
}
}()
if err := srv.Serve(l); !errors.Is(ssh.ErrServerClosed, err) {
if err := srv.Serve(l); !errors.Is(err, ssh.ErrServerClosed) {
return err
}
return nil
Expand Down
Loading