[lxc-devel] [lxd/master] lxc: Add support for quiet mode
stgraber on Github
lxc-bot at linuxcontainers.org
Thu Aug 23 19:06:27 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180823/587f1f76/attachment.bin>
-------------- next part --------------
From 1416bcbad3101eb48577f3ed9ece6c9b7d4e3537 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 23 Aug 2018 15:05:41 -0400
Subject: [PATCH] lxc: Add support for quiet mode
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes #4945
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/action.go | 4 +++-
lxc/cluster.go | 10 ++++++++--
lxc/config_device.go | 13 ++++++++++---
lxc/copy.go | 6 +++++-
lxc/export.go | 5 ++++-
lxc/file.go | 4 ++++
lxc/image.go | 24 ++++++++++++++++++++----
lxc/import.go | 1 +
lxc/init.go | 16 +++++++++++-----
lxc/launch.go | 5 ++++-
lxc/main.go | 2 ++
lxc/network.go | 20 ++++++++++++++------
lxc/operation.go | 5 ++++-
lxc/profile.go | 26 ++++++++++++++++++++------
lxc/storage.go | 15 ++++++++++-----
lxc/storage_volume.go | 18 ++++++++++++++----
lxc/utils/progress.go | 11 +++++++++++
17 files changed, 145 insertions(+), 40 deletions(-)
diff --git a/lxc/action.go b/lxc/action.go
index fd16c82d23..9c74fe668e 100644
--- a/lxc/action.go
+++ b/lxc/action.go
@@ -180,7 +180,9 @@ func (c *cmdAction) doAction(action string, conf *config.Config, nameArg string)
return err
}
- progress := utils.ProgressRenderer{}
+ progress := utils.ProgressRenderer{
+ Quiet: c.global.flagQuiet,
+ }
_, err = op.AddHandler(progress.UpdateOp)
if err != nil {
progress.Done("")
diff --git a/lxc/cluster.go b/lxc/cluster.go
index ec20cfe6b8..afc13e6274 100644
--- a/lxc/cluster.go
+++ b/lxc/cluster.go
@@ -223,7 +223,10 @@ func (c *cmdClusterRename) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Member %s renamed to %s")+"\n", resource.name, args[1])
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Member %s renamed to %s")+"\n", resource.name, args[1])
+ }
+
return nil
}
@@ -270,7 +273,10 @@ func (c *cmdClusterRemove) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Member %s removed")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Member %s removed")+"\n", resource.name)
+ }
+
return nil
}
diff --git a/lxc/config_device.go b/lxc/config_device.go
index f0f42e1454..0cb5b0e5b4 100644
--- a/lxc/config_device.go
+++ b/lxc/config_device.go
@@ -160,7 +160,10 @@ func (c *cmdConfigDeviceAdd) Run(cmd *cobra.Command, args []string) error {
}
}
- fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, resource.name)
+ }
+
return nil
}
@@ -384,7 +387,9 @@ func (c *cmdConfigDeviceOverride) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Device %s overridden for %s")+"\n", devname, resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Device %s overridden for %s")+"\n", devname, resource.name)
+ }
return nil
}
@@ -473,7 +478,9 @@ func (c *cmdConfigDeviceRemove) Run(cmd *cobra.Command, args []string) error {
}
}
- fmt.Printf(i18n.G("Device %s removed from %s")+"\n", strings.Join(args[1:], ", "), resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Device %s removed from %s")+"\n", strings.Join(args[1:], ", "), resource.name)
+ }
return nil
}
diff --git a/lxc/copy.go b/lxc/copy.go
index fff2d7040c..eef1b28be6 100644
--- a/lxc/copy.go
+++ b/lxc/copy.go
@@ -311,7 +311,11 @@ func (c *cmdCopy) copyContainer(conf *config.Config, sourceResource string,
}
// Watch the background operation
- progress := utils.ProgressRenderer{Format: i18n.G("Transferring container: %s")}
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Transferring container: %s"),
+ Quiet: c.global.flagQuiet,
+ }
+
_, err = op.AddHandler(progress.UpdateOp)
if err != nil {
progress.Done("")
diff --git a/lxc/export.go b/lxc/export.go
index 6afc32c186..90fc968e29 100644
--- a/lxc/export.go
+++ b/lxc/export.go
@@ -106,7 +106,10 @@ func (c *cmdExport) Run(cmd *cobra.Command, args []string) error {
defer target.Close()
// Prepare the download request
- progress := utils.ProgressRenderer{Format: i18n.G("Exporting the backup: %s")}
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Exporting the backup: %s"),
+ Quiet: c.global.flagQuiet,
+ }
backupFileRequest := lxd.BackupFileRequest{
BackupFile: io.WriteSeeker(target),
ProgressHandler: progress.UpdateProgress,
diff --git a/lxc/file.go b/lxc/file.go
index c12154085a..b81869f482 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -332,6 +332,7 @@ func (c *cmdFilePull) Run(cmd *cobra.Command, args []string) error {
progress := utils.ProgressRenderer{
Format: fmt.Sprintf(i18n.G("Pulling %s from %s: %%s"), targetPath, pathSpec[1]),
+ Quiet: c.global.flagQuiet,
}
writer := &ioprogress.ProgressWriter{
@@ -590,6 +591,7 @@ func (c *cmdFilePush) Run(cmd *cobra.Command, args []string) error {
progress := utils.ProgressRenderer{
Format: fmt.Sprintf(i18n.G("Pushing %s to %s: %%s"), f.Name(), fpath),
+ Quiet: c.global.flagQuiet,
}
args.Content = shared.NewReadSeeker(&ioprogress.ProgressReader{
@@ -653,6 +655,7 @@ func (c *cmdFile) recursivePullFile(d lxd.ContainerServer, container string, p s
progress := utils.ProgressRenderer{
Format: fmt.Sprintf(i18n.G("Pulling %s from %s: %%s"), p, target),
+ Quiet: c.global.flagQuiet,
}
writer := &ioprogress.ProgressWriter{
@@ -744,6 +747,7 @@ func (c *cmdFile) recursivePushFile(d lxd.ContainerServer, container string, sou
progress := utils.ProgressRenderer{
Format: fmt.Sprintf(i18n.G("Pushing %s to %s: %%s"), p, targetPath),
+ Quiet: c.global.flagQuiet,
}
if args.Type != "directory" {
diff --git a/lxc/image.go b/lxc/image.go
index 9e98ac1545..6e47f65853 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -214,7 +214,11 @@ func (c *cmdImageCopy) Run(cmd *cobra.Command, args []string) error {
}
// Register progress handler
- progress := utils.ProgressRenderer{Format: i18n.G("Copying the image: %s")}
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Copying the image: %s"),
+ Quiet: c.global.flagQuiet,
+ }
+
_, err = op.AddHandler(progress.UpdateOp)
if err != nil {
progress.Done("")
@@ -491,7 +495,11 @@ func (c *cmdImageExport) Run(cmd *cobra.Command, args []string) error {
defer destRootfs.Close()
// Prepare the download request
- progress := utils.ProgressRenderer{Format: i18n.G("Exporting the image: %s")}
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Exporting the image: %s"),
+ Quiet: c.global.flagQuiet,
+ }
+
req := lxd.ImageFileRequest{
MetaFile: io.WriteSeeker(dest),
RootfsFile: io.WriteSeeker(destRootfs),
@@ -683,7 +691,11 @@ func (c *cmdImageImport) Run(cmd *cobra.Command, args []string) error {
image.Properties[strings.TrimSpace(fields[0])] = strings.TrimSpace(fields[1])
}
- progress := utils.ProgressRenderer{Format: i18n.G("Transferring image: %s")}
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Transferring image: %s"),
+ Quiet: c.global.flagQuiet,
+ }
+
if strings.HasPrefix(imageFile, "https://") {
image.Source = &api.ImagesPostSource{}
image.Source.Type = "url"
@@ -1236,7 +1248,11 @@ func (c *cmdImageRefresh) Run(cmd *cobra.Command, args []string) error {
}
image := c.image.dereferenceAlias(resource.server, resource.name)
- progress := utils.ProgressRenderer{Format: i18n.G("Refreshing the image: %s")}
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Refreshing the image: %s"),
+ Quiet: c.global.flagQuiet,
+ }
+
op, err := resource.server.RefreshImage(image)
if err != nil {
return err
diff --git a/lxc/import.go b/lxc/import.go
index c7163a7af0..4f86e854be 100644
--- a/lxc/import.go
+++ b/lxc/import.go
@@ -66,6 +66,7 @@ func (c *cmdImport) Run(cmd *cobra.Command, args []string) error {
progress := utils.ProgressRenderer{
Format: i18n.G("Importing container: %s"),
+ Quiet: c.global.flagQuiet,
}
createArgs := lxd.ContainerBackupArgs{}
diff --git a/lxc/init.go b/lxc/init.go
index 4b562fc0e7..2960a35c9c 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -96,10 +96,12 @@ func (c *cmdInit) create(conf *config.Config, args []string) (lxd.ContainerServe
profiles = append(profiles, p)
}
- if name == "" {
- fmt.Printf(i18n.G("Creating the container") + "\n")
- } else {
- fmt.Printf(i18n.G("Creating %s")+"\n", name)
+ if !c.global.flagQuiet {
+ if name == "" {
+ fmt.Printf(i18n.G("Creating the container") + "\n")
+ } else {
+ fmt.Printf(i18n.G("Creating %s")+"\n", name)
+ }
}
devicesMap := map[string]map[string]string{}
@@ -202,7 +204,11 @@ func (c *cmdInit) create(conf *config.Config, args []string) (lxd.ContainerServe
}
// Watch the background operation
- progress := utils.ProgressRenderer{Format: i18n.G("Retrieving image: %s")}
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Retrieving image: %s"),
+ Quiet: c.global.flagQuiet,
+ }
+
_, err = op.AddHandler(progress.UpdateOp)
if err != nil {
progress.Done("")
diff --git a/lxc/launch.go b/lxc/launch.go
index 8345e55273..2f51cea8c5 100644
--- a/lxc/launch.go
+++ b/lxc/launch.go
@@ -60,7 +60,10 @@ func (c *cmdLaunch) Run(cmd *cobra.Command, args []string) error {
}
// Start the container
- fmt.Printf(i18n.G("Starting %s")+"\n", name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Starting %s")+"\n", name)
+ }
+
req := api.ContainerStatePut{
Action: "start",
Timeout: -1,
diff --git a/lxc/main.go b/lxc/main.go
index 59cbe52ad0..1ec8c08a9f 100644
--- a/lxc/main.go
+++ b/lxc/main.go
@@ -33,6 +33,7 @@ type cmdGlobal struct {
flagHelpAll bool
flagLogDebug bool
flagLogVerbose bool
+ flagQuiet bool
flagVersion bool
}
@@ -58,6 +59,7 @@ For help with any of those, simply call them with --help.`))
app.PersistentFlags().BoolVar(&globalCmd.flagForceLocal, "force-local", false, i18n.G("Force using the local unix socket"))
app.PersistentFlags().BoolVar(&globalCmd.flagLogDebug, "debug", false, i18n.G("Show all debug messages"))
app.PersistentFlags().BoolVarP(&globalCmd.flagLogVerbose, "verbose", "v", false, i18n.G("Show all information messages"))
+ app.PersistentFlags().BoolVarP(&globalCmd.flagQuiet, "quiet", "q", false, i18n.G("Don't show progress information"))
// Wrappers
app.PersistentPreRunE = globalCmd.PreRun
diff --git a/lxc/network.go b/lxc/network.go
index 3eea68535a..0547548749 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -303,10 +303,12 @@ func (c *cmdNetworkCreate) Run(cmd *cobra.Command, args []string) error {
return err
}
- if c.network.flagTarget != "" {
- fmt.Printf(i18n.G("Network %s pending on member %s")+"\n", resource.name, c.network.flagTarget)
- } else {
- fmt.Printf(i18n.G("Network %s created")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ if c.network.flagTarget != "" {
+ fmt.Printf(i18n.G("Network %s pending on member %s")+"\n", resource.name, c.network.flagTarget)
+ } else {
+ fmt.Printf(i18n.G("Network %s created")+"\n", resource.name)
+ }
}
return nil
@@ -356,7 +358,10 @@ func (c *cmdNetworkDelete) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Network %s deleted")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Network %s deleted")+"\n", resource.name)
+ }
+
return nil
}
@@ -1009,7 +1014,10 @@ func (c *cmdNetworkRename) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Network %s renamed to %s")+"\n", resource.name, args[1])
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Network %s renamed to %s")+"\n", resource.name, args[1])
+ }
+
return nil
}
diff --git a/lxc/operation.go b/lxc/operation.go
index a38935615a..e950227121 100644
--- a/lxc/operation.go
+++ b/lxc/operation.go
@@ -80,7 +80,10 @@ func (c *cmdOperationDelete) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Operation %s deleted")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Operation %s deleted")+"\n", resource.name)
+ }
+
return nil
}
diff --git a/lxc/profile.go b/lxc/profile.go
index 3328b09ac8..00c7fdf677 100644
--- a/lxc/profile.go
+++ b/lxc/profile.go
@@ -144,7 +144,9 @@ func (c *cmdProfileAdd) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Profile %s added to %s")+"\n", args[1], resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Profile %s added to %s")+"\n", args[1], resource.name)
+ }
return nil
}
@@ -222,7 +224,9 @@ func (c *cmdProfileAssign) Run(cmd *cobra.Command, args []string) error {
args[1] = i18n.G("(none)")
}
- fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", args[1], resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", args[1], resource.name)
+ }
return nil
}
@@ -330,7 +334,10 @@ func (c *cmdProfileCreate) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Profile %s created")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Profile %s created")+"\n", resource.name)
+ }
+
return nil
}
@@ -378,7 +385,9 @@ func (c *cmdProfileDelete) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Profile %s deleted")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Profile %s deleted")+"\n", resource.name)
+ }
return nil
}
@@ -687,7 +696,10 @@ func (c *cmdProfileRemove) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", args[1], resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", args[1], resource.name)
+ }
+
return nil
}
@@ -735,7 +747,9 @@ func (c *cmdProfileRename) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Profile %s renamed to %s")+"\n", resource.name, args[1])
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Profile %s renamed to %s")+"\n", resource.name, args[1])
+ }
return nil
}
diff --git a/lxc/storage.go b/lxc/storage.go
index d958c0b78f..0a6b85107c 100644
--- a/lxc/storage.go
+++ b/lxc/storage.go
@@ -138,10 +138,12 @@ func (c *cmdStorageCreate) Run(cmd *cobra.Command, args []string) error {
return err
}
- if c.storage.flagTarget != "" {
- fmt.Printf(i18n.G("Storage pool %s pending on member %s")+"\n", resource.name, c.storage.flagTarget)
- } else {
- fmt.Printf(i18n.G("Storage pool %s created")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ if c.storage.flagTarget != "" {
+ fmt.Printf(i18n.G("Storage pool %s pending on member %s")+"\n", resource.name, c.storage.flagTarget)
+ } else {
+ fmt.Printf(i18n.G("Storage pool %s created")+"\n", resource.name)
+ }
}
return nil
@@ -191,7 +193,10 @@ func (c *cmdStorageDelete) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", resource.name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", resource.name)
+ }
+
return nil
}
diff --git a/lxc/storage_volume.go b/lxc/storage_volume.go
index 872be04b2d..2ab438bca8 100644
--- a/lxc/storage_volume.go
+++ b/lxc/storage_volume.go
@@ -373,7 +373,11 @@ func (c *cmdStorageVolumeCopy) Run(cmd *cobra.Command, args []string) error {
}
// Register progress handler
- progress := utils.ProgressRenderer{Format: opMsg}
+ progress := utils.ProgressRenderer{
+ Format: opMsg,
+ Quiet: c.global.flagQuiet,
+ }
+
_, err = op.AddHandler(progress.UpdateOp)
if err != nil {
progress.Done("")
@@ -467,7 +471,9 @@ func (c *cmdStorageVolumeCreate) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Storage volume %s created")+"\n", args[1])
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Storage volume %s created")+"\n", args[1])
+ }
return nil
}
@@ -528,7 +534,9 @@ func (c *cmdStorageVolumeDelete) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", args[1])
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", args[1])
+ }
return nil
}
@@ -1056,7 +1064,9 @@ func (c *cmdStorageVolumeRename) Run(cmd *cobra.Command, args []string) error {
return err
}
- fmt.Printf(i18n.G(`Renamed storage volume from "%s" to "%s"`)+"\n", volName, vol.Name)
+ if !c.global.flagQuiet {
+ fmt.Printf(i18n.G(`Renamed storage volume from "%s" to "%s"`)+"\n", volName, vol.Name)
+ }
return nil
}
diff --git a/lxc/utils/progress.go b/lxc/utils/progress.go
index ec88141467..3b5ebcf48d 100644
--- a/lxc/utils/progress.go
+++ b/lxc/utils/progress.go
@@ -13,6 +13,7 @@ import (
// ProgressRenderer tracks the progress information
type ProgressRenderer struct {
Format string
+ Quiet bool
maxLength int
wait time.Time
@@ -34,6 +35,11 @@ func (p *ProgressRenderer) Done(msg string) {
// Mark this renderer as done
p.done = true
+ // Handle quiet mode
+ if p.Quiet {
+ msg = ""
+ }
+
// If we're not printing a completion message and nothing was printed before just return
if msg == "" && p.maxLength == 0 {
return
@@ -71,6 +77,11 @@ func (p *ProgressRenderer) Update(status string) {
return
}
+ // Handle quiet mode
+ if p.Quiet {
+ return
+ }
+
// Print the new message
msg := "%s"
if p.Format != "" {
More information about the lxc-devel
mailing list