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 { | ||||
| 		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. | ||||
| 			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