temp: additional events

This commit is contained in:
Johan Siebens
2024-02-19 10:02:04 +01:00
parent 7034ff99dc
commit a3b6f3bd0c
8 changed files with 139 additions and 38 deletions
+94 -29
View File
@@ -7,20 +7,18 @@ import (
)
const (
tailnetCreated = "ionscale.tailnet.created"
tailnetDeleted = "ionscale.tailnet.deleted"
nodeCreated = "ionscale.node.created"
tailnetCreated = "ionscale.tailnet.create"
tailnetIamUpdated = "ionscale.tailnet.iam.update"
tailnetAclUpdated = "ionscale.tailnet.acl.update"
tailnetDNSConfigUpdated = "ionscale.tailnet.dns_config.update"
nodeCreated = "ionscale.node.create"
)
func TailnetCreated(tailnet *domain.Tailnet, actor *domain.User) cloudevents.Event {
data := &EventData{
func TailnetCreated(tailnet *domain.Tailnet, actor ActorOpts) cloudevents.Event {
data := &EventData[any]{
Tailnet: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Target: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Actor: system,
}
if actor != nil {
data.Actor = Actor{ID: idToStr(actor.ID), Name: actor.Name}
Actor: actor(),
}
event := cloudevents.NewEvent()
@@ -30,11 +28,65 @@ func TailnetCreated(tailnet *domain.Tailnet, actor *domain.User) cloudevents.Eve
return event
}
func MachineCreated(machine *domain.Machine, actor *domain.User) cloudevents.Event {
data := &EventData{
func TailnetIAMUpdated(tailnet *domain.Tailnet, old *domain.IAMPolicy, actor ActorOpts) cloudevents.Event {
data := &EventData[*domain.IAMPolicy]{
Tailnet: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Target: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Actor: actor(),
Attr: &Attr[*domain.IAMPolicy]{
New: &tailnet.IAMPolicy,
Old: old,
},
}
event := cloudevents.NewEvent()
event.SetType(tailnetIamUpdated)
_ = event.SetData(cloudevents.ApplicationJSON, data)
return event
}
func TailnetACLUpdated(tailnet *domain.Tailnet, old *domain.ACLPolicy, actor ActorOpts) cloudevents.Event {
data := &EventData[*domain.ACLPolicy]{
Tailnet: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Target: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Actor: actor(),
Attr: &Attr[*domain.ACLPolicy]{
New: &tailnet.ACLPolicy,
Old: old,
},
}
event := cloudevents.NewEvent()
event.SetType(tailnetAclUpdated)
_ = event.SetData(cloudevents.ApplicationJSON, data)
return event
}
func TailnetDNSConfigUpdated(tailnet *domain.Tailnet, old *domain.DNSConfig, actor ActorOpts) cloudevents.Event {
data := &EventData[*domain.DNSConfig]{
Tailnet: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Target: &Target{ID: idToStr(tailnet.ID), Name: tailnet.Name},
Actor: actor(),
Attr: &Attr[*domain.DNSConfig]{
New: &tailnet.DNSConfig,
Old: old,
},
}
event := cloudevents.NewEvent()
event.SetType(tailnetDNSConfigUpdated)
_ = event.SetData(cloudevents.ApplicationJSON, data)
return event
}
func MachineCreated(machine *domain.Machine, actor ActorOpts) cloudevents.Event {
data := &EventData[any]{
Tailnet: &Target{ID: idToStr(machine.Tailnet.ID), Name: machine.Tailnet.Name},
Target: &Target{ID: idToStr(machine.ID), Name: machine.CompleteName(), Addresses: machine.IPs()},
Actor: UserToActor(actor),
Target: &Target{ID: idToStr(machine.ID), Name: machine.CompleteName()},
Actor: actor(),
}
event := cloudevents.NewEvent()
@@ -44,29 +96,39 @@ func MachineCreated(machine *domain.Machine, actor *domain.User) cloudevents.Eve
return event
}
func UserToActor(actor *domain.User) Actor {
if actor == nil {
return system
type ActorOpts func() Actor
func User(u *domain.User) ActorOpts {
if u == nil {
return SystemAdmin()
}
switch actor.UserType {
switch u.UserType {
case domain.UserTypePerson:
return Actor{ID: idToStr(actor.ID), Name: actor.Name}
return func() Actor {
return Actor{ID: idToStr(u.ID), Name: u.Name}
}
default:
return system
return SystemAdmin()
}
}
type EventData struct {
Tailnet *Target `json:"tailnet,omitempty"`
Target *Target `json:"target,omitempty"`
Actor Actor `json:"actor"`
func SystemAdmin() ActorOpts {
return func() Actor {
return Actor{ID: "", Name: "system admin"}
}
}
type EventData[T any] struct {
Tailnet *Target `json:"tailnet,omitempty"`
Target *Target `json:"target,omitempty"`
Attr *Attr[T] `json:"attr,omitempty"`
Actor Actor `json:"actor"`
}
type Target struct {
ID string `json:"id"`
Name string `json:"name"`
Addresses []string `json:"addresses,omitempty"`
ID string `json:"id"`
Name string `json:"name"`
}
type Actor struct {
@@ -74,8 +136,11 @@ type Actor struct {
Name string `json:"name"`
}
type Attr[T any] struct {
New T `json:"new"`
Old T `json:"old,omitempty"`
}
func idToStr(id uint64) string {
return big.NewInt(int64(id)).Text(10)
}
var system = Actor{ID: "", Name: "ionscale system"}
+1 -1
View File
@@ -99,7 +99,7 @@ func Configure(c *config.Config) error {
_globalMu.Lock()
defer _globalMu.Unlock()
_globalE = &eventer{
source: c.ServerUrl,
source: c.WebPublicUrl.String(),
sinks: sinks,
}
+1 -1
View File
@@ -509,7 +509,7 @@ func (h *AuthenticationHandlers) endMachineRegistrationFlow(c echo.Context, form
m.IPv4 = domain.IP{Addr: ipv4}
m.IPv6 = domain.IP{Addr: ipv6}
events = append(events, eventlog.MachineCreated(m, user))
events = append(events, eventlog.MachineCreated(m, eventlog.User(user)))
} else {
registeredTags := tags
advertisedTags := domain.SanitizeTags(req.Hostinfo.RequestTags)
+1 -1
View File
@@ -222,7 +222,7 @@ func (h *RegistrationHandlers) authenticateMachineWithAuthKey(c echo.Context, ma
m.IPv4 = domain.IP{Addr: ipv4}
m.IPv6 = domain.IP{Addr: ipv6}
events = append(events, eventlog.MachineCreated(m, &user))
events = append(events, eventlog.MachineCreated(m, eventlog.User(&user)))
} else {
sanitizeHostname := dnsname.SanitizeHostname(req.Hostinfo.Hostname)
if m.Name != sanitizeHostname {
+2
View File
@@ -5,6 +5,7 @@ import (
"fmt"
"github.com/bufbuild/connect-go"
"github.com/jsiebens/ionscale/internal/domain"
"github.com/jsiebens/ionscale/internal/eventlog"
"github.com/jsiebens/ionscale/internal/mapping"
api "github.com/jsiebens/ionscale/pkg/gen/ionscale/v1"
)
@@ -60,6 +61,7 @@ func (s *Service) SetACLPolicy(ctx context.Context, req *connect.Request[api.Set
return nil, logError(err)
}
eventlog.Send(ctx, eventlog.TailnetACLUpdated(tailnet, &oldPolicy, eventlog.User(principal.User)))
s.sessionManager.NotifyAll(tailnet.ID)
return connect.NewResponse(&api.SetACLPolicyResponse{}), nil
+2
View File
@@ -6,6 +6,7 @@ import (
"github.com/bufbuild/connect-go"
"github.com/jsiebens/ionscale/internal/config"
"github.com/jsiebens/ionscale/internal/domain"
"github.com/jsiebens/ionscale/internal/eventlog"
api "github.com/jsiebens/ionscale/pkg/gen/ionscale/v1"
)
@@ -66,6 +67,7 @@ func (s *Service) SetDNSConfig(ctx context.Context, req *connect.Request[api.Set
return nil, logError(err)
}
eventlog.Send(ctx, eventlog.TailnetDNSConfigUpdated(tailnet, &oldConfig, eventlog.User(principal.User)))
s.sessionManager.NotifyAll(tailnet.ID)
return connect.NewResponse(&api.SetDNSConfigResponse{Config: domainDNSConfigToApiDNSConfig(tailnet)}), nil
+3
View File
@@ -5,6 +5,7 @@ import (
"fmt"
"github.com/bufbuild/connect-go"
"github.com/jsiebens/ionscale/internal/domain"
"github.com/jsiebens/ionscale/internal/eventlog"
api "github.com/jsiebens/ionscale/pkg/gen/ionscale/v1"
)
@@ -68,6 +69,8 @@ func (s *Service) SetIAMPolicy(ctx context.Context, req *connect.Request[api.Set
return nil, logError(err)
}
eventlog.Send(ctx, eventlog.TailnetIAMUpdated(tailnet, &oldPolicy, eventlog.User(principal.User)))
return connect.NewResponse(&api.SetIAMPolicyResponse{}), nil
}
+35 -6
View File
@@ -5,6 +5,7 @@ import (
"encoding/json"
"fmt"
"github.com/bufbuild/connect-go"
cloudevents "github.com/cloudevents/sdk-go/v2"
"github.com/jsiebens/ionscale/internal/domain"
"github.com/jsiebens/ionscale/internal/eventlog"
"github.com/jsiebens/ionscale/internal/mapping"
@@ -97,7 +98,12 @@ func (s *Service) CreateTailnet(ctx context.Context, req *connect.Request[api.Cr
return nil, logError(err)
}
eventlog.Send(ctx, eventlog.TailnetCreated(tailnet, principal.User))
eventlog.Send(ctx,
eventlog.TailnetCreated(tailnet, eventlog.User(principal.User)),
eventlog.TailnetIAMUpdated(tailnet, nil, eventlog.User(principal.User)),
eventlog.TailnetACLUpdated(tailnet, nil, eventlog.User(principal.User)),
eventlog.TailnetDNSConfigUpdated(tailnet, nil, eventlog.User(principal.User)),
)
resp := &api.CreateTailnetResponse{Tailnet: t}
@@ -119,26 +125,48 @@ func (s *Service) UpdateTailnet(ctx context.Context, req *connect.Request[api.Up
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("tailnet not found"))
}
events := make([]cloudevents.Event, 0)
if req.Msg.IamPolicy != nil {
if err := validateIamPolicy(req.Msg.IamPolicy); err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invalid iam policy: %w", err))
}
tailnet.IAMPolicy = domain.IAMPolicy{}
if err := mapping.CopyViaJson(req.Msg.IamPolicy, &tailnet.IAMPolicy); err != nil {
oldPolicy := tailnet.IAMPolicy
var newPolicy domain.IAMPolicy
if err := mapping.CopyViaJson(req.Msg.IamPolicy, &newPolicy); err != nil {
return nil, logError(err)
}
if !oldPolicy.Equal(&newPolicy) {
tailnet.IAMPolicy = newPolicy
events = append(events, eventlog.TailnetIAMUpdated(tailnet, &oldPolicy, eventlog.User(principal.User)))
}
}
if req.Msg.AclPolicy != nil {
tailnet.ACLPolicy = domain.ACLPolicy{}
if err := mapping.CopyViaJson(req.Msg.AclPolicy, &tailnet.ACLPolicy); err != nil {
oldPolicy := tailnet.ACLPolicy
var newPolicy domain.ACLPolicy
if err := mapping.CopyViaJson(req.Msg.AclPolicy, &newPolicy); err != nil {
return nil, logError(err)
}
if !oldPolicy.Equal(&newPolicy) {
tailnet.ACLPolicy = newPolicy
events = append(events, eventlog.TailnetACLUpdated(tailnet, &oldPolicy, eventlog.User(principal.User)))
}
}
if req.Msg.DnsConfig != nil {
tailnet.DNSConfig = apiDNSConfigToDomainDNSConfig(req.Msg.DnsConfig)
oldConfig := tailnet.DNSConfig
newConfig := apiDNSConfigToDomainDNSConfig(req.Msg.DnsConfig)
if !oldConfig.Equal(&newConfig) {
tailnet.DNSConfig = newConfig
events = append(events, eventlog.TailnetDNSConfigUpdated(tailnet, &oldConfig, eventlog.User(principal.User)))
}
}
tailnet.ServiceCollectionEnabled = req.Msg.ServiceCollectionEnabled
@@ -150,6 +178,7 @@ func (s *Service) UpdateTailnet(ctx context.Context, req *connect.Request[api.Up
return nil, logError(err)
}
eventlog.Send(ctx, events...)
s.sessionManager.NotifyAll(tailnet.ID)
t, err := domainTailnetToApiTailnet(tailnet)