From 0dfa3f39c1d6773e30c8da8a2e151ff70f2e47fb Mon Sep 17 00:00:00 2001 From: Daniel Adam Date: Mon, 8 Jul 2024 08:48:37 +0200 Subject: [PATCH] Fixes after CR --- charts/plgd-hub/values.yaml | 39 ++--------- snippet-service/config.yaml | 26 ------- snippet-service/service/grpc/server.go | 70 +++++++++---------- .../http/deleteAppliedConfigurations_test.go | 2 +- .../http/getAppliedConfigurations_test.go | 2 +- snippet-service/service/service.go | 8 +-- snippet-service/service/service_test.go | 16 ----- snippet-service/store/condition.go | 33 +++++---- snippet-service/store/configuration.go | 21 +++--- snippet-service/test/appliedConfiguration.go | 14 ---- snippet-service/test/condition.go | 8 +-- snippet-service/test/configuration.go | 8 +-- 12 files changed, 82 insertions(+), 165 deletions(-) diff --git a/charts/plgd-hub/values.yaml b/charts/plgd-hub/values.yaml index 7376f8ade..01aca4176 100644 --- a/charts/plgd-hub/values.yaml +++ b/charts/plgd-hub/values.yaml @@ -2294,7 +2294,7 @@ certificateauthority: expiresIn: "87600h" snippetservice: - # -- Enable snippet-service service + # -- Enable snippet-service enabled: true # -- Name of component. Used in label selectors name: snippet-service @@ -2316,9 +2316,9 @@ snippetservice: grpc: # -- Service type type: ClusterIP - # -- Labels for snippet-service service + # -- Labels for snippet-service labels: {} - # -- Annotations for snippet-service service + # -- Annotations for snippet-service annotations: {} # -- Target port targetPort: grpc @@ -2456,7 +2456,7 @@ snippetservice: encoderConfig: # -- Time format for logs. The supported values are: "rfc3339nano", "rfc3339" timeEncoder: rfc3339nano - # -- For complete snippet-service service configuration see [plgd/snippet-service](https://github.com/plgd-dev/hub/tree/main/snippet-service) + # -- For complete snippet-service configuration see [plgd/snippet-service](https://github.com/plgd-dev/hub/tree/main/snippet-service) apis: grpc: address: @@ -2525,37 +2525,6 @@ snippetservice: keyFile: certFile: useSystemCAPool: false - bulkWrite: - # -- A time limit for write bulk to mongodb. A Timeout of zero means no timeout. - timeout: 1m0s - # -- The amount of time to wait until a record is written to mongodb. Any records collected during the throttle time will also be written. A throttle time of zero writes immediately. If recordLimit is reached, all records are written immediately - throttleTime: 500ms - # -- The maximum number of documents to cache before an immediate write. - documentLimit: 1000 - cqlDB: - table: snippetServiceRecords - hosts: [] - port: 9142 - numConnections: 16 - connectTimeout: 10s - # -- Resolve IP address to hostname before validate certificate. If false, the TLS validator will use ip/hostname advertised by the Cassandra node. - useHostnameResolution: true - reconnectionPolicy: - constant: - interval: 3s - # 0 - means infinity - maxRetries: 3 - keyspace: - name: plgdhub - create: true - replication: - class: SimpleStrategy - replication_factor: 1 - tls: - caPool: - keyFile: - certFile: - useSystemCAPool: false resourceUpdater: cleanUpExpiredUpdates: "0 * * * *" grpc: diff --git a/snippet-service/config.yaml b/snippet-service/config.yaml index 9d7c50e2e..c19f941f7 100644 --- a/snippet-service/config.yaml +++ b/snippet-service/config.yaml @@ -63,32 +63,6 @@ clients: keyFile: "/secrets/private/cert.key" certFile: "/secrets/public/cert.crt" useSystemCAPool: false - bulkWrite: - timeout: 1m0s - throttleTime: 500ms - documentLimit: 1000 - cqlDB: - table: "snippets" - hosts: [] - port: 9142 - numConnections: 16 - connectTimeout: 10s - useHostnameResolution: true - reconnectionPolicy: - constant: - interval: 3s - maxRetries: 3 - keyspace: - name: plgdhub - create: true - replication: - class: SimpleStrategy - replication_factor: 1 - tls: - caPool: "/secrets/public/rootca.crt" - keyFile: "/secrets/private/cert.key" - certFile: "/secrets/public/cert.crt" - useSystemCAPool: false openTelemetryCollector: grpc: enabled: false diff --git a/snippet-service/service/grpc/server.go b/snippet-service/service/grpc/server.go index 7c514a335..a7ca066c5 100644 --- a/snippet-service/service/grpc/server.go +++ b/snippet-service/service/grpc/server.go @@ -95,23 +95,29 @@ func errCannotGetConfigurations(err error) error { return fmt.Errorf("cannot get configurations: %w", err) } -func sendConfiguration(srv pb.SnippetService_GetConfigurationsServer, c *store.Configuration) error { - var lastVersion *store.ConfigurationVersion - for i := range c.Versions { - err := srv.Send(c.GetConfiguration(i)) - if err != nil { - return err +func sendConfiguration(srv pb.SnippetService_GetConfigurationsServer, sc *store.Configuration) error { + var err error + var lastVersion *pb.Configuration + sc.RangeVersions(func(_ int, c *pb.Configuration) bool { + errS := srv.Send(c) + if errS != nil { + err = errS + return false } - lastVersion = &c.Versions[i] + lastVersion = c + return true + }) + if err != nil { + return err } - if c.Latest == nil { + if sc.Latest == nil { return nil } - latest, err := c.GetLatest() + latest, err := sc.GetLatest() if err != nil { return err } - if lastVersion != nil && lastVersion.Version == latest.GetVersion() { + if lastVersion != nil && lastVersion.GetVersion() == latest.GetVersion() { // already sent when iterating over versions array return nil } @@ -233,23 +239,29 @@ func errCannotGetConditions(err error) error { return fmt.Errorf("cannot get conditions: %w", err) } -func sendCondition(srv pb.SnippetService_GetConditionsServer, c *store.Condition) error { - var lastVersion *store.ConditionVersion - for i := range c.Versions { - err := srv.Send(c.GetCondition(i)) - if err != nil { - return err +func sendCondition(srv pb.SnippetService_GetConditionsServer, sc *store.Condition) error { + var err error + var lastVersion *pb.Condition + sc.RangeVersions(func(_ int, c *pb.Condition) bool { + errS := srv.Send(c) + if errS != nil { + err = errS + return false } - lastVersion = &c.Versions[i] + lastVersion = c + return true + }) + if err != nil { + return err } - if c.Latest == nil { + if sc.Latest == nil { return nil } - latest, err := c.GetLatest() + latest, err := sc.GetLatest() if err != nil { return err } - if lastVersion != nil && lastVersion.Version == latest.GetVersion() { + if lastVersion != nil && lastVersion.GetVersion() == latest.GetVersion() { // already sent when iterating over versions array return nil } @@ -296,24 +308,6 @@ func (s *SnippetServiceServer) DeleteConditions(ctx context.Context, req *pb.Del }, nil } -func errCannotCreateAppliedConfiguration(err error) error { - return fmt.Errorf("cannot create applied configuration: %w", err) -} - -func (s *SnippetServiceServer) CreateAppliedConfiguration(ctx context.Context, configuration *pb.AppliedConfiguration) (*pb.AppliedConfiguration, error) { - owner, err := s.checkOwner(ctx, configuration.GetOwner()) - if err != nil { - return nil, s.logger.LogAndReturnError(status.Errorf(codes.PermissionDenied, "%v", errCannotCreateAppliedConfiguration(err))) - } - - configuration.Owner = owner - c, _, err := s.store.CreateAppliedConfiguration(ctx, configuration, false) - if err != nil { - return nil, s.logger.LogAndReturnError(status.Errorf(getGRPCErrorCode(err), "%v", errCannotCreateAppliedConfiguration(err))) - } - return c, nil -} - func errCannotGetAppliedConfigurations(err error) error { return fmt.Errorf("cannot get applied configurations: %w", err) } diff --git a/snippet-service/service/http/deleteAppliedConfigurations_test.go b/snippet-service/service/http/deleteAppliedConfigurations_test.go index cf11e607f..745c12420 100644 --- a/snippet-service/service/http/deleteAppliedConfigurations_test.go +++ b/snippet-service/service/http/deleteAppliedConfigurations_test.go @@ -35,7 +35,7 @@ func TestRequestHandlerDeleteAppliedConfigurations(t *testing.T) { ss, shutdownHttp := test.New(t, snippetCfg) defer shutdownHttp() - _ = test.AddAppliedConfigurations(ctx, t, snippetCfg.APIs.GRPC.Authorization.OwnerClaim, ss) + _ = test.AddAppliedConfigurationsToStore(ctx, t, ss.SnippetServiceStore()) conn, err := grpc.NewClient(config.SNIPPET_SERVICE_HOST, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{ RootCAs: hubTest.GetRootCertificatePool(t), diff --git a/snippet-service/service/http/getAppliedConfigurations_test.go b/snippet-service/service/http/getAppliedConfigurations_test.go index f0311d950..de140f162 100644 --- a/snippet-service/service/http/getAppliedConfigurations_test.go +++ b/snippet-service/service/http/getAppliedConfigurations_test.go @@ -31,7 +31,7 @@ func TestRequestHandlerGetAppliedConfigurations(t *testing.T) { ss, shutdownHttp := test.New(t, snippetCfg) defer shutdownHttp() - appliedConfs := test.AddAppliedConfigurations(ctx, t, snippetCfg.APIs.GRPC.Authorization.OwnerClaim, ss) + appliedConfs := test.AddAppliedConfigurationsToStore(ctx, t, ss.SnippetServiceStore()) type args struct { token string diff --git a/snippet-service/service/service.go b/snippet-service/service/service.go index be1c8f352..9f12a9807 100644 --- a/snippet-service/service/service.go +++ b/snippet-service/service/service.go @@ -27,7 +27,7 @@ const serviceName = "snippet-service" type Service struct { *service.Service - snippetService *grpcService.SnippetServiceServer + store store.Store resourceUpdater *updater.ResourceUpdater resourceSubscriber *ResourceSubscriber } @@ -143,12 +143,12 @@ func New(ctx context.Context, config Config, fileWatcher *fsnotify.Watcher, logg return &Service{ Service: s, - snippetService: snippetService, + store: db, resourceUpdater: resourceUpdater, resourceSubscriber: resourceSubscriber, }, nil } -func (s *Service) SnippetServiceServer() *grpcService.SnippetServiceServer { - return s.snippetService +func (s *Service) SnippetServiceStore() store.Store { + return s.store } diff --git a/snippet-service/service/service_test.go b/snippet-service/service/service_test.go index b0e7c46e9..899b12291 100644 --- a/snippet-service/service/service_test.go +++ b/snippet-service/service/service_test.go @@ -1,19 +1,3 @@ -// ************************************************************************ -// Copyright (C) 2022 plgd.dev, s.r.o. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// ************************************************************************ - package service_test import ( diff --git a/snippet-service/store/condition.go b/snippet-service/store/condition.go index a17f281fd..e6fef6575 100644 --- a/snippet-service/store/condition.go +++ b/snippet-service/store/condition.go @@ -96,20 +96,25 @@ func (c *Condition) GetLatest() (*pb.Condition, error) { }, nil } -func (c *Condition) GetCondition(index int) *pb.Condition { - return &pb.Condition{ - Id: c.Id, - Owner: c.Owner, - ConfigurationId: c.ConfigurationId, - Name: c.Versions[index].Name, - Enabled: c.Versions[index].Enabled, - Version: c.Versions[index].Version, - Timestamp: c.Versions[index].Timestamp, - DeviceIdFilter: c.Versions[index].DeviceIdFilter, - ResourceTypeFilter: c.Versions[index].ResourceTypeFilter, - ResourceHrefFilter: c.Versions[index].ResourceHrefFilter, - JqExpressionFilter: c.Versions[index].JqExpressionFilter, - ApiAccessToken: c.Versions[index].ApiAccessToken, +func (c *Condition) RangeVersions(f func(int, *pb.Condition) bool) { + for i := range c.Versions { + cond := &pb.Condition{ + Id: c.Id, + Owner: c.Owner, + ConfigurationId: c.ConfigurationId, + Name: c.Versions[i].Name, + Enabled: c.Versions[i].Enabled, + Version: c.Versions[i].Version, + Timestamp: c.Versions[i].Timestamp, + DeviceIdFilter: c.Versions[i].DeviceIdFilter, + ResourceTypeFilter: c.Versions[i].ResourceTypeFilter, + ResourceHrefFilter: c.Versions[i].ResourceHrefFilter, + JqExpressionFilter: c.Versions[i].JqExpressionFilter, + ApiAccessToken: c.Versions[i].ApiAccessToken, + } + if !f(i, cond) { + break + } } } diff --git a/snippet-service/store/configuration.go b/snippet-service/store/configuration.go index c9ecf8d59..d38ed1239 100644 --- a/snippet-service/store/configuration.go +++ b/snippet-service/store/configuration.go @@ -74,14 +74,19 @@ func (c *Configuration) GetLatest() (*pb.Configuration, error) { }, nil } -func (c *Configuration) GetConfiguration(index int) *pb.Configuration { - return &pb.Configuration{ - Id: c.Id, - Owner: c.Owner, - Name: c.Versions[index].Name, - Timestamp: c.Versions[index].Timestamp, - Version: c.Versions[index].Version, - Resources: c.Versions[index].Resources, +func (c *Configuration) RangeVersions(f func(int, *pb.Configuration) bool) { + for i := range c.Versions { + conf := &pb.Configuration{ + Id: c.Id, + Owner: c.Owner, + Name: c.Versions[i].Name, + Timestamp: c.Versions[i].Timestamp, + Version: c.Versions[i].Version, + Resources: c.Versions[i].Resources, + } + if !f(i, conf) { + break + } } } diff --git a/snippet-service/test/appliedConfiguration.go b/snippet-service/test/appliedConfiguration.go index 656fda2d0..5ef9a011b 100644 --- a/snippet-service/test/appliedConfiguration.go +++ b/snippet-service/test/appliedConfiguration.go @@ -7,9 +7,7 @@ import ( "time" "github.com/google/uuid" - pkgGrpc "github.com/plgd-dev/hub/v2/pkg/net/grpc" "github.com/plgd-dev/hub/v2/snippet-service/pb" - "github.com/plgd-dev/hub/v2/snippet-service/service" "github.com/plgd-dev/hub/v2/snippet-service/store" hubTest "github.com/plgd-dev/hub/v2/test" pbTest "github.com/plgd-dev/hub/v2/test/pb" @@ -106,15 +104,3 @@ func AddAppliedConfigurationsToStore(ctx context.Context, t *testing.T, s store. require.NoError(t, err) return acs } - -func AddAppliedConfigurations(ctx context.Context, t *testing.T, ownerClaim string, ss *service.Service) map[string]*store.AppliedConfiguration { - configurations := getAppliedConfigurations(t) - for _, c := range configurations { - ctxWithToken := pkgGrpc.CtxWithIncomingToken(ctx, GetTokenWithOwnerClaim(t, c.GetOwner(), ownerClaim)) - newConf, err := ss.SnippetServiceServer().CreateAppliedConfiguration(ctxWithToken, c.GetAppliedConfiguration()) - require.NoError(t, err) - c.Timestamp = newConf.GetTimestamp() - configurations[newConf.GetId()] = c - } - return configurations -} diff --git a/snippet-service/test/condition.go b/snippet-service/test/condition.go index 05315bbbc..241cbd8bd 100644 --- a/snippet-service/test/condition.go +++ b/snippet-service/test/condition.go @@ -131,19 +131,19 @@ func AddConditions(ctx context.Context, t *testing.T, ownerClaim string, ssc pb. conditions := getConditions(n, calcVersion) for _, c := range conditions { ctxWithToken := pkgGrpc.CtxWithToken(ctx, GetTokenWithOwnerClaim(t, c.Owner, ownerClaim)) - for i := range c.Versions { - cond := c.GetCondition(i) + c.RangeVersions(func(i int, cond *pb.Condition) bool { if i == 0 { createdCond, err := ssc.CreateCondition(ctxWithToken, cond) require.NoError(t, err) c.Latest.Timestamp = createdCond.GetTimestamp() c.Versions[i].Timestamp = createdCond.GetTimestamp() - continue + return true } updatedCond, err := ssc.UpdateCondition(ctxWithToken, cond) require.NoError(t, err) c.Versions[i].Timestamp = updatedCond.GetTimestamp() - } + return true + }) conditions[c.Id] = c } return conditions diff --git a/snippet-service/test/configuration.go b/snippet-service/test/configuration.go index 7a20bc25d..201af61ab 100644 --- a/snippet-service/test/configuration.go +++ b/snippet-service/test/configuration.go @@ -120,19 +120,19 @@ func AddConfigurations(ctx context.Context, t *testing.T, ownerClaim string, ssc configurations := getConfigurations(t, n, calcVersion) for _, c := range configurations { ctxWithToken := pkgGrpc.CtxWithToken(ctx, GetTokenWithOwnerClaim(t, c.Owner, ownerClaim)) - for i := range c.Versions { - conf := c.GetConfiguration(i) + c.RangeVersions(func(i int, conf *pb.Configuration) bool { if i == 0 { createdConf, err := ssc.CreateConfiguration(ctxWithToken, conf) require.NoError(t, err) c.Latest.Timestamp = createdConf.GetTimestamp() c.Versions[i].Timestamp = createdConf.GetTimestamp() - continue + return true } updatedConf, err := ssc.UpdateConfiguration(ctxWithToken, conf) require.NoError(t, err) c.Versions[i].Timestamp = updatedConf.GetTimestamp() - } + return true + }) configurations[c.Id] = c } return configurations