From 4b1bf504b0bbf035a6ce9af56aecb65ff84ccf11 Mon Sep 17 00:00:00 2001 From: steiler Date: Fri, 5 Jun 2026 16:02:05 +0200 Subject: [PATCH 1/2] ci: add golangci-lint workflow and fix lint findings Add Go Checks workflow and golangci-lint v2 config (exclude ygot-generated schema). Resolve errcheck, staticcheck, govet, ineffassign, and unused issues across CLI, datastore, server, pool, tree, and utils. Co-authored-by: Cursor --- .github/workflows/go-checks.yml | 21 +++++++++++ .gitignore | 1 + .golangci.yml | 8 +++++ client/cmd/data_blameConfig.go | 3 +- client/cmd/datastore_get.go | 4 +-- client/cmd/datastore_list.go | 4 +-- pkg/datastore/datastore_rpc.go | 8 +++-- pkg/datastore/deviations.go | 5 ++- pkg/datastore/sync_test.go | 36 ++++++++++++++----- pkg/datastore/target/gnmi/gnmi.go | 5 ++- pkg/datastore/target/gnmi/stream.go | 7 +++- pkg/datastore/target/netconf/nc.go | 6 ++-- pkg/datastore/target/netconf/nc_test.go | 10 ++++-- pkg/datastore/target/netconf/sync.go | 2 +- pkg/datastore/target/noop/noop.go | 2 +- pkg/datastore/transaction_rpc_test.go | 4 ++- pkg/datastore/types/transaction.go | 4 +-- pkg/pool/virtual_pool.go | 2 -- pkg/pool/virtual_pool_test.go | 4 +-- pkg/server/datastore.go | 5 ++- pkg/server/schema.go | 4 +-- pkg/server/server.go | 8 ++--- pkg/tree/api/leaf_entry.go | 2 +- pkg/tree/api/leaf_variants.go | 36 +++++++++---------- pkg/tree/entry_test.go | 12 ++++--- .../importer/xml/xml_tree_importer_test.go | 8 +++-- pkg/tree/ops/checkandcreatekeysasleafs.go | 2 +- pkg/tree/ops/getdeviations.go | 2 +- pkg/tree/ops/getorcreatechilds.go | 4 +-- pkg/tree/ops/getpathcompletions.go | 2 +- pkg/tree/ops/json.go | 4 +-- pkg/tree/ops/proto.go | 3 +- pkg/tree/ops/validation/processor_validate.go | 4 +-- pkg/tree/ops/validation/validate.go | 2 +- .../validation/validation_entry_leafref.go | 2 +- .../validation_entry_min_max_elements.go | 4 +-- .../ops/validation/validation_entry_range.go | 2 +- pkg/tree/ops/xml.go | 4 +-- pkg/tree/ops/xpath_test.go | 2 +- pkg/tree/processors/processor_blame_config.go | 10 +++--- .../processor_error_collection_test.go | 8 +++-- pkg/tree/processors/processor_importer.go | 2 +- pkg/tree/root_entry.go | 2 +- pkg/tree/types/update_slice.go | 2 +- pkg/tree/types/validation_result.go | 8 ++--- pkg/utils/converter.go | 2 +- pkg/utils/notification.go | 4 ++- 47 files changed, 174 insertions(+), 112 deletions(-) create mode 100644 .github/workflows/go-checks.yml create mode 100644 .golangci.yml diff --git a/.github/workflows/go-checks.yml b/.github/workflows/go-checks.yml new file mode 100644 index 00000000..d8d1d34c --- /dev/null +++ b/.github/workflows/go-checks.yml @@ -0,0 +1,21 @@ +name: Go Checks + +on: + pull_request: {} + push: + branches: + - main + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-go@v5 + with: + go-version-file: 'go.mod' + - name: golangci-lint + uses: golangci/golangci-lint-action@v8 + with: + version: v2.4 diff --git a/.gitignore b/.gitignore index 6a7b6077..00950582 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ dist/ clab-* tests/robot/*-yang-models/ .idea/ +.golangci-lint-cache/ diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..b3ee71e2 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,8 @@ +# https://golangci-lint.run/docs/configuration/file/ +version: "2" + +linters: + exclusions: + paths: + # ygot-generated schema (see file header); do not lint. + - tests/sdcioygot/sdcio_schema.go diff --git a/client/cmd/data_blameConfig.go b/client/cmd/data_blameConfig.go index deb5ac0a..6ae3994b 100644 --- a/client/cmd/data_blameConfig.go +++ b/client/cmd/data_blameConfig.go @@ -3,7 +3,6 @@ package cmd import ( "context" "fmt" - "os" sdcpb "github.com/sdcio/sdc-protos/sdcpb" "github.com/spf13/cobra" @@ -43,7 +42,7 @@ var dataBlameConfig = &cobra.Command{ } b, err := opts.Marshal(rsp.ConfigTree) if err != nil { - fmt.Fprintf(os.Stdout, "%v", err) + return err } fmt.Println(string(b)) } diff --git a/client/cmd/datastore_get.go b/client/cmd/datastore_get.go index 9e701894..e1ab1b49 100644 --- a/client/cmd/datastore_get.go +++ b/client/cmd/datastore_get.go @@ -73,8 +73,8 @@ func printDataStoreTable(rsp *sdcpb.GetDataStoreResponse) { table := tablewriter.NewWriter(os.Stdout) table.Header([]string{"Name", "Schema", "Protocol", "Address", "State"}) table.Options(tablewriter.WithAlignment(tw.Alignment{tw.AlignLeft})) - table.Bulk(toTableData(rsp)) - table.Render() + _ = table.Bulk(toTableData(rsp)) + _ = table.Render() } func toTableData(rsp *sdcpb.GetDataStoreResponse) [][]string { diff --git a/client/cmd/datastore_list.go b/client/cmd/datastore_list.go index 57553133..b49b2a5b 100644 --- a/client/cmd/datastore_list.go +++ b/client/cmd/datastore_list.go @@ -78,6 +78,6 @@ func printDataStoresTable(rsp *sdcpb.ListDataStoreResponse) { table := tablewriter.NewWriter(os.Stdout) table.Header([]string{"Name", "Schema", "Protocol", "Address", "State", "Candidate (C/O/P)"}) table.Options(tablewriter.WithAlignment(tw.Alignment{tw.AlignLeft})) - table.Bulk(tableData) - table.Render() + _ = table.Bulk(tableData) + _ = table.Render() } diff --git a/pkg/datastore/datastore_rpc.go b/pkg/datastore/datastore_rpc.go index b3337060..da0cb61e 100644 --- a/pkg/datastore/datastore_rpc.go +++ b/pkg/datastore/datastore_rpc.go @@ -21,7 +21,6 @@ import ( "sync" "time" - "github.com/sdcio/logger" logf "github.com/sdcio/logger" sdcpb "github.com/sdcio/sdc-protos/sdcpb" "google.golang.org/grpc" @@ -229,8 +228,8 @@ func (d *Datastore) Stop(ctx context.Context) error { } func (d *Datastore) BlameConfig(ctx context.Context, includeDefaults bool) (*sdcpb.BlameTreeElement, error) { - log := logger.FromContext(ctx).WithName("BlameConfig") - ctx = logger.IntoContext(ctx, log) + log := logf.FromContext(ctx).WithName("BlameConfig") + ctx = logf.IntoContext(ctx, log) // create a new TreeRoot by copying the syncTree d.syncTreeMutex.RLock() @@ -247,6 +246,9 @@ func (d *Datastore) BlameConfig(ctx context.Context, includeDefaults bool) (*sdc bcp := processors.NewBlameConfigProcessor(&processors.BlameConfigProcessorParams{IncludeDefaults: includeDefaults}) bte, err := bcp.Run(ctx, root.Entry, d.taskPool) + if err != nil { + return nil, err + } // set the root level elements name to the target name bte.Name = d.config.Name diff --git a/pkg/datastore/deviations.go b/pkg/datastore/deviations.go index 964817ec..6969067e 100644 --- a/pkg/datastore/deviations.go +++ b/pkg/datastore/deviations.go @@ -7,7 +7,6 @@ import ( "github.com/sdcio/data-server/pkg/config" "github.com/sdcio/data-server/pkg/tree/ops" treetypes "github.com/sdcio/data-server/pkg/tree/types" - "github.com/sdcio/logger" logf "github.com/sdcio/logger" sdcpb "github.com/sdcio/sdc-protos/sdcpb" "google.golang.org/grpc/codes" @@ -180,7 +179,7 @@ type DeviationEntry interface { func (d *Datastore) calculateDeviations(ctx context.Context) (<-chan *treetypes.DeviationEntry, error) { - log := logger.FromContext(ctx) + log := logf.FromContext(ctx) d.syncTreeMutex.RLock() deviationTree, err := d.syncTree.DeepCopy(ctx) @@ -199,7 +198,7 @@ func (d *Datastore) calculateDeviations(ctx context.Context) (<-chan *treetypes. return nil, err } - if log := log.V(logger.VTrace); log.Enabled() { + if log := log.V(logf.VTrace); log.Enabled() { log.Info("deviation tree", "content", deviationTree.String()) log.Info("nonrevertive infos", "data", deviationTree.GetTreeContext().NonRevertiveInfo().String()) } diff --git a/pkg/datastore/sync_test.go b/pkg/datastore/sync_test.go index 1ae172bc..e35b7091 100644 --- a/pkg/datastore/sync_test.go +++ b/pkg/datastore/sync_test.go @@ -80,7 +80,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } vpf := pool.NewSharedTaskPool(ctx, runtime.GOMAXPROCS(0)) _, err = root.ImportConfig(ctx, &sdcpb.Path{}, jsonImporter.NewJsonTreeImporter(v, consts.RunningIntentName, consts.RunningValuesPrio, false), types.NewUpdateInsertFlags(), vpf) @@ -109,7 +111,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } return jsonImporter.NewJsonTreeImporter(v, consts.RunningIntentName, consts.RunningValuesPrio, false) }, @@ -131,7 +135,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } return v }, wantErr: false, @@ -186,7 +192,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } vpf := pool.NewSharedTaskPool(ctx, runtime.GOMAXPROCS(0)) _, err = root.ImportConfig(ctx, &sdcpb.Path{}, jsonImporter.NewJsonTreeImporter(v, consts.RunningIntentName, consts.RunningValuesPrio, false), types.NewUpdateInsertFlags(), vpf) @@ -214,7 +222,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } return jsonImporter.NewJsonTreeImporter(v, consts.RunningIntentName, consts.RunningValuesPrio, false) }, @@ -235,7 +245,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } return v }, wantErr: false, @@ -290,7 +302,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } vpf := pool.NewSharedTaskPool(ctx, runtime.GOMAXPROCS(0)) _, err = root.ImportConfig(ctx, &sdcpb.Path{}, jsonImporter.NewJsonTreeImporter(v, consts.RunningIntentName, consts.RunningValuesPrio, false), types.NewUpdateInsertFlags(), vpf) @@ -319,7 +333,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } return jsonImporter.NewJsonTreeImporter(v, consts.RunningIntentName, consts.RunningValuesPrio, false) }, @@ -341,7 +357,9 @@ func TestApplyToRunning(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } return v }, wantErr: false, diff --git a/pkg/datastore/target/gnmi/gnmi.go b/pkg/datastore/target/gnmi/gnmi.go index 117f8341..a174af9a 100644 --- a/pkg/datastore/target/gnmi/gnmi.go +++ b/pkg/datastore/target/gnmi/gnmi.go @@ -30,7 +30,6 @@ import ( targetTypes "github.com/sdcio/data-server/pkg/datastore/target/types" "github.com/sdcio/data-server/pkg/pool" "github.com/sdcio/data-server/pkg/utils" - dsutils "github.com/sdcio/data-server/pkg/utils" logf "github.com/sdcio/logger" sdcpb "github.com/sdcio/sdc-protos/sdcpb" @@ -47,11 +46,11 @@ type gnmiTarget struct { cfg *config.SBI syncs map[string]GnmiSync runningStore targetTypes.RunningStore - schemaClient dsutils.SchemaClientBound + schemaClient utils.SchemaClientBound taskpoolFactory pool.VirtualPoolFactory } -func NewTarget(ctx context.Context, name string, cfg *config.SBI, runningStore targetTypes.RunningStore, schemaClient dsutils.SchemaClientBound, taskpoolFactory pool.VirtualPoolFactory, opts ...grpc.DialOption) (*gnmiTarget, error) { +func NewTarget(ctx context.Context, name string, cfg *config.SBI, runningStore targetTypes.RunningStore, schemaClient utils.SchemaClientBound, taskpoolFactory pool.VirtualPoolFactory, opts ...grpc.DialOption) (*gnmiTarget, error) { tc := &types.TargetConfig{ Name: name, Address: fmt.Sprintf("%s:%d", cfg.Address, cfg.Port), diff --git a/pkg/datastore/target/gnmi/stream.go b/pkg/datastore/target/gnmi/stream.go index b8816924..e7b52814 100644 --- a/pkg/datastore/target/gnmi/stream.go +++ b/pkg/datastore/target/gnmi/stream.go @@ -222,7 +222,12 @@ func (s *StreamSync) gnmiSubscribe(subReq *gnmi.SubscribeRequest, updChan chan<- } case *gnmi.SubscribeResponse_Error: - log.Error(nil, "gnmi subscription error", "error", r.Error.Message) + subscribeErr := r.Error //nolint:staticcheck // gnmi SubscribeResponse_Error deprecated upstream without replacement. + msg := "" + if subscribeErr != nil { + msg = subscribeErr.GetMessage() + } + log.Error(nil, "gnmi subscription error", "error", msg) } } } diff --git a/pkg/datastore/target/netconf/nc.go b/pkg/datastore/target/netconf/nc.go index 3628dd28..e04d9775 100644 --- a/pkg/datastore/target/netconf/nc.go +++ b/pkg/datastore/target/netconf/nc.go @@ -131,7 +131,7 @@ func (t *ncTarget) internalGet(ctx context.Context, req *sdcpb.GetDataRequest) ( ncResponse, err := t.driver.GetConfig(source, filterDoc) if err != nil { if strings.Contains(err.Error(), "EOF") { - t.Close(ctx) + _ = t.Close(ctx) go t.reconnect(ctx) } return nil, err @@ -262,7 +262,7 @@ func (t *ncTarget) setToDevice(ctx context.Context, commitDatastore string, sour if err != nil { log.Error(err, "failed during edit-config") if strings.Contains(err.Error(), "EOF") { - t.Close(ctx) + _ = t.Close(ctx) go t.reconnect(ctx) return nil, err } @@ -289,7 +289,7 @@ func (t *ncTarget) setToDevice(ctx context.Context, commitDatastore string, sour err = t.driver.Commit() if err != nil { if strings.Contains(err.Error(), "EOF") { - t.Close(ctx) + _ = t.Close(ctx) go t.reconnect(ctx) } return nil, err diff --git a/pkg/datastore/target/netconf/nc_test.go b/pkg/datastore/target/netconf/nc_test.go index e426f397..ded0cf28 100644 --- a/pkg/datastore/target/netconf/nc_test.go +++ b/pkg/datastore/target/netconf/nc_test.go @@ -290,7 +290,7 @@ func TestLeafList(t *testing.T) { HonorNamespace: true, }) - xmlBuilder.AddValue(ctx, &sdcpb.Path{ + if err := xmlBuilder.AddValue(ctx, &sdcpb.Path{ Elem: []*sdcpb.PathElem{ { Name: "leaflist", @@ -299,7 +299,9 @@ func TestLeafList(t *testing.T) { Name: "entry", }, }, - }, leaflistValue) + }, leaflistValue); err != nil { + t.Fatal(err) + } expectedResult := ` entry-one @@ -367,7 +369,9 @@ func Test_filterRPCErrors(t *testing.T) { ` doc := etree.NewDocument() - doc.ReadFromString(xml) + if err := doc.ReadFromString(xml); err != nil { + t.Fatal(err) + } type args struct { xml *etree.Document diff --git a/pkg/datastore/target/netconf/sync.go b/pkg/datastore/target/netconf/sync.go index 9bcb1526..e8d1fc57 100644 --- a/pkg/datastore/target/netconf/sync.go +++ b/pkg/datastore/target/netconf/sync.go @@ -70,7 +70,7 @@ func (s *NetconfSyncImpl) Start() error { return nil } - go s.internalSync(req) + go func() { _ = s.internalSync(req) }() go func() { ticker := time.NewTicker(s.config.Interval) diff --git a/pkg/datastore/target/noop/noop.go b/pkg/datastore/target/noop/noop.go index a07a93b9..f6bf41eb 100644 --- a/pkg/datastore/target/noop/noop.go +++ b/pkg/datastore/target/noop/noop.go @@ -51,7 +51,7 @@ func (t *noopTarget) AddSyncs(ctx context.Context, sps ...*config.SyncProtocol) func (t *noopTarget) Get(ctx context.Context, req *sdcpb.GetDataRequest) (*sdcpb.GetDataResponse, error) { log := logf.FromContext(ctx).WithName("Get") - ctx = logf.IntoContext(ctx, log) + _ = logf.IntoContext(ctx, log) result := &sdcpb.GetDataResponse{ Notification: make([]*sdcpb.Notification, 0, len(req.GetPath())), diff --git a/pkg/datastore/transaction_rpc_test.go b/pkg/datastore/transaction_rpc_test.go index 26eea6a4..ec441ba4 100644 --- a/pkg/datastore/transaction_rpc_test.go +++ b/pkg/datastore/transaction_rpc_test.go @@ -54,7 +54,9 @@ func TestTransactionSet_PreviouslyApplied(t *testing.T) { t.Fatalf("failed to marshal running config: %v", err) } var runningAny any - json.Unmarshal([]byte(runningJson), &runningAny) + if err := json.Unmarshal([]byte(runningJson), &runningAny); err != nil { + t.Fatalf("unmarshal running config: %v", err) + } // Setup Intent Data (Same as Running) intentStrSame := runningJson // Same content diff --git a/pkg/datastore/types/transaction.go b/pkg/datastore/types/transaction.go index afdd2e84..7fb14656 100644 --- a/pkg/datastore/types/transaction.go +++ b/pkg/datastore/types/transaction.go @@ -63,7 +63,7 @@ func (t *Transaction) Confirm() error { func (t *Transaction) rollback(ctx context.Context) func() { return func() { - t.transactionManager.Rollback(ctx, t.GetRollbackTransaction()) + _ = t.transactionManager.Rollback(ctx, t.GetRollbackTransaction()) } } @@ -94,7 +94,7 @@ func (t *Transaction) GetRollbackTransaction() *Transaction { t.timer.Stop() tr := NewTransaction(t.GetTransactionId()+" - Rollback", t.transactionManager) for _, v := range t.oldIntents { - tr.AddTransactionIntent(v, TransactionIntentNew) + _ = tr.AddTransactionIntent(v, TransactionIntentNew) } tr.isRollback = true return tr diff --git a/pkg/pool/virtual_pool.go b/pkg/pool/virtual_pool.go index a3f0fdf7..fa5a54d2 100644 --- a/pkg/pool/virtual_pool.go +++ b/pkg/pool/virtual_pool.go @@ -88,8 +88,6 @@ const ( // creation of VirtualPools that submit into the shared pool. type SharedTaskPool struct { inner *Pool[Task] - - mu sync.RWMutex } // NewSharedTaskPool constructs a shared pool; caller should call Start() to begin workers. diff --git a/pkg/pool/virtual_pool_test.go b/pkg/pool/virtual_pool_test.go index acedca3a..ec9227fe 100644 --- a/pkg/pool/virtual_pool_test.go +++ b/pkg/pool/virtual_pool_test.go @@ -183,14 +183,14 @@ func TestVirtualPool_CancellationHang(t *testing.T) { wg.Add(2) // Task 1: blocks until cancelled - vp.SubmitFunc(func(ctx context.Context, submit func(Task) error) error { + _ = vp.SubmitFunc(func(ctx context.Context, submit func(Task) error) error { defer wg.Done() <-ctx.Done() return nil }) // Task 2: should run even if cancelled (to decrement inflight) - vp.SubmitFunc(func(ctx context.Context, submit func(Task) error) error { + _ = vp.SubmitFunc(func(ctx context.Context, submit func(Task) error) error { defer wg.Done() return nil }) diff --git a/pkg/server/datastore.go b/pkg/server/datastore.go index 10746556..a3cfb45d 100644 --- a/pkg/server/datastore.go +++ b/pkg/server/datastore.go @@ -25,7 +25,6 @@ import ( "github.com/sdcio/data-server/pkg/datastore" targettypes "github.com/sdcio/data-server/pkg/datastore/target/types" "github.com/sdcio/data-server/pkg/utils" - "github.com/sdcio/logger" logf "github.com/sdcio/logger" sdcpb "github.com/sdcio/sdc-protos/sdcpb" "google.golang.org/grpc/codes" @@ -78,7 +77,7 @@ func (s *Server) CreateDataStore(ctx context.Context, req *sdcpb.CreateDataStore log = log.WithValues( "datastore-name", req.GetDatastoreName(), ) - ctx = logf.IntoContext(ctx, log) + _ = logf.IntoContext(ctx, log) log.Info("creating datastore", "datastore-schema", req.GetSchema(), @@ -287,7 +286,7 @@ func (s *Server) WatchDeviations(req *sdcpb.WatchDeviationRequest, stream sdcpb. // add datastore name to log log = log.WithValues("datastore-name", req.GetName()[0]) - logger.IntoContext(ctx, log) + logf.IntoContext(ctx, log) err = ds.WatchDeviations(req, stream) if err != nil { diff --git a/pkg/server/schema.go b/pkg/server/schema.go index ff6fd57f..dd7e0b7a 100644 --- a/pkg/server/schema.go +++ b/pkg/server/schema.go @@ -100,9 +100,7 @@ func (s *Server) createLocalSchemaStore(ctx context.Context) { func (s *Server) createRemoteSchemaClient(ctx context.Context) { log := logf.FromContext(ctx) SCHEMA_CONNECT: - opts := []grpc.DialOption{ - grpc.WithBlock(), - } + opts := []grpc.DialOption{} switch s.config.SchemaServer.TLS { case nil: opts = append(opts, diff --git a/pkg/server/server.go b/pkg/server/server.go index 2e48bf48..471b7173 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -43,10 +43,6 @@ import ( "github.com/sdcio/data-server/pkg/schema" ) -const ( - schemaServerConnectRetry = 10 * time.Second -) - type Server struct { config *config.Config ready bool @@ -82,7 +78,7 @@ func NewDatastoreMap() *DatastoreMap { } func (d *DatastoreMap) StopAll(ctx context.Context) { for _, ds := range d.datastores { - ds.Stop(ctx) + _ = ds.Stop(ctx) } } @@ -104,7 +100,7 @@ func (d *DatastoreMap) DeleteDatastore(ctx context.Context, name string) error { if err != nil { return err } - ds.Delete(ctx) + _ = ds.Delete(ctx) delete(d.datastores, name) return nil } diff --git a/pkg/tree/api/leaf_entry.go b/pkg/tree/api/leaf_entry.go index 5c8d4a9f..7c6f5819 100644 --- a/pkg/tree/api/leaf_entry.go +++ b/pkg/tree/api/leaf_entry.go @@ -153,7 +153,7 @@ func (l *LeafEntry) Compare(other *LeafEntry) int { if result != 0 { return result } - return strings.Compare(l.Update.Owner(), other.Update.Owner()) + return strings.Compare(l.Owner(), other.Owner()) } // NewLeafEntry constructor for a new LeafEntry diff --git a/pkg/tree/api/leaf_variants.go b/pkg/tree/api/leaf_variants.go index 8558e30b..dffc1046 100644 --- a/pkg/tree/api/leaf_variants.go +++ b/pkg/tree/api/leaf_variants.go @@ -6,7 +6,7 @@ import ( "math" "sync" - . "github.com/sdcio/data-server/pkg/tree/consts" + treeconsts "github.com/sdcio/data-server/pkg/tree/consts" "github.com/sdcio/data-server/pkg/tree/types" sdcpb "github.com/sdcio/sdc-protos/sdcpb" ) @@ -86,7 +86,7 @@ func (lv *LeafVariants) CanDeleteBranch(keepDefault bool) bool { // go through all variants for _, l := range lv.les { // if the LeafVariant is not owned by running or default - if l.Update.Owner() != DefaultsIntentName || keepDefault { + if l.Owner() != treeconsts.DefaultsIntentName || keepDefault { // then we need to check that it remains, so not Delete Flag set or DeleteOnylIntended Flags set [which results in not doing a delete towards the device] if l.GetDeleteOnlyIntendedFlag() || !l.GetDeleteFlag() { // then this entry should not be deleted @@ -116,7 +116,7 @@ func (lv *LeafVariants) checkOnlyRunningAndMaybeDefault() bool { lv.lesMutex.RLock() defer lv.lesMutex.RUnlock() - if len(lv.les) == 1 && lv.les[0].Owner() == RunningIntentName { + if len(lv.les) == 1 && lv.les[0].Owner() == treeconsts.RunningIntentName { return true } @@ -126,9 +126,9 @@ func (lv *LeafVariants) checkOnlyRunningAndMaybeDefault() bool { if len(lv.les) == 2 { for _, l := range lv.les { switch l.Owner() { - case RunningIntentName: + case treeconsts.RunningIntentName: hasRunning = true - case DefaultsIntentName: + case treeconsts.DefaultsIntentName: hasDefault = true } } @@ -159,7 +159,7 @@ func (lv *LeafVariants) CanDelete() bool { // go through all variants for _, l := range lv.les { // if the LeafVariant is not owned by running or default - if l.Update.Owner() != RunningIntentName && l.Update.Owner() != DefaultsIntentName && !l.IsExplicitDelete { + if l.Owner() != treeconsts.RunningIntentName && l.Owner() != treeconsts.DefaultsIntentName && !l.IsExplicitDelete { // then we need to check that it remains, so not Delete Flag set or DeleteOnylIntended Flags set [which results in not doing a delete towards the device] if l.GetDeleteOnlyIntendedFlag() || !l.GetDeleteFlag() { // then this entry should not be deleted @@ -196,7 +196,7 @@ func (lv *LeafVariants) ShouldDelete() bool { // go through all variants for _, l := range lv.les { // if an entry exists that is not owned by running or default, - if l.Update.Owner() == RunningIntentName || l.Update.Owner() == DefaultsIntentName { + if l.Owner() == treeconsts.RunningIntentName || l.Owner() == treeconsts.DefaultsIntentName { continue } foundOtherThenRunningAndDefault = true @@ -229,7 +229,7 @@ func (lv *LeafVariants) RemainsToExist() bool { deleteExists := false // go through all variants for _, l := range lv.les { - if l.Owner() == RunningIntentName || l.Owner() == DefaultsIntentName { + if l.Owner() == treeconsts.RunningIntentName || l.Owner() == treeconsts.DefaultsIntentName { defaultOrRunningExists = true continue } @@ -255,8 +255,8 @@ func (lv *LeafVariants) GetHighestPrecedenceValue(filter HighestPrecedenceFilter defer lv.lesMutex.RUnlock() result := int32(math.MaxInt32) for _, e := range lv.les { - if filter(e) && e.Owner() != DefaultsIntentName && e.Update.Priority() < result { - result = e.Update.Priority() + if filter(e) && e.Owner() != treeconsts.DefaultsIntentName && e.Priority() < result { + result = e.Priority() } } return result @@ -281,7 +281,7 @@ func (lv *LeafVariants) DeepCopy(tc TreeContext, parent Entry) *LeafVariants { // checkReturnDefault checks if defaults are allowed and if the given LeafEntry is owned by default func checkNotDefaultAllowedButIsDefaultOwner(le *LeafEntry, includeDefaults bool) bool { - return !includeDefaults && le.Update.Owner() == DefaultsIntentName + return !includeDefaults && le.Owner() == treeconsts.DefaultsIntentName } func checkExistsAndDeleteFlagSet(le *LeafEntry) bool { @@ -300,7 +300,7 @@ func (lv *LeafVariants) GetRunning() *LeafEntry { lv.lesMutex.RLock() defer lv.lesMutex.RUnlock() for _, e := range lv.les { - if e.Update.Owner() == RunningIntentName { + if e.Owner() == treeconsts.RunningIntentName { return e } } @@ -368,7 +368,7 @@ func (lv *LeafVariants) GetHighestPrecedence(onlyNewOrUpdated bool, includeDefau return nil } // otherwise if the secondhighest is not marked for deletion return it - if secondHighest != nil && !checkExistsAndDeleteFlagSet(secondHighest) && checkNotOwner(secondHighest, RunningIntentName) { + if secondHighest != nil && !checkExistsAndDeleteFlagSet(secondHighest) && checkNotOwner(secondHighest, treeconsts.RunningIntentName) { return secondHighest } @@ -380,16 +380,16 @@ func (lv *LeafVariants) GetHighestPrecedence(onlyNewOrUpdated bool, includeDefau // Expects the caller to hold the read lock on lesMutex. func (lv *LeafVariants) highestIsUnequalRunning(highest *LeafEntry) bool { // if highes is already running or even default, return false - if highest.Update.Owner() == RunningIntentName { + if highest.Owner() == treeconsts.RunningIntentName { return false } // if highest is not new or updated and highest is non-revertive - if !highest.IsNew && !highest.IsUpdated && lv.tc.NonRevertiveInfo().IsNonRevertive(highest.Update.Owner(), lv.parentEntry) { + if !highest.IsNew && !highest.IsUpdated && lv.tc.NonRevertiveInfo().IsNonRevertive(highest.Owner(), lv.parentEntry) { return false } - runVal := lv.GetByOwner(RunningIntentName) + runVal := lv.GetByOwner(treeconsts.RunningIntentName) if runVal == nil { return true } @@ -487,11 +487,11 @@ func (lv *LeafVariants) GetDeviations(ctx context.Context, ch chan<- *types.Devi overruled := make([]*types.DeviationEntry, 0, len(lv.les)) for _, le := range lv.les { // Defaults should be skipped - if le.Owner() == DefaultsIntentName { + if le.Owner() == treeconsts.DefaultsIntentName { continue } // running is stored in running var - if le.Owner() == RunningIntentName { + if le.Owner() == treeconsts.RunningIntentName { running = le continue } diff --git a/pkg/tree/entry_test.go b/pkg/tree/entry_test.go index 2bef7ab3..280c6099 100644 --- a/pkg/tree/entry_test.go +++ b/pkg/tree/entry_test.go @@ -1443,7 +1443,7 @@ func TestLeafVariants_GetHighesPrio(t *testing.T) { func expectNil(t *testing.T, a any, name string) { fail := true switch reflect.TypeOf(a).Kind() { - case reflect.Ptr, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice: + case reflect.Pointer, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice: fail = !reflect.ValueOf(a).IsNil() default: if a != nil { @@ -1459,7 +1459,7 @@ func expectNil(t *testing.T, a any, name string) { func expectNotNil(t *testing.T, a any, name string) { fail := true switch reflect.TypeOf(a).Kind() { - case reflect.Ptr, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice: + case reflect.Pointer, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice: fail = reflect.ValueOf(a).IsNil() default: if a != nil { @@ -2165,7 +2165,9 @@ func Test_RevertNonRevertive(t *testing.T) { } var jConf any - err = json.Unmarshal([]byte(sConf), &jConf) + if err := json.Unmarshal([]byte(sConf), &jConf); err != nil { + return nil, err + } c1Importer := jsonImporter.NewJsonTreeImporter(jConf, owner1, owner1Prio, true) @@ -2179,7 +2181,9 @@ func Test_RevertNonRevertive(t *testing.T) { return nil, err } - err = json.Unmarshal([]byte(sConf), &jConf) + if err := json.Unmarshal([]byte(sConf), &jConf); err != nil { + return nil, err + } c2Importer := jsonImporter.NewJsonTreeImporter(jConf, owner2, owner2Prio, true) return []importer.ImportConfigAdapter{c1Importer, c2Importer}, err // this bool defines the revertive or non revertiveness diff --git a/pkg/tree/importer/xml/xml_tree_importer_test.go b/pkg/tree/importer/xml/xml_tree_importer_test.go index 5b396913..0bef9edf 100644 --- a/pkg/tree/importer/xml/xml_tree_importer_test.go +++ b/pkg/tree/importer/xml/xml_tree_importer_test.go @@ -105,7 +105,9 @@ func TestXmlTreeImporter(t *testing.T) { _, err = root.ImportConfig(ctx, nil, NewXmlTreeImporter(&inputDoc.Element, "owner1", 5, false), types.NewUpdateInsertFlags(), sharedPool) sharedPool.CloseForSubmit() - sharedPool.Wait() + if err := sharedPool.Wait(); err != nil { + t.Fatal(err) + } if err != nil { t.Fatal(err) @@ -185,7 +187,9 @@ func TestXmlTreeImporterElement_IdentityRef(t *testing.T) { } var v any - json.Unmarshal([]byte(confStr), &v) + if err := json.Unmarshal([]byte(confStr), &v); err != nil { + t.Fatalf("unmarshal test config: %v", err) + } vpf := pool.NewSharedTaskPool(ctx, runtime.GOMAXPROCS(0)) _, err = root.ImportConfig(ctx, &sdcpb.Path{}, jsonImporter.NewJsonTreeImporter(v, consts.RunningIntentName, consts.RunningValuesPrio, false), types.NewUpdateInsertFlags(), vpf) diff --git a/pkg/tree/ops/checkandcreatekeysasleafs.go b/pkg/tree/ops/checkandcreatekeysasleafs.go index e3d21740..53b2b4a8 100644 --- a/pkg/tree/ops/checkandcreatekeysasleafs.go +++ b/pkg/tree/ops/checkandcreatekeysasleafs.go @@ -39,7 +39,7 @@ func CheckAndCreateKeysAsLeafs(ctx context.Context, e api.Entry, intentName stri }) // iterate through the keys - var item api.Entry = e + item := e // construct the key path // doing so outside the loop to reuse diff --git a/pkg/tree/ops/getdeviations.go b/pkg/tree/ops/getdeviations.go index d10fee06..c3bfa896 100644 --- a/pkg/tree/ops/getdeviations.go +++ b/pkg/tree/ops/getdeviations.go @@ -66,7 +66,7 @@ func (dt *deviationTask) Run(ctx context.Context, submit func(pool.Task) error) // check if c is a active child (choice / case) _, isActiveChild := activeChilds[cName] // recurse the call - submit(newDeviationTask(c, dt.config, isActiveChild)) + _ = submit(newDeviationTask(c, dt.config, isActiveChild)) } return nil } diff --git a/pkg/tree/ops/getorcreatechilds.go b/pkg/tree/ops/getorcreatechilds.go index a0f2f137..27c78ca3 100644 --- a/pkg/tree/ops/getorcreatechilds.go +++ b/pkg/tree/ops/getorcreatechilds.go @@ -14,7 +14,7 @@ func GetOrCreateChilds(ctx context.Context, e api.Entry, path *sdcpb.Path) (api. return e, nil } - var current api.Entry = e + current := e for i, pe := range path.Elem { // Step 1: Find or create the child for the path element name newCurrent, exists := current.GetChilds(types.DescendMethodAll)[pe.Name] @@ -93,7 +93,7 @@ func AddUpdateRecursiveInternal(ctx context.Context, s api.Entry, path *sdcpb.Pa } var e api.Entry - var x api.Entry = s + x := s var exists bool for name := range path.GetElem()[idx].PathElemNames() { if e, exists = x.GetChilds(types.DescendMethodAll)[name]; !exists { diff --git a/pkg/tree/ops/getpathcompletions.go b/pkg/tree/ops/getpathcompletions.go index 85b678a4..67aac5ab 100644 --- a/pkg/tree/ops/getpathcompletions.go +++ b/pkg/tree/ops/getpathcompletions.go @@ -170,7 +170,7 @@ func completePathName(ctx context.Context, entry api.Entry, toCompletePath *sdcp if len(GetSchemaKeys(e)) > 0 { results = append(results, fmt.Sprintf("%s[%s=", sdcpbPath.ToXPath(false), GetSchemaKeys(e)[0])) } - results = append(results, fmt.Sprintf("%s", sdcpbPath.ToXPath(false))) + results = append(results, sdcpbPath.ToXPath(false)) } sort.Strings(results) return results diff --git a/pkg/tree/ops/json.go b/pkg/tree/ops/json.go index 14ba8357..f3b4a396 100644 --- a/pkg/tree/ops/json.go +++ b/pkg/tree/ops/json.go @@ -90,7 +90,7 @@ func toJsonInternal(ctx context.Context, e api.Entry, onlyNewOrUpdated bool, iet return nil, nil } le := e.GetLeafVariants().GetHighestPrecedence(false, false, false) - if le == nil || onlyNewOrUpdated && !(le.IsNew || le.IsUpdated) { + if le == nil || onlyNewOrUpdated && !le.IsNew && !le.IsUpdated { return nil, nil } } @@ -148,7 +148,7 @@ func jsonAddKeyElements(s api.Entry, dict map[string]any) { parentSchema, levelsUp := GetFirstAncestorWithSchema(s) // from the parent we get the keys as slice schemaKeys := GetSchemaKeys(parentSchema) - var treeElem api.Entry = s + treeElem := s // the keys do match the levels up in the tree in reverse order // hence we init i with levelUp and count down for i := levelsUp - 1; i >= 0; i-- { diff --git a/pkg/tree/ops/proto.go b/pkg/tree/ops/proto.go index e840cff7..8cc07ab2 100644 --- a/pkg/tree/ops/proto.go +++ b/pkg/tree/ops/proto.go @@ -8,8 +8,7 @@ import ( ) func ToProtoUpdates(ctx context.Context, e api.Entry, onlyNewOrUpdated bool) ([]*sdcpb.Update, error) { - result := api.LeafVariantSlice{} - result = GetHighestPrecedence(e, onlyNewOrUpdated, false, true) + result := GetHighestPrecedence(e, onlyNewOrUpdated, false, true) return result.ToSdcpbUpdateSlice(), nil } diff --git a/pkg/tree/ops/validation/processor_validate.go b/pkg/tree/ops/validation/processor_validate.go index 0bce876a..9702a9e9 100644 --- a/pkg/tree/ops/validation/processor_validate.go +++ b/pkg/tree/ops/validation/processor_validate.go @@ -21,7 +21,7 @@ func NewValidateProcessor(parameters *ValidateProcessorParameters) *ValidateProc func (p *ValidateProcessor) Run(taskpoolFactory pool.VirtualPoolFactory, e api.Entry) { taskpool := taskpoolFactory.NewVirtualPool(pool.VirtualTolerant) - taskpool.Submit(newValidateTask(e, p.parameters)) + _ = taskpool.Submit(newValidateTask(e, p.parameters)) taskpool.CloseAndWait() } @@ -60,7 +60,7 @@ func (t *validateTask) Run(ctx context.Context, submit func(pool.Task) error) er validateLevel(ctx, t.e, t.parameters.resultChan, t.parameters.stats, t.parameters.validators) for _, c := range t.e.GetChilds(types.DescendMethodActiveChilds) { - submit(newValidateTask(c, t.parameters)) + _ = submit(newValidateTask(c, t.parameters)) } } return nil diff --git a/pkg/tree/ops/validation/validate.go b/pkg/tree/ops/validation/validate.go index 3fda5c49..8e475220 100644 --- a/pkg/tree/ops/validation/validate.go +++ b/pkg/tree/ops/validation/validate.go @@ -30,7 +30,7 @@ func Validate(ctx context.Context, e api.Entry, vCfg *config.Validation, taskpoo defer syncWait.Done() // read from the validationResult channel for e := range validationResultEntryChan { - validationResult.AddEntry(e) + _ = validationResult.AddEntry(e) } }() diff --git a/pkg/tree/ops/validation/validation_entry_leafref.go b/pkg/tree/ops/validation/validation_entry_leafref.go index fa37b0ca..ab9156a2 100644 --- a/pkg/tree/ops/validation/validation_entry_leafref.go +++ b/pkg/tree/ops/validation/validation_entry_leafref.go @@ -23,7 +23,7 @@ func breadthSearch(ctx context.Context, e api.Entry, sdcpbPath *sdcpb.Path) ([]a if sdcpbPath.GetIsRootBased() { processEntries = []api.Entry{ops.GetRoot(e)} } else { - var entry api.Entry = e + entry := e dotdotcount := 0 sdcpbUp := []*sdcpb.PathElem{} // process the .. instructions diff --git a/pkg/tree/ops/validation/validation_entry_min_max_elements.go b/pkg/tree/ops/validation/validation_entry_min_max_elements.go index 46581530..84d51492 100644 --- a/pkg/tree/ops/validation/validation_entry_min_max_elements.go +++ b/pkg/tree/ops/validation/validation_entry_min_max_elements.go @@ -43,7 +43,7 @@ func validateMinMaxElements(_ context.Context, e api.Entry, resultChan chan<- *t if keyAttr, ok := childAttributes[keyName]; ok { highestPrec := ops.GetHighestPrecedence(keyAttr, false, false, false) if len(highestPrec) > 0 { - owner := highestPrec[0].Update.Owner() + owner := highestPrec[0].Owner() ownersSet[owner] = struct{}{} } } @@ -72,7 +72,7 @@ func validateLeafListMinMaxAttributes(_ context.Context, e api.Entry, resultChan if schema := e.GetSchema().GetLeaflist(); schema != nil { if schema.GetMinElements() > 0 || schema.GetMaxElements() < math.MaxUint64 { if lv := e.GetLeafVariants().GetHighestPrecedence(false, true, false); lv != nil { - tv := lv.Update.Value() + tv := lv.Value() if val := tv.GetLeaflistVal(); val != nil { // check minelements if set diff --git a/pkg/tree/ops/validation/validation_entry_range.go b/pkg/tree/ops/validation/validation_entry_range.go index 2b7c7ba2..6dd50f43 100644 --- a/pkg/tree/ops/validation/validation_entry_range.go +++ b/pkg/tree/ops/validation/validation_entry_range.go @@ -24,7 +24,7 @@ func validateRange(_ context.Context, e api.Entry, resultChan chan<- *types.Vali return } - tv := lv.Update.Value() + tv := lv.Value() var tvs []*sdcpb.TypedValue var typeSchema *sdcpb.SchemaLeafType diff --git a/pkg/tree/ops/xml.go b/pkg/tree/ops/xml.go index d1d2c35e..8b0ff576 100644 --- a/pkg/tree/ops/xml.go +++ b/pkg/tree/ops/xml.go @@ -149,7 +149,7 @@ func toXmlInternal(ctx context.Context, e api.Entry, parent *etree.Element, only return false, nil } le := e.GetLeafVariants().GetHighestPrecedence(false, false, false) - if le == nil || onlyNewOrUpdated && !(le.IsNew || le.IsUpdated) { + if le == nil || onlyNewOrUpdated && !le.IsNew && !le.IsUpdated { return false, nil } } @@ -290,7 +290,7 @@ func xmlAddKeyElements(s api.Entry, parent *etree.Element) { //issue #364: sort the slice sort.Strings(schemaKeys) - var treeElem api.Entry = s + treeElem := s // the keys do match the levels up in the tree in reverse order // hence we init i with levelUp and count down for i := levelsUp - 1; i >= 0; i-- { diff --git a/pkg/tree/ops/xpath_test.go b/pkg/tree/ops/xpath_test.go index 7599f1e4..26608151 100644 --- a/pkg/tree/ops/xpath_test.go +++ b/pkg/tree/ops/xpath_test.go @@ -137,4 +137,4 @@ func TestToXPath_OnlyNewOrUpdated_WithSameNewAndExistingConfig1(t *testing.T) { if !containsPatternTest { t.Fatal("ToXPath() did not include expected /patterntest path") } -} \ No newline at end of file +} diff --git a/pkg/tree/processors/processor_blame_config.go b/pkg/tree/processors/processor_blame_config.go index 3a935832..66853018 100644 --- a/pkg/tree/processors/processor_blame_config.go +++ b/pkg/tree/processors/processor_blame_config.go @@ -88,8 +88,8 @@ func (t *BlameConfigTask) Run(ctx context.Context, submit func(pool.Task) error) // process Value highestLe := t.selfEntry.GetLeafVariants().GetHighestPrecedence(false, true, true) if highestLe != nil { - if highestLe.Update.Owner() != consts.DefaultsIntentName || t.context.IncludeDefaults { - t.self.SetValue(highestLe.Update.Value()).SetOwner(highestLe.Update.Owner()) + if highestLe.Owner() != consts.DefaultsIntentName || t.context.IncludeDefaults { + t.self.SetValue(highestLe.Value()).SetOwner(highestLe.Owner()) // check if running equals the expected runningLe := t.selfEntry.GetLeafVariants().GetRunning() @@ -98,10 +98,10 @@ func (t *BlameConfigTask) Run(ctx context.Context, submit func(pool.Task) error) case runningLe != nil: // if running value is different from the highest precedence value, then we have a deviation, // so we set the deviation value to the running value - if !proto.Equal(runningLe.Update.Value(), highestLe.Update.Value()) { + if !proto.Equal(runningLe.Value(), highestLe.Value()) { t.self.SetDeviationValue(runningLe.Value()) } - case runningLe == nil && highestLe.GetUpdate().Owner() != consts.DefaultsIntentName: + case runningLe == nil && highestLe.Owner() != consts.DefaultsIntentName: // if running is nil and highest is not from default, then the deviation is from a non-existing running value, // so we set it to empty t.self.SetDeviationValue(&sdcpb.TypedValue{}) @@ -114,7 +114,7 @@ func (t *BlameConfigTask) Run(ctx context.Context, submit func(pool.Task) error) childEntry := childs[childKey] childHighestLe := childEntry.GetLeafVariants().GetHighestPrecedence(false, true, true) if childHighestLe != nil { - if childHighestLe.Update.Owner() == consts.DefaultsIntentName && !t.context.IncludeDefaults { + if childHighestLe.Owner() == consts.DefaultsIntentName && !t.context.IncludeDefaults { continue } } diff --git a/pkg/tree/processors/processor_error_collection_test.go b/pkg/tree/processors/processor_error_collection_test.go index cf473460..d6ae7e89 100644 --- a/pkg/tree/processors/processor_error_collection_test.go +++ b/pkg/tree/processors/processor_error_collection_test.go @@ -62,7 +62,9 @@ func TestProcessorErrorCollection(t *testing.T) { } sharedPool.CloseForSubmit() - sharedPool.Wait() + if err := sharedPool.Wait(); err != nil { + t.Fatalf("shared pool wait: %v", err) + } } // TestProcessorEarlyReturnCleanup verifies that if Submit fails early, @@ -103,5 +105,7 @@ func TestProcessorEarlyReturnCleanup(t *testing.T) { } sharedPool.CloseForSubmit() - sharedPool.Wait() + if err := sharedPool.Wait(); err != nil { + t.Fatalf("shared pool wait: %v", err) + } } diff --git a/pkg/tree/processors/processor_importer.go b/pkg/tree/processors/processor_importer.go index f8c6daf8..2cba9544 100644 --- a/pkg/tree/processors/processor_importer.go +++ b/pkg/tree/processors/processor_importer.go @@ -84,7 +84,7 @@ func (task importConfigTask) Run(ctx context.Context, submit func(pool.Task) err // keyed container: handle keys sequentially if len(task.entry.GetSchema().GetContainer().GetKeys()) > 0 { var exists bool - var actual api.Entry = task.entry + actual := task.entry var keyChild api.Entry keys := task.entry.GetSchema().GetContainer().GetKeys() diff --git a/pkg/tree/root_entry.go b/pkg/tree/root_entry.go index a318f2c9..984da853 100644 --- a/pkg/tree/root_entry.go +++ b/pkg/tree/root_entry.go @@ -90,7 +90,7 @@ func (r *RootEntry) SetNonRevertiveIntent(intentName string, nonRevertive bool) // String returns the string representation of the Tree. func (r *RootEntry) String() string { s := []string{} - s = r.Entry.StringIndent(s) + s = r.StringIndent(s) return strings.Join(s, "\n") } diff --git a/pkg/tree/types/update_slice.go b/pkg/tree/types/update_slice.go index 72a67423..057c1482 100644 --- a/pkg/tree/types/update_slice.go +++ b/pkg/tree/types/update_slice.go @@ -22,7 +22,7 @@ func (u UpdateSlice) CopyWithNewOwnerAndPrio(owner string, prio int32) []*PathAn func (u UpdateSlice) String() string { sb := &strings.Builder{} for i, j := range u { - sb.WriteString(fmt.Sprintf("%d - %s -> %s\n", i, j.SdcpbPath().ToXPath(false), j.value.ToString())) + _, _ = fmt.Fprintf(sb, "%d - %s -> %s\n", i, j.SdcpbPath().ToXPath(false), j.value.ToString()) } return sb.String() } diff --git a/pkg/tree/types/validation_result.go b/pkg/tree/types/validation_result.go index bdffbb76..14d31e89 100644 --- a/pkg/tree/types/validation_result.go +++ b/pkg/tree/types/validation_result.go @@ -67,7 +67,7 @@ func (v ValidationResults) JoinErrors() error { var result error for _, intent := range v { - errors.Join(result, errors.Join(intent.errors...)) + result = errors.Join(result, errors.Join(intent.errors...)) } return result } @@ -76,7 +76,7 @@ func (v ValidationResults) JoinWarnings() error { var result error for _, intent := range v { - errors.Join(result, errors.Join(intent.warnings...)) + result = errors.Join(result, errors.Join(intent.warnings...)) } return result } @@ -110,11 +110,11 @@ func (v *ValidationResultIntent) String() string { sb := &strings.Builder{} newLine := "" for _, e := range v.errors { - sb.WriteString(fmt.Sprintf("%s%s: %s - %s", newLine, v.intentName, "error", e.Error())) + _, _ = fmt.Fprintf(sb, "%s%s: %s - %s", newLine, v.intentName, "error", e.Error()) newLine = "\n" } for _, e := range v.warnings { - sb.WriteString(fmt.Sprintf("%s%s: %s - %s", newLine, v.intentName, "warning", e.Error())) + _, _ = fmt.Fprintf(sb, "%s%s: %s - %s", newLine, v.intentName, "warning", e.Error()) newLine = "\n" } return sb.String() diff --git a/pkg/utils/converter.go b/pkg/utils/converter.go index 0af7dddc..f34f9a19 100644 --- a/pkg/utils/converter.go +++ b/pkg/utils/converter.go @@ -250,8 +250,8 @@ func (c *Converter) ExpandContainerValue(ctx context.Context, p *sdcpb.Path, jv } // in case of json_ietf we need to cut the module prefix if k.Type.Type == "identityref" { - val := v found := false + var val string _, val, found = strings.Cut(fmt.Sprintf("%v", v), ":") if found { v = val diff --git a/pkg/utils/notification.go b/pkg/utils/notification.go index 8f9cc968..b1208b6b 100644 --- a/pkg/utils/notification.go +++ b/pkg/utils/notification.go @@ -135,8 +135,10 @@ func FromGNMITypedValue(ctx context.Context, v *gnmi.TypedValue) *sdcpb.TypedVal Value: &sdcpb.TypedValue_DoubleVal{DoubleVal: v.GetDoubleVal()}, } case *gnmi.TypedValue_FloatVal: + tf := v.GetValue().(*gnmi.TypedValue_FloatVal) + fv := tf.FloatVal //nolint:staticcheck // gnmi float_val deprecated upstream without replacement. return &sdcpb.TypedValue{ - Value: &sdcpb.TypedValue_DoubleVal{DoubleVal: float64(v.GetFloatVal())}, + Value: &sdcpb.TypedValue_DoubleVal{DoubleVal: float64(fv)}, } case *gnmi.TypedValue_DoubleVal: return &sdcpb.TypedValue{ From 0425b68c9649fe83c1d83d95fe4fc07f6dfeb1f2 Mon Sep 17 00:00:00 2001 From: steiler Date: Tue, 9 Jun 2026 12:54:57 +0200 Subject: [PATCH 2/2] fix: remove unused logf.IntoContext assignments per review Remove `_ = logf.IntoContext(ctx, log)` lines flagged by @alexandernorth in noop.go and server/datastore.go. In noop.Get the logger was also unused, so remove that too. In server.CreateDataStore the log is still used, so only the dead assignment is dropped. Co-authored-by: Cursor --- pkg/datastore/target/noop/noop.go | 3 --- pkg/server/datastore.go | 2 -- 2 files changed, 5 deletions(-) diff --git a/pkg/datastore/target/noop/noop.go b/pkg/datastore/target/noop/noop.go index f6bf41eb..52d38bc1 100644 --- a/pkg/datastore/target/noop/noop.go +++ b/pkg/datastore/target/noop/noop.go @@ -50,9 +50,6 @@ func (t *noopTarget) AddSyncs(ctx context.Context, sps ...*config.SyncProtocol) } func (t *noopTarget) Get(ctx context.Context, req *sdcpb.GetDataRequest) (*sdcpb.GetDataResponse, error) { - log := logf.FromContext(ctx).WithName("Get") - _ = logf.IntoContext(ctx, log) - result := &sdcpb.GetDataResponse{ Notification: make([]*sdcpb.Notification, 0, len(req.GetPath())), } diff --git a/pkg/server/datastore.go b/pkg/server/datastore.go index a3cfb45d..9331023a 100644 --- a/pkg/server/datastore.go +++ b/pkg/server/datastore.go @@ -77,8 +77,6 @@ func (s *Server) CreateDataStore(ctx context.Context, req *sdcpb.CreateDataStore log = log.WithValues( "datastore-name", req.GetDatastoreName(), ) - _ = logf.IntoContext(ctx, log) - log.Info("creating datastore", "datastore-schema", req.GetSchema(), "datastore-target", req.GetTarget(),