mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
Merge pull request #25917 from pmorie/pv-selector
Automatic merge from submit-queue Add LabelSelector to PersistentVolumeClaimSpec Implements #25413. @kubernetes/sig-storage @bgrant0607 @thockin @jsafrane @eparis
This commit is contained in:
commit
38181bb3fb
@ -2494,6 +2494,10 @@
|
|||||||
},
|
},
|
||||||
"description": "AccessModes contains the desired access modes the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1"
|
"description": "AccessModes contains the desired access modes the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1"
|
||||||
},
|
},
|
||||||
|
"selector": {
|
||||||
|
"$ref": "unversioned.LabelSelector",
|
||||||
|
"description": "A label query over volumes to consider for binding."
|
||||||
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
"$ref": "v1.ResourceRequirements",
|
"$ref": "v1.ResourceRequirements",
|
||||||
"description": "Resources represents the minimum resources the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources"
|
"description": "Resources represents the minimum resources the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources"
|
||||||
|
@ -16980,6 +16980,10 @@
|
|||||||
},
|
},
|
||||||
"description": "AccessModes contains the desired access modes the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1"
|
"description": "AccessModes contains the desired access modes the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1"
|
||||||
},
|
},
|
||||||
|
"selector": {
|
||||||
|
"$ref": "unversioned.LabelSelector",
|
||||||
|
"description": "A label query over volumes to consider for binding."
|
||||||
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
"$ref": "v1.ResourceRequirements",
|
"$ref": "v1.ResourceRequirements",
|
||||||
"description": "Resources represents the minimum resources the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources"
|
"description": "Resources represents the minimum resources the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources"
|
||||||
@ -16994,6 +16998,48 @@
|
|||||||
"id": "v1.PersistentVolumeAccessMode",
|
"id": "v1.PersistentVolumeAccessMode",
|
||||||
"properties": {}
|
"properties": {}
|
||||||
},
|
},
|
||||||
|
"unversioned.LabelSelector": {
|
||||||
|
"id": "unversioned.LabelSelector",
|
||||||
|
"description": "A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.",
|
||||||
|
"properties": {
|
||||||
|
"matchLabels": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed."
|
||||||
|
},
|
||||||
|
"matchExpressions": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "unversioned.LabelSelectorRequirement"
|
||||||
|
},
|
||||||
|
"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unversioned.LabelSelectorRequirement": {
|
||||||
|
"id": "unversioned.LabelSelectorRequirement",
|
||||||
|
"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.",
|
||||||
|
"required": [
|
||||||
|
"key",
|
||||||
|
"operator"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"key": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "key is the label key that the selector applies to."
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "operator represents a key's relationship to a set of values. Valid operators ard In, NotIn, Exists and DoesNotExist."
|
||||||
|
},
|
||||||
|
"values": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"v1.ResourceRequirements": {
|
"v1.ResourceRequirements": {
|
||||||
"id": "v1.ResourceRequirements",
|
"id": "v1.ResourceRequirements",
|
||||||
"description": "ResourceRequirements describes the compute resource requirements.",
|
"description": "ResourceRequirements describes the compute resource requirements.",
|
||||||
|
@ -845,6 +845,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
|
|||||||
<td class="tableblock halign-left valign-top"></td>
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">selector</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">A label query over volumes to consider for binding.</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_unversioned_labelselector">unversioned.LabelSelector</a></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">resources</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">resources</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Resources represents the minimum resources the volume should have. More info: <a href="http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources">http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources</a></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Resources represents the minimum resources the volume should have. More info: <a href="http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources">http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources</a></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
@ -2759,6 +2766,47 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="sect2">
|
||||||
|
<h3 id="_unversioned_labelselector">unversioned.LabelSelector</h3>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p>A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.</p>
|
||||||
|
</div>
|
||||||
|
<table class="tableblock frame-all grid-all" style="width:100%; ">
|
||||||
|
<colgroup>
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="tableblock halign-left valign-top">Name</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Description</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Required</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Schema</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Default</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">matchLabels</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">object</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">matchExpressions</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">matchExpressions is a list of label selector requirements. The requirements are ANDed.</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_unversioned_labelselectorrequirement">unversioned.LabelSelectorRequirement</a> array</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="sect2">
|
<div class="sect2">
|
||||||
<h3 id="_v1_endpointsubset">v1.EndpointSubset</h3>
|
<h3 id="_v1_endpointsubset">v1.EndpointSubset</h3>
|
||||||
@ -7428,6 +7476,54 @@ The resulting set of endpoints can be viewed as:<br>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="sect2">
|
||||||
|
<h3 id="_unversioned_labelselectorrequirement">unversioned.LabelSelectorRequirement</h3>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p>A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.</p>
|
||||||
|
</div>
|
||||||
|
<table class="tableblock frame-all grid-all" style="width:100%; ">
|
||||||
|
<colgroup>
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
<col style="width:20%;">
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="tableblock halign-left valign-top">Name</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Description</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Required</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Schema</th>
|
||||||
|
<th class="tableblock halign-left valign-top">Default</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">key</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">key is the label key that the selector applies to.</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">operator</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">operator represents a key’s relationship to a set of values. Valid operators ard In, NotIn, Exists and DoesNotExist.</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">values</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">string array</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="sect2">
|
<div class="sect2">
|
||||||
<h3 id="_v1_containerstatewaiting">v1.ContainerStateWaiting</h3>
|
<h3 id="_v1_containerstatewaiting">v1.ContainerStateWaiting</h3>
|
||||||
@ -7991,7 +8087,7 @@ The resulting set of endpoints can be viewed as:<br>
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2016-05-26 18:58:49 UTC
|
Last updated 2016-05-30 16:33:41 UTC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -1772,6 +1772,15 @@ func DeepCopy_api_PersistentVolumeClaimSpec(in PersistentVolumeClaimSpec, out *P
|
|||||||
} else {
|
} else {
|
||||||
out.AccessModes = nil
|
out.AccessModes = nil
|
||||||
}
|
}
|
||||||
|
if in.Selector != nil {
|
||||||
|
in, out := in.Selector, &out.Selector
|
||||||
|
*out = new(unversioned.LabelSelector)
|
||||||
|
if err := unversioned.DeepCopy_unversioned_LabelSelector(*in, *out, c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Selector = nil
|
||||||
|
}
|
||||||
if err := DeepCopy_api_ResourceRequirements(in.Resources, &out.Resources, c); err != nil {
|
if err := DeepCopy_api_ResourceRequirements(in.Resources, &out.Resources, c); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -8161,15 +8161,16 @@ func (x *PersistentVolumeClaimSpec) CodecEncodeSelf(e *codec1978.Encoder) {
|
|||||||
} else {
|
} else {
|
||||||
yysep2 := !z.EncBinary()
|
yysep2 := !z.EncBinary()
|
||||||
yy2arr2 := z.EncBasicHandle().StructToArray
|
yy2arr2 := z.EncBasicHandle().StructToArray
|
||||||
var yyq2 [3]bool
|
var yyq2 [4]bool
|
||||||
_, _, _ = yysep2, yyq2, yy2arr2
|
_, _, _ = yysep2, yyq2, yy2arr2
|
||||||
const yyr2 bool = false
|
const yyr2 bool = false
|
||||||
yyq2[0] = len(x.AccessModes) != 0
|
yyq2[0] = len(x.AccessModes) != 0
|
||||||
yyq2[1] = true
|
yyq2[1] = x.Selector != nil
|
||||||
yyq2[2] = x.VolumeName != ""
|
yyq2[2] = true
|
||||||
|
yyq2[3] = x.VolumeName != ""
|
||||||
var yynn2 int
|
var yynn2 int
|
||||||
if yyr2 || yy2arr2 {
|
if yyr2 || yy2arr2 {
|
||||||
r.EncodeArrayStart(3)
|
r.EncodeArrayStart(4)
|
||||||
} else {
|
} else {
|
||||||
yynn2 = 0
|
yynn2 = 0
|
||||||
for _, b := range yyq2 {
|
for _, b := range yyq2 {
|
||||||
@ -8216,25 +8217,60 @@ func (x *PersistentVolumeClaimSpec) CodecEncodeSelf(e *codec1978.Encoder) {
|
|||||||
if yyr2 || yy2arr2 {
|
if yyr2 || yy2arr2 {
|
||||||
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
if yyq2[1] {
|
if yyq2[1] {
|
||||||
yy7 := &x.Resources
|
if x.Selector == nil {
|
||||||
yy7.CodecEncodeSelf(e)
|
r.EncodeNil()
|
||||||
|
} else {
|
||||||
|
yym7 := z.EncBinary()
|
||||||
|
_ = yym7
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.EncExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.EncFallback(x.Selector)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
r.EncodeNil()
|
r.EncodeNil()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if yyq2[1] {
|
if yyq2[1] {
|
||||||
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
||||||
r.EncodeString(codecSelferC_UTF81234, string("resources"))
|
r.EncodeString(codecSelferC_UTF81234, string("selector"))
|
||||||
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
||||||
yy9 := &x.Resources
|
if x.Selector == nil {
|
||||||
yy9.CodecEncodeSelf(e)
|
r.EncodeNil()
|
||||||
|
} else {
|
||||||
|
yym8 := z.EncBinary()
|
||||||
|
_ = yym8
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.EncExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.EncFallback(x.Selector)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if yyr2 || yy2arr2 {
|
if yyr2 || yy2arr2 {
|
||||||
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
if yyq2[2] {
|
if yyq2[2] {
|
||||||
yym12 := z.EncBinary()
|
yy10 := &x.Resources
|
||||||
_ = yym12
|
yy10.CodecEncodeSelf(e)
|
||||||
|
} else {
|
||||||
|
r.EncodeNil()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if yyq2[2] {
|
||||||
|
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
||||||
|
r.EncodeString(codecSelferC_UTF81234, string("resources"))
|
||||||
|
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
||||||
|
yy12 := &x.Resources
|
||||||
|
yy12.CodecEncodeSelf(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if yyr2 || yy2arr2 {
|
||||||
|
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
|
if yyq2[3] {
|
||||||
|
yym15 := z.EncBinary()
|
||||||
|
_ = yym15
|
||||||
if false {
|
if false {
|
||||||
} else {
|
} else {
|
||||||
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
||||||
@ -8243,12 +8279,12 @@ func (x *PersistentVolumeClaimSpec) CodecEncodeSelf(e *codec1978.Encoder) {
|
|||||||
r.EncodeString(codecSelferC_UTF81234, "")
|
r.EncodeString(codecSelferC_UTF81234, "")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if yyq2[2] {
|
if yyq2[3] {
|
||||||
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
||||||
r.EncodeString(codecSelferC_UTF81234, string("volumeName"))
|
r.EncodeString(codecSelferC_UTF81234, string("volumeName"))
|
||||||
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
||||||
yym13 := z.EncBinary()
|
yym16 := z.EncBinary()
|
||||||
_ = yym13
|
_ = yym16
|
||||||
if false {
|
if false {
|
||||||
} else {
|
} else {
|
||||||
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
||||||
@ -8328,12 +8364,29 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromMap(l int, d *codec1978.D
|
|||||||
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv4), d)
|
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv4), d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case "selector":
|
||||||
|
if r.TryDecodeAsNil() {
|
||||||
|
if x.Selector != nil {
|
||||||
|
x.Selector = nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if x.Selector == nil {
|
||||||
|
x.Selector = new(pkg2_unversioned.LabelSelector)
|
||||||
|
}
|
||||||
|
yym7 := z.DecBinary()
|
||||||
|
_ = yym7
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.DecExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.DecFallback(x.Selector, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
case "resources":
|
case "resources":
|
||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
x.Resources = ResourceRequirements{}
|
x.Resources = ResourceRequirements{}
|
||||||
} else {
|
} else {
|
||||||
yyv6 := &x.Resources
|
yyv8 := &x.Resources
|
||||||
yyv6.CodecDecodeSelf(d)
|
yyv8.CodecDecodeSelf(d)
|
||||||
}
|
}
|
||||||
case "volumeName":
|
case "volumeName":
|
||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
@ -8352,16 +8405,16 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
var h codecSelfer1234
|
var h codecSelfer1234
|
||||||
z, r := codec1978.GenHelperDecoder(d)
|
z, r := codec1978.GenHelperDecoder(d)
|
||||||
_, _, _ = h, z, r
|
_, _, _ = h, z, r
|
||||||
var yyj8 int
|
var yyj10 int
|
||||||
var yyb8 bool
|
var yyb10 bool
|
||||||
var yyhl8 bool = l >= 0
|
var yyhl10 bool = l >= 0
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -8369,21 +8422,48 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
x.AccessModes = nil
|
x.AccessModes = nil
|
||||||
} else {
|
} else {
|
||||||
yyv9 := &x.AccessModes
|
yyv11 := &x.AccessModes
|
||||||
yym10 := z.DecBinary()
|
yym12 := z.DecBinary()
|
||||||
_ = yym10
|
_ = yym12
|
||||||
if false {
|
if false {
|
||||||
} else {
|
} else {
|
||||||
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv9), d)
|
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv11), d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
|
if r.TryDecodeAsNil() {
|
||||||
|
if x.Selector != nil {
|
||||||
|
x.Selector = nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if x.Selector == nil {
|
||||||
|
x.Selector = new(pkg2_unversioned.LabelSelector)
|
||||||
|
}
|
||||||
|
yym14 := z.DecBinary()
|
||||||
|
_ = yym14
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.DecExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.DecFallback(x.Selector, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
yyj10++
|
||||||
|
if yyhl10 {
|
||||||
|
yyb10 = yyj10 > l
|
||||||
|
} else {
|
||||||
|
yyb10 = r.CheckBreak()
|
||||||
|
}
|
||||||
|
if yyb10 {
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -8391,16 +8471,16 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
x.Resources = ResourceRequirements{}
|
x.Resources = ResourceRequirements{}
|
||||||
} else {
|
} else {
|
||||||
yyv11 := &x.Resources
|
yyv15 := &x.Resources
|
||||||
yyv11.CodecDecodeSelf(d)
|
yyv15.CodecDecodeSelf(d)
|
||||||
}
|
}
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -8411,17 +8491,17 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
x.VolumeName = string(r.DecodeString())
|
x.VolumeName = string(r.DecodeString())
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
|
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
z.DecStructFieldNotFound(yyj8-1, "")
|
z.DecStructFieldNotFound(yyj10-1, "")
|
||||||
}
|
}
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
}
|
}
|
||||||
@ -53208,7 +53288,7 @@ func (x codecSelfer1234) decSlicePersistentVolumeClaim(v *[]PersistentVolumeClai
|
|||||||
|
|
||||||
yyrg1 := len(yyv1) > 0
|
yyrg1 := len(yyv1) > 0
|
||||||
yyv21 := yyv1
|
yyv21 := yyv1
|
||||||
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 344)
|
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 352)
|
||||||
if yyrt1 {
|
if yyrt1 {
|
||||||
if yyrl1 <= cap(yyv1) {
|
if yyrl1 <= cap(yyv1) {
|
||||||
yyv1 = yyv1[:yyrl1]
|
yyv1 = yyv1[:yyrl1]
|
||||||
|
@ -364,6 +364,8 @@ type PersistentVolumeClaimList struct {
|
|||||||
type PersistentVolumeClaimSpec struct {
|
type PersistentVolumeClaimSpec struct {
|
||||||
// Contains the types of access modes required
|
// Contains the types of access modes required
|
||||||
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty"`
|
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty"`
|
||||||
|
// A label query over volumes to consider for binding
|
||||||
|
Selector *unversioned.LabelSelector `json:"selector,omitempty"`
|
||||||
// Resources represents the minimum resources required
|
// Resources represents the minimum resources required
|
||||||
Resources ResourceRequirements `json:"resources,omitempty"`
|
Resources ResourceRequirements `json:"resources,omitempty"`
|
||||||
// VolumeName is the binding reference to the PersistentVolume backing this claim
|
// VolumeName is the binding reference to the PersistentVolume backing this claim
|
||||||
|
@ -3790,6 +3790,7 @@ func autoConvert_v1_PersistentVolumeClaimSpec_To_api_PersistentVolumeClaimSpec(i
|
|||||||
} else {
|
} else {
|
||||||
out.AccessModes = nil
|
out.AccessModes = nil
|
||||||
}
|
}
|
||||||
|
out.Selector = in.Selector
|
||||||
if err := Convert_v1_ResourceRequirements_To_api_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
|
if err := Convert_v1_ResourceRequirements_To_api_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -3811,6 +3812,7 @@ func autoConvert_api_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec(i
|
|||||||
} else {
|
} else {
|
||||||
out.AccessModes = nil
|
out.AccessModes = nil
|
||||||
}
|
}
|
||||||
|
out.Selector = in.Selector
|
||||||
if err := Convert_api_ResourceRequirements_To_v1_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
|
if err := Convert_api_ResourceRequirements_To_v1_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1719,6 +1719,15 @@ func DeepCopy_v1_PersistentVolumeClaimSpec(in PersistentVolumeClaimSpec, out *Pe
|
|||||||
} else {
|
} else {
|
||||||
out.AccessModes = nil
|
out.AccessModes = nil
|
||||||
}
|
}
|
||||||
|
if in.Selector != nil {
|
||||||
|
in, out := in.Selector, &out.Selector
|
||||||
|
*out = new(unversioned.LabelSelector)
|
||||||
|
if err := unversioned.DeepCopy_unversioned_LabelSelector(*in, *out, c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Selector = nil
|
||||||
|
}
|
||||||
if err := DeepCopy_v1_ResourceRequirements(in.Resources, &out.Resources, c); err != nil {
|
if err := DeepCopy_v1_ResourceRequirements(in.Resources, &out.Resources, c); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1581,6 +1581,9 @@ message PersistentVolumeClaimSpec {
|
|||||||
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1
|
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1
|
||||||
repeated string accessModes = 1;
|
repeated string accessModes = 1;
|
||||||
|
|
||||||
|
// A label query over volumes to consider for binding.
|
||||||
|
optional k8s.io.kubernetes.pkg.api.unversioned.LabelSelector selector = 4;
|
||||||
|
|
||||||
// Resources represents the minimum resources the volume should have.
|
// Resources represents the minimum resources the volume should have.
|
||||||
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources
|
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources
|
||||||
optional ResourceRequirements resources = 2;
|
optional ResourceRequirements resources = 2;
|
||||||
|
@ -8164,15 +8164,16 @@ func (x *PersistentVolumeClaimSpec) CodecEncodeSelf(e *codec1978.Encoder) {
|
|||||||
} else {
|
} else {
|
||||||
yysep2 := !z.EncBinary()
|
yysep2 := !z.EncBinary()
|
||||||
yy2arr2 := z.EncBasicHandle().StructToArray
|
yy2arr2 := z.EncBasicHandle().StructToArray
|
||||||
var yyq2 [3]bool
|
var yyq2 [4]bool
|
||||||
_, _, _ = yysep2, yyq2, yy2arr2
|
_, _, _ = yysep2, yyq2, yy2arr2
|
||||||
const yyr2 bool = false
|
const yyr2 bool = false
|
||||||
yyq2[0] = len(x.AccessModes) != 0
|
yyq2[0] = len(x.AccessModes) != 0
|
||||||
yyq2[1] = true
|
yyq2[1] = x.Selector != nil
|
||||||
yyq2[2] = x.VolumeName != ""
|
yyq2[2] = true
|
||||||
|
yyq2[3] = x.VolumeName != ""
|
||||||
var yynn2 int
|
var yynn2 int
|
||||||
if yyr2 || yy2arr2 {
|
if yyr2 || yy2arr2 {
|
||||||
r.EncodeArrayStart(3)
|
r.EncodeArrayStart(4)
|
||||||
} else {
|
} else {
|
||||||
yynn2 = 0
|
yynn2 = 0
|
||||||
for _, b := range yyq2 {
|
for _, b := range yyq2 {
|
||||||
@ -8219,25 +8220,60 @@ func (x *PersistentVolumeClaimSpec) CodecEncodeSelf(e *codec1978.Encoder) {
|
|||||||
if yyr2 || yy2arr2 {
|
if yyr2 || yy2arr2 {
|
||||||
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
if yyq2[1] {
|
if yyq2[1] {
|
||||||
yy7 := &x.Resources
|
if x.Selector == nil {
|
||||||
yy7.CodecEncodeSelf(e)
|
r.EncodeNil()
|
||||||
|
} else {
|
||||||
|
yym7 := z.EncBinary()
|
||||||
|
_ = yym7
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.EncExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.EncFallback(x.Selector)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
r.EncodeNil()
|
r.EncodeNil()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if yyq2[1] {
|
if yyq2[1] {
|
||||||
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
||||||
r.EncodeString(codecSelferC_UTF81234, string("resources"))
|
r.EncodeString(codecSelferC_UTF81234, string("selector"))
|
||||||
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
||||||
yy9 := &x.Resources
|
if x.Selector == nil {
|
||||||
yy9.CodecEncodeSelf(e)
|
r.EncodeNil()
|
||||||
|
} else {
|
||||||
|
yym8 := z.EncBinary()
|
||||||
|
_ = yym8
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.EncExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.EncFallback(x.Selector)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if yyr2 || yy2arr2 {
|
if yyr2 || yy2arr2 {
|
||||||
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
if yyq2[2] {
|
if yyq2[2] {
|
||||||
yym12 := z.EncBinary()
|
yy10 := &x.Resources
|
||||||
_ = yym12
|
yy10.CodecEncodeSelf(e)
|
||||||
|
} else {
|
||||||
|
r.EncodeNil()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if yyq2[2] {
|
||||||
|
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
||||||
|
r.EncodeString(codecSelferC_UTF81234, string("resources"))
|
||||||
|
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
||||||
|
yy12 := &x.Resources
|
||||||
|
yy12.CodecEncodeSelf(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if yyr2 || yy2arr2 {
|
||||||
|
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
|
if yyq2[3] {
|
||||||
|
yym15 := z.EncBinary()
|
||||||
|
_ = yym15
|
||||||
if false {
|
if false {
|
||||||
} else {
|
} else {
|
||||||
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
||||||
@ -8246,12 +8282,12 @@ func (x *PersistentVolumeClaimSpec) CodecEncodeSelf(e *codec1978.Encoder) {
|
|||||||
r.EncodeString(codecSelferC_UTF81234, "")
|
r.EncodeString(codecSelferC_UTF81234, "")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if yyq2[2] {
|
if yyq2[3] {
|
||||||
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
z.EncSendContainerState(codecSelfer_containerMapKey1234)
|
||||||
r.EncodeString(codecSelferC_UTF81234, string("volumeName"))
|
r.EncodeString(codecSelferC_UTF81234, string("volumeName"))
|
||||||
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
z.EncSendContainerState(codecSelfer_containerMapValue1234)
|
||||||
yym13 := z.EncBinary()
|
yym16 := z.EncBinary()
|
||||||
_ = yym13
|
_ = yym16
|
||||||
if false {
|
if false {
|
||||||
} else {
|
} else {
|
||||||
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
r.EncodeString(codecSelferC_UTF81234, string(x.VolumeName))
|
||||||
@ -8331,12 +8367,29 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromMap(l int, d *codec1978.D
|
|||||||
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv4), d)
|
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv4), d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case "selector":
|
||||||
|
if r.TryDecodeAsNil() {
|
||||||
|
if x.Selector != nil {
|
||||||
|
x.Selector = nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if x.Selector == nil {
|
||||||
|
x.Selector = new(pkg2_unversioned.LabelSelector)
|
||||||
|
}
|
||||||
|
yym7 := z.DecBinary()
|
||||||
|
_ = yym7
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.DecExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.DecFallback(x.Selector, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
case "resources":
|
case "resources":
|
||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
x.Resources = ResourceRequirements{}
|
x.Resources = ResourceRequirements{}
|
||||||
} else {
|
} else {
|
||||||
yyv6 := &x.Resources
|
yyv8 := &x.Resources
|
||||||
yyv6.CodecDecodeSelf(d)
|
yyv8.CodecDecodeSelf(d)
|
||||||
}
|
}
|
||||||
case "volumeName":
|
case "volumeName":
|
||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
@ -8355,16 +8408,16 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
var h codecSelfer1234
|
var h codecSelfer1234
|
||||||
z, r := codec1978.GenHelperDecoder(d)
|
z, r := codec1978.GenHelperDecoder(d)
|
||||||
_, _, _ = h, z, r
|
_, _, _ = h, z, r
|
||||||
var yyj8 int
|
var yyj10 int
|
||||||
var yyb8 bool
|
var yyb10 bool
|
||||||
var yyhl8 bool = l >= 0
|
var yyhl10 bool = l >= 0
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -8372,21 +8425,48 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
x.AccessModes = nil
|
x.AccessModes = nil
|
||||||
} else {
|
} else {
|
||||||
yyv9 := &x.AccessModes
|
yyv11 := &x.AccessModes
|
||||||
yym10 := z.DecBinary()
|
yym12 := z.DecBinary()
|
||||||
_ = yym10
|
_ = yym12
|
||||||
if false {
|
if false {
|
||||||
} else {
|
} else {
|
||||||
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv9), d)
|
h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv11), d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
|
if r.TryDecodeAsNil() {
|
||||||
|
if x.Selector != nil {
|
||||||
|
x.Selector = nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if x.Selector == nil {
|
||||||
|
x.Selector = new(pkg2_unversioned.LabelSelector)
|
||||||
|
}
|
||||||
|
yym14 := z.DecBinary()
|
||||||
|
_ = yym14
|
||||||
|
if false {
|
||||||
|
} else if z.HasExtensions() && z.DecExt(x.Selector) {
|
||||||
|
} else {
|
||||||
|
z.DecFallback(x.Selector, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
yyj10++
|
||||||
|
if yyhl10 {
|
||||||
|
yyb10 = yyj10 > l
|
||||||
|
} else {
|
||||||
|
yyb10 = r.CheckBreak()
|
||||||
|
}
|
||||||
|
if yyb10 {
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -8394,16 +8474,16 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
if r.TryDecodeAsNil() {
|
if r.TryDecodeAsNil() {
|
||||||
x.Resources = ResourceRequirements{}
|
x.Resources = ResourceRequirements{}
|
||||||
} else {
|
} else {
|
||||||
yyv11 := &x.Resources
|
yyv15 := &x.Resources
|
||||||
yyv11.CodecDecodeSelf(d)
|
yyv15.CodecDecodeSelf(d)
|
||||||
}
|
}
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -8414,17 +8494,17 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978
|
|||||||
x.VolumeName = string(r.DecodeString())
|
x.VolumeName = string(r.DecodeString())
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
yyj8++
|
yyj10++
|
||||||
if yyhl8 {
|
if yyhl10 {
|
||||||
yyb8 = yyj8 > l
|
yyb10 = yyj10 > l
|
||||||
} else {
|
} else {
|
||||||
yyb8 = r.CheckBreak()
|
yyb10 = r.CheckBreak()
|
||||||
}
|
}
|
||||||
if yyb8 {
|
if yyb10 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
|
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
|
||||||
z.DecStructFieldNotFound(yyj8-1, "")
|
z.DecStructFieldNotFound(yyj10-1, "")
|
||||||
}
|
}
|
||||||
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
|
||||||
}
|
}
|
||||||
@ -53380,7 +53460,7 @@ func (x codecSelfer1234) decSlicePersistentVolumeClaim(v *[]PersistentVolumeClai
|
|||||||
|
|
||||||
yyrg1 := len(yyv1) > 0
|
yyrg1 := len(yyv1) > 0
|
||||||
yyv21 := yyv1
|
yyv21 := yyv1
|
||||||
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 344)
|
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 352)
|
||||||
if yyrt1 {
|
if yyrt1 {
|
||||||
if yyrl1 <= cap(yyv1) {
|
if yyrl1 <= cap(yyv1) {
|
||||||
yyv1 = yyv1[:yyrl1]
|
yyv1 = yyv1[:yyrl1]
|
||||||
|
@ -456,6 +456,8 @@ type PersistentVolumeClaimSpec struct {
|
|||||||
// AccessModes contains the desired access modes the volume should have.
|
// AccessModes contains the desired access modes the volume should have.
|
||||||
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1
|
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1
|
||||||
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty" protobuf:"bytes,1,rep,name=accessModes,casttype=PersistentVolumeAccessMode"`
|
AccessModes []PersistentVolumeAccessMode `json:"accessModes,omitempty" protobuf:"bytes,1,rep,name=accessModes,casttype=PersistentVolumeAccessMode"`
|
||||||
|
// A label query over volumes to consider for binding.
|
||||||
|
Selector *unversioned.LabelSelector `json:"selector,omitempty" protobuf:"bytes,4,opt,name=selector"`
|
||||||
// Resources represents the minimum resources the volume should have.
|
// Resources represents the minimum resources the volume should have.
|
||||||
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources
|
// More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources
|
||||||
Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,2,opt,name=resources"`
|
Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,2,opt,name=resources"`
|
||||||
|
@ -998,6 +998,7 @@ func (PersistentVolumeClaimList) SwaggerDoc() map[string]string {
|
|||||||
var map_PersistentVolumeClaimSpec = map[string]string{
|
var map_PersistentVolumeClaimSpec = map[string]string{
|
||||||
"": "PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes",
|
"": "PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes",
|
||||||
"accessModes": "AccessModes contains the desired access modes the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1",
|
"accessModes": "AccessModes contains the desired access modes the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1",
|
||||||
|
"selector": "A label query over volumes to consider for binding.",
|
||||||
"resources": "Resources represents the minimum resources the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources",
|
"resources": "Resources represents the minimum resources the volume should have. More info: http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#resources",
|
||||||
"volumeName": "VolumeName is the binding reference to the PersistentVolume backing this claim.",
|
"volumeName": "VolumeName is the binding reference to the PersistentVolume backing this claim.",
|
||||||
}
|
}
|
||||||
|
@ -992,6 +992,9 @@ func ValidatePersistentVolumeClaim(pvc *api.PersistentVolumeClaim) field.ErrorLi
|
|||||||
if len(pvc.Spec.AccessModes) == 0 {
|
if len(pvc.Spec.AccessModes) == 0 {
|
||||||
allErrs = append(allErrs, field.Required(specPath.Child("accessModes"), "at least 1 accessMode is required"))
|
allErrs = append(allErrs, field.Required(specPath.Child("accessModes"), "at least 1 accessMode is required"))
|
||||||
}
|
}
|
||||||
|
if pvc.Spec.Selector != nil {
|
||||||
|
allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(pvc.Spec.Selector, specPath.Child("selector"))...)
|
||||||
|
}
|
||||||
for _, mode := range pvc.Spec.AccessModes {
|
for _, mode := range pvc.Spec.AccessModes {
|
||||||
if mode != api.ReadWriteOnce && mode != api.ReadOnlyMany && mode != api.ReadWriteMany {
|
if mode != api.ReadWriteOnce && mode != api.ReadOnlyMany && mode != api.ReadWriteMany {
|
||||||
allErrs = append(allErrs, field.NotSupported(specPath.Child("accessModes"), mode, supportedAccessModes.List()))
|
allErrs = append(allErrs, field.NotSupported(specPath.Child("accessModes"), mode, supportedAccessModes.List()))
|
||||||
|
@ -459,6 +459,37 @@ func TestValidatePersistentVolumeClaim(t *testing.T) {
|
|||||||
"good-claim": {
|
"good-claim": {
|
||||||
isExpectedFailure: false,
|
isExpectedFailure: false,
|
||||||
claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
|
claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
|
||||||
|
Selector: &unversioned.LabelSelector{
|
||||||
|
MatchExpressions: []unversioned.LabelSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "key2",
|
||||||
|
Operator: "Exists",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{
|
||||||
|
api.ReadWriteOnce,
|
||||||
|
api.ReadOnlyMany,
|
||||||
|
},
|
||||||
|
Resources: api.ResourceRequirements{
|
||||||
|
Requests: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("10G"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
"invalid-label-selector": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
|
||||||
|
Selector: &unversioned.LabelSelector{
|
||||||
|
MatchExpressions: []unversioned.LabelSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "key2",
|
||||||
|
Operator: "InvalidOp",
|
||||||
|
Values: []string{"value1", "value2"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
AccessModes: []api.PersistentVolumeAccessMode{
|
AccessModes: []api.PersistentVolumeAccessMode{
|
||||||
api.ReadWriteOnce,
|
api.ReadWriteOnce,
|
||||||
api.ReadOnlyMany,
|
api.ReadOnlyMany,
|
||||||
|
@ -1434,7 +1434,7 @@ func (x codecSelfer1234) decSliceapi_PersistentVolumeClaim(v *[]pkg2_api.Persist
|
|||||||
|
|
||||||
yyrg1 := len(yyv1) > 0
|
yyrg1 := len(yyv1) > 0
|
||||||
yyv21 := yyv1
|
yyv21 := yyv1
|
||||||
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 344)
|
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 352)
|
||||||
if yyrt1 {
|
if yyrt1 {
|
||||||
if yyrl1 <= cap(yyv1) {
|
if yyrl1 <= cap(yyv1) {
|
||||||
yyv1 = yyv1[:yyrl1]
|
yyv1 = yyv1[:yyrl1]
|
||||||
|
@ -1464,7 +1464,7 @@ func (x codecSelfer1234) decSlicev1_PersistentVolumeClaim(v *[]pkg2_v1.Persisten
|
|||||||
|
|
||||||
yyrg1 := len(yyv1) > 0
|
yyrg1 := len(yyv1) > 0
|
||||||
yyv21 := yyv1
|
yyv21 := yyv1
|
||||||
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 344)
|
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 352)
|
||||||
if yyrt1 {
|
if yyrt1 {
|
||||||
if yyrl1 <= cap(yyv1) {
|
if yyrl1 <= cap(yyv1) {
|
||||||
yyv1 = yyv1[:yyrl1]
|
yyv1 = yyv1[:yyrl1]
|
||||||
|
@ -28,6 +28,11 @@ import (
|
|||||||
// controllerTest.testCall *once*.
|
// controllerTest.testCall *once*.
|
||||||
// 3. Compare resulting volumes and claims with expected volumes and claims.
|
// 3. Compare resulting volumes and claims with expected volumes and claims.
|
||||||
func TestSync(t *testing.T) {
|
func TestSync(t *testing.T) {
|
||||||
|
labels := map[string]string{
|
||||||
|
"foo": "true",
|
||||||
|
"bar": "false",
|
||||||
|
}
|
||||||
|
|
||||||
tests := []controllerTest{
|
tests := []controllerTest{
|
||||||
// [Unit test set 1] User did not care which PV they get.
|
// [Unit test set 1] User did not care which PV they get.
|
||||||
// Test the matching with no claim.Spec.VolumeName and with various
|
// Test the matching with no claim.Spec.VolumeName and with various
|
||||||
@ -140,13 +145,32 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
// syncClaim completes binding - simulates controller crash after
|
// syncClaim completes binding - simulates controller crash after
|
||||||
// PVC.VolumeName is saved
|
// PVC.VolumeName is saved
|
||||||
"10 - complete bind after crash - PVC bound",
|
"1-10 - complete bind after crash - PVC bound",
|
||||||
newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
|
newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
|
||||||
newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
|
newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
|
||||||
newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", api.ClaimPending, annBoundByController, annBindCompleted),
|
newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", api.ClaimPending, annBoundByController, annBindCompleted),
|
||||||
newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", api.ClaimBound, annBoundByController, annBindCompleted),
|
newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", api.ClaimBound, annBoundByController, annBindCompleted),
|
||||||
noevents, noerrors, testSyncClaim,
|
noevents, noerrors, testSyncClaim,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// syncClaim binds a claim only when the label selector matches the volume
|
||||||
|
"1-11 - bind when selector matches",
|
||||||
|
withLabels(labels, newVolumeArray("volume1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain)),
|
||||||
|
withLabels(labels, newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController)),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", api.ClaimPending)),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", api.ClaimBound, annBoundByController, annBindCompleted)),
|
||||||
|
noevents, noerrors, testSyncClaim,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// syncClaim does not bind a claim when the label selector doesn't match
|
||||||
|
"1-12 - do not bind when selector does not match",
|
||||||
|
newVolumeArray("volume1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
|
||||||
|
newVolumeArray("volume1-1", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", api.ClaimPending)),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", api.ClaimPending)),
|
||||||
|
noevents, noerrors, testSyncClaim,
|
||||||
|
},
|
||||||
|
|
||||||
// [Unit test set 2] User asked for a specific PV.
|
// [Unit test set 2] User asked for a specific PV.
|
||||||
// Test the binding when pv.ClaimRef is already set by controller or
|
// Test the binding when pv.ClaimRef is already set by controller or
|
||||||
// by user.
|
// by user.
|
||||||
@ -220,6 +244,18 @@ func TestSync(t *testing.T) {
|
|||||||
newClaimArray("claim2-7", "uid2-7", "10Gi", "volume2-7", api.ClaimBound, annBoundByController),
|
newClaimArray("claim2-7", "uid2-7", "10Gi", "volume2-7", api.ClaimBound, annBoundByController),
|
||||||
noevents, noerrors, testSyncClaimError,
|
noevents, noerrors, testSyncClaimError,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// syncClaim with claim pre-bound to a PV that exists and is
|
||||||
|
// unbound, but does not match the selector. Check it gets bound
|
||||||
|
// and no annBoundByController is set.
|
||||||
|
"2-8 - claim prebound to unbound volume that does not match the selector",
|
||||||
|
newVolumeArray("volume2-3", "1Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
|
||||||
|
newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "10Gi", "volume2-3", api.ClaimPending)),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "10Gi", "volume2-3", api.ClaimBound, annBindCompleted)),
|
||||||
|
noevents, noerrors, testSyncClaim,
|
||||||
|
},
|
||||||
|
|
||||||
// [Unit test set 3] Syncing bound claim
|
// [Unit test set 3] Syncing bound claim
|
||||||
{
|
{
|
||||||
// syncClaim with claim bound and its claim.Spec.VolumeName is
|
// syncClaim with claim bound and its claim.Spec.VolumeName is
|
||||||
@ -283,6 +319,17 @@ func TestSync(t *testing.T) {
|
|||||||
newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", api.ClaimLost, annBindCompleted),
|
newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", api.ClaimLost, annBindCompleted),
|
||||||
[]string{"Warning ClaimMisbound"}, noerrors, testSyncClaim,
|
[]string{"Warning ClaimMisbound"}, noerrors, testSyncClaim,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// syncClaim with claim bound to unbound volume. Check it's bound
|
||||||
|
// even if the claim's selector doesn't match the volume. Also
|
||||||
|
// check that Pending phase is set to Bound
|
||||||
|
"3-7 - bound claim with unbound volume where selector doesn't match",
|
||||||
|
newVolumeArray("volume3-3", "10Gi", "", "", api.VolumePending, api.PersistentVolumeReclaimRetain),
|
||||||
|
newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", api.VolumeBound, api.PersistentVolumeReclaimRetain, annBoundByController),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", api.ClaimPending, annBoundByController, annBindCompleted)),
|
||||||
|
withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", api.ClaimBound, annBoundByController, annBindCompleted)),
|
||||||
|
noevents, noerrors, testSyncClaim,
|
||||||
|
},
|
||||||
// [Unit test set 4] All syncVolume tests.
|
// [Unit test set 4] All syncVolume tests.
|
||||||
{
|
{
|
||||||
// syncVolume with pending volume. Check it's marked as Available.
|
// syncVolume with pending volume. Check it's marked as Available.
|
||||||
|
@ -32,6 +32,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/resource"
|
"k8s.io/kubernetes/pkg/api/resource"
|
||||||
"k8s.io/kubernetes/pkg/api/testapi"
|
"k8s.io/kubernetes/pkg/api/testapi"
|
||||||
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/client/cache"
|
"k8s.io/kubernetes/pkg/client/cache"
|
||||||
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
|
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
|
||||||
@ -575,6 +576,25 @@ func newVolume(name, capacity, boundToClaimUID, boundToClaimName string, phase a
|
|||||||
return &volume
|
return &volume
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// withLabels applies the given labels to the first volume in the array and
|
||||||
|
// returns the array. Meant to be used to compose volumes specified inline in
|
||||||
|
// a test.
|
||||||
|
func withLabels(labels map[string]string, volumes []*api.PersistentVolume) []*api.PersistentVolume {
|
||||||
|
volumes[0].Labels = labels
|
||||||
|
return volumes
|
||||||
|
}
|
||||||
|
|
||||||
|
// withLabelSelector sets the label selector of the first claim in the array
|
||||||
|
// to be MatchLabels of the given label set and returns the array. Meant
|
||||||
|
// to be used to compose claims specified inline in a test.
|
||||||
|
func withLabelSelector(labels map[string]string, claims []*api.PersistentVolumeClaim) []*api.PersistentVolumeClaim {
|
||||||
|
claims[0].Spec.Selector = &unversioned.LabelSelector{
|
||||||
|
MatchLabels: labels,
|
||||||
|
}
|
||||||
|
|
||||||
|
return claims
|
||||||
|
}
|
||||||
|
|
||||||
// newVolumeArray returns array with a single volume that would be returned by
|
// newVolumeArray returns array with a single volume that would be returned by
|
||||||
// newVolume() with the same parameters.
|
// newVolume() with the same parameters.
|
||||||
func newVolumeArray(name, capacity, boundToClaimUID, boundToClaimName string, phase api.PersistentVolumePhase, reclaimPolicy api.PersistentVolumeReclaimPolicy, annotations ...string) []*api.PersistentVolume {
|
func newVolumeArray(name, capacity, boundToClaimUID, boundToClaimName string, phase api.PersistentVolumePhase, reclaimPolicy api.PersistentVolumeReclaimPolicy, annotations ...string) []*api.PersistentVolume {
|
||||||
|
@ -21,7 +21,9 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/client/cache"
|
"k8s.io/kubernetes/pkg/client/cache"
|
||||||
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
)
|
)
|
||||||
|
|
||||||
// persistentVolumeOrderedIndex is a cache.Store that keeps persistent volumes indexed by AccessModes and ordered by storage capacity.
|
// persistentVolumeOrderedIndex is a cache.Store that keeps persistent volumes indexed by AccessModes and ordered by storage capacity.
|
||||||
@ -83,6 +85,16 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *api.PersistentVo
|
|||||||
requestedQty := claim.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)]
|
requestedQty := claim.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)]
|
||||||
requestedSize := requestedQty.Value()
|
requestedSize := requestedQty.Value()
|
||||||
|
|
||||||
|
var selector labels.Selector
|
||||||
|
if claim.Spec.Selector != nil {
|
||||||
|
internalSelector, err := unversioned.LabelSelectorAsSelector(claim.Spec.Selector)
|
||||||
|
if err != nil {
|
||||||
|
// should be unreachable code due to validation
|
||||||
|
return nil, fmt.Errorf("error creating internal label selector for claim: %v: %v", claimToClaimKey(claim), err)
|
||||||
|
}
|
||||||
|
selector = internalSelector
|
||||||
|
}
|
||||||
|
|
||||||
for _, modes := range allPossibleModes {
|
for _, modes := range allPossibleModes {
|
||||||
volumes, err := pvIndex.listByAccessModes(modes)
|
volumes, err := pvIndex.listByAccessModes(modes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -97,14 +109,18 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *api.PersistentVo
|
|||||||
// the claim.
|
// the claim.
|
||||||
for _, volume := range volumes {
|
for _, volume := range volumes {
|
||||||
if isVolumeBoundToClaim(volume, claim) {
|
if isVolumeBoundToClaim(volume, claim) {
|
||||||
// Exact match! No search required. This catches both volumes
|
// this claim and volume are bound; return it,
|
||||||
// pre-bound by user and volumes dynamically provisioned by the
|
// whether the claim is prebound or for volumes
|
||||||
// controller.
|
// intended for dynamic provisioning v1
|
||||||
return volume, nil
|
return volume, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// filter out:
|
||||||
|
// - volumes bound to another claim
|
||||||
|
// - volumes whose labels don't match the claim's selector, if specified
|
||||||
if volume.Spec.ClaimRef != nil {
|
if volume.Spec.ClaimRef != nil {
|
||||||
// This volume waits for exact claim or is alredy bound.
|
continue
|
||||||
|
} else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/resource"
|
"k8s.io/kubernetes/pkg/api/resource"
|
||||||
"k8s.io/kubernetes/pkg/api/testapi"
|
"k8s.io/kubernetes/pkg/api/testapi"
|
||||||
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMatchVolume(t *testing.T) {
|
func TestMatchVolume(t *testing.T) {
|
||||||
@ -103,6 +104,72 @@ func TestMatchVolume(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"successful-no-match-due-to-label": {
|
||||||
|
expectedMatch: "",
|
||||||
|
claim: &api.PersistentVolumeClaim{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Name: "claim01",
|
||||||
|
Namespace: "myns",
|
||||||
|
},
|
||||||
|
Spec: api.PersistentVolumeClaimSpec{
|
||||||
|
Selector: &unversioned.LabelSelector{
|
||||||
|
MatchLabels: map[string]string{
|
||||||
|
"should-not-exist": "true",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany, api.ReadWriteOnce},
|
||||||
|
Resources: api.ResourceRequirements{
|
||||||
|
Requests: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("999G"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"successful-no-match-due-to-size-constraint-with-label-selector": {
|
||||||
|
expectedMatch: "",
|
||||||
|
claim: &api.PersistentVolumeClaim{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Name: "claim01",
|
||||||
|
Namespace: "myns",
|
||||||
|
},
|
||||||
|
Spec: api.PersistentVolumeClaimSpec{
|
||||||
|
Selector: &unversioned.LabelSelector{
|
||||||
|
MatchLabels: map[string]string{
|
||||||
|
"should-exist": "true",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany, api.ReadWriteOnce},
|
||||||
|
Resources: api.ResourceRequirements{
|
||||||
|
Requests: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("20000G"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"successful-match-due-with-constraint-and-label-selector": {
|
||||||
|
expectedMatch: "gce-pd-2",
|
||||||
|
claim: &api.PersistentVolumeClaim{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Name: "claim01",
|
||||||
|
Namespace: "myns",
|
||||||
|
},
|
||||||
|
Spec: api.PersistentVolumeClaimSpec{
|
||||||
|
Selector: &unversioned.LabelSelector{
|
||||||
|
MatchLabels: map[string]string{
|
||||||
|
"should-exist": "true",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce},
|
||||||
|
Resources: api.ResourceRequirements{
|
||||||
|
Requests: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("10000G"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, scenario := range scenarios {
|
for name, scenario := range scenarios {
|
||||||
@ -228,8 +295,8 @@ func TestAllPossibleAccessModes(t *testing.T) {
|
|||||||
|
|
||||||
// the mock PVs creates contain 2 types of accessmodes: RWO+ROX and RWO+ROW+RWX
|
// the mock PVs creates contain 2 types of accessmodes: RWO+ROX and RWO+ROW+RWX
|
||||||
possibleModes := index.allPossibleMatchingAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteOnce})
|
possibleModes := index.allPossibleMatchingAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteOnce})
|
||||||
if len(possibleModes) != 2 {
|
if len(possibleModes) != 3 {
|
||||||
t.Errorf("Expected 2 arrays of modes that match RWO, but got %v", len(possibleModes))
|
t.Errorf("Expected 3 arrays of modes that match RWO, but got %v", len(possibleModes))
|
||||||
}
|
}
|
||||||
for _, m := range possibleModes {
|
for _, m := range possibleModes {
|
||||||
if !contains(m, api.ReadWriteOnce) {
|
if !contains(m, api.ReadWriteOnce) {
|
||||||
@ -486,6 +553,26 @@ func createTestVolumes() []*api.PersistentVolume {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
UID: "gce-pd-2",
|
||||||
|
Name: "gce0022",
|
||||||
|
Labels: map[string]string{
|
||||||
|
"should-exist": "true",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: api.PersistentVolumeSpec{
|
||||||
|
Capacity: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("10000G"),
|
||||||
|
},
|
||||||
|
PersistentVolumeSource: api.PersistentVolumeSource{
|
||||||
|
GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{},
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{
|
||||||
|
api.ReadWriteOnce,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user