Add more tests for secrets verity/apply logic
This commit is contained in:
		
							parent
							
								
									31725a6f4d
								
							
						
					
					
						commit
						a31c69e5dc
					
				|  | @ -98,7 +98,8 @@ func (action UpdateSecret) Apply() error { | ||||||
| 
 | 
 | ||||||
| 	if updateSecret { | 	if updateSecret { | ||||||
| 		msg := "Updating the secret %q from the infrastructure roles" | 		msg := "Updating the secret %q from the infrastructure roles" | ||||||
| 		cluster.logger.Debugf(msg, action.secret.Name) | 		name := util.NameFromMeta(action.secret.ObjectMeta) | ||||||
|  | 		cluster.logger.Debugf(msg, name) | ||||||
| 
 | 
 | ||||||
| 		_, err := cluster.KubeClient. | 		_, err := cluster.KubeClient. | ||||||
| 			Secrets(action.secret.Namespace). | 			Secrets(action.secret.Namespace). | ||||||
|  |  | ||||||
|  | @ -0,0 +1,118 @@ | ||||||
|  | package cluster | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"k8s.io/api/core/v1" | ||||||
|  | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	v1core "k8s.io/client-go/kubernetes/typed/core/v1" | ||||||
|  | 
 | ||||||
|  | 	"github.com/zalando-incubator/postgres-operator/pkg/spec" | ||||||
|  | 	"github.com/zalando-incubator/postgres-operator/pkg/util/k8sutil" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var updateCalled = 0 | ||||||
|  | 
 | ||||||
|  | type mockSecretGetter struct{} | ||||||
|  | 
 | ||||||
|  | type testSecret struct { | ||||||
|  | 	v1core.SecretInterface | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *testSecret) Update(secret *v1.Secret) (*v1.Secret, error) { | ||||||
|  | 	updateCalled += 1 | ||||||
|  | 	return secret, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *mockSecretGetter) Secrets(namespace string) v1core.SecretInterface { | ||||||
|  | 	return &testSecret{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func getMockK8sClient() k8sutil.KubernetesClient { | ||||||
|  | 	return k8sutil.KubernetesClient{ | ||||||
|  | 		SecretsGetter: &mockSecretGetter{}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func generateMockCluster(origin spec.RoleOrigin) *Cluster { | ||||||
|  | 	cluster := Cluster{ | ||||||
|  | 		KubeClient: getMockK8sClient(), | ||||||
|  | 		pgUsers: map[string]spec.PgUser{ | ||||||
|  | 			"testuser": { | ||||||
|  | 				Password: "123456", | ||||||
|  | 				Origin:   origin, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cluster.logger = logger. | ||||||
|  | 		WithField("pkg", "cluster"). | ||||||
|  | 		WithField("cluster-name", cluster.clusterName()) | ||||||
|  | 
 | ||||||
|  | 	return &cluster | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestSecretValidation(t *testing.T) { | ||||||
|  | 	secret := v1.Secret{Data: make(map[string][]byte)} | ||||||
|  | 
 | ||||||
|  | 	tests := []struct { | ||||||
|  | 		name     string | ||||||
|  | 		action   Action | ||||||
|  | 		checkErr func(error) bool | ||||||
|  | 		errMsg   string | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Username for secret to update cannot be empty", | ||||||
|  | 			NewUpdateSecret("", &secret, nil), | ||||||
|  | 			func(err error) bool { return err == nil }, | ||||||
|  | 			"Empty username did not cause an error, expected %v, given %v", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, tt := range tests { | ||||||
|  | 		result := tt.action.Validate() | ||||||
|  | 		if tt.checkErr(result) { | ||||||
|  | 			t.Errorf("%s: %v", tt.name, tt.errMsg) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestSecretApply(t *testing.T) { | ||||||
|  | 	tests := []struct { | ||||||
|  | 		name     string | ||||||
|  | 		action   Action | ||||||
|  | 		checkErr func(error) bool | ||||||
|  | 		errMsg   string | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Secret has been replaced with UpdateSecret for infrastructure role", | ||||||
|  | 			NewUpdateSecret("testuser", &v1.Secret{ | ||||||
|  | 				ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 					Name: "testsecret", | ||||||
|  | 				}, | ||||||
|  | 				Data: make(map[string][]byte), | ||||||
|  | 			}, generateMockCluster(spec.RoleOriginInfrastructure)), | ||||||
|  | 			func(err error) bool { return err != nil || updateCalled != 1 }, | ||||||
|  | 			"Update K8S client method was never called", | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Secret has been synced with UpdateSecret for non infrastructure role", | ||||||
|  | 			NewUpdateSecret("testuser", &v1.Secret{ | ||||||
|  | 				ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 					Name: "testsecret", | ||||||
|  | 				}, | ||||||
|  | 				Data: make(map[string][]byte), | ||||||
|  | 			}, generateMockCluster(spec.RoleOriginSystem)), | ||||||
|  | 			func(err error) bool { return err != nil || updateCalled != 0 }, | ||||||
|  | 			"Update K8S client method was called, but should not be", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, tt := range tests { | ||||||
|  | 		result := tt.action.Apply() | ||||||
|  | 		if tt.checkErr(result) { | ||||||
|  | 			t.Errorf("%s: %v", tt.name, tt.errMsg) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// reset counters
 | ||||||
|  | 		updateCalled = 0 | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue