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

Reply via email to