mirror of https://github.com/k3s-io/k3s
Merge remote-tracking branch 'origin/master' into release-1.14. Deleting CHANGELOG-1.11.md CHANGELOG-1.13.md
commit
6e8b574d27
File diff suppressed because it is too large
Load Diff
|
@ -38,6 +38,7 @@ gcs_upload(
|
||||||
":_binary-artifacts-and-hashes",
|
":_binary-artifacts-and-hashes",
|
||||||
"//build/release-tars:release-tars-and-hashes",
|
"//build/release-tars:release-tars-and-hashes",
|
||||||
"//cluster/gce/gci:gcs-release-artifacts-and-hashes",
|
"//cluster/gce/gci:gcs-release-artifacts-and-hashes",
|
||||||
|
"//cluster/gce/windows:gcs-release-artifacts-and-hashes",
|
||||||
],
|
],
|
||||||
tags = ["manual"],
|
tags = ["manual"],
|
||||||
# Use for_platforms to format the upload path based on the configured
|
# Use for_platforms to format the upload path based on the configured
|
||||||
|
@ -53,6 +54,7 @@ gcs_upload(
|
||||||
upload_paths = select(for_platforms(for_all = {
|
upload_paths = select(for_platforms(for_all = {
|
||||||
"//build/release-tars:release-tars-and-hashes": "",
|
"//build/release-tars:release-tars-and-hashes": "",
|
||||||
"//cluster/gce/gci:gcs-release-artifacts-and-hashes": "extra/gce",
|
"//cluster/gce/gci:gcs-release-artifacts-and-hashes": "extra/gce",
|
||||||
|
"//cluster/gce/windows:gcs-release-artifacts-and-hashes": "extra/gce/windows",
|
||||||
"//:_binary-artifacts-and-hashes": "bin/{OS}/{ARCH}",
|
"//:_binary-artifacts-and-hashes": "bin/{OS}/{ARCH}",
|
||||||
})),
|
})),
|
||||||
)
|
)
|
||||||
|
|
|
@ -17,6 +17,7 @@ filegroup(
|
||||||
"//cluster/gce/addons:all-srcs",
|
"//cluster/gce/addons:all-srcs",
|
||||||
"//cluster/gce/gci:all-srcs",
|
"//cluster/gce/gci:all-srcs",
|
||||||
"//cluster/gce/manifests:all-srcs",
|
"//cluster/gce/manifests:all-srcs",
|
||||||
|
"//cluster/gce/windows:all-srcs",
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
load("@io_k8s_repo_infra//defs:build.bzl", "release_filegroup")
|
||||||
|
|
||||||
|
# Having the Windows code from the GCE cluster deploy hosted with the release is
|
||||||
|
# useful for GKE. This list should match the list in k8s.io/release/lib/releaselib.sh.
|
||||||
|
|
||||||
|
# IMPORTANT PLEASE NOTE:
|
||||||
|
# Any time the file structure in the `windows` directory changes, `windows/BUILD`
|
||||||
|
# and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
|
||||||
|
# We HIGHLY recommend not changing the file structure, because consumers of
|
||||||
|
# Kubernetes releases depend on the release structure remaining stable.
|
||||||
|
release_filegroup(
|
||||||
|
name = "gcs-release-artifacts",
|
||||||
|
srcs = [
|
||||||
|
"common.psm1",
|
||||||
|
"configure.ps1",
|
||||||
|
"k8s-node-setup.psm1",
|
||||||
|
"testonly/install-ssh.psm1",
|
||||||
|
"testonly/user-profile.psm1",
|
||||||
|
],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
|
@ -1,5 +1,11 @@
|
||||||
# Starting a Windows Kubernetes cluster on GCE using kube-up
|
# Starting a Windows Kubernetes cluster on GCE using kube-up
|
||||||
|
|
||||||
|
## IMPORTANT PLEASE NOTE!
|
||||||
|
Any time the file structure in the `windows` directory changes, `windows/BUILD`
|
||||||
|
and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
|
||||||
|
We HIGHLY recommend not changing the file structure, because consumers of
|
||||||
|
Kubernetes releases depend on the release structure remaining stable.
|
||||||
|
|
||||||
## Bring up the cluster
|
## Bring up the cluster
|
||||||
|
|
||||||
Prerequisites: a Google Cloud Platform project.
|
Prerequisites: a Google Cloud Platform project.
|
||||||
|
@ -185,3 +191,4 @@ These steps are based on
|
||||||
user@kubernetes-minion-windows-group-mk0p:C:\\etc\\kubernetes\\logs \
|
user@kubernetes-minion-windows-group-mk0p:C:\\etc\\kubernetes\\logs \
|
||||||
kubetest-logs/
|
kubetest-logs/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,12 @@
|
||||||
and scripts for configuring Windows nodes.
|
and scripts for configuring Windows nodes.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
# IMPORTANT PLEASE NOTE:
|
||||||
|
# Any time the file structure in the `windows` directory changes, `windows/BUILD`
|
||||||
|
# and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
|
||||||
|
# We HIGHLY recommend not changing the file structure, because consumers of
|
||||||
|
# Kubernetes releases depend on the release structure remaining stable.
|
||||||
|
|
||||||
# Disable progress bar to increase download speed.
|
# Disable progress bar to increase download speed.
|
||||||
$ProgressPreference = 'SilentlyContinue'
|
$ProgressPreference = 'SilentlyContinue'
|
||||||
|
|
||||||
|
@ -65,14 +71,13 @@ function ShouldWrite-File {
|
||||||
|
|
||||||
# Returns the GCE instance metadata value for $Key. If the key is not present
|
# Returns the GCE instance metadata value for $Key. If the key is not present
|
||||||
# in the instance metadata returns $Default if set, otherwise returns $null.
|
# in the instance metadata returns $Default if set, otherwise returns $null.
|
||||||
function Get-InstanceMetadataValue {
|
function Get-InstanceMetadata {
|
||||||
param (
|
param (
|
||||||
[parameter(Mandatory=$true)] [string]$Key,
|
[parameter(Mandatory=$true)] [string]$Key,
|
||||||
[parameter(Mandatory=$false)] [string]$Default
|
[parameter(Mandatory=$false)] [string]$Default
|
||||||
)
|
)
|
||||||
|
|
||||||
$url = ("http://metadata.google.internal/computeMetadata/v1/instance/" +
|
$url = "http://metadata.google.internal/computeMetadata/v1/instance/$Key"
|
||||||
"attributes/$Key")
|
|
||||||
try {
|
try {
|
||||||
$client = New-Object Net.WebClient
|
$client = New-Object Net.WebClient
|
||||||
$client.Headers.Add('Metadata-Flavor', 'Google')
|
$client.Headers.Add('Metadata-Flavor', 'Google')
|
||||||
|
@ -89,6 +94,18 @@ function Get-InstanceMetadataValue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Returns the GCE instance metadata value for $Key where key is an "attribute"
|
||||||
|
# of the instance. If the key is not present in the instance metadata returns
|
||||||
|
# $Default if set, otherwise returns $null.
|
||||||
|
function Get-InstanceMetadataAttribute {
|
||||||
|
param (
|
||||||
|
[parameter(Mandatory=$true)] [string]$Key,
|
||||||
|
[parameter(Mandatory=$false)] [string]$Default
|
||||||
|
)
|
||||||
|
|
||||||
|
return Get-InstanceMetadata "attributes/$Key" $Default
|
||||||
|
}
|
||||||
|
|
||||||
function Validate-SHA1 {
|
function Validate-SHA1 {
|
||||||
param(
|
param(
|
||||||
[parameter(Mandatory=$true)] [string]$Hash,
|
[parameter(Mandatory=$true)] [string]$Hash,
|
||||||
|
|
|
@ -17,6 +17,12 @@
|
||||||
Top-level script that runs on Windows nodes to join them to the K8s cluster.
|
Top-level script that runs on Windows nodes to join them to the K8s cluster.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
# IMPORTANT PLEASE NOTE:
|
||||||
|
# Any time the file structure in the `windows` directory changes, `windows/BUILD`
|
||||||
|
# and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
|
||||||
|
# We HIGHLY recommend not changing the file structure, because consumers of
|
||||||
|
# Kubernetes releases depend on the release structure remaining stable.
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
# Turn on tracing to debug
|
# Turn on tracing to debug
|
||||||
|
@ -27,9 +33,10 @@ $ErrorActionPreference = 'Stop'
|
||||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
$ProgressPreference = 'SilentlyContinue'
|
$ProgressPreference = 'SilentlyContinue'
|
||||||
|
|
||||||
# Returns the GCE instance metadata value for $Key. If the key is not present
|
# Returns the GCE instance metadata value for $Key where key is an "attribute"
|
||||||
# in the instance metadata returns $Default if set, otherwise returns $null.
|
# of the instance. If the key is not present in the instance metadata returns
|
||||||
function Get-InstanceMetadataValue {
|
# $Default if set, otherwise returns $null.
|
||||||
|
function Get-InstanceMetadataAttribute {
|
||||||
param (
|
param (
|
||||||
[parameter(Mandatory=$true)] [string]$Key,
|
[parameter(Mandatory=$true)] [string]$Key,
|
||||||
[parameter(Mandatory=$false)] [string]$Default
|
[parameter(Mandatory=$false)] [string]$Default
|
||||||
|
@ -63,7 +70,7 @@ function FetchAndImport-ModuleFromMetadata {
|
||||||
[parameter(Mandatory=$true)] [string]$Filename
|
[parameter(Mandatory=$true)] [string]$Filename
|
||||||
)
|
)
|
||||||
|
|
||||||
$module = Get-InstanceMetadataValue $MetadataKey
|
$module = Get-InstanceMetadataAttribute $MetadataKey
|
||||||
if (Test-Path C:\$Filename) {
|
if (Test-Path C:\$Filename) {
|
||||||
if (-not $REDO_STEPS) {
|
if (-not $REDO_STEPS) {
|
||||||
Log-Output "Skip: C:\$Filename already exists, not overwriting"
|
Log-Output "Skip: C:\$Filename already exists, not overwriting"
|
||||||
|
@ -81,7 +88,7 @@ try {
|
||||||
# Don't use FetchAndImport-ModuleFromMetadata for common.psm1 - the common
|
# Don't use FetchAndImport-ModuleFromMetadata for common.psm1 - the common
|
||||||
# module includes variables and functions that any other function may depend
|
# module includes variables and functions that any other function may depend
|
||||||
# on.
|
# on.
|
||||||
$module = Get-InstanceMetadataValue 'common-psm1'
|
$module = Get-InstanceMetadataAttribute 'common-psm1'
|
||||||
New-Item -ItemType file -Force C:\common.psm1 | Out-Null
|
New-Item -ItemType file -Force C:\common.psm1 | Out-Null
|
||||||
Set-Content C:\common.psm1 $module
|
Set-Content C:\common.psm1 $module
|
||||||
Import-Module -Force C:\common.psm1
|
Import-Module -Force C:\common.psm1
|
||||||
|
@ -90,6 +97,7 @@ try {
|
||||||
# then put these calls into a loop over a list of XYZ-psm1 keys.
|
# then put these calls into a loop over a list of XYZ-psm1 keys.
|
||||||
FetchAndImport-ModuleFromMetadata 'k8s-node-setup-psm1' 'k8s-node-setup.psm1'
|
FetchAndImport-ModuleFromMetadata 'k8s-node-setup-psm1' 'k8s-node-setup.psm1'
|
||||||
|
|
||||||
|
Dump-DebugInfoToConsole
|
||||||
Set-PrerequisiteOptions
|
Set-PrerequisiteOptions
|
||||||
$kube_env = Fetch-KubeEnv
|
$kube_env = Fetch-KubeEnv
|
||||||
Disable-WindowsDefender
|
Disable-WindowsDefender
|
||||||
|
|
|
@ -36,6 +36,12 @@
|
||||||
# Execute functions manually or run configure.ps1.
|
# Execute functions manually or run configure.ps1.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
# IMPORTANT PLEASE NOTE:
|
||||||
|
# Any time the file structure in the `windows` directory changes, `windows/BUILD`
|
||||||
|
# and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
|
||||||
|
# We HIGHLY recommend not changing the file structure, because consumers of
|
||||||
|
# Kubernetes releases depend on the release structure remaining stable.
|
||||||
|
|
||||||
# TODO: update scripts for these style guidelines:
|
# TODO: update scripts for these style guidelines:
|
||||||
# - Remove {} around variable references unless actually needed for clarity.
|
# - Remove {} around variable references unless actually needed for clarity.
|
||||||
# - Always use single-quoted strings unless actually interpolating variables
|
# - Always use single-quoted strings unless actually interpolating variables
|
||||||
|
@ -128,6 +134,19 @@ function Add_GceMetadataServerRoute {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Writes debugging information, such as Windows version and patch info, to the
|
||||||
|
# console.
|
||||||
|
function Dump-DebugInfoToConsole {
|
||||||
|
Try {
|
||||||
|
$version = "$([System.Environment]::OSVersion.Version | Out-String)"
|
||||||
|
$hotfixes = "$(Get-Hotfix | Out-String)"
|
||||||
|
$image = "$(Get-InstanceMetadata 'image' | Out-String)"
|
||||||
|
Log-Output "Windows version:`n$version"
|
||||||
|
Log-Output "Installed hotfixes:`n$hotfixes"
|
||||||
|
Log-Output "GCE Windows image:`n$image"
|
||||||
|
} Catch { }
|
||||||
|
}
|
||||||
|
|
||||||
# Fetches the kube-env from the instance metadata.
|
# Fetches the kube-env from the instance metadata.
|
||||||
#
|
#
|
||||||
# Returns: a PowerShell Hashtable object containing the key-value pairs from
|
# Returns: a PowerShell Hashtable object containing the key-value pairs from
|
||||||
|
@ -135,7 +154,7 @@ function Add_GceMetadataServerRoute {
|
||||||
function Fetch-KubeEnv {
|
function Fetch-KubeEnv {
|
||||||
# Testing / debugging:
|
# Testing / debugging:
|
||||||
# First:
|
# First:
|
||||||
# ${kube_env} = Get-InstanceMetadataValue 'kube-env'
|
# ${kube_env} = Get-InstanceMetadataAttribute 'kube-env'
|
||||||
# or:
|
# or:
|
||||||
# ${kube_env} = [IO.File]::ReadAllText(".\kubeEnv.txt")
|
# ${kube_env} = [IO.File]::ReadAllText(".\kubeEnv.txt")
|
||||||
# ${kube_env_table} = ConvertFrom-Yaml ${kube_env}
|
# ${kube_env_table} = ConvertFrom-Yaml ${kube_env}
|
||||||
|
@ -143,7 +162,7 @@ function Fetch-KubeEnv {
|
||||||
# ${kube_env_table}.GetType()
|
# ${kube_env_table}.GetType()
|
||||||
|
|
||||||
# The type of kube_env is a powershell String.
|
# The type of kube_env is a powershell String.
|
||||||
$kube_env = Get-InstanceMetadataValue 'kube-env'
|
$kube_env = Get-InstanceMetadataAttribute 'kube-env'
|
||||||
$kube_env_table = ConvertFrom-Yaml ${kube_env}
|
$kube_env_table = ConvertFrom-Yaml ${kube_env}
|
||||||
return ${kube_env_table}
|
return ${kube_env_table}
|
||||||
}
|
}
|
||||||
|
@ -882,7 +901,7 @@ function Configure-Kubelet {
|
||||||
# The Kubelet config is built by build-kubelet-config() in
|
# The Kubelet config is built by build-kubelet-config() in
|
||||||
# cluster/gce/util.sh, and stored in the metadata server under the
|
# cluster/gce/util.sh, and stored in the metadata server under the
|
||||||
# 'kubelet-config' key.
|
# 'kubelet-config' key.
|
||||||
$kubelet_config = Get-InstanceMetadataValue 'kubelet-config'
|
$kubelet_config = Get-InstanceMetadataAttribute 'kubelet-config'
|
||||||
Set-Content ${env:KUBELET_CONFIG} $kubelet_config
|
Set-Content ${env:KUBELET_CONFIG} $kubelet_config
|
||||||
Log-Output "Kubelet config:`n$(Get-Content -Raw ${env:KUBELET_CONFIG})"
|
Log-Output "Kubelet config:`n$(Get-Content -Raw ${env:KUBELET_CONFIG})"
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
# Override this to use a different kubectl binary.
|
# Override this to use a different kubectl binary.
|
||||||
kubectl=kubectl
|
kubectl=kubectl
|
||||||
linux_deployment_timeout=60
|
linux_deployment_timeout=60
|
||||||
windows_deployment_timeout=120
|
windows_deployment_timeout=180
|
||||||
output_file=/tmp/k8s-smoke-test.out
|
output_file=/tmp/k8s-smoke-test.out
|
||||||
|
|
||||||
function check_windows_nodes_are_ready {
|
function check_windows_nodes_are_ready {
|
||||||
|
|
|
@ -22,6 +22,12 @@
|
||||||
clusters. DO NOT USE THIS MODULE FOR PRODUCTION.
|
clusters. DO NOT USE THIS MODULE FOR PRODUCTION.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
# IMPORTANT PLEASE NOTE:
|
||||||
|
# Any time the file structure in the `windows` directory changes, `windows/BUILD`
|
||||||
|
# and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
|
||||||
|
# We HIGHLY recommend not changing the file structure, because consumers of
|
||||||
|
# Kubernetes releases depend on the release structure remaining stable.
|
||||||
|
|
||||||
Import-Module -Force C:\common.psm1
|
Import-Module -Force C:\common.psm1
|
||||||
|
|
||||||
$OPENSSH_ROOT = 'C:\Program Files\OpenSSH'
|
$OPENSSH_ROOT = 'C:\Program Files\OpenSSH'
|
||||||
|
@ -106,7 +112,7 @@ function Setup_WriteSshKeysScript {
|
||||||
|
|
||||||
# Fetch helper module for manipulating Windows user profiles.
|
# Fetch helper module for manipulating Windows user profiles.
|
||||||
if (ShouldWrite-File $USER_PROFILE_MODULE) {
|
if (ShouldWrite-File $USER_PROFILE_MODULE) {
|
||||||
$module = Get-InstanceMetadataValue 'user-profile-psm1'
|
$module = Get-InstanceMetadataAttribute 'user-profile-psm1'
|
||||||
New-Item -ItemType file -Force $USER_PROFILE_MODULE | Out-Null
|
New-Item -ItemType file -Force $USER_PROFILE_MODULE | Out-Null
|
||||||
Set-Content $USER_PROFILE_MODULE $module
|
Set-Content $USER_PROFILE_MODULE $module
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
powershellposse.com
|
powershellposse.com
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
# IMPORTANT PLEASE NOTE:
|
||||||
|
# Any time the file structure in the `windows` directory changes, `windows/BUILD`
|
||||||
|
# and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
|
||||||
|
# We HIGHLY recommend not changing the file structure, because consumers of
|
||||||
|
# Kubernetes releases depend on the release structure remaining stable.
|
||||||
|
|
||||||
|
|
||||||
#Function to create the new local user first
|
#Function to create the new local user first
|
||||||
function New-LocalUser
|
function New-LocalUser
|
||||||
|
|
|
@ -45,6 +45,10 @@ ginkgo_args=(
|
||||||
"--noColor=true"
|
"--noColor=true"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if [[ -n ${E2E_DRYRUN:-} ]]; then
|
||||||
|
ginkgo_args+=("--dryRun=true")
|
||||||
|
fi
|
||||||
|
|
||||||
case ${E2E_PARALLEL} in
|
case ${E2E_PARALLEL} in
|
||||||
'y'|'Y') ginkgo_args+=("--nodes=25") ;;
|
'y'|'Y') ginkgo_args+=("--nodes=25") ;;
|
||||||
[1-9]|[1-9][0-9]*) ginkgo_args+=("--nodes=${E2E_PARALLEL}") ;;
|
[1-9]|[1-9][0-9]*) ginkgo_args+=("--nodes=${E2E_PARALLEL}") ;;
|
||||||
|
|
|
@ -76,7 +76,6 @@ go_library(
|
||||||
"//vendor/github.com/go-openapi/spec:go_default_library",
|
"//vendor/github.com/go-openapi/spec:go_default_library",
|
||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
"//vendor/k8s.io/kube-openapi/pkg/common:go_default_library",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,6 @@ import (
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
|
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
|
||||||
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
|
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
|
||||||
openapi "k8s.io/kube-openapi/pkg/common"
|
|
||||||
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
|
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
"k8s.io/kubernetes/pkg/capabilities"
|
"k8s.io/kubernetes/pkg/capabilities"
|
||||||
|
@ -404,7 +403,6 @@ func buildGenericConfig(
|
||||||
}
|
}
|
||||||
|
|
||||||
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme))
|
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme))
|
||||||
genericConfig.OpenAPIConfig.PostProcessSpec = postProcessOpenAPISpecForBackwardCompatibility
|
|
||||||
genericConfig.OpenAPIConfig.Info.Title = "Kubernetes"
|
genericConfig.OpenAPIConfig.Info.Title = "Kubernetes"
|
||||||
genericConfig.LongRunningFunc = filters.BasicLongRunningRequestCheck(
|
genericConfig.LongRunningFunc = filters.BasicLongRunningRequestCheck(
|
||||||
sets.NewString("watch", "proxy"),
|
sets.NewString("watch", "proxy"),
|
||||||
|
@ -656,347 +654,3 @@ func readCAorNil(file string) ([]byte, error) {
|
||||||
}
|
}
|
||||||
return ioutil.ReadFile(file)
|
return ioutil.ReadFile(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PostProcessSpec adds removed definitions for backward compatibility
|
|
||||||
func postProcessOpenAPISpecForBackwardCompatibility(s *spec.Swagger) (*spec.Swagger, error) {
|
|
||||||
compatibilityMap := map[string]string{
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.SelfSubjectAccessReview": "io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.GitRepoVolumeSource": "io.k8s.api.core.v1.GitRepoVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.ValidatingWebhookConfigurationList": "io.k8s.api.admissionregistration.v1alpha1.ValidatingWebhookConfigurationList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EndpointPort": "io.k8s.api.core.v1.EndpointPort",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.SupplementalGroupsStrategyOptions": "io.k8s.api.extensions.v1beta1.SupplementalGroupsStrategyOptions",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodStatus": "io.k8s.api.core.v1.PodStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.RoleBindingList": "io.k8s.api.rbac.v1beta1.RoleBindingList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.policy.v1beta1.PodDisruptionBudgetSpec": "io.k8s.api.policy.v1beta1.PodDisruptionBudgetSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.HTTPGetAction": "io.k8s.api.core.v1.HTTPGetAction",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.ResourceAttributes": "io.k8s.api.authorization.v1.ResourceAttributes",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeList": "io.k8s.api.core.v1.PersistentVolumeList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v2alpha1.CronJobSpec": "io.k8s.api.batch.v2alpha1.CronJobSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.CephFSVolumeSource": "io.k8s.api.core.v1.CephFSVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Affinity": "io.k8s.api.core.v1.Affinity",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.PolicyRule": "io.k8s.api.rbac.v1beta1.PolicyRule",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DaemonSetSpec": "io.k8s.api.extensions.v1beta1.DaemonSetSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ProjectedVolumeSource": "io.k8s.api.core.v1.ProjectedVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.TCPSocketAction": "io.k8s.api.core.v1.TCPSocketAction",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DaemonSet": "io.k8s.api.extensions.v1beta1.DaemonSet",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.IngressList": "io.k8s.api.extensions.v1beta1.IngressList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodSpec": "io.k8s.api.core.v1.PodSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1.TokenReview": "io.k8s.api.authentication.v1.TokenReview",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.SubjectAccessReview": "io.k8s.api.authorization.v1beta1.SubjectAccessReview",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.ClusterRoleBinding": "io.k8s.api.rbac.v1alpha1.ClusterRoleBinding",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Node": "io.k8s.api.core.v1.Node",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.ServiceReference": "io.k8s.api.admissionregistration.v1alpha1.ServiceReference",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DeploymentStatus": "io.k8s.api.extensions.v1beta1.DeploymentStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.RoleRef": "io.k8s.api.rbac.v1beta1.RoleRef",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.Scale": "io.k8s.api.apps.v1beta1.Scale",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PhotonPersistentDiskVolumeSource": "io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PreferredSchedulingTerm": "io.k8s.api.core.v1.PreferredSchedulingTerm",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v1.JobSpec": "io.k8s.api.batch.v1.JobSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EventSource": "io.k8s.api.core.v1.EventSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Container": "io.k8s.api.core.v1.Container",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.AdmissionHookClientConfig": "io.k8s.api.admissionregistration.v1alpha1.AdmissionHookClientConfig",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ResourceQuota": "io.k8s.api.core.v1.ResourceQuota",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.SecretList": "io.k8s.api.core.v1.SecretList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeSystemInfo": "io.k8s.api.core.v1.NodeSystemInfo",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.PolicyRule": "io.k8s.api.rbac.v1alpha1.PolicyRule",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.ReplicaSetSpec": "io.k8s.api.extensions.v1beta1.ReplicaSetSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeStatus": "io.k8s.api.core.v1.NodeStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ResourceQuotaList": "io.k8s.api.core.v1.ResourceQuotaList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.HostPathVolumeSource": "io.k8s.api.core.v1.HostPathVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.certificates.v1beta1.CertificateSigningRequest": "io.k8s.api.certificates.v1beta1.CertificateSigningRequest",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.IngressRule": "io.k8s.api.extensions.v1beta1.IngressRule",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.NetworkPolicyPeer": "io.k8s.api.extensions.v1beta1.NetworkPolicyPeer",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.storage.v1.StorageClass": "io.k8s.api.storage.v1.StorageClass",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.networking.v1.NetworkPolicyPeer": "io.k8s.api.networking.v1.NetworkPolicyPeer",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.networking.v1.NetworkPolicyIngressRule": "io.k8s.api.networking.v1.NetworkPolicyIngressRule",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.StorageOSPersistentVolumeSource": "io.k8s.api.core.v1.StorageOSPersistentVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.NetworkPolicyIngressRule": "io.k8s.api.extensions.v1beta1.NetworkPolicyIngressRule",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodAffinity": "io.k8s.api.core.v1.PodAffinity",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.RollbackConfig": "io.k8s.api.extensions.v1beta1.RollbackConfig",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodList": "io.k8s.api.core.v1.PodList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.ScaleStatus": "io.k8s.api.extensions.v1beta1.ScaleStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ComponentCondition": "io.k8s.api.core.v1.ComponentCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.certificates.v1beta1.CertificateSigningRequestList": "io.k8s.api.certificates.v1beta1.CertificateSigningRequestList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.ClusterRoleBindingList": "io.k8s.api.rbac.v1alpha1.ClusterRoleBindingList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.HorizontalPodAutoscalerCondition": "io.k8s.api.autoscaling.v2alpha1.HorizontalPodAutoscalerCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ServiceList": "io.k8s.api.core.v1.ServiceList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.PodSecurityPolicy": "io.k8s.api.extensions.v1beta1.PodSecurityPolicy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v1.JobCondition": "io.k8s.api.batch.v1.JobCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.DeploymentStatus": "io.k8s.api.apps.v1beta1.DeploymentStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Volume": "io.k8s.api.core.v1.Volume",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.RoleBindingList": "io.k8s.api.rbac.v1alpha1.RoleBindingList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.Rule": "io.k8s.api.admissionregistration.v1alpha1.Rule",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.NetworkPolicy": "io.k8s.api.extensions.v1beta1.NetworkPolicy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.ClusterRoleList": "io.k8s.api.rbac.v1alpha1.ClusterRoleList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ObjectFieldSelector": "io.k8s.api.core.v1.ObjectFieldSelector",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EventList": "io.k8s.api.core.v1.EventList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.MetricStatus": "io.k8s.api.autoscaling.v2alpha1.MetricStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.networking.v1.NetworkPolicyPort": "io.k8s.api.networking.v1.NetworkPolicyPort",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.RoleList": "io.k8s.api.rbac.v1beta1.RoleList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.RoleList": "io.k8s.api.rbac.v1alpha1.RoleList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.DeploymentStrategy": "io.k8s.api.apps.v1beta1.DeploymentStrategy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.CrossVersionObjectReference": "io.k8s.api.autoscaling.v1.CrossVersionObjectReference",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ConfigMapProjection": "io.k8s.api.core.v1.ConfigMapProjection",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.CrossVersionObjectReference": "io.k8s.api.autoscaling.v2alpha1.CrossVersionObjectReference",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LoadBalancerStatus": "io.k8s.api.core.v1.LoadBalancerStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ISCSIVolumeSource": "io.k8s.api.core.v1.ISCSIVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.ControllerRevisionList": "io.k8s.api.apps.v1beta1.ControllerRevisionList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EndpointSubset": "io.k8s.api.core.v1.EndpointSubset",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.SELinuxOptions": "io.k8s.api.core.v1.SELinuxOptions",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeClaimVolumeSource": "io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.MetricSpec": "io.k8s.api.autoscaling.v2alpha1.MetricSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.StatefulSetList": "io.k8s.api.apps.v1beta1.StatefulSetList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.ResourceAttributes": "io.k8s.api.authorization.v1beta1.ResourceAttributes",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Capabilities": "io.k8s.api.core.v1.Capabilities",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.Deployment": "io.k8s.api.extensions.v1beta1.Deployment",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Binding": "io.k8s.api.core.v1.Binding",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ReplicationControllerList": "io.k8s.api.core.v1.ReplicationControllerList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.SelfSubjectAccessReview": "io.k8s.api.authorization.v1.SelfSubjectAccessReview",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1beta1.UserInfo": "io.k8s.api.authentication.v1beta1.UserInfo",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.HostAlias": "io.k8s.api.core.v1.HostAlias",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.StatefulSetUpdateStrategy": "io.k8s.api.apps.v1beta1.StatefulSetUpdateStrategy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.IngressSpec": "io.k8s.api.extensions.v1beta1.IngressSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DeploymentCondition": "io.k8s.api.extensions.v1beta1.DeploymentCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.GCEPersistentDiskVolumeSource": "io.k8s.api.core.v1.GCEPersistentDiskVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.Webhook": "io.k8s.api.admissionregistration.v1alpha1.Webhook",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.Scale": "io.k8s.api.extensions.v1beta1.Scale",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.HorizontalPodAutoscalerStatus": "io.k8s.api.autoscaling.v2alpha1.HorizontalPodAutoscalerStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.FlexVolumeSource": "io.k8s.api.core.v1.FlexVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.RollingUpdateDeployment": "io.k8s.api.extensions.v1beta1.RollingUpdateDeployment",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.ObjectMetricStatus": "io.k8s.api.autoscaling.v2alpha1.ObjectMetricStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Event": "io.k8s.api.core.v1.Event",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ResourceQuotaSpec": "io.k8s.api.core.v1.ResourceQuotaSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Handler": "io.k8s.api.core.v1.Handler",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.IngressBackend": "io.k8s.api.extensions.v1beta1.IngressBackend",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.Role": "io.k8s.api.rbac.v1alpha1.Role",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.ObjectMetricSource": "io.k8s.api.autoscaling.v2alpha1.ObjectMetricSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.ResourceMetricStatus": "io.k8s.api.autoscaling.v2alpha1.ResourceMetricStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.HorizontalPodAutoscalerSpec": "io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Lifecycle": "io.k8s.api.core.v1.Lifecycle",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.certificates.v1beta1.CertificateSigningRequestStatus": "io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ContainerStateRunning": "io.k8s.api.core.v1.ContainerStateRunning",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ServiceAccountList": "io.k8s.api.core.v1.ServiceAccountList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.HostPortRange": "io.k8s.api.extensions.v1beta1.HostPortRange",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.ControllerRevision": "io.k8s.api.apps.v1beta1.ControllerRevision",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ReplicationControllerSpec": "io.k8s.api.core.v1.ReplicationControllerSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ContainerStateTerminated": "io.k8s.api.core.v1.ContainerStateTerminated",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ReplicationControllerStatus": "io.k8s.api.core.v1.ReplicationControllerStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DaemonSetList": "io.k8s.api.extensions.v1beta1.DaemonSetList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.SelfSubjectAccessReviewSpec": "io.k8s.api.authorization.v1.SelfSubjectAccessReviewSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ComponentStatusList": "io.k8s.api.core.v1.ComponentStatusList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ContainerStateWaiting": "io.k8s.api.core.v1.ContainerStateWaiting",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.VolumeMount": "io.k8s.api.core.v1.VolumeMount",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Secret": "io.k8s.api.core.v1.Secret",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.ClusterRoleList": "io.k8s.api.rbac.v1beta1.ClusterRoleList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ConfigMapList": "io.k8s.api.core.v1.ConfigMapList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.storage.v1beta1.StorageClassList": "io.k8s.api.storage.v1beta1.StorageClassList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.HTTPIngressPath": "io.k8s.api.extensions.v1beta1.HTTPIngressPath",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.ClusterRole": "io.k8s.api.rbac.v1alpha1.ClusterRole",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.ResourceMetricSource": "io.k8s.api.autoscaling.v2alpha1.ResourceMetricSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DeploymentRollback": "io.k8s.api.extensions.v1beta1.DeploymentRollback",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeClaimSpec": "io.k8s.api.core.v1.PersistentVolumeClaimSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ReplicationController": "io.k8s.api.core.v1.ReplicationController",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.StatefulSetSpec": "io.k8s.api.apps.v1beta1.StatefulSetSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.SecurityContext": "io.k8s.api.core.v1.SecurityContext",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.networking.v1.NetworkPolicySpec": "io.k8s.api.networking.v1.NetworkPolicySpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LocalObjectReference": "io.k8s.api.core.v1.LocalObjectReference",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.RBDVolumeSource": "io.k8s.api.core.v1.RBDVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.NetworkPolicySpec": "io.k8s.api.extensions.v1beta1.NetworkPolicySpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.KeyToPath": "io.k8s.api.core.v1.KeyToPath",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.WeightedPodAffinityTerm": "io.k8s.api.core.v1.WeightedPodAffinityTerm",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.PodsMetricStatus": "io.k8s.api.autoscaling.v2alpha1.PodsMetricStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeAddress": "io.k8s.api.core.v1.NodeAddress",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.Ingress": "io.k8s.api.extensions.v1beta1.Ingress",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.policy.v1beta1.PodDisruptionBudget": "io.k8s.api.policy.v1beta1.PodDisruptionBudget",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ServicePort": "io.k8s.api.core.v1.ServicePort",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.IDRange": "io.k8s.api.extensions.v1beta1.IDRange",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.SecretEnvSource": "io.k8s.api.core.v1.SecretEnvSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeSelector": "io.k8s.api.core.v1.NodeSelector",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeClaimStatus": "io.k8s.api.core.v1.PersistentVolumeClaimStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.DeploymentSpec": "io.k8s.api.apps.v1beta1.DeploymentSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.NonResourceAttributes": "io.k8s.api.authorization.v1.NonResourceAttributes",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.ScaleStatus": "io.k8s.api.autoscaling.v1.ScaleStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodCondition": "io.k8s.api.core.v1.PodCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodTemplateSpec": "io.k8s.api.core.v1.PodTemplateSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.StatefulSet": "io.k8s.api.apps.v1beta1.StatefulSet",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.NetworkPolicyPort": "io.k8s.api.extensions.v1beta1.NetworkPolicyPort",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1beta1.TokenReview": "io.k8s.api.authentication.v1beta1.TokenReview",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LimitRangeSpec": "io.k8s.api.core.v1.LimitRangeSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.FlockerVolumeSource": "io.k8s.api.core.v1.FlockerVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.policy.v1beta1.Eviction": "io.k8s.api.policy.v1beta1.Eviction",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeClaimList": "io.k8s.api.core.v1.PersistentVolumeClaimList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.certificates.v1beta1.CertificateSigningRequestCondition": "io.k8s.api.certificates.v1beta1.CertificateSigningRequestCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.DownwardAPIVolumeFile": "io.k8s.api.core.v1.DownwardAPIVolumeFile",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.LocalSubjectAccessReview": "io.k8s.api.authorization.v1beta1.LocalSubjectAccessReview",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.ScaleStatus": "io.k8s.api.apps.v1beta1.ScaleStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.HTTPIngressRuleValue": "io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v1.Job": "io.k8s.api.batch.v1.Job",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.ValidatingWebhookConfiguration": "io.k8s.api.admissionregistration.v1alpha1.ValidatingWebhookConfiguration",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.RoleBinding": "io.k8s.api.rbac.v1beta1.RoleBinding",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.FCVolumeSource": "io.k8s.api.core.v1.FCVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EndpointAddress": "io.k8s.api.core.v1.EndpointAddress",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ContainerPort": "io.k8s.api.core.v1.ContainerPort",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.ClusterRoleBinding": "io.k8s.api.rbac.v1beta1.ClusterRoleBinding",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.GlusterfsVolumeSource": "io.k8s.api.core.v1.GlusterfsVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ResourceRequirements": "io.k8s.api.core.v1.ResourceRequirements",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.RollingUpdateDeployment": "io.k8s.api.apps.v1beta1.RollingUpdateDeployment",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NamespaceStatus": "io.k8s.api.core.v1.NamespaceStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.RunAsUserStrategyOptions": "io.k8s.api.extensions.v1beta1.RunAsUserStrategyOptions",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Namespace": "io.k8s.api.core.v1.Namespace",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.SubjectAccessReviewSpec": "io.k8s.api.authorization.v1.SubjectAccessReviewSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.HorizontalPodAutoscaler": "io.k8s.api.autoscaling.v2alpha1.HorizontalPodAutoscaler",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.ReplicaSetCondition": "io.k8s.api.extensions.v1beta1.ReplicaSetCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.HorizontalPodAutoscalerStatus": "io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1.TokenReviewStatus": "io.k8s.api.authentication.v1.TokenReviewStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolume": "io.k8s.api.core.v1.PersistentVolume",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.FSGroupStrategyOptions": "io.k8s.api.extensions.v1beta1.FSGroupStrategyOptions",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodSecurityContext": "io.k8s.api.core.v1.PodSecurityContext",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodTemplate": "io.k8s.api.core.v1.PodTemplate",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.LocalSubjectAccessReview": "io.k8s.api.authorization.v1.LocalSubjectAccessReview",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.StorageOSVolumeSource": "io.k8s.api.core.v1.StorageOSVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeSelectorTerm": "io.k8s.api.core.v1.NodeSelectorTerm",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.Role": "io.k8s.api.rbac.v1beta1.Role",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ContainerStatus": "io.k8s.api.core.v1.ContainerStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.SubjectAccessReviewStatus": "io.k8s.api.authorization.v1.SubjectAccessReviewStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1.TokenReviewSpec": "io.k8s.api.authentication.v1.TokenReviewSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ConfigMap": "io.k8s.api.core.v1.ConfigMap",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ServiceStatus": "io.k8s.api.core.v1.ServiceStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.SelfSubjectAccessReviewSpec": "io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.CinderVolumeSource": "io.k8s.api.core.v1.CinderVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.settings.v1alpha1.PodPresetSpec": "io.k8s.api.settings.v1alpha1.PodPresetSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.NonResourceAttributes": "io.k8s.api.authorization.v1beta1.NonResourceAttributes",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ContainerImage": "io.k8s.api.core.v1.ContainerImage",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ReplicationControllerCondition": "io.k8s.api.core.v1.ReplicationControllerCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EmptyDirVolumeSource": "io.k8s.api.core.v1.EmptyDirVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.HorizontalPodAutoscalerList": "io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v1.JobList": "io.k8s.api.batch.v1.JobList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NFSVolumeSource": "io.k8s.api.core.v1.NFSVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Pod": "io.k8s.api.core.v1.Pod",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ObjectReference": "io.k8s.api.core.v1.ObjectReference",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.Deployment": "io.k8s.api.apps.v1beta1.Deployment",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.storage.v1.StorageClassList": "io.k8s.api.storage.v1.StorageClassList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.AttachedVolume": "io.k8s.api.core.v1.AttachedVolume",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.AWSElasticBlockStoreVolumeSource": "io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v2alpha1.CronJobList": "io.k8s.api.batch.v2alpha1.CronJobList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DeploymentSpec": "io.k8s.api.extensions.v1beta1.DeploymentSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.PodSecurityPolicyList": "io.k8s.api.extensions.v1beta1.PodSecurityPolicyList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodAffinityTerm": "io.k8s.api.core.v1.PodAffinityTerm",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.HTTPHeader": "io.k8s.api.core.v1.HTTPHeader",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ConfigMapKeySelector": "io.k8s.api.core.v1.ConfigMapKeySelector",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.SecretKeySelector": "io.k8s.api.core.v1.SecretKeySelector",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DeploymentList": "io.k8s.api.extensions.v1beta1.DeploymentList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1.UserInfo": "io.k8s.api.authentication.v1.UserInfo",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LoadBalancerIngress": "io.k8s.api.core.v1.LoadBalancerIngress",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.DaemonEndpoint": "io.k8s.api.core.v1.DaemonEndpoint",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeSelectorRequirement": "io.k8s.api.core.v1.NodeSelectorRequirement",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v2alpha1.CronJobStatus": "io.k8s.api.batch.v2alpha1.CronJobStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.Scale": "io.k8s.api.autoscaling.v1.Scale",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ScaleIOVolumeSource": "io.k8s.api.core.v1.ScaleIOVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodAntiAffinity": "io.k8s.api.core.v1.PodAntiAffinity",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.PodSecurityPolicySpec": "io.k8s.api.extensions.v1beta1.PodSecurityPolicySpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.settings.v1alpha1.PodPresetList": "io.k8s.api.settings.v1alpha1.PodPresetList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeAffinity": "io.k8s.api.core.v1.NodeAffinity",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.DeploymentCondition": "io.k8s.api.apps.v1beta1.DeploymentCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeSpec": "io.k8s.api.core.v1.NodeSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.StatefulSetStatus": "io.k8s.api.apps.v1beta1.StatefulSetStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.RuleWithOperations": "io.k8s.api.admissionregistration.v1alpha1.RuleWithOperations",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.IngressStatus": "io.k8s.api.extensions.v1beta1.IngressStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LimitRangeList": "io.k8s.api.core.v1.LimitRangeList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.AzureDiskVolumeSource": "io.k8s.api.core.v1.AzureDiskVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.ReplicaSetStatus": "io.k8s.api.extensions.v1beta1.ReplicaSetStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ComponentStatus": "io.k8s.api.core.v1.ComponentStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.HorizontalPodAutoscaler": "io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.networking.v1.NetworkPolicy": "io.k8s.api.networking.v1.NetworkPolicy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.RollbackConfig": "io.k8s.api.apps.v1beta1.RollbackConfig",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeCondition": "io.k8s.api.core.v1.NodeCondition",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.DownwardAPIProjection": "io.k8s.api.core.v1.DownwardAPIProjection",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.SELinuxStrategyOptions": "io.k8s.api.extensions.v1beta1.SELinuxStrategyOptions",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NamespaceSpec": "io.k8s.api.core.v1.NamespaceSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.certificates.v1beta1.CertificateSigningRequestSpec": "io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ServiceSpec": "io.k8s.api.core.v1.ServiceSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1.SubjectAccessReview": "io.k8s.api.authorization.v1.SubjectAccessReview",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.DeploymentList": "io.k8s.api.apps.v1beta1.DeploymentList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Toleration": "io.k8s.api.core.v1.Toleration",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.NetworkPolicyList": "io.k8s.api.extensions.v1beta1.NetworkPolicyList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.PodsMetricSource": "io.k8s.api.autoscaling.v2alpha1.PodsMetricSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EnvFromSource": "io.k8s.api.core.v1.EnvFromSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v1.ScaleSpec": "io.k8s.api.autoscaling.v1.ScaleSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PodTemplateList": "io.k8s.api.core.v1.PodTemplateList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.HorizontalPodAutoscalerSpec": "io.k8s.api.autoscaling.v2alpha1.HorizontalPodAutoscalerSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.SecretProjection": "io.k8s.api.core.v1.SecretProjection",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ResourceFieldSelector": "io.k8s.api.core.v1.ResourceFieldSelector",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeSpec": "io.k8s.api.core.v1.PersistentVolumeSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ConfigMapVolumeSource": "io.k8s.api.core.v1.ConfigMapVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.autoscaling.v2alpha1.HorizontalPodAutoscalerList": "io.k8s.api.autoscaling.v2alpha1.HorizontalPodAutoscalerList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1beta1.TokenReviewStatus": "io.k8s.api.authentication.v1beta1.TokenReviewStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.networking.v1.NetworkPolicyList": "io.k8s.api.networking.v1.NetworkPolicyList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Endpoints": "io.k8s.api.core.v1.Endpoints",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LimitRangeItem": "io.k8s.api.core.v1.LimitRangeItem",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ServiceAccount": "io.k8s.api.core.v1.ServiceAccount",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.ScaleSpec": "io.k8s.api.extensions.v1beta1.ScaleSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.IngressTLS": "io.k8s.api.extensions.v1beta1.IngressTLS",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v2alpha1.CronJob": "io.k8s.api.batch.v2alpha1.CronJob",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.Subject": "io.k8s.api.rbac.v1alpha1.Subject",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DaemonSetStatus": "io.k8s.api.extensions.v1beta1.DaemonSetStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.policy.v1beta1.PodDisruptionBudgetList": "io.k8s.api.policy.v1beta1.PodDisruptionBudgetList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.VsphereVirtualDiskVolumeSource": "io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.RoleRef": "io.k8s.api.rbac.v1alpha1.RoleRef",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PortworxVolumeSource": "io.k8s.api.core.v1.PortworxVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.ReplicaSetList": "io.k8s.api.extensions.v1beta1.ReplicaSetList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.VolumeProjection": "io.k8s.api.core.v1.VolumeProjection",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.storage.v1beta1.StorageClass": "io.k8s.api.storage.v1beta1.StorageClass",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.ReplicaSet": "io.k8s.api.extensions.v1beta1.ReplicaSet",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.DeploymentRollback": "io.k8s.api.apps.v1beta1.DeploymentRollback",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1alpha1.RoleBinding": "io.k8s.api.rbac.v1alpha1.RoleBinding",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.AzureFileVolumeSource": "io.k8s.api.core.v1.AzureFileVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.policy.v1beta1.PodDisruptionBudgetStatus": "io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authentication.v1beta1.TokenReviewSpec": "io.k8s.api.authentication.v1beta1.TokenReviewSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EndpointsList": "io.k8s.api.core.v1.EndpointsList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ConfigMapEnvSource": "io.k8s.api.core.v1.ConfigMapEnvSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v2alpha1.JobTemplateSpec": "io.k8s.api.batch.v2alpha1.JobTemplateSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DaemonSetUpdateStrategy": "io.k8s.api.extensions.v1beta1.DaemonSetUpdateStrategy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.SubjectAccessReviewSpec": "io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LocalVolumeSource": "io.k8s.api.core.v1.LocalVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ContainerState": "io.k8s.api.core.v1.ContainerState",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Service": "io.k8s.api.core.v1.Service",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ExecAction": "io.k8s.api.core.v1.ExecAction",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Taint": "io.k8s.api.core.v1.Taint",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.Subject": "io.k8s.api.rbac.v1beta1.Subject",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.authorization.v1beta1.SubjectAccessReviewStatus": "io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.ClusterRoleBindingList": "io.k8s.api.rbac.v1beta1.ClusterRoleBindingList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.DownwardAPIVolumeSource": "io.k8s.api.core.v1.DownwardAPIVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.batch.v1.JobStatus": "io.k8s.api.batch.v1.JobStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.ResourceQuotaStatus": "io.k8s.api.core.v1.ResourceQuotaStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeStatus": "io.k8s.api.core.v1.PersistentVolumeStatus",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.PersistentVolumeClaim": "io.k8s.api.core.v1.PersistentVolumeClaim",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeDaemonEndpoints": "io.k8s.api.core.v1.NodeDaemonEndpoints",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EnvVar": "io.k8s.api.core.v1.EnvVar",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.SecretVolumeSource": "io.k8s.api.core.v1.SecretVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.EnvVarSource": "io.k8s.api.core.v1.EnvVarSource",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.RollingUpdateStatefulSetStrategy": "io.k8s.api.apps.v1beta1.RollingUpdateStatefulSetStrategy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.rbac.v1beta1.ClusterRole": "io.k8s.api.rbac.v1beta1.ClusterRole",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.admissionregistration.v1alpha1.Initializer": "io.k8s.api.admissionregistration.v1alpha1.Initializer",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.DeploymentStrategy": "io.k8s.api.extensions.v1beta1.DeploymentStrategy",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.apps.v1beta1.ScaleSpec": "io.k8s.api.apps.v1beta1.ScaleSpec",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.settings.v1alpha1.PodPreset": "io.k8s.api.settings.v1alpha1.PodPreset",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.Probe": "io.k8s.api.core.v1.Probe",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NamespaceList": "io.k8s.api.core.v1.NamespaceList",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.QuobyteVolumeSource": "io.k8s.api.core.v1.QuobyteVolumeSource",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.NodeList": "io.k8s.api.core.v1.NodeList",
|
|
||||||
"io.k8s.kubernetes.pkg.apis.extensions.v1beta1.RollingUpdateDaemonSet": "io.k8s.api.extensions.v1beta1.RollingUpdateDaemonSet",
|
|
||||||
"io.k8s.kubernetes.pkg.api.v1.LimitRange": "io.k8s.api.core.v1.LimitRange",
|
|
||||||
}
|
|
||||||
|
|
||||||
for k, v := range compatibilityMap {
|
|
||||||
if _, found := s.Definitions[v]; !found {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
s.Definitions[k] = spec.Schema{
|
|
||||||
SchemaProps: spec.SchemaProps{
|
|
||||||
Ref: spec.MustCreateRef("#/definitions/" + openapi.EscapeJsonPointer(v)),
|
|
||||||
Description: fmt.Sprintf("Deprecated. Please use %s instead.", v),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ type APIEndpoint struct {
|
||||||
// NodeRegistrationOptions holds fields that relate to registering a new control-plane or node to the cluster, either via "kubeadm init" or "kubeadm join"
|
// NodeRegistrationOptions holds fields that relate to registering a new control-plane or node to the cluster, either via "kubeadm init" or "kubeadm join"
|
||||||
type NodeRegistrationOptions struct {
|
type NodeRegistrationOptions struct {
|
||||||
|
|
||||||
// Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm joiń` operation.
|
// Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation.
|
||||||
// This field is also used in the CommonName field of the kubelet's client certificate to the API server.
|
// This field is also used in the CommonName field of the kubelet's client certificate to the API server.
|
||||||
// Defaults to the hostname of the node if not provided.
|
// Defaults to the hostname of the node if not provided.
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
|
|
|
@ -97,7 +97,7 @@ func runEtcdPhaseLocal() func(c workflow.RunData) error {
|
||||||
return errors.Wrap(err, "error creating local etcd static pod manifest file")
|
return errors.Wrap(err, "error creating local etcd static pod manifest file")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
klog.V(1).Infof("[etcd] External etcd mode. Skipping the creation of a manifest for local etcd")
|
klog.V(1).Infoln("[etcd] External etcd mode. Skipping the creation of a manifest for local etcd")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ func runKubeletStart(c workflow.RunData) error {
|
||||||
// First off, configure the kubelet. In this short timeframe, kubeadm is trying to stop/restart the kubelet
|
// First off, configure the kubelet. In this short timeframe, kubeadm is trying to stop/restart the kubelet
|
||||||
// Try to stop the kubelet service so no race conditions occur when configuring it
|
// Try to stop the kubelet service so no race conditions occur when configuring it
|
||||||
if !data.DryRun() {
|
if !data.DryRun() {
|
||||||
klog.V(1).Infof("Stopping the kubelet")
|
klog.V(1).Infoln("Stopping the kubelet")
|
||||||
kubeletphase.TryStopKubelet()
|
kubeletphase.TryStopKubelet()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ func runKubeletStart(c workflow.RunData) error {
|
||||||
|
|
||||||
// Try to start the kubelet service in case it's inactive
|
// Try to start the kubelet service in case it's inactive
|
||||||
if !data.DryRun() {
|
if !data.DryRun() {
|
||||||
klog.V(1).Infof("Starting the kubelet")
|
klog.V(1).Infoln("Starting the kubelet")
|
||||||
kubeletphase.TryStartKubelet()
|
kubeletphase.TryStartKubelet()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ func runUploadCerts(c workflow.RunData) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !data.UploadCerts() {
|
if !data.UploadCerts() {
|
||||||
klog.V(1).Infof("[upload-certs] Skipping certs upload")
|
klog.V(1).Infoln("[upload-certs] Skipping certs upload")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
client, err := data.Client()
|
client, err := data.Client()
|
||||||
|
|
|
@ -106,7 +106,7 @@ func runUploadKubeadmConfig(c workflow.RunData) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
klog.V(1).Infof("[upload-config] Uploading the kubeadm ClusterConfiguration to a ConfigMap")
|
klog.V(1).Infoln("[upload-config] Uploading the kubeadm ClusterConfiguration to a ConfigMap")
|
||||||
if err := uploadconfig.UploadConfiguration(cfg, client); err != nil {
|
if err := uploadconfig.UploadConfiguration(cfg, client); err != nil {
|
||||||
return errors.Wrap(err, "error uploading the kubeadm ClusterConfiguration")
|
return errors.Wrap(err, "error uploading the kubeadm ClusterConfiguration")
|
||||||
}
|
}
|
||||||
|
@ -120,12 +120,12 @@ func runUploadKubeletConfig(c workflow.RunData) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
klog.V(1).Infof("[upload-config] Uploading the kubelet component config to a ConfigMap")
|
klog.V(1).Infoln("[upload-config] Uploading the kubelet component config to a ConfigMap")
|
||||||
if err = kubeletphase.CreateConfigMap(cfg.ClusterConfiguration.ComponentConfigs.Kubelet, cfg.KubernetesVersion, client); err != nil {
|
if err = kubeletphase.CreateConfigMap(cfg.ClusterConfiguration.ComponentConfigs.Kubelet, cfg.KubernetesVersion, client); err != nil {
|
||||||
return errors.Wrap(err, "error creating kubelet configuration ConfigMap")
|
return errors.Wrap(err, "error creating kubelet configuration ConfigMap")
|
||||||
}
|
}
|
||||||
|
|
||||||
klog.V(1).Infof("[upload-config] Preserving the CRISocket information for the control-plane node")
|
klog.V(1).Infoln("[upload-config] Preserving the CRISocket information for the control-plane node")
|
||||||
if err := patchnodephase.AnnotateCRISocket(client, cfg.NodeRegistration.Name, cfg.NodeRegistration.CRISocket); err != nil {
|
if err := patchnodephase.AnnotateCRISocket(client, cfg.NodeRegistration.Name, cfg.NodeRegistration.CRISocket); err != nil {
|
||||||
return errors.Wrap(err, "Error writing Crisocket information for the control-plane node")
|
return errors.Wrap(err, "Error writing Crisocket information for the control-plane node")
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ func runWaitControlPlanePhase(c workflow.RunData) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// waiter holds the apiclient.Waiter implementation of choice, responsible for querying the API server in various ways and waiting for conditions to be fulfilled
|
// waiter holds the apiclient.Waiter implementation of choice, responsible for querying the API server in various ways and waiting for conditions to be fulfilled
|
||||||
klog.V(1).Infof("[wait-control-plane] Waiting for the API server to be healthy")
|
klog.V(1).Infoln("[wait-control-plane] Waiting for the API server to be healthy")
|
||||||
|
|
||||||
client, err := data.Client()
|
client, err := data.Client()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -44,10 +44,12 @@ func getControlPlaneJoinPhaseFlags() []string {
|
||||||
options.CfgPath,
|
options.CfgPath,
|
||||||
options.ControlPlane,
|
options.ControlPlane,
|
||||||
options.NodeName,
|
options.NodeName,
|
||||||
|
options.FileDiscovery,
|
||||||
options.TokenDiscovery,
|
options.TokenDiscovery,
|
||||||
options.TokenDiscoveryCAHash,
|
options.TokenDiscoveryCAHash,
|
||||||
options.TokenDiscoverySkipCAHash,
|
options.TokenDiscoverySkipCAHash,
|
||||||
options.KubeconfigPath,
|
options.TLSBootstrapToken,
|
||||||
|
options.TokenStr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,11 @@ func NewControlPlanePreparePhase() workflow.Phase {
|
||||||
Short: "Prepares the machine for serving a control plane.",
|
Short: "Prepares the machine for serving a control plane.",
|
||||||
Phases: []workflow.Phase{
|
Phases: []workflow.Phase{
|
||||||
{
|
{
|
||||||
Name: "all",
|
Name: "all",
|
||||||
Short: "Prepares the machine for serving a control plane.",
|
Short: "Prepares the machine for serving a control plane.",
|
||||||
InheritFlags: getControlPlanePreparePhaseFlags(),
|
InheritFlags: append(getControlPlanePreparePhaseFlags(),
|
||||||
|
options.CertificateKey,
|
||||||
|
),
|
||||||
RunAllSiblings: true,
|
RunAllSiblings: true,
|
||||||
},
|
},
|
||||||
newControlPlanePrepareDownloadCertsSubphase(),
|
newControlPlanePrepareDownloadCertsSubphase(),
|
||||||
|
@ -61,10 +63,12 @@ func getControlPlanePreparePhaseFlags() []string {
|
||||||
options.CfgPath,
|
options.CfgPath,
|
||||||
options.ControlPlane,
|
options.ControlPlane,
|
||||||
options.NodeName,
|
options.NodeName,
|
||||||
|
options.FileDiscovery,
|
||||||
options.TokenDiscovery,
|
options.TokenDiscovery,
|
||||||
options.TokenDiscoveryCAHash,
|
options.TokenDiscoveryCAHash,
|
||||||
options.TokenDiscoverySkipCAHash,
|
options.TokenDiscoverySkipCAHash,
|
||||||
options.CertificateKey,
|
options.TLSBootstrapToken,
|
||||||
|
options.TokenStr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,10 +78,9 @@ func newControlPlanePrepareDownloadCertsSubphase() workflow.Phase {
|
||||||
Short: fmt.Sprintf("Download certificates from %s", kubeadmconstants.KubeadmCertsSecret),
|
Short: fmt.Sprintf("Download certificates from %s", kubeadmconstants.KubeadmCertsSecret),
|
||||||
Long: cmdutil.MacroCommandLongDescription,
|
Long: cmdutil.MacroCommandLongDescription,
|
||||||
Run: runControlPlanePrepareDownloadCertsPhaseLocal,
|
Run: runControlPlanePrepareDownloadCertsPhaseLocal,
|
||||||
InheritFlags: []string{
|
InheritFlags: append(getControlPlanePreparePhaseFlags(),
|
||||||
options.CfgPath,
|
|
||||||
options.CertificateKey,
|
options.CertificateKey,
|
||||||
},
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,10 +64,11 @@ func NewKubeletStartPhase() workflow.Phase {
|
||||||
options.CfgPath,
|
options.CfgPath,
|
||||||
options.NodeCRISocket,
|
options.NodeCRISocket,
|
||||||
options.NodeName,
|
options.NodeName,
|
||||||
options.TLSBootstrapToken,
|
options.FileDiscovery,
|
||||||
options.TokenDiscovery,
|
options.TokenDiscovery,
|
||||||
options.TokenDiscoveryCAHash,
|
options.TokenDiscoveryCAHash,
|
||||||
options.TokenDiscoverySkipCAHash,
|
options.TokenDiscoverySkipCAHash,
|
||||||
|
options.TLSBootstrapToken,
|
||||||
options.TokenStr,
|
options.TokenStr,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -126,7 +127,7 @@ func runKubeletStartJoinPhase(c workflow.RunData) error {
|
||||||
|
|
||||||
// Configure the kubelet. In this short timeframe, kubeadm is trying to stop/restart the kubelet
|
// Configure the kubelet. In this short timeframe, kubeadm is trying to stop/restart the kubelet
|
||||||
// Try to stop the kubelet service so no race conditions occur when configuring it
|
// Try to stop the kubelet service so no race conditions occur when configuring it
|
||||||
klog.V(1).Infof("[kubelet-start] Stopping the kubelet")
|
klog.V(1).Infoln("[kubelet-start] Stopping the kubelet")
|
||||||
kubeletphase.TryStopKubelet()
|
kubeletphase.TryStopKubelet()
|
||||||
|
|
||||||
// Write the configuration for the kubelet (using the bootstrap token credentials) to disk so the kubelet can start
|
// Write the configuration for the kubelet (using the bootstrap token credentials) to disk so the kubelet can start
|
||||||
|
@ -143,7 +144,7 @@ func runKubeletStartJoinPhase(c workflow.RunData) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to start the kubelet service in case it's inactive
|
// Try to start the kubelet service in case it's inactive
|
||||||
klog.V(1).Infof("[kubelet-start] Starting the kubelet")
|
klog.V(1).Infoln("[kubelet-start] Starting the kubelet")
|
||||||
kubeletphase.TryStartKubelet()
|
kubeletphase.TryStartKubelet()
|
||||||
|
|
||||||
// Now the kubelet will perform the TLS Bootstrap, transforming /etc/kubernetes/bootstrap-kubelet.conf to /etc/kubernetes/kubelet.conf
|
// Now the kubelet will perform the TLS Bootstrap, transforming /etc/kubernetes/bootstrap-kubelet.conf to /etc/kubernetes/kubelet.conf
|
||||||
|
@ -161,7 +162,7 @@ func runKubeletStartJoinPhase(c workflow.RunData) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
klog.V(1).Infof("[kubelet-start] preserving the crisocket information for the node")
|
klog.V(1).Infoln("[kubelet-start] preserving the crisocket information for the node")
|
||||||
if err := patchnodephase.AnnotateCRISocket(client, cfg.NodeRegistration.Name, cfg.NodeRegistration.CRISocket); err != nil {
|
if err := patchnodephase.AnnotateCRISocket(client, cfg.NodeRegistration.Name, cfg.NodeRegistration.CRISocket); err != nil {
|
||||||
return errors.Wrap(err, "error uploading crisocket")
|
return errors.Wrap(err, "error uploading crisocket")
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ func NewPreflightPhase() workflow.Phase {
|
||||||
options.TokenDiscovery,
|
options.TokenDiscovery,
|
||||||
options.TokenDiscoveryCAHash,
|
options.TokenDiscoveryCAHash,
|
||||||
options.TokenDiscoverySkipCAHash,
|
options.TokenDiscoverySkipCAHash,
|
||||||
|
options.CertificateKey,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,7 +142,7 @@ func (r *Reset) Run(out io.Writer, client clientset.Interface, cfg *kubeadmapi.I
|
||||||
// Only clear etcd data when using local etcd.
|
// Only clear etcd data when using local etcd.
|
||||||
etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml")
|
etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml")
|
||||||
|
|
||||||
klog.V(1).Infof("[reset] checking for etcd config")
|
klog.V(1).Infoln("[reset] checking for etcd config")
|
||||||
etcdDataDir, err := getEtcdDataDir(etcdManifestPath, cfg)
|
etcdDataDir, err := getEtcdDataDir(etcdManifestPath, cfg)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
dirsToClean = append(dirsToClean, etcdDataDir)
|
dirsToClean = append(dirsToClean, etcdDataDir)
|
||||||
|
@ -157,7 +157,7 @@ func (r *Reset) Run(out io.Writer, client clientset.Interface, cfg *kubeadmapi.I
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to stop the kubelet service
|
// Try to stop the kubelet service
|
||||||
klog.V(1).Infof("[reset] getting init system")
|
klog.V(1).Infoln("[reset] getting init system")
|
||||||
initSystem, err := initsystem.GetInitSystem()
|
initSystem, err := initsystem.GetInitSystem()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Warningln("[reset] the kubelet service could not be stopped by kubeadm. Unable to detect a supported init system!")
|
klog.Warningln("[reset] the kubelet service could not be stopped by kubeadm. Unable to detect a supported init system!")
|
||||||
|
|
|
@ -27,7 +27,6 @@ import (
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
|
@ -76,39 +75,7 @@ func NewCmdApply(apf *applyPlanFlags) *cobra.Command {
|
||||||
DisableFlagsInUseLine: true,
|
DisableFlagsInUseLine: true,
|
||||||
Short: "Upgrade your Kubernetes cluster to the specified version.",
|
Short: "Upgrade your Kubernetes cluster to the specified version.",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var userVersion string
|
userVersion, err := getK8sVersionFromUserInput(flags.applyPlanFlags, args, true)
|
||||||
var err error
|
|
||||||
flags.ignorePreflightErrorsSet, err = validation.ValidateIgnorePreflightErrors(flags.ignorePreflightErrors)
|
|
||||||
kubeadmutil.CheckErr(err)
|
|
||||||
|
|
||||||
// Ensure the user is root
|
|
||||||
klog.V(1).Infof("running preflight checks")
|
|
||||||
err = runPreflightChecks(flags.ignorePreflightErrorsSet)
|
|
||||||
kubeadmutil.CheckErr(err)
|
|
||||||
|
|
||||||
// If the version is specified in config file, pick up that value.
|
|
||||||
if flags.cfgPath != "" {
|
|
||||||
// Note that cfg isn't preserved here, it's just an one-off to populate userVersion based on --config
|
|
||||||
cfg, err := configutil.LoadInitConfigurationFromFile(flags.cfgPath)
|
|
||||||
kubeadmutil.CheckErr(err)
|
|
||||||
|
|
||||||
if cfg.KubernetesVersion != "" {
|
|
||||||
userVersion = cfg.KubernetesVersion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the new version is already specified in config file, version arg is optional.
|
|
||||||
if userVersion == "" {
|
|
||||||
err = cmdutil.ValidateExactArgNumber(args, []string{"version"})
|
|
||||||
kubeadmutil.CheckErr(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If option was specified in both args and config file, args will overwrite the config file.
|
|
||||||
if len(args) == 1 {
|
|
||||||
userVersion = args[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
err = assertVersionStringIsEmpty(userVersion)
|
|
||||||
kubeadmutil.CheckErr(err)
|
kubeadmutil.CheckErr(err)
|
||||||
|
|
||||||
err = runApply(flags, userVersion)
|
err = runApply(flags, userVersion)
|
||||||
|
@ -147,8 +114,8 @@ func NewCmdApply(apf *applyPlanFlags) *cobra.Command {
|
||||||
func runApply(flags *applyFlags, userVersion string) error {
|
func runApply(flags *applyFlags, userVersion string) error {
|
||||||
|
|
||||||
// Start with the basics, verify that the cluster is healthy and get the configuration from the cluster (using the ConfigMap)
|
// Start with the basics, verify that the cluster is healthy and get the configuration from the cluster (using the ConfigMap)
|
||||||
klog.V(1).Infof("[upgrade/apply] verifying health of cluster")
|
klog.V(1).Infoln("[upgrade/apply] verifying health of cluster")
|
||||||
klog.V(1).Infof("[upgrade/apply] retrieving configuration from cluster")
|
klog.V(1).Infoln("[upgrade/apply] retrieving configuration from cluster")
|
||||||
client, versionGetter, cfg, err := enforceRequirements(flags.applyPlanFlags, flags.dryRun, userVersion)
|
client, versionGetter, cfg, err := enforceRequirements(flags.applyPlanFlags, flags.dryRun, userVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -160,7 +127,7 @@ func runApply(flags *applyFlags, userVersion string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate requested and validate actual version
|
// Validate requested and validate actual version
|
||||||
klog.V(1).Infof("[upgrade/apply] validating requested and actual version")
|
klog.V(1).Infoln("[upgrade/apply] validating requested and actual version")
|
||||||
if err := configutil.NormalizeKubernetesVersion(&cfg.ClusterConfiguration); err != nil {
|
if err := configutil.NormalizeKubernetesVersion(&cfg.ClusterConfiguration); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -176,7 +143,7 @@ func runApply(flags *applyFlags, userVersion string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enforce the version skew policies
|
// Enforce the version skew policies
|
||||||
klog.V(1).Infof("[upgrade/version] enforcing version skew policies")
|
klog.V(1).Infoln("[upgrade/version] enforcing version skew policies")
|
||||||
if err := EnforceVersionPolicies(cfg.KubernetesVersion, newK8sVersion, flags, versionGetter); err != nil {
|
if err := EnforceVersionPolicies(cfg.KubernetesVersion, newK8sVersion, flags, versionGetter); err != nil {
|
||||||
return errors.Wrap(err, "[upgrade/version] FATAL")
|
return errors.Wrap(err, "[upgrade/version] FATAL")
|
||||||
}
|
}
|
||||||
|
@ -192,7 +159,7 @@ func runApply(flags *applyFlags, userVersion string) error {
|
||||||
|
|
||||||
// Use a prepuller implementation based on creating DaemonSets
|
// Use a prepuller implementation based on creating DaemonSets
|
||||||
// and block until all DaemonSets are ready; then we know for sure that all control plane images are cached locally
|
// and block until all DaemonSets are ready; then we know for sure that all control plane images are cached locally
|
||||||
klog.V(1).Infof("[upgrade/apply] creating prepuller")
|
klog.V(1).Infoln("[upgrade/apply] creating prepuller")
|
||||||
prepuller := upgrade.NewDaemonSetPrepuller(client, waiter, &cfg.ClusterConfiguration)
|
prepuller := upgrade.NewDaemonSetPrepuller(client, waiter, &cfg.ClusterConfiguration)
|
||||||
componentsToPrepull := constants.ControlPlaneComponents
|
componentsToPrepull := constants.ControlPlaneComponents
|
||||||
if cfg.Etcd.External == nil && flags.etcdUpgrade {
|
if cfg.Etcd.External == nil && flags.etcdUpgrade {
|
||||||
|
@ -203,13 +170,13 @@ func runApply(flags *applyFlags, userVersion string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now; perform the upgrade procedure
|
// Now; perform the upgrade procedure
|
||||||
klog.V(1).Infof("[upgrade/apply] performing upgrade")
|
klog.V(1).Infoln("[upgrade/apply] performing upgrade")
|
||||||
if err := PerformControlPlaneUpgrade(flags, client, waiter, cfg); err != nil {
|
if err := PerformControlPlaneUpgrade(flags, client, waiter, cfg); err != nil {
|
||||||
return errors.Wrap(err, "[upgrade/apply] FATAL")
|
return errors.Wrap(err, "[upgrade/apply] FATAL")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upgrade RBAC rules and addons.
|
// Upgrade RBAC rules and addons.
|
||||||
klog.V(1).Infof("[upgrade/postupgrade] upgrading RBAC rules and addons")
|
klog.V(1).Infoln("[upgrade/postupgrade] upgrading RBAC rules and addons")
|
||||||
if err := upgrade.PerformPostUpgradeTasks(client, cfg, newK8sVersion, flags.dryRun); err != nil {
|
if err := upgrade.PerformPostUpgradeTasks(client, cfg, newK8sVersion, flags.dryRun); err != nil {
|
||||||
return errors.Wrap(err, "[upgrade/postupgrade] FATAL post-upgrade error")
|
return errors.Wrap(err, "[upgrade/postupgrade] FATAL post-upgrade error")
|
||||||
}
|
}
|
||||||
|
@ -227,14 +194,6 @@ func runApply(flags *applyFlags, userVersion string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertVersionStringIsEmpty(version string) error {
|
|
||||||
if len(version) == 0 {
|
|
||||||
return errors.New("version string can't be empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnforceVersionPolicies makes sure that the version the user specified is valid to upgrade to
|
// EnforceVersionPolicies makes sure that the version the user specified is valid to upgrade to
|
||||||
// There are both fatal and skippable (with --force) errors
|
// There are both fatal and skippable (with --force) errors
|
||||||
func EnforceVersionPolicies(newK8sVersionStr string, newK8sVersion *version.Version, flags *applyFlags, versionGetter upgrade.VersionGetter) error {
|
func EnforceVersionPolicies(newK8sVersionStr string, newK8sVersion *version.Version, flags *applyFlags, versionGetter upgrade.VersionGetter) error {
|
||||||
|
|
|
@ -25,30 +25,6 @@ import (
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAssertVersionStringIsEmpty(t *testing.T) {
|
|
||||||
var tcases = []struct {
|
|
||||||
name string
|
|
||||||
version string
|
|
||||||
expectedErr bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "Version string is not empty",
|
|
||||||
version: "some string",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Version string is empty",
|
|
||||||
expectedErr: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tcases {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if assertVersionStringIsEmpty(tt.version) == nil && tt.expectedErr {
|
|
||||||
t.Errorf("No error triggered for string '%s'", tt.version)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSessionIsInteractive(t *testing.T) {
|
func TestSessionIsInteractive(t *testing.T) {
|
||||||
var tcases = []struct {
|
var tcases = []struct {
|
||||||
name string
|
name string
|
||||||
|
|
|
@ -31,7 +31,10 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
fakediscovery "k8s.io/client-go/discovery/fake"
|
fakediscovery "k8s.io/client-go/discovery/fake"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
"k8s.io/klog"
|
||||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
|
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
||||||
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/features"
|
"k8s.io/kubernetes/cmd/kubeadm/app/features"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade"
|
||||||
|
@ -42,8 +45,47 @@ import (
|
||||||
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func getK8sVersionFromUserInput(flags *applyPlanFlags, args []string, versionIsMandatory bool) (string, error) {
|
||||||
|
var userVersion string
|
||||||
|
|
||||||
|
// If the version is specified in config file, pick up that value.
|
||||||
|
if flags.cfgPath != "" {
|
||||||
|
// Note that cfg isn't preserved here, it's just an one-off to populate userVersion based on --config
|
||||||
|
cfg, err := configutil.LoadInitConfigurationFromFile(flags.cfgPath)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
userVersion = cfg.KubernetesVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
// the version arg is mandatory unless version is specified in the config file
|
||||||
|
if versionIsMandatory && userVersion == "" {
|
||||||
|
if err := cmdutil.ValidateExactArgNumber(args, []string{"version"}); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If option was specified in both args and config file, args will overwrite the config file.
|
||||||
|
if len(args) == 1 {
|
||||||
|
userVersion = args[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
return userVersion, nil
|
||||||
|
}
|
||||||
|
|
||||||
// enforceRequirements verifies that it's okay to upgrade and then returns the variables needed for the rest of the procedure
|
// enforceRequirements verifies that it's okay to upgrade and then returns the variables needed for the rest of the procedure
|
||||||
func enforceRequirements(flags *applyPlanFlags, dryRun bool, newK8sVersion string) (clientset.Interface, upgrade.VersionGetter, *kubeadmapi.InitConfiguration, error) {
|
func enforceRequirements(flags *applyPlanFlags, dryRun bool, newK8sVersion string) (clientset.Interface, upgrade.VersionGetter, *kubeadmapi.InitConfiguration, error) {
|
||||||
|
ignorePreflightErrorsSet, err := validation.ValidateIgnorePreflightErrors(flags.ignorePreflightErrors)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the user is root
|
||||||
|
klog.V(1).Info("running preflight checks")
|
||||||
|
if err := runPreflightChecks(ignorePreflightErrorsSet); err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
client, err := getClient(flags.kubeConfigPath, dryRun)
|
client, err := getClient(flags.kubeConfigPath, dryRun)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -56,7 +98,7 @@ func enforceRequirements(flags *applyPlanFlags, dryRun bool, newK8sVersion strin
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run healthchecks against the cluster
|
// Run healthchecks against the cluster
|
||||||
if err := upgrade.CheckClusterHealth(client, flags.ignorePreflightErrorsSet); err != nil {
|
if err := upgrade.CheckClusterHealth(client, ignorePreflightErrorsSet); err != nil {
|
||||||
return nil, nil, nil, errors.Wrap(err, "[upgrade/health] FATAL")
|
return nil, nil, nil, errors.Wrap(err, "[upgrade/health] FATAL")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,11 +18,134 @@ package upgrade
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
validConfig = `apiVersion: kubeadm.k8s.io/v1beta1
|
||||||
|
kind: ClusterConfiguration
|
||||||
|
kubernetesVersion: 1.13.0
|
||||||
|
`
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetK8sVersionFromUserInput(t *testing.T) {
|
||||||
|
var tcases = []struct {
|
||||||
|
name string
|
||||||
|
isVersionMandatory bool
|
||||||
|
clusterConfig string
|
||||||
|
args []string
|
||||||
|
expectedErr bool
|
||||||
|
expectedVersion string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "No config and version as an argument",
|
||||||
|
isVersionMandatory: true,
|
||||||
|
args: []string{"v1.13.1"},
|
||||||
|
expectedVersion: "v1.13.1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Neither config nor version specified",
|
||||||
|
isVersionMandatory: true,
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "No config and empty version as an argument",
|
||||||
|
isVersionMandatory: true,
|
||||||
|
args: []string{""},
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Valid config, but no version specified",
|
||||||
|
isVersionMandatory: true,
|
||||||
|
clusterConfig: validConfig,
|
||||||
|
expectedVersion: "v1.13.0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Valid config and different version specified",
|
||||||
|
isVersionMandatory: true,
|
||||||
|
clusterConfig: validConfig,
|
||||||
|
args: []string{"v1.13.1"},
|
||||||
|
expectedVersion: "v1.13.1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Version is optional",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for tnum, tt := range tcases {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
flags := &applyPlanFlags{}
|
||||||
|
if len(tt.clusterConfig) > 0 {
|
||||||
|
tmpfile := fmt.Sprintf("/tmp/kubeadm-upgrade-common-test-%d-%d.yaml", tnum, time.Now().Unix())
|
||||||
|
if err := ioutil.WriteFile(tmpfile, []byte(tt.clusterConfig), 0666); err != nil {
|
||||||
|
t.Fatalf("Failed to create test config file: %+v", err)
|
||||||
|
}
|
||||||
|
defer os.Remove(tmpfile)
|
||||||
|
|
||||||
|
flags.cfgPath = tmpfile
|
||||||
|
}
|
||||||
|
|
||||||
|
userVersion, err := getK8sVersionFromUserInput(flags, tt.args, tt.isVersionMandatory)
|
||||||
|
|
||||||
|
if err == nil && tt.expectedErr {
|
||||||
|
t.Error("Expected error, but got success")
|
||||||
|
}
|
||||||
|
if err != nil && !tt.expectedErr {
|
||||||
|
t.Errorf("Unexpected error: %+v", err)
|
||||||
|
}
|
||||||
|
if userVersion != tt.expectedVersion {
|
||||||
|
t.Errorf("Expected '%s', but got '%s'", tt.expectedVersion, userVersion)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEnforceRequirements(t *testing.T) {
|
||||||
|
tcases := []struct {
|
||||||
|
name string
|
||||||
|
newK8sVersion string
|
||||||
|
dryRun bool
|
||||||
|
flags applyPlanFlags
|
||||||
|
expectedErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Fail pre-flight check",
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Bogus preflight check disabled when also 'all' is specified",
|
||||||
|
flags: applyPlanFlags{
|
||||||
|
ignorePreflightErrors: []string{"bogusvalue", "all"},
|
||||||
|
},
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Fail to create client",
|
||||||
|
flags: applyPlanFlags{
|
||||||
|
ignorePreflightErrors: []string{"all"},
|
||||||
|
},
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tcases {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
_, _, _, err := enforceRequirements(&tt.flags, tt.dryRun, tt.newK8sVersion)
|
||||||
|
|
||||||
|
if err == nil && tt.expectedErr {
|
||||||
|
t.Error("Expected error, but got success")
|
||||||
|
}
|
||||||
|
if err != nil && !tt.expectedErr {
|
||||||
|
t.Errorf("Unexpected error: %+v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPrintConfiguration(t *testing.T) {
|
func TestPrintConfiguration(t *testing.T) {
|
||||||
var tests = []struct {
|
var tests = []struct {
|
||||||
name string
|
name string
|
||||||
|
|
|
@ -29,10 +29,8 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/util/version"
|
"k8s.io/apimachinery/pkg/util/version"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
|
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade"
|
||||||
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
|
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
|
||||||
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
|
|
||||||
etcdutil "k8s.io/kubernetes/cmd/kubeadm/app/util/etcd"
|
etcdutil "k8s.io/kubernetes/cmd/kubeadm/app/util/etcd"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -50,27 +48,8 @@ func NewCmdPlan(apf *applyPlanFlags) *cobra.Command {
|
||||||
Use: "plan [version] [flags]",
|
Use: "plan [version] [flags]",
|
||||||
Short: "Check which versions are available to upgrade to and validate whether your current cluster is upgradeable. To skip the internet check, pass in the optional [version] parameter.",
|
Short: "Check which versions are available to upgrade to and validate whether your current cluster is upgradeable. To skip the internet check, pass in the optional [version] parameter.",
|
||||||
Run: func(_ *cobra.Command, args []string) {
|
Run: func(_ *cobra.Command, args []string) {
|
||||||
var userVersion string
|
userVersion, err := getK8sVersionFromUserInput(flags.applyPlanFlags, args, false)
|
||||||
var err error
|
|
||||||
flags.ignorePreflightErrorsSet, err = validation.ValidateIgnorePreflightErrors(flags.ignorePreflightErrors)
|
|
||||||
kubeadmutil.CheckErr(err)
|
kubeadmutil.CheckErr(err)
|
||||||
// Ensure the user is root
|
|
||||||
err = runPreflightChecks(flags.ignorePreflightErrorsSet)
|
|
||||||
kubeadmutil.CheckErr(err)
|
|
||||||
|
|
||||||
// If the version is specified in config file, pick up that value.
|
|
||||||
if flags.cfgPath != "" {
|
|
||||||
cfg, err := configutil.LoadInitConfigurationFromFile(flags.cfgPath)
|
|
||||||
kubeadmutil.CheckErr(err)
|
|
||||||
|
|
||||||
if cfg.KubernetesVersion != "" {
|
|
||||||
userVersion = cfg.KubernetesVersion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If option was specified in both args and config file, args will overwrite the config file.
|
|
||||||
if len(args) == 1 {
|
|
||||||
userVersion = args[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
err = runPlan(flags, userVersion)
|
err = runPlan(flags, userVersion)
|
||||||
kubeadmutil.CheckErr(err)
|
kubeadmutil.CheckErr(err)
|
||||||
|
@ -85,8 +64,8 @@ func NewCmdPlan(apf *applyPlanFlags) *cobra.Command {
|
||||||
// runPlan takes care of outputting available versions to upgrade to for the user
|
// runPlan takes care of outputting available versions to upgrade to for the user
|
||||||
func runPlan(flags *planFlags, userVersion string) error {
|
func runPlan(flags *planFlags, userVersion string) error {
|
||||||
// Start with the basics, verify that the cluster is healthy, build a client and a versionGetter. Never dry-run when planning.
|
// Start with the basics, verify that the cluster is healthy, build a client and a versionGetter. Never dry-run when planning.
|
||||||
klog.V(1).Infof("[upgrade/plan] verifying health of cluster")
|
klog.V(1).Infoln("[upgrade/plan] verifying health of cluster")
|
||||||
klog.V(1).Infof("[upgrade/plan] retrieving configuration from cluster")
|
klog.V(1).Infoln("[upgrade/plan] retrieving configuration from cluster")
|
||||||
client, versionGetter, cfg, err := enforceRequirements(flags.applyPlanFlags, false, userVersion)
|
client, versionGetter, cfg, err := enforceRequirements(flags.applyPlanFlags, false, userVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -112,7 +91,7 @@ func runPlan(flags *planFlags, userVersion string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute which upgrade possibilities there are
|
// Compute which upgrade possibilities there are
|
||||||
klog.V(1).Infof("[upgrade/plan] computing upgrade possibilities")
|
klog.V(1).Infoln("[upgrade/plan] computing upgrade possibilities")
|
||||||
availUpgrades, err := upgrade.GetAvailableUpgrades(versionGetter, flags.allowExperimentalUpgrades, flags.allowRCUpgrades, etcdClient, cfg.DNS.Type, client)
|
availUpgrades, err := upgrade.GetAvailableUpgrades(versionGetter, flags.allowExperimentalUpgrades, flags.allowRCUpgrades, etcdClient, cfg.DNS.Type, client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "[upgrade/versions] FATAL")
|
return errors.Wrap(err, "[upgrade/versions] FATAL")
|
||||||
|
|
|
@ -23,7 +23,6 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
|
@ -39,7 +38,6 @@ type applyPlanFlags struct {
|
||||||
allowRCUpgrades bool
|
allowRCUpgrades bool
|
||||||
printConfig bool
|
printConfig bool
|
||||||
ignorePreflightErrors []string
|
ignorePreflightErrors []string
|
||||||
ignorePreflightErrorsSet sets.String
|
|
||||||
out io.Writer
|
out io.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +50,6 @@ func NewCmdUpgrade(out io.Writer) *cobra.Command {
|
||||||
allowExperimentalUpgrades: false,
|
allowExperimentalUpgrades: false,
|
||||||
allowRCUpgrades: false,
|
allowRCUpgrades: false,
|
||||||
printConfig: false,
|
printConfig: false,
|
||||||
ignorePreflightErrorsSet: sets.NewString(),
|
|
||||||
out: out,
|
out: out,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -409,7 +409,7 @@ func (HostnameCheck) Name() string {
|
||||||
|
|
||||||
// Check validates if hostname match dns sub domain regex.
|
// Check validates if hostname match dns sub domain regex.
|
||||||
func (hc HostnameCheck) Check() (warnings, errorList []error) {
|
func (hc HostnameCheck) Check() (warnings, errorList []error) {
|
||||||
klog.V(1).Infof("checking whether the given node name is reachable using net.LookupHost")
|
klog.V(1).Infoln("checking whether the given node name is reachable using net.LookupHost")
|
||||||
errorList = []error{}
|
errorList = []error{}
|
||||||
warnings = []error{}
|
warnings = []error{}
|
||||||
addr, err := net.LookupHost(hc.nodeName)
|
addr, err := net.LookupHost(hc.nodeName)
|
||||||
|
@ -436,7 +436,7 @@ func (hst HTTPProxyCheck) Name() string {
|
||||||
|
|
||||||
// Check validates http connectivity type, direct or via proxy.
|
// Check validates http connectivity type, direct or via proxy.
|
||||||
func (hst HTTPProxyCheck) Check() (warnings, errorList []error) {
|
func (hst HTTPProxyCheck) Check() (warnings, errorList []error) {
|
||||||
klog.V(1).Infof("validating if the connectivity type is via proxy or direct")
|
klog.V(1).Infoln("validating if the connectivity type is via proxy or direct")
|
||||||
u := (&url.URL{Scheme: hst.Proto, Host: hst.Host}).String()
|
u := (&url.URL{Scheme: hst.Proto, Host: hst.Host}).String()
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", u, nil)
|
req, err := http.NewRequest("GET", u, nil)
|
||||||
|
|
|
@ -818,6 +818,9 @@ EOF
|
||||||
--config=/tmp/kube-proxy.yaml \
|
--config=/tmp/kube-proxy.yaml \
|
||||||
--master="https://${API_HOST}:${API_SECURE_PORT}" >"${PROXY_LOG}" 2>&1 &
|
--master="https://${API_HOST}:${API_SECURE_PORT}" >"${PROXY_LOG}" 2>&1 &
|
||||||
PROXY_PID=$!
|
PROXY_PID=$!
|
||||||
|
}
|
||||||
|
|
||||||
|
function start_kubescheduler {
|
||||||
|
|
||||||
SCHEDULER_LOG=${LOG_DIR}/kube-scheduler.log
|
SCHEDULER_LOG=${LOG_DIR}/kube-scheduler.log
|
||||||
${CONTROLPLANE_SUDO} "${GO_OUT}/hyperkube" scheduler \
|
${CONTROLPLANE_SUDO} "${GO_OUT}/hyperkube" scheduler \
|
||||||
|
@ -1012,6 +1015,7 @@ if [[ "${START_MODE}" != "kubeletonly" ]]; then
|
||||||
start_cloud_controller_manager
|
start_cloud_controller_manager
|
||||||
fi
|
fi
|
||||||
start_kubeproxy
|
start_kubeproxy
|
||||||
|
start_kubescheduler
|
||||||
start_kubedns
|
start_kubedns
|
||||||
if [[ "${ENABLE_NODELOCAL_DNS:-}" == "true" ]]; then
|
if [[ "${ENABLE_NODELOCAL_DNS:-}" == "true" ]]; then
|
||||||
start_nodelocaldns
|
start_nodelocaldns
|
||||||
|
|
|
@ -62,6 +62,7 @@ go_library(
|
||||||
"//staging/src/k8s.io/cloud-provider:go_default_library",
|
"//staging/src/k8s.io/cloud-provider:go_default_library",
|
||||||
"//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library",
|
"//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned:go_default_library",
|
||||||
|
"//staging/src/k8s.io/csi-translation-lib:go_default_library",
|
||||||
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
|
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
],
|
],
|
||||||
|
|
|
@ -988,6 +988,22 @@ func wrapTestWithProvisionCalls(expectedProvisionCalls []provisionCall, toWrap t
|
||||||
return wrapTestWithPluginCalls(nil, nil, expectedProvisionCalls, toWrap)
|
return wrapTestWithPluginCalls(nil, nil, expectedProvisionCalls, toWrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wrapTestWithCSIMigrationProvisionCalls returns a testCall that:
|
||||||
|
// - configures controller with a volume plugin that emulates CSI migration
|
||||||
|
// - calls given testCall
|
||||||
|
func wrapTestWithCSIMigrationProvisionCalls(toWrap testCall) testCall {
|
||||||
|
return func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error {
|
||||||
|
plugin := &mockVolumePlugin{
|
||||||
|
isMigratedToCSI: true,
|
||||||
|
}
|
||||||
|
ctrl.volumePluginMgr.InitPlugins([]vol.VolumePlugin{plugin}, nil /* prober */, ctrl)
|
||||||
|
ctrl.csiNameFromIntreeNameHook = func(string) (string, error) {
|
||||||
|
return "vendor.com/MockCSIPlugin", nil
|
||||||
|
}
|
||||||
|
return toWrap(ctrl, reactor, test)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// wrapTestWithInjectedOperation returns a testCall that:
|
// wrapTestWithInjectedOperation returns a testCall that:
|
||||||
// - starts the controller and lets it run original testCall until
|
// - starts the controller and lets it run original testCall until
|
||||||
// scheduleOperation() call. It blocks the controller there and calls the
|
// scheduleOperation() call. It blocks the controller there and calls the
|
||||||
|
@ -1229,6 +1245,7 @@ type mockVolumePlugin struct {
|
||||||
deleteCallCounter int
|
deleteCallCounter int
|
||||||
recycleCalls []error
|
recycleCalls []error
|
||||||
recycleCallCounter int
|
recycleCallCounter int
|
||||||
|
isMigratedToCSI bool
|
||||||
provisionOptions vol.VolumeOptions
|
provisionOptions vol.VolumeOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1259,7 +1276,7 @@ func (plugin *mockVolumePlugin) CanSupport(spec *vol.Spec) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (plugin *mockVolumePlugin) IsMigratedToCSI() bool {
|
func (plugin *mockVolumePlugin) IsMigratedToCSI() bool {
|
||||||
return false
|
return plugin.isMigratedToCSI
|
||||||
}
|
}
|
||||||
|
|
||||||
func (plugin *mockVolumePlugin) RequiresRemount() bool {
|
func (plugin *mockVolumePlugin) RequiresRemount() bool {
|
||||||
|
|
|
@ -421,6 +421,17 @@ func TestProvisionSync(t *testing.T) {
|
||||||
[]string{"Warning ProvisioningFailed Mount options"},
|
[]string{"Warning ProvisioningFailed Mount options"},
|
||||||
noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
|
noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// No provisioning due to CSI migration + normal event with external provisioner
|
||||||
|
"11-21 - external provisioner for CSI migration",
|
||||||
|
novolumes,
|
||||||
|
novolumes,
|
||||||
|
newClaimArray("claim11-21", "uid11-21", "1Gi", "", v1.ClaimPending, &classGold),
|
||||||
|
claimWithAnnotation(annStorageProvisioner, "vendor.com/MockCSIPlugin",
|
||||||
|
newClaimArray("claim11-21", "uid11-21", "1Gi", "", v1.ClaimPending, &classGold)),
|
||||||
|
[]string{"Normal ExternalProvisioning"},
|
||||||
|
noerrors, wrapTestWithCSIMigrationProvisionCalls(testSyncClaim),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
runSyncTests(t, tests, storageClasses, []*v1.Pod{})
|
runSyncTests(t, tests, storageClasses, []*v1.Pod{})
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ import (
|
||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
cloudprovider "k8s.io/cloud-provider"
|
cloudprovider "k8s.io/cloud-provider"
|
||||||
volerr "k8s.io/cloud-provider/volume/errors"
|
volerr "k8s.io/cloud-provider/volume/errors"
|
||||||
|
csitranslation "k8s.io/csi-translation-lib"
|
||||||
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
||||||
"k8s.io/kubernetes/pkg/controller/volume/events"
|
"k8s.io/kubernetes/pkg/controller/volume/events"
|
||||||
"k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics"
|
"k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics"
|
||||||
|
@ -230,6 +231,10 @@ type PersistentVolumeController struct {
|
||||||
|
|
||||||
createProvisionedPVRetryCount int
|
createProvisionedPVRetryCount int
|
||||||
createProvisionedPVInterval time.Duration
|
createProvisionedPVInterval time.Duration
|
||||||
|
|
||||||
|
// For testing only: hook to intercept CSI driver name <=> Intree plugin name mapping
|
||||||
|
// Not used when set to nil
|
||||||
|
csiNameFromIntreeNameHook func(pluginName string) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// syncClaim is the main controller method to decide what to do with a claim.
|
// syncClaim is the main controller method to decide what to do with a claim.
|
||||||
|
@ -1346,6 +1351,13 @@ func (ctrl *PersistentVolumeController) provisionClaim(claim *v1.PersistentVolum
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ctrl *PersistentVolumeController) getCSINameFromIntreeName(pluginName string) (string, error) {
|
||||||
|
if ctrl.csiNameFromIntreeNameHook != nil {
|
||||||
|
return ctrl.csiNameFromIntreeNameHook(pluginName)
|
||||||
|
}
|
||||||
|
return csitranslation.GetCSINameFromIntreeName(pluginName)
|
||||||
|
}
|
||||||
|
|
||||||
// provisionClaimOperation provisions a volume. This method is running in
|
// provisionClaimOperation provisions a volume. This method is running in
|
||||||
// standalone goroutine and already has all necessary locks.
|
// standalone goroutine and already has all necessary locks.
|
||||||
func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.PersistentVolumeClaim) (string, error) {
|
func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.PersistentVolumeClaim) (string, error) {
|
||||||
|
@ -1362,12 +1374,26 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis
|
||||||
}
|
}
|
||||||
|
|
||||||
var pluginName string
|
var pluginName string
|
||||||
|
provisionerName := storageClass.Provisioner
|
||||||
if plugin != nil {
|
if plugin != nil {
|
||||||
pluginName = plugin.GetPluginName()
|
if plugin.IsMigratedToCSI() {
|
||||||
|
// pluginName is not set here to align with existing behavior
|
||||||
|
// of not setting pluginName for external provisioners (including CSI)
|
||||||
|
// Set provisionerName to CSI plugin name for setClaimProvisioner
|
||||||
|
provisionerName, err = ctrl.getCSINameFromIntreeName(storageClass.Provisioner)
|
||||||
|
if err != nil {
|
||||||
|
strerr := fmt.Sprintf("error getting CSI name for In tree plugin %s: %v", storageClass.Provisioner, err)
|
||||||
|
klog.V(2).Infof("%s", strerr)
|
||||||
|
ctrl.eventRecorder.Event(claim, v1.EventTypeWarning, events.ProvisioningFailed, strerr)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pluginName = plugin.GetPluginName()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add provisioner annotation so external provisioners know when to start
|
// Add provisioner annotation so external provisioners know when to start
|
||||||
newClaim, err := ctrl.setClaimProvisioner(claim, storageClass)
|
newClaim, err := ctrl.setClaimProvisioner(claim, provisionerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Save failed, the controller will retry in the next sync
|
// Save failed, the controller will retry in the next sync
|
||||||
klog.V(2).Infof("error saving claim %s: %v", claimToClaimKey(claim), err)
|
klog.V(2).Infof("error saving claim %s: %v", claimToClaimKey(claim), err)
|
||||||
|
@ -1375,7 +1401,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis
|
||||||
}
|
}
|
||||||
claim = newClaim
|
claim = newClaim
|
||||||
|
|
||||||
if plugin == nil {
|
if plugin == nil || plugin.IsMigratedToCSI() {
|
||||||
// findProvisionablePlugin returned no error nor plugin.
|
// findProvisionablePlugin returned no error nor plugin.
|
||||||
// This means that an unknown provisioner is requested. Report an event
|
// This means that an unknown provisioner is requested. Report an event
|
||||||
// and wait for the external provisioner
|
// and wait for the external provisioner
|
||||||
|
|
|
@ -22,7 +22,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
storage "k8s.io/api/storage/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
@ -428,8 +427,8 @@ func (ctrl *PersistentVolumeController) resync() {
|
||||||
|
|
||||||
// setClaimProvisioner saves
|
// setClaimProvisioner saves
|
||||||
// claim.Annotations[annStorageProvisioner] = class.Provisioner
|
// claim.Annotations[annStorageProvisioner] = class.Provisioner
|
||||||
func (ctrl *PersistentVolumeController) setClaimProvisioner(claim *v1.PersistentVolumeClaim, class *storage.StorageClass) (*v1.PersistentVolumeClaim, error) {
|
func (ctrl *PersistentVolumeController) setClaimProvisioner(claim *v1.PersistentVolumeClaim, provisionerName string) (*v1.PersistentVolumeClaim, error) {
|
||||||
if val, ok := claim.Annotations[annStorageProvisioner]; ok && val == class.Provisioner {
|
if val, ok := claim.Annotations[annStorageProvisioner]; ok && val == provisionerName {
|
||||||
// annotation is already set, nothing to do
|
// annotation is already set, nothing to do
|
||||||
return claim, nil
|
return claim, nil
|
||||||
}
|
}
|
||||||
|
@ -437,7 +436,7 @@ func (ctrl *PersistentVolumeController) setClaimProvisioner(claim *v1.Persistent
|
||||||
// The volume from method args can be pointing to watcher cache. We must not
|
// The volume from method args can be pointing to watcher cache. We must not
|
||||||
// modify these, therefore create a copy.
|
// modify these, therefore create a copy.
|
||||||
claimClone := claim.DeepCopy()
|
claimClone := claim.DeepCopy()
|
||||||
metav1.SetMetaDataAnnotation(&claimClone.ObjectMeta, annStorageProvisioner, class.Provisioner)
|
metav1.SetMetaDataAnnotation(&claimClone.ObjectMeta, annStorageProvisioner, provisionerName)
|
||||||
newClaim, err := ctrl.kubeClient.CoreV1().PersistentVolumeClaims(claim.Namespace).Update(claimClone)
|
newClaim, err := ctrl.kubeClient.CoreV1().PersistentVolumeClaims(claim.Namespace).Update(claimClone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return newClaim, err
|
return newClaim, err
|
||||||
|
|
|
@ -134,13 +134,6 @@ const (
|
||||||
// 'MemoryPressure', 'PIDPressure' and 'DiskPressure'.
|
// 'MemoryPressure', 'PIDPressure' and 'DiskPressure'.
|
||||||
TaintNodesByCondition utilfeature.Feature = "TaintNodesByCondition"
|
TaintNodesByCondition utilfeature.Feature = "TaintNodesByCondition"
|
||||||
|
|
||||||
// owner: @jsafrane
|
|
||||||
// GA: v1.12
|
|
||||||
//
|
|
||||||
// Note: This feature gate is unconditionally enabled in v1.13 and will be removed in v1.14.
|
|
||||||
// Enable mount propagation of volumes.
|
|
||||||
MountPropagation utilfeature.Feature = "MountPropagation"
|
|
||||||
|
|
||||||
// owner: @sjenning
|
// owner: @sjenning
|
||||||
// alpha: v1.11
|
// alpha: v1.11
|
||||||
//
|
//
|
||||||
|
@ -443,7 +436,6 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS
|
||||||
PodShareProcessNamespace: {Default: true, PreRelease: utilfeature.Beta},
|
PodShareProcessNamespace: {Default: true, PreRelease: utilfeature.Beta},
|
||||||
PodPriority: {Default: true, PreRelease: utilfeature.GA},
|
PodPriority: {Default: true, PreRelease: utilfeature.GA},
|
||||||
TaintNodesByCondition: {Default: true, PreRelease: utilfeature.Beta},
|
TaintNodesByCondition: {Default: true, PreRelease: utilfeature.Beta},
|
||||||
MountPropagation: {Default: true, PreRelease: utilfeature.GA, LockToDefault: true}, // remove in 1.14
|
|
||||||
QOSReserved: {Default: false, PreRelease: utilfeature.Alpha},
|
QOSReserved: {Default: false, PreRelease: utilfeature.Alpha},
|
||||||
ExpandPersistentVolumes: {Default: true, PreRelease: utilfeature.Beta},
|
ExpandPersistentVolumes: {Default: true, PreRelease: utilfeature.Beta},
|
||||||
ExpandInUsePersistentVolumes: {Default: false, PreRelease: utilfeature.Alpha},
|
ExpandInUsePersistentVolumes: {Default: false, PreRelease: utilfeature.Alpha},
|
||||||
|
|
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/4.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/4.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/4.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/4.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/5.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/5.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/5.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/5.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list-fail/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/4.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/4.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/4.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/4.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-list/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/1.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/1.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/1.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/1.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied-syntax-error/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/1.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/1.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/1.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/1.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/2.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/2.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/2.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/2.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-apply-edit-last-applied/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/0.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/0.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/0.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/0.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list-error/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/0.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/0.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/0.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/0.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/1.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/1.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/2.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/2.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/3.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/3.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-create-list/test.yaml
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/0.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/0.response
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/1.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/1.edited
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/1.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/1.original
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/2.request
vendored
Executable file → Normal file
0
pkg/kubectl/cmd/edit/testdata/testcase-edit-error-reedit/2.request
vendored
Executable file → Normal file
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue