From 75b60886e6f698845db93e1cd9db89e0ebcb4398 Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:16:17 +0100 Subject: [PATCH 01/14] fleetctl: add tryWaitForUnitStates() and getBlockAttempts() * tryWaitForUnitStates() tries to wait for units to reach the desired state. * getBlockAttempts() gets the correct value of how many attempts to try before giving up on an operation. These helpers will be used to make the code more consistent and clean. We do not intended to change any behaviour here. --- --- fleetctl/fleetctl.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index 951536f20..caae29c71 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -745,6 +745,56 @@ func setTargetStateOfUnits(units []string, state job.JobState) ([]*schema.Unit, return triggered, nil } +// getBlockAttempts gets the correct value of how many attempts to try +// before giving up on an operation. +// It returns a negative value which means try forever, if zero is +// returned then do not make any attempt, and if a positive value is +// returned then try up to that value +func getBlockAttempts() int { + // By default we wait forever + var attempts int = -1 + + // Up to BlockAttempts + if sharedFlags.BlockAttempts > 0 { + attempts = sharedFlags.BlockAttempts + } + + // NoBlock we do not wait + if sharedFlags.NoBlock { + attempts = 0 + } + + return attempts +} + +// tryWaitForUnitStates tries to wait for units to reach the desired state. +// It takes 5 arguments, the units to wait for, the desired state, the +// desired JobState, how many attempts before timing out and a writer +// interface. +// tryWaitForUnitStates polls each of the indicated units until they +// reach the desired state. If maxAttempts is zero, then it will not +// wait, it will assume that all units reached their desired state. +// If maxAttempts is negative tryWaitForUnitStates will retry forever, and +// if it is greater than zero, it will retry up to the indicated value. +// It returns 0 on success or 1 on errors. +func tryWaitForUnitStates(units []string, state string, js job.JobState, maxAttempts int, out io.Writer) (ret int) { + // We do not wait just assume we reached the desired state + if maxAttempts == 0 { + for _, name := range units { + stdout("Triggered unit %s %s", name, state) + } + return + } + + errchan := waitForUnitStates(units, js, maxAttempts, out) + for err := range errchan { + stderr("Error waiting for units: %v", err) + ret = 1 + } + + return +} + // waitForUnitStates polls each of the indicated units until each of their // states is equal to that which the caller indicates, or until the // polling operation times out. waitForUnitStates will retry forever, or From ea24c8c4deb387d8e3247fb22ee14384792cf9ad Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:17:47 +0100 Subject: [PATCH 02/14] load: Use the new tryWaitForUnitStates() and getBlockAttempts() --- fleetctl/load.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/fleetctl/load.go b/fleetctl/load.go index 497f86058..8659a1498 100644 --- a/fleetctl/load.go +++ b/fleetctl/load.go @@ -46,6 +46,8 @@ func init() { } func runLoadUnits(args []string) (exit int) { + attempts := getBlockAttempts() + if err := lazyCreateUnits(args); err != nil { stderr("Error creating units: %v", err) return 1 @@ -66,17 +68,7 @@ func runLoadUnits(args []string) (exit int) { } } - if !sharedFlags.NoBlock { - errchan := waitForUnitStates(loading, job.JobStateLoaded, sharedFlags.BlockAttempts, os.Stdout) - for err := range errchan { - stderr("Error waiting for units: %v", err) - exit = 1 - } - } else { - for _, name := range loading { - stdout("Triggered unit %s load", name) - } - } + exit = tryWaitForUnitStates(loading, "load", job.JobStateLoaded, attempts, os.Stdout) return } From 62d5b6a23988b48d1ad96c9b83d138644eaec2de Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:28:14 +0100 Subject: [PATCH 03/14] start: Use the new tryWaitForUnitStates() and getBlockAttempts() --- fleetctl/start.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/fleetctl/start.go b/fleetctl/start.go index 77ea0d343..17c8a53da 100644 --- a/fleetctl/start.go +++ b/fleetctl/start.go @@ -54,6 +54,8 @@ func init() { } func runStartUnit(args []string) (exit int) { + attempts := getBlockAttempts() + if err := lazyCreateUnits(args); err != nil { stderr("Error creating units: %v", err) return 1 @@ -74,17 +76,7 @@ func runStartUnit(args []string) (exit int) { } } - if !sharedFlags.NoBlock { - errchan := waitForUnitStates(starting, job.JobStateLaunched, sharedFlags.BlockAttempts, os.Stdout) - for err := range errchan { - stderr("Error waiting for units: %v", err) - exit = 1 - } - } else { - for _, name := range starting { - stdout("Triggered unit %s start", name) - } - } + exit = tryWaitForUnitStates(starting, "start", job.JobStateLaunched, attempts, os.Stdout) return } From 2e90705f0c5bd08ca4b84c8e7e47430a468c671a Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:28:29 +0100 Subject: [PATCH 04/14] stop: Use the new tryWaitForUnitStates() and getBlockAttempts() --- fleetctl/stop.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/fleetctl/stop.go b/fleetctl/stop.go index 262946bfb..c63904107 100644 --- a/fleetctl/stop.go +++ b/fleetctl/stop.go @@ -52,6 +52,8 @@ func init() { } func runStopUnit(args []string) (exit int) { + attempts := getBlockAttempts() + units, err := findUnits(args) if err != nil { stderr("%v", err) @@ -79,17 +81,7 @@ func runStopUnit(args []string) (exit int) { } } - if !sharedFlags.NoBlock { - errchan := waitForUnitStates(stopping, job.JobStateLoaded, sharedFlags.BlockAttempts, os.Stdout) - for err := range errchan { - stderr("Error waiting for units: %v", err) - exit = 1 - } - } else { - for _, name := range stopping { - stdout("Triggered unit %s stop", name) - } - } + exit = tryWaitForUnitStates(stopping, "stop", job.JobStateLoaded, attempts, os.Stdout) return } From 411940eb5e66c3600a35cf745b60a4d24c263752 Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:28:40 +0100 Subject: [PATCH 05/14] unload: Use the new tryWaitForUnitStates() and getBlockAttempts() --- fleetctl/unload.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/fleetctl/unload.go b/fleetctl/unload.go index 6758f2825..c9700496a 100644 --- a/fleetctl/unload.go +++ b/fleetctl/unload.go @@ -36,6 +36,8 @@ func init() { } func runUnloadUnit(args []string) (exit int) { + attempts := getBlockAttempts() + units, err := findUnits(args) if err != nil { stderr("%v", err) @@ -60,17 +62,7 @@ func runUnloadUnit(args []string) (exit int) { } } - if !sharedFlags.NoBlock { - errchan := waitForUnitStates(wait, job.JobStateInactive, sharedFlags.BlockAttempts, os.Stdout) - for err := range errchan { - stderr("Error waiting for units: %v", err) - exit = 1 - } - } else { - for _, name := range wait { - stdout("Triggered unit %s unload", name) - } - } + exit = tryWaitForUnitStates(wait, "unload", job.JobStateInactive, attempts, os.Stdout) return } From d7787d02415d2603f6d5cc7363f979dfb0f1e584 Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:44:00 +0100 Subject: [PATCH 06/14] fleetctl: move logic that lookus up a unit from a template into its own function --- fleetctl/fleetctl.go | 66 +++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index caae29c71..30098b49e 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -496,6 +496,47 @@ func getUnitFromFile(file string) (*unit.UnitFile, error) { return unit.NewUnitFile(string(out)) } +// getUnitFileFromTemplate checks if the name appears to be an instance unit +// and gets its corresponding template unit from the registry or local disk +// It returns the Unit or nil; and any error encountered +func getUnitFileFromTemplate(arg string) (*unit.UnitFile, error) { + var uf *unit.UnitFile + name := unitNameMangle(arg) + + // Check if the name appears to be an instance unit, and if so, + // check for a corresponding template unit in the Registry + uni := unit.NewUnitNameInfo(name) + if uni == nil { + return nil, fmt.Errorf("error extracting information from unit name %s", name) + } else if !uni.IsInstance() { + return nil, fmt.Errorf("unable to find Unit(%s) in Registry or on filesystem", name) + } + + tmpl, err := cAPI.Unit(uni.Template) + if err != nil { + return nil, fmt.Errorf("error retrieving template Unit(%s) from Registry: %v", uni.Template, err) + } + + // Finally, if we could not find a template unit in the Registry, + // check the local disk for one instead + if tmpl == nil { + file := path.Join(path.Dir(arg), uni.Template) + if _, err := os.Stat(file); os.IsNotExist(err) { + return nil, fmt.Errorf("unable to find Unit(%s) or template Unit(%s) in Registry or on filesystem", name, uni.Template) + } + + uf, err = getUnitFromFile(file) + if err != nil { + return nil, fmt.Errorf("failed getting template Unit(%s) from file: %v", uni.Template, err) + } + } else { + warnOnDifferentLocalUnit(arg, tmpl) + uf = schema.MapSchemaUnitOptionsToUnitFile(tmpl.Options) + } + + return uf, nil +} + func getTunnelFlag() string { tun := globalFlags.Tunnel if tun != "" && !strings.Contains(tun, ":") { @@ -625,30 +666,9 @@ func lazyCreateUnits(args []string) error { } else { // Otherwise (if the unit file does not exist), check if the name appears to be an instance unit, // and if so, check for a corresponding template unit in the Registry - uni := unit.NewUnitNameInfo(name) - if uni == nil { - return fmt.Errorf("error extracting information from unit name %s", name) - } else if !uni.IsInstance() { - return fmt.Errorf("unable to find Unit(%s) in Registry or on filesystem", name) - } - tmpl, err := cAPI.Unit(uni.Template) + uf, err = getUnitFileFromTemplate(arg) if err != nil { - return fmt.Errorf("error retrieving template Unit(%s) from Registry: %v", uni.Template, err) - } - - // Finally, if we could not find a template unit in the Registry, check the local disk for one instead - if tmpl == nil { - file := path.Join(path.Dir(arg), uni.Template) - if _, err := os.Stat(file); os.IsNotExist(err) { - return fmt.Errorf("unable to find Unit(%s) or template Unit(%s) in Registry or on filesystem", name, uni.Template) - } - uf, err = getUnitFromFile(file) - if err != nil { - return fmt.Errorf("failed getting template Unit(%s) from file: %v", uni.Template, err) - } - } else { - warnOnDifferentLocalUnit(arg, tmpl) - uf = schema.MapSchemaUnitOptionsToUnitFile(tmpl.Options) + return err } // If we found a template unit, create a near-identical instance unit in From 49344ff6454da25fc736e8998e84e04f40fe8091 Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:51:07 +0100 Subject: [PATCH 07/14] fleetctl: more cleaning and consolidate the logic to get a Unit from disk or the Registry --- fleetctl/fleetctl.go | 46 +++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index 30098b49e..df90ed5b1 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -482,6 +482,31 @@ func getChecker() *ssh.HostKeyChecker { return ssh.NewHostKeyChecker(keyFile) } +func getUnitFile(file string) (*unit.UnitFile, error) { + var uf *unit.UnitFile + + // Failing that, assume the name references a local unit file on disk, + // and attempt to load that, if it exists + if _, err := os.Stat(file); !os.IsNotExist(err) { + uf, err = getUnitFromFile(file) + if err != nil { + return nil, fmt.Errorf("failed getting Unit(%s) from file: %v", file, err) + } + } else { + // Otherwise (if the unit file does not exist), check if the name appears to be an instance unit, + // and if so, check for a corresponding template unit in the Registry + uf, err = getUnitFileFromTemplate(file) + if err != nil { + return nil, err + } + + // If we found a template unit, create a near-identical instance unit in + // the Registry - same unit file as the template, but different name + } + + return uf, nil +} + // getUnitFromFile attempts to load a Unit from a given filename // It returns the Unit or nil, and any error encountered func getUnitFromFile(file string) (*unit.UnitFile, error) { @@ -655,24 +680,9 @@ func lazyCreateUnits(args []string) error { continue } - var uf *unit.UnitFile - // Failing that, assume the name references a local unit file on disk, and attempt to load that, if it exists - // TODO(mischief): consolidate these two near-identical codepaths - if _, err := os.Stat(arg); !os.IsNotExist(err) { - uf, err = getUnitFromFile(arg) - if err != nil { - return fmt.Errorf("failed getting Unit(%s) from file: %v", arg, err) - } - } else { - // Otherwise (if the unit file does not exist), check if the name appears to be an instance unit, - // and if so, check for a corresponding template unit in the Registry - uf, err = getUnitFileFromTemplate(arg) - if err != nil { - return err - } - - // If we found a template unit, create a near-identical instance unit in - // the Registry - same unit file as the template, but different name + uf, err := getUnitFile(arg) + if err != nil { + return err } _, err = createUnit(name, uf) From 4f7fca8fad6bd34532dfccceeae702b8947170be Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 12:56:39 +0100 Subject: [PATCH 08/14] fleetctl: add debug messages arround getUnit*() functions * Cover code path of getUnit*() functions with debug messages * Improve code comments --- fleetctl/fleetctl.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index df90ed5b1..2ecd0818c 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -484,17 +484,21 @@ func getChecker() *ssh.HostKeyChecker { func getUnitFile(file string) (*unit.UnitFile, error) { var uf *unit.UnitFile + name := unitNameMangle(file) - // Failing that, assume the name references a local unit file on disk, - // and attempt to load that, if it exists + log.Debugf("Looking up for Unit(%s) or its corresponding template", name) + + // Assume that the file references a local unit file on disk and + // attempt to load it, if it exists if _, err := os.Stat(file); !os.IsNotExist(err) { uf, err = getUnitFromFile(file) if err != nil { return nil, fmt.Errorf("failed getting Unit(%s) from file: %v", file, err) } } else { - // Otherwise (if the unit file does not exist), check if the name appears to be an instance unit, - // and if so, check for a corresponding template unit in the Registry + // Otherwise (if the unit file does not exist), check if the + // name appears to be an instance unit, and if so, check for + // a corresponding template unit in the Registry or disk uf, err = getUnitFileFromTemplate(file) if err != nil { return nil, err @@ -504,6 +508,7 @@ func getUnitFile(file string) (*unit.UnitFile, error) { // the Registry - same unit file as the template, but different name } + log.Debugf("Found Unit(%s)", name) return uf, nil } @@ -542,9 +547,13 @@ func getUnitFileFromTemplate(arg string) (*unit.UnitFile, error) { return nil, fmt.Errorf("error retrieving template Unit(%s) from Registry: %v", uni.Template, err) } - // Finally, if we could not find a template unit in the Registry, - // check the local disk for one instead - if tmpl == nil { + if tmpl != nil { + warnOnDifferentLocalUnit(arg, tmpl) + uf = schema.MapSchemaUnitOptionsToUnitFile(tmpl.Options) + log.Debugf("Template Unit(%s) found in registry", uni.Template) + } else { + // Finally, if we could not find a template unit in the Registry, + // check the local disk for one instead file := path.Join(path.Dir(arg), uni.Template) if _, err := os.Stat(file); os.IsNotExist(err) { return nil, fmt.Errorf("unable to find Unit(%s) or template Unit(%s) in Registry or on filesystem", name, uni.Template) @@ -554,9 +563,6 @@ func getUnitFileFromTemplate(arg string) (*unit.UnitFile, error) { if err != nil { return nil, fmt.Errorf("failed getting template Unit(%s) from file: %v", uni.Template, err) } - } else { - warnOnDifferentLocalUnit(arg, tmpl) - uf = schema.MapSchemaUnitOptionsToUnitFile(tmpl.Options) } return uf, nil @@ -680,6 +686,9 @@ func lazyCreateUnits(args []string) error { continue } + // Assume that the name references a local unit file on + // disk or if it is an instance unit and if so get its + // corresponding unit uf, err := getUnitFile(arg) if err != nil { return err From de05a8d7ad25995bb6fef39c3959dd98c3f65595 Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Tue, 16 Feb 2016 15:37:33 +0100 Subject: [PATCH 09/14] fleetctl: remove dead code comment --- fleetctl/fleetctl.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index 2ecd0818c..923e4470d 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -670,8 +670,6 @@ func lazyCreateUnits(args []string) error { errchan := make(chan error) var wg sync.WaitGroup for _, arg := range args { - // TODO(jonboulle): this loop is getting too unwieldy; factor it out - arg = maybeAppendDefaultUnitType(arg) name := unitNameMangle(arg) From 58369b6bc41b9890695512cdae4145dcee0fa6f7 Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 16:15:10 +0100 Subject: [PATCH 10/14] fleetctl: inline getBlockAttempts() in tryWaitForUnitStates() calls --- fleetctl/load.go | 4 +--- fleetctl/start.go | 4 +--- fleetctl/stop.go | 4 +--- fleetctl/unload.go | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/fleetctl/load.go b/fleetctl/load.go index 8659a1498..0f7b0923c 100644 --- a/fleetctl/load.go +++ b/fleetctl/load.go @@ -46,8 +46,6 @@ func init() { } func runLoadUnits(args []string) (exit int) { - attempts := getBlockAttempts() - if err := lazyCreateUnits(args); err != nil { stderr("Error creating units: %v", err) return 1 @@ -68,7 +66,7 @@ func runLoadUnits(args []string) (exit int) { } } - exit = tryWaitForUnitStates(loading, "load", job.JobStateLoaded, attempts, os.Stdout) + exit = tryWaitForUnitStates(loading, "load", job.JobStateLoaded, getBlockAttempts(), os.Stdout) return } diff --git a/fleetctl/start.go b/fleetctl/start.go index 17c8a53da..2ded29539 100644 --- a/fleetctl/start.go +++ b/fleetctl/start.go @@ -54,8 +54,6 @@ func init() { } func runStartUnit(args []string) (exit int) { - attempts := getBlockAttempts() - if err := lazyCreateUnits(args); err != nil { stderr("Error creating units: %v", err) return 1 @@ -76,7 +74,7 @@ func runStartUnit(args []string) (exit int) { } } - exit = tryWaitForUnitStates(starting, "start", job.JobStateLaunched, attempts, os.Stdout) + exit = tryWaitForUnitStates(starting, "start", job.JobStateLaunched, getBlockAttempts(), os.Stdout) return } diff --git a/fleetctl/stop.go b/fleetctl/stop.go index c63904107..941b33d7b 100644 --- a/fleetctl/stop.go +++ b/fleetctl/stop.go @@ -52,8 +52,6 @@ func init() { } func runStopUnit(args []string) (exit int) { - attempts := getBlockAttempts() - units, err := findUnits(args) if err != nil { stderr("%v", err) @@ -81,7 +79,7 @@ func runStopUnit(args []string) (exit int) { } } - exit = tryWaitForUnitStates(stopping, "stop", job.JobStateLoaded, attempts, os.Stdout) + exit = tryWaitForUnitStates(stopping, "stop", job.JobStateLoaded, getBlockAttempts(), os.Stdout) return } diff --git a/fleetctl/unload.go b/fleetctl/unload.go index c9700496a..48eb833fc 100644 --- a/fleetctl/unload.go +++ b/fleetctl/unload.go @@ -36,8 +36,6 @@ func init() { } func runUnloadUnit(args []string) (exit int) { - attempts := getBlockAttempts() - units, err := findUnits(args) if err != nil { stderr("%v", err) @@ -62,7 +60,7 @@ func runUnloadUnit(args []string) (exit int) { } } - exit = tryWaitForUnitStates(wait, "unload", job.JobStateInactive, attempts, os.Stdout) + exit = tryWaitForUnitStates(wait, "unload", job.JobStateInactive, getBlockAttempts(), os.Stdout) return } From bc091fdf6c7da5be231a20b46db967cef2dc131d Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Wed, 17 Feb 2016 16:16:39 +0100 Subject: [PATCH 11/14] fleetctl: improve code comment about getUnitFileFromTemplate() Improve code comments about getUnitFileFromTemplate() and kill some other useless code comments. --- fleetctl/fleetctl.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index 923e4470d..42709b6ee 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -498,14 +498,14 @@ func getUnitFile(file string) (*unit.UnitFile, error) { } else { // Otherwise (if the unit file does not exist), check if the // name appears to be an instance unit, and if so, check for - // a corresponding template unit in the Registry or disk + // a corresponding template unit in the Registry or disk. + // If we found a template unit, later we create a + // near-identical instance unit in the Registry - same + // unit file as the template, but different name uf, err = getUnitFileFromTemplate(file) if err != nil { return nil, err } - - // If we found a template unit, create a near-identical instance unit in - // the Registry - same unit file as the template, but different name } log.Debugf("Found Unit(%s)", name) @@ -791,12 +791,10 @@ func getBlockAttempts() int { // By default we wait forever var attempts int = -1 - // Up to BlockAttempts if sharedFlags.BlockAttempts > 0 { attempts = sharedFlags.BlockAttempts } - // NoBlock we do not wait if sharedFlags.NoBlock { attempts = 0 } From 8cfb73bf224c53f5571735214a0b8170ac59f11b Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Sat, 20 Feb 2016 09:50:33 +0100 Subject: [PATCH 12/14] fleetctl: fix debug message in getUnitFile() --- fleetctl/fleetctl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index 42709b6ee..0579f90d4 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -486,7 +486,7 @@ func getUnitFile(file string) (*unit.UnitFile, error) { var uf *unit.UnitFile name := unitNameMangle(file) - log.Debugf("Looking up for Unit(%s) or its corresponding template", name) + log.Debugf("Looking for Unit(%s) or its corresponding template", name) // Assume that the file references a local unit file on disk and // attempt to load it, if it exists From 9ba11af06c6cd51c5501ea084e72ed57e15f33af Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Sat, 20 Feb 2016 10:22:40 +0100 Subject: [PATCH 13/14] fleetctl: getBlockAttempts() standarise on negative meaning do not block --- fleetctl/fleetctl.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fleetctl/fleetctl.go b/fleetctl/fleetctl.go index 0579f90d4..053e74f99 100644 --- a/fleetctl/fleetctl.go +++ b/fleetctl/fleetctl.go @@ -784,19 +784,19 @@ func setTargetStateOfUnits(units []string, state job.JobState) ([]*schema.Unit, // getBlockAttempts gets the correct value of how many attempts to try // before giving up on an operation. -// It returns a negative value which means try forever, if zero is -// returned then do not make any attempt, and if a positive value is +// It returns a negative value which means do not block, if zero is +// returned then it means try forever, and if a positive value is // returned then try up to that value func getBlockAttempts() int { // By default we wait forever - var attempts int = -1 + var attempts int = 0 if sharedFlags.BlockAttempts > 0 { attempts = sharedFlags.BlockAttempts } if sharedFlags.NoBlock { - attempts = 0 + attempts = -1 } return attempts @@ -807,14 +807,14 @@ func getBlockAttempts() int { // desired JobState, how many attempts before timing out and a writer // interface. // tryWaitForUnitStates polls each of the indicated units until they -// reach the desired state. If maxAttempts is zero, then it will not +// reach the desired state. If maxAttempts is negative, then it will not // wait, it will assume that all units reached their desired state. -// If maxAttempts is negative tryWaitForUnitStates will retry forever, and +// If maxAttempts is zero tryWaitForUnitStates will retry forever, and // if it is greater than zero, it will retry up to the indicated value. // It returns 0 on success or 1 on errors. func tryWaitForUnitStates(units []string, state string, js job.JobState, maxAttempts int, out io.Writer) (ret int) { // We do not wait just assume we reached the desired state - if maxAttempts == 0 { + if maxAttempts <= -1 { for _, name := range units { stdout("Triggered unit %s %s", name, state) } From 75dcaa0e13b412bb050872a0535ee03a62987987 Mon Sep 17 00:00:00 2001 From: Djalal Harouni Date: Sat, 20 Feb 2016 10:24:44 +0100 Subject: [PATCH 14/14] fleetctl:test: push tests for getBlockAttempts() --- fleetctl/fleetctl_test.go | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/fleetctl/fleetctl_test.go b/fleetctl/fleetctl_test.go index ca635dab6..e7b886f8a 100644 --- a/fleetctl/fleetctl_test.go +++ b/fleetctl/fleetctl_test.go @@ -117,6 +117,51 @@ func TestUnitNameMangle(t *testing.T) { } } +func TestGetBlockAttempts(t *testing.T) { + oldNoBlock := sharedFlags.NoBlock + oldBlockAttempts := sharedFlags.BlockAttempts + sharedFlags.NoBlock = true + sharedFlags.BlockAttempts = 0 + + if n := getBlockAttempts(); n != -1 { + t.Errorf("got %d, want -1", n) + } + + sharedFlags.BlockAttempts = -1 + if n := getBlockAttempts(); n != -1 { + t.Errorf("got %d, want -1", n) + } + + sharedFlags.BlockAttempts = 9999 + if n := getBlockAttempts(); n != -1 { + t.Errorf("got %d, want -1", n) + } + + sharedFlags.NoBlock = false + sharedFlags.BlockAttempts = 0 + if n := getBlockAttempts(); n != 0 { + t.Errorf("got %d, want 0", n) + } + + sharedFlags.BlockAttempts = -1 + if n := getBlockAttempts(); n != 0 { + t.Errorf("got %d, want 0", n) + } + + sharedFlags.BlockAttempts = 0 + if n := getBlockAttempts(); n != 0 { + t.Errorf("got %d, want 0", n) + } + + sharedFlags.BlockAttempts = 9999 + if n := getBlockAttempts(); n != 9999 { + t.Errorf("got %d, want 9999", n) + } + + sharedFlags.NoBlock = oldNoBlock + sharedFlags.BlockAttempts = oldBlockAttempts +} + func newUnitFile(t *testing.T, contents string) *unit.UnitFile { uf, err := unit.NewUnitFile(contents) if err != nil {