From 43ed92da3e6d7b3f82821532ef02e115ae3c5481 Mon Sep 17 00:00:00 2001 From: Nikita Bhatia Date: Fri, 28 Apr 2023 10:52:34 +0530 Subject: [PATCH 1/8] PWX-30230 : Create all px configmaps in same namespace as portworx Signed-off-by: Nikita Bhatia --- k8s/core/configmap/configmap.go | 229 ++++++++---------------- k8s/core/configmap/configmap_lock_v1.go | 10 +- k8s/core/configmap/configmap_lock_v2.go | 20 +-- k8s/core/configmap/coreconfigmap.go | 192 ++++++++++++++++++++ k8s/core/configmap/types.go | 7 + 5 files changed, 286 insertions(+), 172 deletions(-) create mode 100644 k8s/core/configmap/coreconfigmap.go diff --git a/k8s/core/configmap/configmap.go b/k8s/core/configmap/configmap.go index ed50972b..849c1ede 100644 --- a/k8s/core/configmap/configmap.go +++ b/k8s/core/configmap/configmap.go @@ -1,188 +1,103 @@ package configmap import ( - "fmt" - "strings" "time" - "github.com/portworx/sched-ops/k8s/core" - "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - k8s_errors "k8s.io/apimachinery/pkg/api/errors" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/pborman/uuid" + log "github.com/sirupsen/logrus" ) -// New returns the ConfigMap interface. It also creates a new -// configmap in k8s for the given name if not present and puts the data in it. -func New( - name string, - data map[string]string, - lockTimeout time.Duration, - lockAttempts uint, - v2LockRefreshDuration time.Duration, - v2LockK8sLockTTL time.Duration, -) (ConfigMap, error) { - if data == nil { - data = make(map[string]string) - } - - labels := map[string]string{ - configMapUserLabelKey: TruncateLabel(name), - } - data[pxOwnerKey] = "" - - cm := &corev1.ConfigMap{ - ObjectMeta: meta_v1.ObjectMeta{ - Name: name, - Namespace: k8sSystemNamespace, - Labels: labels, - }, - Data: data, - } +func (c *configMap) Instance() ConfigMap { - if _, err := core.Instance().CreateConfigMap(cm); err != nil && - !k8s_errors.IsAlreadyExists(err) { - return nil, fmt.Errorf("failed to create configmap %v: %v", - name, err) - } - - if v2LockK8sLockTTL == 0 { - v2LockK8sLockTTL = v2DefaultK8sLockTTL - } + //iskvdbhealthy + //kvdb.instance - if v2LockRefreshDuration == 0 { - v2LockRefreshDuration = v2DefaultK8sLockRefreshDuration + if c.pxNs == c.config.nameSpace { + //fresh install + //upgrade completed + return c.config + } else { + existingConfig := c.config + c.copylock.Lock(uuid.New()) + defer c.copylock.Unlock() + lockMap, err := c.copylock.Get() + if err != nil { + log.Error("Error during fetching data from copy lock %s", err) + return existingConfig + } + status := lockMap["UPGRADE_DONE"] + if status == "true" { + // upgrade is completed + //create configmap in portworx namespace + newConfig := &coreConfigMap{ + name: existingConfig.name, + defaultLockHoldTimeout: existingConfig.defaultLockHoldTimeout, + kLocksV2: existingConfig.kLocksV2, + lockAttempts: existingConfig.lockAttempts, + lockRefreshDuration: existingConfig.lockRefreshDuration, + lockK8sLockTTL: existingConfig.lockK8sLockTTL, + nameSpace: "portworx", + } + + configData, err := existingConfig.Get() + if err != nil { + log.Errorf("Error during fetching data from old config map %s", err) + return existingConfig + } + //copy data from old configmap to new configmap + if err = newConfig.Update(configData); err != nil { + log.Errorf("Error during copying data from old config map %s", err) + return existingConfig + } + + //delete old configmap + err = c.config.Delete() + if err != nil { + log.Errorf("Error during deleting configmap %s in namespace %s ", c.config.name, c.config.nameSpace) + } + c.config = newConfig + } else { + return existingConfig + } } - - return &configMap{ - name: name, - defaultLockHoldTimeout: lockTimeout, - kLocksV2: map[string]*k8sLock{}, - lockAttempts: lockAttempts, - lockRefreshDuration: v2LockRefreshDuration, - lockK8sLockTTL: v2LockK8sLockTTL, - }, nil + return c.config } func (c *configMap) Get() (map[string]string, error) { - cm, err := core.Instance().GetConfigMap( - c.name, - k8sSystemNamespace, - ) - if err != nil { - return nil, err - } - - return cm.Data, nil + return c.Instance().Get() } func (c *configMap) Delete() error { - return core.Instance().DeleteConfigMap( - c.name, - k8sSystemNamespace, - ) + return c.Instance().Delete() } func (c *configMap) Patch(data map[string]string) error { - var ( - err error - cm *corev1.ConfigMap - ) - for retries := 0; retries < maxConflictRetries; retries++ { - cm, err = core.Instance().GetConfigMap( - c.name, - k8sSystemNamespace, - ) - if err != nil { - return err - } - - if cm.Data == nil { - cm.Data = make(map[string]string, 0) - } - - for k, v := range data { - cm.Data[k] = v - } - _, err = core.Instance().UpdateConfigMap(cm) - if k8s_errors.IsConflict(err) { - // try again - continue - } - return err - } - return err + return c.Instance().Patch(data) } func (c *configMap) Update(data map[string]string) error { - var ( - err error - cm *corev1.ConfigMap - ) - for retries := 0; retries < maxConflictRetries; retries++ { - cm, err = core.Instance().GetConfigMap( - c.name, - k8sSystemNamespace, - ) - if err != nil { - return err - } - cm.Data = data - _, err = core.Instance().UpdateConfigMap(cm) - if k8s_errors.IsConflict(err) { - // try again - continue - } - return err - } - return err + return c.Instance().Update(data) } -// SetFatalCb sets the fatal callback for the package which will get invoked in panic situations -func SetFatalCb(fb FatalCb) { - fatalCb = fb +func (c *configMap) Lock(id string) error { + return c.Instance().Lock(id) } -func configMapLog(fn, name, owner, key string, err error) *logrus.Entry { - if len(owner) > 0 && len(key) > 0 { - return logrus.WithFields(logrus.Fields{ - "Module": "ConfigMap", - "Name": name, - "Owner": owner, - "Key": key, - "Function": fn, - "Error": err, - }) - } - if len(owner) > 0 { - return logrus.WithFields(logrus.Fields{ - "Module": "ConfigMap", - "Name": name, - "Owner": owner, - "Function": fn, - "Error": err, - }) - } - return logrus.WithFields(logrus.Fields{ - "Module": "ConfigMap", - "Name": name, - "Function": fn, - "Error": err, - }) +func (c *configMap) LockWithHoldTimeout(id string, holdTimeout time.Duration) error { + return c.Instance().LockWithHoldTimeout(id, holdTimeout) } -// GetName is a helper function that returns a valid k8s -// configmap name given a prefix identifying the component using -// the configmap and a clusterID -func GetName(prefix, clusterID string) string { - return prefix + strings.ToLower(configMapNameRegex.ReplaceAllString(clusterID, "")) +func (c *configMap) LockWithKey(owner, key string) error { + return c.Instance().LockWithKey(owner, key) } -// TruncateLabel is a helper function that returns a valid k8s -// label stripped down to 63 characters. It removes the trailing characters -func TruncateLabel(label string) string { - if len(label) > 63 { - return label[:63] - } - return label +func (c *configMap) Unlock() error { + return c.Instance().Unlock() +} + +func (c *configMap) UnlockWithKey(key string) error { + return c.Instance().UnlockWithKey(key) +} +func (c *configMap) IsKeyLocked(key string) (bool, string, error) { + return c.Instance().IsKeyLocked(key) } diff --git a/k8s/core/configmap/configmap_lock_v1.go b/k8s/core/configmap/configmap_lock_v1.go index ea98317b..9d545ffb 100644 --- a/k8s/core/configmap/configmap_lock_v1.go +++ b/k8s/core/configmap/configmap_lock_v1.go @@ -8,11 +8,11 @@ import ( k8s_errors "k8s.io/apimachinery/pkg/api/errors" ) -func (c *configMap) Lock(id string) error { +func (c *coreConfigMap) Lock(id string) error { return c.LockWithHoldTimeout(id, c.defaultLockHoldTimeout) } -func (c *configMap) LockWithHoldTimeout(id string, holdTimeout time.Duration) error { +func (c *coreConfigMap) LockWithHoldTimeout(id string, holdTimeout time.Duration) error { fn := "LockWithHoldTimeout" count := uint(0) // try acquiring a lock on the ConfigMap @@ -40,7 +40,7 @@ func (c *configMap) LockWithHoldTimeout(id string, holdTimeout time.Duration) er return nil } -func (c *configMap) Unlock() error { +func (c *coreConfigMap) Unlock() error { fn := "Unlock" // Get the existing ConfigMap c.kLockV1.Lock() @@ -91,7 +91,7 @@ func (c *configMap) Unlock() error { return err } -func (c *configMap) tryLockV1(id string, refresh bool) (string, error) { +func (c *coreConfigMap) tryLockV1(id string, refresh bool) (string, error) { // Get the existing ConfigMap cm, err := core.Instance().GetConfigMap( c.name, @@ -140,7 +140,7 @@ increase_expiry: return id, nil } -func (c *configMap) refreshLockV1(id string) { +func (c *coreConfigMap) refreshLockV1(id string) { fn := "refreshLock" refresh := time.NewTicker(v1DefaultK8sLockRefreshDuration) var ( diff --git a/k8s/core/configmap/configmap_lock_v2.go b/k8s/core/configmap/configmap_lock_v2.go index 794c7c03..d09de63a 100644 --- a/k8s/core/configmap/configmap_lock_v2.go +++ b/k8s/core/configmap/configmap_lock_v2.go @@ -12,7 +12,7 @@ import ( k8s_errors "k8s.io/apimachinery/pkg/api/errors" ) -func (c *configMap) LockWithKey(owner, key string) error { +func (c *coreConfigMap) LockWithKey(owner, key string) error { if key == "" { return fmt.Errorf("key cannot be empty") } @@ -54,7 +54,7 @@ func (c *configMap) LockWithKey(owner, key string) error { return nil } -func (c *configMap) UnlockWithKey(key string) error { +func (c *coreConfigMap) UnlockWithKey(key string) error { if key == "" { return fmt.Errorf("key cannot be empty") } @@ -136,7 +136,7 @@ func (c *configMap) UnlockWithKey(key string) error { return err } -func (c *configMap) IsKeyLocked(key string) (bool, string, error) { +func (c *coreConfigMap) IsKeyLocked(key string) (bool, string, error) { // Get the existing ConfigMap cm, err := core.Instance().GetConfigMap( c.name, @@ -170,7 +170,7 @@ func (c *configMap) IsKeyLocked(key string) (bool, string, error) { return false, "", nil } -func (c *configMap) tryLock(owner string, key string) (string, error) { +func (c *coreConfigMap) tryLock(owner string, key string) (string, error) { // Get the existing ConfigMap cm, err := core.Instance().GetConfigMap( c.name, @@ -209,7 +209,7 @@ func (c *configMap) tryLock(owner string, key string) (string, error) { // parseLocks reads the lock data from the given ConfigMap and then converts it to: // * a map of keys to lock owners // * a map of keys to lock expiration times -func (c *configMap) parseLocks(cm *v1.ConfigMap) (map[string]string, map[string]time.Time, error) { +func (c *coreConfigMap) parseLocks(cm *v1.ConfigMap) (map[string]string, map[string]time.Time, error) { // Check all the locks: will be an empty string if key is not present indicating no lock parsedLocks := []lockData{} if lock, ok := cm.Data[pxLockKey]; ok && len(lock) > 0 { @@ -233,7 +233,7 @@ func (c *configMap) parseLocks(cm *v1.ConfigMap) (map[string]string, map[string] // checkAndTakeLock tries to take the given lock (owner, key) given the current state of the lock // (lockOwners, lockExpirations). -func (c *configMap) checkAndTakeLock( +func (c *coreConfigMap) checkAndTakeLock( owner, key string, lockOwners map[string]string, lockExpirations map[string]time.Time, @@ -279,7 +279,7 @@ func (c *configMap) checkAndTakeLock( // generateConfigMapData converts the given lock data (lockOwners, lockExpirations) to JSON and // stores it in the given ConfigMap. -func (c *configMap) generateConfigMapData(cm *v1.ConfigMap, lockOwners map[string]string, lockExpirations map[string]time.Time) error { +func (c *coreConfigMap) generateConfigMapData(cm *v1.ConfigMap, lockOwners map[string]string, lockExpirations map[string]time.Time) error { var locks []lockData for key, lockOwner := range lockOwners { locks = append(locks, lockData{ @@ -297,7 +297,7 @@ func (c *configMap) generateConfigMapData(cm *v1.ConfigMap, lockOwners map[strin return nil } -func (c *configMap) updateConfigMap(cm *v1.ConfigMap) (bool, error) { +func (c *coreConfigMap) updateConfigMap(cm *v1.ConfigMap) (bool, error) { if _, err := core.Instance().UpdateConfigMap(cm); err != nil { return k8s_errors.IsConflict(err), err } @@ -308,7 +308,7 @@ func (c *configMap) updateConfigMap(cm *v1.ConfigMap) (bool, error) { // It keeps the lock refreshed in k8s until we call Unlock. This is so that if the // node dies, the lock can have a short timeout and expire quickly but we can still // take longer-term locks. -func (c *configMap) refreshLock(id, key string) { +func (c *coreConfigMap) refreshLock(id, key string) { fn := "refreshLock" refresh := time.NewTicker(c.lockRefreshDuration) var ( @@ -356,7 +356,7 @@ func (c *configMap) refreshLock(id, key string) { } -func (c *configMap) checkLockTimeout(holdTimeout time.Duration, startTime time.Time, id string) { +func (c *coreConfigMap) checkLockTimeout(holdTimeout time.Duration, startTime time.Time, id string) { if holdTimeout > 0 && time.Since(startTime) > holdTimeout { panicMsg := fmt.Sprintf("Lock hold timeout (%v) triggered for K8s configmap lock key %s", holdTimeout, id) if fatalCb != nil { diff --git a/k8s/core/configmap/coreconfigmap.go b/k8s/core/configmap/coreconfigmap.go new file mode 100644 index 00000000..861f565f --- /dev/null +++ b/k8s/core/configmap/coreconfigmap.go @@ -0,0 +1,192 @@ +package configmap + +import ( + "fmt" + "strings" + "time" + + "github.com/portworx/sched-ops/k8s/core" + "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" + k8s_errors "k8s.io/apimachinery/pkg/api/errors" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// New returns the ConfigMap interface. It also creates a new +// configmap in k8s for the given name if not present and puts the data in it. +func New( + name string, + data map[string]string, + lockTimeout time.Duration, + lockAttempts uint, + v2LockRefreshDuration time.Duration, + v2LockK8sLockTTL time.Duration, + ns string, +) (ConfigMap, error) { + if data == nil { + data = make(map[string]string) + } + + //if copylock not created, then create + + labels := map[string]string{ + configMapUserLabelKey: TruncateLabel(name), + } + data[pxOwnerKey] = "" + + cm := &corev1.ConfigMap{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: name, + Namespace: ns, + Labels: labels, + }, + Data: data, + } + + if _, err := core.Instance().CreateConfigMap(cm); err != nil && + !k8s_errors.IsAlreadyExists(err) { + return nil, fmt.Errorf("failed to create configmap %v: %v", + name, err) + } + + if v2LockK8sLockTTL == 0 { + v2LockK8sLockTTL = v2DefaultK8sLockTTL + } + + if v2LockRefreshDuration == 0 { + v2LockRefreshDuration = v2DefaultK8sLockRefreshDuration + } + + return &coreConfigMap{ + name: name, + defaultLockHoldTimeout: lockTimeout, + kLocksV2: map[string]*k8sLock{}, + lockAttempts: lockAttempts, + lockRefreshDuration: v2LockRefreshDuration, + lockK8sLockTTL: v2LockK8sLockTTL, + nameSpace: ns, + }, nil +} + +func (c *coreConfigMap) Get() (map[string]string, error) { + cm, err := core.Instance().GetConfigMap( + c.name, + c.nameSpace, + ) + if err != nil { + return nil, err + } + + return cm.Data, nil +} + +func (c *coreConfigMap) Delete() error { + return core.Instance().DeleteConfigMap( + c.name, + c.nameSpace, + ) +} + +func (c *coreConfigMap) Patch(data map[string]string) error { + var ( + err error + cm *corev1.ConfigMap + ) + for retries := 0; retries < maxConflictRetries; retries++ { + cm, err = core.Instance().GetConfigMap( + c.name, + c.nameSpace, + ) + if err != nil { + return err + } + + if cm.Data == nil { + cm.Data = make(map[string]string, 0) + } + + for k, v := range data { + cm.Data[k] = v + } + _, err = core.Instance().UpdateConfigMap(cm) + if k8s_errors.IsConflict(err) { + // try again + continue + } + return err + } + return err +} + +func (c *coreConfigMap) Update(data map[string]string) error { + var ( + err error + cm *corev1.ConfigMap + ) + for retries := 0; retries < maxConflictRetries; retries++ { + cm, err = core.Instance().GetConfigMap( + c.name, + c.nameSpace, + ) + if err != nil { + return err + } + cm.Data = data + _, err = core.Instance().UpdateConfigMap(cm) + if k8s_errors.IsConflict(err) { + // try again + continue + } + return err + } + return err +} + +// SetFatalCb sets the fatal callback for the package which will get invoked in panic situations +func SetFatalCb(fb FatalCb) { + fatalCb = fb +} + +func configMapLog(fn, name, owner, key string, err error) *logrus.Entry { + if len(owner) > 0 && len(key) > 0 { + return logrus.WithFields(logrus.Fields{ + "Module": "ConfigMap", + "Name": name, + "Owner": owner, + "Key": key, + "Function": fn, + "Error": err, + }) + } + if len(owner) > 0 { + return logrus.WithFields(logrus.Fields{ + "Module": "ConfigMap", + "Name": name, + "Owner": owner, + "Function": fn, + "Error": err, + }) + } + return logrus.WithFields(logrus.Fields{ + "Module": "ConfigMap", + "Name": name, + "Function": fn, + "Error": err, + }) +} + +// GetName is a helper function that returns a valid k8s +// configmap name given a prefix identifying the component using +// the configmap and a clusterID +func GetName(prefix, clusterID string) string { + return prefix + strings.ToLower(configMapNameRegex.ReplaceAllString(clusterID, "")) +} + +// TruncateLabel is a helper function that returns a valid k8s +// label stripped down to 63 characters. It removes the trailing characters +func TruncateLabel(label string) string { + if len(label) > 63 { + return label[:63] + } + return label +} diff --git a/k8s/core/configmap/types.go b/k8s/core/configmap/types.go index 97b43d1d..4722526b 100644 --- a/k8s/core/configmap/types.go +++ b/k8s/core/configmap/types.go @@ -58,7 +58,14 @@ var ( type FatalCb func(format string, args ...interface{}) type configMap struct { + config *coreConfigMap + pxNs string + copylock *coreConfigMap +} + +type coreConfigMap struct { name string + nameSpace string kLockV1 k8sLock kLocksV2Mutex sync.Mutex kLocksV2 map[string]*k8sLock From 037bae00cb5e0071feb80c158356360dbbf956f6 Mon Sep 17 00:00:00 2001 From: Nikita Bhatia Date: Fri, 28 Apr 2023 16:33:28 +0530 Subject: [PATCH 2/8] Fix failing test Signed-off-by: Nikita Bhatia --- k8s/core/configmap/configmap.go | 6 +++--- k8s/core/configmap/configmap_lock_v1.go | 4 ++-- k8s/core/configmap/configmap_lock_v1_test.go | 4 ++-- k8s/core/configmap/configmap_lock_v2.go | 6 +++--- k8s/core/configmap/configmap_lock_v2_test.go | 2 +- k8s/core/configmap/configmap_test.go | 9 +++++---- k8s/core/configmap/coreconfigmap.go | 7 ++++++- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/k8s/core/configmap/configmap.go b/k8s/core/configmap/configmap.go index 849c1ede..10e55089 100644 --- a/k8s/core/configmap/configmap.go +++ b/k8s/core/configmap/configmap.go @@ -3,7 +3,7 @@ package configmap import ( "time" - "github.com/pborman/uuid" + "github.com/google/uuid" log "github.com/sirupsen/logrus" ) @@ -18,11 +18,11 @@ func (c *configMap) Instance() ConfigMap { return c.config } else { existingConfig := c.config - c.copylock.Lock(uuid.New()) + c.copylock.Lock(uuid.New().String()) defer c.copylock.Unlock() lockMap, err := c.copylock.Get() if err != nil { - log.Error("Error during fetching data from copy lock %s", err) + log.Errorf("Error during fetching data from copy lock %s", err) return existingConfig } status := lockMap["UPGRADE_DONE"] diff --git a/k8s/core/configmap/configmap_lock_v1.go b/k8s/core/configmap/configmap_lock_v1.go index 9d545ffb..3a15037c 100644 --- a/k8s/core/configmap/configmap_lock_v1.go +++ b/k8s/core/configmap/configmap_lock_v1.go @@ -60,7 +60,7 @@ func (c *coreConfigMap) Unlock() error { for retries := 0; retries < maxConflictRetries; retries++ { cm, err = core.Instance().GetConfigMap( c.name, - k8sSystemNamespace, + c.nameSpace, ) if err != nil { // A ConfigMap should always be created. @@ -95,7 +95,7 @@ func (c *coreConfigMap) tryLockV1(id string, refresh bool) (string, error) { // Get the existing ConfigMap cm, err := core.Instance().GetConfigMap( c.name, - k8sSystemNamespace, + c.nameSpace, ) if err != nil { // A ConfigMap should always be created. diff --git a/k8s/core/configmap/configmap_lock_v1_test.go b/k8s/core/configmap/configmap_lock_v1_test.go index 03e29338..b7f2316a 100644 --- a/k8s/core/configmap/configmap_lock_v1_test.go +++ b/k8s/core/configmap/configmap_lock_v1_test.go @@ -13,7 +13,7 @@ import ( func TestLock(t *testing.T) { fakeClient := fakek8sclient.NewSimpleClientset() coreops.SetInstance(coreops.New(fakeClient)) - cm, err := New("px-configmaps-test", nil, lockTimeout, 5, 0, 0) + cm, err := New("px-configmaps-test", nil, lockTimeout, 5, 0, 0, "test-ns") require.NoError(t, err, "Unexpected error on New") fmt.Println("testLock") @@ -112,7 +112,7 @@ func TestLockWithHoldTimeout(t *testing.T) { customHoldTimeout := defaultHoldTimeout + v1DefaultK8sLockRefreshDuration + 10*time.Second fakeClient := fakek8sclient.NewSimpleClientset() coreops.SetInstance(coreops.New(fakeClient)) - cm, err := New("px-configmaps-test", nil, defaultHoldTimeout, 5, 0, 0) + cm, err := New("px-configmaps-test", nil, defaultHoldTimeout, 5, 0, 0, "test-ns") require.NoError(t, err, "Unexpected error on New") fmt.Println("TestLockWithHoldTimeout") diff --git a/k8s/core/configmap/configmap_lock_v2.go b/k8s/core/configmap/configmap_lock_v2.go index d09de63a..12c5fa42 100644 --- a/k8s/core/configmap/configmap_lock_v2.go +++ b/k8s/core/configmap/configmap_lock_v2.go @@ -89,7 +89,7 @@ func (c *coreConfigMap) UnlockWithKey(key string) error { for retries := 0; retries < maxConflictRetries; retries++ { cm, err = core.Instance().GetConfigMap( c.name, - k8sSystemNamespace, + c.nameSpace, ) if err != nil { // A ConfigMap should always be created. @@ -140,7 +140,7 @@ func (c *coreConfigMap) IsKeyLocked(key string) (bool, string, error) { // Get the existing ConfigMap cm, err := core.Instance().GetConfigMap( c.name, - k8sSystemNamespace, + c.nameSpace, ) if err != nil { return false, "", err @@ -174,7 +174,7 @@ func (c *coreConfigMap) tryLock(owner string, key string) (string, error) { // Get the existing ConfigMap cm, err := core.Instance().GetConfigMap( c.name, - k8sSystemNamespace, + c.nameSpace, ) if err != nil { // A ConfigMap should always be created. diff --git a/k8s/core/configmap/configmap_lock_v2_test.go b/k8s/core/configmap/configmap_lock_v2_test.go index 74955bc6..d317af1f 100644 --- a/k8s/core/configmap/configmap_lock_v2_test.go +++ b/k8s/core/configmap/configmap_lock_v2_test.go @@ -17,7 +17,7 @@ const ( func TestMultilock(t *testing.T) { fakeClient := fakek8sclient.NewSimpleClientset() coreops.SetInstance(coreops.New(fakeClient)) - cm, err := New("px-configmaps-test", nil, lockTimeout, 3, 0, 0) + cm, err := New("px-configmaps-test", nil, lockTimeout, 3, 0, 0, "test-ns") require.NoError(t, err, "Unexpected error on New") fmt.Println("testMultilock") diff --git a/k8s/core/configmap/configmap_test.go b/k8s/core/configmap/configmap_test.go index 44bfc4ae..dc60256a 100644 --- a/k8s/core/configmap/configmap_test.go +++ b/k8s/core/configmap/configmap_test.go @@ -17,7 +17,8 @@ func TestGetConfigMap(t *testing.T) { configData := map[string]string{ "key1": "val1", } - cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0) + cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0, "test-ns") + fmt.Println("cm : ", cm) require.NoError(t, err, "Unexpected error in creating configmap") resultMap, err := cm.Get() @@ -34,7 +35,7 @@ func TestDeleteConfigMap(t *testing.T) { "key1": "val1", } - cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0) + cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0, "test-ns") require.NoError(t, err, "Unexpected error in creating configmap") err = cm.Delete() @@ -50,7 +51,7 @@ func TestPatchConfigMap(t *testing.T) { "key1": "val1", } - cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0) + cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0, "test-ns") require.NoError(t, err, "Unexpected error in creating configmap") dummyData := map[string]string{ @@ -73,7 +74,7 @@ func TestUpdateConfigMap(t *testing.T) { "key1": "val1", } - cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0) + cm, err := New("px-configmaps-test", configData, lockTimeout, 5, 0, 0, "test-ns") require.NoError(t, err, "Unexpected error in creating configmap") dummyData := map[string]string{ diff --git a/k8s/core/configmap/coreconfigmap.go b/k8s/core/configmap/coreconfigmap.go index 861f565f..928729f2 100644 --- a/k8s/core/configmap/coreconfigmap.go +++ b/k8s/core/configmap/coreconfigmap.go @@ -57,7 +57,7 @@ func New( v2LockRefreshDuration = v2DefaultK8sLockRefreshDuration } - return &coreConfigMap{ + config := &coreConfigMap{ name: name, defaultLockHoldTimeout: lockTimeout, kLocksV2: map[string]*k8sLock{}, @@ -65,6 +65,11 @@ func New( lockRefreshDuration: v2LockRefreshDuration, lockK8sLockTTL: v2LockK8sLockTTL, nameSpace: ns, + } + return &configMap{ + config: config, + pxNs: ns, + copylock: nil, }, nil } From 6b64f7a1556b4b160618afe9c276e91a99a0c995 Mon Sep 17 00:00:00 2001 From: Nikita Bhatia Date: Mon, 1 May 2023 22:26:22 +0530 Subject: [PATCH 3/8] create copylock configmap Signed-off-by: Nikita Bhatia --- k8s/core/configmap/configmap.go | 31 +++++++++++-------------- k8s/core/configmap/coreconfigmap.go | 36 +++++++++++++++++++++++++---- k8s/core/configmap/types.go | 11 ++++++--- k8s/core/configmaps.go | 2 ++ 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/k8s/core/configmap/configmap.go b/k8s/core/configmap/configmap.go index 10e55089..965587d5 100644 --- a/k8s/core/configmap/configmap.go +++ b/k8s/core/configmap/configmap.go @@ -7,26 +7,23 @@ import ( log "github.com/sirupsen/logrus" ) -func (c *configMap) Instance() ConfigMap { - - //iskvdbhealthy - //kvdb.instance +func (c *configMap) Instance() *coreConfigMap { if c.pxNs == c.config.nameSpace { - //fresh install - //upgrade completed + //fresh install ot upgrade completed return c.config } else { existingConfig := c.config c.copylock.Lock(uuid.New().String()) defer c.copylock.Unlock() - lockMap, err := c.copylock.Get() + + lockMap, err := c.copylock.get() if err != nil { log.Errorf("Error during fetching data from copy lock %s", err) return existingConfig } - status := lockMap["UPGRADE_DONE"] - if status == "true" { + status := lockMap[upgradeCompletedStatus] + if status == true { // upgrade is completed //create configmap in portworx namespace newConfig := &coreConfigMap{ @@ -36,22 +33,22 @@ func (c *configMap) Instance() ConfigMap { lockAttempts: existingConfig.lockAttempts, lockRefreshDuration: existingConfig.lockRefreshDuration, lockK8sLockTTL: existingConfig.lockK8sLockTTL, - nameSpace: "portworx", + nameSpace: pxNamespace, } - configData, err := existingConfig.Get() + configData, err := existingConfig.get() if err != nil { log.Errorf("Error during fetching data from old config map %s", err) return existingConfig } //copy data from old configmap to new configmap - if err = newConfig.Update(configData); err != nil { + if err = newConfig.update(configData); err != nil { log.Errorf("Error during copying data from old config map %s", err) return existingConfig } //delete old configmap - err = c.config.Delete() + err = c.config.delete() if err != nil { log.Errorf("Error during deleting configmap %s in namespace %s ", c.config.name, c.config.nameSpace) } @@ -64,19 +61,19 @@ func (c *configMap) Instance() ConfigMap { } func (c *configMap) Get() (map[string]string, error) { - return c.Instance().Get() + return c.Instance().get() } func (c *configMap) Delete() error { - return c.Instance().Delete() + return c.Instance().delete() } func (c *configMap) Patch(data map[string]string) error { - return c.Instance().Patch(data) + return c.Instance().patch(data) } func (c *configMap) Update(data map[string]string) error { - return c.Instance().Update(data) + return c.Instance().update(data) } func (c *configMap) Lock(id string) error { diff --git a/k8s/core/configmap/coreconfigmap.go b/k8s/core/configmap/coreconfigmap.go index 928729f2..3ac72149 100644 --- a/k8s/core/configmap/coreconfigmap.go +++ b/k8s/core/configmap/coreconfigmap.go @@ -66,14 +66,40 @@ func New( lockK8sLockTTL: v2LockK8sLockTTL, nameSpace: ns, } + + cm1 := &corev1.ConfigMap{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: pxCopyLockConfigMap, + Namespace: pxNamespace, + }, + Data: map[string]string{ + upgradeCompletedStatus: true, + }, + } + + copyLock := &coreConfigMap{} + _, err := core.Instance().CreateConfigMap(cm1) + + if err != nil && !k8s_errors.IsAlreadyExists(err) { + fmt.Println("Failed to create configmap-copylock") + return nil, fmt.Errorf("failed to create configmap %v: %v", + name, err) + } else { + copyLock.name = pxCopyLockConfigMap + copyLock.kLocksV2 = map[string]*k8sLock{} + copyLock.lockRefreshDuration = v2LockRefreshDuration + copyLock.lockK8sLockTTL = v2LockK8sLockTTL + copyLock.nameSpace = pxNamespace + } + return &configMap{ config: config, pxNs: ns, - copylock: nil, + copylock: copyLock, }, nil } -func (c *coreConfigMap) Get() (map[string]string, error) { +func (c *coreConfigMap) get() (map[string]string, error) { cm, err := core.Instance().GetConfigMap( c.name, c.nameSpace, @@ -85,14 +111,14 @@ func (c *coreConfigMap) Get() (map[string]string, error) { return cm.Data, nil } -func (c *coreConfigMap) Delete() error { +func (c *coreConfigMap) delete() error { return core.Instance().DeleteConfigMap( c.name, c.nameSpace, ) } -func (c *coreConfigMap) Patch(data map[string]string) error { +func (c *coreConfigMap) patch(data map[string]string) error { var ( err error cm *corev1.ConfigMap @@ -123,7 +149,7 @@ func (c *coreConfigMap) Patch(data map[string]string) error { return err } -func (c *coreConfigMap) Update(data map[string]string) error { +func (c *coreConfigMap) update(data map[string]string) error { var ( err error cm *corev1.ConfigMap diff --git a/k8s/core/configmap/types.go b/k8s/core/configmap/types.go index 4722526b..35b42c41 100644 --- a/k8s/core/configmap/types.go +++ b/k8s/core/configmap/types.go @@ -41,9 +41,14 @@ const ( // objects. pxLockKey = "px-lock" - lockSleepDuration = 1 * time.Second - configMapUserLabelKey = "user" - maxConflictRetries = 3 + lockSleepDuration = 1 * time.Second + configMapUserLabelKey = "user" + maxConflictRetries = 3 + upgradeCompletedStatus = "UPGRADE_DONE" + true = "true" + false = "false" + pxNamespace = "portworx" + pxCopyLockConfigMap = "configmaps-copylock" ) var ( diff --git a/k8s/core/configmaps.go b/k8s/core/configmaps.go index dc0b1e86..57bd7432 100644 --- a/k8s/core/configmaps.go +++ b/k8s/core/configmaps.go @@ -2,6 +2,7 @@ package core import ( "context" + "fmt" "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -27,6 +28,7 @@ type ConfigMapOps interface { // GetConfigMap gets the config map object for the given name and namespace func (c *Client) GetConfigMap(name string, namespace string) (*corev1.ConfigMap, error) { + fmt.Println("Searching for configmap ", name, " in ns ", namespace) if err := c.initClient(); err != nil { return nil, err } From dea614e7b6983a7d4e8c96a34c15376acc5794ab Mon Sep 17 00:00:00 2001 From: Divyam Goel Date: Wed, 29 Mar 2023 22:48:39 +0000 Subject: [PATCH 4/8] Add Actionops Signed-off-by: Divyam Goel Signed-off-by: Nikita Bhatia --- k8s/stork/action.go | 64 +++++++++++++++++++++++++++++++++++++++++++++ k8s/stork/stork.go | 1 + 2 files changed, 65 insertions(+) create mode 100644 k8s/stork/action.go diff --git a/k8s/stork/action.go b/k8s/stork/action.go new file mode 100644 index 00000000..93a54500 --- /dev/null +++ b/k8s/stork/action.go @@ -0,0 +1,64 @@ +package stork + +import ( + "context" + + storkv1alpha1 "github.com/libopenstorage/stork/pkg/apis/stork/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ActionOps is an interface to manage Action Object +type ActionOps interface { + // CreateAction creates a Action + CreateAction(*storkv1alpha1.Action) (*storkv1alpha1.Action, error) + // GetAction gets the Action + GetAction(string, string) (*storkv1alpha1.Action, error) + // ListActions lists all the Actions + ListActions(namespace string) (*storkv1alpha1.ActionList, error) + // UpdateAction updates the Action + UpdateAction(*storkv1alpha1.Action) (*storkv1alpha1.Action, error) + // DeleteAction deletes the Action + DeleteAction(string, string) error +} + +// CreateAction creates a Action +func (c *Client) CreateAction(Action *storkv1alpha1.Action) (*storkv1alpha1.Action, error) { + if err := c.initClient(); err != nil { + return nil, err + } + return c.stork.StorkV1alpha1().Actions(Action.Namespace).Create(context.TODO(), Action, metav1.CreateOptions{}) +} + +// GetAction gets the Action +func (c *Client) GetAction(name string, namespace string) (*storkv1alpha1.Action, error) { + if err := c.initClient(); err != nil { + return nil, err + } + return c.stork.StorkV1alpha1().Actions(namespace).Get(context.TODO(), name, metav1.GetOptions{}) +} + +// ListActions lists all the Actions +func (c *Client) ListActions(namespace string) (*storkv1alpha1.ActionList, error) { + if err := c.initClient(); err != nil { + return nil, err + } + return c.stork.StorkV1alpha1().Actions(namespace).List(context.TODO(), metav1.ListOptions{}) +} + +// UpdateAction updates the Action +func (c *Client) UpdateAction(Action *storkv1alpha1.Action) (*storkv1alpha1.Action, error) { + if err := c.initClient(); err != nil { + return nil, err + } + return c.stork.StorkV1alpha1().Actions(Action.Namespace).Update(context.TODO(), Action, metav1.UpdateOptions{}) +} + +// DeleteAction deletes the Action +func (c *Client) DeleteAction(name string, namespace string) error { + if err := c.initClient(); err != nil { + return err + } + return c.stork.StorkV1alpha1().Actions(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{ + PropagationPolicy: &deleteForegroundPolicy, + }) +} diff --git a/k8s/stork/stork.go b/k8s/stork/stork.go index 9accbbdc..78997423 100644 --- a/k8s/stork/stork.go +++ b/k8s/stork/stork.go @@ -37,6 +37,7 @@ type Ops interface { MigrationOps ClusterDomainsOps SchedulePolicyOps + ActionOps NamespacedSchedulePolicyOps BackupLocationOps ApplicationBackupRestoreOps From 59806be17c6e8b061fbeaa61095430ae028af360 Mon Sep 17 00:00:00 2001 From: Divyam Goel Date: Fri, 31 Mar 2023 00:10:39 +0000 Subject: [PATCH 5/8] Update go mod Signed-off-by: Divyam Goel Signed-off-by: Nikita Bhatia --- go.mod | 10 +++++----- go.sum | 28 +++++++++++++++++++--------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index fc4afa76..376982b9 100644 --- a/go.mod +++ b/go.mod @@ -6,18 +6,18 @@ require ( github.com/kubernetes-csi/external-snapshotter/client/v4 v4.0.0 github.com/kubernetes-incubator/external-storage v0.20.4-openstorage-rc7 github.com/libopenstorage/autopilot-api v1.3.0 - github.com/libopenstorage/openstorage v9.4.46+incompatible + github.com/libopenstorage/openstorage v9.4.47+incompatible github.com/libopenstorage/operator v0.0.0-20230323034810-8853b151f594 - github.com/libopenstorage/stork v1.4.1-0.20230207013129-a31284f0e973 + github.com/libopenstorage/stork v1.4.1-0.20230330233319-e17ea1b3fd81 github.com/openshift/api v0.0.0-20210105115604-44119421ec6b github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47 // TODO: Vendor from pb-1874 branch. Need to change it to master. - github.com/portworx/kdmp v0.4.1-0.20230127055521-e23d6b003478 + github.com/portworx/kdmp v0.4.1-0.20230316085313-95fc97e8493b github.com/portworx/talisman v0.0.0-20210302012732-8af4564777f7 github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.63.0 github.com/prometheus-operator/prometheus-operator/pkg/client v0.46.0 github.com/sirupsen/logrus v1.9.0 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 k8s.io/api v0.26.3 k8s.io/apiextensions-apiserver v0.26.1 k8s.io/apimachinery v0.26.3 @@ -93,7 +93,7 @@ require github.com/google/go-cmp v0.5.9 // indirect replace ( github.com/kubernetes-incubator/external-storage => github.com/libopenstorage/external-storage v0.25.1-openstorage-rc1 github.com/libopenstorage/autopilot-api => github.com/libopenstorage/autopilot-api v0.6.1-0.20210301232050-ca2633c6e114 - github.com/libopenstorage/stork => github.com/libopenstorage/stork v1.4.1-0.20230207013129-a31284f0e973 + github.com/libopenstorage/stork => github.com/libopenstorage/stork v1.4.1-0.20230330233319-e17ea1b3fd81 github.com/portworx/torpedo => github.com/portworx/torpedo v0.0.0-20230206190621-4ccdccff9ded helm.sh/helm/v3 => helm.sh/helm/v3 v3.10.3 diff --git a/go.sum b/go.sum index a18ece07..e99cbfde 100644 --- a/go.sum +++ b/go.sum @@ -1753,20 +1753,20 @@ github.com/libopenstorage/openstorage v8.0.1-0.20200730032300-bef55ec5700c+incom github.com/libopenstorage/openstorage v8.0.1-0.20210603043922-faf638fed3e5+incompatible/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/libopenstorage/openstorage v8.0.1-0.20211105030910-665c2f474186+incompatible/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/libopenstorage/openstorage v9.4.20+incompatible/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= -github.com/libopenstorage/openstorage v9.4.46+incompatible h1:9cWx3OMeAM1GxQzzSGEg2cTJL5/2bvg5oHM1kyKS/rU= github.com/libopenstorage/openstorage v9.4.46+incompatible/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= +github.com/libopenstorage/openstorage v9.4.47+incompatible h1:prZeC0YsEfVTO6h08Yh5Ex2/3zgd7kKX2BZpklCV79A= +github.com/libopenstorage/openstorage v9.4.47+incompatible/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/libopenstorage/openstorage-sdk-clients v0.109.0/go.mod h1:vo0c/nLG2HIyQva4Avwx61U1kWcw4HGQh3sjzV2DEEs= github.com/libopenstorage/operator v0.0.0-20200725001727-48d03e197117/go.mod h1:Qh+VXOB6hj60VmlgsmY+R1w+dFuHK246UueM4SAqZG0= github.com/libopenstorage/operator v0.0.0-20210303221358-0bb211a9908c/go.mod h1:+83bY859mKGwHmWW8TPNYGrXAgt/hXOX2Ia7EytK17I= github.com/libopenstorage/operator v0.0.0-20221128182303-7bedcffb60e6/go.mod h1:j+xZSt4DMXB8MDDd72MwpwGlWURIUaKOtoldq+DPHMk= -github.com/libopenstorage/operator v0.0.0-20230112002659-7e73437e61d4/go.mod h1:/sGycOMcavuKLWm3Vd907luRXZA/mcqFs1AdEbbT5k4= github.com/libopenstorage/operator v0.0.0-20230202214252-140e2e1fd86a/go.mod h1:Q66wsNUAekPawgGg9yh0Bs7eXWPa4/+c2JTefdiDciM= github.com/libopenstorage/operator v0.0.0-20230323034810-8853b151f594 h1:pVtnM9o5BlvWSrRphA7qJsV32bXW98cmxhHlA2xrA9E= github.com/libopenstorage/operator v0.0.0-20230323034810-8853b151f594/go.mod h1:0S4k1ouTScuVS3rxPukfEFvc5bMasmI1wpAAM0NejWQ= github.com/libopenstorage/secrets v0.0.0-20210908194121-a1d19aa9713a/go.mod h1:gE8rSd6lwLNXNbiW3DrRZjFMs+y4fDHy/6uiOO9cdzY= github.com/libopenstorage/secrets v0.0.0-20220413195519-57d1c446c5e9/go.mod h1:gE8rSd6lwLNXNbiW3DrRZjFMs+y4fDHy/6uiOO9cdzY= -github.com/libopenstorage/stork v1.4.1-0.20230207013129-a31284f0e973 h1:Je2reUbObyp8tJTN87zfCNOQijfP9Qro3gHOWjAeqFc= -github.com/libopenstorage/stork v1.4.1-0.20230207013129-a31284f0e973/go.mod h1:/EFTTQyBxNzul96urrYPdjNEYeDzVgZzK88gRQjoVmk= +github.com/libopenstorage/stork v1.4.1-0.20230330233319-e17ea1b3fd81 h1:JV58xSaMIZdYeGalZHL1g/DtwD9D0rcnsEDWlbYmeWE= +github.com/libopenstorage/stork v1.4.1-0.20230330233319-e17ea1b3fd81/go.mod h1:9ZIMQaePJPyVsx85zoWn6W+uhjTv/A+7JLoG8j58xgI= github.com/libopenstorage/systemutils v0.0.0-20160208220149-44ac83be3ce1/go.mod h1:xwNGC7xiz/BQ/wbMkvHujL8Gjgseg+x41xMek7sKRRQ= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -2138,8 +2138,9 @@ github.com/portworx/kdmp v0.4.1-0.20210929095959-dbee7f98b06f/go.mod h1:k9yJD2Kv github.com/portworx/kdmp v0.4.1-0.20220309093511-f7b925b9e53e/go.mod h1:RAXbeaO/JmwQPRJCDdOoY/UsmGPY/awWsL4FbDOqAVk= github.com/portworx/kdmp v0.4.1-0.20220710173715-5d42efc7d149/go.mod h1:nb5AupP/63ByyqAYfZ+E32LDEnP0PjgH6w+yKXxWIgE= github.com/portworx/kdmp v0.4.1-0.20220905153748-e0bb69e59f38/go.mod h1:NI2UgLITtggRvvaRA7lE4+Np4htDp+06Jf1LWksKyGA= -github.com/portworx/kdmp v0.4.1-0.20230127055521-e23d6b003478 h1:21yGUB7IJ9tfvQi4pAxX8tEPhb6tYKzXWnu6i1Jdzuo= github.com/portworx/kdmp v0.4.1-0.20230127055521-e23d6b003478/go.mod h1:v8uQbjGe6UFNyrZ+vFKgEu30wsaTc1qg0OYOKmVmUOE= +github.com/portworx/kdmp v0.4.1-0.20230316085313-95fc97e8493b h1:LhSjQpdAOUReRqzy25b9lApPNzWJGWTb7nUoxhz/Yhc= +github.com/portworx/kdmp v0.4.1-0.20230316085313-95fc97e8493b/go.mod h1:VtbY8ASrnXjt+kr5loODtsYV9HwA1DxuQRtt5fRnfh0= github.com/portworx/kvdb v0.0.0-20190105022415-cccaa09abfc9/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= github.com/portworx/kvdb v0.0.0-20200723230726-2734b7f40194/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= github.com/portworx/kvdb v0.0.0-20200929023115-b312c7519467/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= @@ -2158,8 +2159,9 @@ github.com/portworx/sched-ops v1.20.4-rc1.0.20211217234328-ead591c0f22d/go.mod h github.com/portworx/sched-ops v1.20.4-rc1.0.20220401024625-dbc61a336f65/go.mod h1:0IQvado0rnmbRMORaCqCDrrzjBrX5sU+Sz2+vQwEsjM= github.com/portworx/sched-ops v1.20.4-rc1.0.20220927173018-c9d3edcaef50/go.mod h1:LnhSWHaCvwWrmgqgNPFTrm4YModpyDcl9k8RqSC/8Co= github.com/portworx/sched-ops v1.20.4-rc1.0.20221102055014-b3a55a3df5c8/go.mod h1:8XBwmcbDuhW0TWFKCaHH4oS5xsfGFU5miSyqb0fvl3U= -github.com/portworx/sched-ops v1.20.4-rc1.0.20221208153443-c95ed6d757fa/go.mod h1:wQK24M7cbrhAk378J2WwR0nMx86W/iJwRc1JilEmP40= github.com/portworx/sched-ops v1.20.4-rc1.0.20230103234348-243afb3bb8aa/go.mod h1:wQK24M7cbrhAk378J2WwR0nMx86W/iJwRc1JilEmP40= +github.com/portworx/sched-ops v1.20.4-rc1.0.20230207070155-2e0ef25efadd/go.mod h1:JbHASXqA/GXwFD4blS1DZkrxtS5llb98ViZgUerOtQA= +github.com/portworx/sched-ops v1.20.4-rc1.0.20230228105744-505c1a2d8203/go.mod h1:JbHASXqA/GXwFD4blS1DZkrxtS5llb98ViZgUerOtQA= github.com/portworx/talisman v0.0.0-20191007232806-837747f38224/go.mod h1:OjpMH9Uh5o9ntVGktm4FbjLNwubJ3ITih2OfYrAeWtA= github.com/portworx/talisman v0.0.0-20210302012732-8af4564777f7 h1:wAw+iv0bleZEvG48pelZvZ28m8InRUaugfCwOaLHiuE= github.com/portworx/talisman v0.0.0-20210302012732-8af4564777f7/go.mod h1:e8a6uFpSbOlRpZQlW9aXYogC+GWAo065G0RL9hDkD4Q= @@ -2263,10 +2265,12 @@ github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:r github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rancher/apiserver v0.0.0-20221205175736-7c507bd5c076/go.mod h1:xwQhXv3XFxWfA6tLa4ZeaERu8ldNbyKv2sF+mT+c5WA= github.com/rancher/lasso v0.0.0-20221202205459-e7138f16489c/go.mod h1:Qewwr/xGzhtG7WCxhubrKZrdAobv5yqAIuHbDoxThZQ= +github.com/rancher/lasso v0.0.0-20221227210133-6ea88ca2fbcc/go.mod h1:dEfC9eFQigj95lv/JQ8K5e7+qQCacWs1aIA6nLxKzT8= github.com/rancher/norman v0.0.0-20221205184727-32ef2e185b99/go.mod h1:zpv7z4ySYL5LlEBKEPf/xf3cjx837/J2i/wHpT43viE= -github.com/rancher/norman v0.0.0-20230110004459-34230bb2787c/go.mod h1:zpv7z4ySYL5LlEBKEPf/xf3cjx837/J2i/wHpT43viE= +github.com/rancher/norman v0.0.0-20230222213531-275a3e921940/go.mod h1:7MyWxfCmPl6N/UFLu4neLH6nwTFgQQF5rxtUGyZvPFE= github.com/rancher/rancher/pkg/client v0.0.0-20230203155537-a67566517525/go.mod h1:jhDWF7M+cR6Rw65YoTGbiJ+r2Rb6ojAE7I9FE0vxkhc= github.com/rancher/wrangler v1.0.1-0.20221202234327-1cafffeaa9a1/go.mod h1:+GbeNyk8mbdOdMSdLIqvz+0JQ/2PhIb4ufMOcmHLIJQ= +github.com/rancher/wrangler v1.1.0/go.mod h1:lQorqAAIMkNWteece1GiuwZTmMqkaVTXL5qjiiPVDxQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= @@ -2430,8 +2434,9 @@ github.com/stretchr/testify v1.7.2-0.20220317124727-77977386932a/go.mod h1:6Fq8o github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= @@ -2730,6 +2735,7 @@ golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20171107184841-a337091b0525/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2820,6 +2826,7 @@ golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -3049,6 +3056,7 @@ golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -3057,6 +3065,7 @@ golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -3075,6 +3084,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -3225,6 +3235,7 @@ golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4 golang.org/x/tools v0.1.12-0.20220628192153-7743d1d949f1/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -3651,7 +3662,6 @@ k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= From 8a2b586860c3c396d978219f48f7fa716ddeb385 Mon Sep 17 00:00:00 2001 From: Divyam Goel Date: Wed, 26 Apr 2023 22:13:01 +0000 Subject: [PATCH 6/8] Update action var public -> private Signed-off-by: Divyam Goel Signed-off-by: Nikita Bhatia --- k8s/stork/action.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/stork/action.go b/k8s/stork/action.go index 93a54500..f80a359c 100644 --- a/k8s/stork/action.go +++ b/k8s/stork/action.go @@ -22,11 +22,11 @@ type ActionOps interface { } // CreateAction creates a Action -func (c *Client) CreateAction(Action *storkv1alpha1.Action) (*storkv1alpha1.Action, error) { +func (c *Client) CreateAction(action *storkv1alpha1.Action) (*storkv1alpha1.Action, error) { if err := c.initClient(); err != nil { return nil, err } - return c.stork.StorkV1alpha1().Actions(Action.Namespace).Create(context.TODO(), Action, metav1.CreateOptions{}) + return c.stork.StorkV1alpha1().Actions(action.Namespace).Create(context.TODO(), action, metav1.CreateOptions{}) } // GetAction gets the Action @@ -46,11 +46,11 @@ func (c *Client) ListActions(namespace string) (*storkv1alpha1.ActionList, error } // UpdateAction updates the Action -func (c *Client) UpdateAction(Action *storkv1alpha1.Action) (*storkv1alpha1.Action, error) { +func (c *Client) UpdateAction(action *storkv1alpha1.Action) (*storkv1alpha1.Action, error) { if err := c.initClient(); err != nil { return nil, err } - return c.stork.StorkV1alpha1().Actions(Action.Namespace).Update(context.TODO(), Action, metav1.UpdateOptions{}) + return c.stork.StorkV1alpha1().Actions(action.Namespace).Update(context.TODO(), action, metav1.UpdateOptions{}) } // DeleteAction deletes the Action From 8578af876c3296b54120c3fec8fa5d972d95e38c Mon Sep 17 00:00:00 2001 From: Nikita Bhatia Date: Mon, 1 May 2023 22:44:22 +0530 Subject: [PATCH 7/8] Fix failing test Signed-off-by: Nikita Bhatia --- k8s/core/configmap/configmap.go | 77 +++++++++++++++-------------- k8s/core/configmap/coreconfigmap.go | 14 +++--- k8s/core/configmap/types.go | 4 +- 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/k8s/core/configmap/configmap.go b/k8s/core/configmap/configmap.go index 965587d5..4747b94b 100644 --- a/k8s/core/configmap/configmap.go +++ b/k8s/core/configmap/configmap.go @@ -12,51 +12,52 @@ func (c *configMap) Instance() *coreConfigMap { if c.pxNs == c.config.nameSpace { //fresh install ot upgrade completed return c.config - } else { - existingConfig := c.config - c.copylock.Lock(uuid.New().String()) - defer c.copylock.Unlock() + } + + existingConfig := c.config + c.copylock.Lock(uuid.New().String()) + defer c.copylock.Unlock() + + lockMap, err := c.copylock.get() + if err != nil { + log.Errorf("Error during fetching data from copy lock %s", err) + return existingConfig + } + status := lockMap[upgradeCompletedStatus] + if status == trueString { + // upgrade is completed + //create configmap in portworx namespace + newConfig := &coreConfigMap{ + name: existingConfig.name, + defaultLockHoldTimeout: existingConfig.defaultLockHoldTimeout, + kLocksV2: existingConfig.kLocksV2, + lockAttempts: existingConfig.lockAttempts, + lockRefreshDuration: existingConfig.lockRefreshDuration, + lockK8sLockTTL: existingConfig.lockK8sLockTTL, + nameSpace: pxNamespace, + } - lockMap, err := c.copylock.get() + configData, err := existingConfig.get() if err != nil { - log.Errorf("Error during fetching data from copy lock %s", err) + log.Errorf("Error during fetching data from old config map %s", err) return existingConfig } - status := lockMap[upgradeCompletedStatus] - if status == true { - // upgrade is completed - //create configmap in portworx namespace - newConfig := &coreConfigMap{ - name: existingConfig.name, - defaultLockHoldTimeout: existingConfig.defaultLockHoldTimeout, - kLocksV2: existingConfig.kLocksV2, - lockAttempts: existingConfig.lockAttempts, - lockRefreshDuration: existingConfig.lockRefreshDuration, - lockK8sLockTTL: existingConfig.lockK8sLockTTL, - nameSpace: pxNamespace, - } - - configData, err := existingConfig.get() - if err != nil { - log.Errorf("Error during fetching data from old config map %s", err) - return existingConfig - } - //copy data from old configmap to new configmap - if err = newConfig.update(configData); err != nil { - log.Errorf("Error during copying data from old config map %s", err) - return existingConfig - } - - //delete old configmap - err = c.config.delete() - if err != nil { - log.Errorf("Error during deleting configmap %s in namespace %s ", c.config.name, c.config.nameSpace) - } - c.config = newConfig - } else { + //copy data from old configmap to new configmap + if err = newConfig.update(configData); err != nil { + log.Errorf("Error during copying data from old config map %s", err) return existingConfig } + + //delete old configmap + err = c.config.delete() + if err != nil { + log.Errorf("Error during deleting configmap %s in namespace %s ", c.config.name, c.config.nameSpace) + } + c.config = newConfig + } else { + return existingConfig } + return c.config } diff --git a/k8s/core/configmap/coreconfigmap.go b/k8s/core/configmap/coreconfigmap.go index 3ac72149..a23ee563 100644 --- a/k8s/core/configmap/coreconfigmap.go +++ b/k8s/core/configmap/coreconfigmap.go @@ -73,7 +73,7 @@ func New( Namespace: pxNamespace, }, Data: map[string]string{ - upgradeCompletedStatus: true, + upgradeCompletedStatus: trueString, }, } @@ -84,14 +84,14 @@ func New( fmt.Println("Failed to create configmap-copylock") return nil, fmt.Errorf("failed to create configmap %v: %v", name, err) - } else { - copyLock.name = pxCopyLockConfigMap - copyLock.kLocksV2 = map[string]*k8sLock{} - copyLock.lockRefreshDuration = v2LockRefreshDuration - copyLock.lockK8sLockTTL = v2LockK8sLockTTL - copyLock.nameSpace = pxNamespace } + copyLock.name = pxCopyLockConfigMap + copyLock.kLocksV2 = map[string]*k8sLock{} + copyLock.lockRefreshDuration = v2LockRefreshDuration + copyLock.lockK8sLockTTL = v2LockK8sLockTTL + copyLock.nameSpace = pxNamespace + return &configMap{ config: config, pxNs: ns, diff --git a/k8s/core/configmap/types.go b/k8s/core/configmap/types.go index 35b42c41..a74210bc 100644 --- a/k8s/core/configmap/types.go +++ b/k8s/core/configmap/types.go @@ -45,8 +45,8 @@ const ( configMapUserLabelKey = "user" maxConflictRetries = 3 upgradeCompletedStatus = "UPGRADE_DONE" - true = "true" - false = "false" + trueString = "true" + falseString = "false" pxNamespace = "portworx" pxCopyLockConfigMap = "configmaps-copylock" ) From 82ab49e14525b5d422512a4947086430da9d1891 Mon Sep 17 00:00:00 2001 From: Nikita Bhatia Date: Mon, 1 May 2023 22:47:31 +0530 Subject: [PATCH 8/8] remove debug log Signed-off-by: Nikita Bhatia --- k8s/core/configmaps.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/k8s/core/configmaps.go b/k8s/core/configmaps.go index 57bd7432..dc0b1e86 100644 --- a/k8s/core/configmaps.go +++ b/k8s/core/configmaps.go @@ -2,7 +2,6 @@ package core import ( "context" - "fmt" "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -28,7 +27,6 @@ type ConfigMapOps interface { // GetConfigMap gets the config map object for the given name and namespace func (c *Client) GetConfigMap(name string, namespace string) (*corev1.ConfigMap, error) { - fmt.Println("Searching for configmap ", name, " in ns ", namespace) if err := c.initClient(); err != nil { return nil, err }