mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Merge pull request #57207 from cimomo/kubeadm-fixes
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Improve error messages and comments in KubeAdm. **What this PR does / why we need it**: Improve error messages and comments in KubeAdm. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes # **Special notes for your reviewer**: **Release note**: ```release-note NONE ```
This commit is contained in:
commit
09b5e8f411
@ -65,7 +65,7 @@ func NewCmdConfig(out io.Writer) *cobra.Command {
|
|||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCmdConfigUpload returs cobra.Command for "kubeadm config upload" command
|
// NewCmdConfigUpload returns cobra.Command for "kubeadm config upload" command
|
||||||
func NewCmdConfigUpload(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
func NewCmdConfigUpload(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "upload",
|
Use: "upload",
|
||||||
@ -78,7 +78,7 @@ func NewCmdConfigUpload(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
|||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCmdConfigView returs cobra.Command for "kubeadm config view" command
|
// NewCmdConfigView returns cobra.Command for "kubeadm config view" command
|
||||||
func NewCmdConfigView(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
func NewCmdConfigView(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
||||||
return &cobra.Command{
|
return &cobra.Command{
|
||||||
Use: "view",
|
Use: "view",
|
||||||
@ -98,7 +98,7 @@ func NewCmdConfigView(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCmdConfigUploadFromFile verifies given kubernetes config file and returs cobra.Command for
|
// NewCmdConfigUploadFromFile verifies given kubernetes config file and returns cobra.Command for
|
||||||
// "kubeadm config upload from-file" command
|
// "kubeadm config upload from-file" command
|
||||||
func NewCmdConfigUploadFromFile(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
func NewCmdConfigUploadFromFile(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
||||||
var cfgPath string
|
var cfgPath string
|
||||||
@ -131,7 +131,7 @@ func NewCmdConfigUploadFromFile(out io.Writer, kubeConfigFile *string) *cobra.Co
|
|||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCmdConfigUploadFromFlags returs cobra.Command for "kubeadm config upload from-flags" command
|
// NewCmdConfigUploadFromFlags returns cobra.Command for "kubeadm config upload from-flags" command
|
||||||
func NewCmdConfigUploadFromFlags(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
func NewCmdConfigUploadFromFlags(out io.Writer, kubeConfigFile *string) *cobra.Command {
|
||||||
cfg := &kubeadmapiext.MasterConfiguration{}
|
cfg := &kubeadmapiext.MasterConfiguration{}
|
||||||
legacyscheme.Scheme.Default(cfg)
|
legacyscheme.Scheme.Default(cfg)
|
||||||
|
@ -206,7 +206,7 @@ func getCertsSubCommands(defaultKubernetesVersion string) []*cobra.Command {
|
|||||||
// runCmdFunc creates a cobra.Command Run function, by composing the call to the given cmdFunc with necessary additional steps (e.g preparation of input parameters)
|
// runCmdFunc creates a cobra.Command Run function, by composing the call to the given cmdFunc with necessary additional steps (e.g preparation of input parameters)
|
||||||
func runCmdFunc(cmdFunc func(cfg *kubeadmapi.MasterConfiguration) error, cfgPath *string, cfg *kubeadmapiext.MasterConfiguration) func(cmd *cobra.Command, args []string) {
|
func runCmdFunc(cmdFunc func(cfg *kubeadmapi.MasterConfiguration) error, cfgPath *string, cfg *kubeadmapiext.MasterConfiguration) func(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
// the following statement build a clousure that wraps a call to a cmdFunc, binding
|
// the following statement build a closure that wraps a call to a cmdFunc, binding
|
||||||
// the function itself with the specific parameters of each sub command.
|
// the function itself with the specific parameters of each sub command.
|
||||||
// Please note that specific parameter should be passed as value, while other parameters - passed as reference -
|
// Please note that specific parameter should be passed as value, while other parameters - passed as reference -
|
||||||
// are shared between sub commands and gets access to current value e.g. flags value.
|
// are shared between sub commands and gets access to current value e.g. flags value.
|
||||||
|
@ -82,7 +82,7 @@ func getControlPlaneSubCommands(outDir, defaultKubernetesVersion string) []*cobr
|
|||||||
|
|
||||||
// This is used for unit testing only...
|
// This is used for unit testing only...
|
||||||
// If we wouldn't set this to something, the code would dynamically look up the version from the internet
|
// If we wouldn't set this to something, the code would dynamically look up the version from the internet
|
||||||
// By setting this explicitely for tests workarounds that
|
// By setting this explicitly for tests workarounds that
|
||||||
if defaultKubernetesVersion != "" {
|
if defaultKubernetesVersion != "" {
|
||||||
cfg.KubernetesVersion = defaultKubernetesVersion
|
cfg.KubernetesVersion = defaultKubernetesVersion
|
||||||
}
|
}
|
||||||
@ -164,7 +164,7 @@ func getControlPlaneSubCommands(outDir, defaultKubernetesVersion string) []*cobr
|
|||||||
// runCmdControlPlane creates a cobra.Command Run function, by composing the call to the given cmdFunc with necessary additional steps (e.g preparation of input parameters)
|
// runCmdControlPlane creates a cobra.Command Run function, by composing the call to the given cmdFunc with necessary additional steps (e.g preparation of input parameters)
|
||||||
func runCmdControlPlane(cmdFunc func(outDir string, cfg *kubeadmapi.MasterConfiguration) error, outDir, cfgPath *string, featureGatesString *string, cfg *kubeadmapiext.MasterConfiguration) func(cmd *cobra.Command, args []string) {
|
func runCmdControlPlane(cmdFunc func(outDir string, cfg *kubeadmapi.MasterConfiguration) error, outDir, cfgPath *string, featureGatesString *string, cfg *kubeadmapiext.MasterConfiguration) func(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
// the following statement build a clousure that wraps a call to a cmdFunc, binding
|
// the following statement build a closure that wraps a call to a cmdFunc, binding
|
||||||
// the function itself with the specific parameters of each sub command.
|
// the function itself with the specific parameters of each sub command.
|
||||||
// Please note that specific parameter should be passed as value, while other parameters - passed as reference -
|
// Please note that specific parameter should be passed as value, while other parameters - passed as reference -
|
||||||
// are shared between sub commands and gets access to current value e.g. flags value.
|
// are shared between sub commands and gets access to current value e.g. flags value.
|
||||||
|
@ -170,10 +170,10 @@ func TestKubeConfigSubCommandsThatCreateFilesWithFlags(t *testing.T) {
|
|||||||
|
|
||||||
outputdir := tmpdir
|
outputdir := tmpdir
|
||||||
|
|
||||||
// Retrives ca cert for assertions
|
// Retrieves ca cert for assertions
|
||||||
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("couldn't retrive ca cert: %v", err)
|
t.Fatalf("couldn't retrieve ca cert: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get subcommands working in the temporary directory
|
// Get subcommands working in the temporary directory
|
||||||
@ -272,10 +272,10 @@ func TestKubeConfigSubCommandsThatCreateFilesWithConfigFile(t *testing.T) {
|
|||||||
// Adds a pki folder with a ca certs to the temp folder
|
// Adds a pki folder with a ca certs to the temp folder
|
||||||
pkidir := testutil.SetupPkiDirWithCertificateAuthorithy(t, tmpdir)
|
pkidir := testutil.SetupPkiDirWithCertificateAuthorithy(t, tmpdir)
|
||||||
|
|
||||||
// Retrives ca cert for assertions
|
// Retrieves ca cert for assertions
|
||||||
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("couldn't retrive ca cert: %v", err)
|
t.Fatalf("couldn't retrieve ca cert: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds a master configuration file
|
// Adds a master configuration file
|
||||||
@ -327,10 +327,10 @@ func TestKubeConfigSubCommandsThatWritesToOut(t *testing.T) {
|
|||||||
|
|
||||||
outputdir := tmpdir
|
outputdir := tmpdir
|
||||||
|
|
||||||
// Retrives ca cert for assertions
|
// Retrieves ca cert for assertions
|
||||||
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("couldn't retrive ca cert: %v", err)
|
t.Fatalf("couldn't retrieve ca cert: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
commonFlags := []string{
|
commonFlags := []string{
|
||||||
|
@ -29,7 +29,7 @@ import (
|
|||||||
// runCmdPhase creates a cobra.Command Run function, by composing the call to the given cmdFunc with necessary additional steps (e.g preparation of input parameters)
|
// runCmdPhase creates a cobra.Command Run function, by composing the call to the given cmdFunc with necessary additional steps (e.g preparation of input parameters)
|
||||||
func runCmdPhase(cmdFunc func(outDir string, cfg *kubeadmapi.MasterConfiguration) error, outDir, cfgPath *string, cfg *kubeadmapiext.MasterConfiguration) func(cmd *cobra.Command, args []string) {
|
func runCmdPhase(cmdFunc func(outDir string, cfg *kubeadmapi.MasterConfiguration) error, outDir, cfgPath *string, cfg *kubeadmapiext.MasterConfiguration) func(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
// the following statement build a clousure that wraps a call to a cmdFunc, binding
|
// the following statement build a closure that wraps a call to a cmdFunc, binding
|
||||||
// the function itself with the specific parameters of each sub command.
|
// the function itself with the specific parameters of each sub command.
|
||||||
// Please note that specific parameter should be passed as value, while other parameters - passed as reference -
|
// Please note that specific parameter should be passed as value, while other parameters - passed as reference -
|
||||||
// are shared between sub commands and gets access to current value e.g. flags value.
|
// are shared between sub commands and gets access to current value e.g. flags value.
|
||||||
|
@ -75,7 +75,7 @@ func ValidateClusterInfo(clusterinfo *clientcmdapi.Config) (*clientcmdapi.Cluste
|
|||||||
clusterinfoCM, err = client.CoreV1().ConfigMaps(metav1.NamespacePublic).Get(bootstrapapi.ConfigMapClusterInfo, metav1.GetOptions{})
|
clusterinfoCM, err = client.CoreV1().ConfigMaps(metav1.NamespacePublic).Get(bootstrapapi.ConfigMapClusterInfo, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if apierrors.IsForbidden(err) {
|
if apierrors.IsForbidden(err) {
|
||||||
// If the request is unauthorized, the cluster admin has not granted access to the cluster info configmap for unauthenicated users
|
// If the request is unauthorized, the cluster admin has not granted access to the cluster info configmap for unauthenticated users
|
||||||
// In that case, trust the cluster admin and do not refresh the cluster-info credentials
|
// In that case, trust the cluster admin and do not refresh the cluster-info credentials
|
||||||
fmt.Printf("[discovery] Could not access the %s ConfigMap for refreshing the cluster-info information, but the TLS cert is valid so proceeding...\n", bootstrapapi.ConfigMapClusterInfo)
|
fmt.Printf("[discovery] Could not access the %s ConfigMap for refreshing the cluster-info information, but the TLS cert is valid so proceeding...\n", bootstrapapi.ConfigMapClusterInfo)
|
||||||
return true, nil
|
return true, nil
|
||||||
|
@ -46,7 +46,7 @@ func TestKnownFeatures(t *testing.T) {
|
|||||||
if r[1] != f2 {
|
if r[1] != f2 {
|
||||||
t.Errorf("KnownFeatures returned %s values, expected %s", r[1], f2)
|
t.Errorf("KnownFeatures returned %s values, expected %s", r[1], f2)
|
||||||
}
|
}
|
||||||
// check the second value is feature3; prerelease should not shown fo GA features; default should be present
|
// check the second value is feature3; prerelease should not be shown for GA features; default should be present
|
||||||
f3 := "feature3=true|false (default=false)"
|
f3 := "feature3=true|false (default=false)"
|
||||||
if r[2] != f3 {
|
if r[2] != f3 {
|
||||||
t.Errorf("KnownFeatures returned %s values, expected %s", r[2], f3)
|
t.Errorf("KnownFeatures returned %s values, expected %s", r[2], f3)
|
||||||
|
@ -143,7 +143,7 @@ func TestBuildKubeConfigFromSpecWithClientAuth(t *testing.T) {
|
|||||||
// Creates a CA
|
// Creates a CA
|
||||||
caCert, caKey := certstestutil.SetupCertificateAuthorithy(t)
|
caCert, caKey := certstestutil.SetupCertificateAuthorithy(t)
|
||||||
|
|
||||||
// Executes buildKubeConfigFromSpec passing a KubeConfigSpec wiht a ClientAuth
|
// Executes buildKubeConfigFromSpec passing a KubeConfigSpec with a ClientAuth
|
||||||
config := setupdKubeConfigWithClientAuth(t, caCert, caKey, "https://1.2.3.4:1234", "myClientName", "myOrg1", "myOrg2")
|
config := setupdKubeConfigWithClientAuth(t, caCert, caKey, "https://1.2.3.4:1234", "myClientName", "myOrg1", "myOrg2")
|
||||||
|
|
||||||
// Asserts spec data are propagated to the kubeconfig
|
// Asserts spec data are propagated to the kubeconfig
|
||||||
@ -155,7 +155,7 @@ func TestBuildKubeConfigFromSpecWithTokenAuth(t *testing.T) {
|
|||||||
// Creates a CA
|
// Creates a CA
|
||||||
caCert, _ := certstestutil.SetupCertificateAuthorithy(t)
|
caCert, _ := certstestutil.SetupCertificateAuthorithy(t)
|
||||||
|
|
||||||
// Executes buildKubeConfigFromSpec passing a KubeConfigSpec wiht a Token
|
// Executes buildKubeConfigFromSpec passing a KubeConfigSpec with a Token
|
||||||
config := setupdKubeConfigWithTokenAuth(t, caCert, "https://1.2.3.4:1234", "myClientName", "123456")
|
config := setupdKubeConfigWithTokenAuth(t, caCert, "https://1.2.3.4:1234", "myClientName", "123456")
|
||||||
|
|
||||||
// Asserts spec data are propagated to the kubeconfig
|
// Asserts spec data are propagated to the kubeconfig
|
||||||
@ -219,7 +219,7 @@ func TestCreateKubeConfigFileIfNotExists(t *testing.T) {
|
|||||||
t.Errorf("createKubeConfigFileIfNotExists failed")
|
t.Errorf("createKubeConfigFileIfNotExists failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assert creted files is there
|
// Assert that the created file is there
|
||||||
testutil.AssertFileExists(t, tmpdir, "test.conf")
|
testutil.AssertFileExists(t, tmpdir, "test.conf")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -338,10 +338,10 @@ func TestWriteKubeConfig(t *testing.T) {
|
|||||||
// Adds a pki folder with a ca cert to the temp folder
|
// Adds a pki folder with a ca cert to the temp folder
|
||||||
pkidir := testutil.SetupPkiDirWithCertificateAuthorithy(t, tmpdir)
|
pkidir := testutil.SetupPkiDirWithCertificateAuthorithy(t, tmpdir)
|
||||||
|
|
||||||
// Retrives ca cert for assertions
|
// Retrieves ca cert for assertions
|
||||||
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkidir, kubeadmconstants.CACertAndKeyBaseName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("couldn't retrive ca cert: %v", err)
|
t.Fatalf("couldn't retrieve ca cert: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a Master Configuration pointing to the pkidir folder
|
// Creates a Master Configuration pointing to the pkidir folder
|
||||||
|
@ -112,7 +112,7 @@ func CreateSelfHostedControlPlane(manifestsDir, kubeConfigDir string, cfg *kubea
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Wait for the mirror Pod hash to be removed; otherwise we'll run into race conditions here when the kubelet hasn't had time to
|
// Wait for the mirror Pod hash to be removed; otherwise we'll run into race conditions here when the kubelet hasn't had time to
|
||||||
// remove the Static Pod (or the mirror Pod respectively). This implicitely also tests that the API server endpoint is healthy,
|
// remove the Static Pod (or the mirror Pod respectively). This implicitly also tests that the API server endpoint is healthy,
|
||||||
// because this blocks until the API server returns a 404 Not Found when getting the Static Pod
|
// because this blocks until the API server returns a 404 Not Found when getting the Static Pod
|
||||||
staticPodName := fmt.Sprintf("%s-%s", componentName, cfg.NodeName)
|
staticPodName := fmt.Sprintf("%s-%s", componentName, cfg.NodeName)
|
||||||
if err := waiter.WaitForPodToDisappear(staticPodName); err != nil {
|
if err := waiter.WaitForPodToDisappear(staticPodName); err != nil {
|
||||||
@ -129,7 +129,7 @@ func CreateSelfHostedControlPlane(manifestsDir, kubeConfigDir string, cfg *kubea
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// BuildDaemonSet is responsible for mutating the PodSpec and return a DaemonSet which is suitable for the self-hosting purporse
|
// BuildDaemonSet is responsible for mutating the PodSpec and returns a DaemonSet which is suitable for self-hosting
|
||||||
func BuildDaemonSet(name string, podSpec *v1.PodSpec, mutators map[string][]PodSpecMutatorFunc) *apps.DaemonSet {
|
func BuildDaemonSet(name string, podSpec *v1.PodSpec, mutators map[string][]PodSpecMutatorFunc) *apps.DaemonSet {
|
||||||
|
|
||||||
// Mutate the PodSpec so it's suitable for self-hosting
|
// Mutate the PodSpec so it's suitable for self-hosting
|
||||||
|
@ -41,7 +41,7 @@ type Prepuller interface {
|
|||||||
DeleteFunc(string) error
|
DeleteFunc(string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// DaemonSetPrepuller makes sure the control plane images are availble on all masters
|
// DaemonSetPrepuller makes sure the control plane images are available on all masters
|
||||||
type DaemonSetPrepuller struct {
|
type DaemonSetPrepuller struct {
|
||||||
client clientset.Interface
|
client clientset.Interface
|
||||||
cfg *kubeadmapi.MasterConfiguration
|
cfg *kubeadmapi.MasterConfiguration
|
||||||
@ -99,11 +99,11 @@ func PrepullImagesInParallel(kubePrepuller Prepuller, timeout time.Duration) err
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a channel for streaming data from goroutines that run in parallell to a blocking for loop that cleans up
|
// Create a channel for streaming data from goroutines that run in parallel to a blocking for loop that cleans up
|
||||||
prePulledChan := make(chan string, len(componentsToPrepull))
|
prePulledChan := make(chan string, len(componentsToPrepull))
|
||||||
for _, component := range componentsToPrepull {
|
for _, component := range componentsToPrepull {
|
||||||
go func(c string) {
|
go func(c string) {
|
||||||
// Wait as long as needed. This WaitFunc call should be blocking until completetion
|
// Wait as long as needed. This WaitFunc call should be blocking until completion
|
||||||
kubePrepuller.WaitFunc(c)
|
kubePrepuller.WaitFunc(c)
|
||||||
// When the task is done, go ahead and cleanup by sending the name to the channel
|
// When the task is done, go ahead and cleanup by sending the name to the channel
|
||||||
prePulledChan <- c
|
prePulledChan <- c
|
||||||
|
@ -337,7 +337,7 @@ func rollbackOldManifests(oldManifests map[string]string, origErr error, pathMgr
|
|||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Let the user know there we're problems, but we tried to reçover
|
// Let the user know there were problems, but we tried to recover
|
||||||
return fmt.Errorf("couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: %v", errs)
|
return fmt.Errorf("couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: %v", errs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,10 +85,10 @@ func NewDryRunClient(drg DryRunGetter, w io.Writer) clientset.Interface {
|
|||||||
// This client doesn't apply changes to the backend. The client gets GET/LIST values from the DryRunGetter implementation.
|
// This client doesn't apply changes to the backend. The client gets GET/LIST values from the DryRunGetter implementation.
|
||||||
// This client logs all I/O to the writer w in YAML format
|
// This client logs all I/O to the writer w in YAML format
|
||||||
func NewDryRunClientWithOpts(opts DryRunClientOptions) clientset.Interface {
|
func NewDryRunClientWithOpts(opts DryRunClientOptions) clientset.Interface {
|
||||||
// Build a chain of reactors to act like a normal clientset; but log everything's that happening and don't change any state
|
// Build a chain of reactors to act like a normal clientset; but log everything that is happening and don't change any state
|
||||||
client := fakeclientset.NewSimpleClientset()
|
client := fakeclientset.NewSimpleClientset()
|
||||||
|
|
||||||
// Build the chain of reactors. Order matters; first item here will be invoked first on match, then the second one will be evaluted, etc.
|
// Build the chain of reactors. Order matters; first item here will be invoked first on match, then the second one will be evaluated, etc.
|
||||||
defaultReactorChain := []core.Reactor{
|
defaultReactorChain := []core.Reactor{
|
||||||
// Log everything that happens. Default the object if it's about to be created/updated so that the logged object is representative.
|
// Log everything that happens. Default the object if it's about to be created/updated so that the logged object is representative.
|
||||||
&core.SimpleReactor{
|
&core.SimpleReactor{
|
||||||
@ -223,7 +223,7 @@ func logDryRunAction(action core.Action, w io.Writer, marshalFunc MarshalFunc) {
|
|||||||
|
|
||||||
patchAction, ok := action.(core.PatchAction)
|
patchAction, ok := action.(core.PatchAction)
|
||||||
if ok {
|
if ok {
|
||||||
// Replace all occurences of \" with a simple " when printing
|
// Replace all occurrences of \" with a simple " when printing
|
||||||
fmt.Fprintf(w, "[dryrun] Attached patch:\n\t%s\n", strings.Replace(string(patchAction.GetPatch()), `\"`, `"`, -1))
|
fmt.Fprintf(w, "[dryrun] Attached patch:\n\t%s\n", strings.Replace(string(patchAction.GetPatch()), `\"`, `"`, -1))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user