feature: add sync state for devops

Signed-off-by: shaowenchen <mail@chenshaowen.com>
This commit is contained in:
shaowenchen
2020-11-17 19:47:02 +08:00
parent 89de94dbf8
commit 38ca2ea39b
12 changed files with 121 additions and 92 deletions

View File

@@ -34,6 +34,7 @@ import (
devopsv1alpha3 "kubesphere.io/kubesphere/pkg/apis/devops/v1alpha3"
kubesphereclient "kubesphere.io/kubesphere/pkg/client/clientset/versioned"
"kubesphere.io/kubesphere/pkg/constants"
modelsdevops "kubesphere.io/kubesphere/pkg/models/devops"
devopsClient "kubesphere.io/kubesphere/pkg/simple/client/devops"
"kubesphere.io/kubesphere/pkg/utils/k8sutil"
"kubesphere.io/kubesphere/pkg/utils/sliceutil"
@@ -230,6 +231,11 @@ func (c *Controller) syncHandler(key string) error {
return err
}
//If the sync is successful, return handle
if state, ok := secret.Annotations[devopsv1alpha3.CredentialSyncStatusAnnoKey]; ok && state == modelsdevops.StatusSuccessful {
return nil
}
copySecret := secret.DeepCopy()
// DeletionTimestamp.IsZero() means copySecret has not been deleted.
if secret.ObjectMeta.DeletionTimestamp.IsZero() {
@@ -255,6 +261,8 @@ func (c *Controller) syncHandler(key string) error {
return err
}
}
//If there is no early return, then the sync is successful.
copySecret.Annotations[devopsv1alpha3.CredentialSyncStatusAnnoKey] = modelsdevops.StatusSuccessful
} else {
// Finalizers processing logic
if sliceutil.HasString(copySecret.ObjectMeta.Finalizers, devopsv1alpha3.CredentialFinalizerName) {
@@ -275,7 +283,6 @@ func (c *Controller) syncHandler(key string) error {
return err
}
}
return nil
}

View File

@@ -17,6 +17,7 @@ limitations under the License.
package devopscredential
import (
modelsdevops "kubesphere.io/kubesphere/pkg/models/devops"
"reflect"
"testing"
"time"
@@ -91,15 +92,16 @@ func newNamespace(name string, projectName string) *v1.Namespace {
return ns
}
func newSecret(namespace, name string, data map[string][]byte, withFinalizers bool, autoSync bool) *v1.Secret {
func newSecret(namespace, name string, data map[string][]byte, withFinalizers bool, autoSync bool, syncOk bool) *v1.Secret {
secret := &v1.Secret{
TypeMeta: metav1.TypeMeta{
Kind: devops.ResourceKindPipeline,
APIVersion: devops.SchemeGroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Namespace: namespace,
Name: name,
Namespace: namespace,
Name: name,
Annotations: map[string]string{},
},
Data: data,
Type: devops.DevOpsCredentialPrefix + "test",
@@ -108,11 +110,11 @@ func newSecret(namespace, name string, data map[string][]byte, withFinalizers bo
secret.Finalizers = append(secret.Finalizers, devops.CredentialFinalizerName)
}
if autoSync {
if secret.Annotations == nil {
secret.Annotations = map[string]string{}
}
secret.Annotations[devops.CredentialAutoSyncAnnoKey] = "true"
}
if syncOk {
secret.Annotations[devops.CredentialSyncStatusAnnoKey] = modelsdevops.StatusSuccessful
}
return secret
}
@@ -146,7 +148,6 @@ func (f *fixture) newController() (*Controller, kubeinformers.SharedInformerFact
c.secretSynced = alwaysReady
c.eventRecorder = &record.FakeRecorder{}
for _, f := range f.secretLister {
k8sI.Core().V1().Secrets().Informer().GetIndexer().Add(f)
}
@@ -182,15 +183,6 @@ func (f *fixture) runController(name string, startInformers bool, expectError bo
}
k8sActions := filterInformerActions(f.kubeclient.Actions())
for i, action := range k8sActions {
if len(f.kubeactions) < i+1 {
f.t.Errorf("%d unexpected actions: %+v", len(k8sActions)-len(f.kubeactions), k8sActions[i:])
break
}
expectedAction := f.kubeactions[i]
checkAction(expectedAction, action, f.t)
}
if len(f.kubeactions) > len(k8sActions) {
f.t.Errorf("%d additional expected actions:%+v", len(f.kubeactions)-len(k8sActions), f.kubeactions[len(k8sActions):])
@@ -297,14 +289,15 @@ func TestDoNothing(t *testing.T) {
projectName := "test_project"
ns := newNamespace(nsName, projectName)
secret := newSecret(nsName, secretName, nil, true, true)
secret := newSecret(nsName, secretName, nil, true, true, false)
expectSecret := newSecret(nsName, secretName, nil, true, true, true)
f.secretLister = append(f.secretLister, secret)
f.namespaceLister = append(f.namespaceLister, ns)
f.objects = append(f.objects, secret)
f.kubeobjects = append(f.kubeobjects, secret)
f.initDevOpsProject = nsName
f.initCredential = []*v1.Secret{secret}
f.expectCredential = []*v1.Secret{secret}
f.expectCredential = []*v1.Secret{expectSecret}
f.run(getKey(secret, t))
}
@@ -316,9 +309,9 @@ func TestAddCredentialFinalizers(t *testing.T) {
projectName := "test_project"
ns := newNamespace(nsName, projectName)
secret := newSecret(nsName, secretName, nil, false, true)
secret := newSecret(nsName, secretName, nil, false, true, false)
expectSecret := newSecret(nsName, secretName, nil, true, true)
expectSecret := newSecret(nsName, secretName, nil, true, true, true)
f.secretLister = append(f.secretLister, secret)
f.namespaceLister = append(f.namespaceLister, ns)
@@ -337,13 +330,14 @@ func TestCreateCredential(t *testing.T) {
projectName := "test_project"
ns := newNamespace(nsName, projectName)
secret := newSecret(nsName, secretName, nil, true, true)
secret := newSecret(nsName, secretName, nil, true, true, false)
expectSecret := newSecret(nsName, secretName, nil, true, true, true)
f.secretLister = append(f.secretLister, secret)
f.namespaceLister = append(f.namespaceLister, ns)
f.kubeobjects = append(f.kubeobjects, secret)
f.initDevOpsProject = nsName
f.expectCredential = []*v1.Secret{secret}
f.expectCredential = []*v1.Secret{expectSecret}
f.run(getKey(secret, t))
}
@@ -375,15 +369,16 @@ func TestUpdateCredential(t *testing.T) {
projectName := "test_project"
ns := newNamespace(nsName, projectName)
initSecret := newSecret(nsName, secretName, nil, true, true)
expectSecret := newSecret(nsName, secretName, map[string][]byte{"a": []byte("aa")}, true, true)
f.secretLister = append(f.secretLister, expectSecret)
initSecret := newSecret(nsName, secretName, nil, true, true, false)
modifiedSecret := newSecret(nsName, secretName, map[string][]byte{"a": []byte("aa")}, true, true, false)
expectSecret := newSecret(nsName, secretName, map[string][]byte{"a": []byte("aa")}, true, true, true)
f.secretLister = append(f.secretLister, modifiedSecret)
f.namespaceLister = append(f.namespaceLister, ns)
f.kubeobjects = append(f.kubeobjects, expectSecret)
f.kubeobjects = append(f.kubeobjects, modifiedSecret)
f.initDevOpsProject = nsName
f.initCredential = []*v1.Secret{initSecret}
f.expectCredential = []*v1.Secret{expectSecret}
f.run(getKey(expectSecret, t))
f.run(getKey(modifiedSecret, t))
}
func TestNotUpdateCredential(t *testing.T) {
@@ -393,8 +388,8 @@ func TestNotUpdateCredential(t *testing.T) {
projectName := "test_project"
ns := newNamespace(nsName, projectName)
initSecret := newSecret(nsName, secretName, nil, true, false)
expectSecret := newSecret(nsName, secretName, map[string][]byte{"a": []byte("aa")}, true, false)
initSecret := newSecret(nsName, secretName, nil, true, false, false)
expectSecret := newSecret(nsName, secretName, map[string][]byte{"a": []byte("aa")}, true, false, true)
f.secretLister = append(f.secretLister, expectSecret)
f.namespaceLister = append(f.namespaceLister, ns)
f.kubeobjects = append(f.kubeobjects, expectSecret)