From 864eb02f9d25f47ebdceb578609805b16fda6650 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sun, 27 Aug 2023 15:22:34 +0000 Subject: [PATCH 1/2] zones: turn Zones.WriteEnv() into Zones.Env().WriteTo() Signed-off-by: Alejandro Mery --- cmd/jpictl/env.go | 3 ++- pkg/zones/env.go | 35 ++++++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/cmd/jpictl/env.go b/cmd/jpictl/env.go index 37248da..b71e3c8 100644 --- a/cmd/jpictl/env.go +++ b/cmd/jpictl/env.go @@ -16,7 +16,8 @@ var envCmd = &cobra.Command{ return err } - return m.WriteEnv(os.Stdout) + _, err = m.Env().WriteTo(os.Stdout) + return err }, } diff --git a/pkg/zones/env.go b/pkg/zones/env.go index 33d65cb..577ebc9 100644 --- a/pkg/zones/env.go +++ b/pkg/zones/env.go @@ -7,8 +7,20 @@ import ( "strings" ) -// WriteEnv generates environment variables for shell scripts -func (m *Zones) WriteEnv(w io.Writer) error { +// Env is a shell environment factory for this cluster +type Env struct { + ZoneIterator +} + +// Env returns a shell environment factory +func (m *Zones) Env() *Env { + return &Env{ + ZoneIterator: m, + } +} + +// WriteTo generates environment variables for shell scripts +func (m *Env) WriteTo(w io.Writer) (int64, error) { var buf bytes.Buffer m.writeEnvVarFn(&buf, genEnvZones, "ZONES") @@ -17,11 +29,10 @@ func (m *Zones) WriteEnv(w io.Writer) error { return false }) - _, err := buf.WriteTo(w) - return err + return buf.WriteTo(w) } -func (m *Zones) writeEnvZone(w io.Writer, z *Zone) { +func (m *Env) writeEnvZone(w io.Writer, z *Zone) { zoneID := z.ID // ZONE{zoneID} @@ -42,7 +53,7 @@ func (m *Zones) writeEnvZone(w io.Writer, z *Zone) { } } -func (m *Zones) writeEnvVarFn(w io.Writer, fn func(*Zones) string, name string, args ...any) { +func (m *Env) writeEnvVarFn(w io.Writer, fn func(*Env) string, name string, args ...any) { var value string if fn != nil { @@ -52,7 +63,7 @@ func (m *Zones) writeEnvVarFn(w io.Writer, fn func(*Zones) string, name string, m.writeEnvVar(w, value, name, args...) } -func (*Zones) writeEnvVar(w io.Writer, value string, name string, args ...any) { +func (*Env) writeEnvVar(w io.Writer, value string, name string, args ...any) { if len(args) > 0 { name = fmt.Sprintf(name, args...) } @@ -64,11 +75,13 @@ func (*Zones) writeEnvVar(w io.Writer, value string, name string, args ...any) { } } -func genEnvZones(m *Zones) string { - s := make([]string, 0, len(m.Zones)) - for _, z := range m.Zones { +func genEnvZones(m *Env) string { + var s []string + + m.ForEachZone(func(z *Zone) bool { s = append(s, fmt.Sprintf("%v", z.ID)) - } + return false + }) return strings.Join(s, " ") } From 6ee848e6ca8335a2ac4ab9b2b361c11baf7da12e Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sun, 27 Aug 2023 15:26:35 +0000 Subject: [PATCH 2/2] jpictl: introduce `-e` for `jpictl env` to export variables Signed-off-by: Alejandro Mery --- cmd/jpictl/env.go | 10 +++++++++- pkg/zones/env.go | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/cmd/jpictl/env.go b/cmd/jpictl/env.go index b71e3c8..659862a 100644 --- a/cmd/jpictl/env.go +++ b/cmd/jpictl/env.go @@ -16,11 +16,19 @@ var envCmd = &cobra.Command{ return err } - _, err = m.Env().WriteTo(os.Stdout) + _, err = m.Env(*envExport).WriteTo(os.Stdout) return err }, } +// Command Flags +var ( + envExport *bool +) + func init() { rootCmd.AddCommand(envCmd) + + envExport = envCmd.PersistentFlags().BoolP("export", "e", false, + "export generated variables") } diff --git a/pkg/zones/env.go b/pkg/zones/env.go index 577ebc9..d362278 100644 --- a/pkg/zones/env.go +++ b/pkg/zones/env.go @@ -10,12 +10,15 @@ import ( // Env is a shell environment factory for this cluster type Env struct { ZoneIterator + + export bool } // Env returns a shell environment factory -func (m *Zones) Env() *Env { +func (m *Zones) Env(export bool) *Env { return &Env{ ZoneIterator: m, + export: export, } } @@ -63,7 +66,13 @@ func (m *Env) writeEnvVarFn(w io.Writer, fn func(*Env) string, name string, args m.writeEnvVar(w, value, name, args...) } -func (*Env) writeEnvVar(w io.Writer, value string, name string, args ...any) { +func (m *Env) writeEnvVar(w io.Writer, value string, name string, args ...any) { + var prefix string + + if m.export { + prefix = "export " + } + if len(args) > 0 { name = fmt.Sprintf(name, args...) } @@ -71,7 +80,7 @@ func (*Env) writeEnvVar(w io.Writer, value string, name string, args ...any) { if name != "" { value = strings.TrimSpace(value) - _, _ = fmt.Fprintf(w, "%s=%q\n", name, value) + _, _ = fmt.Fprintf(w, "%s%s=%q\n", prefix, name, value) } }