Merge branch 'master' into sketch-e2e-tests
This commit is contained in:
commit
ba52542eac
|
|
@ -1004,8 +1004,8 @@ func (c *Cluster) deletePatroniClusterObjects() error {
|
||||||
if !c.patroniUsesKubernetes() {
|
if !c.patroniUsesKubernetes() {
|
||||||
c.logger.Infof("not cleaning up Etcd Patroni objects on cluster delete")
|
c.logger.Infof("not cleaning up Etcd Patroni objects on cluster delete")
|
||||||
}
|
}
|
||||||
c.logger.Debugf("removing leftover Patroni objects (endpoints or configmaps)")
|
c.logger.Debugf("removing leftover Patroni objects (endpoints, services and configmaps)")
|
||||||
for _, deleter := range []simpleActionWithResult{c.deletePatroniClusterEndpoints, c.deletePatroniClusterConfigMaps} {
|
for _, deleter := range []simpleActionWithResult{c.deletePatroniClusterEndpoints, c.deletePatroniClusterServices, c.deletePatroniClusterConfigMaps} {
|
||||||
if err := deleter(); err != nil {
|
if err := deleter(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1037,6 +1037,19 @@ func (c *Cluster) deleteClusterObject(
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Cluster) deletePatroniClusterServices() error {
|
||||||
|
get := func(name string) (spec.NamespacedName, error) {
|
||||||
|
svc, err := c.KubeClient.Services(c.Namespace).Get(name, metav1.GetOptions{})
|
||||||
|
return util.NameFromMeta(svc.ObjectMeta), err
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteServiceFn := func(name string) error {
|
||||||
|
return c.KubeClient.Services(c.Namespace).Delete(name, c.deleteOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.deleteClusterObject(get, deleteServiceFn, "service")
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Cluster) deletePatroniClusterEndpoints() error {
|
func (c *Cluster) deletePatroniClusterEndpoints() error {
|
||||||
get := func(name string) (spec.NamespacedName, error) {
|
get := func(name string) (spec.NamespacedName, error) {
|
||||||
ep, err := c.KubeClient.Endpoints(c.Namespace).Get(name, metav1.GetOptions{})
|
ep, err := c.KubeClient.Endpoints(c.Namespace).Get(name, metav1.GetOptions{})
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ func fillResourceList(spec acidv1.ResourceDescription, defaults acidv1.ResourceD
|
||||||
return requests, nil
|
return requests, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateSpiloJSONConfiguration(pg *acidv1.PostgresqlParam, patroni *acidv1.Patroni, pamRoleName string, logger *logrus.Entry) string {
|
func generateSpiloJSONConfiguration(pg *acidv1.PostgresqlParam, patroni *acidv1.Patroni, pamRoleName string, logger *logrus.Entry) (string, error) {
|
||||||
config := spiloConfiguration{}
|
config := spiloConfiguration{}
|
||||||
|
|
||||||
config.Bootstrap = pgBootstrap{}
|
config.Bootstrap = pgBootstrap{}
|
||||||
|
|
@ -249,12 +249,9 @@ PatroniInitDBParams:
|
||||||
Options: []string{constants.RoleFlagCreateDB, constants.RoleFlagNoLogin},
|
Options: []string{constants.RoleFlagCreateDB, constants.RoleFlagNoLogin},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
result, err := json.Marshal(config)
|
|
||||||
if err != nil {
|
res, err := json.Marshal(config)
|
||||||
logger.Errorf("cannot convert spilo configuration into JSON: %v", err)
|
return string(res), err
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return string(result)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLocalAndBoostrapPostgreSQLParameters(parameters map[string]string) (local, bootstrap map[string]string) {
|
func getLocalAndBoostrapPostgreSQLParameters(parameters map[string]string) (local, bootstrap map[string]string) {
|
||||||
|
|
@ -780,7 +777,10 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*v1beta1.State
|
||||||
func(i, j int) bool { return customPodEnvVarsList[i].Name < customPodEnvVarsList[j].Name })
|
func(i, j int) bool { return customPodEnvVarsList[i].Name < customPodEnvVarsList[j].Name })
|
||||||
}
|
}
|
||||||
|
|
||||||
spiloConfiguration := generateSpiloJSONConfiguration(&spec.PostgresqlParam, &spec.Patroni, c.OpConfig.PamRoleName, c.logger)
|
spiloConfiguration, err := generateSpiloJSONConfiguration(&spec.PostgresqlParam, &spec.Patroni, c.OpConfig.PamRoleName, c.logger)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not generate Spilo JSON configuration: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// generate environment variables for the spilo container
|
// generate environment variables for the spilo container
|
||||||
spiloEnvVars := deduplicateEnvVars(
|
spiloEnvVars := deduplicateEnvVars(
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,12 @@ package cluster
|
||||||
import (
|
import (
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
|
||||||
acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
|
acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
|
||||||
"github.com/zalando/postgres-operator/pkg/util/config"
|
"github.com/zalando/postgres-operator/pkg/util/config"
|
||||||
"github.com/zalando/postgres-operator/pkg/util/constants"
|
"github.com/zalando/postgres-operator/pkg/util/constants"
|
||||||
"github.com/zalando/postgres-operator/pkg/util/k8sutil"
|
"github.com/zalando/postgres-operator/pkg/util/k8sutil"
|
||||||
"testing"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func True() *bool {
|
func True() *bool {
|
||||||
|
|
@ -20,6 +21,69 @@ func False() *bool {
|
||||||
return &b
|
return &b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGenerateSpiloJSONConfiguration(t *testing.T) {
|
||||||
|
var cluster = New(
|
||||||
|
Config{
|
||||||
|
OpConfig: config.Config{
|
||||||
|
ProtectedRoles: []string{"admin"},
|
||||||
|
Auth: config.Auth{
|
||||||
|
SuperUsername: superUserName,
|
||||||
|
ReplicationUsername: replicationUserName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, k8sutil.KubernetesClient{}, acidv1.Postgresql{}, logger)
|
||||||
|
|
||||||
|
testName := "TestGenerateSpiloConfig"
|
||||||
|
tests := []struct {
|
||||||
|
subtest string
|
||||||
|
pgParam *acidv1.PostgresqlParam
|
||||||
|
patroni *acidv1.Patroni
|
||||||
|
role string
|
||||||
|
opConfig config.Config
|
||||||
|
result string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
subtest: "Patroni default configuration",
|
||||||
|
pgParam: &acidv1.PostgresqlParam{PgVersion: "9.6"},
|
||||||
|
patroni: &acidv1.Patroni{},
|
||||||
|
role: "zalandos",
|
||||||
|
opConfig: config.Config{},
|
||||||
|
result: `{"postgresql":{"bin_dir":"/usr/lib/postgresql/9.6/bin"},"bootstrap":{"initdb":[{"auth-host":"md5"},{"auth-local":"trust"}],"users":{"zalandos":{"password":"","options":["CREATEDB","NOLOGIN"]}},"dcs":{}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
subtest: "Patroni configured",
|
||||||
|
pgParam: &acidv1.PostgresqlParam{PgVersion: "11"},
|
||||||
|
patroni: &acidv1.Patroni{
|
||||||
|
InitDB: map[string]string{
|
||||||
|
"encoding": "UTF8",
|
||||||
|
"locale": "en_US.UTF-8",
|
||||||
|
"data-checksums": "true",
|
||||||
|
},
|
||||||
|
PgHba: []string{"hostssl all all 0.0.0.0/0 md5", "host all all 0.0.0.0/0 md5"},
|
||||||
|
TTL: 30,
|
||||||
|
LoopWait: 10,
|
||||||
|
RetryTimeout: 10,
|
||||||
|
MaximumLagOnFailover: 33554432,
|
||||||
|
Slots: map[string]map[string]string{"permanent_logical_1": {"type": "logical", "database": "foo", "plugin": "pgoutput"}},
|
||||||
|
},
|
||||||
|
role: "zalandos",
|
||||||
|
opConfig: config.Config{},
|
||||||
|
result: `{"postgresql":{"bin_dir":"/usr/lib/postgresql/11/bin","pg_hba":["hostssl all all 0.0.0.0/0 md5","host all all 0.0.0.0/0 md5"]},"bootstrap":{"initdb":[{"auth-host":"md5"},{"auth-local":"trust"},"data-checksums",{"encoding":"UTF8"},{"locale":"en_US.UTF-8"}],"users":{"zalandos":{"password":"","options":["CREATEDB","NOLOGIN"]}},"dcs":{"ttl":30,"loop_wait":10,"retry_timeout":10,"maximum_lag_on_failover":33554432,"slots":{"permanent_logical_1":{"database":"foo","plugin":"pgoutput","type":"logical"}}}}}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
cluster.OpConfig = tt.opConfig
|
||||||
|
result, err := generateSpiloJSONConfiguration(tt.pgParam, tt.patroni, tt.role, logger)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if tt.result != result {
|
||||||
|
t.Errorf("%s %s: Spilo Config is %v, expected %v for role %#v and param %#v",
|
||||||
|
testName, tt.subtest, result, tt.result, tt.role, tt.pgParam)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateLoadBalancerLogic(t *testing.T) {
|
func TestCreateLoadBalancerLogic(t *testing.T) {
|
||||||
var cluster = New(
|
var cluster = New(
|
||||||
Config{
|
Config{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue