[lxc-devel] [lxd/master] Copy config with snapshot

tych0 on Github lxc-bot at linuxcontainers.org
Wed May 11 17:51:01 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160511/a8d80939/attachment.bin>
-------------- next part --------------
From 04932a2d05265f2f2c6b5bb15f6ea8491825ebbb Mon Sep 17 00:00:00 2001
From: Tycho Andersen <tycho.andersen at canonical.com>
Date: Wed, 11 May 2016 17:37:51 +0000
Subject: [PATCH 1/2] propagate snapshot config when copying a snapshot

Closes #2017

Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 client.go   | 25 +++++++++++++++++++++++++
 lxc/copy.go | 37 +++++++++++++++++++++++++++++--------
 2 files changed, 54 insertions(+), 8 deletions(-)

diff --git a/client.go b/client.go
index 6338017..b7740c1 100644
--- a/client.go
+++ b/client.go
@@ -1821,6 +1821,31 @@ func (c *Client) ListSnapshots(container string) ([]shared.SnapshotInfo, error)
 	return result, nil
 }
 
+func (c *Client) SnapshotInfo(snapName string) (*shared.SnapshotInfo, error) {
+	if c.Remote.Public {
+		return nil, fmt.Errorf("This function isn't supported by public remotes.")
+	}
+
+	pieces := strings.SplitN(snapName, shared.SnapshotDelimiter, 2)
+	if len(pieces) != 2 {
+		return nil, fmt.Errorf("invalid snapshot name %s", snapName)
+	}
+
+	qUrl := fmt.Sprintf("containers/%s/snapshots/%s", pieces[0], pieces[1])
+	resp, err := c.get(qUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	var result shared.SnapshotInfo
+
+	if err := json.Unmarshal(resp.Metadata, &result); err != nil {
+		return nil, err
+	}
+
+	return &result, nil
+}
+
 func (c *Client) GetServerConfigString() ([]string, error) {
 	var resp []string
 
diff --git a/lxc/copy.go b/lxc/copy.go
index a451919..74631c4 100644
--- a/lxc/copy.go
+++ b/lxc/copy.go
@@ -47,7 +47,12 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
 		return err
 	}
 
-	status := &shared.ContainerInfo{}
+	var status struct {
+		Architecture string
+		Devices      shared.Devices
+		Config       map[string]string
+		Profiles     []string
+	}
 
 	// TODO: presumably we want to do this for copying snapshots too? We
 	// need to think a bit more about how we track the baseImage in the
@@ -56,18 +61,34 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
 	baseImage := ""
 
 	if !shared.IsSnapshot(sourceName) {
-		status, err = source.ContainerInfo(sourceName)
+		result, err := source.ContainerInfo(sourceName)
+		if err != nil {
+			return err
+		}
+
+		status.Architecture = result.Architecture
+		status.Devices = result.Devices
+		status.Config = result.Config
+		status.Profiles = result.Profiles
+
+	} else {
+		result, err := source.SnapshotInfo(sourceName)
 		if err != nil {
 			return err
 		}
 
-		baseImage = status.Config["volatile.base_image"]
+		status.Architecture = result.Architecture
+		status.Devices = result.Devices
+		status.Config = result.Config
+		status.Profiles = result.Profiles
+	}
+
+	baseImage = status.Config["volatile.base_image"]
 
-		if !keepVolatile {
-			for k := range status.Config {
-				if strings.HasPrefix(k, "volatile") {
-					delete(status.Config, k)
-				}
+	if !keepVolatile {
+		for k := range status.Config {
+			if strings.HasPrefix(k, "volatile") {
+				delete(status.Config, k)
 			}
 		}
 	}

From 8fbf9c7fe0640b3d171f8a85f4bc84391c50181d Mon Sep 17 00:00:00 2001
From: Tycho Andersen <tycho.andersen at canonical.com>
Date: Wed, 11 May 2016 11:49:50 -0600
Subject: [PATCH 2/2] implement `lxc config show` for snapshots

Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 lxc/config.go | 41 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/lxc/config.go b/lxc/config.go
index 4bf7cc5..e824b4e 100644
--- a/lxc/config.go
+++ b/lxc/config.go
@@ -341,16 +341,43 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 			brief := config.Brief()
 			data, err = yaml.Marshal(&brief)
 		} else {
-			config, err := d.ContainerInfo(container)
-			if err != nil {
-				return err
-			}
+			var brief shared.BriefContainerInfo
+			if shared.IsSnapshot(container) {
+				config, err := d.SnapshotInfo(container)
+				if err != nil {
+					return err
+				}
 
-			brief := config.Brief()
-			if c.expanded {
-				brief = config.BriefExpanded()
+				brief = shared.BriefContainerInfo{
+					Profiles:  config.Profiles,
+					Config:    config.Config,
+					Devices:   config.Devices,
+					Ephemeral: config.Ephemeral,
+				}
+				if c.expanded {
+					brief = shared.BriefContainerInfo{
+						Profiles:  config.Profiles,
+						Config:    config.ExpandedConfig,
+						Devices:   config.ExpandedDevices,
+						Ephemeral: config.Ephemeral,
+					}
+				}
+			} else {
+				config, err := d.ContainerInfo(container)
+				if err != nil {
+					return err
+				}
+
+				brief = config.Brief()
+				if c.expanded {
+					brief = config.BriefExpanded()
+				}
 			}
+
 			data, err = yaml.Marshal(&brief)
+			if err != nil {
+				return err
+			}
 		}
 
 		fmt.Printf("%s", data)


More information about the lxc-devel mailing list