Add check for volume zone GA labels

This commit is contained in:
notpad 2020-03-24 21:11:25 +08:00
parent 07cf64925e
commit 98405a8bd9
3 changed files with 112 additions and 12 deletions

View File

@ -12,6 +12,7 @@ go_library(
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/api/storage/v1:go_default_library", "//staging/src/k8s.io/api/storage/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
"//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library",
"//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library",

View File

@ -23,6 +23,7 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
storage "k8s.io/api/storage/v1" storage "k8s.io/api/storage/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/sets"
corelisters "k8s.io/client-go/listers/core/v1" corelisters "k8s.io/client-go/listers/core/v1"
storagelisters "k8s.io/client-go/listers/storage/v1" storagelisters "k8s.io/client-go/listers/storage/v1"
volumehelpers "k8s.io/cloud-provider/volume/helpers" volumehelpers "k8s.io/cloud-provider/volume/helpers"
@ -49,6 +50,13 @@ const (
ErrReasonConflict = "node(s) had no available volume zone" ErrReasonConflict = "node(s) had no available volume zone"
) )
var volumeZoneLabels = sets.NewString(
v1.LabelZoneFailureDomain,
v1.LabelZoneRegion,
v1.LabelZoneFailureDomainStable,
v1.LabelZoneRegionStable,
)
// Name returns name of the plugin. It is used in logs, etc. // Name returns name of the plugin. It is used in logs, etc.
func (pl *VolumeZone) Name() string { func (pl *VolumeZone) Name() string {
return Name return Name
@ -82,7 +90,7 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod *
} }
nodeConstraints := make(map[string]string) nodeConstraints := make(map[string]string)
for k, v := range node.ObjectMeta.Labels { for k, v := range node.ObjectMeta.Labels {
if k != v1.LabelZoneFailureDomain && k != v1.LabelZoneRegion { if !volumeZoneLabels.Has(k) {
continue continue
} }
nodeConstraints[k] = v nodeConstraints[k] = v
@ -145,7 +153,7 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod *
} }
for k, v := range pv.ObjectMeta.Labels { for k, v := range pv.ObjectMeta.Labels {
if k != v1.LabelZoneFailureDomain && k != v1.LabelZoneRegion { if !volumeZoneLabels.Has(k) {
continue continue
} }
nodeV, _ := nodeConstraints[k] nodeV, _ := nodeConstraints[k]

View File

@ -53,10 +53,16 @@ func TestSingleZone(t *testing.T) {
ObjectMeta: metav1.ObjectMeta{Name: "Vol_1", Labels: map[string]string{v1.LabelZoneFailureDomain: "us-west1-a"}}, ObjectMeta: metav1.ObjectMeta{Name: "Vol_1", Labels: map[string]string{v1.LabelZoneFailureDomain: "us-west1-a"}},
}, },
{ {
ObjectMeta: metav1.ObjectMeta{Name: "Vol_2", Labels: map[string]string{v1.LabelZoneRegion: "us-west1-b", "uselessLabel": "none"}}, ObjectMeta: metav1.ObjectMeta{Name: "Vol_2", Labels: map[string]string{v1.LabelZoneRegion: "us-west1", "uselessLabel": "none"}},
}, },
{ {
ObjectMeta: metav1.ObjectMeta{Name: "Vol_3", Labels: map[string]string{v1.LabelZoneRegion: "us-west1-c"}}, ObjectMeta: metav1.ObjectMeta{Name: "Vol_3", Labels: map[string]string{v1.LabelZoneRegion: "us-west1"}},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "Vol_Stable_1", Labels: map[string]string{v1.LabelZoneFailureDomainStable: "us-west1-a"}},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "Vol_Stable_2", Labels: map[string]string{v1.LabelZoneRegionStable: "us-west1", "uselessLabel": "none"}},
}, },
} }
@ -77,6 +83,14 @@ func TestSingleZone(t *testing.T) {
ObjectMeta: metav1.ObjectMeta{Name: "PVC_4", Namespace: "default"}, ObjectMeta: metav1.ObjectMeta{Name: "PVC_4", Namespace: "default"},
Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_not_exist"}, Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_not_exist"},
}, },
{
ObjectMeta: metav1.ObjectMeta{Name: "PVC_Stable_1", Namespace: "default"},
Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_Stable_1"},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "PVC_Stable_2", Namespace: "default"},
Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_Stable_2"},
},
} }
tests := []struct { tests := []struct {
@ -107,7 +121,7 @@ func TestSingleZone(t *testing.T) {
}, },
}, },
{ {
name: "label zone failure domain matched", name: "beta zone label matched",
Pod: createPodWithVolume("pod_1", "vol_1", "PVC_1"), Pod: createPodWithVolume("pod_1", "vol_1", "PVC_1"),
Node: &v1.Node{ Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -117,28 +131,28 @@ func TestSingleZone(t *testing.T) {
}, },
}, },
{ {
name: "label zone region matched", name: "beta region label matched",
Pod: createPodWithVolume("pod_1", "vol_1", "PVC_2"), Pod: createPodWithVolume("pod_1", "vol_1", "PVC_2"),
Node: &v1.Node{ Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "host1", Name: "host1",
Labels: map[string]string{v1.LabelZoneRegion: "us-west1-b", "uselessLabel": "none"}, Labels: map[string]string{v1.LabelZoneRegion: "us-west1", "uselessLabel": "none"},
}, },
}, },
}, },
{ {
name: "label zone region failed match", name: "beta region label doesn't match",
Pod: createPodWithVolume("pod_1", "vol_1", "PVC_2"), Pod: createPodWithVolume("pod_1", "vol_1", "PVC_2"),
Node: &v1.Node{ Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "host1", Name: "host1",
Labels: map[string]string{v1.LabelZoneRegion: "no_us-west1-b", "uselessLabel": "none"}, Labels: map[string]string{v1.LabelZoneRegion: "no_us-west1", "uselessLabel": "none"},
}, },
}, },
wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict), wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict),
}, },
{ {
name: "label zone failure domain failed match", name: "beta zone label doesn't match",
Pod: createPodWithVolume("pod_1", "vol_1", "PVC_1"), Pod: createPodWithVolume("pod_1", "vol_1", "PVC_1"),
Node: &v1.Node{ Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -148,6 +162,48 @@ func TestSingleZone(t *testing.T) {
}, },
wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict), wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict),
}, },
{
name: "zone label matched",
Pod: createPodWithVolume("pod_1", "Vol_Stable_1", "PVC_Stable_1"),
Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "host1",
Labels: map[string]string{v1.LabelZoneFailureDomainStable: "us-west1-a", "uselessLabel": "none"},
},
},
},
{
name: "region label matched",
Pod: createPodWithVolume("pod_1", "Vol_Stable_2", "PVC_Stable_2"),
Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "host1",
Labels: map[string]string{v1.LabelZoneRegionStable: "us-west1", "uselessLabel": "none"},
},
},
},
{
name: "region label doesn't match",
Pod: createPodWithVolume("pod_1", "Vol_Stable_2", "PVC_Stable_2"),
Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "host1",
Labels: map[string]string{v1.LabelZoneRegionStable: "no_us-west1", "uselessLabel": "none"},
},
},
wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict),
},
{
name: "zone label doesn't match",
Pod: createPodWithVolume("pod_1", "Vol_Stable_1", "PVC_Stable_1"),
Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "host1",
Labels: map[string]string{v1.LabelZoneFailureDomainStable: "no_us-west1-a", "uselessLabel": "none"},
},
},
wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict),
},
} }
for _, test := range tests { for _, test := range tests {
@ -178,6 +234,12 @@ func TestMultiZone(t *testing.T) {
{ {
ObjectMeta: metav1.ObjectMeta{Name: "Vol_3", Labels: map[string]string{v1.LabelZoneFailureDomain: "us-west1-c__us-west1-a"}}, ObjectMeta: metav1.ObjectMeta{Name: "Vol_3", Labels: map[string]string{v1.LabelZoneFailureDomain: "us-west1-c__us-west1-a"}},
}, },
{
ObjectMeta: metav1.ObjectMeta{Name: "Vol_Stable_1", Labels: map[string]string{v1.LabelZoneFailureDomainStable: "us-west1-a"}},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "Vol_Stable_2", Labels: map[string]string{v1.LabelZoneFailureDomainStable: "us-west1-c__us-west1-a"}},
},
} }
pvcLister := fakelisters.PersistentVolumeClaimLister{ pvcLister := fakelisters.PersistentVolumeClaimLister{
@ -197,6 +259,14 @@ func TestMultiZone(t *testing.T) {
ObjectMeta: metav1.ObjectMeta{Name: "PVC_4", Namespace: "default"}, ObjectMeta: metav1.ObjectMeta{Name: "PVC_4", Namespace: "default"},
Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_not_exist"}, Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_not_exist"},
}, },
{
ObjectMeta: metav1.ObjectMeta{Name: "PVC_Stable_1", Namespace: "default"},
Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_Stable_1"},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "PVC_Stable_2", Namespace: "default"},
Spec: v1.PersistentVolumeClaimSpec{VolumeName: "Vol_Stable_2"},
},
} }
tests := []struct { tests := []struct {
@ -215,7 +285,7 @@ func TestMultiZone(t *testing.T) {
}, },
}, },
{ {
name: "label zone failure domain matched", name: "beta zone label matched",
Pod: createPodWithVolume("pod_1", "Vol_3", "PVC_3"), Pod: createPodWithVolume("pod_1", "Vol_3", "PVC_3"),
Node: &v1.Node{ Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -225,7 +295,7 @@ func TestMultiZone(t *testing.T) {
}, },
}, },
{ {
name: "label zone failure domain failed match", name: "beta zone label doesn't match",
Pod: createPodWithVolume("pod_1", "vol_1", "PVC_1"), Pod: createPodWithVolume("pod_1", "vol_1", "PVC_1"),
Node: &v1.Node{ Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -235,6 +305,27 @@ func TestMultiZone(t *testing.T) {
}, },
wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict), wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict),
}, },
{
name: "zone label matched",
Pod: createPodWithVolume("pod_1", "Vol_Stable_2", "PVC_Stable_2"),
Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "host1",
Labels: map[string]string{v1.LabelZoneFailureDomainStable: "us-west1-a", "uselessLabel": "none"},
},
},
},
{
name: "zone label doesn't match",
Pod: createPodWithVolume("pod_1", "Vol_Stable_1", "PVC_Stable_1"),
Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "host1",
Labels: map[string]string{v1.LabelZoneFailureDomainStable: "us-west1-b", "uselessLabel": "none"},
},
},
wantStatus: framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonConflict),
},
} }
for _, test := range tests { for _, test := range tests {