119 lines
2.7 KiB
Go
119 lines
2.7 KiB
Go
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
|
|
}
|
|
}
|