Don't create an impossible disruption budget for smaller clusters.
This commit is contained in:
		
							parent
							
								
									0b75a89920
								
							
						
					
					
						commit
						9f58185a6a
					
				| 
						 | 
					@ -1052,6 +1052,11 @@ func (c *Cluster) generateCloneEnvironment(description *acidv1.CloneDescription)
 | 
				
			||||||
func (c *Cluster) generatePodDisruptionBudget() *policybeta1.PodDisruptionBudget {
 | 
					func (c *Cluster) generatePodDisruptionBudget() *policybeta1.PodDisruptionBudget {
 | 
				
			||||||
	minAvailable := intstr.FromInt(1)
 | 
						minAvailable := intstr.FromInt(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Avoid creating an unsatisfyable budget.
 | 
				
			||||||
 | 
						if c.Spec.NumberOfInstances <= 1 {
 | 
				
			||||||
 | 
							minAvailable = intstr.FromInt(0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &policybeta1.PodDisruptionBudget{
 | 
						return &policybeta1.PodDisruptionBudget{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name:      c.podDisruptionBudgetName(),
 | 
								Name:      c.podDisruptionBudgetName(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,12 @@ import (
 | 
				
			||||||
	acidv1 "github.com/zalando-incubator/postgres-operator/pkg/apis/acid.zalan.do/v1"
 | 
						acidv1 "github.com/zalando-incubator/postgres-operator/pkg/apis/acid.zalan.do/v1"
 | 
				
			||||||
	"github.com/zalando-incubator/postgres-operator/pkg/util/config"
 | 
						"github.com/zalando-incubator/postgres-operator/pkg/util/config"
 | 
				
			||||||
	"github.com/zalando-incubator/postgres-operator/pkg/util/k8sutil"
 | 
						"github.com/zalando-incubator/postgres-operator/pkg/util/k8sutil"
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						policyv1beta1 "k8s.io/api/policy/v1beta1"
 | 
				
			||||||
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
						"k8s.io/apimachinery/pkg/util/intstr"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func True() *bool {
 | 
					func True() *bool {
 | 
				
			||||||
| 
						 | 
					@ -17,6 +22,11 @@ func False() *bool {
 | 
				
			||||||
	return &b
 | 
						return &b
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func toIntStr(val int) *intstr.IntOrString {
 | 
				
			||||||
 | 
						b := intstr.FromInt(val)
 | 
				
			||||||
 | 
						return &b
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestCreateLoadBalancerLogic(t *testing.T) {
 | 
					func TestCreateLoadBalancerLogic(t *testing.T) {
 | 
				
			||||||
	var cluster = New(
 | 
						var cluster = New(
 | 
				
			||||||
		Config{
 | 
							Config{
 | 
				
			||||||
| 
						 | 
					@ -75,3 +85,87 @@ func TestCreateLoadBalancerLogic(t *testing.T) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGeneratePodDisruptionBudget(t *testing.T) {
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							c   *Cluster
 | 
				
			||||||
 | 
							out policyv1beta1.PodDisruptionBudget
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							// With multiple instances.
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								New(
 | 
				
			||||||
 | 
									Config{OpConfig: config.Config{Resources: config.Resources{ClusterNameLabel: "cluster-name", PodRoleLabel: "spilo-role"}, PDBNameFormat: "postgres-{cluster}-pdb"}},
 | 
				
			||||||
 | 
									k8sutil.KubernetesClient{},
 | 
				
			||||||
 | 
									acidv1.Postgresql{
 | 
				
			||||||
 | 
										ObjectMeta: metav1.ObjectMeta{Name: "myapp-database", Namespace: "myapp"},
 | 
				
			||||||
 | 
										Spec:       acidv1.PostgresSpec{TeamID: "myapp", NumberOfInstances: 3}},
 | 
				
			||||||
 | 
									logger),
 | 
				
			||||||
 | 
								policyv1beta1.PodDisruptionBudget{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
										Name:      "postgres-myapp-database-pdb",
 | 
				
			||||||
 | 
										Namespace: "myapp",
 | 
				
			||||||
 | 
										Labels:    map[string]string{"team": "myapp", "cluster-name": "myapp-database"},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: policyv1beta1.PodDisruptionBudgetSpec{
 | 
				
			||||||
 | 
										MinAvailable: toIntStr(1),
 | 
				
			||||||
 | 
										Selector: &metav1.LabelSelector{
 | 
				
			||||||
 | 
											MatchLabels: map[string]string{"spilo-role": "master", "cluster-name": "myapp-database"},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							// With a single instance.
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								New(
 | 
				
			||||||
 | 
									Config{OpConfig: config.Config{Resources: config.Resources{ClusterNameLabel: "cluster-name", PodRoleLabel: "spilo-role"}, PDBNameFormat: "postgres-{cluster}-pdb"}},
 | 
				
			||||||
 | 
									k8sutil.KubernetesClient{},
 | 
				
			||||||
 | 
									acidv1.Postgresql{
 | 
				
			||||||
 | 
										ObjectMeta: metav1.ObjectMeta{Name: "myapp-database", Namespace: "myapp"},
 | 
				
			||||||
 | 
										Spec:       acidv1.PostgresSpec{TeamID: "myapp", NumberOfInstances: 1}},
 | 
				
			||||||
 | 
									logger),
 | 
				
			||||||
 | 
								policyv1beta1.PodDisruptionBudget{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
										Name:      "postgres-myapp-database-pdb",
 | 
				
			||||||
 | 
										Namespace: "myapp",
 | 
				
			||||||
 | 
										Labels:    map[string]string{"team": "myapp", "cluster-name": "myapp-database"},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: policyv1beta1.PodDisruptionBudgetSpec{
 | 
				
			||||||
 | 
										MinAvailable: toIntStr(0),
 | 
				
			||||||
 | 
										Selector: &metav1.LabelSelector{
 | 
				
			||||||
 | 
											MatchLabels: map[string]string{"spilo-role": "master", "cluster-name": "myapp-database"},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							// With non-default PDBNameFormat.
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								New(
 | 
				
			||||||
 | 
									Config{OpConfig: config.Config{Resources: config.Resources{ClusterNameLabel: "cluster-name", PodRoleLabel: "spilo-role"}, PDBNameFormat: "postgres-{cluster}-databass-budget"}},
 | 
				
			||||||
 | 
									k8sutil.KubernetesClient{},
 | 
				
			||||||
 | 
									acidv1.Postgresql{
 | 
				
			||||||
 | 
										ObjectMeta: metav1.ObjectMeta{Name: "myapp-database", Namespace: "myapp"},
 | 
				
			||||||
 | 
										Spec:       acidv1.PostgresSpec{TeamID: "myapp", NumberOfInstances: 3}},
 | 
				
			||||||
 | 
									logger),
 | 
				
			||||||
 | 
								policyv1beta1.PodDisruptionBudget{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
										Name:      "postgres-myapp-database-databass-budget",
 | 
				
			||||||
 | 
										Namespace: "myapp",
 | 
				
			||||||
 | 
										Labels:    map[string]string{"team": "myapp", "cluster-name": "myapp-database"},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: policyv1beta1.PodDisruptionBudgetSpec{
 | 
				
			||||||
 | 
										MinAvailable: toIntStr(1),
 | 
				
			||||||
 | 
										Selector: &metav1.LabelSelector{
 | 
				
			||||||
 | 
											MatchLabels: map[string]string{"spilo-role": "master", "cluster-name": "myapp-database"},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, tt := range tests {
 | 
				
			||||||
 | 
							result := tt.c.generatePodDisruptionBudget()
 | 
				
			||||||
 | 
							if !reflect.DeepEqual(*result, tt.out) {
 | 
				
			||||||
 | 
								t.Errorf("Expected PodDisruptionBudget: %#v, got %#v", tt.out, *result)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue