mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
Merge pull request #79335 from rosti/kubeadm-nuke-normalizer
kubeadm: Stop using //pkg/util/normalizer
This commit is contained in:
commit
ddc4ed0365
@ -83,7 +83,6 @@
|
|||||||
"k8s.io/kubernetes/pkg/util/ipvs",
|
"k8s.io/kubernetes/pkg/util/ipvs",
|
||||||
"k8s.io/kubernetes/pkg/util/metrics",
|
"k8s.io/kubernetes/pkg/util/metrics",
|
||||||
"k8s.io/kubernetes/pkg/util/node",
|
"k8s.io/kubernetes/pkg/util/node",
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer",
|
|
||||||
"k8s.io/kubernetes/pkg/util/parsers",
|
"k8s.io/kubernetes/pkg/util/parsers",
|
||||||
"k8s.io/kubernetes/pkg/util/procfs",
|
"k8s.io/kubernetes/pkg/util/procfs",
|
||||||
"k8s.io/kubernetes/pkg/util/sysctl",
|
"k8s.io/kubernetes/pkg/util/sysctl",
|
||||||
|
@ -31,7 +31,6 @@ go_library(
|
|||||||
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/config:go_default_library",
|
"//cmd/kubeadm/app/util/config:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
||||||
"//pkg/util/normalizer:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/duration:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/duration:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library",
|
||||||
"//vendor/github.com/lithammer/dedent:go_default_library",
|
"//vendor/github.com/lithammer/dedent:go_default_library",
|
||||||
|
@ -38,11 +38,10 @@ import (
|
|||||||
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"
|
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
|
||||||
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
genericCertRenewLongDesc = normalizer.LongDesc(`
|
genericCertRenewLongDesc = cmdutil.LongDesc(`
|
||||||
Renew the %s.
|
Renew the %s.
|
||||||
|
|
||||||
Renewals run unconditionally, regardless of certificate expiration date; extra attributes such as SANs will
|
Renewals run unconditionally, regardless of certificate expiration date; extra attributes such as SANs will
|
||||||
@ -55,12 +54,12 @@ var (
|
|||||||
eventually re-distribute the renewed certificate in case the file is used elsewhere.
|
eventually re-distribute the renewed certificate in case the file is used elsewhere.
|
||||||
`)
|
`)
|
||||||
|
|
||||||
allLongDesc = normalizer.LongDesc(`
|
allLongDesc = cmdutil.LongDesc(`
|
||||||
Renew all known certificates necessary to run the control plane. Renewals are run unconditionally, regardless
|
Renew all known certificates necessary to run the control plane. Renewals are run unconditionally, regardless
|
||||||
of expiration date. Renewals can also be run individually for more control.
|
of expiration date. Renewals can also be run individually for more control.
|
||||||
`)
|
`)
|
||||||
|
|
||||||
expirationLongDesc = normalizer.LongDesc(`
|
expirationLongDesc = cmdutil.LongDesc(`
|
||||||
Checks expiration for the certificates in the local PKI managed by kubeadm.
|
Checks expiration for the certificates in the local PKI managed by kubeadm.
|
||||||
`)
|
`)
|
||||||
|
|
||||||
|
@ -28,19 +28,18 @@ import (
|
|||||||
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
|
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
|
||||||
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"
|
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
kubeconfigLongDesc = normalizer.LongDesc(`
|
kubeconfigLongDesc = cmdutil.LongDesc(`
|
||||||
Kubeconfig file utilities.
|
Kubeconfig file utilities.
|
||||||
` + cmdutil.AlphaDisclaimer)
|
` + cmdutil.AlphaDisclaimer)
|
||||||
|
|
||||||
userKubeconfigLongDesc = normalizer.LongDesc(`
|
userKubeconfigLongDesc = cmdutil.LongDesc(`
|
||||||
Output a kubeconfig file for an additional user.
|
Output a kubeconfig file for an additional user.
|
||||||
` + cmdutil.AlphaDisclaimer)
|
` + cmdutil.AlphaDisclaimer)
|
||||||
|
|
||||||
userKubeconfigExample = normalizer.Examples(`
|
userKubeconfigExample = cmdutil.Examples(`
|
||||||
# Output a kubeconfig file for an additional user named foo
|
# Output a kubeconfig file for an additional user named foo
|
||||||
kubeadm alpha kubeconfig user --client-name=foo
|
kubeadm alpha kubeconfig user --client-name=foo
|
||||||
`)
|
`)
|
||||||
|
@ -29,18 +29,17 @@ import (
|
|||||||
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
|
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
|
||||||
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
|
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
|
||||||
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
utilsexec "k8s.io/utils/exec"
|
utilsexec "k8s.io/utils/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
kubeletConfigDownloadLongDesc = normalizer.LongDesc(`
|
kubeletConfigDownloadLongDesc = cmdutil.LongDesc(`
|
||||||
Download the kubelet configuration from a ConfigMap of the form "kubelet-config-1.X" in the cluster,
|
Download the kubelet configuration from a ConfigMap of the form "kubelet-config-1.X" in the cluster,
|
||||||
where X is the minor version of the kubelet. Either kubeadm autodetects the kubelet version by exec-ing
|
where X is the minor version of the kubelet. Either kubeadm autodetects the kubelet version by exec-ing
|
||||||
"kubelet --version" or respects the --kubelet-version parameter.
|
"kubelet --version" or respects the --kubelet-version parameter.
|
||||||
` + cmdutil.AlphaDisclaimer)
|
` + cmdutil.AlphaDisclaimer)
|
||||||
|
|
||||||
kubeletConfigDownloadExample = normalizer.Examples(fmt.Sprintf(`
|
kubeletConfigDownloadExample = cmdutil.Examples(fmt.Sprintf(`
|
||||||
# Download the kubelet configuration from the ConfigMap in the cluster. Autodetect the kubelet version.
|
# Download the kubelet configuration from the ConfigMap in the cluster. Autodetect the kubelet version.
|
||||||
kubeadm alpha phase kubelet config download
|
kubeadm alpha phase kubelet config download
|
||||||
|
|
||||||
@ -48,7 +47,7 @@ var (
|
|||||||
kubeadm alpha phase kubelet config download --kubelet-version %s
|
kubeadm alpha phase kubelet config download --kubelet-version %s
|
||||||
`, constants.CurrentKubernetesVersion))
|
`, constants.CurrentKubernetesVersion))
|
||||||
|
|
||||||
kubeletConfigEnableDynamicLongDesc = normalizer.LongDesc(`
|
kubeletConfigEnableDynamicLongDesc = cmdutil.LongDesc(`
|
||||||
Enable or update dynamic kubelet configuration for a Node, against the kubelet-config-1.X ConfigMap in the cluster,
|
Enable or update dynamic kubelet configuration for a Node, against the kubelet-config-1.X ConfigMap in the cluster,
|
||||||
where X is the minor version of the desired kubelet version.
|
where X is the minor version of the desired kubelet version.
|
||||||
|
|
||||||
@ -57,7 +56,7 @@ var (
|
|||||||
|
|
||||||
` + cmdutil.AlphaDisclaimer)
|
` + cmdutil.AlphaDisclaimer)
|
||||||
|
|
||||||
kubeletConfigEnableDynamicExample = normalizer.Examples(fmt.Sprintf(`
|
kubeletConfigEnableDynamicExample = cmdutil.Examples(fmt.Sprintf(`
|
||||||
# Enable dynamic kubelet configuration for a Node.
|
# Enable dynamic kubelet configuration for a Node.
|
||||||
kubeadm alpha phase kubelet enable-dynamic-config --node-name node-1 --kubelet-version %s
|
kubeadm alpha phase kubelet enable-dynamic-config --node-name node-1 --kubelet-version %s
|
||||||
|
|
||||||
|
@ -20,7 +20,9 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -38,21 +40,17 @@ import (
|
|||||||
"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
|
"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
|
||||||
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
|
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
|
||||||
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
selfhostingLongDesc = normalizer.LongDesc(`
|
selfhostingLongDesc = cmdutil.LongDesc(`
|
||||||
Convert static Pod files for control plane components into self-hosted DaemonSets configured via the Kubernetes API.
|
Convert static Pod files for control plane components into self-hosted DaemonSets configured via the Kubernetes API.
|
||||||
|
|
||||||
See the documentation for self-hosting limitations.
|
See the documentation for self-hosting limitations.
|
||||||
|
|
||||||
` + cmdutil.AlphaDisclaimer)
|
` + cmdutil.AlphaDisclaimer)
|
||||||
|
|
||||||
selfhostingExample = normalizer.Examples(`
|
selfhostingExample = cmdutil.Examples(`
|
||||||
# Convert a static Pod-hosted control plane into a self-hosted one.
|
# Convert a static Pod-hosted control plane into a self-hosted one.
|
||||||
|
|
||||||
kubeadm alpha phase self-hosting convert-from-staticpods
|
kubeadm alpha phase self-hosting convert-from-staticpods
|
||||||
|
@ -45,7 +45,6 @@ go_library(
|
|||||||
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/dryrun:go_default_library",
|
"//cmd/kubeadm/app/util/dryrun:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/pkiutil:go_default_library",
|
"//cmd/kubeadm/app/util/pkiutil:go_default_library",
|
||||||
"//pkg/util/normalizer:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
|
@ -26,16 +26,15 @@ import (
|
|||||||
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
dnsaddon "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/dns"
|
dnsaddon "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/dns"
|
||||||
proxyaddon "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/proxy"
|
proxyaddon "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/proxy"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
coreDNSAddonLongDesc = normalizer.LongDesc(`
|
coreDNSAddonLongDesc = cmdutil.LongDesc(`
|
||||||
Install the CoreDNS addon components via the API server.
|
Install the CoreDNS addon components via the API server.
|
||||||
Please note that although the DNS server is deployed, it will not be scheduled until CNI is installed.
|
Please note that although the DNS server is deployed, it will not be scheduled until CNI is installed.
|
||||||
`)
|
`)
|
||||||
|
|
||||||
kubeProxyAddonLongDesc = normalizer.LongDesc(`
|
kubeProxyAddonLongDesc = cmdutil.LongDesc(`
|
||||||
Install the kube-proxy addon components via the API server.
|
Install the kube-proxy addon components via the API server.
|
||||||
`)
|
`)
|
||||||
)
|
)
|
||||||
|
@ -23,13 +23,13 @@ import (
|
|||||||
|
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
clusterinfophase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo"
|
clusterinfophase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo"
|
||||||
nodebootstraptokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node"
|
nodebootstraptokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
bootstrapTokenLongDesc = normalizer.LongDesc(`
|
bootstrapTokenLongDesc = cmdutil.LongDesc(`
|
||||||
Bootstrap tokens are used for establishing bidirectional trust between a node joining
|
Bootstrap tokens are used for establishing bidirectional trust between a node joining
|
||||||
the cluster and a the control-plane node.
|
the cluster and a the control-plane node.
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ var (
|
|||||||
and then creates an initial token.
|
and then creates an initial token.
|
||||||
`)
|
`)
|
||||||
|
|
||||||
bootstrapTokenExamples = normalizer.Examples(`
|
bootstrapTokenExamples = cmdutil.Examples(`
|
||||||
# Make all the bootstrap token configurations and create an initial token, functionally
|
# Make all the bootstrap token configurations and create an initial token, functionally
|
||||||
# equivalent to what generated by kubeadm init.
|
# equivalent to what generated by kubeadm init.
|
||||||
kubeadm init phase bootstrap-token
|
kubeadm init phase bootstrap-token
|
||||||
|
@ -32,17 +32,16 @@ import (
|
|||||||
certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
|
certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
|
||||||
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
|
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/util/pkiutil"
|
"k8s.io/kubernetes/cmd/kubeadm/app/util/pkiutil"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
saKeyLongDesc = fmt.Sprintf(normalizer.LongDesc(`
|
saKeyLongDesc = fmt.Sprintf(cmdutil.LongDesc(`
|
||||||
Generate the private key for signing service account tokens along with its public key, and save them into
|
Generate the private key for signing service account tokens along with its public key, and save them into
|
||||||
%s and %s files.
|
%s and %s files.
|
||||||
If both files already exist, kubeadm skips the generation step and existing files will be used.
|
If both files already exist, kubeadm skips the generation step and existing files will be used.
|
||||||
`+cmdutil.AlphaDisclaimer), kubeadmconstants.ServiceAccountPrivateKeyName, kubeadmconstants.ServiceAccountPublicKeyName)
|
`+cmdutil.AlphaDisclaimer), kubeadmconstants.ServiceAccountPrivateKeyName, kubeadmconstants.ServiceAccountPublicKeyName)
|
||||||
|
|
||||||
genericLongDesc = normalizer.LongDesc(`
|
genericLongDesc = cmdutil.LongDesc(`
|
||||||
Generate the %[1]s, and save them into %[2]s.cert and %[2]s.key files.%[3]s
|
Generate the %[1]s, and save them into %[2]s.cert and %[2]s.key files.%[3]s
|
||||||
|
|
||||||
If both files already exist, kubeadm skips the generation step and existing files will be used.
|
If both files already exist, kubeadm skips the generation step and existing files will be used.
|
||||||
|
@ -26,11 +26,10 @@ import (
|
|||||||
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"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
controlPlaneExample = normalizer.Examples(`
|
controlPlaneExample = cmdutil.Examples(`
|
||||||
# Generates all static Pod manifest files for control plane components,
|
# Generates all static Pod manifest files for control plane components,
|
||||||
# functionally equivalent to what is generated by kubeadm init.
|
# functionally equivalent to what is generated by kubeadm init.
|
||||||
kubeadm init phase control-plane all
|
kubeadm init phase control-plane all
|
||||||
|
@ -26,11 +26,10 @@ import (
|
|||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
etcdphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/etcd"
|
etcdphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/etcd"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
etcdLocalExample = normalizer.Examples(`
|
etcdLocalExample = cmdutil.Examples(`
|
||||||
# Generates the static Pod manifest file for etcd, functionally
|
# Generates the static Pod manifest file for etcd, functionally
|
||||||
# equivalent to what is generated by kubeadm init.
|
# equivalent to what is generated by kubeadm init.
|
||||||
kubeadm init phase etcd local
|
kubeadm init phase etcd local
|
||||||
|
@ -25,7 +25,6 @@ import (
|
|||||||
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"
|
||||||
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
|
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -42,7 +41,7 @@ var (
|
|||||||
kubeadmconstants.KubeletKubeConfigFileName: {
|
kubeadmconstants.KubeletKubeConfigFileName: {
|
||||||
name: "kubelet",
|
name: "kubelet",
|
||||||
short: "Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes",
|
short: "Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes",
|
||||||
long: normalizer.LongDesc(`
|
long: cmdutil.LongDesc(`
|
||||||
Generate the kubeconfig file for the kubelet to use and save it to %s file.
|
Generate the kubeconfig file for the kubelet to use and save it to %s file.
|
||||||
|
|
||||||
Please note that this should *only* be used for cluster bootstrapping purposes. After your control plane is up,
|
Please note that this should *only* be used for cluster bootstrapping purposes. After your control plane is up,
|
||||||
|
@ -21,12 +21,12 @@ import (
|
|||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
kubeletphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubelet"
|
kubeletphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubelet"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
kubeletStartPhaseExample = normalizer.Examples(`
|
kubeletStartPhaseExample = cmdutil.Examples(`
|
||||||
# Writes a dynamic environment file with kubelet flags from a InitConfiguration file.
|
# Writes a dynamic environment file with kubelet flags from a InitConfiguration file.
|
||||||
kubeadm init phase kubelet-start --config config.yaml
|
kubeadm init phase kubelet-start --config config.yaml
|
||||||
`)
|
`)
|
||||||
|
@ -20,12 +20,12 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
markcontrolplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markcontrolplane"
|
markcontrolplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markcontrolplane"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
markControlPlaneExample = normalizer.Examples(`
|
markControlPlaneExample = cmdutil.Examples(`
|
||||||
# Applies control-plane label and taint to the current node, functionally equivalent to what executed by kubeadm init.
|
# Applies control-plane label and taint to the current node, functionally equivalent to what executed by kubeadm init.
|
||||||
kubeadm init phase mark-control-plane --config config.yml
|
kubeadm init phase mark-control-plane --config config.yml
|
||||||
|
|
||||||
|
@ -22,13 +22,13 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
|
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
utilsexec "k8s.io/utils/exec"
|
utilsexec "k8s.io/utils/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
preflightExample = normalizer.Examples(`
|
preflightExample = cmdutil.Examples(`
|
||||||
# Run pre-flight checks for kubeadm init using a config file.
|
# Run pre-flight checks for kubeadm init using a config file.
|
||||||
kubeadm init phase preflight --config kubeadm-config.yml
|
kubeadm init phase preflight --config kubeadm-config.yml
|
||||||
`)
|
`)
|
||||||
|
@ -31,28 +31,27 @@ import (
|
|||||||
kubeletphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubelet"
|
kubeletphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubelet"
|
||||||
patchnodephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/patchnode"
|
patchnodephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/patchnode"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
uploadKubeadmConfigLongDesc = fmt.Sprintf(normalizer.LongDesc(`
|
uploadKubeadmConfigLongDesc = fmt.Sprintf(cmdutil.LongDesc(`
|
||||||
Upload the kubeadm ClusterConfiguration to a ConfigMap called %s in the %s namespace.
|
Upload the kubeadm ClusterConfiguration to a ConfigMap called %s in the %s namespace.
|
||||||
This enables correct configuration of system components and a seamless user experience when upgrading.
|
This enables correct configuration of system components and a seamless user experience when upgrading.
|
||||||
|
|
||||||
Alternatively, you can use kubeadm config.
|
Alternatively, you can use kubeadm config.
|
||||||
`), kubeadmconstants.KubeadmConfigConfigMap, metav1.NamespaceSystem)
|
`), kubeadmconstants.KubeadmConfigConfigMap, metav1.NamespaceSystem)
|
||||||
|
|
||||||
uploadKubeadmConfigExample = normalizer.Examples(`
|
uploadKubeadmConfigExample = cmdutil.Examples(`
|
||||||
# upload the configuration of your cluster
|
# upload the configuration of your cluster
|
||||||
kubeadm init phase upload-config --config=myConfig.yaml
|
kubeadm init phase upload-config --config=myConfig.yaml
|
||||||
`)
|
`)
|
||||||
|
|
||||||
uploadKubeletConfigLongDesc = normalizer.LongDesc(`
|
uploadKubeletConfigLongDesc = cmdutil.LongDesc(`
|
||||||
Upload kubelet configuration extracted from the kubeadm InitConfiguration object to a ConfigMap
|
Upload kubelet configuration extracted from the kubeadm InitConfiguration object to a ConfigMap
|
||||||
of the form kubelet-config-1.X in the cluster, where X is the minor version of the current (API Server) Kubernetes version.
|
of the form kubelet-config-1.X in the cluster, where X is the minor version of the current (API Server) Kubernetes version.
|
||||||
`)
|
`)
|
||||||
|
|
||||||
uploadKubeletConfigExample = normalizer.Examples(`
|
uploadKubeletConfigExample = cmdutil.Examples(`
|
||||||
# Upload the kubelet configuration from the kubeadm Config file to a ConfigMap in the cluster.
|
# Upload the kubelet configuration from the kubeadm Config file to a ConfigMap in the cluster.
|
||||||
kubeadm init phase upload-config kubelet --config kubeadm.yaml
|
kubeadm init phase upload-config kubelet --config kubeadm.yaml
|
||||||
`)
|
`)
|
||||||
|
@ -16,6 +16,7 @@ go_library(
|
|||||||
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
|
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
|
||||||
"//cmd/kubeadm/app/cmd/options:go_default_library",
|
"//cmd/kubeadm/app/cmd/options:go_default_library",
|
||||||
"//cmd/kubeadm/app/cmd/phases/workflow:go_default_library",
|
"//cmd/kubeadm/app/cmd/phases/workflow:go_default_library",
|
||||||
|
"//cmd/kubeadm/app/cmd/util:go_default_library",
|
||||||
"//cmd/kubeadm/app/constants:go_default_library",
|
"//cmd/kubeadm/app/constants:go_default_library",
|
||||||
"//cmd/kubeadm/app/phases/certs:go_default_library",
|
"//cmd/kubeadm/app/phases/certs:go_default_library",
|
||||||
"//cmd/kubeadm/app/phases/controlplane:go_default_library",
|
"//cmd/kubeadm/app/phases/controlplane:go_default_library",
|
||||||
@ -29,7 +30,6 @@ go_library(
|
|||||||
"//cmd/kubeadm/app/preflight:go_default_library",
|
"//cmd/kubeadm/app/preflight:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
||||||
"//pkg/util/normalizer:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
@ -24,14 +24,14 @@ import (
|
|||||||
|
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
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"
|
||||||
etcdphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/etcd"
|
etcdphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/etcd"
|
||||||
markcontrolplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markcontrolplane"
|
markcontrolplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markcontrolplane"
|
||||||
uploadconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
|
uploadconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var controlPlaneJoinExample = normalizer.Examples(`
|
var controlPlaneJoinExample = cmdutil.Examples(`
|
||||||
# Joins a machine as a control plane instance
|
# Joins a machine as a control plane instance
|
||||||
kubeadm join phase control-plane-join all
|
kubeadm join phase control-plane-join all
|
||||||
`)
|
`)
|
||||||
|
@ -26,16 +26,16 @@ import (
|
|||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
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"
|
||||||
certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
|
certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/copycerts"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/copycerts"
|
||||||
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
|
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
|
||||||
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var controlPlanePrepareExample = normalizer.Examples(`
|
var controlPlanePrepareExample = cmdutil.Examples(`
|
||||||
# Prepares the machine for serving a control plane
|
# Prepares the machine for serving a control plane
|
||||||
kubeadm join phase control-plane-prepare all
|
kubeadm join phase control-plane-prepare all
|
||||||
`)
|
`)
|
||||||
|
@ -27,14 +27,14 @@ import (
|
|||||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
|
"k8s.io/kubernetes/cmd/kubeadm/app/preflight"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
utilsexec "k8s.io/utils/exec"
|
utilsexec "k8s.io/utils/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
preflightExample = normalizer.Examples(`
|
preflightExample = cmdutil.Examples(`
|
||||||
# Run join pre-flight checks using a config file.
|
# Run join pre-flight checks using a config file.
|
||||||
kubeadm join phase preflight --config kubeadm-config.yml
|
kubeadm join phase preflight --config kubeadm-config.yml
|
||||||
`)
|
`)
|
||||||
|
@ -13,12 +13,12 @@ go_library(
|
|||||||
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
|
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
|
||||||
"//cmd/kubeadm/app/cmd/options:go_default_library",
|
"//cmd/kubeadm/app/cmd/options:go_default_library",
|
||||||
"//cmd/kubeadm/app/cmd/phases/workflow:go_default_library",
|
"//cmd/kubeadm/app/cmd/phases/workflow:go_default_library",
|
||||||
|
"//cmd/kubeadm/app/cmd/util:go_default_library",
|
||||||
"//cmd/kubeadm/app/constants:go_default_library",
|
"//cmd/kubeadm/app/constants:go_default_library",
|
||||||
"//cmd/kubeadm/app/phases/kubelet:go_default_library",
|
"//cmd/kubeadm/app/phases/kubelet:go_default_library",
|
||||||
"//cmd/kubeadm/app/phases/upgrade:go_default_library",
|
"//cmd/kubeadm/app/phases/upgrade:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/dryrun:go_default_library",
|
"//cmd/kubeadm/app/util/dryrun:go_default_library",
|
||||||
"//pkg/util/normalizer:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//vendor/github.com/pkg/errors:go_default_library",
|
"//vendor/github.com/pkg/errors:go_default_library",
|
||||||
|
@ -26,15 +26,15 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/version"
|
"k8s.io/apimachinery/pkg/util/version"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
|
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
kubeletphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubelet"
|
kubeletphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubelet"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade"
|
||||||
dryrunutil "k8s.io/kubernetes/cmd/kubeadm/app/util/dryrun"
|
dryrunutil "k8s.io/kubernetes/cmd/kubeadm/app/util/dryrun"
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
kubeletConfigLongDesc = normalizer.LongDesc(`
|
kubeletConfigLongDesc = cmdutil.LongDesc(`
|
||||||
Download the kubelet configuration from a ConfigMap of the form "kubelet-config-1.X" in the cluster,
|
Download the kubelet configuration from a ConfigMap of the form "kubelet-config-1.X" in the cluster,
|
||||||
where X is the minor version of the kubelet. kubeadm uses the KuberneteVersion field in the kubeadm-config
|
where X is the minor version of the kubelet. kubeadm uses the KuberneteVersion field in the kubeadm-config
|
||||||
ConfigMap to determine what the _desired_ kubelet version is, but the user can override this by using the
|
ConfigMap to determine what the _desired_ kubelet version is, but the user can override this by using the
|
||||||
|
@ -14,7 +14,6 @@ go_library(
|
|||||||
"//cmd/kubeadm/app/constants:go_default_library",
|
"//cmd/kubeadm/app/constants:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
||||||
"//cmd/kubeadm/app/util/pubkeypin:go_default_library",
|
"//cmd/kubeadm/app/util/pubkeypin:go_default_library",
|
||||||
"//pkg/util/normalizer:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/util/cert:go_default_library",
|
"//staging/src/k8s.io/client-go/util/cert:go_default_library",
|
||||||
"//vendor/github.com/pkg/errors:go_default_library",
|
"//vendor/github.com/pkg/errors:go_default_library",
|
||||||
@ -26,7 +25,10 @@ go_library(
|
|||||||
|
|
||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = ["cmdutil_test.go"],
|
srcs = [
|
||||||
|
"cmdutil_test.go",
|
||||||
|
"documentation_test.go",
|
||||||
|
],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ limitations under the License.
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/kubernetes/pkg/util/normalizer"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -27,7 +27,79 @@ var (
|
|||||||
`
|
`
|
||||||
|
|
||||||
// MacroCommandLongDescription provide a standard description for "macro" commands
|
// MacroCommandLongDescription provide a standard description for "macro" commands
|
||||||
MacroCommandLongDescription = normalizer.LongDesc(`
|
MacroCommandLongDescription = LongDesc(`
|
||||||
This command is not meant to be run on its own. See list of available subcommands.
|
This command is not meant to be run on its own. See list of available subcommands.
|
||||||
`)
|
`)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// LongDesc is designed to help with producing better long command line descriptions in code.
|
||||||
|
// Its behavior is somewhat inspired by the same function of kubectl, which uses Markdown for the input message.
|
||||||
|
// This one is not Markdown compliant, but it covers the needs of kubeadm. In particular:
|
||||||
|
// - Beginning and trailing space characters (including empty lines), are stripped from the output.
|
||||||
|
// - Consecutive non-empty lines of text are joined with spaces to form paragraphs.
|
||||||
|
// - Paragraphs are blocks of text divided by one or more empty lines or lines consisting only of "space" characters.
|
||||||
|
// - Paragraphs are spaced by precisely one empty line in the output.
|
||||||
|
// - A line break can be forced by adding a couple of empty spaces at the end of a text line.
|
||||||
|
// - All indentation is removed. The resulting output is not indented.
|
||||||
|
func LongDesc(s string) string {
|
||||||
|
// Strip beginning and trailing space characters (including empty lines) and split the lines into a slice
|
||||||
|
lines := strings.Split(strings.TrimSpace(s), "\n")
|
||||||
|
|
||||||
|
output := []string{}
|
||||||
|
paragraph := []string{}
|
||||||
|
|
||||||
|
for _, line := range lines {
|
||||||
|
// Remove indentation and trailing spaces from the current line
|
||||||
|
trimmedLine := strings.TrimSpace(line)
|
||||||
|
if trimmedLine == "" {
|
||||||
|
if len(paragraph) > 0 {
|
||||||
|
// If the line is empty and the current paragraph is not, we have reached a paragraph end.
|
||||||
|
// (if the paragraph and the line are empty, then this is non-first empty line in between paragraphs and needs to be ignored)
|
||||||
|
// In that case we join all of the paragraph lines with a single space,
|
||||||
|
// add a trailing newline character (to ensure an empty line after the paragraph),
|
||||||
|
// append the paragraph text to the output and clear everything in the current paragraph slice.
|
||||||
|
output = append(output, strings.Join(paragraph, " ")+"\n")
|
||||||
|
paragraph = []string{}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Non-empty text line, append it to the current paragraph
|
||||||
|
paragraph = append(paragraph, trimmedLine)
|
||||||
|
if strings.HasSuffix(line, " ") {
|
||||||
|
// If the original line has a suffix of couple of spaces, then we add a line break.
|
||||||
|
// This is achieved by flushing out the current paragraph and starting a new one.
|
||||||
|
// No trailing space is added to the flushed paragraph,
|
||||||
|
// so that no empty line is placed between the old and the new paragraphs (a simple line break)
|
||||||
|
output = append(output, strings.Join(paragraph, " "))
|
||||||
|
paragraph = []string{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The last paragraph is always unflushed, so flush it.
|
||||||
|
// We don't add a trailing newline character, so that we won't have to strip the output.
|
||||||
|
output = append(output, strings.Join(paragraph, " "))
|
||||||
|
|
||||||
|
// Join all the paragraphs together with new lines in between them.
|
||||||
|
return strings.Join(output, "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Examples is designed to help with producing examples for command line usage.
|
||||||
|
// Its behavior is mimicking a similar kubectl function in the following ways:
|
||||||
|
// - Beginning and trailing space characters (including empty lines), are stripped from the output.
|
||||||
|
// - All lines of text are stripped of beginning and trailing spaces (thus loosing indentation) and are then double-space indented.
|
||||||
|
func Examples(s string) string {
|
||||||
|
trimmedText := strings.TrimSpace(s)
|
||||||
|
if trimmedText == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
const indent = ` `
|
||||||
|
inLines := strings.Split(trimmedText, "\n")
|
||||||
|
outLines := make([]string, 0, len(inLines))
|
||||||
|
|
||||||
|
for _, line := range inLines {
|
||||||
|
outLines = append(outLines, indent+strings.TrimSpace(line))
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(outLines, "\n")
|
||||||
|
}
|
||||||
|
117
cmd/kubeadm/app/cmd/util/documentation_test.go
Normal file
117
cmd/kubeadm/app/cmd/util/documentation_test.go
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLongDesc(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
desc string
|
||||||
|
in string
|
||||||
|
out string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "Empty input produces empty output",
|
||||||
|
in: "",
|
||||||
|
out: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Single line text is preserved as is",
|
||||||
|
in: "Some text",
|
||||||
|
out: "Some text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Consecutive new lines are combined into a single paragraph",
|
||||||
|
in: "Line1\nLine2",
|
||||||
|
out: "Line1 Line2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Leading and trailing spaces are stripped (single line)",
|
||||||
|
in: "\t \nThe text line \n \t",
|
||||||
|
out: "The text line",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Leading and trailing spaces are stripped (multi line)",
|
||||||
|
in: "\t \nLine1\nLine2 \n \t",
|
||||||
|
out: "Line1 Line2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Multiple paragraphs are separated by a single empty line",
|
||||||
|
in: "Paragraph1\n\nParagraph2\n\n\nParagraph3",
|
||||||
|
out: "Paragraph1\n\nParagraph2\n\nParagraph3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Indentation is not preserved",
|
||||||
|
in: "\tParagraph1Line1\n\tParagraph1Line2\n\n Paragraph2Line1\n Paragraph2Line2",
|
||||||
|
out: "Paragraph1Line1 Paragraph1Line2\n\nParagraph2Line1 Paragraph2Line2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Double spaced line breaks",
|
||||||
|
in: "Line1 \nLine2",
|
||||||
|
out: "Line1\nLine2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Double spaced line breaks don't preserve indentation",
|
||||||
|
in: "\tLine1 \n\tLine2",
|
||||||
|
out: "Line1\nLine2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
got := LongDesc(test.in)
|
||||||
|
if got != test.out {
|
||||||
|
t.Errorf("expected(%d):\n%s\n=====\ngot(%d):\n%s\n", len(test.out), test.out, len(got), got)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExamples(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
desc string
|
||||||
|
in string
|
||||||
|
out string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "Empty input produces empty output",
|
||||||
|
in: "",
|
||||||
|
out: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Text is indented with a couple of spaces",
|
||||||
|
in: "\tLine1\n\tLine2",
|
||||||
|
out: " Line1\n Line2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Text is stripped of leading and trailing spaces",
|
||||||
|
in: "\t\n\tLine1\t \n\tLine2\t \n\t\n\n",
|
||||||
|
out: " Line1\n Line2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
got := Examples(test.in)
|
||||||
|
if got != test.out {
|
||||||
|
t.Errorf("expected(%d):\n%s\n=====\ngot(%d):\n%s\n", len(test.out), test.out, len(got), got)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user