From 4be28e3ab714c0c37c03713887dfd125b06a1197 Mon Sep 17 00:00:00 2001 From: Richard Kovacs Date: Tue, 5 Apr 2022 17:58:20 +0200 Subject: [PATCH 1/2] Fix StorageOS volume hash calculation and status update --- .../controllers/sync-volume/controller.go | 12 +++++- internal/controllers/sync-volume/utils.go | 39 +++++++++++++++++-- internal/pkg/storageos/mock_client.go | 3 +- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/internal/controllers/sync-volume/controller.go b/internal/controllers/sync-volume/controller.go index 663f2810..4a9d3094 100644 --- a/internal/controllers/sync-volume/controller.go +++ b/internal/controllers/sync-volume/controller.go @@ -196,6 +196,7 @@ func (r *Reconciler) sync(ctx context.Context) { // save receives a volume to persists it. func (r *Reconciler) save(ctx context.Context, obj storageos.Object) { log := r.log.WithValues("name", obj.GetName()) + log.V(5).Info("storageos volume", "dump", obj.GetInner()) hash, err := hash(obj) if err != nil { @@ -226,7 +227,7 @@ func (r *Reconciler) save(ctx context.Context, obj storageos.Object) { vol := getVolumeStub(obj.GetName()) - result, err := controllerutil.CreateOrPatch(ctx, r.Client, vol, getConverter(vol, obj, log)) + result, err := controllerutil.CreateOrPatch(ctx, r.Client, vol, getVolumeConverter(vol, obj, log)) if err != nil { r.recorder.Event(vol, "Warning", "Failed", fmt.Sprintf("Failed to persist volume %s: %s", vol.Name, err.Error())) observeErr(err, "unable to persist volume") @@ -239,6 +240,15 @@ func (r *Reconciler) save(ctx context.Context, obj storageos.Object) { log.Info("volume persisted") } + err = getVolumeStatusConverter(vol, obj, log)() + if err != nil { + r.recorder.Event(vol, "Warning", "Failed", fmt.Sprintf("Failed to convert status %s: %s", vol.Name, err.Error())) + observeErr(err, "unable to convert status") + return + } + + log.V(5).Info("K8s volume", "dump", vol) + err = r.Client.Status().Update(ctx, vol) if err != nil { r.recorder.Event(vol, "Warning", "Failed", fmt.Sprintf("Failed to persist volume status %s: %s", vol.Name, err.Error())) diff --git a/internal/controllers/sync-volume/utils.go b/internal/controllers/sync-volume/utils.go index b842e6ab..4621f304 100644 --- a/internal/controllers/sync-volume/utils.go +++ b/internal/controllers/sync-volume/utils.go @@ -27,6 +27,7 @@ package syncvolume import ( "encoding/json" "fmt" + "hash/fnv" "math" "strconv" "strings" @@ -41,7 +42,27 @@ import ( ) func hash(v storageos.Object) ([]byte, error) { - return json.Marshal(v) + stosVol, ok := v.GetInner().(stosapi.Volume) + if !ok { + return nil, errors.New("type cast error") + } + + raw, err := json.Marshal(stosVol) + if err != nil { + return nil, err + } + + hash := []byte{} + for _, s := range [][]byte{[]byte(stosVol.Id), []byte(stosVol.CreatedAt.String()), raw} { + h := fnv.New64a() + _, err = h.Write(s) + if err != nil { + return nil, err + } + hash = append(hash, []byte(strconv.Itoa(int(h.Sum64())))...) + } + + return hash, nil } func getVolumeStub(name string) *stosv1.Volume { @@ -56,7 +77,7 @@ func getVolumeStub(name string) *stosv1.Volume { } } -func getConverter(vol *stosv1.Volume, obj storageos.Object, log logr.Logger) func() error { +func getVolumeConverter(vol *stosv1.Volume, obj storageos.Object, log logr.Logger) func() error { return func() error { stosVol, ok := obj.GetInner().(stosapi.Volume) if !ok { @@ -146,6 +167,17 @@ func getConverter(vol *stosv1.Volume, obj storageos.Object, log logr.Logger) fun } } + return nil + } +} + +func getVolumeStatusConverter(vol *stosv1.Volume, obj storageos.Object, log logr.Logger) func() error { + return func() error { + stosVol, ok := obj.GetInner().(stosapi.Volume) + if !ok { + return errors.New("type cast error") + } + vol.Status = stosv1.VolumeStatus{ VolumeID: obj.GetID(), AttachedOn: stosVol.AttachedOn, @@ -160,9 +192,8 @@ func getConverter(vol *stosv1.Volume, obj storageos.Object, log logr.Logger) fun AttachedOnHost: stosVol.AttachedOnHost, } - vol.Status.Replicas = nil + vol.Status.Replicas = []stosv1.ReplicaDeploymentInfo{} if stosVol.Replicas != nil { - vol.Status.Replicas = make([]stosv1.ReplicaDeploymentInfo, 0, len(*stosVol.Replicas)) for _, stosReplica := range *stosVol.Replicas { replica := stosv1.ReplicaDeploymentInfo{ ID: stosReplica.Id, diff --git a/internal/pkg/storageos/mock_client.go b/internal/pkg/storageos/mock_client.go index 123b50f1..77e1799f 100644 --- a/internal/pkg/storageos/mock_client.go +++ b/internal/pkg/storageos/mock_client.go @@ -27,10 +27,11 @@ type MockObject struct { Namespace string Labels map[string]string Healthy bool + Inner interface{} } func (m MockObject) GetInner() interface{} { - return nil + return m.Inner } // GetID returns the object ID. From 38b81123b214b141785ac28e09d8b2b611e64d2a Mon Sep 17 00:00:00 2001 From: Richard Kovacs Date: Tue, 5 Apr 2022 18:18:10 +0200 Subject: [PATCH 2/2] Upgrade golinter version --- .github/workflows/linter.yml | 4 ++-- .golangci.yml | 11 ----------- 2 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 .golangci.yml diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 82483ecd..df954e7a 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -37,14 +37,14 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: 1.16 - uses: actions/checkout@v2 - name: golangci-lint uses: golangci/golangci-lint-action@v2 with: - version: v1.42.1 + version: v1.45.2 args: -c=".github/linters/.golangci.yml" build: # Name the Job diff --git a/.golangci.yml b/.golangci.yml deleted file mode 100644 index 2f294bda..00000000 --- a/.golangci.yml +++ /dev/null @@ -1,11 +0,0 @@ -linters: - enable: - - gofmt - - goimports - - unconvert - - gocyclo - - nakedret - - scopelint - - whitespace - - godot - - nolintlint