diff --git a/.golangci.yml b/.golangci.yml index 9825b10e2b981e97dbad928e5578b84c9c9cdf25..f0965a4cb10dc8c28837e08c05e4a2038dbded19 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -25,18 +25,10 @@ output: uniq-by-line: true path-prefix: "" -# custom settings for linters -linters-settings: - gocyclo: - min-complexity: 15 - golint: - min-confidence: 0.8 - errcheck: - # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. - # Such cases aren't reported by default. - # Default: false - check-type-assertions: true - +issues: + exclude-use-default: false + max-issues-per-linter: 0 + max-same-issues: 0 linters: # enable the specific needed linters @@ -53,7 +45,15 @@ linters: - whitespace - deadcode - errcheck -issues: - exclude-use-default: false - max-issues-per-linter: 0 - max-same-issues: 0 + +# custom settings for linters +linters-settings: + gocyclo: + min-complexity: 15 + golint: + min-confidence: 0.8 + errcheck: + # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. + # Such cases aren't reported by default. + # Default: false + check-type-assertions: false diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go index a2df244b30185ec7d0c74a37b63cfaaf4412ba42..c70086f10e7db630e5f2f1f77eba2704c62fa50e 100644 --- a/controller/api/initialise_test.go +++ b/controller/api/initialise_test.go @@ -93,7 +93,9 @@ func bootstrapUnitTest() { sbiStore = nucleus.NewMemorySbiStore() userService = rbacImpl.NewUserService(rbacImpl.NewMemoryUserStore(), eventService) roleService = rbacImpl.NewRoleService(rbacImpl.NewMemoryRoleStore(), eventService) - clearAndCreateAuthTestSetup() + if err := clearAndCreateAuthTestSetup(); err != nil { + log.Fatal(err) + } previousHostname := "previousHostname" intendedHostname := "intendedHostname" diff --git a/controller/api/role_test.go b/controller/api/role_test.go index 785ae3128e3c36d770bd67208492d27cb8aaccb4..64fb7caef9c67d071fde3109a616895c6fc7c1c5 100644 --- a/controller/api/role_test.go +++ b/controller/api/role_test.go @@ -7,6 +7,7 @@ import ( apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" "github.com/google/uuid" + log "github.com/sirupsen/logrus" ) func TestCreateRoles(t *testing.T) { @@ -264,7 +265,10 @@ func TestUpdateRoles(t *testing.T) { } func TestDeletePermissionForRole(t *testing.T) { - clearAndCreateAuthTestSetup() + if err := clearAndCreateAuthTestSetup(); err != nil { + log.Error(err) + t.Fail() + } type args struct { ctx context.Context @@ -365,7 +369,10 @@ func TestDeleteRoles(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - clearAndCreateAuthTestSetup() + if err := clearAndCreateAuthTestSetup(); err != nil { + log.Error(err) + t.Fail() + } got, err := DeleteRoles(tt.args.ctx, tt.args.addr, tt.args.roleName) if (err != nil) != tt.wantErr { diff --git a/controller/nucleus/pndFilesystemStore.go b/controller/nucleus/pndFilesystemStore.go index 867d654395359fb7d58a8f3f6c901e93d5cc2524..8720714fbb0a422603bb3a8400bac7e3be7edac2 100644 --- a/controller/nucleus/pndFilesystemStore.go +++ b/controller/nucleus/pndFilesystemStore.go @@ -27,7 +27,10 @@ type FilesystemPndStore struct { // NewFilesystemPndStore returns a filesystem implementation for a pnd store. func NewFilesystemPndStore() FilesystemPndStore { - store.EnsureFilesystemStorePathExists(store.PndFilename) + if err := store.EnsureFilesystemStorePathExists(store.PndFilename); err != nil { + log.Error(err) + } + return FilesystemPndStore{ pendingChannels: make(map[uuid.UUID]chan device.Details), pathToPndFile: store.GetCompletePathToFileStore(store.PndFilename), diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pndFilesystemStore_test.go index 29119f9f343710cf91d6500b2393686d65c68734..abc08fa16eb53e29d105ea06329823f136e6926a 100644 --- a/controller/nucleus/pndFilesystemStore_test.go +++ b/controller/nucleus/pndFilesystemStore_test.go @@ -11,7 +11,10 @@ import ( ) func ensurePndFileForTestIsRemoved() { - store.EnsureFilesystemStorePathExists(store.PndFilename) + if err := store.EnsureFilesystemStorePathExists(store.PndFilename); err != nil { + log.Println(err) + } + path := store.GetCompletePathToFileStore(store.PndFilename) err := os.Remove(path) diff --git a/controller/nucleus/principalNetworkDomain_test.go b/controller/nucleus/principalNetworkDomain_test.go index f62903bd4a5871bf837be80783ed9f148f39c9cc..c6def936b80bf9c0994b957157f8157ec5c78243 100644 --- a/controller/nucleus/principalNetworkDomain_test.go +++ b/controller/nucleus/principalNetworkDomain_test.go @@ -980,7 +980,11 @@ func Test_pndImplementation_Confirm(t *testing.T) { } d := mockDevice() - tr := d.Transport().(*mocks.Transport) + tr, ok := d.Transport().(*mocks.Transport) + if !ok { + log.Errorf("Confirm(), failed type conversion: %v", ok) + } + tr.On("Set", mockContext, mock.Anything, mock.Anything, mock.Anything).Return(nil) _, err := pnd.addDevice(d) if err != nil { diff --git a/controller/nucleus/sbiFilesystemStore.go b/controller/nucleus/sbiFilesystemStore.go index d9a2dcda474bd0e79ccdd12cbadf323d1ce2f47a..7f8a4e95eacf6c2aba65a17ec497134a7e39da00 100644 --- a/controller/nucleus/sbiFilesystemStore.go +++ b/controller/nucleus/sbiFilesystemStore.go @@ -10,6 +10,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" + log "github.com/sirupsen/logrus" ) // FilesystemSbiStore is used to store SouthboundInterfaces @@ -23,7 +24,10 @@ type FilesystemSbiStore struct { func NewFilesystemSbiStore(pndUUID uuid.UUID) southbound.Store { sbiFilenameForUUID := store.GetStoreFilenameForUUID(pndUUID, store.SbiFilenameSuffix) - store.EnsureFilesystemStorePathExists(sbiFilenameForUUID) + if err := store.EnsureFilesystemStorePathExists(sbiFilenameForUUID); err != nil { + log.Error(err) + } + return &FilesystemSbiStore{ pathToSbiFile: store.GetCompletePathToFileStore(sbiFilenameForUUID), fileMutex: sync.Mutex{}, diff --git a/controller/nucleus/sbiFilesystemStore_test.go b/controller/nucleus/sbiFilesystemStore_test.go index 4ec3de489742d87d2fabef6b02e4ec3fcbb25615..179fe2b870da740626de9ba628312e5f8ce6ec2c 100644 --- a/controller/nucleus/sbiFilesystemStore_test.go +++ b/controller/nucleus/sbiFilesystemStore_test.go @@ -13,7 +13,10 @@ import ( ) func ensureSbiFilesForTestAreRemoved() { - store.EnsureFilesystemStorePathExists(store.SbiFilenameSuffix) + if err := store.EnsureFilesystemStorePathExists(store.SbiFilenameSuffix); err != nil { + log.Println(err) + } + wildcartFilename := "*-" + store.SbiFilenameSuffix path := store.GetCompletePathToFileStore(wildcartFilename) diff --git a/controller/topology/nodes/nodeStore.go b/controller/topology/nodes/nodeStore.go index a4f6f3123d7aab5e27f1a880e00d0a8c77073ffb..0c0093b20ce84474025a7c1174809b9f8ec72e0c 100644 --- a/controller/topology/nodes/nodeStore.go +++ b/controller/topology/nodes/nodeStore.go @@ -55,12 +55,14 @@ func (s *DatabaseNodeStore) Get(query query.Query) (Node, error) { return loadedNode, nil } -func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (Node, error) { - var loadedNode Node - +func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (loadedNode Node, err error) { client, ctx, cancel := database.GetMongoConnection() defer cancel() - defer client.Disconnect(ctx) + defer func() { + if ferr := client.Disconnect(ctx); ferr != nil { + err = ferr + } + }() idAsByteArray, _ := idOfNode.MarshalBinary() @@ -71,7 +73,7 @@ func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (Node, error) { return loadedNode, errors.ErrCouldNotFind{ID: idOfNode} } - err := result.Decode(&loadedNode) + err = result.Decode(&loadedNode) if err != nil { return loadedNode, errors.ErrCouldNotMarshall{Identifier: idOfNode, Type: loadedNode, Err: err} } @@ -79,12 +81,14 @@ func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (Node, error) { return loadedNode, nil } -func (s *DatabaseNodeStore) getByName(nameOfNode string) (Node, error) { - var loadedNode Node - +func (s *DatabaseNodeStore) getByName(nameOfNode string) (loadedNode Node, err error) { client, ctx, cancel := database.GetMongoConnection() defer cancel() - defer client.Disconnect(ctx) + defer func() { + if ferr := client.Disconnect(ctx); ferr != nil { + err = ferr + } + }() db := client.Database(database.DatabaseName) collection := db.Collection(s.storeName) @@ -93,7 +97,7 @@ func (s *DatabaseNodeStore) getByName(nameOfNode string) (Node, error) { return loadedNode, errors.ErrCouldNotFind{Name: nameOfNode} } - err := result.Decode(&loadedNode) + err = result.Decode(&loadedNode) if err != nil { return loadedNode, errors.ErrCouldNotMarshall{Identifier: nameOfNode, Type: loadedNode, Err: err} } @@ -102,12 +106,14 @@ func (s *DatabaseNodeStore) getByName(nameOfNode string) (Node, error) { } // GetAll returns all stored nodes. -func (s *DatabaseNodeStore) GetAll() ([]Node, error) { - var loadedNode []Node - +func (s *DatabaseNodeStore) GetAll() (loadedNode []Node, err error) { client, ctx, cancel := database.GetMongoConnection() defer cancel() - defer client.Disconnect(ctx) + defer func() { + if ferr := client.Disconnect(ctx); ferr != nil { + err = ferr + } + }() db := client.Database(database.DatabaseName) collection := db.Collection(s.storeName) @@ -115,7 +121,11 @@ func (s *DatabaseNodeStore) GetAll() ([]Node, error) { if err != nil { return []Node{}, err } - defer cursor.Close(ctx) + defer func() { + if ferr := cursor.Close(ctx); ferr != nil { + err = ferr + } + }() err = cursor.All(ctx, &loadedNode) if err != nil { @@ -126,12 +136,16 @@ func (s *DatabaseNodeStore) GetAll() ([]Node, error) { } // Add adds a node to the node store. -func (s *DatabaseNodeStore) Add(node Node) error { +func (s *DatabaseNodeStore) Add(node Node) (err error) { client, ctx, cancel := database.GetMongoConnection() defer cancel() - defer client.Disconnect(ctx) + defer func() { + if ferr := client.Disconnect(ctx); ferr != nil { + err = ferr + } + }() - _, err := client.Database(database.DatabaseName). + _, err = client.Database(database.DatabaseName). Collection(s.storeName). InsertOne(ctx, node) if err != nil { @@ -142,12 +156,16 @@ func (s *DatabaseNodeStore) Add(node Node) error { } // Update updates a existing node. -func (s *DatabaseNodeStore) Update(node Node) error { +func (s *DatabaseNodeStore) Update(node Node) (err error) { var updatedLoadedNodes Node client, ctx, cancel := database.GetMongoConnection() defer cancel() - defer client.Disconnect(ctx) + defer func() { + if ferr := client.Disconnect(ctx); ferr != nil { + err = ferr + } + }() update := bson.D{primitive.E{Key: "$set", Value: node}} @@ -158,7 +176,7 @@ func (s *DatabaseNodeStore) Update(node Node) error { ReturnDocument: &after, } - err := client.Database(database.DatabaseName). + err = client.Database(database.DatabaseName). Collection(s.storeName). FindOneAndUpdate( ctx, bson.M{"_id": node.ID.String()}, update, &opt). @@ -171,14 +189,18 @@ func (s *DatabaseNodeStore) Update(node Node) error { } // Delete deletes a node from the node store. -func (s *DatabaseNodeStore) Delete(node Node) error { +func (s *DatabaseNodeStore) Delete(node Node) (err error) { client, ctx, cancel := database.GetMongoConnection() defer cancel() - defer client.Disconnect(ctx) + defer func() { + if ferr := client.Disconnect(ctx); ferr != nil { + err = ferr + } + }() db := client.Database(database.DatabaseName) collection := db.Collection(s.storeName) - _, err := collection.DeleteOne(ctx, bson.D{primitive.E{Key: node.ID.String()}}) + _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: node.ID.String()}}) if err != nil { return err } diff --git a/csbi/build.go b/csbi/build.go index 82c091e5964eac8ced2e1a5079a70b8b3e0afb16..019b21be0c16ef85f17d1e6788d3f3a8fab5e9da 100644 --- a/csbi/build.go +++ b/csbi/build.go @@ -16,6 +16,7 @@ import ( "github.com/docker/docker/client" "github.com/docker/docker/pkg/archive" "github.com/prometheus/client_golang/prometheus" + log "github.com/sirupsen/logrus" ) // nolint @@ -29,7 +30,7 @@ type ErrorDetail struct { Message string `json:"message"` } -func buildImage(d Deployment, dockerClient *client.Client) error { +func buildImage(d Deployment, dockerClient *client.Client) (err error) { labels := prometheus.Labels{"type": spb.Type_TYPE_CONTAINERISED.String()} start := promStartHook(labels, buildsTotal) @@ -51,7 +52,11 @@ func buildImage(d Deployment, dockerClient *client.Client) error { if err != nil { return err } - defer res.Body.Close() + defer func() { + if ferr := res.Body.Close(); ferr != nil { + err = ferr + } + }() err = print(res.Body) if err != nil { @@ -71,9 +76,11 @@ func print(rd io.Reader) error { } errLine := &ErrorLine{} - json.Unmarshal([]byte(lastLine), errLine) + err := json.Unmarshal([]byte(lastLine), errLine) if errLine.Error != "" { return errors.New(errLine.Error) + } else if err != nil { + log.Error(err) } return scanner.Err() diff --git a/csbi/deployment_test.go b/csbi/deployment_test.go index 246c826f21dbbe6ce035822675d360a24f0fbbaa..670e7ad339086635e249c689ccc9d15f5c0370e8 100644 --- a/csbi/deployment_test.go +++ b/csbi/deployment_test.go @@ -12,6 +12,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi" "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" "github.com/google/uuid" + log "github.com/sirupsen/logrus" "google.golang.org/grpc/peer" ) @@ -144,7 +145,9 @@ func Test_garbageCollector(t *testing.T) { rval := rand.Float32() if tt.name == "inconsistent" { d.State = csbi.State_STATE_DECOMMISSIONED - os.RemoveAll(d.ID.String()) + if err := os.RemoveAll(d.ID.String()); err != nil { + log.Error(err) + } } else { if rval < tt.args.quota { d.State = csbi.State_STATE_DECOMMISSIONED diff --git a/csbi/generate.go b/csbi/generate.go index b3d1e8dc6a573daf31db351f6decf6ec14049eda..d299aa53ecdabecb2beb4232f0768cce92bdc58a 100644 --- a/csbi/generate.go +++ b/csbi/generate.go @@ -101,11 +101,13 @@ func Generate(ctx context.Context, models []*gpb.ModelData, repository Repositor lock.Unlock() if len(errs) != 0 { + var handledErrs []error n := len(errs) log.Errorf("%v errors during code generation", n) for _, err := range errs { - promHandleError(labels, err, codeGenerationErrorsTotal) + handledErrs = append(handledErrs, promHandleError(labels, err, codeGenerationErrorsTotal)) } + log.Errorf("error details after handling: \n%v\n", handledErrs) } if code == nil { diff --git a/csbi/grpc.go b/csbi/grpc.go index 32fe2587173b39fe3ec135776515f6e19b9e8a01..438cc5ca85218574fe4433d3bcabcfad0a61b2b0 100644 --- a/csbi/grpc.go +++ b/csbi/grpc.go @@ -98,15 +98,18 @@ func (s server) Create(ctx context.Context, req *pb.CreateRequest) (*pb.CreateRe // GetFile sends files based on the requested file name. Currently only // `gostructs.go`, `plugin.yml` and `csbiAdditions.go` are allowed to be // requested. -func (s server) GetFile(req *pb.GetPayloadRequest, stream pb.CsbiService_GetFileServer) error { +func (s server) GetFile(req *pb.GetPayloadRequest, stream pb.CsbiService_GetFileServer) (err error) { log.Info("started GetGoStruct") labels := prometheus.Labels{"rpc": "get_go_struct"} start := promStartHook(labels, grpcRequestsTotal) defer promEndHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) var file *os.File - var err error - defer file.Close() + defer func() { + if ferr := file.Close(); ferr != nil { + err = ferr + } + }() switch fn := req.GetFile(); { case fn == util.GoStructName: diff --git a/csbi/orchestrator.go b/csbi/orchestrator.go index c489a086d9701a03e4aa8dd487dca687bd785efe..df556937acdbcc2f0241276c400fe220e02da725 100644 --- a/csbi/orchestrator.go +++ b/csbi/orchestrator.go @@ -168,7 +168,13 @@ func (o *dockerOrchestrator) attachLogger(ctx context.Context, containerID strin if err != nil { log.Error(err) } - defer logStream.Close() + + defer func() { + if err := logStream.Close(); err != nil { + log.Error(err) + } + }() + stdlogger := log.StandardLogger() stdlogger.Trace("detached logger") stdout := stdlogger.Writer()