mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	add delete precondition
This commit is contained in:
		@@ -1169,9 +1169,6 @@
 | 
				
			|||||||
   "v1.DeleteOptions": {
 | 
					   "v1.DeleteOptions": {
 | 
				
			||||||
    "id": "v1.DeleteOptions",
 | 
					    "id": "v1.DeleteOptions",
 | 
				
			||||||
    "description": "DeleteOptions may be provided when deleting an API object",
 | 
					    "description": "DeleteOptions may be provided when deleting an API object",
 | 
				
			||||||
    "required": [
 | 
					 | 
				
			||||||
     "gracePeriodSeconds"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "properties": {
 | 
					    "properties": {
 | 
				
			||||||
     "kind": {
 | 
					     "kind": {
 | 
				
			||||||
      "type": "string",
 | 
					      "type": "string",
 | 
				
			||||||
@@ -1185,9 +1182,27 @@
 | 
				
			|||||||
      "type": "integer",
 | 
					      "type": "integer",
 | 
				
			||||||
      "format": "int64",
 | 
					      "format": "int64",
 | 
				
			||||||
      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
					      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
				
			||||||
 | 
					     },
 | 
				
			||||||
 | 
					     "preconditions": {
 | 
				
			||||||
 | 
					      "$ref": "v1.Preconditions",
 | 
				
			||||||
 | 
					      "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned."
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
 | 
					   "v1.Preconditions": {
 | 
				
			||||||
 | 
					    "id": "v1.Preconditions",
 | 
				
			||||||
 | 
					    "description": "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.",
 | 
				
			||||||
 | 
					    "properties": {
 | 
				
			||||||
 | 
					     "uid": {
 | 
				
			||||||
 | 
					      "$ref": "types.UID",
 | 
				
			||||||
 | 
					      "description": "Specifies the target UID."
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					   "types.UID": {
 | 
				
			||||||
 | 
					    "id": "types.UID",
 | 
				
			||||||
 | 
					    "properties": {}
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
   "unversioned.APIResourceList": {
 | 
					   "unversioned.APIResourceList": {
 | 
				
			||||||
    "id": "unversioned.APIResourceList",
 | 
					    "id": "unversioned.APIResourceList",
 | 
				
			||||||
    "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.",
 | 
					    "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2410,9 +2410,6 @@
 | 
				
			|||||||
   "v1.DeleteOptions": {
 | 
					   "v1.DeleteOptions": {
 | 
				
			||||||
    "id": "v1.DeleteOptions",
 | 
					    "id": "v1.DeleteOptions",
 | 
				
			||||||
    "description": "DeleteOptions may be provided when deleting an API object",
 | 
					    "description": "DeleteOptions may be provided when deleting an API object",
 | 
				
			||||||
    "required": [
 | 
					 | 
				
			||||||
     "gracePeriodSeconds"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "properties": {
 | 
					    "properties": {
 | 
				
			||||||
     "kind": {
 | 
					     "kind": {
 | 
				
			||||||
      "type": "string",
 | 
					      "type": "string",
 | 
				
			||||||
@@ -2426,9 +2423,27 @@
 | 
				
			|||||||
      "type": "integer",
 | 
					      "type": "integer",
 | 
				
			||||||
      "format": "int64",
 | 
					      "format": "int64",
 | 
				
			||||||
      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
					      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
				
			||||||
 | 
					     },
 | 
				
			||||||
 | 
					     "preconditions": {
 | 
				
			||||||
 | 
					      "$ref": "v1.Preconditions",
 | 
				
			||||||
 | 
					      "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned."
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
 | 
					   "v1.Preconditions": {
 | 
				
			||||||
 | 
					    "id": "v1.Preconditions",
 | 
				
			||||||
 | 
					    "description": "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.",
 | 
				
			||||||
 | 
					    "properties": {
 | 
				
			||||||
 | 
					     "uid": {
 | 
				
			||||||
 | 
					      "$ref": "types.UID",
 | 
				
			||||||
 | 
					      "description": "Specifies the target UID."
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					   "types.UID": {
 | 
				
			||||||
 | 
					    "id": "types.UID",
 | 
				
			||||||
 | 
					    "properties": {}
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
   "unversioned.APIResourceList": {
 | 
					   "unversioned.APIResourceList": {
 | 
				
			||||||
    "id": "unversioned.APIResourceList",
 | 
					    "id": "unversioned.APIResourceList",
 | 
				
			||||||
    "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.",
 | 
					    "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7783,9 +7783,6 @@
 | 
				
			|||||||
   "v1.DeleteOptions": {
 | 
					   "v1.DeleteOptions": {
 | 
				
			||||||
    "id": "v1.DeleteOptions",
 | 
					    "id": "v1.DeleteOptions",
 | 
				
			||||||
    "description": "DeleteOptions may be provided when deleting an API object",
 | 
					    "description": "DeleteOptions may be provided when deleting an API object",
 | 
				
			||||||
    "required": [
 | 
					 | 
				
			||||||
     "gracePeriodSeconds"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "properties": {
 | 
					    "properties": {
 | 
				
			||||||
     "kind": {
 | 
					     "kind": {
 | 
				
			||||||
      "type": "string",
 | 
					      "type": "string",
 | 
				
			||||||
@@ -7799,9 +7796,27 @@
 | 
				
			|||||||
      "type": "integer",
 | 
					      "type": "integer",
 | 
				
			||||||
      "format": "int64",
 | 
					      "format": "int64",
 | 
				
			||||||
      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
					      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
				
			||||||
 | 
					     },
 | 
				
			||||||
 | 
					     "preconditions": {
 | 
				
			||||||
 | 
					      "$ref": "v1.Preconditions",
 | 
				
			||||||
 | 
					      "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned."
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
 | 
					   "v1.Preconditions": {
 | 
				
			||||||
 | 
					    "id": "v1.Preconditions",
 | 
				
			||||||
 | 
					    "description": "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.",
 | 
				
			||||||
 | 
					    "properties": {
 | 
				
			||||||
 | 
					     "uid": {
 | 
				
			||||||
 | 
					      "$ref": "types.UID",
 | 
				
			||||||
 | 
					      "description": "Specifies the target UID."
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					   "types.UID": {
 | 
				
			||||||
 | 
					    "id": "types.UID",
 | 
				
			||||||
 | 
					    "properties": {}
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
   "v1beta1.DeploymentList": {
 | 
					   "v1beta1.DeploymentList": {
 | 
				
			||||||
    "id": "v1beta1.DeploymentList",
 | 
					    "id": "v1beta1.DeploymentList",
 | 
				
			||||||
    "description": "DeploymentList is a list of Deployments.",
 | 
					    "description": "DeploymentList is a list of Deployments.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15118,9 +15118,6 @@
 | 
				
			|||||||
   "v1.DeleteOptions": {
 | 
					   "v1.DeleteOptions": {
 | 
				
			||||||
    "id": "v1.DeleteOptions",
 | 
					    "id": "v1.DeleteOptions",
 | 
				
			||||||
    "description": "DeleteOptions may be provided when deleting an API object",
 | 
					    "description": "DeleteOptions may be provided when deleting an API object",
 | 
				
			||||||
    "required": [
 | 
					 | 
				
			||||||
     "gracePeriodSeconds"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "properties": {
 | 
					    "properties": {
 | 
				
			||||||
     "kind": {
 | 
					     "kind": {
 | 
				
			||||||
      "type": "string",
 | 
					      "type": "string",
 | 
				
			||||||
@@ -15134,9 +15131,27 @@
 | 
				
			|||||||
      "type": "integer",
 | 
					      "type": "integer",
 | 
				
			||||||
      "format": "int64",
 | 
					      "format": "int64",
 | 
				
			||||||
      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
					      "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately."
 | 
				
			||||||
 | 
					     },
 | 
				
			||||||
 | 
					     "preconditions": {
 | 
				
			||||||
 | 
					      "$ref": "v1.Preconditions",
 | 
				
			||||||
 | 
					      "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned."
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
 | 
					   "v1.Preconditions": {
 | 
				
			||||||
 | 
					    "id": "v1.Preconditions",
 | 
				
			||||||
 | 
					    "description": "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.",
 | 
				
			||||||
 | 
					    "properties": {
 | 
				
			||||||
 | 
					     "uid": {
 | 
				
			||||||
 | 
					      "$ref": "types.UID",
 | 
				
			||||||
 | 
					      "description": "Specifies the target UID."
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					   "types.UID": {
 | 
				
			||||||
 | 
					    "id": "types.UID",
 | 
				
			||||||
 | 
					    "properties": {}
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
   "v1.EndpointsList": {
 | 
					   "v1.EndpointsList": {
 | 
				
			||||||
    "id": "v1.EndpointsList",
 | 
					    "id": "v1.EndpointsList",
 | 
				
			||||||
    "description": "EndpointsList is a list of endpoints.",
 | 
					    "description": "EndpointsList is a list of endpoints.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,6 +97,7 @@ func main() {
 | 
				
			|||||||
	generator := kruntime.NewConversionGenerator(api.Scheme, versionPath)
 | 
						generator := kruntime.NewConversionGenerator(api.Scheme, versionPath)
 | 
				
			||||||
	apiShort := generator.AddImport(path.Join(pkgBase, "api"))
 | 
						apiShort := generator.AddImport(path.Join(pkgBase, "api"))
 | 
				
			||||||
	generator.AddImport(path.Join(pkgBase, "api/resource"))
 | 
						generator.AddImport(path.Join(pkgBase, "api/resource"))
 | 
				
			||||||
 | 
						generator.AddImport(path.Join(pkgBase, "types"))
 | 
				
			||||||
	// TODO(wojtek-t): Change the overwrites to a flag.
 | 
						// TODO(wojtek-t): Change the overwrites to a flag.
 | 
				
			||||||
	generator.OverwritePackage(gv.Version, "")
 | 
						generator.OverwritePackage(gv.Version, "")
 | 
				
			||||||
	for _, knownType := range api.Scheme.KnownTypes(gv) {
 | 
						for _, knownType := range api.Scheme.KnownTypes(gv) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,8 @@
 | 
				
			|||||||
      "SelectorRegexp": "k8s[.]io",
 | 
					      "SelectorRegexp": "k8s[.]io",
 | 
				
			||||||
      "AllowedPrefixes": [
 | 
					      "AllowedPrefixes": [
 | 
				
			||||||
        "k8s.io/kubernetes/cmd/libs/go2idl",
 | 
					        "k8s.io/kubernetes/cmd/libs/go2idl",
 | 
				
			||||||
        "k8s.io/kubernetes/third_party"
 | 
					        "k8s.io/kubernetes/third_party",
 | 
				
			||||||
 | 
					        "k8s.io/kubernetes/pkg/util/sets"
 | 
				
			||||||
      ]
 | 
					      ]
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -286,7 +286,7 @@ func (c *Context) ExecutePackage(outDir string, p Package) error {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(errors) > 0 {
 | 
						if len(errors) > 0 {
 | 
				
			||||||
		return fmt.Errorf("errors in package %q:\n%v\n", p.Name(), strings.Join(errs2strings(errors), "\n"))
 | 
							return fmt.Errorf("errors in package %q:\n%v\n", p.Path(), strings.Join(errs2strings(errors), "\n"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,7 +74,6 @@ func main() {
 | 
				
			|||||||
		"k8s.io/kubernetes/cmd/",
 | 
							"k8s.io/kubernetes/cmd/",
 | 
				
			||||||
		"k8s.io/kubernetes/plugin/",
 | 
							"k8s.io/kubernetes/plugin/",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	arguments.OutputBase = ""
 | 
					 | 
				
			||||||
	arguments.Recursive = true
 | 
						arguments.Recursive = true
 | 
				
			||||||
	// arguments.VerifyOnly = true
 | 
						// arguments.VerifyOnly = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -428,10 +428,17 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
 | 
				
			|||||||
<tr>
 | 
					<tr>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</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">false</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
</tr>
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">preconditions</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.</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="#_v1_preconditions">v1.Preconditions</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -593,6 +600,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1_preconditions">v1.Preconditions</h3>
 | 
				
			||||||
 | 
					<div class="paragraph">
 | 
				
			||||||
 | 
					<p>Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.</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">uid</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the target UID.</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="#_types_uid">types.UID</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					</tbody>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_crossversionobjectreference">v1.CrossVersionObjectReference</h3>
 | 
					<h3 id="_v1_crossversionobjectreference">v1.CrossVersionObjectReference</h3>
 | 
				
			||||||
@@ -1131,6 +1172,10 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_types_uid">types.UID</h3>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_unversioned_statuscause">unversioned.StatusCause</h3>
 | 
					<h3 id="_unversioned_statuscause">unversioned.StatusCause</h3>
 | 
				
			||||||
@@ -1233,7 +1278,7 @@ Examples:<br>
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div id="footer">
 | 
					<div id="footer">
 | 
				
			||||||
<div id="footer-text">
 | 
					<div id="footer-text">
 | 
				
			||||||
Last updated 2016-03-15 23:42:40 UTC
 | 
					Last updated 2016-03-21 22:46:55 UTC
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -383,6 +383,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
 | 
				
			|||||||
<h2 id="_definitions">Definitions</h2>
 | 
					<h2 id="_definitions">Definitions</h2>
 | 
				
			||||||
<div class="sectionbody">
 | 
					<div class="sectionbody">
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1_preconditions">v1.Preconditions</h3>
 | 
				
			||||||
 | 
					<div class="paragraph">
 | 
				
			||||||
 | 
					<p>Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.</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">uid</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the target UID.</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="#_types_uid">types.UID</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					</tbody>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_selinuxoptions">v1.SELinuxOptions</h3>
 | 
					<h3 id="_v1_selinuxoptions">v1.SELinuxOptions</h3>
 | 
				
			||||||
<div class="paragraph">
 | 
					<div class="paragraph">
 | 
				
			||||||
<p>SELinuxOptions are the labels to be applied to the container</p>
 | 
					<p>SELinuxOptions are the labels to be applied to the container</p>
 | 
				
			||||||
@@ -1693,6 +1727,10 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_types_uid">types.UID</h3>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_hostpathvolumesource">v1.HostPathVolumeSource</h3>
 | 
					<h3 id="_v1_hostpathvolumesource">v1.HostPathVolumeSource</h3>
 | 
				
			||||||
@@ -2875,10 +2913,17 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
 | 
				
			|||||||
<tr>
 | 
					<tr>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</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">false</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
</tr>
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">preconditions</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.</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="#_v1_preconditions">v1.Preconditions</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3875,7 +3920,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div id="footer">
 | 
					<div id="footer">
 | 
				
			||||||
<div id="footer-text">
 | 
					<div id="footer-text">
 | 
				
			||||||
Last updated 2016-03-15 23:42:36 UTC
 | 
					Last updated 2016-03-21 22:46:48 UTC
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -595,6 +595,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1_preconditions">v1.Preconditions</h3>
 | 
				
			||||||
 | 
					<div class="paragraph">
 | 
				
			||||||
 | 
					<p>Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.</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">uid</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the target UID.</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="#_types_uid">types.UID</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					</tbody>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_objectfieldselector">v1.ObjectFieldSelector</h3>
 | 
					<h3 id="_v1_objectfieldselector">v1.ObjectFieldSelector</h3>
 | 
				
			||||||
@@ -828,6 +862,61 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1beta1_replicasetlist">v1beta1.ReplicaSetList</h3>
 | 
				
			||||||
 | 
					<div class="paragraph">
 | 
				
			||||||
 | 
					<p>ReplicaSetList is a collection of ReplicaSets.</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">kind</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: <a href="http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds">http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds</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">string</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">apiVersion</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: <a href="http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources">http://releases.k8s.io/HEAD/docs/devel/api-conventions.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">string</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">metadata</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Standard list metadata. More info: <a href="http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds">http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds</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"><a href="#_unversioned_listmeta">unversioned.ListMeta</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">items</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">List of ReplicaSets. More info: <a href="http://releases.k8s.io/HEAD/docs/user-guide/replication-controller.md">http://releases.k8s.io/HEAD/docs/user-guide/replication-controller.md</a></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"><a href="#_v1beta1_replicaset">v1beta1.ReplicaSet</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_cephfsvolumesource">v1.CephFSVolumeSource</h3>
 | 
					<h3 id="_v1_cephfsvolumesource">v1.CephFSVolumeSource</h3>
 | 
				
			||||||
@@ -897,61 +986,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
<div class="sect2">
 | 
					 | 
				
			||||||
<h3 id="_v1beta1_replicasetlist">v1beta1.ReplicaSetList</h3>
 | 
					 | 
				
			||||||
<div class="paragraph">
 | 
					 | 
				
			||||||
<p>ReplicaSetList is a collection of ReplicaSets.</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">kind</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: <a href="http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds">http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds</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">string</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					 | 
				
			||||||
</tr>
 | 
					 | 
				
			||||||
<tr>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">apiVersion</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: <a href="http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources">http://releases.k8s.io/HEAD/docs/devel/api-conventions.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">string</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					 | 
				
			||||||
</tr>
 | 
					 | 
				
			||||||
<tr>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">metadata</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Standard list metadata. More info: <a href="http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds">http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds</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"><a href="#_unversioned_listmeta">unversioned.ListMeta</a></p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					 | 
				
			||||||
</tr>
 | 
					 | 
				
			||||||
<tr>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">items</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">List of ReplicaSets. More info: <a href="http://releases.k8s.io/HEAD/docs/user-guide/replication-controller.md">http://releases.k8s.io/HEAD/docs/user-guide/replication-controller.md</a></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"><a href="#_v1beta1_replicaset">v1beta1.ReplicaSet</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="_v1beta1_ingressstatus">v1beta1.IngressStatus</h3>
 | 
					<h3 id="_v1beta1_ingressstatus">v1beta1.IngressStatus</h3>
 | 
				
			||||||
@@ -1799,6 +1833,10 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_types_uid">types.UID</h3>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_iscsivolumesource">v1.ISCSIVolumeSource</h3>
 | 
					<h3 id="_v1_iscsivolumesource">v1.ISCSIVolumeSource</h3>
 | 
				
			||||||
@@ -2579,10 +2617,17 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
 | 
				
			|||||||
<tr>
 | 
					<tr>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</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">false</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
</tr>
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">preconditions</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.</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="#_v1_preconditions">v1.Preconditions</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4843,40 +4888,6 @@ Both these may change in the future. Incoming requests are matched against the h
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
<div class="sect2">
 | 
					 | 
				
			||||||
<h3 id="_v1_hostpathvolumesource">v1.HostPathVolumeSource</h3>
 | 
					 | 
				
			||||||
<div class="paragraph">
 | 
					 | 
				
			||||||
<p>Represents a host path mapped into a pod. Host path volumes do not support ownership management or SELinux relabeling.</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">path</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Path of the directory on the host. More info: <a href="http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#hostpath">http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#hostpath</a></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>
 | 
					 | 
				
			||||||
</tbody>
 | 
					 | 
				
			||||||
</table>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1beta1_replicaset">v1beta1.ReplicaSet</h3>
 | 
					<h3 id="_v1beta1_replicaset">v1beta1.ReplicaSet</h3>
 | 
				
			||||||
@@ -4939,6 +4950,40 @@ Both these may change in the future. Incoming requests are matched against the h
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1_hostpathvolumesource">v1.HostPathVolumeSource</h3>
 | 
				
			||||||
 | 
					<div class="paragraph">
 | 
				
			||||||
 | 
					<p>Represents a host path mapped into a pod. Host path volumes do not support ownership management or SELinux relabeling.</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">path</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Path of the directory on the host. More info: <a href="http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#hostpath">http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#hostpath</a></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>
 | 
				
			||||||
 | 
					</tbody>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1beta1_daemonset">v1beta1.DaemonSet</h3>
 | 
					<h3 id="_v1beta1_daemonset">v1beta1.DaemonSet</h3>
 | 
				
			||||||
@@ -5865,7 +5910,7 @@ Both these may change in the future. Incoming requests are matched against the h
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div id="footer">
 | 
					<div id="footer">
 | 
				
			||||||
<div id="footer-text">
 | 
					<div id="footer-text">
 | 
				
			||||||
Last updated 2016-03-22 18:43:10 UTC
 | 
					Last updated 2016-03-25 18:19:00 UTC
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -594,6 +594,40 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1_preconditions">v1.Preconditions</h3>
 | 
				
			||||||
 | 
					<div class="paragraph">
 | 
				
			||||||
 | 
					<p>Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.</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">uid</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the target UID.</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="#_types_uid">types.UID</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					</tbody>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_selinuxoptions">v1.SELinuxOptions</h3>
 | 
					<h3 id="_v1_selinuxoptions">v1.SELinuxOptions</h3>
 | 
				
			||||||
@@ -1495,6 +1529,47 @@ Examples:<br>
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1_capabilities">v1.Capabilities</h3>
 | 
				
			||||||
 | 
					<div class="paragraph">
 | 
				
			||||||
 | 
					<p>Adds and removes POSIX capabilities from running containers.</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">add</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Added capabilities</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="#_v1_capability">v1.Capability</a> array</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">drop</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Removed capabilities</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="#_v1_capability">v1.Capability</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_configmap">v1.ConfigMap</h3>
 | 
					<h3 id="_v1_configmap">v1.ConfigMap</h3>
 | 
				
			||||||
@@ -1550,47 +1625,6 @@ Examples:<br>
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
<div class="sect2">
 | 
					 | 
				
			||||||
<h3 id="_v1_capabilities">v1.Capabilities</h3>
 | 
					 | 
				
			||||||
<div class="paragraph">
 | 
					 | 
				
			||||||
<p>Adds and removes POSIX capabilities from running containers.</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">add</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Added capabilities</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="#_v1_capability">v1.Capability</a> array</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					 | 
				
			||||||
</tr>
 | 
					 | 
				
			||||||
<tr>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">drop</p></td>
 | 
					 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Removed capabilities</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="#_v1_capability">v1.Capability</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_podtemplatelist">v1.PodTemplateList</h3>
 | 
					<h3 id="_v1_podtemplatelist">v1.PodTemplateList</h3>
 | 
				
			||||||
@@ -1983,6 +2017,10 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_types_uid">types.UID</h3>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_azurefilevolumesource">v1.AzureFileVolumeSource</h3>
 | 
					<h3 id="_v1_azurefilevolumesource">v1.AzureFileVolumeSource</h3>
 | 
				
			||||||
@@ -3321,10 +3359,17 @@ The resulting set of endpoints can be viewed as:<br>
 | 
				
			|||||||
<tr>
 | 
					<tr>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">gracePeriodSeconds</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.</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">false</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
 | 
				
			||||||
<td class="tableblock halign-left valign-top"></td>
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
</tr>
 | 
					</tr>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">preconditions</p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"><p class="tableblock">Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.</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="#_v1_preconditions">v1.Preconditions</a></p></td>
 | 
				
			||||||
 | 
					<td class="tableblock halign-left valign-top"></td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -6749,6 +6794,10 @@ The resulting set of endpoints can be viewed as:<br>
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="sect2">
 | 
				
			||||||
 | 
					<h3 id="_v1_persistentvolumeaccessmode">v1.PersistentVolumeAccessMode</h3>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_resourcerequirements">v1.ResourceRequirements</h3>
 | 
					<h3 id="_v1_resourcerequirements">v1.ResourceRequirements</h3>
 | 
				
			||||||
@@ -6790,10 +6839,6 @@ The resulting set of endpoints can be viewed as:<br>
 | 
				
			|||||||
</tbody>
 | 
					</tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
<div class="sect2">
 | 
					 | 
				
			||||||
<h3 id="_v1_persistentvolumeaccessmode">v1.PersistentVolumeAccessMode</h3>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="sect2">
 | 
					<div class="sect2">
 | 
				
			||||||
<h3 id="_v1_componentstatus">v1.ComponentStatus</h3>
 | 
					<h3 id="_v1_componentstatus">v1.ComponentStatus</h3>
 | 
				
			||||||
@@ -7735,7 +7780,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-03-15 23:42:24 UTC
 | 
					Last updated 2016-03-21 22:46:36 UTC
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,7 @@ import (
 | 
				
			|||||||
	fields "k8s.io/kubernetes/pkg/fields"
 | 
						fields "k8s.io/kubernetes/pkg/fields"
 | 
				
			||||||
	labels "k8s.io/kubernetes/pkg/labels"
 | 
						labels "k8s.io/kubernetes/pkg/labels"
 | 
				
			||||||
	runtime "k8s.io/kubernetes/pkg/runtime"
 | 
						runtime "k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
 | 
						types "k8s.io/kubernetes/pkg/types"
 | 
				
			||||||
	intstr "k8s.io/kubernetes/pkg/util/intstr"
 | 
						intstr "k8s.io/kubernetes/pkg/util/intstr"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -140,6 +141,7 @@ func init() {
 | 
				
			|||||||
		DeepCopy_api_PodTemplate,
 | 
							DeepCopy_api_PodTemplate,
 | 
				
			||||||
		DeepCopy_api_PodTemplateList,
 | 
							DeepCopy_api_PodTemplateList,
 | 
				
			||||||
		DeepCopy_api_PodTemplateSpec,
 | 
							DeepCopy_api_PodTemplateSpec,
 | 
				
			||||||
 | 
							DeepCopy_api_Preconditions,
 | 
				
			||||||
		DeepCopy_api_PreferredSchedulingTerm,
 | 
							DeepCopy_api_PreferredSchedulingTerm,
 | 
				
			||||||
		DeepCopy_api_Probe,
 | 
							DeepCopy_api_Probe,
 | 
				
			||||||
		DeepCopy_api_RBDVolumeSource,
 | 
							DeepCopy_api_RBDVolumeSource,
 | 
				
			||||||
@@ -617,6 +619,15 @@ func DeepCopy_api_DeleteOptions(in DeleteOptions, out *DeleteOptions, c *convers
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		out.GracePeriodSeconds = nil
 | 
							out.GracePeriodSeconds = nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if in.Preconditions != nil {
 | 
				
			||||||
 | 
							in, out := in.Preconditions, &out.Preconditions
 | 
				
			||||||
 | 
							*out = new(Preconditions)
 | 
				
			||||||
 | 
							if err := DeepCopy_api_Preconditions(*in, *out, c); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.Preconditions = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2247,6 +2258,21 @@ func DeepCopy_api_PodTemplateSpec(in PodTemplateSpec, out *PodTemplateSpec, c *c
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func DeepCopy_api_Preconditions(in Preconditions, out *Preconditions, c *conversion.Cloner) error {
 | 
				
			||||||
 | 
						if in.UID != nil {
 | 
				
			||||||
 | 
							in, out := in.UID, &out.UID
 | 
				
			||||||
 | 
							*out = new(types.UID)
 | 
				
			||||||
 | 
							if newVal, err := c.DeepCopy(*in); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								**out = newVal.(types.UID)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.UID = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DeepCopy_api_PreferredSchedulingTerm(in PreferredSchedulingTerm, out *PreferredSchedulingTerm, c *conversion.Cloner) error {
 | 
					func DeepCopy_api_PreferredSchedulingTerm(in PreferredSchedulingTerm, out *PreferredSchedulingTerm, c *conversion.Cloner) error {
 | 
				
			||||||
	out.Weight = in.Weight
 | 
						out.Weight = in.Weight
 | 
				
			||||||
	if err := DeepCopy_api_NodeSelectorTerm(in.Preference, &out.Preference, c); err != nil {
 | 
						if err := DeepCopy_api_NodeSelectorTerm(in.Preference, &out.Preference, c); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -163,7 +163,7 @@ func NewConflict(qualifiedResource unversioned.GroupResource, name string, err e
 | 
				
			|||||||
			Kind:  qualifiedResource.Resource,
 | 
								Kind:  qualifiedResource.Resource,
 | 
				
			||||||
			Name:  name,
 | 
								Name:  name,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Message: fmt.Sprintf("%s %q cannot be updated: %v", qualifiedResource.String(), name, err),
 | 
							Message: fmt.Sprintf("Operation cannot be fulfilled on %s %q: %v", qualifiedResource.String(), name, err),
 | 
				
			||||||
	}}
 | 
						}}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,6 +71,8 @@ func InterpretUpdateError(err error, qualifiedResource unversioned.GroupResource
 | 
				
			|||||||
		return errors.NewServerTimeout(qualifiedResource, "update", 2) // TODO: make configurable or handled at a higher level
 | 
							return errors.NewServerTimeout(qualifiedResource, "update", 2) // TODO: make configurable or handled at a higher level
 | 
				
			||||||
	case storage.IsNotFound(err):
 | 
						case storage.IsNotFound(err):
 | 
				
			||||||
		return errors.NewNotFound(qualifiedResource, name)
 | 
							return errors.NewNotFound(qualifiedResource, name)
 | 
				
			||||||
 | 
						case storage.IsInternalError(err):
 | 
				
			||||||
 | 
							return errors.NewInternalError(err)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -84,6 +86,22 @@ func InterpretDeleteError(err error, qualifiedResource unversioned.GroupResource
 | 
				
			|||||||
		return errors.NewNotFound(qualifiedResource, name)
 | 
							return errors.NewNotFound(qualifiedResource, name)
 | 
				
			||||||
	case storage.IsUnreachable(err):
 | 
						case storage.IsUnreachable(err):
 | 
				
			||||||
		return errors.NewServerTimeout(qualifiedResource, "delete", 2) // TODO: make configurable or handled at a higher level
 | 
							return errors.NewServerTimeout(qualifiedResource, "delete", 2) // TODO: make configurable or handled at a higher level
 | 
				
			||||||
 | 
						case storage.IsTestFailed(err), storage.IsNodeExist(err):
 | 
				
			||||||
 | 
							return errors.NewConflict(qualifiedResource, name, err)
 | 
				
			||||||
 | 
						case storage.IsInternalError(err):
 | 
				
			||||||
 | 
							return errors.NewInternalError(err)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InterpretWatchError converts a generic error on a watch
 | 
				
			||||||
 | 
					// operation into the appropriate API error.
 | 
				
			||||||
 | 
					func InterpretWatchError(err error, resource unversioned.GroupResource, name string) error {
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case storage.IsInvalidError(err):
 | 
				
			||||||
 | 
							invalidError, _ := err.(storage.InvalidError)
 | 
				
			||||||
 | 
							return errors.NewInvalid(unversioned.GroupKind{resource.Group, resource.Resource}, name, invalidError.Errs)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/fields"
 | 
						"k8s.io/kubernetes/pkg/fields"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/labels"
 | 
						"k8s.io/kubernetes/pkg/labels"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/types"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/util/sets"
 | 
						"k8s.io/kubernetes/pkg/util/sets"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/davecgh/go-spew/spew"
 | 
						"github.com/davecgh/go-spew/spew"
 | 
				
			||||||
@@ -204,6 +205,19 @@ func NewDeleteOptions(grace int64) *DeleteOptions {
 | 
				
			|||||||
	return &DeleteOptions{GracePeriodSeconds: &grace}
 | 
						return &DeleteOptions{GracePeriodSeconds: &grace}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewPreconditionDeleteOptions returns a DeleteOptions with a UID precondition set.
 | 
				
			||||||
 | 
					func NewPreconditionDeleteOptions(uid string) *DeleteOptions {
 | 
				
			||||||
 | 
						u := types.UID(uid)
 | 
				
			||||||
 | 
						p := Preconditions{UID: &u}
 | 
				
			||||||
 | 
						return &DeleteOptions{Preconditions: &p}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewUIDPreconditions returns a Preconditions with UID set.
 | 
				
			||||||
 | 
					func NewUIDPreconditions(uid string) *Preconditions {
 | 
				
			||||||
 | 
						u := types.UID(uid)
 | 
				
			||||||
 | 
						return &Preconditions{UID: &u}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// this function aims to check if the service's ClusterIP is set or not
 | 
					// this function aims to check if the service's ClusterIP is set or not
 | 
				
			||||||
// the objective is not to perform validation here
 | 
					// the objective is not to perform validation here
 | 
				
			||||||
func IsServiceIPSet(service *Service) bool {
 | 
					func IsServiceIPSet(service *Service) bool {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,9 +17,11 @@ limitations under the License.
 | 
				
			|||||||
package rest
 | 
					package rest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/errors"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -28,7 +30,11 @@ import (
 | 
				
			|||||||
// API conventions.
 | 
					// API conventions.
 | 
				
			||||||
type RESTDeleteStrategy interface {
 | 
					type RESTDeleteStrategy interface {
 | 
				
			||||||
	runtime.ObjectTyper
 | 
						runtime.ObjectTyper
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RESTGracefulDeleteStrategy must be implemented by the registry that supports
 | 
				
			||||||
 | 
					// graceful deletion.
 | 
				
			||||||
 | 
					type RESTGracefulDeleteStrategy interface {
 | 
				
			||||||
	// CheckGracefulDelete should return true if the object can be gracefully deleted and set
 | 
						// CheckGracefulDelete should return true if the object can be gracefully deleted and set
 | 
				
			||||||
	// any default values on the DeleteOptions.
 | 
						// any default values on the DeleteOptions.
 | 
				
			||||||
	CheckGracefulDelete(obj runtime.Object, options *api.DeleteOptions) bool
 | 
						CheckGracefulDelete(obj runtime.Object, options *api.DeleteOptions) bool
 | 
				
			||||||
@@ -40,14 +46,18 @@ type RESTDeleteStrategy interface {
 | 
				
			|||||||
// condition cannot be checked or the gracePeriodSeconds is invalid. The options argument may be updated with
 | 
					// condition cannot be checked or the gracePeriodSeconds is invalid. The options argument may be updated with
 | 
				
			||||||
// default values if graceful is true.
 | 
					// default values if graceful is true.
 | 
				
			||||||
func BeforeDelete(strategy RESTDeleteStrategy, ctx api.Context, obj runtime.Object, options *api.DeleteOptions) (graceful, gracefulPending bool, err error) {
 | 
					func BeforeDelete(strategy RESTDeleteStrategy, ctx api.Context, obj runtime.Object, options *api.DeleteOptions) (graceful, gracefulPending bool, err error) {
 | 
				
			||||||
	if strategy == nil {
 | 
						objectMeta, gvk, kerr := objectMetaAndKind(strategy, obj)
 | 
				
			||||||
		return false, false, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	objectMeta, _, kerr := objectMetaAndKind(strategy, obj)
 | 
					 | 
				
			||||||
	if kerr != nil {
 | 
						if kerr != nil {
 | 
				
			||||||
		return false, false, kerr
 | 
							return false, false, kerr
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// Checking the Preconditions here to fail early. They'll be enforced later on when we actually do the deletion, too.
 | 
				
			||||||
 | 
						if options.Preconditions != nil && options.Preconditions.UID != nil && *options.Preconditions.UID != objectMeta.UID {
 | 
				
			||||||
 | 
							return false, false, errors.NewConflict(unversioned.GroupResource{gvk.Group, gvk.Kind}, objectMeta.Name, fmt.Errorf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *options.Preconditions.UID, objectMeta.UID))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						gracefulStrategy, ok := strategy.(RESTGracefulDeleteStrategy)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return false, false, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	// if the object is already being deleted
 | 
						// if the object is already being deleted
 | 
				
			||||||
	if objectMeta.DeletionTimestamp != nil {
 | 
						if objectMeta.DeletionTimestamp != nil {
 | 
				
			||||||
		// if we are already being deleted, we may only shorten the deletion grace period
 | 
							// if we are already being deleted, we may only shorten the deletion grace period
 | 
				
			||||||
@@ -73,7 +83,7 @@ func BeforeDelete(strategy RESTDeleteStrategy, ctx api.Context, obj runtime.Obje
 | 
				
			|||||||
		return false, true, nil
 | 
							return false, true, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !strategy.CheckGracefulDelete(obj, options) {
 | 
						if !gracefulStrategy.CheckGracefulDelete(obj, options) {
 | 
				
			||||||
		return false, false, nil
 | 
							return false, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	now := unversioned.NewTime(unversioned.Now().Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
 | 
						now := unversioned.NewTime(unversioned.Now().Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/fields"
 | 
						"k8s.io/kubernetes/pkg/fields"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/labels"
 | 
						"k8s.io/kubernetes/pkg/labels"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/types"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/util/wait"
 | 
						"k8s.io/kubernetes/pkg/util/wait"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -154,12 +155,14 @@ func (t *Tester) TestUpdate(valid runtime.Object, setFn SetFunc, getFn GetFunc,
 | 
				
			|||||||
		t.testUpdateRejectsMismatchedNamespace(copyOrDie(valid), setFn)
 | 
							t.testUpdateRejectsMismatchedNamespace(copyOrDie(valid), setFn)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	t.testUpdateInvokesValidation(copyOrDie(valid), setFn, invalidUpdateFn...)
 | 
						t.testUpdateInvokesValidation(copyOrDie(valid), setFn, invalidUpdateFn...)
 | 
				
			||||||
 | 
						t.testUpdateWithWrongUID(copyOrDie(valid), setFn, getFn)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Test deleting an object.
 | 
					// Test deleting an object.
 | 
				
			||||||
func (t *Tester) TestDelete(valid runtime.Object, setFn SetFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) {
 | 
					func (t *Tester) TestDelete(valid runtime.Object, setFn SetFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) {
 | 
				
			||||||
	t.testDeleteNonExist(copyOrDie(valid))
 | 
						t.testDeleteNonExist(copyOrDie(valid))
 | 
				
			||||||
	t.testDeleteNoGraceful(copyOrDie(valid), setFn, getFn, isNotFoundFn)
 | 
						t.testDeleteNoGraceful(copyOrDie(valid), setFn, getFn, isNotFoundFn)
 | 
				
			||||||
 | 
						t.testDeleteWithUID(copyOrDie(valid), setFn, getFn, isNotFoundFn)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Test gracefully deleting an object.
 | 
					// Test gracefully deleting an object.
 | 
				
			||||||
@@ -474,6 +477,26 @@ func (t *Tester) testUpdateInvokesValidation(obj runtime.Object, setFn SetFunc,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (t *Tester) testUpdateWithWrongUID(obj runtime.Object, setFn SetFunc, getFn GetFunc) {
 | 
				
			||||||
 | 
						ctx := t.TestContext()
 | 
				
			||||||
 | 
						foo := copyOrDie(obj)
 | 
				
			||||||
 | 
						t.setObjectMeta(foo, "foo5")
 | 
				
			||||||
 | 
						objectMeta := t.getObjectMetaOrFail(foo)
 | 
				
			||||||
 | 
						objectMeta.UID = types.UID("UID0000")
 | 
				
			||||||
 | 
						if err := setFn(ctx, foo); err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						objectMeta.UID = types.UID("UID1111")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						obj, created, err := t.storage.(rest.Updater).Update(ctx, foo)
 | 
				
			||||||
 | 
						if created || obj != nil {
 | 
				
			||||||
 | 
							t.Errorf("expected nil object and no creation for object: %v", foo)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err == nil || !errors.IsConflict(err) {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (t *Tester) testUpdateOnNotFound(obj runtime.Object) {
 | 
					func (t *Tester) testUpdateOnNotFound(obj runtime.Object) {
 | 
				
			||||||
	t.setObjectMeta(obj, "foo")
 | 
						t.setObjectMeta(obj, "foo")
 | 
				
			||||||
	_, created, err := t.storage.(rest.Updater).Update(t.TestContext(), obj)
 | 
						_, created, err := t.storage.(rest.Updater).Update(t.TestContext(), obj)
 | 
				
			||||||
@@ -557,6 +580,42 @@ func (t *Tester) testDeleteNonExist(obj runtime.Object) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//  This test the fast-fail path. We test that the precondition gets verified
 | 
				
			||||||
 | 
					//  again before deleting the object in tests of pkg/storage/etcd.
 | 
				
			||||||
 | 
					func (t *Tester) testDeleteWithUID(obj runtime.Object, setFn SetFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) {
 | 
				
			||||||
 | 
						ctx := t.TestContext()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						foo := copyOrDie(obj)
 | 
				
			||||||
 | 
						t.setObjectMeta(foo, "foo1")
 | 
				
			||||||
 | 
						objectMeta := t.getObjectMetaOrFail(foo)
 | 
				
			||||||
 | 
						objectMeta.UID = types.UID("UID0000")
 | 
				
			||||||
 | 
						if err := setFn(ctx, foo); err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						obj, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewPreconditionDeleteOptions("UID1111"))
 | 
				
			||||||
 | 
						if err == nil || !errors.IsConflict(err) {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						obj, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewPreconditionDeleteOptions("UID0000"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !t.returnDeletedObject {
 | 
				
			||||||
 | 
							if status, ok := obj.(*unversioned.Status); !ok {
 | 
				
			||||||
 | 
								t.Errorf("expected status of delete, got %v", status)
 | 
				
			||||||
 | 
							} else if status.Status != unversioned.StatusSuccess {
 | 
				
			||||||
 | 
								t.Errorf("expected success, got: %v", status.Status)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = getFn(ctx, foo)
 | 
				
			||||||
 | 
						if err == nil || !isNotFoundFn(err) {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// =============================================================================
 | 
					// =============================================================================
 | 
				
			||||||
// Graceful Deletion tests.
 | 
					// Graceful Deletion tests.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37015,6 +37015,209 @@ func (x *Binding) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
	z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
						z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperEncoder(e)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						if x == nil {
 | 
				
			||||||
 | 
							r.EncodeNil()
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yym1 := z.EncBinary()
 | 
				
			||||||
 | 
							_ = yym1
 | 
				
			||||||
 | 
							if false {
 | 
				
			||||||
 | 
							} else if z.HasExtensions() && z.EncExt(x) {
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								yysep2 := !z.EncBinary()
 | 
				
			||||||
 | 
								yy2arr2 := z.EncBasicHandle().StructToArray
 | 
				
			||||||
 | 
								var yyq2 [1]bool
 | 
				
			||||||
 | 
								_, _, _ = yysep2, yyq2, yy2arr2
 | 
				
			||||||
 | 
								const yyr2 bool = false
 | 
				
			||||||
 | 
								yyq2[0] = x.UID != nil
 | 
				
			||||||
 | 
								var yynn2 int
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									r.EncodeArrayStart(1)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									yynn2 = 0
 | 
				
			||||||
 | 
									for _, b := range yyq2 {
 | 
				
			||||||
 | 
										if b {
 | 
				
			||||||
 | 
											yynn2++
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									r.EncodeMapStart(yynn2)
 | 
				
			||||||
 | 
									yynn2 = 0
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
									if yyq2[0] {
 | 
				
			||||||
 | 
										if x.UID == nil {
 | 
				
			||||||
 | 
											r.EncodeNil()
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											yy4 := *x.UID
 | 
				
			||||||
 | 
											yym5 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym5
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else if z.HasExtensions() && z.EncExt(yy4) {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeString(codecSelferC_UTF81234, string(yy4))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										r.EncodeNil()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if yyq2[0] {
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
 | 
										r.EncodeString(codecSelferC_UTF81234, string("uid"))
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
 | 
										if x.UID == nil {
 | 
				
			||||||
 | 
											r.EncodeNil()
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											yy6 := *x.UID
 | 
				
			||||||
 | 
											yym7 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym7
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else if z.HasExtensions() && z.EncExt(yy6) {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeString(codecSelferC_UTF81234, string(yy6))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerMapEnd1234)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) CodecDecodeSelf(d *codec1978.Decoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperDecoder(d)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						yym1 := z.DecBinary()
 | 
				
			||||||
 | 
						_ = yym1
 | 
				
			||||||
 | 
						if false {
 | 
				
			||||||
 | 
						} else if z.HasExtensions() && z.DecExt(x) {
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yyct2 := r.ContainerType()
 | 
				
			||||||
 | 
							if yyct2 == codecSelferValueTypeMap1234 {
 | 
				
			||||||
 | 
								yyl2 := r.ReadMapStart()
 | 
				
			||||||
 | 
								if yyl2 == 0 {
 | 
				
			||||||
 | 
									z.DecSendContainerState(codecSelfer_containerMapEnd1234)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									x.codecDecodeSelfFromMap(yyl2, d)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else if yyct2 == codecSelferValueTypeArray1234 {
 | 
				
			||||||
 | 
								yyl2 := r.ReadArrayStart()
 | 
				
			||||||
 | 
								if yyl2 == 0 {
 | 
				
			||||||
 | 
									z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									x.codecDecodeSelfFromArray(yyl2, d)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperDecoder(d)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						var yys3Slc = z.DecScratchBuffer() // default slice to decode into
 | 
				
			||||||
 | 
						_ = yys3Slc
 | 
				
			||||||
 | 
						var yyhl3 bool = l >= 0
 | 
				
			||||||
 | 
						for yyj3 := 0; ; yyj3++ {
 | 
				
			||||||
 | 
							if yyhl3 {
 | 
				
			||||||
 | 
								if yyj3 >= l {
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if r.CheckBreak() {
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
 | 
							yys3Slc = r.DecodeBytes(yys3Slc, true, true)
 | 
				
			||||||
 | 
							yys3 := string(yys3Slc)
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
 | 
							switch yys3 {
 | 
				
			||||||
 | 
							case "uid":
 | 
				
			||||||
 | 
								if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
									if x.UID != nil {
 | 
				
			||||||
 | 
										x.UID = nil
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if x.UID == nil {
 | 
				
			||||||
 | 
										x.UID = new(pkg1_types.UID)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									yym5 := z.DecBinary()
 | 
				
			||||||
 | 
									_ = yym5
 | 
				
			||||||
 | 
									if false {
 | 
				
			||||||
 | 
									} else if z.HasExtensions() && z.DecExt(x.UID) {
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										*((*string)(x.UID)) = r.DecodeString()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								z.DecStructFieldNotFound(-1, yys3)
 | 
				
			||||||
 | 
							} // end switch yys3
 | 
				
			||||||
 | 
						} // end for yyj3
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerMapEnd1234)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperDecoder(d)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						var yyj6 int
 | 
				
			||||||
 | 
						var yyb6 bool
 | 
				
			||||||
 | 
						var yyhl6 bool = l >= 0
 | 
				
			||||||
 | 
						yyj6++
 | 
				
			||||||
 | 
						if yyhl6 {
 | 
				
			||||||
 | 
							yyb6 = yyj6 > l
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yyb6 = r.CheckBreak()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if yyb6 {
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
						if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
							if x.UID != nil {
 | 
				
			||||||
 | 
								x.UID = nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if x.UID == nil {
 | 
				
			||||||
 | 
								x.UID = new(pkg1_types.UID)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							yym8 := z.DecBinary()
 | 
				
			||||||
 | 
							_ = yym8
 | 
				
			||||||
 | 
							if false {
 | 
				
			||||||
 | 
							} else if z.HasExtensions() && z.DecExt(x.UID) {
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								*((*string)(x.UID)) = r.DecodeString()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							yyj6++
 | 
				
			||||||
 | 
							if yyhl6 {
 | 
				
			||||||
 | 
								yyb6 = yyj6 > l
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								yyb6 = r.CheckBreak()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if yyb6 {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
							z.DecStructFieldNotFound(yyj6-1, "")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
					func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			||||||
	var h codecSelfer1234
 | 
						var h codecSelfer1234
 | 
				
			||||||
	z, r := codec1978.GenHelperEncoder(e)
 | 
						z, r := codec1978.GenHelperEncoder(e)
 | 
				
			||||||
@@ -37029,16 +37232,18 @@ func (x *DeleteOptions) 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[1] = x.Kind != ""
 | 
								yyq2[0] = x.GracePeriodSeconds != nil
 | 
				
			||||||
			yyq2[2] = x.APIVersion != ""
 | 
								yyq2[1] = x.Preconditions != nil
 | 
				
			||||||
 | 
								yyq2[2] = x.Kind != ""
 | 
				
			||||||
 | 
								yyq2[3] = x.APIVersion != ""
 | 
				
			||||||
			var yynn2 int
 | 
								var yynn2 int
 | 
				
			||||||
			if yyr2 || yy2arr2 {
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
				r.EncodeArrayStart(3)
 | 
									r.EncodeArrayStart(4)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				yynn2 = 1
 | 
									yynn2 = 0
 | 
				
			||||||
				for _, b := range yyq2 {
 | 
									for _, b := range yyq2 {
 | 
				
			||||||
					if b {
 | 
										if b {
 | 
				
			||||||
						yynn2++
 | 
											yynn2++
 | 
				
			||||||
@@ -37049,55 +37254,59 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			if yyr2 || yy2arr2 {
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
				if x.GracePeriodSeconds == nil {
 | 
									if yyq2[0] {
 | 
				
			||||||
					r.EncodeNil()
 | 
										if x.GracePeriodSeconds == nil {
 | 
				
			||||||
				} else {
 | 
											r.EncodeNil()
 | 
				
			||||||
					yy4 := *x.GracePeriodSeconds
 | 
					 | 
				
			||||||
					yym5 := z.EncBinary()
 | 
					 | 
				
			||||||
					_ = yym5
 | 
					 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeInt(int64(yy4))
 | 
											yy4 := *x.GracePeriodSeconds
 | 
				
			||||||
 | 
											yym5 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym5
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeInt(int64(yy4))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										r.EncodeNil()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
									if yyq2[0] {
 | 
				
			||||||
				r.EncodeString(codecSelferC_UTF81234, string("gracePeriodSeconds"))
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
										r.EncodeString(codecSelferC_UTF81234, string("gracePeriodSeconds"))
 | 
				
			||||||
				if x.GracePeriodSeconds == nil {
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
					r.EncodeNil()
 | 
										if x.GracePeriodSeconds == nil {
 | 
				
			||||||
				} else {
 | 
											r.EncodeNil()
 | 
				
			||||||
					yy6 := *x.GracePeriodSeconds
 | 
					 | 
				
			||||||
					yym7 := z.EncBinary()
 | 
					 | 
				
			||||||
					_ = yym7
 | 
					 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeInt(int64(yy6))
 | 
											yy6 := *x.GracePeriodSeconds
 | 
				
			||||||
 | 
											yym7 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym7
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeInt(int64(yy6))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if yyr2 || yy2arr2 {
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
				if yyq2[1] {
 | 
									if yyq2[1] {
 | 
				
			||||||
					yym9 := z.EncBinary()
 | 
										if x.Preconditions == nil {
 | 
				
			||||||
					_ = yym9
 | 
											r.EncodeNil()
 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
											x.Preconditions.CodecEncodeSelf(e)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, "")
 | 
										r.EncodeNil()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				if yyq2[1] {
 | 
									if yyq2[1] {
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, string("kind"))
 | 
										r.EncodeString(codecSelferC_UTF81234, string("preconditions"))
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
					yym10 := z.EncBinary()
 | 
										if x.Preconditions == nil {
 | 
				
			||||||
					_ = yym10
 | 
											r.EncodeNil()
 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
											x.Preconditions.CodecEncodeSelf(e)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -37108,7 +37317,7 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			|||||||
					_ = yym12
 | 
										_ = yym12
 | 
				
			||||||
					if false {
 | 
										if false {
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, "")
 | 
										r.EncodeString(codecSelferC_UTF81234, "")
 | 
				
			||||||
@@ -37116,11 +37325,36 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			|||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				if yyq2[2] {
 | 
									if yyq2[2] {
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, string("apiVersion"))
 | 
										r.EncodeString(codecSelferC_UTF81234, string("kind"))
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
					yym13 := z.EncBinary()
 | 
										yym13 := z.EncBinary()
 | 
				
			||||||
					_ = yym13
 | 
										_ = yym13
 | 
				
			||||||
					if false {
 | 
										if false {
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
									if yyq2[3] {
 | 
				
			||||||
 | 
										yym15 := z.EncBinary()
 | 
				
			||||||
 | 
										_ = yym15
 | 
				
			||||||
 | 
										if false {
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										r.EncodeString(codecSelferC_UTF81234, "")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if yyq2[3] {
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
 | 
										r.EncodeString(codecSelferC_UTF81234, string("apiVersion"))
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
 | 
										yym16 := z.EncBinary()
 | 
				
			||||||
 | 
										_ = yym16
 | 
				
			||||||
 | 
										if false {
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -37203,6 +37437,17 @@ func (x *DeleteOptions) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
					*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
										*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							case "preconditions":
 | 
				
			||||||
 | 
								if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
									if x.Preconditions != nil {
 | 
				
			||||||
 | 
										x.Preconditions = nil
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if x.Preconditions == nil {
 | 
				
			||||||
 | 
										x.Preconditions = new(Preconditions)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									x.Preconditions.CodecDecodeSelf(d)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		case "kind":
 | 
							case "kind":
 | 
				
			||||||
			if r.TryDecodeAsNil() {
 | 
								if r.TryDecodeAsNil() {
 | 
				
			||||||
				x.Kind = ""
 | 
									x.Kind = ""
 | 
				
			||||||
@@ -37226,16 +37471,16 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
	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 yyj9 int
 | 
				
			||||||
	var yyb8 bool
 | 
						var yyb9 bool
 | 
				
			||||||
	var yyhl8 bool = l >= 0
 | 
						var yyhl9 bool = l >= 0
 | 
				
			||||||
	yyj8++
 | 
						yyj9++
 | 
				
			||||||
	if yyhl8 {
 | 
						if yyhl9 {
 | 
				
			||||||
		yyb8 = yyj8 > l
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		yyb8 = r.CheckBreak()
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if yyb8 {
 | 
						if yyb9 {
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -37248,20 +37493,41 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
		if x.GracePeriodSeconds == nil {
 | 
							if x.GracePeriodSeconds == nil {
 | 
				
			||||||
			x.GracePeriodSeconds = new(int64)
 | 
								x.GracePeriodSeconds = new(int64)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		yym10 := z.DecBinary()
 | 
							yym11 := z.DecBinary()
 | 
				
			||||||
		_ = yym10
 | 
							_ = yym11
 | 
				
			||||||
		if false {
 | 
							if false {
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
								*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	yyj8++
 | 
						yyj9++
 | 
				
			||||||
	if yyhl8 {
 | 
						if yyhl9 {
 | 
				
			||||||
		yyb8 = yyj8 > l
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		yyb8 = r.CheckBreak()
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if yyb8 {
 | 
						if yyb9 {
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
						if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
							if x.Preconditions != nil {
 | 
				
			||||||
 | 
								x.Preconditions = nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if x.Preconditions == nil {
 | 
				
			||||||
 | 
								x.Preconditions = new(Preconditions)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							x.Preconditions.CodecDecodeSelf(d)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						yyj9++
 | 
				
			||||||
 | 
						if yyhl9 {
 | 
				
			||||||
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if yyb9 {
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -37271,13 +37537,13 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		x.Kind = string(r.DecodeString())
 | 
							x.Kind = string(r.DecodeString())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	yyj8++
 | 
						yyj9++
 | 
				
			||||||
	if yyhl8 {
 | 
						if yyhl9 {
 | 
				
			||||||
		yyb8 = yyj8 > l
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		yyb8 = r.CheckBreak()
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if yyb8 {
 | 
						if yyb9 {
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -37288,17 +37554,17 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
		x.APIVersion = string(r.DecodeString())
 | 
							x.APIVersion = string(r.DecodeString())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		yyj8++
 | 
							yyj9++
 | 
				
			||||||
		if yyhl8 {
 | 
							if yyhl9 {
 | 
				
			||||||
			yyb8 = yyj8 > l
 | 
								yyb9 = yyj9 > l
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			yyb8 = r.CheckBreak()
 | 
								yyb9 = r.CheckBreak()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if yyb8 {
 | 
							if yyb9 {
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
		z.DecStructFieldNotFound(yyj8-1, "")
 | 
							z.DecStructFieldNotFound(yyj9-1, "")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
						z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1887,6 +1887,12 @@ type Binding struct {
 | 
				
			|||||||
	Target ObjectReference `json:"target"`
 | 
						Target ObjectReference `json:"target"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
 | 
				
			||||||
 | 
					type Preconditions struct {
 | 
				
			||||||
 | 
						// Specifies the target UID.
 | 
				
			||||||
 | 
						UID *types.UID `json:"uid,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeleteOptions may be provided when deleting an API object
 | 
					// DeleteOptions may be provided when deleting an API object
 | 
				
			||||||
type DeleteOptions struct {
 | 
					type DeleteOptions struct {
 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
@@ -1894,7 +1900,11 @@ type DeleteOptions struct {
 | 
				
			|||||||
	// Optional duration in seconds before the object should be deleted. Value must be non-negative integer.
 | 
						// Optional duration in seconds before the object should be deleted. Value must be non-negative integer.
 | 
				
			||||||
	// The value zero indicates delete immediately. If this value is nil, the default grace period for the
 | 
						// The value zero indicates delete immediately. If this value is nil, the default grace period for the
 | 
				
			||||||
	// specified type will be used.
 | 
						// specified type will be used.
 | 
				
			||||||
	GracePeriodSeconds *int64 `json:"gracePeriodSeconds"`
 | 
						GracePeriodSeconds *int64 `json:"gracePeriodSeconds,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be
 | 
				
			||||||
 | 
						// returned.
 | 
				
			||||||
 | 
						Preconditions *Preconditions `json:"preconditions,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExportOptions is the query options to the standard REST get call.
 | 
					// ExportOptions is the query options to the standard REST get call.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -174,10 +174,10 @@ const (
 | 
				
			|||||||
	// Status code 409
 | 
						// Status code 409
 | 
				
			||||||
	StatusReasonAlreadyExists StatusReason = "AlreadyExists"
 | 
						StatusReasonAlreadyExists StatusReason = "AlreadyExists"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// StatusReasonConflict means the requested update operation cannot be completed
 | 
						// StatusReasonConflict means the requested operation cannot be completed
 | 
				
			||||||
	// due to a conflict in the operation. The client may need to alter the request.
 | 
						// due to a conflict in the operation. The client may need to alter the
 | 
				
			||||||
	// Each resource may define custom details that indicate the nature of the
 | 
						// request. Each resource may define custom details that indicate the
 | 
				
			||||||
	// conflict.
 | 
						// nature of the conflict.
 | 
				
			||||||
	// Status code 409
 | 
						// Status code 409
 | 
				
			||||||
	StatusReasonConflict StatusReason = "Conflict"
 | 
						StatusReasonConflict StatusReason = "Conflict"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ import (
 | 
				
			|||||||
	unversioned "k8s.io/kubernetes/pkg/api/unversioned"
 | 
						unversioned "k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
	conversion "k8s.io/kubernetes/pkg/conversion"
 | 
						conversion "k8s.io/kubernetes/pkg/conversion"
 | 
				
			||||||
	runtime "k8s.io/kubernetes/pkg/runtime"
 | 
						runtime "k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
 | 
						types "k8s.io/kubernetes/pkg/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func autoConvert_api_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(in *api.AWSElasticBlockStoreVolumeSource, out *AWSElasticBlockStoreVolumeSource, s conversion.Scope) error {
 | 
					func autoConvert_api_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(in *api.AWSElasticBlockStoreVolumeSource, out *AWSElasticBlockStoreVolumeSource, s conversion.Scope) error {
 | 
				
			||||||
@@ -567,6 +568,15 @@ func autoConvert_api_DeleteOptions_To_v1_DeleteOptions(in *api.DeleteOptions, ou
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		out.GracePeriodSeconds = nil
 | 
							out.GracePeriodSeconds = nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// unable to generate simple pointer conversion for api.Preconditions -> v1.Preconditions
 | 
				
			||||||
 | 
						if in.Preconditions != nil {
 | 
				
			||||||
 | 
							out.Preconditions = new(Preconditions)
 | 
				
			||||||
 | 
							if err := Convert_api_Preconditions_To_v1_Preconditions(in.Preconditions, out.Preconditions, s); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.Preconditions = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2451,6 +2461,23 @@ func Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(in *api.PodTemplateSpec,
 | 
				
			|||||||
	return autoConvert_api_PodTemplateSpec_To_v1_PodTemplateSpec(in, out, s)
 | 
						return autoConvert_api_PodTemplateSpec_To_v1_PodTemplateSpec(in, out, s)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func autoConvert_api_Preconditions_To_v1_Preconditions(in *api.Preconditions, out *Preconditions, s conversion.Scope) error {
 | 
				
			||||||
 | 
						if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
 | 
				
			||||||
 | 
							defaulting.(func(*api.Preconditions))(in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if in.UID != nil {
 | 
				
			||||||
 | 
							out.UID = new(types.UID)
 | 
				
			||||||
 | 
							*out.UID = *in.UID
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.UID = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Convert_api_Preconditions_To_v1_Preconditions(in *api.Preconditions, out *Preconditions, s conversion.Scope) error {
 | 
				
			||||||
 | 
						return autoConvert_api_Preconditions_To_v1_Preconditions(in, out, s)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func autoConvert_api_Probe_To_v1_Probe(in *api.Probe, out *Probe, s conversion.Scope) error {
 | 
					func autoConvert_api_Probe_To_v1_Probe(in *api.Probe, out *Probe, s conversion.Scope) error {
 | 
				
			||||||
	if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
 | 
						if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
 | 
				
			||||||
		defaulting.(func(*api.Probe))(in)
 | 
							defaulting.(func(*api.Probe))(in)
 | 
				
			||||||
@@ -3872,6 +3899,15 @@ func autoConvert_v1_DeleteOptions_To_api_DeleteOptions(in *DeleteOptions, out *a
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		out.GracePeriodSeconds = nil
 | 
							out.GracePeriodSeconds = nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// unable to generate simple pointer conversion for v1.Preconditions -> api.Preconditions
 | 
				
			||||||
 | 
						if in.Preconditions != nil {
 | 
				
			||||||
 | 
							out.Preconditions = new(api.Preconditions)
 | 
				
			||||||
 | 
							if err := Convert_v1_Preconditions_To_api_Preconditions(in.Preconditions, out.Preconditions, s); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.Preconditions = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -5692,6 +5728,23 @@ func Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(in *PodTemplateSpec, out
 | 
				
			|||||||
	return autoConvert_v1_PodTemplateSpec_To_api_PodTemplateSpec(in, out, s)
 | 
						return autoConvert_v1_PodTemplateSpec_To_api_PodTemplateSpec(in, out, s)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func autoConvert_v1_Preconditions_To_api_Preconditions(in *Preconditions, out *api.Preconditions, s conversion.Scope) error {
 | 
				
			||||||
 | 
						if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
 | 
				
			||||||
 | 
							defaulting.(func(*Preconditions))(in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if in.UID != nil {
 | 
				
			||||||
 | 
							out.UID = new(types.UID)
 | 
				
			||||||
 | 
							*out.UID = *in.UID
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.UID = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Convert_v1_Preconditions_To_api_Preconditions(in *Preconditions, out *api.Preconditions, s conversion.Scope) error {
 | 
				
			||||||
 | 
						return autoConvert_v1_Preconditions_To_api_Preconditions(in, out, s)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func autoConvert_v1_Probe_To_api_Probe(in *Probe, out *api.Probe, s conversion.Scope) error {
 | 
					func autoConvert_v1_Probe_To_api_Probe(in *Probe, out *api.Probe, s conversion.Scope) error {
 | 
				
			||||||
	if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
 | 
						if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
 | 
				
			||||||
		defaulting.(func(*Probe))(in)
 | 
							defaulting.(func(*Probe))(in)
 | 
				
			||||||
@@ -6616,6 +6669,7 @@ func init() {
 | 
				
			|||||||
		autoConvert_api_PodTemplateSpec_To_v1_PodTemplateSpec,
 | 
							autoConvert_api_PodTemplateSpec_To_v1_PodTemplateSpec,
 | 
				
			||||||
		autoConvert_api_PodTemplate_To_v1_PodTemplate,
 | 
							autoConvert_api_PodTemplate_To_v1_PodTemplate,
 | 
				
			||||||
		autoConvert_api_Pod_To_v1_Pod,
 | 
							autoConvert_api_Pod_To_v1_Pod,
 | 
				
			||||||
 | 
							autoConvert_api_Preconditions_To_v1_Preconditions,
 | 
				
			||||||
		autoConvert_api_Probe_To_v1_Probe,
 | 
							autoConvert_api_Probe_To_v1_Probe,
 | 
				
			||||||
		autoConvert_api_RBDVolumeSource_To_v1_RBDVolumeSource,
 | 
							autoConvert_api_RBDVolumeSource_To_v1_RBDVolumeSource,
 | 
				
			||||||
		autoConvert_api_RangeAllocation_To_v1_RangeAllocation,
 | 
							autoConvert_api_RangeAllocation_To_v1_RangeAllocation,
 | 
				
			||||||
@@ -6748,6 +6802,7 @@ func init() {
 | 
				
			|||||||
		autoConvert_v1_PodTemplateSpec_To_api_PodTemplateSpec,
 | 
							autoConvert_v1_PodTemplateSpec_To_api_PodTemplateSpec,
 | 
				
			||||||
		autoConvert_v1_PodTemplate_To_api_PodTemplate,
 | 
							autoConvert_v1_PodTemplate_To_api_PodTemplate,
 | 
				
			||||||
		autoConvert_v1_Pod_To_api_Pod,
 | 
							autoConvert_v1_Pod_To_api_Pod,
 | 
				
			||||||
 | 
							autoConvert_v1_Preconditions_To_api_Preconditions,
 | 
				
			||||||
		autoConvert_v1_Probe_To_api_Probe,
 | 
							autoConvert_v1_Probe_To_api_Probe,
 | 
				
			||||||
		autoConvert_v1_RBDVolumeSource_To_api_RBDVolumeSource,
 | 
							autoConvert_v1_RBDVolumeSource_To_api_RBDVolumeSource,
 | 
				
			||||||
		autoConvert_v1_RangeAllocation_To_api_RangeAllocation,
 | 
							autoConvert_v1_RangeAllocation_To_api_RangeAllocation,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ import (
 | 
				
			|||||||
	unversioned "k8s.io/kubernetes/pkg/api/unversioned"
 | 
						unversioned "k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
	conversion "k8s.io/kubernetes/pkg/conversion"
 | 
						conversion "k8s.io/kubernetes/pkg/conversion"
 | 
				
			||||||
	runtime "k8s.io/kubernetes/pkg/runtime"
 | 
						runtime "k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
 | 
						types "k8s.io/kubernetes/pkg/types"
 | 
				
			||||||
	intstr "k8s.io/kubernetes/pkg/util/intstr"
 | 
						intstr "k8s.io/kubernetes/pkg/util/intstr"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -137,6 +138,7 @@ func init() {
 | 
				
			|||||||
		DeepCopy_v1_PodTemplate,
 | 
							DeepCopy_v1_PodTemplate,
 | 
				
			||||||
		DeepCopy_v1_PodTemplateList,
 | 
							DeepCopy_v1_PodTemplateList,
 | 
				
			||||||
		DeepCopy_v1_PodTemplateSpec,
 | 
							DeepCopy_v1_PodTemplateSpec,
 | 
				
			||||||
 | 
							DeepCopy_v1_Preconditions,
 | 
				
			||||||
		DeepCopy_v1_PreferredSchedulingTerm,
 | 
							DeepCopy_v1_PreferredSchedulingTerm,
 | 
				
			||||||
		DeepCopy_v1_Probe,
 | 
							DeepCopy_v1_Probe,
 | 
				
			||||||
		DeepCopy_v1_RBDVolumeSource,
 | 
							DeepCopy_v1_RBDVolumeSource,
 | 
				
			||||||
@@ -595,6 +597,15 @@ func DeepCopy_v1_DeleteOptions(in DeleteOptions, out *DeleteOptions, c *conversi
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		out.GracePeriodSeconds = nil
 | 
							out.GracePeriodSeconds = nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if in.Preconditions != nil {
 | 
				
			||||||
 | 
							in, out := in.Preconditions, &out.Preconditions
 | 
				
			||||||
 | 
							*out = new(Preconditions)
 | 
				
			||||||
 | 
							if err := DeepCopy_v1_Preconditions(*in, *out, c); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.Preconditions = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2195,6 +2206,21 @@ func DeepCopy_v1_PodTemplateSpec(in PodTemplateSpec, out *PodTemplateSpec, c *co
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func DeepCopy_v1_Preconditions(in Preconditions, out *Preconditions, c *conversion.Cloner) error {
 | 
				
			||||||
 | 
						if in.UID != nil {
 | 
				
			||||||
 | 
							in, out := in.UID, &out.UID
 | 
				
			||||||
 | 
							*out = new(types.UID)
 | 
				
			||||||
 | 
							if newVal, err := c.DeepCopy(*in); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								**out = newVal.(types.UID)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							out.UID = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DeepCopy_v1_PreferredSchedulingTerm(in PreferredSchedulingTerm, out *PreferredSchedulingTerm, c *conversion.Cloner) error {
 | 
					func DeepCopy_v1_PreferredSchedulingTerm(in PreferredSchedulingTerm, out *PreferredSchedulingTerm, c *conversion.Cloner) error {
 | 
				
			||||||
	out.Weight = in.Weight
 | 
						out.Weight = in.Weight
 | 
				
			||||||
	if err := DeepCopy_v1_NodeSelectorTerm(in.Preference, &out.Preference, c); err != nil {
 | 
						if err := DeepCopy_v1_NodeSelectorTerm(in.Preference, &out.Preference, c); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36735,6 +36735,209 @@ func (x *Binding) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
	z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
						z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperEncoder(e)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						if x == nil {
 | 
				
			||||||
 | 
							r.EncodeNil()
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yym1 := z.EncBinary()
 | 
				
			||||||
 | 
							_ = yym1
 | 
				
			||||||
 | 
							if false {
 | 
				
			||||||
 | 
							} else if z.HasExtensions() && z.EncExt(x) {
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								yysep2 := !z.EncBinary()
 | 
				
			||||||
 | 
								yy2arr2 := z.EncBasicHandle().StructToArray
 | 
				
			||||||
 | 
								var yyq2 [1]bool
 | 
				
			||||||
 | 
								_, _, _ = yysep2, yyq2, yy2arr2
 | 
				
			||||||
 | 
								const yyr2 bool = false
 | 
				
			||||||
 | 
								yyq2[0] = x.UID != nil
 | 
				
			||||||
 | 
								var yynn2 int
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									r.EncodeArrayStart(1)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									yynn2 = 0
 | 
				
			||||||
 | 
									for _, b := range yyq2 {
 | 
				
			||||||
 | 
										if b {
 | 
				
			||||||
 | 
											yynn2++
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									r.EncodeMapStart(yynn2)
 | 
				
			||||||
 | 
									yynn2 = 0
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
									if yyq2[0] {
 | 
				
			||||||
 | 
										if x.UID == nil {
 | 
				
			||||||
 | 
											r.EncodeNil()
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											yy4 := *x.UID
 | 
				
			||||||
 | 
											yym5 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym5
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else if z.HasExtensions() && z.EncExt(yy4) {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeString(codecSelferC_UTF81234, string(yy4))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										r.EncodeNil()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if yyq2[0] {
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
 | 
										r.EncodeString(codecSelferC_UTF81234, string("uid"))
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
 | 
										if x.UID == nil {
 | 
				
			||||||
 | 
											r.EncodeNil()
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											yy6 := *x.UID
 | 
				
			||||||
 | 
											yym7 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym7
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else if z.HasExtensions() && z.EncExt(yy6) {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeString(codecSelferC_UTF81234, string(yy6))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerMapEnd1234)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) CodecDecodeSelf(d *codec1978.Decoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperDecoder(d)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						yym1 := z.DecBinary()
 | 
				
			||||||
 | 
						_ = yym1
 | 
				
			||||||
 | 
						if false {
 | 
				
			||||||
 | 
						} else if z.HasExtensions() && z.DecExt(x) {
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yyct2 := r.ContainerType()
 | 
				
			||||||
 | 
							if yyct2 == codecSelferValueTypeMap1234 {
 | 
				
			||||||
 | 
								yyl2 := r.ReadMapStart()
 | 
				
			||||||
 | 
								if yyl2 == 0 {
 | 
				
			||||||
 | 
									z.DecSendContainerState(codecSelfer_containerMapEnd1234)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									x.codecDecodeSelfFromMap(yyl2, d)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else if yyct2 == codecSelferValueTypeArray1234 {
 | 
				
			||||||
 | 
								yyl2 := r.ReadArrayStart()
 | 
				
			||||||
 | 
								if yyl2 == 0 {
 | 
				
			||||||
 | 
									z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									x.codecDecodeSelfFromArray(yyl2, d)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperDecoder(d)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						var yys3Slc = z.DecScratchBuffer() // default slice to decode into
 | 
				
			||||||
 | 
						_ = yys3Slc
 | 
				
			||||||
 | 
						var yyhl3 bool = l >= 0
 | 
				
			||||||
 | 
						for yyj3 := 0; ; yyj3++ {
 | 
				
			||||||
 | 
							if yyhl3 {
 | 
				
			||||||
 | 
								if yyj3 >= l {
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if r.CheckBreak() {
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
 | 
							yys3Slc = r.DecodeBytes(yys3Slc, true, true)
 | 
				
			||||||
 | 
							yys3 := string(yys3Slc)
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
 | 
							switch yys3 {
 | 
				
			||||||
 | 
							case "uid":
 | 
				
			||||||
 | 
								if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
									if x.UID != nil {
 | 
				
			||||||
 | 
										x.UID = nil
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if x.UID == nil {
 | 
				
			||||||
 | 
										x.UID = new(pkg1_types.UID)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									yym5 := z.DecBinary()
 | 
				
			||||||
 | 
									_ = yym5
 | 
				
			||||||
 | 
									if false {
 | 
				
			||||||
 | 
									} else if z.HasExtensions() && z.DecExt(x.UID) {
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										*((*string)(x.UID)) = r.DecodeString()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								z.DecStructFieldNotFound(-1, yys3)
 | 
				
			||||||
 | 
							} // end switch yys3
 | 
				
			||||||
 | 
						} // end for yyj3
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerMapEnd1234)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Preconditions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			||||||
 | 
						var h codecSelfer1234
 | 
				
			||||||
 | 
						z, r := codec1978.GenHelperDecoder(d)
 | 
				
			||||||
 | 
						_, _, _ = h, z, r
 | 
				
			||||||
 | 
						var yyj6 int
 | 
				
			||||||
 | 
						var yyb6 bool
 | 
				
			||||||
 | 
						var yyhl6 bool = l >= 0
 | 
				
			||||||
 | 
						yyj6++
 | 
				
			||||||
 | 
						if yyhl6 {
 | 
				
			||||||
 | 
							yyb6 = yyj6 > l
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yyb6 = r.CheckBreak()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if yyb6 {
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
						if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
							if x.UID != nil {
 | 
				
			||||||
 | 
								x.UID = nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if x.UID == nil {
 | 
				
			||||||
 | 
								x.UID = new(pkg1_types.UID)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							yym8 := z.DecBinary()
 | 
				
			||||||
 | 
							_ = yym8
 | 
				
			||||||
 | 
							if false {
 | 
				
			||||||
 | 
							} else if z.HasExtensions() && z.DecExt(x.UID) {
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								*((*string)(x.UID)) = r.DecodeString()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							yyj6++
 | 
				
			||||||
 | 
							if yyhl6 {
 | 
				
			||||||
 | 
								yyb6 = yyj6 > l
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								yyb6 = r.CheckBreak()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if yyb6 {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
							z.DecStructFieldNotFound(yyj6-1, "")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
					func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			||||||
	var h codecSelfer1234
 | 
						var h codecSelfer1234
 | 
				
			||||||
	z, r := codec1978.GenHelperEncoder(e)
 | 
						z, r := codec1978.GenHelperEncoder(e)
 | 
				
			||||||
@@ -36749,16 +36952,18 @@ func (x *DeleteOptions) 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[1] = x.Kind != ""
 | 
								yyq2[0] = x.GracePeriodSeconds != nil
 | 
				
			||||||
			yyq2[2] = x.APIVersion != ""
 | 
								yyq2[1] = x.Preconditions != nil
 | 
				
			||||||
 | 
								yyq2[2] = x.Kind != ""
 | 
				
			||||||
 | 
								yyq2[3] = x.APIVersion != ""
 | 
				
			||||||
			var yynn2 int
 | 
								var yynn2 int
 | 
				
			||||||
			if yyr2 || yy2arr2 {
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
				r.EncodeArrayStart(3)
 | 
									r.EncodeArrayStart(4)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				yynn2 = 1
 | 
									yynn2 = 0
 | 
				
			||||||
				for _, b := range yyq2 {
 | 
									for _, b := range yyq2 {
 | 
				
			||||||
					if b {
 | 
										if b {
 | 
				
			||||||
						yynn2++
 | 
											yynn2++
 | 
				
			||||||
@@ -36769,55 +36974,59 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			if yyr2 || yy2arr2 {
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
				if x.GracePeriodSeconds == nil {
 | 
									if yyq2[0] {
 | 
				
			||||||
					r.EncodeNil()
 | 
										if x.GracePeriodSeconds == nil {
 | 
				
			||||||
				} else {
 | 
											r.EncodeNil()
 | 
				
			||||||
					yy4 := *x.GracePeriodSeconds
 | 
					 | 
				
			||||||
					yym5 := z.EncBinary()
 | 
					 | 
				
			||||||
					_ = yym5
 | 
					 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeInt(int64(yy4))
 | 
											yy4 := *x.GracePeriodSeconds
 | 
				
			||||||
 | 
											yym5 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym5
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeInt(int64(yy4))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										r.EncodeNil()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
									if yyq2[0] {
 | 
				
			||||||
				r.EncodeString(codecSelferC_UTF81234, string("gracePeriodSeconds"))
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
										r.EncodeString(codecSelferC_UTF81234, string("gracePeriodSeconds"))
 | 
				
			||||||
				if x.GracePeriodSeconds == nil {
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
					r.EncodeNil()
 | 
										if x.GracePeriodSeconds == nil {
 | 
				
			||||||
				} else {
 | 
											r.EncodeNil()
 | 
				
			||||||
					yy6 := *x.GracePeriodSeconds
 | 
					 | 
				
			||||||
					yym7 := z.EncBinary()
 | 
					 | 
				
			||||||
					_ = yym7
 | 
					 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeInt(int64(yy6))
 | 
											yy6 := *x.GracePeriodSeconds
 | 
				
			||||||
 | 
											yym7 := z.EncBinary()
 | 
				
			||||||
 | 
											_ = yym7
 | 
				
			||||||
 | 
											if false {
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												r.EncodeInt(int64(yy6))
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if yyr2 || yy2arr2 {
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
				z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
				if yyq2[1] {
 | 
									if yyq2[1] {
 | 
				
			||||||
					yym9 := z.EncBinary()
 | 
										if x.Preconditions == nil {
 | 
				
			||||||
					_ = yym9
 | 
											r.EncodeNil()
 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
											x.Preconditions.CodecEncodeSelf(e)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, "")
 | 
										r.EncodeNil()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				if yyq2[1] {
 | 
									if yyq2[1] {
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, string("kind"))
 | 
										r.EncodeString(codecSelferC_UTF81234, string("preconditions"))
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
					yym10 := z.EncBinary()
 | 
										if x.Preconditions == nil {
 | 
				
			||||||
					_ = yym10
 | 
											r.EncodeNil()
 | 
				
			||||||
					if false {
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
											x.Preconditions.CodecEncodeSelf(e)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -36828,7 +37037,7 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			|||||||
					_ = yym12
 | 
										_ = yym12
 | 
				
			||||||
					if false {
 | 
										if false {
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, "")
 | 
										r.EncodeString(codecSelferC_UTF81234, "")
 | 
				
			||||||
@@ -36836,11 +37045,36 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) {
 | 
				
			|||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				if yyq2[2] {
 | 
									if yyq2[2] {
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
					r.EncodeString(codecSelferC_UTF81234, string("apiVersion"))
 | 
										r.EncodeString(codecSelferC_UTF81234, string("kind"))
 | 
				
			||||||
					z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
					yym13 := z.EncBinary()
 | 
										yym13 := z.EncBinary()
 | 
				
			||||||
					_ = yym13
 | 
										_ = yym13
 | 
				
			||||||
					if false {
 | 
										if false {
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.Kind))
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if yyr2 || yy2arr2 {
 | 
				
			||||||
 | 
									z.EncSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
									if yyq2[3] {
 | 
				
			||||||
 | 
										yym15 := z.EncBinary()
 | 
				
			||||||
 | 
										_ = yym15
 | 
				
			||||||
 | 
										if false {
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										r.EncodeString(codecSelferC_UTF81234, "")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if yyq2[3] {
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapKey1234)
 | 
				
			||||||
 | 
										r.EncodeString(codecSelferC_UTF81234, string("apiVersion"))
 | 
				
			||||||
 | 
										z.EncSendContainerState(codecSelfer_containerMapValue1234)
 | 
				
			||||||
 | 
										yym16 := z.EncBinary()
 | 
				
			||||||
 | 
										_ = yym16
 | 
				
			||||||
 | 
										if false {
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
											r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion))
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -36923,6 +37157,17 @@ func (x *DeleteOptions) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
					*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
										*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							case "preconditions":
 | 
				
			||||||
 | 
								if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
									if x.Preconditions != nil {
 | 
				
			||||||
 | 
										x.Preconditions = nil
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if x.Preconditions == nil {
 | 
				
			||||||
 | 
										x.Preconditions = new(Preconditions)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									x.Preconditions.CodecDecodeSelf(d)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		case "kind":
 | 
							case "kind":
 | 
				
			||||||
			if r.TryDecodeAsNil() {
 | 
								if r.TryDecodeAsNil() {
 | 
				
			||||||
				x.Kind = ""
 | 
									x.Kind = ""
 | 
				
			||||||
@@ -36946,16 +37191,16 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
	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 yyj9 int
 | 
				
			||||||
	var yyb8 bool
 | 
						var yyb9 bool
 | 
				
			||||||
	var yyhl8 bool = l >= 0
 | 
						var yyhl9 bool = l >= 0
 | 
				
			||||||
	yyj8++
 | 
						yyj9++
 | 
				
			||||||
	if yyhl8 {
 | 
						if yyhl9 {
 | 
				
			||||||
		yyb8 = yyj8 > l
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		yyb8 = r.CheckBreak()
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if yyb8 {
 | 
						if yyb9 {
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -36968,20 +37213,41 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
		if x.GracePeriodSeconds == nil {
 | 
							if x.GracePeriodSeconds == nil {
 | 
				
			||||||
			x.GracePeriodSeconds = new(int64)
 | 
								x.GracePeriodSeconds = new(int64)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		yym10 := z.DecBinary()
 | 
							yym11 := z.DecBinary()
 | 
				
			||||||
		_ = yym10
 | 
							_ = yym11
 | 
				
			||||||
		if false {
 | 
							if false {
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
								*((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	yyj8++
 | 
						yyj9++
 | 
				
			||||||
	if yyhl8 {
 | 
						if yyhl9 {
 | 
				
			||||||
		yyb8 = yyj8 > l
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		yyb8 = r.CheckBreak()
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if yyb8 {
 | 
						if yyb9 {
 | 
				
			||||||
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
 | 
						if r.TryDecodeAsNil() {
 | 
				
			||||||
 | 
							if x.Preconditions != nil {
 | 
				
			||||||
 | 
								x.Preconditions = nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if x.Preconditions == nil {
 | 
				
			||||||
 | 
								x.Preconditions = new(Preconditions)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							x.Preconditions.CodecDecodeSelf(d)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						yyj9++
 | 
				
			||||||
 | 
						if yyhl9 {
 | 
				
			||||||
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if yyb9 {
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -36991,13 +37257,13 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		x.Kind = string(r.DecodeString())
 | 
							x.Kind = string(r.DecodeString())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	yyj8++
 | 
						yyj9++
 | 
				
			||||||
	if yyhl8 {
 | 
						if yyhl9 {
 | 
				
			||||||
		yyb8 = yyj8 > l
 | 
							yyb9 = yyj9 > l
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		yyb8 = r.CheckBreak()
 | 
							yyb9 = r.CheckBreak()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if yyb8 {
 | 
						if yyb9 {
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -37008,17 +37274,17 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
 | 
				
			|||||||
		x.APIVersion = string(r.DecodeString())
 | 
							x.APIVersion = string(r.DecodeString())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		yyj8++
 | 
							yyj9++
 | 
				
			||||||
		if yyhl8 {
 | 
							if yyhl9 {
 | 
				
			||||||
			yyb8 = yyj8 > l
 | 
								yyb9 = yyj9 > l
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			yyb8 = r.CheckBreak()
 | 
								yyb9 = r.CheckBreak()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if yyb8 {
 | 
							if yyb9 {
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
							z.DecSendContainerState(codecSelfer_containerArrayElem1234)
 | 
				
			||||||
		z.DecStructFieldNotFound(yyj8-1, "")
 | 
							z.DecStructFieldNotFound(yyj9-1, "")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
						z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2292,6 +2292,12 @@ type Binding struct {
 | 
				
			|||||||
	Target ObjectReference `json:"target"`
 | 
						Target ObjectReference `json:"target"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
 | 
				
			||||||
 | 
					type Preconditions struct {
 | 
				
			||||||
 | 
						// Specifies the target UID.
 | 
				
			||||||
 | 
						UID *types.UID `json:"uid,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeleteOptions may be provided when deleting an API object
 | 
					// DeleteOptions may be provided when deleting an API object
 | 
				
			||||||
type DeleteOptions struct {
 | 
					type DeleteOptions struct {
 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
@@ -2300,7 +2306,11 @@ type DeleteOptions struct {
 | 
				
			|||||||
	// The value zero indicates delete immediately. If this value is nil, the default grace period for the
 | 
						// The value zero indicates delete immediately. If this value is nil, the default grace period for the
 | 
				
			||||||
	// specified type will be used.
 | 
						// specified type will be used.
 | 
				
			||||||
	// Defaults to a per object value if not specified. zero means delete immediately.
 | 
						// Defaults to a per object value if not specified. zero means delete immediately.
 | 
				
			||||||
	GracePeriodSeconds *int64 `json:"gracePeriodSeconds"`
 | 
						GracePeriodSeconds *int64 `json:"gracePeriodSeconds,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be
 | 
				
			||||||
 | 
						// returned.
 | 
				
			||||||
 | 
						Preconditions *Preconditions `json:"preconditions,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExportOptions is the query options to the standard REST get call.
 | 
					// ExportOptions is the query options to the standard REST get call.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -296,6 +296,7 @@ func (DaemonEndpoint) SwaggerDoc() map[string]string {
 | 
				
			|||||||
var map_DeleteOptions = map[string]string{
 | 
					var map_DeleteOptions = map[string]string{
 | 
				
			||||||
	"":                   "DeleteOptions may be provided when deleting an API object",
 | 
						"":                   "DeleteOptions may be provided when deleting an API object",
 | 
				
			||||||
	"gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.",
 | 
						"gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.",
 | 
				
			||||||
 | 
						"preconditions":      "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (DeleteOptions) SwaggerDoc() map[string]string {
 | 
					func (DeleteOptions) SwaggerDoc() map[string]string {
 | 
				
			||||||
@@ -1237,6 +1238,15 @@ func (PodTemplateSpec) SwaggerDoc() map[string]string {
 | 
				
			|||||||
	return map_PodTemplateSpec
 | 
						return map_PodTemplateSpec
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var map_Preconditions = map[string]string{
 | 
				
			||||||
 | 
						"":    "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.",
 | 
				
			||||||
 | 
						"uid": "Specifies the target UID.",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (Preconditions) SwaggerDoc() map[string]string {
 | 
				
			||||||
 | 
						return map_Preconditions
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var map_PreferredSchedulingTerm = map[string]string{
 | 
					var map_PreferredSchedulingTerm = map[string]string{
 | 
				
			||||||
	"":           "An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).",
 | 
						"":           "An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).",
 | 
				
			||||||
	"weight":     "Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.",
 | 
						"weight":     "Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,7 +55,7 @@ func TestErrorsToAPIStatus(t *testing.T) {
 | 
				
			|||||||
			Status:  unversioned.StatusFailure,
 | 
								Status:  unversioned.StatusFailure,
 | 
				
			||||||
			Code:    http.StatusConflict,
 | 
								Code:    http.StatusConflict,
 | 
				
			||||||
			Reason:  "Conflict",
 | 
								Reason:  "Conflict",
 | 
				
			||||||
			Message: "foos \"bar\" cannot be updated: failure",
 | 
								Message: "Operation cannot be fulfilled on foos \"bar\": failure",
 | 
				
			||||||
			Details: &unversioned.StatusDetails{
 | 
								Details: &unversioned.StatusDetails{
 | 
				
			||||||
				Group: "",
 | 
									Group: "",
 | 
				
			||||||
				Kind:  "foos",
 | 
									Kind:  "foos",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -317,7 +317,7 @@ func TestPatchResourceWithConflict(t *testing.T) {
 | 
				
			|||||||
		changedPod:  &api.Pod{},
 | 
							changedPod:  &api.Pod{},
 | 
				
			||||||
		updatePod:   &api.Pod{},
 | 
							updatePod:   &api.Pod{},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		expectedError: `pods "foo" cannot be updated: existing 2, new 1`,
 | 
							expectedError: `Operation cannot be fulfilled on pods "foo": existing 2, new 1`,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tc.startingPod.Name = name
 | 
						tc.startingPod.Name = name
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,6 +72,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: configmap.Strategy,
 | 
							CreateStrategy: configmap.Strategy,
 | 
				
			||||||
		UpdateStrategy: configmap.Strategy,
 | 
							UpdateStrategy: configmap.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: configmap.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,6 +97,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Used to validate controller updates
 | 
							// Used to validate controller updates
 | 
				
			||||||
		UpdateStrategy: controller.Strategy,
 | 
							UpdateStrategy: controller.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: controller.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -118,11 +118,6 @@ func TestUpdate(t *testing.T) {
 | 
				
			|||||||
			return object
 | 
								return object
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		// invalid updateFunc
 | 
							// invalid updateFunc
 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
					 | 
				
			||||||
			object := obj.(*api.ReplicationController)
 | 
					 | 
				
			||||||
			object.UID = "newUID"
 | 
					 | 
				
			||||||
			return object
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
							func(obj runtime.Object) runtime.Object {
 | 
				
			||||||
			object := obj.(*api.ReplicationController)
 | 
								object := obj.(*api.ReplicationController)
 | 
				
			||||||
			object.Name = ""
 | 
								object.Name = ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,6 +72,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Used to validate daemon set updates
 | 
							// Used to validate daemon set updates
 | 
				
			||||||
		UpdateStrategy: daemonset.Strategy,
 | 
							UpdateStrategy: daemonset.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: daemonset.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								pkg/registry/daemonset/etcd/etcd_test.go
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										5
									
								
								pkg/registry/daemonset/etcd/etcd_test.go
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -108,11 +108,6 @@ func TestUpdate(t *testing.T) {
 | 
				
			|||||||
			return object
 | 
								return object
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		// invalid updateFunc
 | 
							// invalid updateFunc
 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
					 | 
				
			||||||
			object := obj.(*extensions.DaemonSet)
 | 
					 | 
				
			||||||
			object.UID = "newUID"
 | 
					 | 
				
			||||||
			return object
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
							func(obj runtime.Object) runtime.Object {
 | 
				
			||||||
			object := obj.(*extensions.DaemonSet)
 | 
								object := obj.(*extensions.DaemonSet)
 | 
				
			||||||
			object.Name = ""
 | 
								object.Name = ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,6 +97,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *RollbackREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Used to validate deployment updates.
 | 
							// Used to validate deployment updates.
 | 
				
			||||||
		UpdateStrategy: deployment.Strategy,
 | 
							UpdateStrategy: deployment.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: deployment.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -162,7 +163,7 @@ func (r *RollbackREST) setDeploymentRollback(ctx api.Context, deploymentID strin
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = r.store.Storage.GuaranteedUpdate(ctx, dKey, &extensions.Deployment{}, false, storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) {
 | 
						err = r.store.Storage.GuaranteedUpdate(ctx, dKey, &extensions.Deployment{}, false, nil, storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		d, ok := obj.(*extensions.Deployment)
 | 
							d, ok := obj.(*extensions.Deployment)
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			return nil, fmt.Errorf("unexpected object: %#v", obj)
 | 
								return nil, fmt.Errorf("unexpected object: %#v", obj)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -114,11 +114,6 @@ func TestUpdate(t *testing.T) {
 | 
				
			|||||||
			return object
 | 
								return object
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		// invalid updateFunc
 | 
							// invalid updateFunc
 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
					 | 
				
			||||||
			object := obj.(*extensions.Deployment)
 | 
					 | 
				
			||||||
			object.UID = "newUID"
 | 
					 | 
				
			||||||
			return object
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
							func(obj runtime.Object) runtime.Object {
 | 
				
			||||||
			object := obj.(*extensions.Deployment)
 | 
								object := obj.(*extensions.Deployment)
 | 
				
			||||||
			object.Name = ""
 | 
								object.Name = ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: endpoint.Strategy,
 | 
							CreateStrategy: endpoint.Strategy,
 | 
				
			||||||
		UpdateStrategy: endpoint.Strategy,
 | 
							UpdateStrategy: endpoint.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: endpoint.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,6 +61,7 @@ func NewREST(opts generic.RESTOptions, ttl uint64) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: event.Strategy,
 | 
							CreateStrategy: event.Strategy,
 | 
				
			||||||
		UpdateStrategy: event.Strategy,
 | 
							UpdateStrategy: event.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: event.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -259,7 +259,17 @@ func (e *Etcd) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool
 | 
				
			|||||||
	// TODO: expose TTL
 | 
						// TODO: expose TTL
 | 
				
			||||||
	creating := false
 | 
						creating := false
 | 
				
			||||||
	out := e.NewFunc()
 | 
						out := e.NewFunc()
 | 
				
			||||||
	err = e.Storage.GuaranteedUpdate(ctx, key, out, true, func(existing runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
						meta, err := api.ObjectMetaFor(obj)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, false, kubeerr.NewInternalError(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var preconditions *storage.Preconditions
 | 
				
			||||||
 | 
						// If the UID of the new object is specified, we use it as an Update precondition.
 | 
				
			||||||
 | 
						if len(meta.UID) != 0 {
 | 
				
			||||||
 | 
							UIDCopy := meta.UID
 | 
				
			||||||
 | 
							preconditions = &storage.Preconditions{UID: &UIDCopy}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = e.Storage.GuaranteedUpdate(ctx, key, out, true, preconditions, func(existing runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
				
			||||||
		// Since we return 'obj' from this function and it can be modified outside this
 | 
							// Since we return 'obj' from this function and it can be modified outside this
 | 
				
			||||||
		// function, we are resetting resourceVersion to the initial value here.
 | 
							// function, we are resetting resourceVersion to the initial value here.
 | 
				
			||||||
		//
 | 
							//
 | 
				
			||||||
@@ -395,6 +405,10 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
 | 
				
			|||||||
	if options == nil {
 | 
						if options == nil {
 | 
				
			||||||
		options = api.NewDeleteOptions(0)
 | 
							options = api.NewDeleteOptions(0)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						var preconditions storage.Preconditions
 | 
				
			||||||
 | 
						if options.Preconditions != nil {
 | 
				
			||||||
 | 
							preconditions.UID = options.Preconditions.UID
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, obj, options)
 | 
						graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, obj, options)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -408,7 +422,7 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
 | 
				
			|||||||
		out := e.NewFunc()
 | 
							out := e.NewFunc()
 | 
				
			||||||
		lastGraceful := int64(0)
 | 
							lastGraceful := int64(0)
 | 
				
			||||||
		err := e.Storage.GuaranteedUpdate(
 | 
							err := e.Storage.GuaranteedUpdate(
 | 
				
			||||||
			ctx, key, out, false,
 | 
								ctx, key, out, false, &preconditions,
 | 
				
			||||||
			storage.SimpleUpdate(func(existing runtime.Object) (runtime.Object, error) {
 | 
								storage.SimpleUpdate(func(existing runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
				graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, existing, options)
 | 
									graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, existing, options)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
@@ -451,7 +465,7 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// delete immediately, or no graceful deletion supported
 | 
						// delete immediately, or no graceful deletion supported
 | 
				
			||||||
	out := e.NewFunc()
 | 
						out := e.NewFunc()
 | 
				
			||||||
	if err := e.Storage.Delete(ctx, key, out); err != nil {
 | 
						if err := e.Storage.Delete(ctx, key, out, &preconditions); err != nil {
 | 
				
			||||||
		// Please refer to the place where we set ignoreNotFound for the reason
 | 
							// Please refer to the place where we set ignoreNotFound for the reason
 | 
				
			||||||
		// why we ignore the NotFound error .
 | 
							// why we ignore the NotFound error .
 | 
				
			||||||
		if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil {
 | 
							if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -99,6 +99,7 @@ func NewTestGenericEtcdRegistry(t *testing.T) (*etcdtesting.EtcdTestServer, *Etc
 | 
				
			|||||||
		QualifiedResource: api.Resource("pods"),
 | 
							QualifiedResource: api.Resource("pods"),
 | 
				
			||||||
		CreateStrategy:    strategy,
 | 
							CreateStrategy:    strategy,
 | 
				
			||||||
		UpdateStrategy:    strategy,
 | 
							UpdateStrategy:    strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:    strategy,
 | 
				
			||||||
		KeyRootFunc: func(ctx api.Context) string {
 | 
							KeyRootFunc: func(ctx api.Context) string {
 | 
				
			||||||
			return podPrefix
 | 
								return podPrefix
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -323,7 +324,7 @@ func TestEtcdUpdate(t *testing.T) {
 | 
				
			|||||||
	// Test3 outofDate
 | 
						// Test3 outofDate
 | 
				
			||||||
	_, _, err = registry.Update(testContext, podAWithResourceVersion)
 | 
						_, _, err = registry.Update(testContext, podAWithResourceVersion)
 | 
				
			||||||
	if !errors.IsConflict(err) {
 | 
						if !errors.IsConflict(err) {
 | 
				
			||||||
		t.Errorf("Unexpected error: %v", err)
 | 
							t.Errorf("Unexpected error updating podAWithResourceVersion: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Test4 normal update and verify
 | 
						// Test4 normal update and verify
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,6 +70,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Used to validate autoscaler updates
 | 
							// Used to validate autoscaler updates
 | 
				
			||||||
		UpdateStrategy: horizontalpodautoscaler.Strategy,
 | 
							UpdateStrategy: horizontalpodautoscaler.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: horizontalpodautoscaler.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,6 +72,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Used to validate controller updates
 | 
							// Used to validate controller updates
 | 
				
			||||||
		UpdateStrategy: ingress.Strategy,
 | 
							UpdateStrategy: ingress.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: ingress.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								pkg/registry/ingress/etcd/etcd_test.go
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										6
									
								
								pkg/registry/ingress/etcd/etcd_test.go
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -151,12 +151,6 @@ func TestUpdate(t *testing.T) {
 | 
				
			|||||||
			return object
 | 
								return object
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		// invalid updateFunc: ObjeceMeta is not to be tampered with.
 | 
							// invalid updateFunc: ObjeceMeta is not to be tampered with.
 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
					 | 
				
			||||||
			object := obj.(*extensions.Ingress)
 | 
					 | 
				
			||||||
			object.UID = "newUID"
 | 
					 | 
				
			||||||
			return object
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
							func(obj runtime.Object) runtime.Object {
 | 
				
			||||||
			object := obj.(*extensions.Ingress)
 | 
								object := obj.(*extensions.Ingress)
 | 
				
			||||||
			object.Name = ""
 | 
								object.Name = ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,6 +72,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Used to validate job updates
 | 
							// Used to validate job updates
 | 
				
			||||||
		UpdateStrategy: job.Strategy,
 | 
							UpdateStrategy: job.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: job.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: limitrange.Strategy,
 | 
							CreateStrategy: limitrange.Strategy,
 | 
				
			||||||
		UpdateStrategy: limitrange.Strategy,
 | 
							UpdateStrategy: limitrange.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: limitrange.Strategy,
 | 
				
			||||||
		ExportStrategy: limitrange.Strategy,
 | 
							ExportStrategy: limitrange.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,6 +75,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy:      namespace.Strategy,
 | 
							CreateStrategy:      namespace.Strategy,
 | 
				
			||||||
		UpdateStrategy:      namespace.Strategy,
 | 
							UpdateStrategy:      namespace.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:      namespace.Strategy,
 | 
				
			||||||
		ReturnDeletedObject: true,
 | 
							ReturnDeletedObject: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,6 +85,7 @@ func NewStorage(opts generic.RESTOptions, connection client.ConnectionInfoGetter
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: node.Strategy,
 | 
							CreateStrategy: node.Strategy,
 | 
				
			||||||
		UpdateStrategy: node.Strategy,
 | 
							UpdateStrategy: node.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: node.Strategy,
 | 
				
			||||||
		ExportStrategy: node.Strategy,
 | 
							ExportStrategy: node.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy:      persistentvolume.Strategy,
 | 
							CreateStrategy:      persistentvolume.Strategy,
 | 
				
			||||||
		UpdateStrategy:      persistentvolume.Strategy,
 | 
							UpdateStrategy:      persistentvolume.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:      persistentvolume.Strategy,
 | 
				
			||||||
		ReturnDeletedObject: true,
 | 
							ReturnDeletedObject: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy:      persistentvolumeclaim.Strategy,
 | 
							CreateStrategy:      persistentvolumeclaim.Strategy,
 | 
				
			||||||
		UpdateStrategy:      persistentvolumeclaim.Strategy,
 | 
							UpdateStrategy:      persistentvolumeclaim.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:      persistentvolumeclaim.Strategy,
 | 
				
			||||||
		ReturnDeletedObject: true,
 | 
							ReturnDeletedObject: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -148,7 +148,7 @@ func (r *BindingREST) setPodHostAndAnnotations(ctx api.Context, podID, oldMachin
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = r.store.Storage.GuaranteedUpdate(ctx, podKey, &api.Pod{}, false, storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) {
 | 
						err = r.store.Storage.GuaranteedUpdate(ctx, podKey, &api.Pod{}, false, nil, storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		pod, ok := obj.(*api.Pod)
 | 
							pod, ok := obj.(*api.Pod)
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			return nil, fmt.Errorf("unexpected object: %#v", obj)
 | 
								return nil, fmt.Errorf("unexpected object: %#v", obj)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -137,7 +137,7 @@ type FailDeletionStorage struct {
 | 
				
			|||||||
	Called *bool
 | 
						Called *bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (f FailDeletionStorage) Delete(ctx context.Context, key string, out runtime.Object) error {
 | 
					func (f FailDeletionStorage) Delete(ctx context.Context, key string, out runtime.Object, precondition *storage.Preconditions) error {
 | 
				
			||||||
	*f.Called = true
 | 
						*f.Called = true
 | 
				
			||||||
	return storage.NewKeyNotFoundError(key, 0)
 | 
						return storage.NewKeyNotFoundError(key, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,6 +60,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy:      podsecuritypolicy.Strategy,
 | 
							CreateStrategy:      podsecuritypolicy.Strategy,
 | 
				
			||||||
		UpdateStrategy:      podsecuritypolicy.Strategy,
 | 
							UpdateStrategy:      podsecuritypolicy.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:      podsecuritypolicy.Strategy,
 | 
				
			||||||
		ReturnDeletedObject: true,
 | 
							ReturnDeletedObject: true,
 | 
				
			||||||
		Storage:             storageInterface,
 | 
							Storage:             storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: podtemplate.Strategy,
 | 
							CreateStrategy: podtemplate.Strategy,
 | 
				
			||||||
		UpdateStrategy: podtemplate.Strategy,
 | 
							UpdateStrategy: podtemplate.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: podtemplate.Strategy,
 | 
				
			||||||
		ExportStrategy: podtemplate.Strategy,
 | 
							ExportStrategy: podtemplate.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ReturnDeletedObject: true,
 | 
							ReturnDeletedObject: true,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -96,6 +96,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Used to validate ReplicaSet updates
 | 
							// Used to validate ReplicaSet updates
 | 
				
			||||||
		UpdateStrategy: replicaset.Strategy,
 | 
							UpdateStrategy: replicaset.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: replicaset.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -121,11 +121,6 @@ func TestUpdate(t *testing.T) {
 | 
				
			|||||||
			return object
 | 
								return object
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		// invalid updateFunc
 | 
							// invalid updateFunc
 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
					 | 
				
			||||||
			object := obj.(*extensions.ReplicaSet)
 | 
					 | 
				
			||||||
			object.UID = "newUID"
 | 
					 | 
				
			||||||
			return object
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		func(obj runtime.Object) runtime.Object {
 | 
							func(obj runtime.Object) runtime.Object {
 | 
				
			||||||
			object := obj.(*extensions.ReplicaSet)
 | 
								object := obj.(*extensions.ReplicaSet)
 | 
				
			||||||
			object.Name = ""
 | 
								object.Name = ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy:      resourcequota.Strategy,
 | 
							CreateStrategy:      resourcequota.Strategy,
 | 
				
			||||||
		UpdateStrategy:      resourcequota.Strategy,
 | 
							UpdateStrategy:      resourcequota.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:      resourcequota.Strategy,
 | 
				
			||||||
		ReturnDeletedObject: true,
 | 
							ReturnDeletedObject: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: secret.Strategy,
 | 
							CreateStrategy: secret.Strategy,
 | 
				
			||||||
		UpdateStrategy: secret.Strategy,
 | 
							UpdateStrategy: secret.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: secret.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -143,7 +143,7 @@ func (e *Etcd) Release(item int) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// tryUpdate performs a read-update to persist the latest snapshot state of allocation.
 | 
					// tryUpdate performs a read-update to persist the latest snapshot state of allocation.
 | 
				
			||||||
func (e *Etcd) tryUpdate(fn func() error) error {
 | 
					func (e *Etcd) tryUpdate(fn func() error) error {
 | 
				
			||||||
	err := e.storage.GuaranteedUpdate(context.TODO(), e.baseKey, &api.RangeAllocation{}, true,
 | 
						err := e.storage.GuaranteedUpdate(context.TODO(), e.baseKey, &api.RangeAllocation{}, true, nil,
 | 
				
			||||||
		storage.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) {
 | 
							storage.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) {
 | 
				
			||||||
			existing := input.(*api.RangeAllocation)
 | 
								existing := input.(*api.RangeAllocation)
 | 
				
			||||||
			if len(existing.ResourceVersion) == 0 {
 | 
								if len(existing.ResourceVersion) == 0 {
 | 
				
			||||||
@@ -200,7 +200,7 @@ func (e *Etcd) CreateOrUpdate(snapshot *api.RangeAllocation) error {
 | 
				
			|||||||
	defer e.lock.Unlock()
 | 
						defer e.lock.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	last := ""
 | 
						last := ""
 | 
				
			||||||
	err := e.storage.GuaranteedUpdate(context.TODO(), e.baseKey, &api.RangeAllocation{}, true,
 | 
						err := e.storage.GuaranteedUpdate(context.TODO(), e.baseKey, &api.RangeAllocation{}, true, nil,
 | 
				
			||||||
		storage.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) {
 | 
							storage.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) {
 | 
				
			||||||
			existing := input.(*api.RangeAllocation)
 | 
								existing := input.(*api.RangeAllocation)
 | 
				
			||||||
			switch {
 | 
								switch {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy: service.Strategy,
 | 
							CreateStrategy: service.Strategy,
 | 
				
			||||||
		UpdateStrategy: service.Strategy,
 | 
							UpdateStrategy: service.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy: service.Strategy,
 | 
				
			||||||
		ExportStrategy: service.Strategy,
 | 
							ExportStrategy: service.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		CreateStrategy:      serviceaccount.Strategy,
 | 
							CreateStrategy:      serviceaccount.Strategy,
 | 
				
			||||||
		UpdateStrategy:      serviceaccount.Strategy,
 | 
							UpdateStrategy:      serviceaccount.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:      serviceaccount.Strategy,
 | 
				
			||||||
		ReturnDeletedObject: true,
 | 
							ReturnDeletedObject: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,7 @@ func NewREST(opts generic.RESTOptions) *REST {
 | 
				
			|||||||
		DeleteCollectionWorkers: opts.DeleteCollectionWorkers,
 | 
							DeleteCollectionWorkers: opts.DeleteCollectionWorkers,
 | 
				
			||||||
		CreateStrategy:          thirdpartyresource.Strategy,
 | 
							CreateStrategy:          thirdpartyresource.Strategy,
 | 
				
			||||||
		UpdateStrategy:          thirdpartyresource.Strategy,
 | 
							UpdateStrategy:          thirdpartyresource.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:          thirdpartyresource.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,6 +61,7 @@ func NewREST(opts generic.RESTOptions, group, kind string) *REST {
 | 
				
			|||||||
		DeleteCollectionWorkers: opts.DeleteCollectionWorkers,
 | 
							DeleteCollectionWorkers: opts.DeleteCollectionWorkers,
 | 
				
			||||||
		CreateStrategy:          thirdpartyresourcedata.Strategy,
 | 
							CreateStrategy:          thirdpartyresourcedata.Strategy,
 | 
				
			||||||
		UpdateStrategy:          thirdpartyresourcedata.Strategy,
 | 
							UpdateStrategy:          thirdpartyresourcedata.Strategy,
 | 
				
			||||||
 | 
							DeleteStrategy:          thirdpartyresourcedata.Strategy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Storage: storageInterface,
 | 
							Storage: storageInterface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -239,8 +239,8 @@ func (c *Cacher) Set(ctx context.Context, key string, obj, out runtime.Object, t
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implements storage.Interface.
 | 
					// Implements storage.Interface.
 | 
				
			||||||
func (c *Cacher) Delete(ctx context.Context, key string, out runtime.Object) error {
 | 
					func (c *Cacher) Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error {
 | 
				
			||||||
	return c.storage.Delete(ctx, key, out)
 | 
						return c.storage.Delete(ctx, key, out, preconditions)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implements storage.Interface.
 | 
					// Implements storage.Interface.
 | 
				
			||||||
@@ -347,8 +347,8 @@ func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, f
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implements storage.Interface.
 | 
					// Implements storage.Interface.
 | 
				
			||||||
func (c *Cacher) GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, tryUpdate UpdateFunc) error {
 | 
					func (c *Cacher) GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, preconditions *Preconditions, tryUpdate UpdateFunc) error {
 | 
				
			||||||
	return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, tryUpdate)
 | 
						return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implements storage.Interface.
 | 
					// Implements storage.Interface.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,7 +107,7 @@ func TestList(t *testing.T) {
 | 
				
			|||||||
	_ = updatePod(t, etcdStorage, podFooPrime, fooCreated)
 | 
						_ = updatePod(t, etcdStorage, podFooPrime, fooCreated)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deleted := api.Pod{}
 | 
						deleted := api.Pod{}
 | 
				
			||||||
	if err := etcdStorage.Delete(context.TODO(), etcdtest.AddPrefix("pods/ns/bar"), &deleted); err != nil {
 | 
						if err := etcdStorage.Delete(context.TODO(), etcdtest.AddPrefix("pods/ns/bar"), &deleted, nil); err != nil {
 | 
				
			||||||
		t.Errorf("Unexpected error: %v", err)
 | 
							t.Errorf("Unexpected error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -315,7 +315,7 @@ func TestFiltering(t *testing.T) {
 | 
				
			|||||||
	_ = updatePod(t, etcdStorage, podFooPrime, fooUnfiltered)
 | 
						_ = updatePod(t, etcdStorage, podFooPrime, fooUnfiltered)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deleted := api.Pod{}
 | 
						deleted := api.Pod{}
 | 
				
			||||||
	if err := etcdStorage.Delete(context.TODO(), etcdtest.AddPrefix("pods/ns/foo"), &deleted); err != nil {
 | 
						if err := etcdStorage.Delete(context.TODO(), etcdtest.AddPrefix("pods/ns/foo"), &deleted, nil); err != nil {
 | 
				
			||||||
		t.Errorf("Unexpected error: %v", err)
 | 
							t.Errorf("Unexpected error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,11 @@ limitations under the License.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package storage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "fmt"
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/util/validation/field"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	ErrCodeKeyNotFound int = iota + 1
 | 
						ErrCodeKeyNotFound int = iota + 1
 | 
				
			||||||
@@ -104,3 +108,47 @@ func isErrCode(err error, code int) bool {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InvalidError is generated when an error caused by invalid API object occurs
 | 
				
			||||||
 | 
					// in the storage package.
 | 
				
			||||||
 | 
					type InvalidError struct {
 | 
				
			||||||
 | 
						Errs field.ErrorList
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e InvalidError) Error() string {
 | 
				
			||||||
 | 
						return e.Errs.ToAggregate().Error()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsInvalidError returns true if and only if err is an InvalidError.
 | 
				
			||||||
 | 
					func IsInvalidError(err error) bool {
 | 
				
			||||||
 | 
						_, ok := err.(InvalidError)
 | 
				
			||||||
 | 
						return ok
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewInvalidError(errors field.ErrorList) InvalidError {
 | 
				
			||||||
 | 
						return InvalidError{errors}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InternalError is generated when an error occurs in the storage package, i.e.,
 | 
				
			||||||
 | 
					// not from the underlying storage backend (e.g., etcd).
 | 
				
			||||||
 | 
					type InternalError struct {
 | 
				
			||||||
 | 
						Reason string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e InternalError) Error() string {
 | 
				
			||||||
 | 
						return e.Reason
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsInternalError returns true if and only if err is an InternalError.
 | 
				
			||||||
 | 
					func IsInternalError(err error) bool {
 | 
				
			||||||
 | 
						_, ok := err.(InternalError)
 | 
				
			||||||
 | 
						return ok
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewInternalError(reason string) InternalError {
 | 
				
			||||||
 | 
						return InternalError{reason}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewInternalErrorf(format string, a ...interface{}) InternalError {
 | 
				
			||||||
 | 
						return InternalError{fmt.Sprintf(format, a)}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -291,26 +291,76 @@ func (h *etcdHelper) Set(ctx context.Context, key string, obj, out runtime.Objec
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func checkPreconditions(preconditions *storage.Preconditions, out runtime.Object) error {
 | 
				
			||||||
 | 
						if preconditions == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						objMeta, err := api.ObjectMetaFor(out)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if preconditions.UID != nil && *preconditions.UID != objMeta.UID {
 | 
				
			||||||
 | 
							return etcd.Error{Code: etcd.ErrorCodeTestFailed, Message: fmt.Sprintf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *preconditions.UID, objMeta.UID)}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implements storage.Interface.
 | 
					// Implements storage.Interface.
 | 
				
			||||||
func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object) error {
 | 
					func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions) error {
 | 
				
			||||||
	if ctx == nil {
 | 
						if ctx == nil {
 | 
				
			||||||
		glog.Errorf("Context is nil")
 | 
							glog.Errorf("Context is nil")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	key = h.prefixEtcdKey(key)
 | 
						key = h.prefixEtcdKey(key)
 | 
				
			||||||
	if _, err := conversion.EnforcePtr(out); err != nil {
 | 
						v, err := conversion.EnforcePtr(out)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
		panic("unable to convert output object to pointer")
 | 
							panic("unable to convert output object to pointer")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	startTime := time.Now()
 | 
						if preconditions == nil {
 | 
				
			||||||
	response, err := h.etcdKeysAPI.Delete(ctx, key, nil)
 | 
							startTime := time.Now()
 | 
				
			||||||
	metrics.RecordEtcdRequestLatency("delete", getTypeName(out), startTime)
 | 
							response, err := h.etcdKeysAPI.Delete(ctx, key, nil)
 | 
				
			||||||
	if !etcdutil.IsEtcdNotFound(err) {
 | 
							metrics.RecordEtcdRequestLatency("delete", getTypeName(out), startTime)
 | 
				
			||||||
		// if the object that existed prior to the delete is returned by etcd, update out.
 | 
							if !etcdutil.IsEtcdNotFound(err) {
 | 
				
			||||||
		if err != nil || response.PrevNode != nil {
 | 
								// if the object that existed prior to the delete is returned by etcd, update the out object.
 | 
				
			||||||
			_, _, err = h.extractObj(response, err, out, false, true)
 | 
								if err != nil || response.PrevNode != nil {
 | 
				
			||||||
 | 
									_, _, err = h.extractObj(response, err, out, false, true)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return toStorageErr(err, key, 0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Check the preconditions match.
 | 
				
			||||||
 | 
						obj := reflect.New(v.Type()).Interface().(runtime.Object)
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							_, node, res, err := h.bodyAndExtractObj(ctx, key, obj, false)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return toStorageErr(err, key, 0)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err := checkPreconditions(preconditions, obj); err != nil {
 | 
				
			||||||
 | 
								return toStorageErr(err, key, 0)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							index := uint64(0)
 | 
				
			||||||
 | 
							if node != nil {
 | 
				
			||||||
 | 
								index = node.ModifiedIndex
 | 
				
			||||||
 | 
							} else if res != nil {
 | 
				
			||||||
 | 
								index = res.Index
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							opt := etcd.DeleteOptions{PrevIndex: index}
 | 
				
			||||||
 | 
							startTime := time.Now()
 | 
				
			||||||
 | 
							response, err := h.etcdKeysAPI.Delete(ctx, key, &opt)
 | 
				
			||||||
 | 
							metrics.RecordEtcdRequestLatency("delete", getTypeName(out), startTime)
 | 
				
			||||||
 | 
							if etcdutil.IsEtcdTestFailed(err) {
 | 
				
			||||||
 | 
								glog.Infof("deletion of %s failed because of a conflict, going to retry", key)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if !etcdutil.IsEtcdNotFound(err) {
 | 
				
			||||||
 | 
									// if the object that existed prior to the delete is returned by etcd, update the out object.
 | 
				
			||||||
 | 
									if err != nil || response.PrevNode != nil {
 | 
				
			||||||
 | 
										_, _, err = h.extractObj(response, err, out, false, true)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return toStorageErr(err, key, 0)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return toStorageErr(err, key, 0)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implements storage.Interface.
 | 
					// Implements storage.Interface.
 | 
				
			||||||
@@ -547,7 +597,7 @@ func (h *etcdHelper) listEtcdNode(ctx context.Context, key string) ([]*etcd.Node
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implements storage.Interface.
 | 
					// Implements storage.Interface.
 | 
				
			||||||
func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, tryUpdate storage.UpdateFunc) error {
 | 
					func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc) error {
 | 
				
			||||||
	if ctx == nil {
 | 
						if ctx == nil {
 | 
				
			||||||
		glog.Errorf("Context is nil")
 | 
							glog.Errorf("Context is nil")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -561,7 +611,10 @@ func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType
 | 
				
			|||||||
		obj := reflect.New(v.Type()).Interface().(runtime.Object)
 | 
							obj := reflect.New(v.Type()).Interface().(runtime.Object)
 | 
				
			||||||
		origBody, node, res, err := h.bodyAndExtractObj(ctx, key, obj, ignoreNotFound)
 | 
							origBody, node, res, err := h.bodyAndExtractObj(ctx, key, obj, ignoreNotFound)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return toStorageErr(err, key, 0)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err := checkPreconditions(preconditions, obj); err != nil {
 | 
				
			||||||
 | 
								return toStorageErr(err, key, 0)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		meta := storage.ResponseMeta{}
 | 
							meta := storage.ResponseMeta{}
 | 
				
			||||||
		if node != nil {
 | 
							if node != nil {
 | 
				
			||||||
@@ -574,7 +627,7 @@ func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType
 | 
				
			|||||||
		// Get the object to be written by calling tryUpdate.
 | 
							// Get the object to be written by calling tryUpdate.
 | 
				
			||||||
		ret, newTTL, err := tryUpdate(obj, meta)
 | 
							ret, newTTL, err := tryUpdate(obj, meta)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return toStorageErr(err, key, 0)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		index := uint64(0)
 | 
							index := uint64(0)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -371,7 +371,7 @@ func TestGuaranteedUpdate(t *testing.T) {
 | 
				
			|||||||
	helper := newEtcdHelper(server.Client, codec, key)
 | 
						helper := newEtcdHelper(server.Client, codec, key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
	err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		return obj, nil
 | 
							return obj, nil
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -381,7 +381,7 @@ func TestGuaranteedUpdate(t *testing.T) {
 | 
				
			|||||||
	// Update an existing node.
 | 
						// Update an existing node.
 | 
				
			||||||
	callbackCalled := false
 | 
						callbackCalled := false
 | 
				
			||||||
	objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2}
 | 
						objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2}
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		callbackCalled = true
 | 
							callbackCalled = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if in.(*storagetesting.TestResource).Value != 1 {
 | 
							if in.(*storagetesting.TestResource).Value != 1 {
 | 
				
			||||||
@@ -416,7 +416,7 @@ func TestGuaranteedUpdateNoChange(t *testing.T) {
 | 
				
			|||||||
	helper := newEtcdHelper(server.Client, codec, key)
 | 
						helper := newEtcdHelper(server.Client, codec, key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
	err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		return obj, nil
 | 
							return obj, nil
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -426,7 +426,7 @@ func TestGuaranteedUpdateNoChange(t *testing.T) {
 | 
				
			|||||||
	// Update an existing node with the same data
 | 
						// Update an existing node with the same data
 | 
				
			||||||
	callbackCalled := false
 | 
						callbackCalled := false
 | 
				
			||||||
	objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		callbackCalled = true
 | 
							callbackCalled = true
 | 
				
			||||||
		return objUpdate, nil
 | 
							return objUpdate, nil
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
@@ -453,13 +453,13 @@ func TestGuaranteedUpdateKeyNotFound(t *testing.T) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ignoreNotFound := false
 | 
						ignoreNotFound := false
 | 
				
			||||||
	err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, f)
 | 
						err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, nil, f)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		t.Errorf("Expected error for key not found.")
 | 
							t.Errorf("Expected error for key not found.")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ignoreNotFound = true
 | 
						ignoreNotFound = true
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, f)
 | 
						err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, nil, f)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("Unexpected error %v.", err)
 | 
							t.Errorf("Unexpected error %v.", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -484,7 +484,7 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
 | 
				
			|||||||
			defer wgDone.Done()
 | 
								defer wgDone.Done()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			firstCall := true
 | 
								firstCall := true
 | 
				
			||||||
			err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
								err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
				defer func() { firstCall = false }()
 | 
									defer func() { firstCall = false }()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if firstCall {
 | 
									if firstCall {
 | 
				
			||||||
@@ -514,6 +514,26 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGuaranteedUpdateUIDMismatch(t *testing.T) {
 | 
				
			||||||
 | 
						server := etcdtesting.NewEtcdTestClientServer(t)
 | 
				
			||||||
 | 
						defer server.Terminate(t)
 | 
				
			||||||
 | 
						prefix := path.Join("/", etcdtest.PathPrefix())
 | 
				
			||||||
 | 
						helper := newEtcdHelper(server.Client, testapi.Default.Codec(), prefix)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}}
 | 
				
			||||||
 | 
						podPtr := &api.Pod{}
 | 
				
			||||||
 | 
						err := helper.Create(context.TODO(), "/some/key", obj, podPtr, 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("Unexpected error %#v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = helper.GuaranteedUpdate(context.TODO(), "/some/key", podPtr, true, storage.NewUIDPreconditions("B"), storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
 | 
							return obj, nil
 | 
				
			||||||
 | 
						}))
 | 
				
			||||||
 | 
						if !storage.IsTestFailed(err) {
 | 
				
			||||||
 | 
							t.Fatalf("Expect a Test Failed (write conflict) error, got: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestPrefixEtcdKey(t *testing.T) {
 | 
					func TestPrefixEtcdKey(t *testing.T) {
 | 
				
			||||||
	server := etcdtesting.NewEtcdTestClientServer(t)
 | 
						server := etcdtesting.NewEtcdTestClientServer(t)
 | 
				
			||||||
	defer server.Terminate(t)
 | 
						defer server.Terminate(t)
 | 
				
			||||||
@@ -534,3 +554,79 @@ func TestPrefixEtcdKey(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	assert.Equal(t, keyBefore, keyAfter, "Prefix incorrectly added by EtcdHelper")
 | 
						assert.Equal(t, keyBefore, keyAfter, "Prefix incorrectly added by EtcdHelper")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDeleteUIDMismatch(t *testing.T) {
 | 
				
			||||||
 | 
						server := etcdtesting.NewEtcdTestClientServer(t)
 | 
				
			||||||
 | 
						defer server.Terminate(t)
 | 
				
			||||||
 | 
						prefix := path.Join("/", etcdtest.PathPrefix())
 | 
				
			||||||
 | 
						helper := newEtcdHelper(server.Client, testapi.Default.Codec(), prefix)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}}
 | 
				
			||||||
 | 
						podPtr := &api.Pod{}
 | 
				
			||||||
 | 
						err := helper.Create(context.TODO(), "/some/key", obj, podPtr, 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Fatalf("Unexpected error %#v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = helper.Delete(context.TODO(), "/some/key", obj, storage.NewUIDPreconditions("B"))
 | 
				
			||||||
 | 
						if !storage.IsTestFailed(err) {
 | 
				
			||||||
 | 
							t.Fatalf("Expect a Test Failed (write conflict) error, got: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type getFunc func(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type fakeDeleteKeysAPI struct {
 | 
				
			||||||
 | 
						etcd.KeysAPI
 | 
				
			||||||
 | 
						fakeGetFunc getFunc
 | 
				
			||||||
 | 
						getCount    int
 | 
				
			||||||
 | 
						// The fakeGetFunc will be called fakeGetCap times before the KeysAPI's Get will be called.
 | 
				
			||||||
 | 
						fakeGetCap int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (f *fakeDeleteKeysAPI) Get(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) {
 | 
				
			||||||
 | 
						f.getCount++
 | 
				
			||||||
 | 
						if f.getCount < f.fakeGetCap {
 | 
				
			||||||
 | 
							return f.fakeGetFunc(ctx, key, opts)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return f.KeysAPI.Get(ctx, key, opts)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This is to emulate the case where another party updates the object when
 | 
				
			||||||
 | 
					// etcdHelper.Delete has verified the preconditions, but hasn't carried out the
 | 
				
			||||||
 | 
					// deletion yet. Etcd will fail the deletion and report the conflict. etcdHelper
 | 
				
			||||||
 | 
					// should retry until there is no conflict.
 | 
				
			||||||
 | 
					func TestDeleteWithRetry(t *testing.T) {
 | 
				
			||||||
 | 
						server := etcdtesting.NewEtcdTestClientServer(t)
 | 
				
			||||||
 | 
						defer server.Terminate(t)
 | 
				
			||||||
 | 
						prefix := path.Join("/", etcdtest.PathPrefix())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}}
 | 
				
			||||||
 | 
						// fakeGet returns a large ModifiedIndex to emulate the case that another
 | 
				
			||||||
 | 
						// party has updated the object.
 | 
				
			||||||
 | 
						fakeGet := func(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) {
 | 
				
			||||||
 | 
							data, _ := runtime.Encode(testapi.Default.Codec(), obj)
 | 
				
			||||||
 | 
							return &etcd.Response{Node: &etcd.Node{Value: string(data), ModifiedIndex: 99}}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						expectedRetries := 3
 | 
				
			||||||
 | 
						helper := newEtcdHelper(server.Client, testapi.Default.Codec(), prefix)
 | 
				
			||||||
 | 
						fake := &fakeDeleteKeysAPI{KeysAPI: helper.etcdKeysAPI, fakeGetCap: expectedRetries, fakeGetFunc: fakeGet}
 | 
				
			||||||
 | 
						helper.etcdKeysAPI = fake
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						returnedObj := &api.Pod{}
 | 
				
			||||||
 | 
						err := helper.Create(context.TODO(), "/some/key", obj, returnedObj, 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Errorf("Unexpected error %#v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = helper.Delete(context.TODO(), "/some/key", obj, storage.NewUIDPreconditions("A"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Errorf("Unexpected error %#v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if fake.getCount != expectedRetries {
 | 
				
			||||||
 | 
							t.Errorf("Expect %d retries, got %d", expectedRetries, fake.getCount)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = helper.Get(context.TODO(), "/some/key", obj, false)
 | 
				
			||||||
 | 
						if !storage.IsNotFound(err) {
 | 
				
			||||||
 | 
							t.Errorf("Expect an NotFound error, got %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,6 +42,7 @@ const (
 | 
				
			|||||||
	EtcdSet    = "set"
 | 
						EtcdSet    = "set"
 | 
				
			||||||
	EtcdCAS    = "compareAndSwap"
 | 
						EtcdCAS    = "compareAndSwap"
 | 
				
			||||||
	EtcdDelete = "delete"
 | 
						EtcdDelete = "delete"
 | 
				
			||||||
 | 
						EtcdCAD    = "compareAndDelete"
 | 
				
			||||||
	EtcdExpire = "expire"
 | 
						EtcdExpire = "expire"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -450,7 +451,7 @@ func (w *etcdWatcher) sendResult(res *etcd.Response) {
 | 
				
			|||||||
		w.sendAdd(res)
 | 
							w.sendAdd(res)
 | 
				
			||||||
	case EtcdSet, EtcdCAS:
 | 
						case EtcdSet, EtcdCAS:
 | 
				
			||||||
		w.sendModify(res)
 | 
							w.sendModify(res)
 | 
				
			||||||
	case EtcdDelete, EtcdExpire:
 | 
						case EtcdDelete, EtcdExpire, EtcdCAD:
 | 
				
			||||||
		w.sendDelete(res)
 | 
							w.sendDelete(res)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		utilruntime.HandleError(fmt.Errorf("unknown action: %v", res.Action))
 | 
							utilruntime.HandleError(fmt.Errorf("unknown action: %v", res.Action))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/types"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/watch"
 | 
						"k8s.io/kubernetes/pkg/watch"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -69,6 +70,18 @@ func Everything(runtime.Object) bool {
 | 
				
			|||||||
// See the comment for GuaranteedUpdate for more details.
 | 
					// See the comment for GuaranteedUpdate for more details.
 | 
				
			||||||
type UpdateFunc func(input runtime.Object, res ResponseMeta) (output runtime.Object, ttl *uint64, err error)
 | 
					type UpdateFunc func(input runtime.Object, res ResponseMeta) (output runtime.Object, ttl *uint64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
 | 
				
			||||||
 | 
					type Preconditions struct {
 | 
				
			||||||
 | 
						// Specifies the target UID.
 | 
				
			||||||
 | 
						UID *types.UID `json:"uid,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewUIDPreconditions returns a Preconditions with UID set.
 | 
				
			||||||
 | 
					func NewUIDPreconditions(uid string) *Preconditions {
 | 
				
			||||||
 | 
						u := types.UID(uid)
 | 
				
			||||||
 | 
						return &Preconditions{UID: &u}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Interface offers a common interface for object marshaling/unmarshling operations and
 | 
					// Interface offers a common interface for object marshaling/unmarshling operations and
 | 
				
			||||||
// hides all the storage-related operations behind it.
 | 
					// hides all the storage-related operations behind it.
 | 
				
			||||||
type Interface interface {
 | 
					type Interface interface {
 | 
				
			||||||
@@ -91,7 +104,7 @@ type Interface interface {
 | 
				
			|||||||
	Set(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error
 | 
						Set(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Delete removes the specified key and returns the value that existed at that spot.
 | 
						// Delete removes the specified key and returns the value that existed at that spot.
 | 
				
			||||||
	Delete(ctx context.Context, key string, out runtime.Object) error
 | 
						Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Watch begins watching the specified key. Events are decoded into API objects,
 | 
						// Watch begins watching the specified key. Events are decoded into API objects,
 | 
				
			||||||
	// and any items passing 'filter' are sent down to returned watch.Interface.
 | 
						// and any items passing 'filter' are sent down to returned watch.Interface.
 | 
				
			||||||
@@ -146,7 +159,7 @@ type Interface interface {
 | 
				
			|||||||
	//       return cur, nil, nil
 | 
						//       return cur, nil, nil
 | 
				
			||||||
	//    }
 | 
						//    }
 | 
				
			||||||
	// })
 | 
						// })
 | 
				
			||||||
	GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, tryUpdate UpdateFunc) error
 | 
						GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, precondtions *Preconditions, tryUpdate UpdateFunc) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Codec provides access to the underlying codec being used by the implementation.
 | 
						// Codec provides access to the underlying codec being used by the implementation.
 | 
				
			||||||
	Codec() runtime.Codec
 | 
						Codec() runtime.Codec
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,9 +20,7 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/errors"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/meta"
 | 
						"k8s.io/kubernetes/pkg/api/meta"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/validation"
 | 
						"k8s.io/kubernetes/pkg/api/validation"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/util/validation/field"
 | 
						"k8s.io/kubernetes/pkg/util/validation/field"
 | 
				
			||||||
@@ -48,7 +46,7 @@ func ParseWatchResourceVersion(resourceVersion string) (uint64, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	version, err := strconv.ParseUint(resourceVersion, 10, 64)
 | 
						version, err := strconv.ParseUint(resourceVersion, 10, 64)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return 0, errors.NewInvalid(unversioned.GroupKind{}, "", field.ErrorList{
 | 
							return 0, NewInvalidError(field.ErrorList{
 | 
				
			||||||
			// Validation errors are supposed to return version-specific field
 | 
								// Validation errors are supposed to return version-specific field
 | 
				
			||||||
			// paths, but this is probably close enough.
 | 
								// paths, but this is probably close enough.
 | 
				
			||||||
			field.Invalid(field.NewPath("resourceVersion"), resourceVersion, err.Error()),
 | 
								field.Invalid(field.NewPath("resourceVersion"), resourceVersion, err.Error()),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,11 +16,7 @@ limitations under the License.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package storage
 | 
					package storage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import "testing"
 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/errors"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestEtcdParseWatchResourceVersion(t *testing.T) {
 | 
					func TestEtcdParseWatchResourceVersion(t *testing.T) {
 | 
				
			||||||
	testCases := []struct {
 | 
						testCases := []struct {
 | 
				
			||||||
@@ -42,7 +38,7 @@ func TestEtcdParseWatchResourceVersion(t *testing.T) {
 | 
				
			|||||||
				t.Errorf("%s: unexpected non-error", testCase.Version)
 | 
									t.Errorf("%s: unexpected non-error", testCase.Version)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if !errors.IsInvalid(err) {
 | 
								if !IsInvalidError(err) {
 | 
				
			||||||
				t.Errorf("%s: unexpected error: %v", testCase.Version, err)
 | 
									t.Errorf("%s: unexpected error: %v", testCase.Version, err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -98,7 +98,7 @@ func TestWriteTTL(t *testing.T) {
 | 
				
			|||||||
			t.Fatalf("unexpected error: %v", err)
 | 
								t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		result := &api.ServiceAccount{}
 | 
							result := &api.ServiceAccount{}
 | 
				
			||||||
		err := etcdStorage.GuaranteedUpdate(ctx, key, result, false, func(obj runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
							err := etcdStorage.GuaranteedUpdate(ctx, key, result, false, nil, func(obj runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
				
			||||||
			if in, ok := obj.(*api.ServiceAccount); !ok || in.Name != "foo" {
 | 
								if in, ok := obj.(*api.ServiceAccount); !ok || in.Name != "foo" {
 | 
				
			||||||
				t.Fatalf("unexpected existing object: %v", obj)
 | 
									t.Fatalf("unexpected existing object: %v", obj)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -120,7 +120,7 @@ func TestWriteTTL(t *testing.T) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		result = &api.ServiceAccount{}
 | 
							result = &api.ServiceAccount{}
 | 
				
			||||||
		err = etcdStorage.GuaranteedUpdate(ctx, key, result, false, func(obj runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
							err = etcdStorage.GuaranteedUpdate(ctx, key, result, false, nil, func(obj runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
				
			||||||
			if in, ok := obj.(*api.ServiceAccount); !ok || in.Name != "out" {
 | 
								if in, ok := obj.(*api.ServiceAccount); !ok || in.Name != "out" {
 | 
				
			||||||
				t.Fatalf("unexpected existing object: %v", obj)
 | 
									t.Fatalf("unexpected existing object: %v", obj)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user