The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/4480
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Closes #4447 Signed-off-by: Stéphane Graber <[email protected]>
From c5cbe5c8e98fc02cc70b7bd8d48db3c6e2271f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <[email protected]> Date: Fri, 20 Apr 2018 13:11:31 -0400 Subject: [PATCH] lxd/containers: Allow sending progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #4447 Signed-off-by: Stéphane Graber <[email protected]> --- lxc/action.go | 9 +++++++++ lxc/utils/progress.go | 11 ++++++----- lxd/container.go | 4 ++++ lxd/container_lxc.go | 28 ++++++++++++++++++++++++++++ lxd/container_state.go | 7 +++++++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/lxc/action.go b/lxc/action.go index e8699ed69..965361286 100644 --- a/lxc/action.go +++ b/lxc/action.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/cobra" "github.com/lxc/lxd/lxc/config" + "github.com/lxc/lxd/lxc/utils" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" cli "github.com/lxc/lxd/shared/cmd" @@ -174,7 +175,15 @@ func (c *cmdAction) doAction(action string, conf *config.Config, nameArg string) return err } + progress := utils.ProgressRenderer{} + _, err = op.AddHandler(progress.UpdateOp) + if err != nil { + progress.Done("") + return err + } + err = op.Wait() + progress.Done("") if err != nil { return fmt.Errorf("%s\n"+i18n.G("Try `lxc info --show-log %s` for more info"), err, nameArg) } diff --git a/lxc/utils/progress.go b/lxc/utils/progress.go index 1a781895a..acde53530 100644 --- a/lxc/utils/progress.go +++ b/lxc/utils/progress.go @@ -118,11 +118,12 @@ func (p *ProgressRenderer) UpdateOp(op api.Operation) { return } - for _, key := range []string{"fs_progress", "download_progress"} { - value, ok := op.Metadata[key] - if ok { - p.Update(value.(string)) - break + for key, value := range op.Metadata { + if !strings.HasSuffix(key, "_progress") { + continue } + + p.Update(value.(string)) + break } } diff --git a/lxd/container.go b/lxd/container.go index 5fec29aef..f5c87f3d3 100644 --- a/lxd/container.go +++ b/lxd/container.go @@ -533,8 +533,12 @@ type container interface { ConsoleBufferLogPath() string LogPath() string + // Storage StoragePool() (string, error) + // Progress reporting + SetOperation(op *operation) + // FIXME: Those should be internal functions // Needed for migration for now. StorageStart() (bool, error) diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index 82fe1bddc..63e137031 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -523,6 +523,9 @@ type containerLXC struct { // Clustering node string + + // Progress tracking + op *operation } func (c *containerLXC) createOperation(action string, reusable bool, reuse bool) (*lxcContainerOperation, error) { @@ -1887,6 +1890,7 @@ func (c *containerLXC) startCommon() (string, error) { if !reflect.DeepEqual(idmap, lastIdmap) { logger.Debugf("Container idmap changed, remapping") + c.updateProgress("Remapping container filesystem") ourStart, err = c.StorageStart() if err != nil { @@ -1942,6 +1946,8 @@ func (c *containerLXC) startCommon() (string, error) { return "", err } } + + c.updateProgress("") } err = c.ConfigKeySet("volatile.last_state.idmap", jsonIdmap) @@ -8157,6 +8163,28 @@ func (c *containerLXC) StoragePool() (string, error) { return poolName, nil } +// Progress tracking +func (c *containerLXC) SetOperation(op *operation) { + c.op = op +} + +func (c *containerLXC) updateProgress(progress string) { + if c.op == nil { + return + } + + meta := c.op.metadata + if meta == nil { + meta = make(map[string]interface{}) + } + + if meta["container_progress"] != progress { + meta["container_progress"] = progress + c.op.UpdateMetadata(meta) + } +} + +// Internal MAAS handling func (c *containerLXC) maasInterfaces() ([]maas.ContainerInterface, error) { interfaces := []maas.ContainerInterface{} for k, m := range c.expandedDevices { diff --git a/lxd/container_state.go b/lxd/container_state.go index 00b044b20..24a988076 100644 --- a/lxd/container_state.go +++ b/lxd/container_state.go @@ -73,6 +73,7 @@ func containerStatePut(d *Daemon, r *http.Request) Response { case shared.Start: opDescription = "Starting container" do = func(op *operation) error { + c.SetOperation(op) if err = c.Start(raw.Stateful); err != nil { return err } @@ -82,6 +83,7 @@ func containerStatePut(d *Daemon, r *http.Request) Response { opDescription = "Stopping container" if raw.Stateful { do = func(op *operation) error { + c.SetOperation(op) err := c.Stop(raw.Stateful) if err != nil { return err @@ -91,6 +93,7 @@ func containerStatePut(d *Daemon, r *http.Request) Response { } } else if raw.Timeout == 0 || raw.Force { do = func(op *operation) error { + c.SetOperation(op) err = c.Stop(false) if err != nil { return err @@ -100,6 +103,7 @@ func containerStatePut(d *Daemon, r *http.Request) Response { } } else { do = func(op *operation) error { + c.SetOperation(op) if c.IsFrozen() { err := c.Unfreeze() if err != nil { @@ -118,6 +122,7 @@ func containerStatePut(d *Daemon, r *http.Request) Response { case shared.Restart: opDescription = "Restarting container" do = func(op *operation) error { + c.SetOperation(op) ephemeral := c.IsEphemeral() if ephemeral { @@ -169,11 +174,13 @@ func containerStatePut(d *Daemon, r *http.Request) Response { case shared.Freeze: opDescription = "Freezing container" do = func(op *operation) error { + c.SetOperation(op) return c.Freeze() } case shared.Unfreeze: opDescription = "Unfreezing container" do = func(op *operation) error { + c.SetOperation(op) return c.Unfreeze() } default:
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
