From ce34993b74d5dd42cdaa047baccc468cefd51e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Fri, 18 Dec 2020 18:18:30 +0100 Subject: [PATCH] Round timestamps to a second accuracy Different parts of the system (FE, API, store) may use different standards so operations like IsStale check may fail. --- compose/service/record.go | 3 +-- compose/service/service.go | 2 +- federation/service/service.go | 2 +- messaging/service/service.go | 5 +++-- pkg/envoy/store/application.go | 3 +-- pkg/envoy/store/compose_chart.go | 3 +-- pkg/envoy/store/compose_module.go | 5 ++--- pkg/envoy/store/compose_namespace.go | 3 +-- pkg/envoy/store/compose_page.go | 3 +-- pkg/envoy/store/messaging_channel.go | 3 +-- pkg/envoy/store/role.go | 3 +-- pkg/envoy/store/settings.go | 3 +-- pkg/envoy/store/user.go | 3 +-- pkg/envoy/store/util.go | 6 ++++++ pkg/provision/roles.go | 4 +++- store/tests/main_test.go | 9 +++++---- system/service/service.go | 5 +++-- system/service/settings.go | 10 +++++----- 18 files changed, 38 insertions(+), 37 deletions(-) diff --git a/compose/service/record.go b/compose/service/record.go index 88f104767..2ed98ab01 100644 --- a/compose/service/record.go +++ b/compose/service/record.go @@ -863,8 +863,7 @@ func (svc record) procUpdate(ctx context.Context, s store.Storer, invokerID uint } func (svc record) recordInfoUpdate(r *types.Record) { - now := time.Now() - r.UpdatedAt = &now + r.UpdatedAt = now() r.UpdatedBy = auth.GetIdentityFromContext(svc.ctx).Identity() } diff --git a/compose/service/service.go b/compose/service/service.go index 0b7ca6cb4..22fbb9344 100644 --- a/compose/service/service.go +++ b/compose/service/service.go @@ -65,7 +65,7 @@ var ( // wrapper around time.Now() that will aid service testing now = func() *time.Time { - c := time.Now() + c := time.Now().Round(time.Second) return &c } diff --git a/federation/service/service.go b/federation/service/service.go index be7344897..4a481ecae 100644 --- a/federation/service/service.go +++ b/federation/service/service.go @@ -48,7 +48,7 @@ var ( // wrapper around time.Now() that will aid service testing now = func() *time.Time { - c := time.Now() + c := time.Now().Round(time.Second) return &c } diff --git a/messaging/service/service.go b/messaging/service/service.go index b64bffc84..48d411143 100644 --- a/messaging/service/service.go +++ b/messaging/service/service.go @@ -2,6 +2,8 @@ package service import ( "context" + "time" + "github.com/cortezaproject/corteza-server/pkg/actionlog" "github.com/cortezaproject/corteza-server/pkg/healthcheck" "github.com/cortezaproject/corteza-server/pkg/id" @@ -12,7 +14,6 @@ import ( "github.com/cortezaproject/corteza-server/pkg/rbac" "github.com/cortezaproject/corteza-server/store" "go.uber.org/zap" - "time" ) type ( @@ -53,7 +54,7 @@ var ( // wrapper around time.Now() that will aid service testing now = func() *time.Time { - c := time.Now() + c := time.Now().Round(time.Second) return &c } diff --git a/pkg/envoy/store/application.go b/pkg/envoy/store/application.go index ef2125cf2..627cbfda6 100644 --- a/pkg/envoy/store/application.go +++ b/pkg/envoy/store/application.go @@ -2,7 +2,6 @@ package store import ( "context" - "time" "github.com/cortezaproject/corteza-server/pkg/envoy" "github.com/cortezaproject/corteza-server/pkg/envoy/resource" @@ -29,7 +28,7 @@ func NewApplicationState(res *resource.Application, cfg *EncoderConfig) resource func (n *applicationState) Prepare(ctx context.Context, s store.Storer, rs *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } if n.res.Res.Unify == nil { n.res.Res.Unify = &types.ApplicationUnify{} diff --git a/pkg/envoy/store/compose_chart.go b/pkg/envoy/store/compose_chart.go index 5c7cf4664..4d8e40c82 100644 --- a/pkg/envoy/store/compose_chart.go +++ b/pkg/envoy/store/compose_chart.go @@ -3,7 +3,6 @@ package store import ( "context" "fmt" - "time" "github.com/cortezaproject/corteza-server/compose/types" "github.com/cortezaproject/corteza-server/pkg/envoy" @@ -35,7 +34,7 @@ func NewComposeChartState(res *resource.ComposeChart, cfg *EncoderConfig) resour func (n *composeChartState) Prepare(ctx context.Context, s store.Storer, state *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } // Get relate namespace diff --git a/pkg/envoy/store/compose_module.go b/pkg/envoy/store/compose_module.go index 52f558cfa..e75941375 100644 --- a/pkg/envoy/store/compose_module.go +++ b/pkg/envoy/store/compose_module.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "strconv" - "time" "github.com/cortezaproject/corteza-server/compose/types" "github.com/cortezaproject/corteza-server/pkg/envoy" @@ -38,7 +37,7 @@ func NewComposeModuleState(res *resource.ComposeModule, cfg *EncoderConfig) reso func (n *composeModuleState) Prepare(ctx context.Context, s store.Storer, state *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } // Get relate namespace @@ -160,7 +159,7 @@ func (n *composeModuleState) Encode(ctx context.Context, s store.Storer, state * f.ModuleID = res.ID f.Place = i f.DeletedAt = nil - f.CreatedAt = time.Now() + f.CreatedAt = *now() if f.Kind == "Record" { refM := f.Options.String("module") diff --git a/pkg/envoy/store/compose_namespace.go b/pkg/envoy/store/compose_namespace.go index ccc340491..a7becf48f 100644 --- a/pkg/envoy/store/compose_namespace.go +++ b/pkg/envoy/store/compose_namespace.go @@ -3,7 +3,6 @@ package store import ( "context" "fmt" - "time" "github.com/cortezaproject/corteza-server/compose/types" "github.com/cortezaproject/corteza-server/pkg/envoy" @@ -32,7 +31,7 @@ func NewComposeNamespaceState(res *resource.ComposeNamespace, cfg *EncoderConfig func (n *composeNamespaceState) Prepare(ctx context.Context, s store.Storer, state *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } // Try to get the original chart diff --git a/pkg/envoy/store/compose_page.go b/pkg/envoy/store/compose_page.go index bdf10acb1..5dbfd5096 100644 --- a/pkg/envoy/store/compose_page.go +++ b/pkg/envoy/store/compose_page.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "strconv" - "time" "github.com/cortezaproject/corteza-server/compose/types" "github.com/cortezaproject/corteza-server/pkg/envoy" @@ -43,7 +42,7 @@ func NewComposePageState(res *resource.ComposePage, cfg *EncoderConfig) resource func (n *composePageState) Prepare(ctx context.Context, s store.Storer, state *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } // Get relate namespace diff --git a/pkg/envoy/store/messaging_channel.go b/pkg/envoy/store/messaging_channel.go index 48f6f2246..c851d60d1 100644 --- a/pkg/envoy/store/messaging_channel.go +++ b/pkg/envoy/store/messaging_channel.go @@ -2,7 +2,6 @@ package store import ( "context" - "time" "github.com/cortezaproject/corteza-server/messaging/types" @@ -32,7 +31,7 @@ func NewMessagingChannelState(res *resource.MessagingChannel, cfg *EncoderConfig func (n *messagingChannelState) Prepare(ctx context.Context, s store.Storer, rs *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } // Sys users diff --git a/pkg/envoy/store/role.go b/pkg/envoy/store/role.go index 2fe212fbd..550236324 100644 --- a/pkg/envoy/store/role.go +++ b/pkg/envoy/store/role.go @@ -3,7 +3,6 @@ package store import ( "context" "fmt" - "time" "github.com/cortezaproject/corteza-server/pkg/envoy" "github.com/cortezaproject/corteza-server/pkg/envoy/resource" @@ -32,7 +31,7 @@ func NewRole(res *resource.Role, cfg *EncoderConfig) resourceState { func (n *roleState) Prepare(ctx context.Context, s store.Storer, state *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } n.rl, err = findRoleS(ctx, s, makeGenericFilter(n.res.Identifiers())) diff --git a/pkg/envoy/store/settings.go b/pkg/envoy/store/settings.go index 2da954812..46ae9c440 100644 --- a/pkg/envoy/store/settings.go +++ b/pkg/envoy/store/settings.go @@ -2,7 +2,6 @@ package store import ( "context" - "time" "github.com/cortezaproject/corteza-server/pkg/envoy" "github.com/cortezaproject/corteza-server/pkg/envoy/resource" @@ -51,7 +50,7 @@ func (n *settingsState) Prepare(ctx context.Context, s store.Storer, state *envo // Default values for _, s := range n.res { if s.UpdatedAt.IsZero() { - s.UpdatedAt = time.Now() + s.UpdatedAt = *now() } gSettingsState.res = append(gSettingsState.res, s) diff --git a/pkg/envoy/store/user.go b/pkg/envoy/store/user.go index a425319a9..04aed1dfc 100644 --- a/pkg/envoy/store/user.go +++ b/pkg/envoy/store/user.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "net/mail" - "time" "github.com/cortezaproject/corteza-server/pkg/envoy" "github.com/cortezaproject/corteza-server/pkg/envoy/resource" @@ -32,7 +31,7 @@ func NewUserState(res *resource.User, cfg *EncoderConfig) resourceState { func (n *userState) Prepare(ctx context.Context, s store.Storer, state *envoy.ResourceState) (err error) { // Initial values if n.res.Res.CreatedAt.IsZero() { - n.res.Res.CreatedAt = time.Now() + n.res.Res.CreatedAt = *now() } // Try to get the original user diff --git a/pkg/envoy/store/util.go b/pkg/envoy/store/util.go index 871739b16..f5c336567 100644 --- a/pkg/envoy/store/util.go +++ b/pkg/envoy/store/util.go @@ -29,6 +29,12 @@ var ( return id.Next() } + // wrapper around time.Now() that will aid testing + now = func() *time.Time { + c := time.Now().Round(time.Second) + return &c + } + exprP = expr.Parser() ) diff --git a/pkg/provision/roles.go b/pkg/provision/roles.go index d64414958..7646a5fa9 100644 --- a/pkg/provision/roles.go +++ b/pkg/provision/roles.go @@ -16,13 +16,15 @@ func roles(ctx context.Context, s store.Storer) error { return nil } + now := time.Now().Round(time.Second) + rr := types.RoleSet{ &types.Role{ID: rbac.AdminsRoleID, Name: "Administrators", Handle: "admins"}, &types.Role{ID: rbac.EveryoneRoleID, Name: "Everyone", Handle: "everyone"}, } err := rr.Walk(func(r *types.Role) error { - r.CreatedAt = time.Now() + r.CreatedAt = now return store.CreateRole(ctx, s, r) }) diff --git a/store/tests/main_test.go b/store/tests/main_test.go index f3c6aad3e..02af3432d 100644 --- a/store/tests/main_test.go +++ b/store/tests/main_test.go @@ -2,6 +2,10 @@ package tests import ( "context" + "os" + "testing" + "time" + "github.com/cortezaproject/corteza-server/pkg/logger" "github.com/cortezaproject/corteza-server/store" "github.com/cortezaproject/corteza-server/store/mysql" @@ -10,14 +14,11 @@ import ( "github.com/cortezaproject/corteza-server/tests/helpers" _ "github.com/joho/godotenv/autoload" "go.uber.org/zap" - "os" - "testing" - "time" ) var ( now = func() *time.Time { - n := time.Now() + n := time.Now().Round(time.Second) return &n } ) diff --git a/system/service/service.go b/system/service/service.go index a01dc7043..38aecf415 100644 --- a/system/service/service.go +++ b/system/service/service.go @@ -3,6 +3,8 @@ package service import ( "context" "errors" + "time" + "github.com/cortezaproject/corteza-server/pkg/actionlog" intAuth "github.com/cortezaproject/corteza-server/pkg/auth" "github.com/cortezaproject/corteza-server/pkg/eventbus" @@ -16,7 +18,6 @@ import ( "github.com/cortezaproject/corteza-server/store" "github.com/cortezaproject/corteza-server/system/types" "go.uber.org/zap" - "time" ) type ( @@ -89,7 +90,7 @@ var ( // wrapper around time.Now() that will aid service testing now = func() *time.Time { - c := time.Now() + c := time.Now().Round(time.Second) return &c } diff --git a/system/service/settings.go b/system/service/settings.go index 63db8f540..f0d227d5e 100644 --- a/system/service/settings.go +++ b/system/service/settings.go @@ -3,14 +3,14 @@ package service import ( "context" "fmt" + "strings" + "github.com/cortezaproject/corteza-server/pkg/errors" "github.com/cortezaproject/corteza-server/pkg/logger" "github.com/cortezaproject/corteza-server/store" "github.com/cortezaproject/corteza-server/system/types" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "strings" - "time" ) type ( @@ -108,14 +108,14 @@ func (svc settings) Set(ctx context.Context, v *types.SettingValue) (err error) var current *types.SettingValue current, err = store.LookupSettingByNameOwnedBy(ctx, svc.store, v.Name, v.OwnedBy) if errors.IsNotFound(err) { - v.UpdatedAt = time.Now() + v.UpdatedAt = *now() err = store.CreateSetting(ctx, svc.store, v) } else if err != nil { return err } if !current.Eq(v) { - v.UpdatedAt = time.Now() + v.UpdatedAt = *now() err = store.UpdateSetting(ctx, svc.store, v) } @@ -140,7 +140,7 @@ func (svc settings) BulkSet(ctx context.Context, vv types.SettingValueSet) (err } else { vv = current.Changed(vv) _ = vv.Walk(func(v *types.SettingValue) error { - v.UpdatedAt = time.Now() + v.UpdatedAt = *now() return nil })