[lxc-devel] [lxd/master] Port lxc to the new client library
stgraber on Github
lxc-bot at linuxcontainers.org
Sat Jun 17 04:03:41 UTC 2017
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 682 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170617/dfa2d91b/attachment.bin>
-------------- next part --------------
From abe8219220c8b9fb9df9bb4aa35bf2fe3c5e7c99 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:48:55 -0400
Subject: [PATCH 01/28] client: Only set file headers if value is provided
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
client/lxd_containers.go | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/client/lxd_containers.go b/client/lxd_containers.go
index 4f1b6c402..ba5fcee7e 100644
--- a/client/lxd_containers.go
+++ b/client/lxd_containers.go
@@ -537,9 +537,17 @@ func (r *ProtocolLXD) CreateContainerFile(containerName string, path string, arg
}
// Set the various headers
- req.Header.Set("X-LXD-uid", fmt.Sprintf("%d", args.UID))
- req.Header.Set("X-LXD-gid", fmt.Sprintf("%d", args.GID))
- req.Header.Set("X-LXD-mode", fmt.Sprintf("%04o", args.Mode))
+ if args.UID > -1 {
+ req.Header.Set("X-LXD-uid", fmt.Sprintf("%d", args.UID))
+ }
+
+ if args.GID > -1 {
+ req.Header.Set("X-LXD-gid", fmt.Sprintf("%d", args.GID))
+ }
+
+ if args.Mode > -1 {
+ req.Header.Set("X-LXD-mode", fmt.Sprintf("%04o", args.Mode))
+ }
if args.Type != "" {
req.Header.Set("X-LXD-type", args.Type)
From 3488da4a08f8f0d6cc4c6cb97fc4314946209655 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 00:00:14 -0400
Subject: [PATCH 02/28] config: Implement temporary Legacy function
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This will be used for easier porting of the command line client.
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/config/legacy.go | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
create mode 100644 lxc/config/legacy.go
diff --git a/lxc/config/legacy.go b/lxc/config/legacy.go
new file mode 100644
index 000000000..d286f1f03
--- /dev/null
+++ b/lxc/config/legacy.go
@@ -0,0 +1,31 @@
+package config
+
+import (
+ "github.com/lxc/lxd"
+)
+
+// Legacy returns a legacy *lxd.Config
+func (c *Config) Legacy() *lxd.Config {
+ conf := &lxd.Config{
+ DefaultRemote: c.DefaultRemote,
+ Aliases: c.Aliases,
+ ConfigDir: c.ConfigDir,
+ }
+
+ remotes := map[string]lxd.RemoteConfig{}
+
+ for k, v := range c.Remotes {
+ remote := lxd.RemoteConfig{
+ Addr: v.Addr,
+ Public: v.Public,
+ Protocol: v.Protocol,
+ Static: v.Static,
+ }
+
+ remotes[k] = remote
+ }
+
+ conf.Remotes = remotes
+
+ return conf
+}
From 2bedb3d9b38edd51a7973c84a010cea3df2e95fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 00:27:02 -0400
Subject: [PATCH 03/28] lxc: Port to lxc/config for config management
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/action.go | 15 ++--
lxc/config.go | 216 +++++++++++++++++++++++++++++++++++--------------------
lxc/copy.go | 24 ++++---
lxc/delete.go | 10 ++-
lxc/exec.go | 12 ++--
lxc/file.go | 48 ++++++++-----
lxc/finger.go | 14 ++--
lxc/help.go | 4 +-
lxc/image.go | 133 +++++++++++++++++++++++++---------
lxc/info.go | 16 +++--
lxc/init.go | 26 ++++---
lxc/launch.go | 22 ++++--
lxc/list.go | 16 +++--
lxc/main.go | 46 +++++++-----
lxc/main_test.go | 4 +-
lxc/manpage.go | 4 +-
lxc/monitor.go | 16 +++--
lxc/move.go | 20 ++++--
lxc/network.go | 27 ++++---
lxc/profile.go | 57 +++++++++------
lxc/publish.go | 25 ++++---
lxc/remote.go | 80 ++++++++++-----------
lxc/restore.go | 11 ++-
lxc/snapshot.go | 11 ++-
lxc/storage.go | 32 ++++++---
lxc/utils.go | 39 ++++++++++
lxc/version.go | 4 +-
27 files changed, 628 insertions(+), 304 deletions(-)
diff --git a/lxc/action.go b/lxc/action.go
index d545cbb5c..5666d59ae 100644
--- a/lxc/action.go
+++ b/lxc/action.go
@@ -6,6 +6,7 @@ import (
"strings"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -50,7 +51,7 @@ func (c *actionCmd) flags() {
gnuflag.BoolVar(&c.stateless, "stateless", false, i18n.G("Ignore the container state (only for start)"))
}
-func (c *actionCmd) doAction(config *lxd.Config, nameArg string) error {
+func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
state := false
// Only store state if asked to
@@ -58,8 +59,12 @@ func (c *actionCmd) doAction(config *lxd.Config, nameArg string) error {
state = true
}
- remote, name := config.ParseRemoteAndContainer(nameArg)
- d, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(nameArg)
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -101,13 +106,13 @@ func (c *actionCmd) doAction(config *lxd.Config, nameArg string) error {
return nil
}
-func (c *actionCmd) run(config *lxd.Config, args []string) error {
+func (c *actionCmd) run(conf *config.Config, args []string) error {
if len(args) == 0 {
return errArgs
}
// Run the action for every listed container
- results := runBatch(args, func(name string) error { return c.doAction(config, name) })
+ results := runBatch(args, func(name string) error { return c.doAction(conf, name) })
// Single container is easy
if len(results) == 1 {
diff --git a/lxc/config.go b/lxc/config.go
index 884736828..ad2e62f71 100644
--- a/lxc/config.go
+++ b/lxc/config.go
@@ -14,6 +14,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -129,14 +130,18 @@ lxc config set core.trust_password blah
Will set the server's trust password to blah.`)
}
-func (c *configCmd) doSet(config *lxd.Config, args []string, unset bool) error {
+func (c *configCmd) doSet(conf *config.Config, args []string, unset bool) error {
if len(args) != 4 {
return errArgs
}
// [[lxc config]] set dakara:c1 limits.memory 200000
- remote, container := config.ParseRemoteAndContainer(args[1])
- d, err := lxd.NewClient(config, remote)
+ remote, container, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -167,7 +172,7 @@ func (c *configCmd) doSet(config *lxd.Config, args []string, unset bool) error {
return d.SetContainerConfig(container, key, value)
}
-func (c *configCmd) run(config *lxd.Config, args []string) error {
+func (c *configCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errUsage
}
@@ -181,7 +186,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
// Deal with local server
if len(args) == 2 {
- c, err := lxd.NewClient(config, config.DefaultRemote)
+ c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
if err != nil {
return err
}
@@ -201,9 +206,13 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
}
// Deal with remote server
- remote, container := config.ParseRemoteAndContainer(args[1])
+ remote, container, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if container == "" {
- c, err := lxd.NewClient(config, remote)
+ c, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -224,7 +233,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
// Deal with container
args = append(args, "")
- return c.doSet(config, args, true)
+ return c.doSet(conf, args, true)
case "set":
if len(args) < 3 {
@@ -233,7 +242,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
// Deal with local server
if len(args) == 3 {
- c, err := lxd.NewClient(config, config.DefaultRemote)
+ c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
if err != nil {
return err
}
@@ -243,9 +252,13 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
}
// Deal with remote server
- remote, container := config.ParseRemoteAndContainer(args[1])
+ remote, container, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if container == "" {
- c, err := lxd.NewClient(config, remote)
+ c, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -255,7 +268,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
}
// Deal with container
- return c.doSet(config, args, false)
+ return c.doSet(conf, args, false)
case "trust":
if len(args) < 2 {
@@ -266,12 +279,16 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
case "list":
var remote string
if len(args) == 3 {
- remote = config.ParseRemote(args[2])
+ var err error
+ remote, _, err = conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
} else {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -320,12 +337,16 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
if len(args) < 3 {
return fmt.Errorf(i18n.G("No certificate provided to add"))
} else if len(args) == 4 {
- remote = config.ParseRemote(args[2])
+ var err error
+ remote, _, err = conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
} else {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -343,12 +364,16 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
if len(args) < 3 {
return fmt.Errorf(i18n.G("No fingerprint specified."))
} else if len(args) == 4 {
- remote = config.ParseRemote(args[2])
+ var err error
+ remote, _, err = conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
} else {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -359,13 +384,17 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
}
case "show":
- remote := config.DefaultRemote
+ remote := conf.DefaultRemote
container := ""
if len(args) > 1 {
- remote, container = config.ParseRemoteAndContainer(args[1])
+ var err error
+ remote, container, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -373,12 +402,12 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
var data []byte
if len(args) == 1 || container == "" {
- config, err := d.ServerStatus()
+ server, err := d.ServerStatus()
if err != nil {
return err
}
- brief := config.Writable()
+ brief := server.Writable()
data, err = yaml.Marshal(&brief)
if err != nil {
return err
@@ -386,35 +415,35 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
} else {
var brief api.ContainerPut
if shared.IsSnapshot(container) {
- config, err := d.SnapshotInfo(container)
+ snap, err := d.SnapshotInfo(container)
if err != nil {
return err
}
brief = api.ContainerPut{
- Profiles: config.Profiles,
- Config: config.Config,
- Devices: config.Devices,
- Ephemeral: config.Ephemeral,
+ Profiles: snap.Profiles,
+ Config: snap.Config,
+ Devices: snap.Devices,
+ Ephemeral: snap.Ephemeral,
}
if c.expanded {
brief = api.ContainerPut{
- Profiles: config.Profiles,
- Config: config.ExpandedConfig,
- Devices: config.ExpandedDevices,
- Ephemeral: config.Ephemeral,
+ Profiles: snap.Profiles,
+ Config: snap.ExpandedConfig,
+ Devices: snap.ExpandedDevices,
+ Ephemeral: snap.Ephemeral,
}
}
} else {
- config, err := d.ContainerInfo(container)
+ container, err := d.ContainerInfo(container)
if err != nil {
return err
}
- brief = config.Writable()
+ brief = container.Writable()
if c.expanded {
- brief.Config = config.ExpandedConfig
- brief.Devices = config.ExpandedDevices
+ brief.Config = container.ExpandedConfig
+ brief.Devices = container.ExpandedDevices
}
}
@@ -433,15 +462,19 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- remote := config.DefaultRemote
+ remote := conf.DefaultRemote
container := ""
key := args[1]
if len(args) > 2 {
- remote, container = config.ParseRemoteAndContainer(args[1])
+ var err error
+ remote, container, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
key = args[2]
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -478,19 +511,19 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
}
switch args[1] {
case "list":
- return c.deviceList(config, "container", args)
+ return c.deviceList(conf, "container", args)
case "add":
- return c.deviceAdd(config, "container", args)
+ return c.deviceAdd(conf, "container", args)
case "remove":
- return c.deviceRm(config, "container", args)
+ return c.deviceRm(conf, "container", args)
case "get":
- return c.deviceGet(config, "container", args)
+ return c.deviceGet(conf, "container", args)
case "set":
- return c.deviceSet(config, "container", args)
+ return c.deviceSet(conf, "container", args)
case "unset":
- return c.deviceUnset(config, "container", args)
+ return c.deviceUnset(conf, "container", args)
case "show":
- return c.deviceShow(config, "container", args)
+ return c.deviceShow(conf, "container", args)
default:
return errArgs
}
@@ -500,13 +533,17 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- remote := config.DefaultRemote
+ remote := conf.DefaultRemote
container := ""
if len(args) > 1 {
- remote, container = config.ParseRemoteAndContainer(args[1])
+ var err error
+ remote, container, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -541,12 +578,12 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
}
// Extract the current value
- config, err := client.ContainerInfo(cont)
+ container, err := client.ContainerInfo(cont)
if err != nil {
return err
}
- brief := config.Writable()
+ brief := container.Writable()
data, err := yaml.Marshal(&brief)
if err != nil {
return err
@@ -606,12 +643,12 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
}
// Extract the current value
- config, err := client.ServerStatus()
+ server, err := client.ServerStatus()
if err != nil {
return err
}
- brief := config.Writable()
+ brief := server.Writable()
data, err := yaml.Marshal(&brief)
if err != nil {
return err
@@ -652,13 +689,17 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
return nil
}
-func (c *configCmd) deviceAdd(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceAdd(conf *config.Config, which string, args []string) error {
if len(args) < 5 {
return errArgs
}
- remote, name := config.ParseRemoteAndContainer(args[2])
- client, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
+
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -690,14 +731,17 @@ func (c *configCmd) deviceAdd(config *lxd.Config, which string, args []string) e
return err
}
-func (c *configCmd) deviceGet(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceGet(conf *config.Config, which string, args []string) error {
if len(args) < 5 {
return errArgs
}
- remote, name := config.ParseRemoteAndContainer(args[2])
+ remote, name, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
- client, err := lxd.NewClient(config, remote)
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -734,14 +778,17 @@ func (c *configCmd) deviceGet(config *lxd.Config, which string, args []string) e
return nil
}
-func (c *configCmd) deviceSet(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceSet(conf *config.Config, which string, args []string) error {
if len(args) < 6 {
return errArgs
}
- remote, name := config.ParseRemoteAndContainer(args[2])
+ remote, name, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
- client, err := lxd.NewClient(config, remote)
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -791,14 +838,17 @@ func (c *configCmd) deviceSet(config *lxd.Config, which string, args []string) e
return err
}
-func (c *configCmd) deviceUnset(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string) error {
if len(args) < 5 {
return errArgs
}
- remote, name := config.ParseRemoteAndContainer(args[2])
+ remote, name, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
- client, err := lxd.NewClient(config, remote)
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -847,13 +897,17 @@ func (c *configCmd) deviceUnset(config *lxd.Config, which string, args []string)
return err
}
-func (c *configCmd) deviceRm(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) error {
if len(args) < 4 {
return errArgs
}
- remote, name := config.ParseRemoteAndContainer(args[2])
- client, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
+
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -877,13 +931,17 @@ func (c *configCmd) deviceRm(config *lxd.Config, which string, args []string) er
return err
}
-func (c *configCmd) deviceList(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceList(conf *config.Config, which string, args []string) error {
if len(args) < 3 {
return errArgs
}
- remote, name := config.ParseRemoteAndContainer(args[2])
- client, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
+
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -902,13 +960,17 @@ func (c *configCmd) deviceList(config *lxd.Config, which string, args []string)
return nil
}
-func (c *configCmd) deviceShow(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceShow(conf *config.Config, which string, args []string) error {
if len(args) < 3 {
return errArgs
}
- remote, name := config.ParseRemoteAndContainer(args[2])
- client, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
+
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/copy.go b/lxc/copy.go
index f380306e2..80cc266d9 100644
--- a/lxc/copy.go
+++ b/lxc/copy.go
@@ -5,6 +5,7 @@ import (
"strings"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -39,9 +40,16 @@ func (c *copyCmd) flags() {
gnuflag.BoolVar(&c.containerOnly, "container-only", false, i18n.G("Copy the container without its snapshots"))
}
-func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error {
- sourceRemote, sourceName := config.ParseRemoteAndContainer(sourceResource)
- destRemote, destName := config.ParseRemoteAndContainer(destResource)
+func (c *copyCmd) copyContainer(conf *config.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error {
+ sourceRemote, sourceName, err := conf.ParseRemote(sourceResource)
+ if err != nil {
+ return err
+ }
+
+ destRemote, destName, err := conf.ParseRemote(destResource)
+ if err != nil {
+ return err
+ }
if sourceName == "" {
return fmt.Errorf(i18n.G("you must specify a source container name"))
@@ -51,7 +59,7 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
destName = sourceName
}
- source, err := lxd.NewClient(config, sourceRemote)
+ source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
if err != nil {
return err
}
@@ -146,7 +154,7 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
return nil
}
- dest, err := lxd.NewClient(config, destRemote)
+ dest, err := lxd.NewClient(conf.Legacy(), destRemote)
if err != nil {
return err
}
@@ -280,7 +288,7 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
return fmt.Errorf(i18n.G("Migration failed on target host: %s"), migrationErrFromClient)
}
-func (c *copyCmd) run(config *lxd.Config, args []string) error {
+func (c *copyCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errArgs
}
@@ -291,8 +299,8 @@ func (c *copyCmd) run(config *lxd.Config, args []string) error {
}
if len(args) < 2 {
- return c.copyContainer(config, args[0], "", false, ephem, false, c.containerOnly)
+ return c.copyContainer(conf, args[0], "", false, ephem, false, c.containerOnly)
}
- return c.copyContainer(config, args[0], args[1], false, ephem, false, c.containerOnly)
+ return c.copyContainer(conf, args[0], args[1], false, ephem, false, c.containerOnly)
}
diff --git a/lxc/delete.go b/lxc/delete.go
index efe565fb9..2b1a00235 100644
--- a/lxc/delete.go
+++ b/lxc/delete.go
@@ -7,6 +7,7 @@ import (
"strings"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -57,15 +58,18 @@ func (c *deleteCmd) doDelete(d *lxd.Client, name string) error {
return d.WaitForSuccess(resp.Operation)
}
-func (c *deleteCmd) run(config *lxd.Config, args []string) error {
+func (c *deleteCmd) run(conf *config.Config, args []string) error {
if len(args) == 0 {
return errArgs
}
for _, nameArg := range args {
- remote, name := config.ParseRemoteAndContainer(nameArg)
+ remote, name, err := conf.ParseRemote(nameArg)
+ if err != nil {
+ return err
+ }
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/exec.go b/lxc/exec.go
index c1d04564b..03829a8e5 100644
--- a/lxc/exec.go
+++ b/lxc/exec.go
@@ -13,7 +13,7 @@ import (
"github.com/gorilla/websocket"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -116,7 +116,7 @@ func (c *execCmd) forwardSignal(control *websocket.Conn, sig syscall.Signal) err
return err
}
-func (c *execCmd) run(config *lxd.Config, args []string) error {
+func (c *execCmd) run(conf *config.Config, args []string) error {
if len(args) < 2 {
return errArgs
}
@@ -129,8 +129,12 @@ func (c *execCmd) run(config *lxd.Config, args []string) error {
return fmt.Errorf(i18n.G("You can't pass -t or -T at the same time as --mode"))
}
- remote, name := config.ParseRemoteAndContainer(args[0])
- d, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/file.go b/lxc/file.go
index 67ecbaf03..6821fefdd 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -11,6 +11,7 @@ import (
"syscall"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -68,7 +69,7 @@ func (c *fileCmd) flags() {
gnuflag.BoolVar(&c.mkdirs, "p", false, i18n.G("Create any directories necessary"))
}
-func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string) error {
+func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string) error {
if len(args) < 2 {
return errArgs
}
@@ -80,7 +81,10 @@ func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string)
return fmt.Errorf(i18n.G("Invalid target %s"), target)
}
- remote, container := config.ParseRemoteAndContainer(pathSpec[0])
+ remote, container, err := conf.ParseRemote(pathSpec[0])
+ if err != nil {
+ return err
+ }
targetIsDir := strings.HasSuffix(target, "/")
// re-add leading / that got stripped by the SplitN
@@ -95,7 +99,7 @@ func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string)
logger.Debugf("Pushing to: %s (isdir: %t)", targetPath, targetIsDir)
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -253,7 +257,7 @@ func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string)
return nil
}
-func (c *fileCmd) pull(config *lxd.Config, args []string) error {
+func (c *fileCmd) pull(conf *config.Config, args []string) error {
if len(args) < 2 {
return errArgs
}
@@ -291,8 +295,12 @@ func (c *fileCmd) pull(config *lxd.Config, args []string) error {
return fmt.Errorf(i18n.G("Invalid source %s"), f)
}
- remote, container := config.ParseRemoteAndContainer(pathSpec[0])
- d, err := lxd.NewClient(config, remote)
+ remote, container, err := conf.ParseRemote(pathSpec[0])
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -346,7 +354,7 @@ func (c *fileCmd) pull(config *lxd.Config, args []string) error {
return nil
}
-func (c *fileCmd) delete(config *lxd.Config, args []string) error {
+func (c *fileCmd) delete(conf *config.Config, args []string) error {
if len(args) < 1 {
return errArgs
}
@@ -357,8 +365,12 @@ func (c *fileCmd) delete(config *lxd.Config, args []string) error {
return fmt.Errorf(i18n.G("Invalid path %s"), f)
}
- remote, container := config.ParseRemoteAndContainer(pathSpec[0])
- d, err := lxd.NewClient(config, remote)
+ remote, container, err := conf.ParseRemote(pathSpec[0])
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -372,7 +384,7 @@ func (c *fileCmd) delete(config *lxd.Config, args []string) error {
return nil
}
-func (c *fileCmd) edit(config *lxd.Config, args []string) error {
+func (c *fileCmd) edit(conf *config.Config, args []string) error {
if len(args) != 1 {
return errArgs
}
@@ -383,7 +395,7 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
// If stdin isn't a terminal, read text from it
if !termios.IsTerminal(int(syscall.Stdin)) {
- return c.push(config, false, append([]string{os.Stdin.Name()}, args[0]))
+ return c.push(conf, false, append([]string{os.Stdin.Name()}, args[0]))
}
// Create temp file
@@ -394,7 +406,7 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
defer os.Remove(fname)
// Extract current value
- err = c.pull(config, append([]string{args[0]}, fname))
+ err = c.pull(conf, append([]string{args[0]}, fname))
if err != nil {
return err
}
@@ -404,7 +416,7 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
return err
}
- err = c.push(config, false, append([]string{fname}, args[0]))
+ err = c.push(conf, false, append([]string{fname}, args[0]))
if err != nil {
return err
}
@@ -412,20 +424,20 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
return nil
}
-func (c *fileCmd) run(config *lxd.Config, args []string) error {
+func (c *fileCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errUsage
}
switch args[0] {
case "push":
- return c.push(config, true, args[1:])
+ return c.push(conf, true, args[1:])
case "pull":
- return c.pull(config, args[1:])
+ return c.pull(conf, args[1:])
case "delete":
- return c.delete(config, args[1:])
+ return c.delete(conf, args[1:])
case "edit":
- return c.edit(config, args[1:])
+ return c.edit(conf, args[1:])
default:
return errArgs
}
diff --git a/lxc/finger.go b/lxc/finger.go
index ed192954f..911fee24b 100644
--- a/lxc/finger.go
+++ b/lxc/finger.go
@@ -2,6 +2,7 @@ package main
import (
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/i18n"
)
@@ -20,25 +21,30 @@ Check if the LXD server is alive.`)
func (c *fingerCmd) flags() {}
-func (c *fingerCmd) run(config *lxd.Config, args []string) error {
+func (c *fingerCmd) run(conf *config.Config, args []string) error {
if len(args) > 1 {
return errArgs
}
var remote string
if len(args) == 1 {
- remote = config.ParseRemote(args[0])
+ var err error
+ remote, _, err = conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
} else {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
// New client may or may not need to connect to the remote host, but
// client.ServerStatus will at least request the basic information from
// the server.
- client, err := lxd.NewClient(config, remote)
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
+
_, err = client.ServerStatus()
return err
}
diff --git a/lxc/help.go b/lxc/help.go
index 27f0a82d7..fce7dfbd0 100644
--- a/lxc/help.go
+++ b/lxc/help.go
@@ -5,7 +5,7 @@ import (
"os"
"sort"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
)
@@ -29,7 +29,7 @@ func (c *helpCmd) flags() {
gnuflag.BoolVar(&c.showAll, "all", false, i18n.G("Show all commands (not just interesting ones)"))
}
-func (c *helpCmd) run(config *lxd.Config, args []string) error {
+func (c *helpCmd) run(conf *config.Config, args []string) error {
if len(args) > 0 {
for _, name := range args {
cmd, ok := commands[name]
diff --git a/lxc/image.go b/lxc/image.go
index bc2526124..b372a048e 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -15,6 +15,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -250,8 +251,10 @@ func (c *imageCmd) parseColumns() ([]imageColumn, error) {
return columns, nil
}
-func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
+func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
var remote string
+ var err error
+
switch args[1] {
case "list":
filters := []string{}
@@ -260,12 +263,21 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
result := strings.SplitN(args[2], ":", 2)
if len(result) == 1 {
filters = append(filters, args[2])
- remote, _ = config.ParseRemoteAndContainer("")
+ remote, _, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
} else {
- remote, _ = config.ParseRemoteAndContainer(args[2])
+ remote, _, err = conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
}
} else {
- remote, _ = config.ParseRemoteAndContainer("")
+ remote, _, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
}
if len(args) > 3 {
@@ -274,7 +286,7 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
}
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -292,9 +304,14 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
if len(args) < 4 {
return errArgs
}
- remote, alias := config.ParseRemoteAndContainer(args[2])
+
+ remote, alias, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
+
target := args[3]
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -306,8 +323,13 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
if len(args) < 3 {
return errArgs
}
- remote, alias := config.ParseRemoteAndContainer(args[2])
- d, err := lxd.NewClient(config, remote)
+
+ remote, alias, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -317,7 +339,7 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
return errArgs
}
-func (c *imageCmd) run(config *lxd.Config, args []string) error {
+func (c *imageCmd) run(conf *config.Config, args []string) error {
var remote string
if len(args) < 1 {
@@ -329,7 +351,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
if len(args) < 2 {
return errArgs
}
- return c.doImageAlias(config, args)
+ return c.doImageAlias(conf, args)
case "copy":
/* copy [<remote>:]<image> [<rmeote>:]<image> */
@@ -337,22 +359,30 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- remote, inName := config.ParseRemoteAndContainer(args[1])
+ remote, inName, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if inName == "" {
inName = "default"
}
- destRemote, outName := config.ParseRemoteAndContainer(args[2])
+ destRemote, outName, err := conf.ParseRemote(args[2])
+ if err != nil {
+ return err
+ }
+
if outName != "" {
return errArgs
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
- dest, err := lxd.NewClient(config, destRemote)
+ dest, err := lxd.NewClient(conf.Legacy(), destRemote)
if err != nil {
return err
}
@@ -373,12 +403,17 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
}
for _, arg := range args[1:] {
- remote, inName := config.ParseRemoteAndContainer(arg)
+ var err error
+ remote, inName, err := conf.ParseRemote(arg)
+ if err != nil {
+ return err
+ }
+
if inName == "" {
inName = "default"
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -430,12 +465,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- remote, inName := config.ParseRemoteAndContainer(args[1])
+ remote, inName, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if inName == "" {
inName = "default"
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -512,7 +551,11 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
split := strings.Split(arg, "=")
if len(split) == 1 || shared.PathExists(arg) {
if strings.HasSuffix(arg, ":") {
- remote = config.ParseRemote(arg)
+ var err error
+ remote, _, err = conf.ParseRemote(arg)
+ if err != nil {
+ return err
+ }
} else {
if imageFile == "" {
imageFile = args[1]
@@ -526,7 +569,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
}
if remote == "" {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
if imageFile == "" {
@@ -534,7 +577,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
properties = properties[1:]
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -576,12 +619,22 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
result := strings.SplitN(args[1], ":", 2)
if len(result) == 1 {
filters = append(filters, args[1])
- remote, _ = config.ParseRemoteAndContainer("")
+
+ remote, _, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
} else {
- remote, _ = config.ParseRemoteAndContainer(args[1])
+ remote, _, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
}
} else {
- remote, _ = config.ParseRemoteAndContainer("")
+ remote, _, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
}
if len(args) > 2 {
@@ -590,7 +643,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
}
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -616,12 +669,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- remote, inName := config.ParseRemoteAndContainer(args[1])
+ remote, inName, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if inName == "" {
inName = "default"
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -638,12 +695,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- remote, inName := config.ParseRemoteAndContainer(args[1])
+ remote, inName, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if inName == "" {
inName = "default"
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -670,12 +731,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- remote, inName := config.ParseRemoteAndContainer(args[1])
+ remote, inName, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if inName == "" {
inName = "default"
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -838,12 +903,12 @@ func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
}
// Extract the current value
- config, err := client.GetImageInfo(image)
+ imgInfo, err := client.GetImageInfo(image)
if err != nil {
return err
}
- brief := config.Writable()
+ brief := imgInfo.Writable()
data, err := yaml.Marshal(&brief)
if err != nil {
return err
diff --git a/lxc/info.go b/lxc/info.go
index 80ce79509..fe6b6f6a3 100644
--- a/lxc/info.go
+++ b/lxc/info.go
@@ -8,6 +8,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -38,16 +39,23 @@ func (c *infoCmd) flags() {
gnuflag.BoolVar(&c.showLog, "show-log", false, i18n.G("Show the container's last 100 log lines?"))
}
-func (c *infoCmd) run(config *lxd.Config, args []string) error {
+func (c *infoCmd) run(conf *config.Config, args []string) error {
var remote string
var cName string
+ var err error
if len(args) == 1 {
- remote, cName = config.ParseRemoteAndContainer(args[0])
+ remote, cName, err = conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
} else {
- remote, cName = config.ParseRemoteAndContainer("")
+ remote, cName, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/init.go b/lxc/init.go
index cf3181294..17f611eb5 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -6,6 +6,7 @@ import (
"strings"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -144,22 +145,31 @@ func (c *initCmd) flags() {
gnuflag.StringVar(&c.storagePool, "s", "", i18n.G("Storage pool name"))
}
-func (c *initCmd) run(config *lxd.Config, args []string) error {
+func (c *initCmd) run(conf *config.Config, args []string) error {
if len(args) > 2 || len(args) < 1 {
return errArgs
}
- iremote, image := config.ParseRemoteAndContainer(args[0])
+ iremote, image, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
var name string
var remote string
if len(args) == 2 {
- remote, name = config.ParseRemoteAndContainer(args[1])
+ remote, name, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
} else {
- remote, name = config.ParseRemoteAndContainer("")
+ remote, name, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -182,7 +192,7 @@ func (c *initCmd) run(config *lxd.Config, args []string) error {
fmt.Printf(i18n.G("Creating %s")+"\n", name)
}
- iremote, image = c.guessImage(config, d, remote, iremote, image)
+ iremote, image = c.guessImage(conf, d, remote, iremote, image)
devicesMap := map[string]map[string]string{}
if c.network != "" {
@@ -287,12 +297,12 @@ func (c *initCmd) initProgressTracker(d *lxd.Client, progress *ProgressRenderer,
go d.Monitor([]string{"operation"}, handler, nil)
}
-func (c *initCmd) guessImage(config *lxd.Config, d *lxd.Client, remote string, iremote string, image string) (string, string) {
+func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string, iremote string, image string) (string, string) {
if remote != iremote {
return iremote, image
}
- _, ok := config.Remotes[image]
+ _, ok := conf.Remotes[image]
if !ok {
return iremote, image
}
diff --git a/lxc/launch.go b/lxc/launch.go
index 06897069d..424d85834 100644
--- a/lxc/launch.go
+++ b/lxc/launch.go
@@ -5,6 +5,7 @@ import (
"strings"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/i18n"
@@ -37,22 +38,31 @@ func (c *launchCmd) flags() {
c.init.flags()
}
-func (c *launchCmd) run(config *lxd.Config, args []string) error {
+func (c *launchCmd) run(conf *config.Config, args []string) error {
if len(args) > 2 || len(args) < 1 {
return errArgs
}
- iremote, image := config.ParseRemoteAndContainer(args[0])
+ iremote, image, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
var name string
var remote string
if len(args) == 2 {
- remote, name = config.ParseRemoteAndContainer(args[1])
+ remote, name, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
} else {
- remote, name = config.ParseRemoteAndContainer("")
+ remote, name, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -67,7 +77,7 @@ func (c *launchCmd) run(config *lxd.Config, args []string) error {
profiles = append(profiles, p)
}
- iremote, image = c.init.guessImage(config, d, remote, iremote, image)
+ iremote, image = c.init.guessImage(conf, d, remote, iremote, image)
devicesMap := map[string]map[string]string{}
if c.init.network != "" {
diff --git a/lxc/list.go b/lxc/list.go
index d4a465df5..0866156ce 100644
--- a/lxc/list.go
+++ b/lxc/list.go
@@ -15,6 +15,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -400,7 +401,7 @@ type listContainerItem struct {
Snapshots []api.ContainerSnapshot `json:"snapshots" yaml:"snapshots"`
}
-func (c *listCmd) run(config *lxd.Config, args []string) error {
+func (c *listCmd) run(conf *config.Config, args []string) error {
var remote string
name := ""
@@ -409,20 +410,25 @@ func (c *listCmd) run(config *lxd.Config, args []string) error {
if len(args) != 0 {
filters = args
if strings.Contains(args[0], ":") && !strings.Contains(args[0], "=") {
- remote, name = config.ParseRemoteAndContainer(args[0])
+ var err error
+ remote, name, err = conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
+
filters = args[1:]
} else if !strings.Contains(args[0], "=") {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
name = args[0]
}
}
filters = append(filters, name)
if remote == "" {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/main.go b/lxc/main.go
index a8af4beab..3d0c245d9 100644
--- a/lxc/main.go
+++ b/lxc/main.go
@@ -5,15 +5,17 @@ import (
"os"
"os/exec"
"path"
+ "path/filepath"
"strings"
"syscall"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
"github.com/lxc/lxd/shared/logger"
"github.com/lxc/lxd/shared/logging"
+ "github.com/lxc/lxd/shared/version"
)
var configPath string
@@ -25,7 +27,7 @@ func main() {
if err := run(); err != nil {
msg := fmt.Sprintf(i18n.G("error: %v"), err)
- lxdErr := lxd.GetLocalLXDErr(err)
+ lxdErr := getLocalErr(err)
switch lxdErr {
case syscall.ENOENT:
msg = i18n.G("LXD socket not found; is LXD installed and running?")
@@ -74,18 +76,24 @@ func run() error {
os.Exit(1)
}
- var config *lxd.Config
+ var conf *config.Config
var err error
if *forceLocal {
- config = &lxd.DefaultConfig
- } else {
- config, err = lxd.LoadConfig(configPath)
+ conf = &config.DefaultConfig
+ } else if shared.PathExists(configPath) {
+ conf, err = config.LoadConfig(configPath)
if err != nil {
return err
}
+ } else {
+ conf = &config.DefaultConfig
+ conf.ConfigDir = filepath.Dir(configPath)
}
+ // Set the user agent
+ conf.UserAgent = version.UserAgent
+
// This is quite impolite, but it seems gnuflag needs us to shift our
// own exename out of the arguments before parsing them. However, this
// is useful for execIfAlias, which wants to know exactly the command
@@ -98,7 +106,7 @@ func run() error {
* --no-alias by hand.
*/
if !shared.StringInSlice("--no-alias", origArgs) {
- execIfAliases(config, origArgs)
+ execIfAliases(conf, origArgs)
}
cmd, ok := commands[name]
if !ok {
@@ -128,10 +136,16 @@ func run() error {
// and this is the first time the client has been run by the user, then check to see
// if LXD has been properly configured. Don't display the message if the var path
// does not exist (LXD not installed), as the user may be targeting a remote daemon.
- if os.Args[0] != "help" && os.Args[0] != "version" && shared.PathExists(shared.VarPath("")) && !shared.PathExists(config.ConfigDir) {
+ if os.Args[0] != "help" && os.Args[0] != "version" && shared.PathExists(shared.VarPath("")) && !shared.PathExists(conf.ConfigDir) {
// Create the config dir so that we don't get in here again for this user.
- err = os.MkdirAll(config.ConfigDir, 0750)
+ err = os.MkdirAll(conf.ConfigDir, 0750)
+ if err != nil {
+ return err
+ }
+
+ // And save the initial configuration
+ err = conf.SaveConfig(configPath)
if err != nil {
return err
}
@@ -140,7 +154,7 @@ func run() error {
fmt.Fprintf(os.Stderr, i18n.G("To start your first container, try: lxc launch ubuntu:16.04")+"\n\n")
}
- err = cmd.run(config, gnuflag.Args())
+ err = cmd.run(conf, gnuflag.Args())
if err == errArgs || err == errUsage {
out := os.Stdout
if err == errArgs {
@@ -148,7 +162,7 @@ func run() error {
* expand this as an alias
*/
if !*noAlias {
- execIfAliases(config, origArgs)
+ execIfAliases(conf, origArgs)
}
out = os.Stderr
@@ -177,7 +191,7 @@ type command interface {
usage() string
flags()
showByDefault() bool
- run(config *lxd.Config, args []string) error
+ run(conf *config.Config, args []string) error
}
var commands = map[string]command{
@@ -286,8 +300,8 @@ func findAlias(aliases map[string]string, origArgs []string) ([]string, []string
return aliasKey, aliasValue, foundAlias
}
-func expandAlias(config *lxd.Config, origArgs []string) ([]string, bool) {
- aliasKey, aliasValue, foundAlias := findAlias(config.Aliases, origArgs)
+func expandAlias(conf *config.Config, origArgs []string) ([]string, bool) {
+ aliasKey, aliasValue, foundAlias := findAlias(conf.Aliases, origArgs)
if !foundAlias {
aliasKey, aliasValue, foundAlias = findAlias(defaultAliases, origArgs)
if !foundAlias {
@@ -320,8 +334,8 @@ func expandAlias(config *lxd.Config, origArgs []string) ([]string, bool) {
return newArgs, true
}
-func execIfAliases(config *lxd.Config, origArgs []string) {
- newArgs, expanded := expandAlias(config, origArgs)
+func execIfAliases(conf *config.Config, origArgs []string) {
+ newArgs, expanded := expandAlias(conf, origArgs)
if !expanded {
return
}
diff --git a/lxc/main_test.go b/lxc/main_test.go
index 30fc0cb6f..cb7fd81d6 100644
--- a/lxc/main_test.go
+++ b/lxc/main_test.go
@@ -3,7 +3,7 @@ package main
import (
"testing"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
)
type aliasTestcase struct {
@@ -54,7 +54,7 @@ func TestExpandAliases(t *testing.T) {
},
}
- conf := &lxd.Config{Aliases: aliases}
+ conf := &config.Config{Aliases: aliases}
for _, tc := range testcases {
result, expanded := expandAlias(conf, tc.input)
diff --git a/lxc/manpage.go b/lxc/manpage.go
index 697f015d4..edf3ceb9e 100644
--- a/lxc/manpage.go
+++ b/lxc/manpage.go
@@ -6,7 +6,7 @@ import (
"os/exec"
"path/filepath"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/i18n"
)
@@ -26,7 +26,7 @@ Generate all the LXD manpages.`)
func (c *manpageCmd) flags() {
}
-func (c *manpageCmd) run(_ *lxd.Config, args []string) error {
+func (c *manpageCmd) run(conf *config.Config, args []string) error {
if len(args) != 1 {
return errArgs
}
diff --git a/lxc/monitor.go b/lxc/monitor.go
index 3b5d1b8c7..4c428afe4 100644
--- a/lxc/monitor.go
+++ b/lxc/monitor.go
@@ -6,6 +6,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
)
@@ -56,7 +57,8 @@ func (c *monitorCmd) flags() {
gnuflag.Var(&c.typeArgs, "type", i18n.G("Event type to listen for"))
}
-func (c *monitorCmd) run(config *lxd.Config, args []string) error {
+func (c *monitorCmd) run(conf *config.Config, args []string) error {
+ var err error
var remote string
if len(args) > 1 {
@@ -64,12 +66,18 @@ func (c *monitorCmd) run(config *lxd.Config, args []string) error {
}
if len(args) == 0 {
- remote, _ = config.ParseRemoteAndContainer("")
+ remote, _, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
} else {
- remote, _ = config.ParseRemoteAndContainer(args[0])
+ remote, _, err = conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
}
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/move.go b/lxc/move.go
index 1e7e70ce4..27440fffd 100644
--- a/lxc/move.go
+++ b/lxc/move.go
@@ -2,6 +2,7 @@ package main
import (
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/i18n"
"github.com/lxc/lxd/shared/gnuflag"
@@ -35,13 +36,20 @@ func (c *moveCmd) flags() {
gnuflag.BoolVar(&c.containerOnly, "container-only", false, i18n.G("Move the container without its snapshots"))
}
-func (c *moveCmd) run(config *lxd.Config, args []string) error {
+func (c *moveCmd) run(conf *config.Config, args []string) error {
if len(args) != 2 {
return errArgs
}
- sourceRemote, sourceName := config.ParseRemoteAndContainer(args[0])
- destRemote, destName := config.ParseRemoteAndContainer(args[1])
+ sourceRemote, sourceName, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
+
+ destRemote, destName, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
// As an optimization, if the source an destination are the same, do
// this via a simple rename. This only works for containers that aren't
@@ -49,7 +57,7 @@ func (c *moveCmd) run(config *lxd.Config, args []string) error {
// course, this changing of hostname isn't supported right now, so this
// simply won't work).
if sourceRemote == destRemote {
- source, err := lxd.NewClient(config, sourceRemote)
+ source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
if err != nil {
return err
}
@@ -66,10 +74,10 @@ func (c *moveCmd) run(config *lxd.Config, args []string) error {
// A move is just a copy followed by a delete; however, we want to
// keep the volatile entries around since we are moving the container.
- err := cpy.copyContainer(config, args[0], args[1], true, -1, true, c.containerOnly)
+ err = cpy.copyContainer(conf, args[0], args[1], true, -1, true, c.containerOnly)
if err != nil {
return err
}
- return commands["delete"].run(config, args[:1])
+ return commands["delete"].run(conf, args[:1])
}
diff --git a/lxc/network.go b/lxc/network.go
index be0dfcd58..63f0fc222 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -12,6 +12,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/i18n"
@@ -94,21 +95,25 @@ cat network.yaml | lxc network edit <network>
func (c *networkCmd) flags() {}
-func (c *networkCmd) run(config *lxd.Config, args []string) error {
+func (c *networkCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errUsage
}
if args[0] == "list" {
- return c.doNetworkList(config, args)
+ return c.doNetworkList(conf, args)
}
if len(args) < 2 {
return errArgs
}
- remote, network := config.ParseRemoteAndContainer(args[1])
- client, err := lxd.NewClient(config, remote)
+ remote, network, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -413,19 +418,25 @@ func (c *networkCmd) doNetworkGet(client *lxd.Client, name string, args []string
return nil
}
-func (c *networkCmd) doNetworkList(config *lxd.Config, args []string) error {
+func (c *networkCmd) doNetworkList(conf *config.Config, args []string) error {
var remote string
+ var err error
+
if len(args) > 1 {
var name string
- remote, name = config.ParseRemoteAndContainer(args[1])
+ remote, name, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if name != "" {
return fmt.Errorf(i18n.G("Cannot provide container name to list"))
}
} else {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
- client, err := lxd.NewClient(config, remote)
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/profile.go b/lxc/profile.go
index 70221a499..6c9401659 100644
--- a/lxc/profile.go
+++ b/lxc/profile.go
@@ -11,6 +11,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/i18n"
@@ -127,21 +128,25 @@ lxc profile assign foo ''
func (c *profileCmd) flags() {}
-func (c *profileCmd) run(config *lxd.Config, args []string) error {
+func (c *profileCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errUsage
}
if args[0] == "list" {
- return c.doProfileList(config, args)
+ return c.doProfileList(conf, args)
}
if len(args) < 2 {
return errArgs
}
- remote, profile := config.ParseRemoteAndContainer(args[1])
- client, err := lxd.NewClient(config, remote)
+ remote, profile, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -152,7 +157,7 @@ func (c *profileCmd) run(config *lxd.Config, args []string) error {
case "delete":
return c.doProfileDelete(client, profile)
case "device":
- return c.doProfileDevice(config, args)
+ return c.doProfileDevice(conf, args)
case "edit":
return c.doProfileEdit(client, profile)
case "apply", "assign":
@@ -195,7 +200,7 @@ func (c *profileCmd) run(config *lxd.Config, args []string) error {
case "unset":
return c.doProfileUnset(client, profile, args[2:])
case "copy":
- return c.doProfileCopy(config, client, profile, args[2:])
+ return c.doProfileCopy(conf, client, profile, args[2:])
case "show":
return c.doProfileShow(client, profile)
default:
@@ -363,16 +368,21 @@ func (c *profileCmd) doProfileShow(client *lxd.Client, p string) error {
return nil
}
-func (c *profileCmd) doProfileCopy(config *lxd.Config, client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileCopy(conf *config.Config, client *lxd.Client, p string, args []string) error {
if len(args) != 1 {
return errArgs
}
- remote, newname := config.ParseRemoteAndContainer(args[0])
+
+ remote, newname, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
+
if newname == "" {
newname = p
}
- dest, err := lxd.NewClient(config, remote)
+ dest, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -380,7 +390,7 @@ func (c *profileCmd) doProfileCopy(config *lxd.Config, client *lxd.Client, p str
return client.ProfileCopy(p, newname, dest)
}
-func (c *profileCmd) doProfileDevice(config *lxd.Config, args []string) error {
+func (c *profileCmd) doProfileDevice(conf *config.Config, args []string) error {
// device add b1 eth0 nic type=bridged
// device list b1
// device remove b1 eth0
@@ -392,19 +402,19 @@ func (c *profileCmd) doProfileDevice(config *lxd.Config, args []string) error {
switch args[1] {
case "add":
- return cfg.deviceAdd(config, "profile", args)
+ return cfg.deviceAdd(conf, "profile", args)
case "remove":
- return cfg.deviceRm(config, "profile", args)
+ return cfg.deviceRm(conf, "profile", args)
case "list":
- return cfg.deviceList(config, "profile", args)
+ return cfg.deviceList(conf, "profile", args)
case "show":
- return cfg.deviceShow(config, "profile", args)
+ return cfg.deviceShow(conf, "profile", args)
case "get":
- return cfg.deviceGet(config, "profile", args)
+ return cfg.deviceGet(conf, "profile", args)
case "set":
- return cfg.deviceSet(config, "profile", args)
+ return cfg.deviceSet(conf, "profile", args)
case "unset":
- return cfg.deviceUnset(config, "profile", args)
+ return cfg.deviceUnset(conf, "profile", args)
default:
return errArgs
}
@@ -463,19 +473,24 @@ func (c *profileCmd) doProfileUnset(client *lxd.Client, p string, args []string)
return c.doProfileSet(client, p, args)
}
-func (c *profileCmd) doProfileList(config *lxd.Config, args []string) error {
+func (c *profileCmd) doProfileList(conf *config.Config, args []string) error {
var remote string
if len(args) > 1 {
var name string
- remote, name = config.ParseRemoteAndContainer(args[1])
+ var err error
+ remote, name, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if name != "" {
return fmt.Errorf(i18n.G("Cannot provide container name to list"))
}
} else {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
- client, err := lxd.NewClient(config, remote)
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/publish.go b/lxc/publish.go
index b932dfac9..04305d025 100644
--- a/lxc/publish.go
+++ b/lxc/publish.go
@@ -5,6 +5,7 @@ import (
"strings"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -38,9 +39,7 @@ func (c *publishCmd) flags() {
gnuflag.StringVar(&c.compression_algorithm, "compression", "", i18n.G("Define a compression algorithm: for image or none"))
}
-func (c *publishCmd) run(config *lxd.Config, args []string) error {
- var cRemote string
- var cName string
+func (c *publishCmd) run(conf *config.Config, args []string) error {
iName := ""
iRemote := ""
properties := map[string]string{}
@@ -50,12 +49,22 @@ func (c *publishCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- cRemote, cName = config.ParseRemoteAndContainer(args[0])
+ cRemote, cName, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
+
if len(args) >= 2 && !strings.Contains(args[1], "=") {
firstprop = 2
- iRemote, iName = config.ParseRemoteAndContainer(args[1])
+ iRemote, iName, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
} else {
- iRemote, iName = config.ParseRemoteAndContainer("")
+ iRemote, iName, err = conf.ParseRemote("")
+ if err != nil {
+ return err
+ }
}
if cName == "" {
@@ -65,14 +74,14 @@ func (c *publishCmd) run(config *lxd.Config, args []string) error {
return fmt.Errorf(i18n.G("There is no \"image name\". Did you want an alias?"))
}
- d, err := lxd.NewClient(config, iRemote)
+ d, err := lxd.NewClient(conf.Legacy(), iRemote)
if err != nil {
return err
}
s := d
if cRemote != iRemote {
- s, err = lxd.NewClient(config, cRemote)
+ s, err = lxd.NewClient(conf.Legacy(), cRemote)
if err != nil {
return err
}
diff --git a/lxc/remote.go b/lxc/remote.go
index d9b04eddb..519dd584b 100644
--- a/lxc/remote.go
+++ b/lxc/remote.go
@@ -17,6 +17,7 @@ import (
"golang.org/x/crypto/ssh/terminal"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -69,13 +70,13 @@ func (c *remoteCmd) flags() {
gnuflag.BoolVar(&c.public, "public", false, i18n.G("Public image server"))
}
-func (c *remoteCmd) generateClientCertificate(config *lxd.Config) error {
+func (c *remoteCmd) generateClientCertificate(conf *config.Config) error {
// Generate a client certificate if necessary. The default repositories are
// either local or public, neither of which requires a client certificate.
// Generation of the cert is delayed to avoid unnecessary overhead, e.g in
// testing scenarios where only the default repositories are used.
- certf := config.ConfigPath("client.crt")
- keyf := config.ConfigPath("client.key")
+ certf := conf.ConfigPath("client.crt")
+ keyf := conf.ConfigPath("client.key")
if !shared.PathExists(certf) || !shared.PathExists(keyf) {
fmt.Fprintf(os.Stderr, i18n.G("Generating a client certificate. This may take a minute...")+"\n")
@@ -113,14 +114,14 @@ func (c *remoteCmd) getRemoteCertificate(address string) (*x509.Certificate, err
return resp.TLS.PeerCertificates[0], nil
}
-func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, acceptCert bool, password string, public bool, protocol string) error {
+func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, acceptCert bool, password string, public bool, protocol string) error {
var rScheme string
var rHost string
var rPort string
// Setup the remotes list
- if config.Remotes == nil {
- config.Remotes = make(map[string]lxd.RemoteConfig)
+ if conf.Remotes == nil {
+ conf.Remotes = make(map[string]config.Remote)
}
/* Complex remote URL parsing */
@@ -135,7 +136,7 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
return fmt.Errorf(i18n.G("Only https URLs are supported for simplestreams"))
}
- config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Public: true, Protocol: protocol}
+ conf.Remotes[server] = config.Remote{Addr: addr, Public: true, Protocol: protocol}
return nil
}
@@ -194,15 +195,14 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
// HTTPS server then we need to ensure we have a client certificate before
// adding the remote server.
if rScheme != "unix" && !public {
- err = c.generateClientCertificate(config)
+ err = c.generateClientCertificate(conf)
if err != nil {
return err
}
}
- config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Protocol: protocol}
+ conf.Remotes[server] = config.Remote{Addr: addr, Protocol: protocol}
- remote := config.ParseRemote(server)
- d, err := lxd.NewClient(config, remote)
+ d, err := lxd.NewClient(conf.Legacy(), server)
if err != nil {
return err
}
@@ -257,14 +257,14 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
certOut.Close()
// Setup a new connection, this time with the remote certificate
- d, err = lxd.NewClient(config, remote)
+ d, err = lxd.NewClient(conf.Legacy(), server)
if err != nil {
return err
}
}
if d.IsPublic() || public {
- config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Public: true}
+ conf.Remotes[server] = config.Remote{Addr: addr, Public: true}
if _, err := d.GetServerConfig(); err != nil {
return err
@@ -306,14 +306,14 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
return nil
}
-func (c *remoteCmd) removeCertificate(config *lxd.Config, remote string) {
- certf := config.ServerCertPath(remote)
+func (c *remoteCmd) removeCertificate(conf *config.Config, remote string) {
+ certf := conf.ServerCertPath(remote)
logger.Debugf("Trying to remove %s", certf)
os.Remove(certf)
}
-func (c *remoteCmd) run(config *lxd.Config, args []string) error {
+func (c *remoteCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errUsage
}
@@ -330,14 +330,14 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
fqdn = args[2]
}
- if rc, ok := config.Remotes[remote]; ok {
+ if rc, ok := conf.Remotes[remote]; ok {
return fmt.Errorf(i18n.G("remote %s exists as <%s>"), remote, rc.Addr)
}
- err := c.addServer(config, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol)
+ err := c.addServer(conf, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol)
if err != nil {
- delete(config.Remotes, remote)
- c.removeCertificate(config, remote)
+ delete(conf.Remotes, remote)
+ c.removeCertificate(conf, remote)
return err
}
@@ -346,7 +346,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- rc, ok := config.Remotes[args[1]]
+ rc, ok := conf.Remotes[args[1]]
if !ok {
return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
}
@@ -355,17 +355,17 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1])
}
- if config.DefaultRemote == args[1] {
+ if conf.DefaultRemote == args[1] {
return fmt.Errorf(i18n.G("can't remove the default remote"))
}
- delete(config.Remotes, args[1])
+ delete(conf.Remotes, args[1])
- c.removeCertificate(config, args[1])
+ c.removeCertificate(conf, args[1])
case "list":
data := [][]string{}
- for name, rc := range config.Remotes {
+ for name, rc := range conf.Remotes {
strPublic := i18n.G("NO")
if rc.Public {
strPublic = i18n.G("YES")
@@ -381,7 +381,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
}
strName := name
- if name == config.DefaultRemote {
+ if name == conf.DefaultRemote {
strName = fmt.Sprintf("%s (%s)", name, i18n.G("default"))
}
data = append(data, []string{strName, rc.Addr, rc.Protocol, strPublic, strStatic})
@@ -408,7 +408,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- rc, ok := config.Remotes[args[1]]
+ rc, ok := conf.Remotes[args[1]]
if !ok {
return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
}
@@ -417,13 +417,13 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1])
}
- if _, ok := config.Remotes[args[2]]; ok {
+ if _, ok := conf.Remotes[args[2]]; ok {
return fmt.Errorf(i18n.G("remote %s already exists"), args[2])
}
// Rename the certificate file
- oldPath := filepath.Join(config.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[1]))
- newPath := filepath.Join(config.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[2]))
+ oldPath := filepath.Join(conf.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[1]))
+ newPath := filepath.Join(conf.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[2]))
if shared.PathExists(oldPath) {
err := os.Rename(oldPath, newPath)
if err != nil {
@@ -431,11 +431,11 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
}
}
- config.Remotes[args[2]] = rc
- delete(config.Remotes, args[1])
+ conf.Remotes[args[2]] = rc
+ delete(conf.Remotes, args[1])
- if config.DefaultRemote == args[1] {
- config.DefaultRemote = args[2]
+ if conf.DefaultRemote == args[1] {
+ conf.DefaultRemote = args[2]
}
case "set-url":
@@ -443,7 +443,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
- rc, ok := config.Remotes[args[1]]
+ rc, ok := conf.Remotes[args[1]]
if !ok {
return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
}
@@ -452,28 +452,28 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1])
}
- config.Remotes[args[1]] = lxd.RemoteConfig{Addr: args[2]}
+ conf.Remotes[args[1]] = config.Remote{Addr: args[2]}
case "set-default":
if len(args) != 2 {
return errArgs
}
- _, ok := config.Remotes[args[1]]
+ _, ok := conf.Remotes[args[1]]
if !ok {
return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
}
- config.DefaultRemote = args[1]
+ conf.DefaultRemote = args[1]
case "get-default":
if len(args) != 1 {
return errArgs
}
- fmt.Println(config.DefaultRemote)
+ fmt.Println(conf.DefaultRemote)
return nil
default:
return errArgs
}
- return lxd.SaveConfig(config, configPath)
+ return conf.SaveConfig(configPath)
}
diff --git a/lxc/restore.go b/lxc/restore.go
index cd4024b44..e9d02a947 100644
--- a/lxc/restore.go
+++ b/lxc/restore.go
@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -37,15 +38,19 @@ func (c *restoreCmd) flags() {
gnuflag.BoolVar(&c.stateful, "stateful", false, i18n.G("Whether or not to restore the container's running state from snapshot (if available)"))
}
-func (c *restoreCmd) run(config *lxd.Config, args []string) error {
+func (c *restoreCmd) run(conf *config.Config, args []string) error {
if len(args) < 2 {
return errArgs
}
var snapname = args[1]
- remote, name := config.ParseRemoteAndContainer(args[0])
- d, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/snapshot.go b/lxc/snapshot.go
index 7f92b0432..9472e3b47 100644
--- a/lxc/snapshot.go
+++ b/lxc/snapshot.go
@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -35,7 +36,7 @@ func (c *snapshotCmd) flags() {
gnuflag.BoolVar(&c.stateful, "stateful", false, i18n.G("Whether or not to snapshot the container's running state"))
}
-func (c *snapshotCmd) run(config *lxd.Config, args []string) error {
+func (c *snapshotCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errArgs
}
@@ -47,8 +48,12 @@ func (c *snapshotCmd) run(config *lxd.Config, args []string) error {
snapname = args[1]
}
- remote, name := config.ParseRemoteAndContainer(args[0])
- d, err := lxd.NewClient(config, remote)
+ remote, name, err := conf.ParseRemote(args[0])
+ if err != nil {
+ return err
+ }
+
+ d, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/storage.go b/lxc/storage.go
index abd34efc7..484f6e13d 100644
--- a/lxc/storage.go
+++ b/lxc/storage.go
@@ -13,6 +13,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/i18n"
@@ -143,21 +144,25 @@ lxc storage volume show default container/data
func (c *storageCmd) flags() {}
-func (c *storageCmd) run(config *lxd.Config, args []string) error {
+func (c *storageCmd) run(conf *config.Config, args []string) error {
if len(args) < 1 {
return errUsage
}
if args[0] == "list" {
- return c.doStoragePoolsList(config, args)
+ return c.doStoragePoolsList(conf, args)
}
if len(args) < 2 {
return errArgs
}
- remote, sub := config.ParseRemoteAndContainer(args[1])
- client, err := lxd.NewClient(config, remote)
+ remote, sub, err := conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -225,7 +230,7 @@ func (c *storageCmd) run(config *lxd.Config, args []string) error {
return errArgs
}
pool := args[2]
- return c.doStoragePoolVolumesList(config, remote, pool, args)
+ return c.doStoragePoolVolumesList(conf, remote, pool, args)
case "set":
if len(args) < 4 {
return errArgs
@@ -570,19 +575,24 @@ func (c *storageCmd) doStoragePoolGet(client *lxd.Client, name string, args []st
return nil
}
-func (c *storageCmd) doStoragePoolsList(config *lxd.Config, args []string) error {
+func (c *storageCmd) doStoragePoolsList(conf *config.Config, args []string) error {
var remote string
if len(args) > 1 {
var name string
- remote, name = config.ParseRemoteAndContainer(args[1])
+ var err error
+ remote, name, err = conf.ParseRemote(args[1])
+ if err != nil {
+ return err
+ }
+
if name != "" {
return fmt.Errorf(i18n.G("Cannot provide container name to list"))
}
} else {
- remote = config.DefaultRemote
+ remote = conf.DefaultRemote
}
- client, err := lxd.NewClient(config, remote)
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
@@ -670,8 +680,8 @@ func (c *storageCmd) doStoragePoolShow(client *lxd.Client, name string) error {
return nil
}
-func (c *storageCmd) doStoragePoolVolumesList(config *lxd.Config, remote string, pool string, args []string) error {
- client, err := lxd.NewClient(config, remote)
+func (c *storageCmd) doStoragePoolVolumesList(conf *config.Config, remote string, pool string, args []string) error {
+ client, err := lxd.NewClient(conf.Legacy(), remote)
if err != nil {
return err
}
diff --git a/lxc/utils.go b/lxc/utils.go
index 0a717cf94..4693a8175 100644
--- a/lxc/utils.go
+++ b/lxc/utils.go
@@ -2,7 +2,11 @@ package main
import (
"fmt"
+ "net"
+ "net/url"
+ "os"
"strings"
+ "syscall"
"github.com/lxc/lxd/client"
"github.com/lxc/lxd/shared/api"
@@ -194,3 +198,38 @@ func summaryLine(usage string) string {
return i18n.G("Missing summary.")
}
+
+// Used to return a user friendly error
+func getLocalErr(err error) error {
+ t, ok := err.(*url.Error)
+ if !ok {
+ return nil
+ }
+
+ u, ok := t.Err.(*net.OpError)
+ if !ok {
+ return nil
+ }
+
+ if u.Op == "dial" && u.Net == "unix" {
+ var lxdErr error
+
+ sysErr, ok := u.Err.(*os.SyscallError)
+ if ok {
+ lxdErr = sysErr.Err
+ } else {
+ // syscall.Errno may be returned on some systems, e.g. CentOS
+ lxdErr, ok = u.Err.(syscall.Errno)
+ if !ok {
+ return nil
+ }
+ }
+
+ switch lxdErr {
+ case syscall.ENOENT, syscall.ECONNREFUSED, syscall.EACCES:
+ return lxdErr
+ }
+ }
+
+ return nil
+}
diff --git a/lxc/version.go b/lxc/version.go
index 38595fdd6..34981936c 100644
--- a/lxc/version.go
+++ b/lxc/version.go
@@ -3,7 +3,7 @@ package main
import (
"fmt"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/i18n"
"github.com/lxc/lxd/shared/version"
)
@@ -24,7 +24,7 @@ Print the version number of this client tool.`)
func (c *versionCmd) flags() {
}
-func (c *versionCmd) run(_ *lxd.Config, args []string) error {
+func (c *versionCmd) run(conf *config.Config, args []string) error {
if len(args) > 0 {
return errArgs
}
From 589523f52d7692e9b64fd157b7a31f68526cf661 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 21:51:55 -0400
Subject: [PATCH 04/28] lxc/finger: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/finger.go | 17 ++++++-----------
test/suites/remote.sh | 1 -
2 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/lxc/finger.go b/lxc/finger.go
index 911fee24b..ec449b5f1 100644
--- a/lxc/finger.go
+++ b/lxc/finger.go
@@ -1,7 +1,6 @@
package main
import (
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/i18n"
)
@@ -26,25 +25,21 @@ func (c *fingerCmd) run(conf *config.Config, args []string) error {
return errArgs
}
- var remote string
- if len(args) == 1 {
+ // Parse the remote
+ remote := conf.DefaultRemote
+ if len(args) > 0 {
var err error
remote, _, err = conf.ParseRemote(args[0])
if err != nil {
return err
}
- } else {
- remote = conf.DefaultRemote
}
- // New client may or may not need to connect to the remote host, but
- // client.ServerStatus will at least request the basic information from
- // the server.
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ // Attempt to connect
+ _, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- _, err = client.ServerStatus()
- return err
+ return nil
}
diff --git a/test/suites/remote.sh b/test/suites/remote.sh
index 845ef995e..a88354319 100644
--- a/test/suites/remote.sh
+++ b/test/suites/remote.sh
@@ -17,7 +17,6 @@ test_remote_url() {
for url in ${urls}; do
lxc_remote remote add test "${url}"
- lxc_remote finger test:
lxc_remote remote remove test
done
}
From 14a9778eac10d54ea9ce692f1b550f22301c69d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:18:41 -0400
Subject: [PATCH 05/28] lxc/action: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/action.go | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/lxc/action.go b/lxc/action.go
index 5666d59ae..50351e408 100644
--- a/lxc/action.go
+++ b/lxc/action.go
@@ -5,7 +5,6 @@ import (
"os"
"strings"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -64,7 +63,7 @@ func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -74,7 +73,7 @@ func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
}
if c.action == shared.Start {
- current, err := d.ContainerInfo(name)
+ current, _, err := d.GetContainer(name)
if err != nil {
return err
}
@@ -90,16 +89,20 @@ func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
}
}
- resp, err := d.Action(name, c.action, c.timeout, c.force, state)
- if err != nil {
- return err
+ req := api.ContainerStatePut{
+ Action: string(c.action),
+ Timeout: c.timeout,
+ Force: c.force,
+ Stateful: state,
}
- if resp.Type != api.AsyncResponse {
- return fmt.Errorf(i18n.G("bad result type from action"))
+ op, err := d.UpdateContainerState(name, req, "")
+ if err != nil {
+ return err
}
- if err := d.WaitForSuccess(resp.Operation); err != nil {
+ err = op.Wait()
+ if err != nil {
return fmt.Errorf("%s\n"+i18n.G("Try `lxc info --show-log %s` for more info"), err, nameArg)
}
From 658ae4c58d74edbf30a67cdca51edf0f40f03a6e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:32:06 -0400
Subject: [PATCH 06/28] lxc/list: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/list.go | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/lxc/list.go b/lxc/list.go
index 0866156ce..3aeb4457b 100644
--- a/lxc/list.go
+++ b/lxc/list.go
@@ -14,7 +14,6 @@ import (
"github.com/olekukonko/tablewriter"
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -215,7 +214,7 @@ func (c *listCmd) shouldShow(filters []string, state *api.Container) bool {
return true
}
-func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters []string, columns []column) error {
+func (c *listCmd) listContainers(conf *config.Config, remote string, cinfos []api.Container, filters []string, columns []column) error {
headers := []string{}
for _, column := range columns {
headers = append(headers, column.Name)
@@ -239,7 +238,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
for i := 0; i < threads; i++ {
cStatesWg.Add(1)
go func() {
- d, err := lxd.NewClient(&d.Config, d.Name)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
cStatesWg.Done()
return
@@ -251,7 +250,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
break
}
- state, err := d.ContainerState(cName)
+ state, _, err := d.GetContainerState(cName)
if err != nil {
continue
}
@@ -265,7 +264,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
cSnapshotsWg.Add(1)
go func() {
- d, err := lxd.NewClient(&d.Config, d.Name)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
cSnapshotsWg.Done()
return
@@ -277,7 +276,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
break
}
- snaps, err := d.ListSnapshots(cName)
+ snaps, err := d.GetContainerSnapshots(cName)
if err != nil {
continue
}
@@ -428,13 +427,13 @@ func (c *listCmd) run(conf *config.Config, args []string) error {
remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
var cts []api.Container
- ctslist, err := d.ListContainers()
+ ctslist, err := d.GetContainers()
if err != nil {
return err
}
@@ -452,7 +451,7 @@ func (c *listCmd) run(conf *config.Config, args []string) error {
return err
}
- return c.listContainers(d, cts, filters, columns)
+ return c.listContainers(conf, remote, cts, filters, columns)
}
func (c *listCmd) parseColumns() ([]column, error) {
From b4317f4c73242644cd98d5481f553fe34a542921 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:35:56 -0400
Subject: [PATCH 07/28] lxc/monitor: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/monitor.go | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/lxc/monitor.go b/lxc/monitor.go
index 4c428afe4..41ec3ead3 100644
--- a/lxc/monitor.go
+++ b/lxc/monitor.go
@@ -5,7 +5,6 @@ import (
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
@@ -77,7 +76,12 @@ func (c *monitorCmd) run(conf *config.Config, args []string) error {
}
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
+ if err != nil {
+ return err
+ }
+
+ listener, err := d.GetEvents()
if err != nil {
return err
}
@@ -92,5 +96,10 @@ func (c *monitorCmd) run(conf *config.Config, args []string) error {
fmt.Printf("%s\n\n", render)
}
- return d.Monitor(c.typeArgs, handler, nil)
+ _, err = listener.AddHandler(c.typeArgs, handler)
+ if err != nil {
+ return err
+ }
+
+ return listener.Wait()
}
From 37244da92c4d8175f9e353e118fbfbc16bf794df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:40:22 -0400
Subject: [PATCH 08/28] lxc/delete: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/delete.go | 36 ++++++++++++++++++++++++------------
test/suites/basic.sh | 4 ++--
2 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/lxc/delete.go b/lxc/delete.go
index 2b1a00235..d112c3d03 100644
--- a/lxc/delete.go
+++ b/lxc/delete.go
@@ -6,7 +6,7 @@ import (
"os"
"strings"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -49,13 +49,23 @@ func (c *deleteCmd) promptDelete(name string) error {
return nil
}
-func (c *deleteCmd) doDelete(d *lxd.Client, name string) error {
- resp, err := d.Delete(name)
+func (c *deleteCmd) doDelete(d lxd.ContainerServer, name string) error {
+ var op *lxd.Operation
+ var err error
+
+ if shared.IsSnapshot(name) {
+ // Snapshot delete
+ fields := strings.SplitN(name, shared.SnapshotDelimiter, 2)
+ op, err = d.DeleteContainerSnapshot(fields[0], fields[1])
+ } else {
+ // Container delete
+ op, err = d.DeleteContainer(name)
+ }
if err != nil {
return err
}
- return d.WaitForSuccess(resp.Operation)
+ return op.Wait()
}
func (c *deleteCmd) run(conf *config.Config, args []string) error {
@@ -69,7 +79,7 @@ func (c *deleteCmd) run(conf *config.Config, args []string) error {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -85,7 +95,7 @@ func (c *deleteCmd) run(conf *config.Config, args []string) error {
return c.doDelete(d, name)
}
- ct, err := d.ContainerInfo(name)
+ ct, _, err := d.GetContainer(name)
if err != nil {
return err
}
@@ -95,18 +105,20 @@ func (c *deleteCmd) run(conf *config.Config, args []string) error {
return fmt.Errorf(i18n.G("The container is currently running, stop it first or pass --force."))
}
- resp, err := d.Action(name, shared.Stop, -1, true, false)
- if err != nil {
- return err
+ req := api.ContainerStatePut{
+ Action: "stop",
+ Timeout: -1,
+ Force: true,
}
- op, err := d.WaitFor(resp.Operation)
+ op, err := d.UpdateContainerState(name, req, "")
if err != nil {
return err
}
- if op.StatusCode == api.Failure {
- return fmt.Errorf(i18n.G("Stopping container failed!"))
+ err = op.Wait()
+ if err != nil {
+ return fmt.Errorf(i18n.G("Stopping the container failed: %s"), err)
}
if ct.Ephemeral == true {
diff --git a/test/suites/basic.sh b/test/suites/basic.sh
index 070b0c82d..318303be6 100644
--- a/test/suites/basic.sh
+++ b/test/suites/basic.sh
@@ -52,8 +52,8 @@ test_basic_usage() {
# Test custom filename for image export
lxc image export testimage "${LXD_DIR}/foo"
- [ "${sum}" = "$(sha256sum "${LXD_DIR}/foo.tar.xz" | cut -d' ' -f1)" ]
- rm "${LXD_DIR}/foo.tar.xz"
+ [ "${sum}" = "$(sha256sum "${LXD_DIR}/foo" | cut -d' ' -f1)" ]
+ rm "${LXD_DIR}/foo"
# Test image export with a split image.
From 3fafb67c71a6c324a06b954cf8e92c474a990d18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:44:29 -0400
Subject: [PATCH 09/28] lxc/snapshot: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/snapshot.go | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/lxc/snapshot.go b/lxc/snapshot.go
index 9472e3b47..dd3f0a88f 100644
--- a/lxc/snapshot.go
+++ b/lxc/snapshot.go
@@ -3,9 +3,9 @@ package main
import (
"fmt"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
+ "github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
)
@@ -48,25 +48,30 @@ func (c *snapshotCmd) run(conf *config.Config, args []string) error {
snapname = args[1]
}
+ // we don't allow '/' in snapshot names
+ if shared.IsSnapshot(snapname) {
+ return fmt.Errorf(i18n.G("'/' not allowed in snapshot name"))
+ }
+
remote, name, err := conf.ParseRemote(args[0])
if err != nil {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- // we don't allow '/' in snapshot names
- if shared.IsSnapshot(snapname) {
- return fmt.Errorf(i18n.G("'/' not allowed in snapshot name"))
+ req := api.ContainerSnapshotsPost{
+ Name: snapname,
+ Stateful: c.stateful,
}
- resp, err := d.Snapshot(name, snapname, c.stateful)
+ op, err := d.CreateContainerSnapshot(name, req)
if err != nil {
return err
}
- return d.WaitForSuccess(resp.Operation)
+ return op.Wait()
}
From d17424e43bdab72c7c1dc4f3dd94305e88d9de25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:53:29 -0400
Subject: [PATCH 10/28] lxc/restore: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/restore.go | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/lxc/restore.go b/lxc/restore.go
index e9d02a947..abffd32ca 100644
--- a/lxc/restore.go
+++ b/lxc/restore.go
@@ -3,9 +3,9 @@ package main
import (
"fmt"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
+ "github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
)
@@ -50,7 +50,7 @@ func (c *restoreCmd) run(conf *config.Config, args []string) error {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -59,10 +59,15 @@ func (c *restoreCmd) run(conf *config.Config, args []string) error {
snapname = fmt.Sprintf("%s/%s", name, snapname)
}
- resp, err := d.RestoreSnapshot(name, snapname, c.stateful)
+ req := api.ContainerPut{
+ Restore: snapname,
+ Stateful: c.stateful,
+ }
+
+ op, err := d.UpdateContainer(name, req, "")
if err != nil {
return err
}
- return d.WaitForSuccess(resp.Operation)
+ return op.Wait()
}
From fc6672bbdb177aecd3c3cdef0043fe257e046ae2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 23:11:30 -0400
Subject: [PATCH 11/28] lxc/exec: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/exec.go | 31 +++++++++++++++++++++++++++----
lxc/exec_unix.go | 3 +--
lxc/exec_windows.go | 3 +--
3 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/lxc/exec.go b/lxc/exec.go
index 03829a8e5..71278056f 100644
--- a/lxc/exec.go
+++ b/lxc/exec.go
@@ -13,6 +13,7 @@ import (
"github.com/gorilla/websocket"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -134,7 +135,7 @@ func (c *execCmd) run(conf *config.Config, args []string) error {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -198,7 +199,29 @@ func (c *execCmd) run(conf *config.Config, args []string) error {
}
stdout := c.getStdout()
- ret, err := d.Exec(name, args[1:], env, stdin, stdout, os.Stderr, handler, width, height)
+
+ req := api.ContainerExecPost{
+ Command: args[1:],
+ WaitForWS: true,
+ Interactive: interactive,
+ Environment: env,
+ Width: width,
+ Height: height,
+ }
+
+ execArgs := lxd.ContainerExecArgs{
+ Stdin: stdin,
+ Stdout: stdout,
+ Stderr: os.Stderr,
+ Control: handler,
+ }
+
+ op, err := d.ExecContainer(name, req, &execArgs)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
if err != nil {
return err
}
@@ -214,6 +237,6 @@ func (c *execCmd) run(conf *config.Config, args []string) error {
termios.Restore(cfd, oldttystate)
}
- os.Exit(ret)
- return fmt.Errorf(i18n.G("unreachable return reached"))
+ os.Exit(int(op.Metadata["return"].(float64)))
+ return nil
}
diff --git a/lxc/exec_unix.go b/lxc/exec_unix.go
index 7d3694663..7471e8423 100644
--- a/lxc/exec_unix.go
+++ b/lxc/exec_unix.go
@@ -10,7 +10,6 @@ import (
"github.com/gorilla/websocket"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/shared/logger"
)
@@ -22,7 +21,7 @@ func (c *execCmd) getTERM() (string, bool) {
return os.LookupEnv("TERM")
}
-func (c *execCmd) controlSocketHandler(d *lxd.Client, control *websocket.Conn) {
+func (c *execCmd) controlSocketHandler(control *websocket.Conn) {
ch := make(chan os.Signal, 10)
signal.Notify(ch,
syscall.SIGWINCH,
diff --git a/lxc/exec_windows.go b/lxc/exec_windows.go
index 21ec1b8f6..105219e29 100644
--- a/lxc/exec_windows.go
+++ b/lxc/exec_windows.go
@@ -9,7 +9,6 @@ import (
"github.com/gorilla/websocket"
"github.com/mattn/go-colorable"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/shared/logger"
)
@@ -32,7 +31,7 @@ func (c *execCmd) getTERM() (string, bool) {
return "dumb", true
}
-func (c *execCmd) controlSocketHandler(d *lxd.Client, control *websocket.Conn) {
+func (c *execCmd) controlSocketHandler(control *websocket.Conn) {
// TODO: figure out what the equivalent of signal.SIGWINCH is on
// windows and use that; for now if you resize your terminal it just
// won't work quite correctly.
From d7312d54815b3a3fec772d0898f71ccffb70435d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 23:19:40 -0400
Subject: [PATCH 12/28] lxc/info: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/info.go | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/lxc/info.go b/lxc/info.go
index fe6b6f6a3..2d3a7c989 100644
--- a/lxc/info.go
+++ b/lxc/info.go
@@ -7,7 +7,7 @@ import (
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
@@ -55,7 +55,7 @@ func (c *infoCmd) run(conf *config.Config, args []string) error {
}
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -63,12 +63,12 @@ func (c *infoCmd) run(conf *config.Config, args []string) error {
if cName == "" {
return c.remoteInfo(d)
} else {
- return c.containerInfo(d, cName, c.showLog)
+ return c.containerInfo(d, conf.Remotes[remote], cName, c.showLog)
}
}
-func (c *infoCmd) remoteInfo(d *lxd.Client) error {
- serverStatus, err := d.ServerStatus()
+func (c *infoCmd) remoteInfo(d lxd.ContainerServer) error {
+ serverStatus, _, err := d.GetServer()
if err != nil {
return err
}
@@ -83,13 +83,13 @@ func (c *infoCmd) remoteInfo(d *lxd.Client) error {
return nil
}
-func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error {
- ct, err := d.ContainerInfo(name)
+func (c *infoCmd) containerInfo(d lxd.ContainerServer, remote config.Remote, name string, showLog bool) error {
+ ct, _, err := d.GetContainer(name)
if err != nil {
return err
}
- cs, err := d.ContainerState(name)
+ cs, _, err := d.GetContainerState(name)
if err != nil {
return err
}
@@ -97,9 +97,10 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error
const layout = "2006/01/02 15:04 UTC"
fmt.Printf(i18n.G("Name: %s")+"\n", ct.Name)
- if d.Remote != nil && d.Remote.Addr != "" {
- fmt.Printf(i18n.G("Remote: %s")+"\n", d.Remote.Addr)
+ if remote.Addr != "" {
+ fmt.Printf(i18n.G("Remote: %s")+"\n", remote.Addr)
}
+
fmt.Printf(i18n.G("Architecture: %s")+"\n", ct.Architecture)
if shared.TimeIsSet(ct.CreatedAt) {
fmt.Printf(i18n.G("Created: %s")+"\n", ct.CreatedAt.UTC().Format(layout))
@@ -208,7 +209,7 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error
// List snapshots
first_snapshot := true
- snaps, err := d.ListSnapshots(name)
+ snaps, err := d.GetContainerSnapshots(name)
if err != nil {
return nil
}
@@ -236,7 +237,7 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error
}
if showLog {
- log, err := d.GetLog(name, "lxc.log")
+ log, err := d.GetContainerLogfile(name, "lxc.log")
if err != nil {
return err
}
From 2bd1a33cedcd6916287817cec7432995e7faa6c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 23:31:47 -0400
Subject: [PATCH 13/28] lxc/remote: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/remote.go | 59 +++++++++++++++++++++++++++++++++++------------------------
1 file changed, 35 insertions(+), 24 deletions(-)
diff --git a/lxc/remote.go b/lxc/remote.go
index 519dd584b..8d1c8269d 100644
--- a/lxc/remote.go
+++ b/lxc/remote.go
@@ -16,9 +16,9 @@ import (
"golang.org/x/crypto/ssh/terminal"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
+ "github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
"github.com/lxc/lxd/shared/logger"
@@ -202,21 +202,16 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
}
conf.Remotes[server] = config.Remote{Addr: addr, Protocol: protocol}
- d, err := lxd.NewClient(conf.Legacy(), server)
- if err != nil {
- return err
- }
+ // Attempt to connect
+ d, err := conf.GetContainerServer(server)
+ // Handle Unix socket connections
if strings.HasPrefix(addr, "unix:") {
- // NewClient succeeded so there was a lxd there (we fingered
- // it) so just accept it
- return nil
+ return err
}
+ // Check if the system CA worked for the TLS connection
var certificate *x509.Certificate
-
- /* Attempt to connect using the system root CA */
- _, err = d.GetServerConfig()
if err != nil {
// Failed to connect using the system CA, so retrieve the remote certificate
certificate, err = c.getRemoteCertificate(addr)
@@ -225,6 +220,7 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
}
}
+ // Handle certificate prompt
if certificate != nil {
if !acceptCert {
digest := shared.CertFingerprint(certificate)
@@ -241,13 +237,13 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
}
}
- dnam := d.Config.ConfigPath("servercerts")
+ dnam := conf.ConfigPath("servercerts")
err := os.MkdirAll(dnam, 0750)
if err != nil {
return fmt.Errorf(i18n.G("Could not create server cert dir"))
}
- certf := fmt.Sprintf("%s/%s.crt", dnam, d.Name)
+ certf := fmt.Sprintf("%s/%s.crt", dnam, server)
certOut, err := os.Create(certf)
if err != nil {
return err
@@ -257,27 +253,30 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
certOut.Close()
// Setup a new connection, this time with the remote certificate
- d, err = lxd.NewClient(conf.Legacy(), server)
+ d, err = conf.GetContainerServer(server)
if err != nil {
return err
}
}
- if d.IsPublic() || public {
- conf.Remotes[server] = config.Remote{Addr: addr, Public: true}
-
- if _, err := d.GetServerConfig(); err != nil {
- return err
- }
+ // Get server information
+ srv, _, err := d.GetServer()
+ if err != nil {
+ return err
+ }
+ // Detect a public remote
+ if srv.Public || public {
+ conf.Remotes[server] = config.Remote{Addr: addr, Public: true}
return nil
}
- if d.AmTrusted() {
- // server already has our cert, so we're done
+ // Check if our cert is already trusted
+ if srv.Auth == "trusted" {
return nil
}
+ // Prompt for trust password
if password == "" {
fmt.Printf(i18n.G("Admin password for %s: "), server)
pwd, err := terminal.ReadPassword(0)
@@ -293,12 +292,24 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
password = string(pwd)
}
- err = d.AddMyCertToServer(password)
+ // Add client certificate to trust store
+ req := api.CertificatesPost{
+ Password: password,
+ }
+ req.Type = "client"
+
+ err = d.CreateCertificate(req)
+ if err != nil {
+ return err
+ }
+
+ // And check if trusted now
+ srv, _, err = d.GetServer()
if err != nil {
return err
}
- if !d.AmTrusted() {
+ if srv.Auth != "trusted" {
return fmt.Errorf(i18n.G("Server doesn't trust us after adding our cert"))
}
From ba2ca93f7db97be30f75585a0d45a285d4584f48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 10 Apr 2017 13:48:56 -0400
Subject: [PATCH 14/28] lxc/network: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/network.go | 173 +++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 118 insertions(+), 55 deletions(-)
diff --git a/lxc/network.go b/lxc/network.go
index 63f0fc222..96b826e03 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -11,7 +11,7 @@ import (
"github.com/olekukonko/tablewriter"
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -113,7 +113,7 @@ func (c *networkCmd) run(conf *config.Config, args []string) error {
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -146,72 +146,120 @@ func (c *networkCmd) run(conf *config.Config, args []string) error {
}
}
-func (c *networkCmd) doNetworkAttach(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkAttach(client lxd.ContainerServer, name string, args []string) error {
if len(args) < 1 || len(args) > 3 {
return errArgs
}
- container := args[0]
+ // Default name is same as network
devName := name
if len(args) > 1 {
devName = args[1]
}
- network, err := client.NetworkGet(name)
+ // Get the network entry
+ network, _, err := client.GetNetwork(name)
if err != nil {
return err
}
- nicType := "macvlan"
+ // Prepare the container's device entry
+ device := map[string]string{
+ "type": "nic",
+ "nictype": "macvlan",
+ "parent": name,
+ }
+
if network.Type == "bridge" {
- nicType = "bridged"
+ device["nictype"] = "bridged"
}
- props := []string{fmt.Sprintf("nictype=%s", nicType), fmt.Sprintf("parent=%s", name)}
if len(args) > 2 {
- props = append(props, fmt.Sprintf("name=%s", args[2]))
+ device["name"] = args[2]
}
- resp, err := client.ContainerDeviceAdd(container, devName, "nic", props)
+ // Get the container entry
+ ctn, ctnEtag, err := client.GetContainer(args[0])
+ if err != nil {
+ return err
+ }
+
+ // Check if the device already exists
+ _, ok := ctn.Devices[devName]
+ if ok {
+ return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+ }
+
+ // Add the device to the container
+ ctn.Devices[devName] = device
+
+ op, err := client.UpdateContainer(args[0], ctn.Writable(), ctnEtag)
if err != nil {
return err
}
- return client.WaitForSuccess(resp.Operation)
+ return op.Wait()
}
-func (c *networkCmd) doNetworkAttachProfile(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkAttachProfile(client lxd.ContainerServer, name string, args []string) error {
if len(args) < 1 || len(args) > 3 {
return errArgs
}
- profile := args[0]
+ // Default name is same as network
devName := name
if len(args) > 1 {
devName = args[1]
}
- network, err := client.NetworkGet(name)
+ // Get the network entry
+ network, _, err := client.GetNetwork(name)
if err != nil {
return err
}
- nicType := "macvlan"
+ // Prepare the profile's device entry
+ device := map[string]string{
+ "type": "nic",
+ "nictype": "macvlan",
+ "parent": name,
+ }
+
if network.Type == "bridge" {
- nicType = "bridged"
+ device["nictype"] = "bridged"
}
- props := []string{fmt.Sprintf("nictype=%s", nicType), fmt.Sprintf("parent=%s", name)}
if len(args) > 2 {
- props = append(props, fmt.Sprintf("name=%s", args[2]))
+ device["name"] = args[2]
}
- _, err = client.ProfileDeviceAdd(profile, devName, "nic", props)
- return err
+ // Get the profile entry
+ profile, profileEtag, err := client.GetProfile(args[0])
+ if err != nil {
+ return err
+ }
+
+ // Check if the device already exists
+ _, ok := profile.Devices[devName]
+ if ok {
+ return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+ }
+
+ // Add the device to the container
+ profile.Devices[devName] = device
+
+ err = client.UpdateProfile(args[0], profile.Writable(), profileEtag)
+ if err != nil {
+ return err
+ }
+
+ return nil
}
-func (c *networkCmd) doNetworkCreate(client *lxd.Client, name string, args []string) error {
- config := map[string]string{}
+func (c *networkCmd) doNetworkCreate(client lxd.ContainerServer, name string, args []string) error {
+ network := api.NetworksPost{}
+ network.Name = name
+ network.Config = map[string]string{}
for i := 0; i < len(args); i++ {
entry := strings.SplitN(args[i], "=", 2)
@@ -219,33 +267,36 @@ func (c *networkCmd) doNetworkCreate(client *lxd.Client, name string, args []str
return errArgs
}
- config[entry[0]] = entry[1]
+ network.Config[entry[0]] = entry[1]
}
- err := client.NetworkCreate(name, config)
- if err == nil {
- fmt.Printf(i18n.G("Network %s created")+"\n", name)
+ err := client.CreateNetwork(network)
+ if err != nil {
+ return err
}
- return err
+ fmt.Printf(i18n.G("Network %s created")+"\n", name)
+ return nil
}
-func (c *networkCmd) doNetworkDetach(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkDetach(client lxd.ContainerServer, name string, args []string) error {
if len(args) < 1 || len(args) > 2 {
return errArgs
}
- containerName := args[0]
+ // Default name is same as network
devName := ""
if len(args) > 1 {
devName = args[1]
}
- container, err := client.ContainerInfo(containerName)
+ // Get the container entry
+ container, etag, err := client.GetContainer(args[0])
if err != nil {
return err
}
+ // Find the device
if devName == "" {
for n, d := range container.Devices {
if d["type"] == "nic" && d["parent"] == name {
@@ -271,30 +322,34 @@ func (c *networkCmd) doNetworkDetach(client *lxd.Client, name string, args []str
return fmt.Errorf(i18n.G("The specified device doesn't match the network"))
}
- resp, err := client.ContainerDeviceDelete(containerName, devName)
+ // Remove the device
+ delete(container.Devices, devName)
+ op, err := client.UpdateContainer(args[0], container.Writable(), etag)
if err != nil {
return err
}
- return client.WaitForSuccess(resp.Operation)
+ return op.Wait()
}
-func (c *networkCmd) doNetworkDetachProfile(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkDetachProfile(client lxd.ContainerServer, name string, args []string) error {
if len(args) < 1 || len(args) > 2 {
return errArgs
}
- profileName := args[0]
+ // Default name is same as network
devName := ""
if len(args) > 1 {
devName = args[1]
}
- profile, err := client.ProfileConfig(profileName)
+ // Get the profile entry
+ profile, etag, err := client.GetProfile(args[0])
if err != nil {
return err
}
+ // Find the device
if devName == "" {
for n, d := range profile.Devices {
if d["type"] == "nic" && d["parent"] == name {
@@ -320,20 +375,27 @@ func (c *networkCmd) doNetworkDetachProfile(client *lxd.Client, name string, arg
return fmt.Errorf(i18n.G("The specified device doesn't match the network"))
}
- _, err = client.ProfileDeviceDelete(profileName, devName)
- return err
+ // Remove the device
+ delete(profile.Devices, devName)
+ err = client.UpdateProfile(args[0], profile.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ return nil
}
-func (c *networkCmd) doNetworkDelete(client *lxd.Client, name string) error {
- err := client.NetworkDelete(name)
- if err == nil {
- fmt.Printf(i18n.G("Network %s deleted")+"\n", name)
+func (c *networkCmd) doNetworkDelete(client lxd.ContainerServer, name string) error {
+ err := client.DeleteNetwork(name)
+ if err != nil {
+ return err
}
- return err
+ fmt.Printf(i18n.G("Network %s deleted")+"\n", name)
+ return nil
}
-func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
+func (c *networkCmd) doNetworkEdit(client lxd.ContainerServer, name string) error {
// If stdin isn't a terminal, read text from it
if !termios.IsTerminal(int(syscall.Stdin)) {
contents, err := ioutil.ReadAll(os.Stdin)
@@ -346,11 +408,12 @@ func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
if err != nil {
return err
}
- return client.NetworkPut(name, newdata)
+
+ return client.UpdateNetwork(name, newdata, "")
}
// Extract the current value
- network, err := client.NetworkGet(name)
+ network, etag, err := client.GetNetwork(name)
if err != nil {
return err
}
@@ -375,7 +438,7 @@ func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
newdata := api.NetworkPut{}
err = yaml.Unmarshal(content, &newdata)
if err == nil {
- err = client.NetworkPut(name, newdata)
+ err = client.UpdateNetwork(name, newdata, etag)
}
// Respawn the editor
@@ -399,13 +462,13 @@ func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
return nil
}
-func (c *networkCmd) doNetworkGet(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkGet(client lxd.ContainerServer, name string, args []string) error {
// we shifted @args so so it should read "<key>"
if len(args) != 1 {
return errArgs
}
- resp, err := client.NetworkGet(name)
+ resp, _, err := client.GetNetwork(name)
if err != nil {
return err
}
@@ -436,12 +499,12 @@ func (c *networkCmd) doNetworkList(conf *config.Config, args []string) error {
remote = conf.DefaultRemote
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- networks, err := client.ListNetworks()
+ networks, err := client.GetNetworks()
if err != nil {
return err
}
@@ -478,13 +541,13 @@ func (c *networkCmd) doNetworkList(conf *config.Config, args []string) error {
return nil
}
-func (c *networkCmd) doNetworkSet(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkSet(client lxd.ContainerServer, name string, args []string) error {
// we shifted @args so so it should read "<key> [<value>]"
if len(args) < 1 {
return errArgs
}
- network, err := client.NetworkGet(name)
+ network, etag, err := client.GetNetwork(name)
if err != nil {
return err
}
@@ -511,15 +574,15 @@ func (c *networkCmd) doNetworkSet(client *lxd.Client, name string, args []string
network.Config[key] = value
- return client.NetworkPut(name, network.Writable())
+ return client.UpdateNetwork(name, network.Writable(), etag)
}
-func (c *networkCmd) doNetworkShow(client *lxd.Client, name string) error {
+func (c *networkCmd) doNetworkShow(client lxd.ContainerServer, name string) error {
if name == "" {
return errArgs
}
- network, err := client.NetworkGet(name)
+ network, _, err := client.GetNetwork(name)
if err != nil {
return err
}
From f28a8682639e8a80d73fe220e8c3fabf6b218d08 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 24 Apr 2017 00:58:21 -0400
Subject: [PATCH 15/28] lxc: Move common code to utils.go
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/network.go | 36 ++++--------------------------------
lxc/utils.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+), 32 deletions(-)
diff --git a/lxc/network.go b/lxc/network.go
index 96b826e03..c17d2b40b 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -178,27 +178,13 @@ func (c *networkCmd) doNetworkAttach(client lxd.ContainerServer, name string, ar
device["name"] = args[2]
}
- // Get the container entry
- ctn, ctnEtag, err := client.GetContainer(args[0])
- if err != nil {
- return err
- }
-
- // Check if the device already exists
- _, ok := ctn.Devices[devName]
- if ok {
- return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
- }
-
// Add the device to the container
- ctn.Devices[devName] = device
-
- op, err := client.UpdateContainer(args[0], ctn.Writable(), ctnEtag)
+ err = containerDeviceAdd(client, args[0], devName, device)
if err != nil {
return err
}
- return op.Wait()
+ return nil
}
func (c *networkCmd) doNetworkAttachProfile(client lxd.ContainerServer, name string, args []string) error {
@@ -233,22 +219,8 @@ func (c *networkCmd) doNetworkAttachProfile(client lxd.ContainerServer, name str
device["name"] = args[2]
}
- // Get the profile entry
- profile, profileEtag, err := client.GetProfile(args[0])
- if err != nil {
- return err
- }
-
- // Check if the device already exists
- _, ok := profile.Devices[devName]
- if ok {
- return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
- }
-
- // Add the device to the container
- profile.Devices[devName] = device
-
- err = client.UpdateProfile(args[0], profile.Writable(), profileEtag)
+ // Add the device to the profile
+ err = profileDeviceAdd(client, args[0], devName, device)
if err != nil {
return err
}
diff --git a/lxc/utils.go b/lxc/utils.go
index 4693a8175..4900ca0ac 100644
--- a/lxc/utils.go
+++ b/lxc/utils.go
@@ -233,3 +233,52 @@ func getLocalErr(err error) error {
return nil
}
+
+// Add a device to a container
+func containerDeviceAdd(client lxd.ContainerServer, name string, devName string, dev map[string]string) error {
+ // Get the container entry
+ container, etag, err := client.GetContainer(name)
+ if err != nil {
+ return err
+ }
+
+ // Check if the device already exists
+ _, ok := container.Devices[devName]
+ if ok {
+ return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+ }
+
+ container.Devices[devName] = dev
+
+ op, err := client.UpdateContainer(name, container.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ return op.Wait()
+}
+
+// Add a device to a profile
+func profileDeviceAdd(client lxd.ContainerServer, name string, devName string, dev map[string]string) error {
+ // Get the profile entry
+ profile, profileEtag, err := client.GetProfile(name)
+ if err != nil {
+ return err
+ }
+
+ // Check if the device already exists
+ _, ok := profile.Devices[devName]
+ if ok {
+ return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+ }
+
+ // Add the device to the container
+ profile.Devices[devName] = dev
+
+ err = client.UpdateProfile(name, profile.Writable(), profileEtag)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
From f90a2a5044285e2132ae5f141f4ce258dc066ca9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 24 Apr 2017 00:58:42 -0400
Subject: [PATCH 16/28] lxc/storage: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/storage.go | 251 ++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 161 insertions(+), 90 deletions(-)
diff --git a/lxc/storage.go b/lxc/storage.go
index 484f6e13d..b09bbe0d7 100644
--- a/lxc/storage.go
+++ b/lxc/storage.go
@@ -12,7 +12,7 @@ import (
"github.com/olekukonko/tablewriter"
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -162,7 +162,7 @@ func (c *storageCmd) run(conf *config.Config, args []string) error {
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -305,12 +305,11 @@ func (c *storageCmd) parseVolume(name string) (string, string) {
return fields[1], fields[0]
}
-func (c *storageCmd) doStoragePoolVolumeAttach(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeAttach(client lxd.ContainerServer, pool string, volume string, args []string) error {
if len(args) < 2 || len(args) > 3 {
return errArgs
}
- container := args[0]
devPath := ""
devName := ""
if len(args) == 2 {
@@ -328,38 +327,46 @@ func (c *storageCmd) doStoragePoolVolumeAttach(client *lxd.Client, pool string,
return fmt.Errorf(i18n.G("Only \"custom\" volumes can be attached to containers."))
}
- // Check if the requested storage volume actually
- // exists on the requested storage pool.
- vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+ // Check if the requested storage volume actually exists
+ vol, _, err := client.GetStoragePoolVolume(pool, volType, volName)
if err != nil {
return err
}
- props := []string{fmt.Sprintf("pool=%s", pool), fmt.Sprintf("path=%s", devPath), fmt.Sprintf("source=%s", vol.Name)}
- resp, err := client.ContainerDeviceAdd(container, devName, "disk", props)
+ // Prepare the container's device entry
+ device := map[string]string{
+ "type": "disk",
+ "pool": pool,
+ "path": devPath,
+ "source": vol.Name,
+ }
+
+ // Add the device to the container
+ err = containerDeviceAdd(client, args[0], devName, device)
if err != nil {
return err
}
- return client.WaitForSuccess(resp.Operation)
+ return nil
}
-func (c *storageCmd) doStoragePoolVolumeDetach(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeDetach(client lxd.ContainerServer, pool string, volume string, args []string) error {
if len(args) < 1 || len(args) > 2 {
return errArgs
}
- containerName := args[0]
devName := ""
if len(args) == 2 {
devName = args[1]
}
- container, err := client.ContainerInfo(containerName)
+ // Get the container entry
+ container, etag, err := client.GetContainer(args[0])
if err != nil {
return err
}
+ // Find the device
if devName == "" {
for n, d := range container.Devices {
if d["type"] == "disk" && d["pool"] == pool && d["source"] == volume {
@@ -381,20 +388,21 @@ func (c *storageCmd) doStoragePoolVolumeDetach(client *lxd.Client, pool string,
return fmt.Errorf(i18n.G("The specified device doesn't exist"))
}
- resp, err := client.ContainerDeviceDelete(containerName, devName)
+ // Remove the device
+ delete(container.Devices, devName)
+ op, err := client.UpdateContainer(args[0], container.Writable(), etag)
if err != nil {
return err
}
- return client.WaitForSuccess(resp.Operation)
+ return op.Wait()
}
-func (c *storageCmd) doStoragePoolVolumeAttachProfile(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeAttachProfile(client lxd.ContainerServer, pool string, volume string, args []string) error {
if len(args) < 2 || len(args) > 3 {
return errArgs
}
- profile := args[0]
devPath := ""
devName := ""
if len(args) == 2 {
@@ -412,54 +420,73 @@ func (c *storageCmd) doStoragePoolVolumeAttachProfile(client *lxd.Client, pool s
return fmt.Errorf(i18n.G("Only \"custom\" volumes can be attached to containers."))
}
- // Check if the requested storage volume actually
- // exists on the requested storage pool.
- vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+ // Check if the requested storage volume actually exists
+ vol, _, err := client.GetStoragePoolVolume(pool, volType, volName)
if err != nil {
return err
}
- props := []string{fmt.Sprintf("pool=%s", pool), fmt.Sprintf("path=%s", devPath), fmt.Sprintf("source=%s", vol.Name)}
+ // Prepare the container's device entry
+ device := map[string]string{
+ "type": "disk",
+ "pool": pool,
+ "path": devPath,
+ "source": vol.Name,
+ }
+
+ // Add the device to the container
+ err = profileDeviceAdd(client, args[0], devName, device)
+ if err != nil {
+ return err
+ }
- _, err = client.ProfileDeviceAdd(profile, devName, "disk", props)
- return err
+ return nil
}
-func (c *storageCmd) doStoragePoolCreate(client *lxd.Client, name string, driver string, args []string) error {
- config := map[string]string{}
+func (c *storageCmd) doStoragePoolCreate(client lxd.ContainerServer, name string, driver string, args []string) error {
+ // Create the new storage pool entry
+ pool := api.StoragePoolsPost{}
+ pool.Name = name
+ pool.Config = map[string]string{}
+ pool.Driver = driver
for i := 0; i < len(args); i++ {
entry := strings.SplitN(args[i], "=", 2)
if len(entry) < 2 {
return errArgs
}
- config[entry[0]] = entry[1]
+
+ pool.Config[entry[0]] = entry[1]
}
- err := client.StoragePoolCreate(name, driver, config)
- if err == nil {
- fmt.Printf(i18n.G("Storage pool %s created")+"\n", name)
+ // Create the pool
+ err := client.CreateStoragePool(pool)
+ if err != nil {
+ return err
}
- return err
+ fmt.Printf(i18n.G("Storage pool %s created")+"\n", name)
+
+ return nil
}
-func (c *storageCmd) doStoragePoolVolumeDetachProfile(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeDetachProfile(client lxd.ContainerServer, pool string, volume string, args []string) error {
if len(args) < 1 || len(args) > 2 {
return errArgs
}
- profileName := args[0]
devName := ""
if len(args) > 1 {
devName = args[1]
}
- profile, err := client.ProfileConfig(profileName)
+ // Get the profile entry
+ profile, etag, err := client.GetProfile(args[0])
if err != nil {
return err
}
+ // Find the device
if devName == "" {
for n, d := range profile.Devices {
if d["type"] == "disk" && d["pool"] == pool && d["source"] == volume {
@@ -481,20 +508,28 @@ func (c *storageCmd) doStoragePoolVolumeDetachProfile(client *lxd.Client, pool s
return fmt.Errorf(i18n.G("The specified device doesn't exist"))
}
- _, err = client.ProfileDeviceDelete(profileName, devName)
- return err
+ // Remove the device
+ delete(profile.Devices, devName)
+ err = client.UpdateProfile(args[0], profile.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ return nil
}
-func (c *storageCmd) doStoragePoolDelete(client *lxd.Client, name string) error {
- err := client.StoragePoolDelete(name)
- if err == nil {
- fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", name)
+func (c *storageCmd) doStoragePoolDelete(client lxd.ContainerServer, name string) error {
+ err := client.DeleteStoragePool(name)
+ if err != nil {
+ return err
}
- return err
+ fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", name)
+
+ return nil
}
-func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
+func (c *storageCmd) doStoragePoolEdit(client lxd.ContainerServer, name string) error {
// If stdin isn't a terminal, read text from it
if !termios.IsTerminal(int(syscall.Stdin)) {
contents, err := ioutil.ReadAll(os.Stdin)
@@ -502,16 +537,17 @@ func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
return err
}
- newdata := api.StoragePool{}
+ newdata := api.StoragePoolPut{}
err = yaml.Unmarshal(contents, &newdata)
if err != nil {
return err
}
- return client.StoragePoolPut(name, newdata)
+
+ return client.UpdateStoragePool(name, newdata, "")
}
// Extract the current value
- pool, err := client.StoragePoolGet(name)
+ pool, etag, err := client.GetStoragePool(name)
if err != nil {
return err
}
@@ -529,10 +565,10 @@ func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
for {
// Parse the text received from the editor
- newdata := api.StoragePool{}
+ newdata := api.StoragePoolPut{}
err = yaml.Unmarshal(content, &newdata)
if err == nil {
- err = client.StoragePoolPut(name, newdata)
+ err = client.UpdateStoragePool(name, newdata, etag)
}
// Respawn the editor
@@ -556,13 +592,13 @@ func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
return nil
}
-func (c *storageCmd) doStoragePoolGet(client *lxd.Client, name string, args []string) error {
+func (c *storageCmd) doStoragePoolGet(client lxd.ContainerServer, name string, args []string) error {
// we shifted @args so so it should read "<key>"
if len(args) != 1 {
return errArgs
}
- resp, err := client.StoragePoolGet(name)
+ resp, _, err := client.GetStoragePool(name)
if err != nil {
return err
}
@@ -592,12 +628,12 @@ func (c *storageCmd) doStoragePoolsList(conf *config.Config, args []string) erro
remote = conf.DefaultRemote
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- pools, err := client.ListStoragePools()
+ pools, err := client.GetStoragePools()
if err != nil {
return err
}
@@ -626,18 +662,18 @@ func (c *storageCmd) doStoragePoolsList(conf *config.Config, args []string) erro
return nil
}
-func (c *storageCmd) doStoragePoolSet(client *lxd.Client, name string, args []string) error {
- // we shifted @args so so it should read "<key> [<value>]"
+func (c *storageCmd) doStoragePoolSet(client lxd.ContainerServer, name string, args []string) error {
if len(args) < 1 {
return errArgs
}
- pool, err := client.StoragePoolGet(name)
+ // Get the pool entry
+ pool, etag, err := client.GetStoragePool(name)
if err != nil {
return err
}
- key := args[0]
+ // Read the value
var value string
if len(args) < 2 {
value = ""
@@ -653,17 +689,23 @@ func (c *storageCmd) doStoragePoolSet(client *lxd.Client, name string, args []st
value = string(buf[:])
}
- pool.Config[key] = value
+ // Update the pool
+ pool.Config[args[0]] = value
- return client.StoragePoolPut(name, pool)
+ err = client.UpdateStoragePool(name, pool.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ return nil
}
-func (c *storageCmd) doStoragePoolShow(client *lxd.Client, name string) error {
+func (c *storageCmd) doStoragePoolShow(client lxd.ContainerServer, name string) error {
if name == "" {
return errArgs
}
- pool, err := client.StoragePoolGet(name)
+ pool, _, err := client.GetStoragePool(name)
if err != nil {
return err
}
@@ -681,12 +723,12 @@ func (c *storageCmd) doStoragePoolShow(client *lxd.Client, name string) error {
}
func (c *storageCmd) doStoragePoolVolumesList(conf *config.Config, remote string, pool string, args []string) error {
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- volumes, err := client.StoragePoolVolumesList(pool)
+ volumes, err := client.GetStoragePoolVolumes(pool)
if err != nil {
return err
}
@@ -713,44 +755,60 @@ func (c *storageCmd) doStoragePoolVolumesList(conf *config.Config, remote string
return nil
}
-func (c *storageCmd) doStoragePoolVolumeCreate(client *lxd.Client, pool string, volume string, args []string) error {
- config := map[string]string{}
+func (c *storageCmd) doStoragePoolVolumeCreate(client lxd.ContainerServer, pool string, volume string, args []string) error {
+ // Parse the input
+ volName, volType := c.parseVolume(volume)
+
+ // Create the storage volume entry
+ vol := api.StorageVolumesPost{}
+ vol.Name = volName
+ vol.Type = volType
+ vol.Config = map[string]string{}
for i := 0; i < len(args); i++ {
entry := strings.SplitN(args[i], "=", 2)
if len(entry) < 2 {
return errArgs
}
- config[entry[0]] = entry[1]
+
+ vol.Config[entry[0]] = entry[1]
}
- volName, volType := c.parseVolume(volume)
- err := client.StoragePoolVolumeTypeCreate(pool, volName, volType, config)
- if err == nil {
- fmt.Printf(i18n.G("Storage volume %s created")+"\n", volume)
+ err := client.CreateStoragePoolVolume(pool, vol)
+ if err != nil {
+ return err
}
- return err
+ fmt.Printf(i18n.G("Storage volume %s created")+"\n", volume)
+
+ return nil
}
-func (c *storageCmd) doStoragePoolVolumeDelete(client *lxd.Client, pool string, volume string) error {
+func (c *storageCmd) doStoragePoolVolumeDelete(client lxd.ContainerServer, pool string, volume string) error {
+ // Parse the input
volName, volType := c.parseVolume(volume)
- err := client.StoragePoolVolumeTypeDelete(pool, volName, volType)
- if err == nil {
- fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", volume)
+
+ // Delete the volume
+ err := client.DeleteStoragePoolVolume(pool, volType, volName)
+ if err != nil {
+ return err
}
- return err
+ fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", volume)
+
+ return nil
}
-func (c *storageCmd) doStoragePoolVolumeGet(client *lxd.Client, pool string, volume string, args []string) error {
- // we shifted @args so so it should read "<key>"
+func (c *storageCmd) doStoragePoolVolumeGet(client lxd.ContainerServer, pool string, volume string, args []string) error {
if len(args) != 2 {
return errArgs
}
+ // Parse input
volName, volType := c.parseVolume(volume)
- resp, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+
+ // Get the storage volume entry
+ resp, _, err := client.GetStoragePoolVolume(pool, volType, volName)
if err != nil {
return err
}
@@ -760,21 +818,25 @@ func (c *storageCmd) doStoragePoolVolumeGet(client *lxd.Client, pool string, vol
fmt.Printf("%s\n", v)
}
}
+
return nil
}
-func (c *storageCmd) doStoragePoolVolumeSet(client *lxd.Client, pool string, volume string, args []string) error {
- // we shifted @args so so it should read "<key> [<value>]"
+func (c *storageCmd) doStoragePoolVolumeSet(client lxd.ContainerServer, pool string, volume string, args []string) error {
if len(args) < 2 {
return errArgs
}
+ // Parse the input
volName, volType := c.parseVolume(volume)
- volumeConfig, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+
+ // Get the storage volume entry
+ vol, etag, err := client.GetStoragePoolVolume(pool, volType, volName)
if err != nil {
return err
}
+ // Get the value
key := args[1]
var value string
if len(args) < 3 {
@@ -791,21 +853,29 @@ func (c *storageCmd) doStoragePoolVolumeSet(client *lxd.Client, pool string, vol
value = string(buf[:])
}
- volumeConfig.Config[key] = value
+ // Update the volume
+ vol.Config[key] = value
+ err = client.UpdateStoragePoolVolume(pool, vol.Type, vol.Name, vol.Writable(), etag)
+ if err != nil {
+ return err
+ }
- return client.StoragePoolVolumeTypePut(pool, volName, volType, volumeConfig)
+ return nil
}
-func (c *storageCmd) doStoragePoolVolumeShow(client *lxd.Client, pool string, volume string) error {
+func (c *storageCmd) doStoragePoolVolumeShow(client lxd.ContainerServer, pool string, volume string) error {
+ // Parse the input
volName, volType := c.parseVolume(volume)
- volumeStruct, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+
+ // Get the storage volume entry
+ vol, _, err := client.GetStoragePoolVolume(pool, volType, volName)
if err != nil {
return err
}
- sort.Strings(volumeStruct.UsedBy)
+ sort.Strings(vol.UsedBy)
- data, err := yaml.Marshal(&volumeStruct)
+ data, err := yaml.Marshal(&vol)
if err != nil {
return err
}
@@ -815,7 +885,8 @@ func (c *storageCmd) doStoragePoolVolumeShow(client *lxd.Client, pool string, vo
return nil
}
-func (c *storageCmd) doStoragePoolVolumeEdit(client *lxd.Client, pool string, volume string) error {
+func (c *storageCmd) doStoragePoolVolumeEdit(client lxd.ContainerServer, pool string, volume string) error {
+ // Parse the input
volName, volType := c.parseVolume(volume)
// If stdin isn't a terminal, read text from it
@@ -825,17 +896,17 @@ func (c *storageCmd) doStoragePoolVolumeEdit(client *lxd.Client, pool string, vo
return err
}
- newdata := api.StorageVolume{}
+ newdata := api.StorageVolumePut{}
err = yaml.Unmarshal(contents, &newdata)
if err != nil {
return err
}
- return client.StoragePoolVolumeTypePut(pool, volName, volType, newdata)
+ return client.UpdateStoragePoolVolume(pool, volType, volName, newdata, "")
}
// Extract the current value
- vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+ vol, etag, err := client.GetStoragePoolVolume(pool, volType, volName)
if err != nil {
return err
}
@@ -856,7 +927,7 @@ func (c *storageCmd) doStoragePoolVolumeEdit(client *lxd.Client, pool string, vo
newdata := api.StorageVolume{}
err = yaml.Unmarshal(content, &newdata)
if err == nil {
- err = client.StoragePoolVolumeTypePut(pool, volName, volType, newdata)
+ err = client.UpdateStoragePoolVolume(pool, vol.Type, vol.Name, newdata.Writable(), etag)
}
// Respawn the editor
From b496be20016ac2b1700430661a98e5baf2f1306e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 24 Apr 2017 12:06:01 -0400
Subject: [PATCH 17/28] lxc/image: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/image.go | 340 ++++++++++++++++++++++++++++++++++++++------------
test/suites/remote.sh | 7 +-
2 files changed, 261 insertions(+), 86 deletions(-)
diff --git a/lxc/image.go b/lxc/image.go
index b372a048e..8cc78dd3b 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -4,8 +4,10 @@ import (
"encoding/csv"
"encoding/json"
"fmt"
+ "io"
"io/ioutil"
"os"
+ "path/filepath"
"regexp"
"sort"
"strings"
@@ -14,7 +16,7 @@ import (
"github.com/olekukonko/tablewriter"
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -286,12 +288,12 @@ func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
}
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetImageServer(remote)
if err != nil {
return err
}
- resp, err := d.ListAliases()
+ resp, err := d.GetImageAliases()
if err != nil {
return err
}
@@ -305,19 +307,21 @@ func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
return errArgs
}
- remote, alias, err := conf.ParseRemote(args[2])
+ remote, name, err := conf.ParseRemote(args[2])
if err != nil {
return err
}
- target := args[3]
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- /* TODO - what about description? */
- err = d.PostAlias(alias, alias, target)
- return err
+
+ alias := api.ImageAliasesPost{}
+ alias.Name = name
+ alias.Target = args[3]
+
+ return d.CreateImageAlias(alias)
case "delete":
/* alias delete [<remote>:]<alias> */
if len(args) < 3 {
@@ -329,11 +333,12 @@ func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- err = d.DeleteAlias(alias)
+
+ err = d.DeleteImageAlias(alias)
return err
}
return errArgs
@@ -364,10 +369,6 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return err
}
- if inName == "" {
- inName = "default"
- }
-
destRemote, outName, err := conf.ParseRemote(args[2])
if err != nil {
return err
@@ -377,24 +378,63 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return errArgs
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetImageServer(remote)
+ if err != nil {
+ return err
+ }
+
+ dest, err := conf.GetContainerServer(destRemote)
+ if err != nil {
+ return err
+ }
+
+ // Check if an alias
+ fingerprint := c.dereferenceAlias(d, inName)
+
+ // Get the image
+ image, _, err := d.GetImage(fingerprint)
if err != nil {
return err
}
- dest, err := lxd.NewClient(conf.Legacy(), destRemote)
+ // Setup the copy arguments
+ aliases := []api.ImageAlias{}
+ for _, entry := range c.addAliases {
+ alias := api.ImageAlias{}
+ alias.Name = entry
+ aliases = append(aliases, alias)
+ }
+
+ args := lxd.ImageCopyArgs{
+ Aliases: aliases,
+ AutoUpdate: c.autoUpdate,
+ CopyAliases: c.copyAliases,
+ Public: c.publicImage,
+ }
+
+ // Do the copy
+ op, err := dest.CopyImage(d, *image, &args)
if err != nil {
return err
}
+ // Register progress handler
progress := ProgressRenderer{Format: i18n.G("Copying the image: %s")}
- err = d.CopyImage(inName, dest, c.copyAliases, c.addAliases, c.publicImage, c.autoUpdate, progress.Update)
- if err == nil {
- progress.Done(i18n.G("Image copied successfully!"))
+ _, err = op.AddHandler(progress.UpdateOp)
+ if err != nil {
+ progress.Done("")
+ return err
}
- progress.Done("")
- return err
+ // Wait for operation to finish
+ err = op.Wait()
+ if err != nil {
+ progress.Done("")
+ return err
+ }
+
+ progress.Done(i18n.G("Image copied successfully!"))
+ return nil
case "delete":
/* delete [<remote>:]<image> [<remote>:][<image>...] */
@@ -409,17 +449,18 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return err
}
- if inName == "" {
- inName = "default"
+ d, err := conf.GetContainerServer(remote)
+ if err != nil {
+ return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ image := c.dereferenceAlias(d, inName)
+ op, err := d.DeleteImage(image)
if err != nil {
return err
}
- image := c.dereferenceAlias(d, inName)
- err = d.DeleteImage(image)
+ err = op.Wait()
if err != nil {
return err
}
@@ -434,23 +475,33 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
}
for _, arg := range args[1:] {
- remote, inName := config.ParseRemoteAndContainer(arg)
- if inName == "" {
- inName = "default"
+ remote, inName, err := conf.ParseRemote(arg)
+ if err != nil {
+ return err
}
- d, err := lxd.NewClient(config, remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
image := c.dereferenceAlias(d, inName)
progress := ProgressRenderer{Format: i18n.G("Refreshing the image: %s")}
- refreshed, err := d.RefreshImage(image, progress.Update)
+ op, err := d.RefreshImage(image)
if err != nil {
return err
}
+ // Register progress handler
+ _, err = op.AddHandler(progress.UpdateOp)
+
+ // Check if refreshed
+ refreshed := false
+ flag, ok := op.Metadata["refreshed"]
+ if ok {
+ refreshed = flag.(bool)
+ }
+
if refreshed {
progress.Done(i18n.G("Image refreshed successfully!"))
} else {
@@ -470,17 +521,13 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return err
}
- if inName == "" {
- inName = "default"
- }
-
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetImageServer(remote)
if err != nil {
return err
}
image := c.dereferenceAlias(d, inName)
- info, err := d.GetImageInfo(image)
+ info, _, err := d.GetImage(image)
if err != nil {
return err
}
@@ -541,7 +588,6 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return errArgs
}
- var fingerprint string
var imageFile string
var rootfsFile string
var properties []string
@@ -577,35 +623,103 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
properties = properties[1:]
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- if strings.HasPrefix(imageFile, "https://") {
- progress := ProgressRenderer{Format: i18n.G("Importing the image: %s")}
- fingerprint, err = d.PostImageURL(imageFile, properties, c.publicImage, c.addAliases, progress.Update)
- if err == nil {
- progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint))
- }
- } else if strings.HasPrefix(imageFile, "http://") {
+ if strings.HasPrefix(imageFile, "http://") {
return fmt.Errorf(i18n.G("Only https:// is supported for remote image import."))
+ }
+
+ var args *lxd.ImageCreateArgs
+ image := api.ImagesPost{}
+ image.Public = c.publicImage
+
+ // Handle aliases
+ aliases := []api.ImageAlias{}
+ for _, entry := range c.addAliases {
+ alias := api.ImageAlias{}
+ alias.Name = entry
+ aliases = append(aliases, alias)
+ }
+
+ // Handle properties
+ for _, entry := range properties {
+ fields := strings.SplitN(entry, "=", 2)
+ if len(fields) < 2 {
+ return fmt.Errorf(i18n.G("Bad property: %s"), entry)
+ }
+
+ image.Properties[strings.TrimSpace(fields[0])] = strings.TrimSpace(fields[1])
+ }
+
+ progress := ProgressRenderer{Format: i18n.G("Transferring image: %s")}
+ if strings.HasPrefix(imageFile, "https://") {
+ image.Source = &api.ImagesPostSource{}
+ image.Source.Type = "url"
+ image.Source.Mode = "pull"
+ image.Source.Protocol = "direct"
+ image.Source.URL = imageFile
} else {
- progress := ProgressRenderer{Format: i18n.G("Transferring image: %s")}
- handler := func(percent int64, speed int64) {
- progress.Update(fmt.Sprintf("%d%% (%s/s)", percent, shared.GetByteSizeString(speed, 2)))
+ var meta io.ReadCloser
+ var rootfs io.ReadCloser
+
+ // Open meta
+ meta, err = os.Open(imageFile)
+ if err != nil {
+ return err
}
+ defer meta.Close()
- fingerprint, err = d.PostImage(imageFile, rootfsFile, properties, c.publicImage, c.addAliases, handler)
- if err == nil {
- progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint))
+ // Open rootfs
+ if rootfsFile != "" {
+ rootfs, err = os.Open(rootfsFile)
+ if err != nil {
+ return err
+ }
+ defer rootfs.Close()
}
+
+ args = &lxd.ImageCreateArgs{
+ MetaFile: meta,
+ MetaName: filepath.Base(imageFile),
+ RootfsFile: rootfs,
+ RootfsName: filepath.Base(rootfsFile),
+ ProgressHandler: progress.UpdateProgress,
+ }
+ image.Filename = args.MetaName
+ }
+
+ // Start the transfer
+ op, err := d.CreateImage(image, args)
+ if err != nil {
+ progress.Done("")
+ return err
}
+ err = op.Wait()
if err != nil {
+ progress.Done("")
return err
}
+ // Get the fingerprint
+ fingerprint := op.Metadata["fingerprint"].(string)
+ progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint))
+
+ // Add the aliases
+ for _, entry := range c.addAliases {
+ alias := api.ImageAliasesPost{}
+ alias.Name = entry
+ alias.Target = fingerprint
+
+ err = d.CreateImageAlias(alias)
+ if err != nil {
+ return err
+ }
+ }
+
return nil
case "list":
@@ -643,13 +757,13 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
}
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetImageServer(remote)
if err != nil {
return err
}
var images []api.Image
- allImages, err := d.ListImages()
+ allImages, err := d.GetImages()
if err != nil {
return err
}
@@ -674,11 +788,7 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return err
}
- if inName == "" {
- inName = "default"
- }
-
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -700,30 +810,92 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return err
}
- if inName == "" {
- inName = "default"
- }
-
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetImageServer(remote)
if err != nil {
return err
}
- image := c.dereferenceAlias(d, inName)
+ // Resolve aliases
+ fingerprint := c.dereferenceAlias(d, inName)
+ // Default target is current directory
target := "."
+ targetMeta := fingerprint
if len(args) > 2 {
target = args[2]
+ if shared.IsDir(args[2]) {
+ targetMeta = filepath.Join(args[2], targetMeta)
+ } else {
+ targetMeta = args[2]
+ }
+ }
+ targetRootfs := targetMeta + ".root"
+
+ // Prepare the files
+ dest, err := os.Create(targetMeta)
+ if err != nil {
+ return err
}
+ defer dest.Close()
- outfile, err := d.ExportImage(image, target)
+ destRootfs, err := os.Create(targetRootfs)
if err != nil {
return err
}
+ defer destRootfs.Close()
- if target != "-" {
- fmt.Printf(i18n.G("Output is in %s")+"\n", outfile)
+ // Prepare the download request
+ progress := ProgressRenderer{Format: i18n.G("Exporting the image: %s")}
+ req := lxd.ImageFileRequest{
+ MetaFile: io.WriteSeeker(dest),
+ RootfsFile: io.WriteSeeker(destRootfs),
+ ProgressHandler: progress.UpdateProgress,
}
+
+ // Download the image
+ resp, err := d.GetImageFile(fingerprint, req)
+ if err != nil {
+ os.Remove(targetMeta)
+ os.Remove(targetRootfs)
+ progress.Done("")
+ return err
+ }
+
+ // Cleanup
+ if resp.RootfsSize == 0 {
+ err := os.Remove(targetRootfs)
+ if err != nil {
+ os.Remove(targetMeta)
+ os.Remove(targetRootfs)
+ progress.Done("")
+ return err
+ }
+ }
+
+ // Rename files
+ if shared.IsDir(target) {
+ if resp.MetaName != "" {
+ err := os.Rename(targetMeta, filepath.Join(target, resp.MetaName))
+ if err != nil {
+ os.Remove(targetMeta)
+ os.Remove(targetRootfs)
+ progress.Done("")
+ return err
+ }
+ }
+
+ if resp.RootfsSize > 0 && resp.RootfsName != "" {
+ err := os.Rename(targetRootfs, filepath.Join(target, resp.RootfsName))
+ if err != nil {
+ os.Remove(targetMeta)
+ os.Remove(targetRootfs)
+ progress.Done("")
+ return err
+ }
+ }
+ }
+
+ progress.Done(i18n.G("Image exported successfully!"))
return nil
case "show":
@@ -736,17 +908,13 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
return err
}
- if inName == "" {
- inName = "default"
- }
-
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetImageServer(remote)
if err != nil {
return err
}
image := c.dereferenceAlias(d, inName)
- info, err := d.GetImageInfo(image)
+ info, _, err := d.GetImage(image)
if err != nil {
return err
}
@@ -762,12 +930,17 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
}
}
-func (c *imageCmd) dereferenceAlias(d *lxd.Client, inName string) string {
- result := d.GetAlias(inName)
- if result == "" {
+func (c *imageCmd) dereferenceAlias(d lxd.ImageServer, inName string) string {
+ if inName == "" {
+ inName = "default"
+ }
+
+ result, _, _ := d.GetImageAlias(inName)
+ if result == nil {
return inName
}
- return result
+
+ return result.Target
}
func (c *imageCmd) shortestAlias(list []api.ImageAlias) string {
@@ -886,7 +1059,7 @@ func (c *imageCmd) showAliases(aliases []api.ImageAliasesEntry, filters []string
return nil
}
-func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
+func (c *imageCmd) doImageEdit(client lxd.ContainerServer, image string) error {
// If stdin isn't a terminal, read text from it
if !termios.IsTerminal(int(syscall.Stdin)) {
contents, err := ioutil.ReadAll(os.Stdin)
@@ -899,11 +1072,12 @@ func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
if err != nil {
return err
}
- return client.PutImageInfo(image, newdata)
+
+ return client.UpdateImage(image, newdata, "")
}
// Extract the current value
- imgInfo, err := client.GetImageInfo(image)
+ imgInfo, etag, err := client.GetImage(image)
if err != nil {
return err
}
@@ -925,7 +1099,7 @@ func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
newdata := api.ImagePut{}
err = yaml.Unmarshal(content, &newdata)
if err == nil {
- err = client.PutImageInfo(image, newdata)
+ err = client.UpdateImage(image, newdata, etag)
}
// Respawn the editor
diff --git a/test/suites/remote.sh b/test/suites/remote.sh
index a88354319..d53ee123e 100644
--- a/test/suites/remote.sh
+++ b/test/suites/remote.sh
@@ -81,10 +81,11 @@ test_remote_usage() {
lxc_remote remote add lxd2 "${LXD2_ADDR}" --accept-certificate --password foo
# we need a public image on localhost
- img=$(lxc_remote image export localhost:testimage "${LXD_DIR}/foo" | grep -o "foo.*")
+
+ lxc_remote image export localhost:testimage "${LXD_DIR}/foo"
lxc_remote image delete localhost:testimage
- sum=$(sha256sum "${LXD_DIR}/${img}" | cut -d' ' -f1)
- lxc_remote image import "${LXD_DIR}/${img}" localhost: --public
+ sum=$(sha256sum "${LXD_DIR}/foo" | cut -d' ' -f1)
+ lxc_remote image import "${LXD_DIR}/foo" localhost: --public
lxc_remote image alias create localhost:testimage "${sum}"
lxc_remote image delete "lxd2:${sum}" || true
From 00c4885476386f41090c018761a9717c917e837b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 26 May 2017 18:31:31 -0400
Subject: [PATCH 18/28] lxc/publish: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/publish.go | 112 +++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 89 insertions(+), 23 deletions(-)
diff --git a/lxc/publish.go b/lxc/publish.go
index 04305d025..4254d4e8b 100644
--- a/lxc/publish.go
+++ b/lxc/publish.go
@@ -4,7 +4,7 @@ import (
"fmt"
"strings"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -74,21 +74,21 @@ func (c *publishCmd) run(conf *config.Config, args []string) error {
return fmt.Errorf(i18n.G("There is no \"image name\". Did you want an alias?"))
}
- d, err := lxd.NewClient(conf.Legacy(), iRemote)
+ d, err := conf.GetContainerServer(iRemote)
if err != nil {
return err
}
s := d
if cRemote != iRemote {
- s, err = lxd.NewClient(conf.Legacy(), cRemote)
+ s, err = conf.GetContainerServer(cRemote)
if err != nil {
return err
}
}
if !shared.IsSnapshot(cName) {
- ct, err := s.ContainerInfo(cName)
+ ct, etag, err := s.GetContainer(cName)
if err != nil {
return err
}
@@ -103,38 +103,57 @@ func (c *publishCmd) run(conf *config.Config, args []string) error {
if ct.Ephemeral {
ct.Ephemeral = false
- err := s.UpdateContainerConfig(cName, ct.Writable())
+ op, err := s.UpdateContainer(cName, ct.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
+ if err != nil {
+ return err
+ }
+
+ // Refresh the ETag
+ _, etag, err = s.GetContainer(cName)
if err != nil {
return err
}
}
- resp, err := s.Action(cName, shared.Stop, -1, true, false)
- if err != nil {
- return err
+ req := api.ContainerStatePut{
+ Action: string(shared.Stop),
+ Timeout: -1,
+ Force: true,
}
- op, err := s.WaitFor(resp.Operation)
+ op, err := s.UpdateContainerState(cName, req, "")
if err != nil {
return err
}
- if op.StatusCode == api.Failure {
+ err = op.Wait()
+ if err != nil {
return fmt.Errorf(i18n.G("Stopping container failed!"))
}
defer func() {
- resp, err := s.Action(cName, shared.Start, -1, true, false)
+ req.Action = string(shared.Start)
+ op, err = s.UpdateContainerState(cName, req, "")
if err != nil {
return
}
- s.WaitFor(resp.Operation)
+ op.Wait()
}()
if wasEphemeral {
ct.Ephemeral = true
- err := s.UpdateContainerConfig(cName, ct.Writable())
+ op, err := s.UpdateContainer(cName, ct.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
if err != nil {
return err
}
@@ -160,27 +179,74 @@ func (c *publishCmd) run(conf *config.Config, args []string) error {
properties = nil
}
- // Optimized local publish
+ // Reformat aliases
+ aliases := []api.ImageAlias{}
+ for _, entry := range c.pAliases {
+ alias := api.ImageAlias{}
+ alias.Name = entry
+ aliases = append(aliases, alias)
+ }
+
+ // Create the image
+ req := api.ImagesPost{
+ Source: &api.ImagesPostSource{
+ Type: "container",
+ Name: cName,
+ },
+ CompressionAlgorithm: c.compression_algorithm,
+ }
+ req.Properties = properties
+
+ if shared.IsSnapshot(cName) {
+ req.Source.Type = "snapshot"
+ }
+
if cRemote == iRemote {
- fp, err = d.ImageFromContainer(cName, c.makePublic, c.pAliases, properties, c.compression_algorithm)
- if err != nil {
- return err
- }
- fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fp)
- return nil
+ req.Aliases = aliases
+ req.Public = c.makePublic
}
- fp, err = s.ImageFromContainer(cName, false, nil, properties, c.compression_algorithm)
+ op, err := s.CreateImage(req, nil)
if err != nil {
return err
}
- defer s.DeleteImage(fp)
- err = s.CopyImage(fp, d, false, c.pAliases, c.makePublic, false, nil)
+ err = op.Wait()
if err != nil {
return err
}
+ // Grab the fingerprint
+ fingerprint := op.Metadata["fingerprint"].(string)
+
+ // For remote publish, copy to target now
+ if cRemote != iRemote {
+ defer s.DeleteImage(fingerprint)
+
+ // Get the source image
+ image, _, err := s.GetImage(fingerprint)
+ if err != nil {
+ return err
+ }
+
+ // Image copy arguments
+ args := lxd.ImageCopyArgs{
+ Aliases: aliases,
+ Public: c.makePublic,
+ }
+
+ // Copy the image to the destination host
+ op, err := d.CopyImage(s, *image, &args)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
+ if err != nil {
+ return err
+ }
+ }
+
fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fp)
return nil
From 98ca7a7548c8a23fe9a0e9fd0970cbfc808d411f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 29 May 2017 23:59:11 -0400
Subject: [PATCH 19/28] lxc/init: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/init.go | 170 +++++++++++++++++++++++++++++++++-------------------------
lxc/launch.go | 122 +++++------------------------------------
2 files changed, 108 insertions(+), 184 deletions(-)
diff --git a/lxc/init.go b/lxc/init.go
index 17f611eb5..1a7934e3d 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -5,7 +5,7 @@ import (
"os"
"strings"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
@@ -146,13 +146,18 @@ func (c *initCmd) flags() {
}
func (c *initCmd) run(conf *config.Config, args []string) error {
+ _, _, err := c.create(conf, args)
+ return err
+}
+
+func (c *initCmd) create(conf *config.Config, args []string) (lxd.ContainerServer, string, error) {
if len(args) > 2 || len(args) < 1 {
- return errArgs
+ return nil, "", errArgs
}
iremote, image, err := conf.ParseRemote(args[0])
if err != nil {
- return err
+ return nil, "", err
}
var name string
@@ -160,22 +165,20 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
if len(args) == 2 {
remote, name, err = conf.ParseRemote(args[1])
if err != nil {
- return err
+ return nil, "", err
}
} else {
remote, name, err = conf.ParseRemote("")
if err != nil {
- return err
+ return nil, "", err
}
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
- return err
+ return nil, "", err
}
- // TODO: implement the syntax for supporting other image types/remotes
-
/*
* initRequestedEmptyProfiles means user requested empty
* !initRequestedEmptyProfiles but len(profArgs) == 0 means use profile default
@@ -185,20 +188,17 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
profiles = append(profiles, p)
}
- var resp *api.Response
if name == "" {
fmt.Printf(i18n.G("Creating the container") + "\n")
} else {
fmt.Printf(i18n.G("Creating %s")+"\n", name)
}
- iremote, image = c.guessImage(conf, d, remote, iremote, image)
-
devicesMap := map[string]map[string]string{}
if c.network != "" {
- network, err := d.NetworkGet(c.network)
+ network, _, err := d.GetNetwork(c.network)
if err != nil {
- return err
+ return nil, "", err
}
if network.Type == "bridge" {
@@ -210,10 +210,11 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
// Check if the specified storage pool exists.
if c.storagePool != "" {
- _, err := d.StoragePoolGet(c.storagePool)
+ _, _, err := d.GetStoragePool(c.storagePool)
if err != nil {
- return err
+ return nil, "", err
}
+
devicesMap["root"] = map[string]string{
"type": "disk",
"path": "/",
@@ -221,32 +222,90 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
}
}
+ // Get the image server and image info
+ iremote, image = c.guessImage(conf, d, remote, iremote, image)
+ var imgRemote lxd.ImageServer
+ var imgInfo *api.Image
+
+ // Connect to the image server
+ if iremote == remote {
+ imgRemote = d
+ } else {
+ imgRemote, err = conf.GetImageServer(iremote)
+ if err != nil {
+ return nil, "", err
+ }
+ }
+
+ // Deal with the default image
+ if image == "" {
+ image = "default"
+ }
+
+ // Setup container creation request
+ req := api.ContainersPost{
+ Name: name,
+ }
+ req.Config = configMap
+ req.Devices = devicesMap
if !initRequestedEmptyProfiles && len(profiles) == 0 {
- resp, err = d.Init(name, iremote, image, nil, configMap, devicesMap, c.ephem)
+ req.Profiles = nil
} else {
- resp, err = d.Init(name, iremote, image, &profiles, configMap, devicesMap, c.ephem)
+ req.Profiles = profiles
}
- if err != nil {
- return err
+ req.Ephemeral = c.ephem
+
+ // Optimisation for simplestreams
+ if conf.Remotes[iremote].Protocol == "simplestreams" {
+ imgInfo = &api.Image{}
+ imgInfo.Fingerprint = image
+ imgInfo.Public = true
+ req.Source.Alias = image
+ } else {
+ // Attempt to resolve an image alias
+ alias, _, err := imgRemote.GetImageAlias(image)
+ if err == nil {
+ req.Source.Alias = image
+ image = alias.Target
+ }
+
+ // Get the image info
+ imgInfo, _, err = imgRemote.GetImage(image)
+ if err != nil {
+ return nil, "", err
+ }
}
- progress := ProgressRenderer{}
- c.initProgressTracker(d, &progress, resp.Operation)
+ // Create the container
+ op, err := d.CreateContainerFromImage(imgRemote, *imgInfo, req)
+ if err != nil {
+ return nil, "", err
+ }
- err = d.WaitForSuccess(resp.Operation)
- progress.Done("")
+ // Watch the background operation
+ progress := ProgressRenderer{Format: i18n.G("Retrieving image: %s")}
+ _, err = op.AddHandler(progress.UpdateOp)
+ if err != nil {
+ progress.Done("")
+ return nil, "", err
+ }
+ err = op.Wait()
if err != nil {
- return err
+ progress.Done("")
+ return nil, "", err
}
- op, err := resp.MetadataAsOperation()
+ progress.Done("")
+
+ // Extract the container name
+ opInfo, err := op.GetTarget()
if err != nil {
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
+ return nil, "", err
}
- containers, ok := op.Resources["containers"]
+ containers, ok := opInfo.Resources["containers"]
if !ok || len(containers) == 0 {
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
+ return nil, "", fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
}
if len(containers) == 1 && name == "" {
@@ -254,50 +313,13 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
}
+ // Validate the network setup
c.checkNetwork(d, name)
- return nil
+ return d, name, nil
}
-func (c *initCmd) initProgressTracker(d *lxd.Client, progress *ProgressRenderer, operation string) {
- progress.Format = i18n.G("Retrieving image: %s")
- handler := func(msg interface{}) {
- if msg == nil {
- return
- }
-
- event := msg.(map[string]interface{})
- if event["type"].(string) != "operation" {
- return
- }
-
- if event["metadata"] == nil {
- return
- }
-
- md := event["metadata"].(map[string]interface{})
- if !strings.HasSuffix(operation, md["id"].(string)) {
- return
- }
-
- if md["metadata"] == nil {
- return
- }
-
- if api.StatusCode(md["status_code"].(float64)).IsFinal() {
- return
- }
-
- opMd := md["metadata"].(map[string]interface{})
- _, ok := opMd["download_progress"]
- if ok {
- progress.Update(opMd["download_progress"].(string))
- }
- }
- go d.Monitor([]string{"operation"}, handler, nil)
-}
-
-func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string, iremote string, image string) (string, string) {
+func (c *initCmd) guessImage(conf *config.Config, d lxd.ContainerServer, remote string, iremote string, image string) (string, string) {
if remote != iremote {
return iremote, image
}
@@ -307,12 +329,12 @@ func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string,
return iremote, image
}
- target := d.GetAlias(image)
- if target != "" {
+ _, _, err := d.GetImageAlias(image)
+ if err == nil {
return iremote, image
}
- _, err := d.GetImageInfo(image)
+ _, _, err = d.GetImage(image)
if err == nil {
return iremote, image
}
@@ -321,8 +343,8 @@ func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string,
return image, "default"
}
-func (c *initCmd) checkNetwork(d *lxd.Client, name string) {
- ct, err := d.ContainerInfo(name)
+func (c *initCmd) checkNetwork(d lxd.ContainerServer, name string) {
+ ct, _, err := d.GetContainer(name)
if err != nil {
return
}
diff --git a/lxc/launch.go b/lxc/launch.go
index 424d85834..98bf46ff1 100644
--- a/lxc/launch.go
+++ b/lxc/launch.go
@@ -2,14 +2,10 @@ package main
import (
"fmt"
- "strings"
- "github.com/lxc/lxd"
"github.com/lxc/lxd/lxc/config"
- "github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/i18n"
- "github.com/lxc/lxd/shared/version"
)
type launchCmd struct {
@@ -39,133 +35,39 @@ func (c *launchCmd) flags() {
}
func (c *launchCmd) run(conf *config.Config, args []string) error {
- if len(args) > 2 || len(args) < 1 {
- return errArgs
- }
-
- iremote, image, err := conf.ParseRemote(args[0])
+ // Call the matching code from init
+ d, name, err := c.init.create(conf, args)
if err != nil {
return err
}
- var name string
+ // Get the remote
var remote string
if len(args) == 2 {
- remote, name, err = conf.ParseRemote(args[1])
+ remote, _, err = conf.ParseRemote(args[1])
if err != nil {
return err
}
} else {
- remote, name, err = conf.ParseRemote("")
- if err != nil {
- return err
- }
- }
-
- d, err := lxd.NewClient(conf.Legacy(), remote)
- if err != nil {
- return err
- }
-
- /*
- * initRequestedEmptyProfiles means user requested empty
- * !initRequestedEmptyProfiles but len(profArgs) == 0 means use profile default
- */
- var resp *api.Response
- profiles := []string{}
- for _, p := range c.init.profArgs {
- profiles = append(profiles, p)
- }
-
- iremote, image = c.init.guessImage(conf, d, remote, iremote, image)
-
- devicesMap := map[string]map[string]string{}
- if c.init.network != "" {
- network, err := d.NetworkGet(c.init.network)
- if err != nil {
- return err
- }
-
- if network.Type == "bridge" {
- devicesMap[c.init.network] = map[string]string{"type": "nic", "nictype": "bridged", "parent": c.init.network}
- } else {
- devicesMap[c.init.network] = map[string]string{"type": "nic", "nictype": "macvlan", "parent": c.init.network}
- }
- }
-
- // Check if the specified storage pool exists.
- if c.init.storagePool != "" {
- _, err := d.StoragePoolGet(c.init.storagePool)
+ remote, _, err = conf.ParseRemote("")
if err != nil {
return err
}
- devicesMap["root"] = map[string]string{
- "type": "disk",
- "path": "/",
- "pool": c.init.storagePool,
- }
}
- if !initRequestedEmptyProfiles && len(profiles) == 0 {
- resp, err = d.Init(name, iremote, image, nil, configMap, devicesMap, c.init.ephem)
- } else {
- resp, err = d.Init(name, iremote, image, &profiles, configMap, devicesMap, c.init.ephem)
- }
- if err != nil {
- return err
- }
-
- progress := ProgressRenderer{}
- c.init.initProgressTracker(d, &progress, resp.Operation)
-
- if name == "" {
- op, err := resp.MetadataAsOperation()
- if err != nil {
- progress.Done("")
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
- }
-
- containers, ok := op.Resources["containers"]
- if !ok || len(containers) == 0 {
- progress.Done("")
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
- }
-
- var restVersion string
- toScan := strings.Replace(containers[0], "/", " ", -1)
- count, err := fmt.Sscanf(toScan, " %s containers %s", &restVersion, &name)
- if err != nil {
- progress.Done("")
- return err
- }
-
- if count != 2 {
- progress.Done("")
- return fmt.Errorf(i18n.G("bad number of things scanned from image, container or snapshot"))
- }
-
- if restVersion != version.APIVersion {
- progress.Done("")
- return fmt.Errorf(i18n.G("got bad version"))
- }
- }
- fmt.Printf(i18n.G("Creating %s")+"\n", name)
-
- if err = d.WaitForSuccess(resp.Operation); err != nil {
- progress.Done("")
- return err
+ // Start the container
+ fmt.Printf(i18n.G("Starting %s")+"\n", name)
+ req := api.ContainerStatePut{
+ Action: "start",
+ Timeout: -1,
}
- progress.Done("")
- c.init.checkNetwork(d, name)
-
- fmt.Printf(i18n.G("Starting %s")+"\n", name)
- resp, err = d.Action(name, shared.Start, -1, false, false)
+ op, err := d.UpdateContainerState(name, req, "")
if err != nil {
return err
}
- err = d.WaitForSuccess(resp.Operation)
+ err = op.Wait()
if err != nil {
prettyName := name
if remote != "" {
From 7d12d28ec2f8a4ebbd0892c56c553e42c7eda37c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 1 Jun 2017 16:37:20 -0400
Subject: [PATCH 20/28] lxc/move: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/move.go | 28 ++++++++++++++++++++++------
1 file changed, 22 insertions(+), 6 deletions(-)
diff --git a/lxc/move.go b/lxc/move.go
index 27440fffd..9fcb3d229 100644
--- a/lxc/move.go
+++ b/lxc/move.go
@@ -1,11 +1,13 @@
package main
import (
- "github.com/lxc/lxd"
- "github.com/lxc/lxd/lxc/config"
- "github.com/lxc/lxd/shared/i18n"
+ "strings"
+ "github.com/lxc/lxd/lxc/config"
+ "github.com/lxc/lxd/shared"
+ "github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
+ "github.com/lxc/lxd/shared/i18n"
)
type moveCmd struct {
@@ -57,17 +59,31 @@ func (c *moveCmd) run(conf *config.Config, args []string) error {
// course, this changing of hostname isn't supported right now, so this
// simply won't work).
if sourceRemote == destRemote {
- source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
+ source, err := conf.GetContainerServer(sourceRemote)
if err != nil {
return err
}
- rename, err := source.Rename(sourceName, destName)
+ if shared.IsSnapshot(sourceName) {
+ // Snapshot rename
+ srcFields := strings.SplitN(sourceName, shared.SnapshotDelimiter, 2)
+ dstFields := strings.SplitN(destName, shared.SnapshotDelimiter, 2)
+
+ op, err := source.RenameContainerSnapshot(srcFields[0], srcFields[1], api.ContainerSnapshotPost{Name: dstFields[1]})
+ if err != nil {
+ return err
+ }
+
+ return op.Wait()
+ }
+
+ // Container rename
+ op, err := source.RenameContainer(sourceName, api.ContainerPost{Name: destName})
if err != nil {
return err
}
- return source.WaitForSuccess(rename.Operation)
+ return op.Wait()
}
cpy := copyCmd{}
From 427ec1b166dd52c9ea3289726c5b8dcfa80b715d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 15 Jun 2017 17:58:06 -0400
Subject: [PATCH 21/28] lxc/copy: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/copy.go | 287 +++++++++++++++++++++++-------------------------------------
1 file changed, 108 insertions(+), 179 deletions(-)
diff --git a/lxc/copy.go b/lxc/copy.go
index 80cc266d9..0ecdff7fd 100644
--- a/lxc/copy.go
+++ b/lxc/copy.go
@@ -4,10 +4,9 @@ import (
"fmt"
"strings"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
- "github.com/lxc/lxd/shared/api"
"github.com/lxc/lxd/shared/gnuflag"
"github.com/lxc/lxd/shared/i18n"
)
@@ -41,266 +40,196 @@ func (c *copyCmd) flags() {
}
func (c *copyCmd) copyContainer(conf *config.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error {
+ // Parse the source
sourceRemote, sourceName, err := conf.ParseRemote(sourceResource)
if err != nil {
return err
}
+ // Parse the destination
destRemote, destName, err := conf.ParseRemote(destResource)
if err != nil {
return err
}
+ // Make sure we have a container or snapshot name
if sourceName == "" {
- return fmt.Errorf(i18n.G("you must specify a source container name"))
+ return fmt.Errorf(i18n.G("You must specify a source container name"))
}
+ // If no destination name was provided, use the same as the source
if destName == "" && destResource != "" {
destName = sourceName
}
- source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
+ // Connect to the source host
+ source, err := conf.GetContainerServer(sourceRemote)
if err != nil {
return err
}
- var status struct {
- Architecture string
- Devices map[string]map[string]string
- 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
- // face of LVM and snapshots in general; this will probably make more
- // sense once that work is done.
- baseImage := ""
-
- if !shared.IsSnapshot(sourceName) {
- result, err := source.ContainerInfo(sourceName)
+ // Connect to the destination host
+ var dest lxd.ContainerServer
+ if sourceRemote == destRemote {
+ // Source and destination are the same
+ dest = source
+ } else {
+ // Destination is different, connect to it
+ dest, err = conf.GetContainerServer(destRemote)
if err != nil {
return err
}
+ }
- status.Architecture = result.Architecture
- status.Devices = result.Devices
- status.Config = result.Config
- status.Profiles = result.Profiles
+ var op *lxd.RemoteOperation
+ if shared.IsSnapshot(sourceName) {
+ // Prepare the container creation request
+ args := lxd.ContainerSnapshotCopyArgs{
+ Name: destName,
+ }
- } else {
- result, err := source.SnapshotInfo(sourceName)
+ // Copy of a snapshot into a new container
+ srcFields := strings.SplitN(sourceName, shared.SnapshotDelimiter, 2)
+ entry, _, err := source.GetContainerSnapshot(srcFields[0], srcFields[1])
if err != nil {
return err
}
- status.Architecture = result.Architecture
- status.Devices = result.Devices
- status.Config = result.Config
- status.Profiles = result.Profiles
- }
+ // Allow adding additional profiles
+ if c.profArgs != nil {
+ entry.Profiles = append(entry.Profiles, c.profArgs...)
+ }
- if c.profArgs != nil {
- status.Profiles = append(status.Profiles, c.profArgs...)
- }
+ // Allow setting additional config keys
+ if configMap != nil {
+ for key, value := range configMap {
+ entry.Config[key] = value
+ }
+ }
- if configMap != nil {
- for key, value := range configMap {
- status.Config[key] = value
+ // Allow overriding the ephemeral status
+ if ephemeral == 1 {
+ entry.Ephemeral = true
+ } else if ephemeral == 0 {
+ entry.Ephemeral = false
}
- }
- baseImage = status.Config["volatile.base_image"]
+ // Strip the volatile keys if requested
+ if !keepVolatile {
+ for k := range entry.Config {
+ if k == "volatile.base_image" {
+ continue
+ }
- if !keepVolatile {
- for k := range status.Config {
- if strings.HasPrefix(k, "volatile") {
- delete(status.Config, k)
+ if strings.HasPrefix(k, "volatile") {
+ delete(entry.Config, k)
+ }
}
}
- }
-
- // Do a local copy if the remotes are the same, otherwise do a migration
- if sourceRemote == destRemote {
- if sourceName == destName {
- return fmt.Errorf(i18n.G("can't copy to the same container name"))
- }
- cp, err := source.LocalCopy(sourceName, destName, status.Config, status.Profiles, ephemeral == 1, containerOnly)
+ // Do the actual copy
+ op, err = dest.CopyContainerSnapshot(source, *entry, &args)
if err != nil {
return err
}
+ } else {
+ // Prepare the container creation request
+ args := lxd.ContainerCopyArgs{
+ Name: destName,
+ Live: stateful,
+ ContainerOnly: containerOnly,
+ }
- err = source.WaitForSuccess(cp.Operation)
+ // Copy of a container into a new container
+ entry, _, err := source.GetContainer(sourceName)
if err != nil {
return err
}
- if destResource == "" {
- op, err := cp.MetadataAsOperation()
- if err != nil {
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
- }
+ // Allow adding additional profiles
+ if c.profArgs != nil {
+ entry.Profiles = append(entry.Profiles, c.profArgs...)
+ }
- containers, ok := op.Resources["containers"]
- if !ok || len(containers) == 0 {
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
+ // Allow setting additional config keys
+ if configMap != nil {
+ for key, value := range configMap {
+ entry.Config[key] = value
}
-
- fields := strings.Split(containers[0], "/")
- fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
}
- return nil
- }
-
- dest, err := lxd.NewClient(conf.Legacy(), destRemote)
- if err != nil {
- return err
- }
-
- sourceProfs := shared.NewStringSet(status.Profiles)
- destProfs := []string{}
-
- profiles, err := dest.ListProfiles()
- if err != nil {
- return err
- }
+ // Allow overriding the ephemeral status
+ if ephemeral == 1 {
+ entry.Ephemeral = true
+ } else if ephemeral == 0 {
+ entry.Ephemeral = false
+ }
- for _, profile := range profiles {
- destProfs = append(destProfs, profile.Name)
- }
+ // Strip the volatile keys if requested
+ if !keepVolatile {
+ for k := range entry.Config {
+ if k == "volatile.base_image" {
+ continue
+ }
- if !sourceProfs.IsSubset(shared.NewStringSet(destProfs)) {
- return fmt.Errorf(i18n.G("not all the profiles from the source exist on the target"))
- }
+ if strings.HasPrefix(k, "volatile") {
+ delete(entry.Config, k)
+ }
+ }
+ }
- if ephemeral == -1 {
- ct, err := source.ContainerInfo(sourceName)
+ // Do the actual copy
+ op, err = dest.CopyContainer(source, *entry, &args)
if err != nil {
return err
}
-
- if ct.Ephemeral {
- ephemeral = 1
- } else {
- ephemeral = 0
- }
}
- sourceWSResponse, err := source.GetMigrationSourceWS(sourceName, stateful, containerOnly)
+ // Wait for the copy to complete
+ err = op.Wait()
if err != nil {
return err
}
- secrets := map[string]string{}
-
- op, err := sourceWSResponse.MetadataAsOperation()
- if err != nil {
- return err
- }
-
- for k, v := range op.Metadata {
- secrets[k] = v.(string)
- }
-
- addresses, err := source.Addresses()
- if err != nil {
- return err
- }
-
- /* Since we're trying a bunch of different network ports that
- * may be invalid, we can get "bad handshake" errors when the
- * websocket code tries to connect. If the first error is a
- * real error, but the subsequent errors are only network
- * errors, we should try to report the first real error. Of
- * course, if all the errors are websocket errors, let's just
- * report that.
- */
- waitchan := make(chan map[int]error, 2)
- wait := func(cli *lxd.Client, op string, ch chan map[int]error, senderid int) {
- ch <- map[int]error{senderid: cli.WaitForSuccess(op)}
- }
-
- var migrationErrFromClient error
- for _, addr := range addresses {
- var migration *api.Response
-
- sourceWSUrl := "https://" + addr + sourceWSResponse.Operation
- migration, migrationErrFromClient = dest.MigrateFrom(destName, sourceWSUrl, source.Certificate, secrets, status.Architecture, status.Config, status.Devices, status.Profiles, baseImage, ephemeral == 1, false, source, sourceWSResponse.Operation, containerOnly)
- if migrationErrFromClient != nil {
- continue
- }
-
- // If push mode is implemented then MigrateFrom will return a
- // non-waitable operation. So this needs to be conditionalized
- // on pull mode.
- destOpId := 0
- go wait(dest, migration.Operation, waitchan, destOpId)
- sourceOpId := 1
- go wait(source, sourceWSResponse.Operation, waitchan, sourceOpId)
-
- var sourceOpErr error
- var destOpErr error
- for i := 0; i < cap(waitchan); i++ {
- tmp := <-waitchan
- err, ok := tmp[sourceOpId]
- if ok {
- sourceOpErr = err
- } else {
- destOpErr = err
- }
- }
-
- if destOpErr != nil {
- continue
- }
-
- if sourceOpErr != nil {
- return sourceOpErr
+ // If choosing a random name, show it to the user
+ if destResource == "" {
+ // Get the succesful operation data
+ opInfo, err := op.GetTarget()
+ if err != nil {
+ return err
}
- if destResource == "" {
- op, err := migration.MetadataAsOperation()
- if err != nil {
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
- }
-
- containers, ok := op.Resources["containers"]
- if !ok || len(containers) == 0 {
- return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
- }
-
- fields := strings.Split(containers[0], "/")
- fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
+ // Extract the list of affected containers
+ containers, ok := opInfo.Resources["containers"]
+ if !ok || len(containers) != 1 {
+ return fmt.Errorf(i18n.G("Failed to get the new container name"))
}
- return nil
- }
-
- // Check for an error at the source
- sourceOp, sourceErr := source.GetOperation(sourceWSResponse.Operation)
- if sourceErr == nil && sourceOp.Err != "" {
- return fmt.Errorf(i18n.G("Migration failed on source host: %s"), sourceOp.Err)
+ // Extract the name of the container
+ fields := strings.Split(containers[0], "/")
+ fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
}
- // Return the error from destination
- return fmt.Errorf(i18n.G("Migration failed on target host: %s"), migrationErrFromClient)
+ return nil
}
func (c *copyCmd) run(conf *config.Config, args []string) error {
+ // We at least need a source container name
if len(args) < 1 {
return errArgs
}
+ // For copies, default to non-ephemeral and allow override (move uses -1)
ephem := 0
if c.ephem {
ephem = 1
}
+ // If not target name is specified, one will be chosed by the server
if len(args) < 2 {
return c.copyContainer(conf, args[0], "", false, ephem, false, c.containerOnly)
}
+ // Normal copy with a pre-determined name
return c.copyContainer(conf, args[0], args[1], false, ephem, false, c.containerOnly)
}
From 528157f2a763183843f18ef336e9d472598856e7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 17:32:46 -0400
Subject: [PATCH 22/28] lxc/config: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/config.go | 369 ++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 243 insertions(+), 126 deletions(-)
diff --git a/lxc/config.go b/lxc/config.go
index ad2e62f71..f9b26642c 100644
--- a/lxc/config.go
+++ b/lxc/config.go
@@ -2,6 +2,7 @@ package main
import (
"crypto/x509"
+ "encoding/base64"
"encoding/pem"
"fmt"
"io/ioutil"
@@ -13,7 +14,7 @@ import (
"github.com/olekukonko/tablewriter"
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -136,12 +137,12 @@ func (c *configCmd) doSet(conf *config.Config, args []string, unset bool) error
}
// [[lxc config]] set dakara:c1 limits.memory 200000
- remote, container, err := conf.ParseRemote(args[1])
+ remote, name, err := conf.ParseRemote(args[1])
if err != nil {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -157,19 +158,28 @@ func (c *configCmd) doSet(conf *config.Config, args []string, unset bool) error
value = string(buf[:])
}
- if unset {
- st, err := d.ContainerInfo(container)
- if err != nil {
- return err
- }
+ container, etag, err := d.GetContainer(name)
+ if err != nil {
+ return err
+ }
- _, ok := st.Config[key]
+ if unset {
+ _, ok := container.Config[key]
if !ok {
- return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), key)
+ return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set"), key)
}
+
+ delete(container.Config, key)
+ } else {
+ container.Config[key] = value
+ }
+
+ op, err := d.UpdateContainer(name, container.Writable(), etag)
+ if err != nil {
+ return err
}
- return d.SetContainerConfig(container, key, value)
+ return op.Wait()
}
func (c *configCmd) run(conf *config.Config, args []string) error {
@@ -186,23 +196,23 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
// Deal with local server
if len(args) == 2 {
- c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
+ c, err := conf.GetContainerServer(conf.DefaultRemote)
if err != nil {
return err
}
- ss, err := c.ServerStatus()
+ server, etag, err := c.GetServer()
if err != nil {
return err
}
- _, ok := ss.Config[args[1]]
+ _, ok := server.Config[args[1]]
if !ok {
return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), args[1])
}
- _, err = c.SetServerConfig(args[1], "")
- return err
+ delete(server.Config, args[1])
+ return c.UpdateServer(server.Writable(), etag)
}
// Deal with remote server
@@ -212,23 +222,23 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
}
if container == "" {
- c, err := lxd.NewClient(conf.Legacy(), remote)
+ c, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- ss, err := c.ServerStatus()
+ server, etag, err := c.GetServer()
if err != nil {
return err
}
- _, ok := ss.Config[args[1]]
+ _, ok := server.Config[args[2]]
if !ok {
return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), args[1])
}
- _, err = c.SetServerConfig(args[2], "")
- return err
+ delete(server.Config, args[2])
+ return c.UpdateServer(server.Writable(), etag)
}
// Deal with container
@@ -242,13 +252,19 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
// Deal with local server
if len(args) == 3 {
- c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
+ c, err := conf.GetContainerServer(conf.DefaultRemote)
if err != nil {
return err
}
- _, err = c.SetServerConfig(args[1], args[2])
- return err
+ server, etag, err := c.GetServer()
+ if err != nil {
+ return err
+ }
+
+ server.Config[args[1]] = args[2]
+
+ return c.UpdateServer(server.Writable(), etag)
}
// Deal with remote server
@@ -258,13 +274,19 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
}
if container == "" {
- c, err := lxd.NewClient(conf.Legacy(), remote)
+ c, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- _, err = c.SetServerConfig(args[2], args[3])
- return err
+ server, etag, err := c.GetServer()
+ if err != nil {
+ return err
+ }
+
+ server.Config[args[2]] = args[3]
+
+ return c.UpdateServer(server.Writable(), etag)
}
// Deal with container
@@ -288,12 +310,12 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- trust, err := d.CertificateList()
+ trust, err := d.GetCertificates()
if err != nil {
return err
}
@@ -346,19 +368,24 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
fname := args[len(args)-1]
- cert, err := shared.ReadCert(fname)
+ x509Cert, err := shared.ReadCert(fname)
if err != nil {
return err
}
-
name, _ := shared.SplitExt(fname)
- return d.CertificateAdd(cert, name)
+
+ cert := api.CertificatesPost{}
+ cert.Certificate = base64.StdEncoding.EncodeToString(x509Cert.Raw)
+ cert.Name = name
+ cert.Type = "client"
+
+ return d.CreateCertificate(cert)
case "remove":
var remote string
if len(args) < 3 {
@@ -373,12 +400,12 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
remote = conf.DefaultRemote
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- return d.CertificateRemove(args[len(args)-1])
+ return d.DeleteCertificate(args[len(args)-1])
default:
return errArgs
}
@@ -394,7 +421,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
}
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -402,7 +429,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
var data []byte
if len(args) == 1 || container == "" {
- server, err := d.ServerStatus()
+ server, _, err := d.GetServer()
if err != nil {
return err
}
@@ -415,7 +442,9 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
} else {
var brief api.ContainerPut
if shared.IsSnapshot(container) {
- snap, err := d.SnapshotInfo(container)
+ fields := strings.Split(container, shared.SnapshotDelimiter)
+
+ snap, _, err := d.GetContainerSnapshot(fields[0], fields[1])
if err != nil {
return err
}
@@ -435,7 +464,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
}
}
} else {
- container, err := d.ContainerInfo(container)
+ container, _, err := d.GetContainer(container)
if err != nil {
return err
}
@@ -474,19 +503,19 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
key = args[2]
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
if container != "" {
- resp, err := d.ContainerInfo(container)
+ resp, _, err := d.GetContainer(container)
if err != nil {
return err
}
fmt.Println(resp.Config[key])
} else {
- resp, err := d.ServerStatus()
+ resp, _, err := d.GetServer()
if err != nil {
return err
}
@@ -543,7 +572,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
}
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -561,7 +590,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
return errArgs
}
-func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error {
+func (c *configCmd) doContainerConfigEdit(client lxd.ContainerServer, cont string) error {
// If stdin isn't a terminal, read text from it
if !termios.IsTerminal(int(syscall.Stdin)) {
contents, err := ioutil.ReadAll(os.Stdin)
@@ -574,11 +603,17 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
if err != nil {
return err
}
- return client.UpdateContainerConfig(cont, newdata)
+
+ op, err := client.UpdateContainer(cont, newdata, "")
+ if err != nil {
+ return err
+ }
+
+ return op.Wait()
}
// Extract the current value
- container, err := client.ContainerInfo(cont)
+ container, etag, err := client.GetContainer(cont)
if err != nil {
return err
}
@@ -600,7 +635,11 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
newdata := api.ContainerPut{}
err = yaml.Unmarshal(content, &newdata)
if err == nil {
- err = client.UpdateContainerConfig(cont, newdata)
+ var op *lxd.Operation
+ op, err = client.UpdateContainer(cont, newdata, etag)
+ if err == nil {
+ err = op.Wait()
+ }
}
// Respawn the editor
@@ -621,10 +660,11 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
}
break
}
+
return nil
}
-func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
+func (c *configCmd) doDaemonConfigEdit(client lxd.ContainerServer) error {
// If stdin isn't a terminal, read text from it
if !termios.IsTerminal(int(syscall.Stdin)) {
contents, err := ioutil.ReadAll(os.Stdin)
@@ -638,12 +678,11 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
return err
}
- _, err = client.UpdateServerConfig(newdata)
- return err
+ return client.UpdateServer(newdata, "")
}
// Extract the current value
- server, err := client.ServerStatus()
+ server, etag, err := client.GetServer()
if err != nil {
return err
}
@@ -665,7 +704,7 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
newdata := api.ServerPut{}
err = yaml.Unmarshal(content, &newdata)
if err == nil {
- _, err = client.UpdateServerConfig(newdata)
+ err = client.UpdateServer(newdata, etag)
}
// Respawn the editor
@@ -686,6 +725,7 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
}
break
}
+
return nil
}
@@ -699,36 +739,69 @@ func (c *configCmd) deviceAdd(conf *config.Config, which string, args []string)
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
devname := args[3]
- devtype := args[4]
- var props []string
+ device := map[string]string{}
+ device["type"] = args[4]
if len(args) > 5 {
- props = args[5:]
- } else {
- props = []string{}
+ for _, prop := range args[5:] {
+ results := strings.SplitN(prop, "=", 2)
+ if len(results) != 2 {
+ return fmt.Errorf("No value found in %q", prop)
+ }
+ k := results[0]
+ v := results[1]
+ device[k] = v
+ }
}
- var resp *api.Response
if which == "profile" {
- resp, err = client.ProfileDeviceAdd(name, devname, devtype, props)
+ profile, etag, err := client.GetProfile(name)
+ if err != nil {
+ return err
+ }
+
+ _, ok := profile.Devices[devname]
+ if ok {
+ return fmt.Errorf(i18n.G("The device already exists"))
+ }
+
+ profile.Devices[devname] = device
+
+ err = client.UpdateProfile(name, profile.Writable(), etag)
+ if err != nil {
+ return err
+ }
} else {
- resp, err = client.ContainerDeviceAdd(name, devname, devtype, props)
- }
- if err != nil {
- return err
- }
- if which != "profile" {
- err = client.WaitForSuccess(resp.Operation)
- }
- if err == nil {
- fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, name)
+ container, etag, err := client.GetContainer(name)
+ if err != nil {
+ return err
+ }
+
+ _, ok := container.Devices[devname]
+ if ok {
+ return fmt.Errorf(i18n.G("The device already exists"))
+ }
+
+ container.Devices[devname] = device
+
+ op, err := client.UpdateContainer(name, container.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
+ if err != nil {
+ return err
+ }
}
- return err
+
+ fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, name)
+ return nil
}
func (c *configCmd) deviceGet(conf *config.Config, which string, args []string) error {
@@ -741,7 +814,7 @@ func (c *configCmd) deviceGet(conf *config.Config, which string, args []string)
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -750,24 +823,24 @@ func (c *configCmd) deviceGet(conf *config.Config, which string, args []string)
key := args[4]
if which == "profile" {
- st, err := client.ProfileConfig(name)
+ profile, _, err := client.GetProfile(name)
if err != nil {
return err
}
- dev, ok := st.Devices[devname]
+ dev, ok := profile.Devices[devname]
if !ok {
return fmt.Errorf(i18n.G("The device doesn't exist"))
}
fmt.Println(dev[key])
} else {
- st, err := client.ContainerInfo(name)
+ container, _, err := client.GetContainer(name)
if err != nil {
return err
}
- dev, ok := st.Devices[devname]
+ dev, ok := container.Devices[devname]
if !ok {
return fmt.Errorf(i18n.G("The device doesn't exist"))
}
@@ -788,7 +861,7 @@ func (c *configCmd) deviceSet(conf *config.Config, which string, args []string)
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -798,44 +871,49 @@ func (c *configCmd) deviceSet(conf *config.Config, which string, args []string)
value := args[5]
if which == "profile" {
- st, err := client.ProfileConfig(name)
+ profile, etag, err := client.GetProfile(name)
if err != nil {
return err
}
- dev, ok := st.Devices[devname]
+ dev, ok := profile.Devices[devname]
if !ok {
return fmt.Errorf(i18n.G("The device doesn't exist"))
}
dev[key] = value
- st.Devices[devname] = dev
+ profile.Devices[devname] = dev
- err = client.PutProfile(name, st.Writable())
+ err = client.UpdateProfile(name, profile.Writable(), etag)
if err != nil {
return err
}
} else {
- st, err := client.ContainerInfo(name)
+ container, etag, err := client.GetContainer(name)
if err != nil {
return err
}
- dev, ok := st.Devices[devname]
+ dev, ok := container.Devices[devname]
if !ok {
return fmt.Errorf(i18n.G("The device doesn't exist"))
}
dev[key] = value
- st.Devices[devname] = dev
+ container.Devices[devname] = dev
- err = client.UpdateContainerConfig(name, st.Writable())
+ op, err := client.UpdateContainer(name, container.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
if err != nil {
return err
}
}
- return err
+ return nil
}
func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string) error {
@@ -848,7 +926,7 @@ func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -857,44 +935,47 @@ func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string
key := args[4]
if which == "profile" {
- st, err := client.ProfileConfig(name)
+ profile, etag, err := client.GetProfile(name)
if err != nil {
return err
}
- dev, ok := st.Devices[devname]
+ dev, ok := profile.Devices[devname]
if !ok {
return fmt.Errorf(i18n.G("The device doesn't exist"))
}
-
delete(dev, key)
- st.Devices[devname] = dev
+ profile.Devices[devname] = dev
- err = client.PutProfile(name, st.Writable())
+ err = client.UpdateProfile(name, profile.Writable(), etag)
if err != nil {
return err
}
} else {
- st, err := client.ContainerInfo(name)
+ container, etag, err := client.GetContainer(name)
if err != nil {
return err
}
- dev, ok := st.Devices[devname]
+ dev, ok := container.Devices[devname]
if !ok {
return fmt.Errorf(i18n.G("The device doesn't exist"))
}
-
delete(dev, key)
- st.Devices[devname] = dev
+ container.Devices[devname] = dev
+
+ op, err := client.UpdateContainer(name, container.Writable(), etag)
+ if err != nil {
+ return err
+ }
- err = client.UpdateContainerConfig(name, st.Writable())
+ err = op.Wait()
if err != nil {
return err
}
}
- return err
+ return nil
}
func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) error {
@@ -907,28 +988,54 @@ func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) e
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
devname := args[3]
- var resp *api.Response
+
if which == "profile" {
- resp, err = client.ProfileDeviceDelete(name, devname)
+ profile, etag, err := client.GetProfile(name)
+ if err != nil {
+ return err
+ }
+
+ _, ok := profile.Devices[devname]
+ if !ok {
+ return fmt.Errorf(i18n.G("The device doesn't exist"))
+ }
+ delete(profile.Devices, devname)
+
+ err = client.UpdateProfile(name, profile.Writable(), etag)
+ if err != nil {
+ return err
+ }
} else {
- resp, err = client.ContainerDeviceDelete(name, devname)
- }
- if err != nil {
- return err
- }
- if which != "profile" {
- err = client.WaitForSuccess(resp.Operation)
- }
- if err == nil {
- fmt.Printf(i18n.G("Device %s removed from %s")+"\n", devname, name)
+ container, etag, err := client.GetContainer(name)
+ if err != nil {
+ return err
+ }
+
+ _, ok := container.Devices[devname]
+ if !ok {
+ return fmt.Errorf(i18n.G("The device doesn't exist"))
+ }
+ delete(container.Devices, devname)
+
+ op, err := client.UpdateContainer(name, container.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
+ if err != nil {
+ return err
+ }
}
- return err
+
+ fmt.Printf(i18n.G("Device %s removed from %s")+"\n", devname, name)
+ return nil
}
func (c *configCmd) deviceList(conf *config.Config, which string, args []string) error {
@@ -941,22 +1048,33 @@ func (c *configCmd) deviceList(conf *config.Config, which string, args []string)
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- var resp []string
+ var devices []string
if which == "profile" {
- resp, err = client.ProfileListDevices(name)
+ profile, _, err := client.GetProfile(name)
+ if err != nil {
+ return err
+ }
+
+ for k := range profile.Devices {
+ devices = append(devices, k)
+ }
} else {
- resp, err = client.ContainerListDevices(name)
- }
- if err != nil {
- return err
+ container, _, err := client.GetContainer(name)
+ if err != nil {
+ return err
+ }
+
+ for k := range container.Devices {
+ devices = append(devices, k)
+ }
}
- fmt.Printf("%s\n", strings.Join(resp, "\n"))
+ fmt.Printf("%s\n", strings.Join(devices, "\n"))
return nil
}
@@ -970,26 +1088,26 @@ func (c *configCmd) deviceShow(conf *config.Config, which string, args []string)
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
var devices map[string]map[string]string
if which == "profile" {
- resp, err := client.ProfileConfig(name)
+ profile, _, err := client.GetProfile(name)
if err != nil {
return err
}
- devices = resp.Devices
+ devices = profile.Devices
} else {
- resp, err := client.ContainerInfo(name)
+ container, _, err := client.GetContainer(name)
if err != nil {
return err
}
- devices = resp.Devices
+ devices = container.Devices
}
data, err := yaml.Marshal(&devices)
@@ -998,6 +1116,5 @@ func (c *configCmd) deviceShow(conf *config.Config, which string, args []string)
}
fmt.Printf(string(data))
-
return nil
}
From 8dfda04c2370fa1df0abf4239ceea5157b198908 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 18:11:47 -0400
Subject: [PATCH 23/28] lxc/profile: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/profile.go | 149 ++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 95 insertions(+), 54 deletions(-)
diff --git a/lxc/profile.go b/lxc/profile.go
index 6c9401659..fad41668b 100644
--- a/lxc/profile.go
+++ b/lxc/profile.go
@@ -5,12 +5,13 @@ import (
"io/ioutil"
"os"
"sort"
+ "strings"
"syscall"
"github.com/olekukonko/tablewriter"
"gopkg.in/yaml.v2"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
@@ -146,7 +147,7 @@ func (c *profileCmd) run(conf *config.Config, args []string) error {
return err
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -208,15 +209,18 @@ func (c *profileCmd) run(conf *config.Config, args []string) error {
}
}
-func (c *profileCmd) doProfileCreate(client *lxd.Client, p string) error {
- err := client.ProfileCreate(p)
+func (c *profileCmd) doProfileCreate(client lxd.ContainerServer, p string) error {
+ profile := api.ProfilesPost{}
+ profile.Name = p
+
+ err := client.CreateProfile(profile)
if err == nil {
fmt.Printf(i18n.G("Profile %s created")+"\n", p)
}
return err
}
-func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
+func (c *profileCmd) doProfileEdit(client lxd.ContainerServer, p string) error {
// If stdin isn't a terminal, read text from it
if !termios.IsTerminal(int(syscall.Stdin)) {
contents, err := ioutil.ReadAll(os.Stdin)
@@ -229,11 +233,12 @@ func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
if err != nil {
return err
}
- return client.PutProfile(p, newdata)
+
+ return client.UpdateProfile(p, newdata, "")
}
// Extract the current value
- profile, err := client.ProfileConfig(p)
+ profile, etag, err := client.GetProfile(p)
if err != nil {
return err
}
@@ -254,7 +259,7 @@ func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
newdata := api.ProfilePut{}
err = yaml.Unmarshal(content, &newdata)
if err == nil {
- err = client.PutProfile(p, newdata)
+ err = client.UpdateProfile(p, newdata, etag)
}
// Respawn the editor
@@ -278,61 +283,80 @@ func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
return nil
}
-func (c *profileCmd) doProfileDelete(client *lxd.Client, p string) error {
- err := client.ProfileDelete(p)
- if err == nil {
- fmt.Printf(i18n.G("Profile %s deleted")+"\n", p)
+func (c *profileCmd) doProfileDelete(client lxd.ContainerServer, p string) error {
+ err := client.DeleteProfile(p)
+ if err != nil {
+ return err
}
- return err
+
+ fmt.Printf(i18n.G("Profile %s deleted")+"\n", p)
+ return nil
}
-func (c *profileCmd) doProfileAssign(client *lxd.Client, d string, p string) error {
- resp, err := client.AssignProfile(d, p)
+func (c *profileCmd) doProfileAssign(client lxd.ContainerServer, d string, p string) error {
+ container, etag, err := client.GetContainer(d)
if err != nil {
return err
}
- err = client.WaitForSuccess(resp.Operation)
- if err == nil {
- if p == "" {
- p = i18n.G("(none)")
- }
- fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", p, d)
+ if p != "" {
+ container.Profiles = strings.Split(p, ",")
+ } else {
+ container.Profiles = nil
}
- return err
+ op, err := client.UpdateContainer(d, container.Writable(), etag)
+ if err != nil {
+ return err
+ }
+
+ err = op.Wait()
+ if err != nil {
+ return err
+ }
+
+ if p == "" {
+ p = i18n.G("(none)")
+ }
+ fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", p, d)
+
+ return nil
}
-func (c *profileCmd) doProfileAdd(client *lxd.Client, d string, p string) error {
- ct, err := client.ContainerInfo(d)
+func (c *profileCmd) doProfileAdd(client lxd.ContainerServer, d string, p string) error {
+ container, etag, err := client.GetContainer(d)
if err != nil {
return err
}
- ct.Profiles = append(ct.Profiles, p)
+ container.Profiles = append(container.Profiles, p)
- err = client.UpdateContainerConfig(d, ct.Writable())
+ op, err := client.UpdateContainer(d, container.Writable(), etag)
if err != nil {
return err
}
- fmt.Printf(i18n.G("Profile %s added to %s")+"\n", p, d)
+ err = op.Wait()
+ if err != nil {
+ return err
+ }
- return err
+ fmt.Printf(i18n.G("Profile %s added to %s")+"\n", p, d)
+ return nil
}
-func (c *profileCmd) doProfileRemove(client *lxd.Client, d string, p string) error {
- ct, err := client.ContainerInfo(d)
+func (c *profileCmd) doProfileRemove(client lxd.ContainerServer, d string, p string) error {
+ container, etag, err := client.GetContainer(d)
if err != nil {
return err
}
- if !shared.StringInSlice(p, ct.Profiles) {
+ if !shared.StringInSlice(p, container.Profiles) {
return fmt.Errorf("Profile %s isn't currently applied to %s", p, d)
}
profiles := []string{}
- for _, profile := range ct.Profiles {
+ for _, profile := range container.Profiles {
if profile == p {
continue
}
@@ -340,20 +364,24 @@ func (c *profileCmd) doProfileRemove(client *lxd.Client, d string, p string) err
profiles = append(profiles, profile)
}
- ct.Profiles = profiles
+ container.Profiles = profiles
- err = client.UpdateContainerConfig(d, ct.Writable())
+ op, err := client.UpdateContainer(d, container.Writable(), etag)
if err != nil {
return err
}
- fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", p, d)
+ err = op.Wait()
+ if err != nil {
+ return err
+ }
- return err
+ fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", p, d)
+ return nil
}
-func (c *profileCmd) doProfileShow(client *lxd.Client, p string) error {
- profile, err := client.ProfileConfig(p)
+func (c *profileCmd) doProfileShow(client lxd.ContainerServer, p string) error {
+ profile, _, err := client.GetProfile(p)
if err != nil {
return err
}
@@ -368,7 +396,7 @@ func (c *profileCmd) doProfileShow(client *lxd.Client, p string) error {
return nil
}
-func (c *profileCmd) doProfileCopy(conf *config.Config, client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileCopy(conf *config.Config, client lxd.ContainerServer, p string, args []string) error {
if len(args) != 1 {
return errArgs
}
@@ -382,12 +410,22 @@ func (c *profileCmd) doProfileCopy(conf *config.Config, client *lxd.Client, p st
newname = p
}
- dest, err := lxd.NewClient(conf.Legacy(), remote)
+ dest, err := conf.GetContainerServer(remote)
+ if err != nil {
+ return err
+ }
+
+ profile, _, err := client.GetProfile(p)
if err != nil {
return err
}
- return client.ProfileCopy(p, newname, dest)
+ newProfile := api.ProfilesPost{
+ ProfilePut: profile.Writable(),
+ Name: newname,
+ }
+
+ return dest.CreateProfile(newProfile)
}
func (c *profileCmd) doProfileDevice(conf *config.Config, args []string) error {
@@ -420,25 +458,22 @@ func (c *profileCmd) doProfileDevice(conf *config.Config, args []string) error {
}
}
-func (c *profileCmd) doProfileGet(client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileGet(client lxd.ContainerServer, p string, args []string) error {
// we shifted @args so so it should read "<key>"
if len(args) != 1 {
return errArgs
}
- resp, err := client.GetProfileConfig(p)
+ profile, _, err := client.GetProfile(p)
if err != nil {
return err
}
- for k, v := range resp {
- if k == args[0] {
- fmt.Printf("%s\n", v)
- }
- }
+
+ fmt.Printf("%s\n", profile.Config[args[0]])
return nil
}
-func (c *profileCmd) doProfileSet(client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileSet(client lxd.ContainerServer, p string, args []string) error {
// we shifted @args so so it should read "<key> [<value>]"
if len(args) < 1 {
return errArgs
@@ -460,11 +495,17 @@ func (c *profileCmd) doProfileSet(client *lxd.Client, p string, args []string) e
value = string(buf[:])
}
- err := client.SetProfileConfigItem(p, key, value)
- return err
+ profile, etag, err := client.GetProfile(p)
+ if err != nil {
+ return err
+ }
+
+ profile.Config[key] = value
+
+ return client.UpdateProfile(p, profile.Writable(), etag)
}
-func (c *profileCmd) doProfileUnset(client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileUnset(client lxd.ContainerServer, p string, args []string) error {
// we shifted @args so so it should read "<key> [<value>]"
if len(args) != 1 {
return errArgs
@@ -490,12 +531,12 @@ func (c *profileCmd) doProfileList(conf *config.Config, args []string) error {
remote = conf.DefaultRemote
}
- client, err := lxd.NewClient(conf.Legacy(), remote)
+ client, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- profiles, err := client.ListProfiles()
+ profiles, err := client.GetProfiles()
if err != nil {
return err
}
From e089379cdddde9e7448d6904c0c349f75e4f5928 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:48:44 -0400
Subject: [PATCH 24/28] lxc/file: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/file.go | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 164 insertions(+), 16 deletions(-)
diff --git a/lxc/file.go b/lxc/file.go
index 6821fefdd..d56d46d0d 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -6,11 +6,12 @@ import (
"io/ioutil"
"os"
"path"
+ "path/filepath"
"strconv"
"strings"
"syscall"
- "github.com/lxc/lxd"
+ "github.com/lxc/lxd/client"
"github.com/lxc/lxd/lxc/config"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/gnuflag"
@@ -69,6 +70,145 @@ func (c *fileCmd) flags() {
gnuflag.BoolVar(&c.mkdirs, "p", false, i18n.G("Create any directories necessary"))
}
+func (c *fileCmd) recursivePullFile(d lxd.ContainerServer, container string, p string, targetDir string) error {
+ buf, resp, err := d.GetContainerFile(container, p)
+ if err != nil {
+ return err
+ }
+
+ target := filepath.Join(targetDir, filepath.Base(p))
+ if resp.Type == "directory" {
+ if err := os.Mkdir(target, os.FileMode(resp.Mode)); err != nil {
+ return err
+ }
+
+ for _, ent := range resp.Entries {
+ nextP := path.Join(p, ent)
+ if err := c.recursivePullFile(d, container, nextP, target); err != nil {
+ return err
+ }
+ }
+ } else if resp.Type == "file" {
+ f, err := os.Create(target)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ err = os.Chmod(target, os.FileMode(resp.Mode))
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(f, buf)
+ if err != nil {
+ return err
+ }
+ } else {
+ return fmt.Errorf(i18n.G("Unknown file type '%s'"), resp.Type)
+ }
+
+ return nil
+}
+
+func (c *fileCmd) recursivePushFile(d lxd.ContainerServer, container string, source string, target string) error {
+ sourceDir, _ := filepath.Split(source)
+ sourceLen := len(sourceDir)
+
+ sendFile := func(p string, fInfo os.FileInfo, err error) error {
+ if err != nil {
+ return fmt.Errorf(i18n.G("Failed to walk path for %s: %s"), p, err)
+ }
+
+ // Detect symlinks
+ if !fInfo.Mode().IsRegular() && !fInfo.Mode().IsDir() {
+ return fmt.Errorf(i18n.G("'%s' isn't a regular file or directory."), p)
+ }
+
+ targetPath := path.Join(target, filepath.ToSlash(p[sourceLen:]))
+ if fInfo.IsDir() {
+ mode, uid, gid := shared.GetOwnerMode(fInfo)
+ args := lxd.ContainerFileArgs{
+ UID: int64(uid),
+ GID: int64(gid),
+ Mode: int(mode.Perm()),
+ Type: "directory",
+ }
+
+ return d.CreateContainerFile(container, targetPath, args)
+ }
+
+ f, err := os.Open(p)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ mode, uid, gid := shared.GetOwnerMode(fInfo)
+
+ args := lxd.ContainerFileArgs{
+ Content: f,
+ UID: int64(uid),
+ GID: int64(gid),
+ Mode: int(mode.Perm()),
+ Type: "file",
+ }
+
+ return d.CreateContainerFile(container, targetPath, args)
+ }
+
+ return filepath.Walk(source, sendFile)
+}
+
+func (c *fileCmd) recursiveMkdir(d lxd.ContainerServer, container string, p string, mode os.FileMode, uid int64, gid int64) error {
+ /* special case, every container has a /, we don't need to do anything */
+ if p == "/" {
+ return nil
+ }
+
+ // Remove trailing "/" e.g. /A/B/C/. Otherwise we will end up with an
+ // empty array entry "" which will confuse the Mkdir() loop below.
+ pclean := filepath.Clean(p)
+ parts := strings.Split(pclean, "/")
+ i := len(parts)
+
+ for ; i >= 1; i-- {
+ cur := filepath.Join(parts[:i]...)
+ _, resp, err := d.GetContainerFile(container, cur)
+ if err != nil {
+ continue
+ }
+
+ if resp.Type != "directory" {
+ return fmt.Errorf(i18n.G("%s is not a directory"), cur)
+ }
+
+ i++
+ break
+ }
+
+ for ; i <= len(parts); i++ {
+ cur := filepath.Join(parts[:i]...)
+ if cur == "" {
+ continue
+ }
+
+ args := lxd.ContainerFileArgs{
+ UID: uid,
+ GID: gid,
+ Mode: int(mode.Perm()),
+ Type: "directory",
+ }
+
+ err := d.CreateContainerFile(container, cur, args)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string) error {
if len(args) < 2 {
return errArgs
@@ -99,7 +239,7 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
logger.Debugf("Pushing to: %s (isdir: %t)", targetPath, targetIsDir)
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
@@ -141,13 +281,13 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
}
mode, uid, gid := shared.GetOwnerMode(finfo)
- if err := d.MkdirP(container, targetPath, mode, uid, gid); err != nil {
+ if err := c.recursiveMkdir(d, container, targetPath, mode, int64(uid), int64(gid)); err != nil {
return err
}
}
for _, fname := range sourcefilenames {
- if err := d.RecursivePushFile(container, fname, targetPath); err != nil {
+ if err := c.recursivePushFile(d, container, fname, targetPath); err != nil {
return err
}
}
@@ -214,11 +354,18 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
}
}
- if err := d.MkdirP(container, path.Dir(fpath), mode, uid, gid); err != nil {
+ if err := c.recursiveMkdir(d, container, path.Dir(fpath), mode, int64(uid), int64(gid)); err != nil {
return err
}
}
+ args := lxd.ContainerFileArgs{
+ Content: f,
+ UID: -1,
+ GID: -1,
+ Mode: -1,
+ }
+
if send_file_perms {
if c.mode == "" || c.uid == -1 || c.gid == -1 {
finfo, err := f.Stat()
@@ -244,11 +391,12 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
}
}
- err = d.PushFile(container, fpath, gid, uid, fmt.Sprintf("%04o", mode.Perm()), f)
- } else {
- err = d.PushFile(container, fpath, -1, -1, "", f)
+ args.UID = int64(uid)
+ args.GID = int64(gid)
+ args.Mode = int(mode.Perm())
}
+ err = d.CreateContainerFile(container, fpath, args)
if err != nil {
return err
}
@@ -300,26 +448,26 @@ func (c *fileCmd) pull(conf *config.Config, args []string) error {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
if c.recursive {
- if err := d.RecursivePullFile(container, pathSpec[1], target); err != nil {
+ if err := c.recursivePullFile(d, container, pathSpec[1], target); err != nil {
return err
}
continue
}
- _, _, mode, type_, buf, _, err := d.PullFile(container, pathSpec[1])
+ buf, resp, err := d.GetContainerFile(container, pathSpec[1])
if err != nil {
return err
}
- if type_ == "directory" {
- return fmt.Errorf(i18n.G("can't pull a directory without --recursive"))
+ if resp.Type == "directory" {
+ return fmt.Errorf(i18n.G("Can't pull a directory without --recursive"))
}
var targetPath string
@@ -339,7 +487,7 @@ func (c *fileCmd) pull(conf *config.Config, args []string) error {
}
defer f.Close()
- err = os.Chmod(targetPath, os.FileMode(mode))
+ err = os.Chmod(targetPath, os.FileMode(resp.Mode))
if err != nil {
return err
}
@@ -370,12 +518,12 @@ func (c *fileCmd) delete(conf *config.Config, args []string) error {
return err
}
- d, err := lxd.NewClient(conf.Legacy(), remote)
+ d, err := conf.GetContainerServer(remote)
if err != nil {
return err
}
- err = d.DeleteFile(container, pathSpec[1])
+ err = d.DeleteContainerFile(container, pathSpec[1])
if err != nil {
return err
}
From 6cfa0514ae34f27d263ff9abf8ee2852cc53f5d7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 27 Apr 2017 23:36:09 -0400
Subject: [PATCH 25/28] i18n: Update translations
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
po/de.po | 648 ++++++++++++++++++++++++++++++-----------------------------
po/el.po | 618 ++++++++++++++++++++++++++++----------------------------
po/fr.po | 648 +++++++++++++++++++++++++++++++----------------------------
po/it.po | 618 ++++++++++++++++++++++++++++----------------------------
po/ja.po | 666 ++++++++++++++++++++++++++++++++-----------------------------
po/lxd.pot | 609 ++++++++++++++++++++++++++++---------------------------
po/nl.po | 618 ++++++++++++++++++++++++++++----------------------------
po/ru.po | 618 ++++++++++++++++++++++++++++----------------------------
po/sr.po | 618 ++++++++++++++++++++++++++++----------------------------
po/sv.po | 618 ++++++++++++++++++++++++++++----------------------------
po/tr.po | 618 ++++++++++++++++++++++++++++----------------------------
11 files changed, 3542 insertions(+), 3355 deletions(-)
diff --git a/po/de.po b/po/de.po
index 96d2c8983..b9de1d014 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LXD\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: 2017-02-14 17:11+0000\n"
"Last-Translator: Tim Rose <tim at netlope.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/linux-containers/"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.14-dev\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
#, fuzzy
msgid ""
"### This is a yaml representation of a storage pool.\n"
@@ -54,7 +54,7 @@ msgstr ""
"###\n"
"### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
-#: lxc/storage.go:47
+#: lxc/storage.go:48
#, fuzzy
msgid ""
"### This is a yaml representation of a storage volume.\n"
@@ -75,7 +75,7 @@ msgstr ""
"### Zum Beispiel:\n"
"### description: Mein eigenes Abbild\n"
-#: lxc/config.go:37
+#: lxc/config.go:39
#, fuzzy
msgid ""
"### This is a yaml representation of the configuration.\n"
@@ -114,7 +114,7 @@ msgstr ""
"###\n"
"### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
-#: lxc/image.go:59
+#: lxc/image.go:62
#, fuzzy
msgid ""
"### This is a yaml representation of the image properties.\n"
@@ -131,7 +131,7 @@ msgstr ""
"### Zum Beispiel:\n"
"### description: Mein eigenes Abbild\n"
-#: lxc/network.go:29
+#: lxc/network.go:30
#, fuzzy
msgid ""
"### This is a yaml representation of the network.\n"
@@ -169,7 +169,7 @@ msgstr ""
"###\n"
"### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
-#: lxc/profile.go:28
+#: lxc/profile.go:30
#, fuzzy
msgid ""
"### This is a yaml representation of the profile.\n"
@@ -208,109 +208,133 @@ msgstr ""
"###\n"
"### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
#, fuzzy
msgid "'/' not allowed in snapshot name"
msgstr "'/' ist kein gültiges Zeichen im Namen eines Sicherungspunktes\n"
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr "Akzeptiere Zertifikat"
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr "Administrator Passwort für %s: "
-#: lxc/image.go:483
+#: lxc/image.go:569
#, fuzzy
msgid "Aliases:"
msgstr "Aliasse:\n"
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, fuzzy, c-format
msgid "Architecture: %s"
msgstr "Architektur: %s\n"
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr "automatisches Update: %s"
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, fuzzy, c-format
+msgid "Bad property: %s"
+msgstr "Ungültige Abbild Eigenschaft: %s\n"
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr "Bytes empfangen"
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr "Bytes gesendet"
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
#, fuzzy
msgid "CPU usage:"
msgstr " Prozessorauslastung:"
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr "ERSTELLT AM"
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, fuzzy, c-format
msgid "Certificate fingerprint: %s"
msgstr "Fingerabdruck des Zertifikats: % x\n"
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr "Gespeichertes Nutzerzertifikat auf dem Server: "
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -318,36 +342,36 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
#, fuzzy
msgid "Config key/value to apply to the new container"
msgstr "kann nicht zum selben Container Namen kopieren"
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, fuzzy, c-format
msgid "Config parsing error: %s"
msgstr "YAML Analyse Fehler %v\n"
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, fuzzy, c-format
msgid "Container published with fingerprint: %s"
msgstr "Abbild mit Fingerabdruck %s importiert\n"
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr "Kopiere Aliasse von der Quelle"
@@ -356,89 +380,94 @@ msgstr "Kopiere Aliasse von der Quelle"
msgid "Copy the container without its snapshots"
msgstr "Herunterfahren des Containers erzwingen."
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr "Kann Verzeichnis für Zertifikate auf dem Server nicht erstellen"
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
#, fuzzy
msgid "Creating the container"
msgstr "kann nicht zum selben Container Namen kopieren"
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, fuzzy, c-format
msgid "Device %s added to %s"
msgstr "Gerät %s wurde zu %s hinzugefügt\n"
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, fuzzy, c-format
msgid "Device %s removed from %s"
msgstr "Gerät %s wurde von %s entfernt\n"
-#: lxc/exec.go:64
+#: lxc/utils.go:248 lxc/utils.go:272
+#, fuzzy, c-format
+msgid "Device already exists: %s"
+msgstr "entfernte Instanz %s existiert bereits"
+
+#: lxc/exec.go:65
msgid "Disable pseudo-terminal allocation"
msgstr ""
-#: lxc/exec.go:65
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
#, fuzzy
msgid "Disk usage:"
msgstr " Prozessorauslastung:"
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
#, fuzzy
msgid "Enable debug mode"
msgstr "Aktiviert Debug Modus"
-#: lxc/main.go:44
+#: lxc/main.go:46
#, fuzzy
msgid "Enable verbose mode"
msgstr "Aktiviert ausführliche Ausgabe"
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -446,7 +475,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr "Flüchtiger Container"
@@ -454,16 +483,21 @@ msgstr "Flüchtiger Container"
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -477,16 +511,26 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+#, fuzzy
+msgid "Failed to get the new container name"
+msgstr "kann nicht zum selben Container Namen kopieren"
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, fuzzy, c-format
msgid "Fingerprint: %s"
msgstr "Fingerabdruck: %s\n"
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -495,40 +539,40 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr "Herunterfahren des Containers erzwingen."
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
#, fuzzy
msgid "Generating a client certificate. This may take a minute..."
msgstr "Generiere Nutzerzertifikat. Dies kann wenige Minuten dauern...\n"
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -537,254 +581,238 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr "Herunterfahren des Containers erzwingen."
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, fuzzy, c-format
msgid "Image imported with fingerprint: %s"
msgstr "Abbild mit Fingerabdruck %s importiert\n"
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
#, fuzzy
msgid "Invalid certificate"
msgstr "Akzeptiere Zertifikat"
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, fuzzy, c-format
msgid "Invalid path %s"
msgstr "Ungültiges Ziel %s"
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr "Ungültige Quelle %s"
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr "Ungültiges Ziel %s"
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr "Veröffentliche Abbild"
-#: lxc/publish.go:34
+#: lxc/publish.go:35
#, fuzzy
msgid "Make the image public"
msgstr "Veröffentliche Abbild"
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr ""
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr "Fehlende Zusammenfassung."
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
"Mehr als eine Datei herunterzuladen, aber das Ziel ist kein Verzeichnis"
-#: lxc/move.go:35
+#: lxc/move.go:38
#, fuzzy
msgid "Move the container without its snapshots"
msgstr "Herunterfahren des Containers erzwingen."
-#: lxc/action.go:68
+#: lxc/action.go:72
#, fuzzy
msgid "Must supply container name for: "
msgstr "der Name des Ursprung Containers muss angegeben werden"
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, fuzzy, c-format
msgid "Network %s created"
msgstr "Profil %s erstellt\n"
-#: lxc/network.go:325
+#: lxc/network.go:366
#, fuzzy, c-format
msgid "Network %s deleted"
msgstr "Profil %s gelöscht\n"
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
#, fuzzy
msgid "Network usage:"
msgstr "Profil %s erstellt\n"
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
#, fuzzy
msgid "No certificate provided to add"
msgstr "Kein Zertifikat zum hinzufügen bereitgestellt"
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
#, fuzzy
msgid "No device found for this network"
msgstr "Kein Zertifikat für diese Verbindung"
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
#, fuzzy
msgid "No device found for this storage volume."
msgstr "Kein Zertifikat für diese Verbindung"
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr "Kein Fingerabdruck angegeben."
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -798,25 +826,25 @@ msgstr "Alternatives config Verzeichnis."
msgid "Path to an alternate server directory"
msgstr "Alternatives config Verzeichnis."
-#: lxc/main.go:202
+#: lxc/main.go:216
#, fuzzy
msgid "Pause containers."
msgstr "kann nicht zum selben Container Namen kopieren"
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -832,147 +860,147 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, fuzzy, c-format
msgid "Processes: %d"
msgstr "Profil %s erstellt\n"
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, fuzzy, c-format
msgid "Profile %s added to %s"
msgstr "Profil %s wurde auf %s angewandt\n"
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, fuzzy, c-format
msgid "Profile %s created"
msgstr "Profil %s erstellt\n"
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, fuzzy, c-format
msgid "Profile %s deleted"
msgstr "Profil %s gelöscht\n"
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, fuzzy, c-format
msgid "Profile %s removed from %s"
msgstr "Gerät %s wurde von %s entfernt\n"
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
#, fuzzy
msgid "Profile to apply to the new container"
msgstr "kann nicht zum selben Container Namen kopieren"
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, fuzzy, c-format
msgid "Profiles %s applied to %s"
msgstr "Profil %s wurde auf %s angewandt\n"
-#: lxc/info.go:106
+#: lxc/info.go:115
#, fuzzy, c-format
msgid "Profiles: %s"
msgstr "Profil %s erstellt\n"
-#: lxc/image.go:479
+#: lxc/image.go:565
#, fuzzy
msgid "Properties:"
msgstr "Eigenschaften:\n"
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, fuzzy, c-format
msgid "Public: %s"
msgstr "Öffentlich: %s\n"
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr "Entferntes Administrator Passwort"
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
#, fuzzy
msgid "Restart containers."
msgstr "kann nicht zum selben Container Namen kopieren"
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr "Server Zertifikat vom Benutzer nicht akzeptiert"
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
"Der Server vertraut uns nicht nachdem er unser Zertifikat hinzugefügt hat"
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr "Setzt die gid der Datei beim Übertragen"
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr "Setzt die Dateiberechtigungen beim Übertragen"
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr "Setzt die uid der Datei beim Übertragen"
@@ -984,81 +1012,86 @@ msgstr "Zeigt alle Befehle (nicht nur die interessanten)"
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr "Zeige die letzten 100 Zeilen Protokoll des Containers?"
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, fuzzy, c-format
msgid "Size: %.2fMB"
msgstr "Größe: %.2vMB\n"
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, fuzzy, c-format
msgid "Some containers failed to %s"
msgstr "Anhalten des Containers fehlgeschlagen!"
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
#, fuzzy
msgid "Start containers."
msgstr "kann nicht zum selben Container Namen kopieren"
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
#, fuzzy
msgid "Stop containers."
msgstr "Anhalten des Containers fehlgeschlagen!"
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr "Anhalten des Containers fehlgeschlagen!"
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "Anhalten des Containers fehlgeschlagen!"
+
+#: lxc/storage.go:468
#, fuzzy, c-format
msgid "Storage pool %s created"
msgstr "Profil %s erstellt\n"
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, fuzzy, c-format
msgid "Storage pool %s deleted"
msgstr "Profil %s gelöscht\n"
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
#, fuzzy
msgid "Storage pool name"
msgstr "Profilname kann nicht geändert werden"
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, fuzzy, c-format
msgid "Storage volume %s created"
msgstr "Profil %s erstellt\n"
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, fuzzy, c-format
msgid "Storage volume %s deleted"
msgstr "Profil %s gelöscht\n"
@@ -1068,39 +1101,44 @@ msgstr "Profil %s gelöscht\n"
msgid "Store the container state (only for stop)"
msgstr "Herunterfahren des Containers erzwingen."
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+#, fuzzy
+msgid "The device already exists"
+msgstr "entfernte Instanz %s existiert bereits"
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
#, fuzzy
msgid "The device doesn't exist"
msgstr "entfernte Instanz %s existiert nicht"
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -1109,17 +1147,17 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
#, fuzzy
msgid "The specified device doesn't exist"
msgstr "entfernte Instanz %s existiert nicht"
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
#, fuzzy
msgid "The specified device doesn't match the network"
msgstr "entfernte Instanz %s existiert nicht"
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1136,50 +1174,50 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr "Wartezeit bevor der Container gestoppt wird."
-#: lxc/image.go:463
+#: lxc/image.go:549
#, fuzzy
msgid "Timestamps:"
msgstr "Zeitstempel:\n"
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1187,11 +1225,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, fuzzy, c-format
+msgid "Unknown file type '%s'"
+msgstr "Unbekannter Befehl %s für Abbild"
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1214,7 +1257,7 @@ msgstr ""
"Benutzung: lxc [Unterbefehl] [Optionen]\n"
"Verfügbare Befehle:\n"
-#: lxc/config.go:58
+#: lxc/config.go:60
#, fuzzy
msgid ""
"Usage: lxc config <subcommand> [options]\n"
@@ -1337,7 +1380,7 @@ msgstr ""
"\n"
"lxc copy <Quelle> <Ziel>\n"
-#: lxc/delete.go:26
+#: lxc/delete.go:27
#, fuzzy
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
@@ -1350,7 +1393,7 @@ msgstr ""
"Entfernt einen Container (oder Sicherungspunkt) und alle dazugehörigen\n"
"Daten (Konfiguration, Sicherungspunkte, ...).\n"
-#: lxc/exec.go:52
+#: lxc/exec.go:53
#, fuzzy
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
@@ -1365,7 +1408,7 @@ msgstr ""
"\n"
"lxc exec <Container> [--env EDITOR=/usr/bin/vim]... <Befehl>\n"
-#: lxc/file.go:36
+#: lxc/file.go:38
#, fuzzy
msgid ""
"Usage: lxc file <subcommand> [options]\n"
@@ -1418,7 +1461,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1523,7 +1566,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1536,7 +1579,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
#, fuzzy
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1563,7 +1606,7 @@ msgstr ""
"Beispiel:\n"
"lxc launch ubuntu u1\n"
-#: lxc/launch.go:23
+#: lxc/launch.go:20
#, fuzzy
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1719,7 +1762,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
#, fuzzy
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
@@ -1742,7 +1785,7 @@ msgstr ""
"\n"
"lxc move <Quelle> <Ziel>\n"
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1795,7 +1838,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
#, fuzzy
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
@@ -1911,7 +1954,7 @@ msgstr ""
"Containern hinzu,\n"
" die dieses Profil verwenden.\n"
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1919,7 +1962,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
#, fuzzy
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
@@ -1965,7 +2008,7 @@ msgstr ""
"lxc remote get-default "
"Gibt die Standard Instanz aus.\n"
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1981,7 +2024,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1995,7 +2038,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -2099,11 +2142,11 @@ msgstr ""
"\n"
"lxc version\n"
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
@@ -2111,153 +2154,138 @@ msgstr ""
"Laufenden Zustand des Containers aus dem Sicherungspunkt (falls vorhanden) "
"wiederherstellen oder nicht"
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr "Zustand des laufenden Containers sichern oder nicht"
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
#, fuzzy
msgid "You can't pass -t or -T at the same time as --mode"
msgstr "kann nicht zum selben Container Namen kopieren"
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-"Falsche Anzahl an Objekten im Abbild, Container oder Sicherungspunkt gelesen."
-
-#: lxc/action.go:94
-msgid "bad result type from action"
-msgstr ""
-
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr "kann nicht zum selben Container Namen kopieren"
+#: lxc/copy.go:57
+#, fuzzy
+msgid "You must specify a source container name"
+msgstr "der Name des Ursprung Containers muss angegeben werden"
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, fuzzy, c-format
msgid "error: %v"
msgstr "Fehler: %v\n"
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, fuzzy, c-format
msgid "error: unknown command: %s"
msgstr "Fehler: unbekannter Befehl: %s\n"
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr "Versionskonflikt"
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr "nicht alle Profile der Quelle sind am Ziel vorhanden."
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
#, fuzzy
msgid "ok (y/n)?"
msgstr "OK (y/n)? "
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr "entfernte Instanz %s existiert bereits"
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr "entfernte Instanz %s existiert nicht"
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr "entfernte Instanz %s existiert als <%s>"
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr "falsche Anzahl an Parametern für Unterbefehl"
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr "der Name des Ursprung Containers muss angegeben werden"
+#~ msgid "can't copy to the same container name"
+#~ msgstr "kann nicht zum selben Container Namen kopieren"
+
+#~ msgid "not all the profiles from the source exist on the target"
+#~ msgstr "nicht alle Profile der Quelle sind am Ziel vorhanden."
+
+#~ msgid "bad number of things scanned from image, container or snapshot"
+#~ msgstr ""
+#~ "Falsche Anzahl an Objekten im Abbild, Container oder Sicherungspunkt "
+#~ "gelesen."
+
+#~ msgid "got bad version"
+#~ msgstr "Versionskonflikt"
#, fuzzy
#~ msgid ""
@@ -2317,10 +2345,6 @@ msgstr "der Name des Ursprung Containers muss angegeben werden"
#~ "Abbilder importieren.\n"
#, fuzzy
-#~ msgid "Bad image property: %s"
-#~ msgstr "Ungültige Abbild Eigenschaft: %s\n"
-
-#, fuzzy
#~ msgid ""
#~ "Create a read-only snapshot of a container.\n"
#~ "\n"
@@ -2417,10 +2441,6 @@ msgstr "der Name des Ursprung Containers muss angegeben werden"
#~ msgstr "Falsche Version in Profil URL"
#, fuzzy
-#~ msgid "device already exists"
-#~ msgstr "entfernte Instanz %s existiert bereits"
-
-#, fuzzy
#~ msgid "error."
#~ msgstr "Fehler: %v\n"
@@ -2467,10 +2487,6 @@ msgstr "der Name des Ursprung Containers muss angegeben werden"
#~ msgstr "ungültiges Argument %s"
#, fuzzy
-#~ msgid "unknown profile cmd %s"
-#~ msgstr "Unbekannter Befehl %s für Abbild"
-
-#, fuzzy
#~ msgid "Publish to remote server is not supported yet"
#~ msgstr ""
#~ "Anzeigen von Informationen über entfernte Instanzen wird noch nicht "
diff --git a/po/el.po b/po/el.po
index f7f53110d..06e5517b2 100644
--- a/po/el.po
+++ b/po/el.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: 2017-02-14 08:00+0000\n"
"Last-Translator: Simos Xenitellis <simos.65 at gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/linux-containers/"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.12-dev\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -36,7 +36,7 @@ msgid ""
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -71,7 +71,7 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -81,7 +81,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -101,7 +101,7 @@ msgid ""
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -122,107 +122,131 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr ""
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr ""
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr ""
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr ""
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr ""
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr ""
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr ""
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
#, fuzzy
msgid "CPU usage:"
msgstr " Χρήση CPU:"
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr ""
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -230,35 +254,35 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr ""
@@ -266,86 +290,91 @@ msgstr ""
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr ""
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
#, fuzzy
msgid "Disk usage:"
msgstr " Χρήση CPU:"
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -353,7 +382,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -361,16 +390,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -384,16 +418,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -401,39 +444,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -441,247 +484,231 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
#, fuzzy
msgid "Memory usage:"
msgstr " Χρήση μνήμης:"
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
#, fuzzy
msgid "Network usage:"
msgstr " Χρήση δικτύου:"
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -693,24 +720,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -726,143 +753,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -874,78 +901,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr ""
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -954,38 +986,42 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -994,15 +1030,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1018,49 +1054,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1068,11 +1104,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1089,7 +1130,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1175,7 +1216,7 @@ msgid ""
"Copy containers within or in between LXD instances."
msgstr ""
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1183,7 +1224,7 @@ msgid ""
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1194,7 +1235,7 @@ msgid ""
"AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1238,7 +1279,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1343,7 +1384,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1356,7 +1397,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1371,7 +1412,7 @@ msgid ""
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1500,7 +1541,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1519,7 +1560,7 @@ msgid ""
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1572,7 +1613,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -1654,7 +1695,7 @@ msgid ""
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1662,7 +1703,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -1691,7 +1732,7 @@ msgid ""
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1707,7 +1748,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1721,7 +1762,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -1821,157 +1862,128 @@ msgid ""
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/fr.po b/po/fr.po
index 6b63b6f8d..c273397b4 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LXD\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: 2017-03-30 21:35+0000\n"
"Last-Translator: HazWard <starlysolon at gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/linux-containers/"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 2.13-dev\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgstr ""
"### source: /home/chb/mnt/lxd_test/default.img\n"
"### zfs.pool_name: default"
-#: lxc/storage.go:47
+#: lxc/storage.go:48
#, fuzzy
msgid ""
"### This is a yaml representation of a storage volume.\n"
@@ -71,7 +71,7 @@ msgstr ""
"### Un exemple serait :\n"
"### description: Mon image personnalisée"
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -109,7 +109,7 @@ msgstr ""
"###\n"
"### Notez que le nom est affiché mais ne peut être modifié"
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -125,7 +125,7 @@ msgstr ""
"### Un exemple serait :\n"
"### description: Mon image personnalisée"
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -162,7 +162,7 @@ msgstr ""
"###\n"
"### Notez que seule la configuration peut être modifiée."
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -199,108 +199,134 @@ msgstr ""
"###\n"
"### Notez que le nom est affiché mais ne peut être modifié"
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr "%s (%d de plus)"
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr "'/' n'est pas autorisé dans le nom d'un instantané"
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr "(aucun)"
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr "ALIAS"
-#: lxc/image.go:224
+#: lxc/image.go:227
#, fuzzy
msgid "ALIASES"
msgstr "ALIAS"
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr "ARCH"
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr "ARCHITECTURE"
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr "Accepter le certificat"
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr "Mot de passe administrateur pour %s : "
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr "Alias :"
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr "Architecture : %s"
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr "Mise à jour auto. : %s"
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr "Octets reçus"
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr "Octets émis"
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr "COMMON NAME"
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr "CPU utilisé (en secondes)"
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr "CPU utilisé :"
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr "CRÉÉ À"
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+#, fuzzy
+msgid "Can't pull a directory without --recursive"
+msgstr "impossible de récupérer un répertoire sans --recursive"
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr "Impossible de lire depuis stdin : %s"
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, fuzzy, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+"Impossible de désaffecter la clé '%s', elle n'est pas définie actuellement."
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
"Impossible de désaffecter la clé '%s', elle n'est pas définie actuellement."
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr "Impossible de fournir le nom du conteneur à lister"
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, fuzzy, c-format
msgid "Certificate fingerprint: %s"
msgstr "Empreinte du certificat : %x"
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr "Certificat client enregistré sur le serveur : "
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr "Colonnes"
@@ -308,35 +334,35 @@ msgstr "Colonnes"
msgid "Commands:"
msgstr "Commandes:"
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr "Clé/valeur de configuration à appliquer au nouveau conteneur"
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr "Erreur lors de la lecture de la configuration : %s"
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr "Connexion refusée ; LXD est-il actif ?"
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr "Le nom du conteneur est obligatoire"
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr "Le nom du conteneur est : %s"
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr "Conteneur publié avec l'empreinte : %s"
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr "Copier les alias depuis la source"
@@ -345,86 +371,91 @@ msgstr "Copier les alias depuis la source"
msgid "Copy the container without its snapshots"
msgstr "Forcer le conteneur à s'arrêter"
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr "Copie de l'image : %s"
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr "Impossible de créer le dossier de stockage des certificats serveurs"
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr "Créer tous répertoires nécessaires"
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr "Créé : %s"
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr "Création de %s"
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr "Création du conteneur"
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr "DESCRIPTION"
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr "PILOTE"
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr "Définir un algorithme de compression : pour image ou aucun"
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr "Périphérique %s ajouté à %s"
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr "Périphérique %s retiré de %s"
-#: lxc/exec.go:64
+#: lxc/utils.go:248 lxc/utils.go:272
+#, fuzzy, c-format
+msgid "Device already exists: %s"
+msgstr "le serveur distant %s existe déjà"
+
+#: lxc/exec.go:65
msgid "Disable pseudo-terminal allocation"
msgstr "Désactiver l'allocation pseudo-terminal"
-#: lxc/exec.go:65
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr "Désactiver stdin (lecture à partir de /dev/null)"
-#: lxc/info.go:145
+#: lxc/info.go:154
#, fuzzy
msgid "Disk usage:"
msgstr " Disque utilisé :"
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr "ÉPHÉMÈRE"
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr "DATE D'EXPIRATION"
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr "Activer le mode de débogage"
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr "Activer le mode verbeux"
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr "Variable d'environnement (de la forme HOME=/home/foo) à positionner"
@@ -432,7 +463,7 @@ msgstr "Variable d'environnement (de la forme HOME=/home/foo) à positionner"
msgid "Environment:"
msgstr "Environnement :"
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr "Conteneur éphémère"
@@ -440,16 +471,21 @@ msgstr "Conteneur éphémère"
msgid "Event type to listen for"
msgstr "Type d'évènements à surveiller"
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr "Expire : %s"
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr "N'expire jamais"
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, fuzzy, c-format
+msgid "Exporting the image: %s"
+msgstr "Import de l'image : %s"
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr "EMPREINTE"
@@ -463,17 +499,27 @@ msgstr "Échec lors de la génération de 'lxc.%s.1': %v"
msgid "Failed to generate 'lxc.1': %v"
msgstr "Échec lors de la génération de 'lxc.1': %v"
+#: lxc/copy.go:205
+#, fuzzy
+msgid "Failed to get the new container name"
+msgstr "Profil à appliquer au nouveau conteneur"
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
#, fuzzy
msgid "Fast mode (same as --columns=nsacPt)"
msgstr "Mode rapide (identique à --columns=nsacPt"
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr "Empreinte : %s"
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr "Forcer l'allocation de pseudo-terminal "
@@ -481,42 +527,42 @@ msgstr "Forcer l'allocation de pseudo-terminal "
msgid "Force the container to shutdown"
msgstr "Forcer le conteneur à s'arrêter"
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr "Forcer la suppression des conteneurs arrêtés"
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr "Forcer l'utilisation de la socket unix locale"
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr "Génération d'un certificat client. Ceci peut prendre une minute…"
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr "IPv4"
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr "IPv6"
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr "DATE D'ÉMISSION"
-#: lxc/main.go:139
+#: lxc/main.go:153
#, fuzzy
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
"Si c'est la première fois que vous lancez LXD, vous devriez aussi lancer : "
"sudo lxd init"
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr "Ignorer les alias pour déterminer la commande à exécuter"
@@ -524,251 +570,236 @@ msgstr "Ignorer les alias pour déterminer la commande à exécuter"
msgid "Ignore the container state (only for start)"
msgstr "Ignorer l'état du conteneur (seulement pour start)"
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr "Image copiée avec succès !"
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+#, fuzzy
+msgid "Image exported successfully!"
+msgstr "Image copiée avec succès !"
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr "Image importée avec l'empreinte : %s"
-#: lxc/image.go:420
+#: lxc/image.go:506
#, fuzzy
msgid "Image refreshed successfully!"
msgstr "Image copiée avec succès !"
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr "Import de l'image : %s"
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr "Schème d'URL invalide \"%s\" in \"%s\""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr "Certificat invalide"
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr "Clé de configuration invalide"
-#: lxc/file.go:357
+#: lxc/file.go:513
#, fuzzy, c-format
msgid "Invalid path %s"
msgstr "Cible invalide %s"
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr "Source invalide %s"
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr "Cible invalide %s"
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr "IPs :"
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr "Garder l'image à jour après la copie initiale"
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr "DERNIÈRE UTILISATION À"
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr "Socket LXD introuvable ; LXD est-il installé et actif ?"
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr "Dernière utilisation : %s"
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr "Dernière utilisation : jamais"
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr "Journal : "
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr "GÉRÉ"
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr "Rendre l'image publique"
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr "Rendre l'image publique"
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr "Mémoire (courante)"
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr "Mémoire (pointe)"
-#: lxc/info.go:179
+#: lxc/info.go:188
#, fuzzy
msgid "Memory usage:"
msgstr " Mémoire utilisée :"
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr "Échec lors de la migration vers l'hôte source: %s"
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr "Résumé manquant."
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr "Plus d'un périphérique correspond, spécifier le nom du périphérique."
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
"Plusieurs fichiers à télécharger, mais la destination n'est pas un dossier"
-#: lxc/move.go:35
+#: lxc/move.go:38
#, fuzzy
msgid "Move the container without its snapshots"
msgstr "Forcer le conteneur à s'arrêter"
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr "Vous devez fournir le nom d'un conteneur pour : "
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr "NOM"
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr "NON"
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr "Nom : %s"
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr "Le réseau %s a été créé"
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr "Le réseau %s a été supprimé"
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr "Nom du réseau"
-#: lxc/info.go:196
+#: lxc/info.go:205
#, fuzzy
msgid "Network usage:"
msgstr " Réseau utilisé :"
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr "Nouvel alias à définir sur la cible"
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr "Un certificat à ajouter n'a pas été fourni"
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr "Aucun périphérique existant pour ce réseau"
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
#, fuzzy
msgid "No device found for this storage volume."
msgstr "Aucun périphérique existant pour ce réseau"
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr "Aucune empreinte n'a été indiquée."
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr "Seul les volumes \"personnalisés\" peuvent être attaché aux conteneurs"
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr "Seules les URLs https sont supportées par simplestreams"
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr "Seul https:// est supporté par l'import d'images distantes."
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr "Seuls les réseaux gérés par LXD peuvent être modifiés."
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr "Options :"
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr "Le résultat est dans %s"
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr "Surcharger le mode terminal (auto, interactif ou non-interactif)"
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr "PERSISTANT"
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr "PID"
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr "PROFILS"
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr "PROTOCOLE"
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr "PUBLIC"
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr "Paquets reçus"
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr "Paquets émis"
@@ -780,25 +811,25 @@ msgstr "Chemin vers un dossier de configuration client alternatif"
msgid "Path to an alternate server directory"
msgstr "Chemin vers un dossier de configuration serveur alternatif"
-#: lxc/main.go:202
+#: lxc/main.go:216
#, fuzzy
msgid "Pause containers."
msgstr "Création du conteneur"
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr "Permission refusée, êtes-vous dans le groupe lxd ?"
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr "Pid : %d"
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr "Appuyer sur Entrée pour ouvrir à nouveau l'éditeur"
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr "Appuyer sur Entrée pour lancer à nouveau l'éditeur"
@@ -814,145 +845,145 @@ msgstr "Afficher les commandes moins communes"
msgid "Print verbose information"
msgstr "Afficher des informations supplémentaires"
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr "Processus : %d"
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr "Profil %s ajouté à %s"
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr "Profil %s créé"
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr "Profil %s supprimé"
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr "Profil %s supprimé de %s"
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr "Profil à appliquer au nouveau conteneur"
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr "Profils %s appliqués à %s"
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr "Profils : %s"
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr "Propriétés :"
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr "Serveur d'images public"
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr "Public : %s"
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr "Pousser ou récupérer des fichiers récursivement"
-#: lxc/image.go:413
+#: lxc/image.go:489
#, fuzzy, c-format
msgid "Refreshing the image: %s"
msgstr "Récupération de l'image : %s"
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr "Mot de passe de l'administrateur distant"
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr "Serveur distant : %s"
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr "Supprimer %s (oui/non) : "
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr "Requérir une confirmation de l'utilisateur"
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr "Ressources :"
-#: lxc/main.go:210
+#: lxc/main.go:224
#, fuzzy
msgid "Restart containers."
msgstr "Création du conteneur"
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr "Récupération de l'image : %s"
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr "TAILLE"
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr "INSTANTANÉS"
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr "SOURCE"
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr "ÉTAT"
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr "STATIQUE"
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr "ENSEMBLE DE STOCKAGE"
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr "Certificat serveur rejeté par l'utilisateur"
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
"Le serveur ne nous fait pas confiance après l'ajout de notre certificat"
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr "Protocole du serveur (lxd ou simplestreams)"
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr "Définir le gid du fichier lors de l'envoi"
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr "Définir les permissions du fichier lors de l'envoi"
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr "Définir l'uid du fichier lors de l'envoi"
@@ -964,80 +995,85 @@ msgstr "Afficher toutes les comandes (pas seulement les plus intéressantes)"
msgid "Show client version"
msgstr "Afficher la version du client"
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr "Afficher les 100 dernières lignes du journal du conteneur ?"
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr "Afficher la configuration étendue"
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr "Taille : %.2f Mo"
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr "Instantanés :"
-#: lxc/action.go:134
+#: lxc/action.go:142
#, fuzzy, c-format
msgid "Some containers failed to %s"
msgstr "L'arrêt du conteneur a échoué !"
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr "Source :"
-#: lxc/main.go:220
+#: lxc/main.go:234
#, fuzzy
msgid "Start containers."
msgstr "Création du conteneur"
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr "Démarrage de %s"
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr "État : %s"
-#: lxc/main.go:226
+#: lxc/main.go:240
#, fuzzy
msgid "Stop containers."
msgstr "L'arrêt du conteneur a échoué !"
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr "Arrêter le conteneur s'il est en cours d'exécution"
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr "L'arrêt du conteneur a échoué !"
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "L'arrêt du conteneur a échoué !"
+
+#: lxc/storage.go:468
#, fuzzy, c-format
msgid "Storage pool %s created"
msgstr "Le réseau %s a été créé"
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, fuzzy, c-format
msgid "Storage pool %s deleted"
msgstr "Le réseau %s a été supprimé"
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr "Nom de l'ensemble de stockage"
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, fuzzy, c-format
msgid "Storage volume %s created"
msgstr "Profil %s créé"
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, fuzzy, c-format
msgid "Storage volume %s deleted"
msgstr "Profil %s supprimé"
@@ -1046,24 +1082,24 @@ msgstr "Profil %s supprimé"
msgid "Store the container state (only for stop)"
msgstr "Forcer l'arrêt du conteneur (seulement pour stop)"
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr "Swap (courant)"
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr "Swap (pointe)"
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr "TYPE"
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
"Le conteneur est en cours d'exécution, l'arrêter d'abord ou ajouter --force."
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
@@ -1071,17 +1107,22 @@ msgstr ""
"Le conteneur est en cours d'exécution. Utiliser --force pour qu'il soit "
"arrêté et redémarré."
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
"Le conteneur que vous démarrez n'est attaché à aucune interface réseau."
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+#, fuzzy
+msgid "The device already exists"
+msgstr "le serveur distant %s existe déjà"
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr "Le périphérique n'existe pas"
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr "L'image locale '%s' n'a pas été trouvée, essayer '%s:' à la place."
@@ -1091,15 +1132,15 @@ msgstr "L'image locale '%s' n'a pas été trouvée, essayer '%s:' à la place."
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr "Le pendant de `lxc pause` est `lxc start`."
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr "Le périphérique indiqué n'existe pas"
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr "le périphérique indiqué ne correspond pas au réseau"
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr "Il n'existe pas d'\"image\". Vouliez-vous un alias ?"
@@ -1121,50 +1162,50 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr "Temps d'attente du conteneur avant de le tuer"
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr "Horodatage :"
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr "Pour attacher un réseau à un conteneur, utiliser : lxc network attach"
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr "Pour créer un réseau, utiliser : lxc network create"
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
"Pour démarrer votre premier conteneur, essayer : lxc launch ubuntu:16.04"
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr "Transfert de l'image : %s"
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr "Essayer `lxc info --show-log %s` pour plus d'informations"
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr "Type : éphémère"
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr "Type : persistant"
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr "DATE DE PUBLICATION"
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr "URL"
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr "UTILISÉ PAR"
@@ -1172,11 +1213,16 @@ msgstr "UTILISÉ PAR"
msgid "Unable to find help2man."
msgstr "Impossible de trouver help2man"
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr "Impossible de lire le certificat TLS distant"
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr "Publié : %s"
@@ -1196,7 +1242,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr "Utilisation : lxc <commande> [options]"
-#: lxc/config.go:58
+#: lxc/config.go:60
#, fuzzy
msgid ""
"Usage: lxc config <subcommand> [options]\n"
@@ -1344,7 +1390,7 @@ msgstr ""
"lxc copy [<remote>:]<source>[/<snapshot>] [[<remote>:]<destination>] [--"
"ephemeral|e] [--profile|-p <profile>...] [--config|-c <key=value>...]"
-#: lxc/delete.go:26
+#: lxc/delete.go:27
#, fuzzy
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
@@ -1360,7 +1406,7 @@ msgstr ""
"Détruit les conteneurs ou les instantanés ainsi que toute donnée associée "
"(configuration, instantanés, …)."
-#: lxc/exec.go:52
+#: lxc/exec.go:53
#, fuzzy
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
@@ -1380,7 +1426,7 @@ msgstr ""
"sélectionné si à la fois stdin et stdout sont des terminaux (stderr\n"
"est ignoré)."
-#: lxc/file.go:36
+#: lxc/file.go:38
#, fuzzy
msgid ""
"Usage: lxc file <subcommand> [options]\n"
@@ -1449,7 +1495,7 @@ msgstr ""
"\n"
"Page d'aide pour le client LXD."
-#: lxc/image.go:69
+#: lxc/image.go:72
#, fuzzy
msgid ""
"Usage: lxc image <subcommand> [options]\n"
@@ -1631,7 +1677,7 @@ msgstr ""
" Lister les alias. Les filtres peuvent être une partie de l'empreinte\n"
" de l'image ou une partie de l'alias de l'image."
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1653,7 +1699,7 @@ msgstr ""
"lxc info [<serveur distant>:]\n"
" Pour l'information du serveur LXD."
-#: lxc/init.go:75
+#: lxc/init.go:76
#, fuzzy
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1681,7 +1727,7 @@ msgstr ""
"Exemple :\n"
" lxc init ubuntu:16.04 u1"
-#: lxc/launch.go:23
+#: lxc/launch.go:20
#, fuzzy
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1899,7 +1945,7 @@ msgstr ""
"Exemple :\n"
"lxc monitor --type=logging"
-#: lxc/move.go:19
+#: lxc/move.go:22
#, fuzzy
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
@@ -1930,7 +1976,7 @@ msgstr ""
"lxc move <container>/<old snapshot name> <container>/<new snapshot name>\n"
" Renomme un instantané."
-#: lxc/network.go:49
+#: lxc/network.go:50
#, fuzzy
msgid ""
"Usage: lxc network <subcommand> [options]\n"
@@ -2011,7 +2057,7 @@ msgstr ""
"lxc network detach [<remote>:]<network> <container> [device name]\n"
"lxc network detach-profile [<remote>:]<network> <container> [device name]"
-#: lxc/profile.go:49
+#: lxc/profile.go:51
#, fuzzy
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
@@ -2152,7 +2198,7 @@ msgstr ""
" Ajouter un périphérique de profil, comme un disque ou une\n"
" interface réseau, aux conteneurs utilisant le profil indiqué."
-#: lxc/publish.go:27
+#: lxc/publish.go:28
#, fuzzy
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
@@ -2165,7 +2211,7 @@ msgstr ""
"lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]"
-#: lxc/remote.go:38
+#: lxc/remote.go:39
#, fuzzy
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
@@ -2213,7 +2259,7 @@ msgstr ""
"lxc remote get-default "
"Afficher le serveur distant par défaut."
-#: lxc/restore.go:21
+#: lxc/restore.go:22
#, fuzzy
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
@@ -2243,7 +2289,7 @@ msgstr ""
"Restaurer un instantané :\n"
" lxc restore u1 snap0"
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
#, fuzzy
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
@@ -2273,7 +2319,7 @@ msgstr ""
"Exemple :\n"
" lxc snapshot u1 snap0"
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -2377,11 +2423,11 @@ msgstr ""
"\n"
"lxc version"
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr "L'utilisateur a annulé l'opération de suppression."
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
@@ -2389,153 +2435,149 @@ msgstr ""
"Restaurer ou pas l'état de fonctionnement du conteneur depuis l'instantané "
"(s'il est disponible)"
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr "Réaliser ou pas l'instantané de l'état de fonctionnement du conteneur"
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr "OUI"
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr "Il est impossible de passer -t et -T simultanément"
-#: lxc/exec.go:129
+#: lxc/exec.go:130
#, fuzzy
msgid "You can't pass -t or -T at the same time as --mode"
msgstr "impossible de copier vers le même nom de conteneur"
-#: lxc/main.go:56
+#: lxc/copy.go:57
+#, fuzzy
+msgid "You must specify a source container name"
+msgstr "vous devez spécifier un nom de conteneur source"
+
+#: lxc/main.go:58
msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
"La commande `lxc config profile` est dépréciée, merci d'utiliser `lxc "
"profile`"
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr "mauvais nombre d'éléments dans l'image, conteneur ou instantané"
-
-#: lxc/action.go:94
-msgid "bad result type from action"
-msgstr "mauvais type de réponse renvoyé par l'action !"
-
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr "impossible de copier vers le même nom de conteneur"
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
-msgstr "impossible de récupérer un répertoire sans --recursive"
-
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr "impossible de supprimer le serveur distant par défaut"
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr "impossible de spécifier uid/gid/mode en mode récursif"
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr "par défaut"
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr "pas d'image, conteneur ou instantané affecté sur ce serveur"
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr "désactivé"
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr "activé"
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr "erreur : %v"
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr "erreur : commande inconnue: %s"
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr "reçu une mauvaise version"
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr "non"
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr "tous les profils de la source n'existent pas sur la cible"
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr "ok (y/n) ?"
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr "l'analyse des alias a échoué %s\n"
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr "l'édition récursive ne fait aucun sens :("
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr "le serveur distant %s existe déjà"
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr "le serveur distant %s n'existe pas"
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr "le serveur distant %s existe en tant que <%s>"
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr "le serveur distant %s est statique et ne peut être modifié"
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr "à suivi d'état"
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr "sans suivi d'état"
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr "pris à %s"
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr "Un retour impossible à été renvoyé"
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr "nombre d'arguments incorrect pour la sous-comande"
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr "oui"
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr "vous devez spécifier un nom de conteneur source"
+#~ msgid "Migration failed on source host: %s"
+#~ msgstr "Échec lors de la migration vers l'hôte source: %s"
+
+#~ msgid "can't copy to the same container name"
+#~ msgstr "impossible de copier vers le même nom de conteneur"
+
+#~ msgid "not all the profiles from the source exist on the target"
+#~ msgstr "tous les profils de la source n'existent pas sur la cible"
+
+#~ msgid "Output is in %s"
+#~ msgstr "Le résultat est dans %s"
+
+#~ msgid "bad number of things scanned from image, container or snapshot"
+#~ msgstr "mauvais nombre d'éléments dans l'image, conteneur ou instantané"
+
+#~ msgid "bad result type from action"
+#~ msgstr "mauvais type de réponse renvoyé par l'action !"
+
+#~ msgid "got bad version"
+#~ msgstr "reçu une mauvaise version"
+
+#~ msgid "unreachable return reached"
+#~ msgstr "Un retour impossible à été renvoyé"
#~ msgid "Format"
#~ msgstr "Format"
diff --git a/po/it.po b/po/it.po
index 2839bfc32..edea7ffaa 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: 2017-05-09 20:42+0000\n"
"Last-Translator: Alberto Donato <alberto.donato at gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/linux-containers/"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.14-dev\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -36,7 +36,7 @@ msgid ""
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -71,7 +71,7 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -81,7 +81,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -101,7 +101,7 @@ msgid ""
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -122,106 +122,130 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr "%s (altri %d)"
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr "'/' non è permesso nel nome di uno snapshot"
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr "(nessuno)"
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr "ARCH"
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr "ARCHITETTURA"
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr ""
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr ""
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr ""
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr ""
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr ""
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr "Bytes ricevuti"
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr ""
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr ""
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -229,35 +253,35 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr ""
@@ -265,85 +289,90 @@ msgstr ""
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr ""
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
msgid "Disk usage:"
msgstr ""
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -351,7 +380,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -359,16 +388,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -382,16 +416,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -399,39 +442,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -439,245 +482,229 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr ""
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
msgid "Network usage:"
msgstr ""
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -689,24 +716,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -722,143 +749,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -870,78 +897,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr ""
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -950,38 +982,42 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -990,15 +1026,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1014,49 +1050,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1064,11 +1100,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1085,7 +1126,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1171,7 +1212,7 @@ msgid ""
"Copy containers within or in between LXD instances."
msgstr ""
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1179,7 +1220,7 @@ msgid ""
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1190,7 +1231,7 @@ msgid ""
"AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1234,7 +1275,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1339,7 +1380,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1352,7 +1393,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1367,7 +1408,7 @@ msgid ""
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1496,7 +1537,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1515,7 +1556,7 @@ msgid ""
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1568,7 +1609,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -1650,7 +1691,7 @@ msgid ""
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1658,7 +1699,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -1687,7 +1728,7 @@ msgid ""
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1703,7 +1744,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1717,7 +1758,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -1817,157 +1858,128 @@ msgid ""
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/ja.po b/po/ja.po
index c92a3b037..9221628ba 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LXD\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: 2017-03-23 12:03+0000\n"
"Last-Translator: KATOH Yasufumi <karma at jazz.email.ne.jp>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/linux-"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 2.12\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -36,7 +36,7 @@ msgid ""
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -71,7 +71,7 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -81,7 +81,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -101,7 +101,7 @@ msgid ""
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -122,106 +122,132 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr "'/' はスナップショットの名前には使用できません"
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr "証明書を受け入れます"
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr "%s の管理者パスワード: "
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr "エイリアス:"
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr "アーキテクチャ: %s"
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr "自動更新: %s"
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, fuzzy, c-format
+msgid "Bad property: %s"
+msgstr "(不正なイメージプロパティ形式: %s\n"
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr "受信バイト数"
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr "送信バイト数"
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr "CPU使用量(秒)"
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr "CPU使用量:"
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+#, fuzzy
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+"ディレクトリを pull する場合は --recursive オプションを使用してください"
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr "標準入力から読み込めません: %s"
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, fuzzy, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr "キー '%s' が指定されていないので削除できません。"
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr "キー '%s' が指定されていないので削除できません。"
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr "コンテナ名を取得できません"
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, fuzzy, c-format
msgid "Certificate fingerprint: %s"
msgstr "証明書のフィンガープリント: %x"
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr "クライアント証明書がサーバに格納されました: "
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr "カラムレイアウト"
@@ -229,35 +255,35 @@ msgstr "カラムレイアウト"
msgid "Commands:"
msgstr "コマンド:"
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr "新しいコンテナに適用するキー/値の設定"
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr "設定の構文エラー: %s"
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr "接続が拒否されました。LXDが実行されていますか?"
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr "コンテナ名を指定する必要があります"
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr "コンテナ名: %s"
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr "コンテナは以下のフィンガープリントで publish されます: %s"
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr "ソースからエイリアスをコピーしました"
@@ -266,85 +292,90 @@ msgstr "ソースからエイリアスをコピーしました"
msgid "Copy the container without its snapshots"
msgstr "コンテナを強制シャットダウンします"
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr "イメージのコピー中: %s"
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr "サーバ証明書格納用のディレクトリを作成できません"
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr "必要なディレクトリをすべて作成します"
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr "作成日時: %s"
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr "%s を作成中"
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr "コンテナを作成中"
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr "圧縮アルゴリズムを指定します: 圧縮アルゴリズム名 or none"
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr "デバイス %s が %s に追加されました"
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr "デバイス %s が %s から削除されました"
-#: lxc/exec.go:64
+#: lxc/utils.go:248 lxc/utils.go:272
+#, fuzzy, c-format
+msgid "Device already exists: %s"
+msgstr "リモート %s は既に存在します"
+
+#: lxc/exec.go:65
msgid "Disable pseudo-terminal allocation"
msgstr "擬似端末の割り当てを無効にします"
-#: lxc/exec.go:65
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr "標準入力を無効にします (/dev/null から読み込みます)"
-#: lxc/info.go:145
+#: lxc/info.go:154
msgid "Disk usage:"
msgstr "ディスク使用量:"
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr "デバッグモードを有効にします"
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr "詳細モードを有効にします"
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr "環境変数を設定します (例: HOME=/home/foo)"
@@ -352,7 +383,7 @@ msgstr "環境変数を設定します (例: HOME=/home/foo)"
msgid "Environment:"
msgstr "環境変数:"
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr "Ephemeral コンテナ"
@@ -360,16 +391,21 @@ msgstr "Ephemeral コンテナ"
msgid "Event type to listen for"
msgstr "Listenするイベントタイプ"
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr "失効日時: %s"
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr "失効日時: 失効しない"
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, fuzzy, c-format
+msgid "Exporting the image: %s"
+msgstr "イメージのインポート中: %s"
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -383,17 +419,27 @@ msgstr "'lxc.%s.1' の生成が失敗しました: %v"
msgid "Failed to generate 'lxc.1': %v"
msgstr "'lxc.1' の生成が失敗しました: %v"
+#: lxc/copy.go:205
+#, fuzzy
+msgid "Failed to get the new container name"
+msgstr "新しいコンテナに適用するプロファイル"
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
#, fuzzy
msgid "Fast mode (same as --columns=nsacPt)"
msgstr "Fast モード (--columns=nsacPt と同じ)"
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr "証明書のフィンガープリント: %s"
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr "強制的に擬似端末を割り当てます"
@@ -401,39 +447,39 @@ msgstr "強制的に擬似端末を割り当てます"
msgid "Force the container to shutdown"
msgstr "コンテナを強制シャットダウンします"
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr "停止したコンテナを強制的に削除します"
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr "強制的にローカルのUNIXソケットを使います"
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr "クライアント証明書を生成します。1分ぐらいかかります..."
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr "IPV4"
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr "IPV6"
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr "初めて LXD を使う場合、lxd init と実行する必要があります"
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr "どのコマンドを実行するか決める際にエイリアスを無視します"
@@ -441,249 +487,234 @@ msgstr "どのコマンドを実行するか決める際にエイリアスを無
msgid "Ignore the container state (only for start)"
msgstr "コンテナの状態を無視します (startのみ)"
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr "イメージのコピーが成功しました!"
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+#, fuzzy
+msgid "Image exported successfully!"
+msgstr "イメージのコピーが成功しました!"
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr "イメージは以下のフィンガープリントでインポートされました: %s"
-#: lxc/image.go:420
+#: lxc/image.go:506
#, fuzzy
msgid "Image refreshed successfully!"
msgstr "イメージのコピーが成功しました!"
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr "イメージのインポート中: %s"
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr "不正な URL スキーム \"%s\" (\"%s\" 内)"
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr "不正な証明書です"
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr "正しくない設定項目 (key) です"
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr "不正なパス %s"
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr "不正なソース %s"
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr "不正な送り先 %s"
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr "IPアドレス:"
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr "最初にコピーした後も常にイメージを最新の状態に保つ"
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr "LXD のソケットが見つかりません。LXD が実行されていますか?"
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr "最終使用: %s"
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr "最終使用: 未使用"
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr "ログ:"
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr "イメージを public にする"
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr "イメージを public にする"
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr "メモリ (現在値)"
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr "メモリ (ピーク)"
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr "メモリ消費量:"
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr "ソースのホスト上でマイグレーションが失敗しました: %s"
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr "コピー先のホストでマイグレーションが失敗しました: %s"
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr "サマリーはありません。"
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr "複数のデバイスとマッチします。デバイス名を指定してください。"
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
"ダウンロード対象のファイルが複数ありますが、コピー先がディレクトリではありま"
"せん"
-#: lxc/move.go:35
+#: lxc/move.go:38
#, fuzzy
msgid "Move the container without its snapshots"
msgstr "コンテナを強制シャットダウンします"
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr "コンテナ名を指定する必要があります: "
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr "コンテナ名: %s"
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr "ネットワーク %s を作成しました"
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr "ネットワーク %s を削除しました"
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr "ネットワーク名:"
-#: lxc/info.go:196
+#: lxc/info.go:205
msgid "Network usage:"
msgstr "ネットワーク使用状況:"
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr "新しいエイリアスを定義する"
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr "追加すべき証明書が提供されていません"
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr "このネットワークに対するデバイスがありません"
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr "このストレージボリュームに対するデバイスがありません。"
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr "フィンガープリントが指定されていません。"
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr "\"カスタム\" のボリュームのみがコンテナにアタッチできます。"
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr "simplestreams は https の URL のみサポートします"
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr "リモートイメージのインポートは https:// のみをサポートします。"
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr "管理対象のネットワークのみ変更できます。"
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr "オプション:"
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr "%s に出力されます"
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr "ターミナルモードを上書きします (auto, interactive, non-interactive)"
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr "PID"
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr "受信パケット"
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr "送信パケット"
@@ -695,24 +726,24 @@ msgstr "別のクライアント用設定ディレクトリ"
msgid "Path to an alternate server directory"
msgstr "別のサーバ用設定ディレクトリ"
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr "コンテナを一時停止します。"
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr "アクセスが拒否されました。lxd グループに所属していますか?"
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr "Pid: %d"
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr "再度エディタを開くためには Enter キーを押します"
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr "再度エディタを起動するには Enter キーを押します"
@@ -728,143 +759,143 @@ msgstr "全てのコマンドを表示します (主なコマンドだけでは
msgid "Print verbose information"
msgstr "詳細情報を表示します"
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr "プロセス数: %d"
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr "プロファイル %s が %s に追加されました"
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr "プロファイル %s を作成しました"
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr "プロファイル %s を削除しました"
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr "プロファイル %s が %s から削除されました"
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr "新しいコンテナに適用するプロファイル"
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr "プロファイル %s が %s に追加されました"
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr "プロファイル: %s"
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr "プロパティ:"
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr "Public なイメージサーバとして設定します"
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr "パブリック: %s"
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr "再帰的にファイルをpush/pullします"
-#: lxc/image.go:413
+#: lxc/image.go:489
#, fuzzy, c-format
msgid "Refreshing the image: %s"
msgstr "イメージの取得中: %s"
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr "リモートの管理者パスワード"
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr "リモート名: %s"
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr "%s を消去しますか (yes/no): "
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr "ユーザの確認を要求する"
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr "リソース:"
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr "コンテナを再起動します。"
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr "イメージの取得中: %s"
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr "ユーザによりサーバ証明書が拒否されました"
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr "サーバが我々の証明書を追加した後我々を信頼していません"
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr "サーバのプロトコル (lxd or simplestreams)"
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr "プッシュ時にファイルのgidを設定します"
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr "プッシュ時にファイルのパーミションを設定します"
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr "プッシュ時にファイルのuidを設定します"
@@ -876,78 +907,83 @@ msgstr "全てコマンドを表示します (主なコマンドだけではな
msgid "Show client version"
msgstr "クライアントのバージョンを表示します"
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr "コンテナログの最後の 100 行を表示しますか?"
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr "拡張した設定を表示する"
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr "サイズ: %.2fMB"
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr "スナップショット:"
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr "一部のコンテナで %s が失敗しました"
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr "取得元:"
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr "コンテナを起動します。"
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr "%s を起動中"
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr "状態: %s"
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr "コンテナを停止します。"
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr "実行中の場合、コンテナを停止します"
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr "コンテナの停止に失敗しました!"
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "コンテナの停止に失敗しました!"
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr "ストレージプール %s を作成しました"
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr "ストレージプール %s を削除しました"
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr "ストレージプール名"
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr "ストレージボリューム %s を作成しました"
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr "ストレージボリューム %s を削除しました"
@@ -956,23 +992,23 @@ msgstr "ストレージボリューム %s を削除しました"
msgid "Store the container state (only for stop)"
msgstr "コンテナの状態を保存します (stopのみ)"
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr "Swap (現在値)"
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr "Swap (ピーク)"
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr "コンテナは実行中です。先に停止させるか、--force を指定してください。"
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
@@ -980,16 +1016,21 @@ msgstr ""
"コンテナは現在実行中です。停止して、再起動するために --force を使用してくだ\n"
"さい。"
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr "起動しようとしたコンテナに接続されているネットワークがありません。"
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+#, fuzzy
+msgid "The device already exists"
+msgstr "リモート %s は既に存在します"
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr "デバイスが存在しません"
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -999,15 +1040,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr "\"lxc pause\" の反対のコマンドは \"lxc start\" です。"
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr "指定したデバイスが存在しません"
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr "指定したデバイスはネットワークとマッチしません"
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
"publish 先にはイメージ名は指定できません。\"--alias\" オプションを使ってくだ"
@@ -1029,53 +1070,53 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr "コンテナを強制停止するまでの時間"
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr "タイムスタンプ:"
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
"コンテナにネットワークを接続するには、lxc network attach を使用してください"
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
"新しいネットワークを作成するには、lxc network create を使用してください"
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
"初めてコンテナを起動するには、\"lxc launch ubuntu:16.04\" と実行してみてくだ"
"さい"
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr "イメージを転送中: %s"
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr "更に情報を得るために `lxc info --show-log %s` を実行してみてください"
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr "タイプ: ephemeral"
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr "タイプ: persistent"
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1083,11 +1124,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr "help2man が見つかりません。"
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr "リモートの TLS 証明書を読めません"
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, fuzzy, c-format
+msgid "Unknown file type '%s'"
+msgstr "未知の設定コマンド %s"
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr "アップロード日時: %s"
@@ -1107,7 +1153,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr "使い方: lxc <コマンド> [オプション]"
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1258,7 +1304,7 @@ msgstr ""
"\n"
"LXDインスタンス内もしくはLXDインスタンス間でコンテナをコピーします。"
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1270,7 +1316,7 @@ msgstr ""
"\n"
"コンテナとコンテナのスナップショットを消去します。"
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1288,7 +1334,7 @@ msgstr ""
"デフォルトのモードは non-interactive です。もし標準入出力が両方ともターミナル"
"の場合は interactive モードが選択されます (標準エラー出力は無視されます)。"
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1364,7 +1410,7 @@ msgstr ""
"\n"
"LXD クライアントのヘルプを表示します。"
-#: lxc/image.go:69
+#: lxc/image.go:72
#, fuzzy
msgid ""
"Usage: lxc image <subcommand> [options]\n"
@@ -1543,7 +1589,7 @@ msgstr ""
"ス\n"
" 名の一部をフィルタとして指定できます。"
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1565,7 +1611,7 @@ msgstr ""
"lxc info [<remote>:]\n"
" LXD サーバの情報を表示します。"
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1591,7 +1637,7 @@ msgstr ""
"例:\n"
" lxc init ubuntu:16.04 u1"
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1834,7 +1880,7 @@ msgstr ""
"lxc monitor --type=logging\n"
" ログメッセージのみ表示します。"
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1867,7 +1913,7 @@ msgstr ""
"lxc move <container>/<old snapshot name> <container>/<new snapshot name>\n"
" スナップショットをリネームします。"
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1970,7 +2016,7 @@ msgstr ""
"cat network.yaml | lxc network edit <network>\n"
" network.yaml の内容でネットワークを更新します。"
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -2130,7 +2176,7 @@ msgstr ""
"lxc profile assign foo ''\n"
" \"foo\" からすべてのプロファイルを削除します。"
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -2142,7 +2188,7 @@ msgstr ""
"\n"
"イメージとしてコンテナを publish します。"
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -2196,7 +2242,7 @@ msgstr ""
"lxc remote get-default\n"
" デフォルトに設定されているリモートホストを表示します。"
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -2224,7 +2270,7 @@ msgstr ""
"lxc restore u1 snap0\n"
" スナップショットからリストアします。"
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -2248,7 +2294,7 @@ msgstr ""
"lxc snapshot u1 snap0\n"
" \"u1\" のスナップショットを \"snap0\" という名前で作成します。"
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -2440,165 +2486,163 @@ msgstr ""
"\n"
"お使いのクライアントのバージョン番号を表示します。"
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr "ユーザが削除操作を中断しました。"
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
"スナップショットからコンテナの稼動状態をリストアするかどうか (取得可能な場合)"
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr "コンテナの稼動状態のスナップショットを取得するかどうか"
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr "-t と -T は同時に指定できません"
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr "--mode と同時に -t または -T は指定できません"
-#: lxc/main.go:56
+#: lxc/copy.go:57
+#, fuzzy
+msgid "You must specify a source container name"
+msgstr "コピー元のコンテナ名を指定してください"
+
+#: lxc/main.go:58
msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr "`lxc config profile` は廃止されました。`lxc profile` を使ってください"
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-"イメージ、コンテナ、スナップショットのいずれかからスキャンされた数が不正"
-
-#: lxc/action.go:94
-msgid "bad result type from action"
-msgstr "アクションからの結果タイプが不正です"
-
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr "同じコンテナ名へはコピーできません"
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
-msgstr ""
-"ディレクトリを pull する場合は --recursive オプションを使用してください"
-
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr "デフォルトのリモートは削除できません"
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr "再帰 (recursive) モードでは uid/gid/mode を指定できません"
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
"サーバから変更されたイメージ、コンテナ、スナップショットを取得できませんで\n"
"した"
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr "無効"
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr "有効"
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr "エラー: %v"
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr "エラー: 未知のコマンド: %s"
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr "不正なバージョンを得ました"
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr "コピー元の全てのプロファイルがターゲットに存在しません"
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr "ok (y/n)?"
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr "エイリアスの処理が失敗しました %s\n"
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr "再帰的な edit は意味がありません :("
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr "リモート %s は既に存在します"
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr "リモート %s は存在しません"
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr "リモート %s は <%s> として存在します"
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr "リモート %s は static ですので変更できません"
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr "%s に取得しました"
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr "到達しないはずのreturnに到達しました"
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr "サブコマンドの引数の数が正しくありません"
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr "コピー元のコンテナ名を指定してください"
+#~ msgid "Migration failed on source host: %s"
+#~ msgstr "ソースのホスト上でマイグレーションが失敗しました: %s"
+
+#~ msgid "Migration failed on target host: %s"
+#~ msgstr "コピー先のホストでマイグレーションが失敗しました: %s"
+
+#~ msgid "can't copy to the same container name"
+#~ msgstr "同じコンテナ名へはコピーできません"
+
+#~ msgid "not all the profiles from the source exist on the target"
+#~ msgstr "コピー元の全てのプロファイルがターゲットに存在しません"
+
+#~ msgid "Output is in %s"
+#~ msgstr "%s に出力されます"
+
+#~ msgid "bad number of things scanned from image, container or snapshot"
+#~ msgstr ""
+#~ "イメージ、コンテナ、スナップショットのいずれかからスキャンされた数が不正"
+
+#~ msgid "bad result type from action"
+#~ msgstr "アクションからの結果タイプが不正です"
+
+#~ msgid "got bad version"
+#~ msgstr "不正なバージョンを得ました"
+
+#~ msgid "unreachable return reached"
+#~ msgstr "到達しないはずのreturnに到達しました"
#~ msgid "Format"
#~ msgstr "フォーマット"
@@ -2651,10 +2695,6 @@ msgstr "コピー元のコンテナ名を指定してください"
#~ msgstr "使い方: %s"
#, fuzzy
-#~ msgid "Bad image property: %s"
-#~ msgstr "(不正なイメージプロパティ形式: %s\n"
-
-#, fuzzy
#~ msgid ""
#~ "Create a read-only snapshot of a container.\n"
#~ "\n"
@@ -2681,10 +2721,6 @@ msgstr "コピー元のコンテナ名を指定してください"
#~ msgstr "プロファイルURL内のバージョンが不正"
#, fuzzy
-#~ msgid "device already exists"
-#~ msgstr "リモート %s は既に存在します"
-
-#, fuzzy
#~ msgid "error."
#~ msgstr "エラー: %v\n"
@@ -2736,10 +2772,6 @@ msgstr "コピー元のコンテナ名を指定してください"
#~ msgstr "不正な引数 %s"
#, fuzzy
-#~ msgid "unknown profile cmd %s"
-#~ msgstr "未知の設定コマンド %s"
-
-#, fuzzy
#~ msgid "Publish to remote server is not supported yet"
#~ msgstr "リモートの情報表示はまだサポートされていません。\n"
diff --git a/po/lxd.pot b/po/lxd.pot
index 6c4b121e6..7808d68bb 100644
--- a/po/lxd.pot
+++ b/po/lxd.pot
@@ -7,7 +7,7 @@
msgid ""
msgstr "Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
- "POT-Creation-Date: 2017-06-13 20:10+0200\n"
+ "POT-Creation-Date: 2017-06-16 23:20-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -16,7 +16,7 @@ msgstr "Project-Id-Version: lxd\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid "### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
"###\n"
@@ -32,7 +32,7 @@ msgid "### This is a yaml representation of a storage pool.\n"
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid "### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
"###\n"
@@ -45,7 +45,7 @@ msgid "### This is a yaml representation of a storage volume.\n"
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid "### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
"###\n"
@@ -65,7 +65,7 @@ msgid "### This is a yaml representation of the configuration.\n"
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid "### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
"###\n"
@@ -74,7 +74,7 @@ msgid "### This is a yaml representation of the image properties.\n"
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid "### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
"###\n"
@@ -93,7 +93,7 @@ msgid "### This is a yaml representation of the network.\n"
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid "### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
"###\n"
@@ -113,106 +113,130 @@ msgid "### This is a yaml representation of the profile.\n"
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr ""
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr ""
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr ""
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr ""
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr ""
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr ""
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr ""
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr ""
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr ""
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -220,34 +244,34 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378 lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr ""
@@ -255,84 +279,89 @@ msgstr ""
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr ""
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461 lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
msgid "Disk usage:"
msgstr ""
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -340,7 +369,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -348,16 +377,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -371,16 +405,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -388,39 +431,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -428,244 +471,228 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr ""
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
msgid "Network usage:"
msgstr ""
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -677,24 +704,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -710,143 +737,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -858,78 +885,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr ""
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -938,35 +970,39 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid "The container is currently running. Use --force to have it stopped and restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -975,15 +1011,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -998,49 +1034,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1048,11 +1084,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1068,7 +1109,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid "Usage: lxc config <subcommand> [options]\n"
"\n"
"Change container or server configuration options.\n"
@@ -1148,13 +1189,13 @@ msgid "Usage: lxc copy [<remote>:]<source>[/<snapshot>] [[<remote>:]<destinati
"Copy containers within or in between LXD instances."
msgstr ""
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid "Usage: lxc delete [<remote>:]<container>[/<snapshot>] [[<remote>:]<container>[/<snapshot>]...]\n"
"\n"
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
"\n"
"Execute commands in containers.\n"
@@ -1162,7 +1203,7 @@ msgid "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|inte
"Mode defaults to non-interactive, interactive mode is selected if both stdin AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid "Usage: lxc file <subcommand> [options]\n"
"\n"
"Manage files in containers.\n"
@@ -1199,7 +1240,7 @@ msgid "Usage: lxc help [--all]\n"
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid "Usage: lxc image <subcommand> [options]\n"
"\n"
"Manipulate container images.\n"
@@ -1296,7 +1337,7 @@ msgid "Usage: lxc image <subcommand> [options]\n"
" List the aliases. Filters may be part of the image hash or part of the image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
"Show container or server information.\n"
@@ -1308,7 +1349,7 @@ msgid "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n <network>] [--storage|-s <pool>]\n"
"\n"
"Create containers from images.\n"
@@ -1320,7 +1361,7 @@ msgid "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e]
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n <network>] [--storage|-s <pool>]\n"
"\n"
"Create and start containers from images.\n"
@@ -1435,7 +1476,7 @@ msgid "Usage: lxc monitor [<remote>:] [--type=TYPE...]\n"
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/<snapshot>]] [--container-only]\n"
"\n"
"Move containers within or in between LXD instances.\n"
@@ -1450,7 +1491,7 @@ msgid "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<contai
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid "Usage: lxc network <subcommand> [options]\n"
"\n"
"Manage and attach containers to networks.\n"
@@ -1496,7 +1537,7 @@ msgid "Usage: lxc network <subcommand> [options]\n"
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid "Usage: lxc profile <subcommand> [options]\n"
"\n"
"Manage container configuration profiles.\n"
@@ -1575,13 +1616,13 @@ msgid "Usage: lxc profile <subcommand> [options]\n"
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--alias=ALIAS...] [prop-key=prop-value...]\n"
"\n"
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid "Usage: lxc remote <subcommand> [options]\n"
"\n"
"Manage the list of remote LXD servers.\n"
@@ -1608,7 +1649,7 @@ msgid "Usage: lxc remote <subcommand> [options]\n"
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
"Restore containers from snapshots.\n"
@@ -1623,7 +1664,7 @@ msgid "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
"Create container snapshots.\n"
@@ -1636,7 +1677,7 @@ msgid "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid "Usage: lxc storage <subcommand> [options]\n"
"\n"
"Manage storage pools and volumes.\n"
@@ -1725,155 +1766,127 @@ msgid "Usage: lxc version\n"
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid "Whether or not to restore the container's running state from snapshot (if available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
-
diff --git a/po/nl.po b/po/nl.po
index 2642438d5..7b1400d6d 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr ""
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr ""
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr ""
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr ""
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr ""
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr ""
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr ""
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr ""
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr ""
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -226,35 +250,35 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr ""
@@ -262,85 +286,90 @@ msgstr ""
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr ""
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
msgid "Disk usage:"
msgstr ""
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -348,7 +377,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -356,16 +385,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -379,16 +413,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -396,39 +439,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -436,245 +479,229 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr ""
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
msgid "Network usage:"
msgstr ""
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -686,24 +713,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -719,143 +746,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -867,78 +894,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr ""
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1011,49 +1047,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1061,11 +1097,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1168,7 +1209,7 @@ msgid ""
"Copy containers within or in between LXD instances."
msgstr ""
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
"AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1231,7 +1272,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1336,7 +1377,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1349,7 +1390,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1565,7 +1606,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -1647,7 +1688,7 @@ msgid ""
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -1684,7 +1725,7 @@ msgid ""
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1700,7 +1741,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1714,7 +1755,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -1814,157 +1855,128 @@ msgid ""
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/ru.po b/po/ru.po
index 4308b9367..e6ea6bdf5 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: 2017-02-14 09:54+0000\n"
"Last-Translator: Vyacheslav Razykov <v.razykov at gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/linux-containers/"
@@ -20,7 +20,7 @@ msgstr ""
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 2.12-dev\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
#, fuzzy
msgid ""
"### This is a yaml representation of a storage pool.\n"
@@ -54,7 +54,7 @@ msgstr ""
"###\n"
"### Обратите внимание, что только конфигурация может быть изменена."
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -106,7 +106,7 @@ msgstr ""
"###\n"
"### Обратите внимание, что имя отображается, но не может быть изменено"
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -116,7 +116,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -152,7 +152,7 @@ msgstr ""
"###\n"
"### Обратите внимание, что только конфигурация может быть изменена."
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -190,108 +190,132 @@ msgstr ""
"###\n"
"### Обратите внимание, что имя отображается, но не может быть изменено"
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr "Нельзя использовать '/' в имени снимка"
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr "(пусто)"
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr "ПСЕВДОНИМ"
-#: lxc/image.go:224
+#: lxc/image.go:227
#, fuzzy
msgid "ALIASES"
msgstr "ПСЕВДОНИМ"
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr "ARCH"
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr "АРХИТЕКТУРА"
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr "Принять сертификат"
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr "Пароль администратора для %s: "
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr "Псевдонимы:"
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr "Архитектура: %s"
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr "Авто-обновление: %s"
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr ""
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr "ОБЩЕЕ ИМЯ"
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr "Использование ЦП (в секундах)"
-#: lxc/info.go:156
+#: lxc/info.go:165
#, fuzzy
msgid "CPU usage:"
msgstr " Использование ЦП:"
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr "СОЗДАН"
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr "Невозможно прочитать из стандартного ввода: %s"
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr "Невозможно добавить имя контейнера в список"
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr "Сертификат клиента хранится на сервере: "
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr "Столбцы"
@@ -299,35 +323,35 @@ msgstr "Столбцы"
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr "В соединении отказано; LXD запущен?"
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr "Имя контейнера является обязательным"
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr "Имя контейнера: %s"
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr "Копировать псевдонимы из источника"
@@ -335,86 +359,91 @@ msgstr "Копировать псевдонимы из источника"
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr "Копирование образа: %s"
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr "Не удалось создать каталог сертификата сервера"
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
#, fuzzy
msgid "Disk usage:"
msgstr " Использование диска:"
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -422,7 +451,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -430,16 +459,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, fuzzy, c-format
+msgid "Exporting the image: %s"
+msgstr "Копирование образа: %s"
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -453,16 +487,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -470,39 +513,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -510,247 +553,231 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
#, fuzzy
msgid "Memory usage:"
msgstr " Использование памяти:"
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
#, fuzzy
msgid "Network usage:"
msgstr " Использование сети:"
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -762,24 +789,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -795,143 +822,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, fuzzy, c-format
msgid "Refreshing the image: %s"
msgstr "Копирование образа: %s"
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -943,78 +970,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, fuzzy, c-format
msgid "Some containers failed to %s"
msgstr "Невозможно добавить имя контейнера в список"
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "Невозможно добавить имя контейнера в список"
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -1023,38 +1055,42 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -1063,15 +1099,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1087,49 +1123,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1137,11 +1173,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1161,7 +1202,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1252,7 +1293,7 @@ msgstr ""
"lxc copy [<remote>:]<source>[/<snapshot>] [[<remote>:]<destination>] [--"
"ephemeral|e] [--profile|-p <profile>...] [--config|-c <key=value>...]"
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1260,7 +1301,7 @@ msgid ""
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1271,7 +1312,7 @@ msgid ""
"AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1315,7 +1356,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1420,7 +1461,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1433,7 +1474,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1448,7 +1489,7 @@ msgid ""
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1577,7 +1618,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1596,7 +1637,7 @@ msgid ""
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1649,7 +1690,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -1731,7 +1772,7 @@ msgid ""
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1739,7 +1780,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -1768,7 +1809,7 @@ msgid ""
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1784,7 +1825,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1798,7 +1839,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -1898,161 +1939,132 @@ msgid ""
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
-
#~ msgid "Could not sanitize path %s"
#~ msgstr "Не удалось очистить путь %s"
diff --git a/po/sr.po b/po/sr.po
index 5a46ea635..3b5a33e71 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr ""
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr ""
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr ""
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr ""
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr ""
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr ""
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr ""
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr ""
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr ""
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -226,35 +250,35 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr ""
@@ -262,85 +286,90 @@ msgstr ""
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr ""
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
msgid "Disk usage:"
msgstr ""
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -348,7 +377,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -356,16 +385,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -379,16 +413,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -396,39 +439,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -436,245 +479,229 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr ""
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
msgid "Network usage:"
msgstr ""
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -686,24 +713,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -719,143 +746,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -867,78 +894,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr ""
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1011,49 +1047,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1061,11 +1097,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1168,7 +1209,7 @@ msgid ""
"Copy containers within or in between LXD instances."
msgstr ""
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
"AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1231,7 +1272,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1336,7 +1377,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1349,7 +1390,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1565,7 +1606,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -1647,7 +1688,7 @@ msgid ""
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -1684,7 +1725,7 @@ msgid ""
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1700,7 +1741,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1714,7 +1755,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -1814,157 +1855,128 @@ msgid ""
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 3f0bbc75e..d4a02c351 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr ""
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr ""
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr ""
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr ""
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr ""
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr ""
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr ""
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr ""
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr ""
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -226,35 +250,35 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr ""
@@ -262,85 +286,90 @@ msgstr ""
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr ""
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
msgid "Disk usage:"
msgstr ""
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -348,7 +377,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -356,16 +385,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -379,16 +413,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -396,39 +439,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -436,245 +479,229 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr ""
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
msgid "Network usage:"
msgstr ""
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -686,24 +713,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -719,143 +746,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -867,78 +894,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr ""
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1011,49 +1047,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1061,11 +1097,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1168,7 +1209,7 @@ msgid ""
"Copy containers within or in between LXD instances."
msgstr ""
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
"AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1231,7 +1272,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1336,7 +1377,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1349,7 +1390,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1565,7 +1606,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -1647,7 +1688,7 @@ msgid ""
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -1684,7 +1725,7 @@ msgid ""
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1700,7 +1741,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1714,7 +1755,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -1814,157 +1855,128 @@ msgid ""
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 86608a72f..410358b42 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxd\n"
"Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: lxc/storage.go:30
+#: lxc/storage.go:31
msgid ""
"### This is a yaml representation of a storage pool.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
"### zfs.pool_name: default"
msgstr ""
-#: lxc/storage.go:47
+#: lxc/storage.go:48
msgid ""
"### This is a yaml representation of a storage volume.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
"### size: \"61203283968\""
msgstr ""
-#: lxc/config.go:37
+#: lxc/config.go:39
msgid ""
"### This is a yaml representation of the configuration.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:59
+#: lxc/image.go:62
msgid ""
"### This is a yaml representation of the image properties.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
"### description: My custom image"
msgstr ""
-#: lxc/network.go:29
+#: lxc/network.go:30
msgid ""
"### This is a yaml representation of the network.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
"### Note that only the configuration can be changed."
msgstr ""
-#: lxc/profile.go:28
+#: lxc/profile.go:30
msgid ""
"### This is a yaml representation of the profile.\n"
"### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
"### Note that the name is shown but cannot be changed"
msgstr ""
-#: lxc/image.go:179
+#: lxc/image.go:182
#, c-format
msgid "%s (%d more)"
msgstr ""
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
msgid "'/' not allowed in snapshot name"
msgstr ""
-#: lxc/profile.go:293
+#: lxc/profile.go:319
msgid "(none)"
msgstr ""
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
msgid "ALIAS"
msgstr ""
-#: lxc/image.go:224
+#: lxc/image.go:227
msgid "ALIASES"
msgstr ""
-#: lxc/image.go:228
+#: lxc/image.go:231
msgid "ARCH"
msgstr ""
-#: lxc/list.go:456
+#: lxc/list.go:461
msgid "ARCHITECTURE"
msgstr ""
-#: lxc/remote.go:66
+#: lxc/remote.go:67
msgid "Accept certificate"
msgstr ""
-#: lxc/remote.go:282
+#: lxc/remote.go:281
#, c-format
msgid "Admin password for %s: "
msgstr ""
-#: lxc/image.go:483
+#: lxc/image.go:569
msgid "Aliases:"
msgstr ""
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
#, c-format
msgid "Architecture: %s"
msgstr ""
-#: lxc/image.go:491
+#: lxc/image.go:577
#, c-format
msgid "Auto update: %s"
msgstr ""
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
msgid "Bytes received"
msgstr ""
-#: lxc/info.go:189
+#: lxc/info.go:198
msgid "Bytes sent"
msgstr ""
-#: lxc/config.go:310
+#: lxc/config.go:349
msgid "COMMON NAME"
msgstr ""
-#: lxc/info.go:152
+#: lxc/info.go:161
msgid "CPU usage (in seconds)"
msgstr ""
-#: lxc/info.go:156
+#: lxc/info.go:165
msgid "CPU usage:"
msgstr ""
-#: lxc/list.go:457
+#: lxc/list.go:462
msgid "CREATED AT"
msgstr ""
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
#, c-format
msgid "Can't read from stdin: %s"
msgstr ""
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
#, c-format
msgid "Can't unset key '%s', it's not currently set."
msgstr ""
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
msgid "Cannot provide container name to list"
msgstr ""
-#: lxc/remote.go:232
+#: lxc/remote.go:228
#, c-format
msgid "Certificate fingerprint: %s"
msgstr ""
-#: lxc/remote.go:305
+#: lxc/remote.go:316
msgid "Client certificate stored at server: "
msgstr ""
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
msgid "Columns"
msgstr ""
@@ -226,35 +250,35 @@ msgstr ""
msgid "Commands:"
msgstr ""
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
msgid "Config key/value to apply to the new container"
msgstr ""
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
#, c-format
msgid "Config parsing error: %s"
msgstr ""
-#: lxc/main.go:33
+#: lxc/main.go:35
msgid "Connection refused; is LXD running?"
msgstr ""
-#: lxc/publish.go:62
+#: lxc/publish.go:71
msgid "Container name is mandatory"
msgstr ""
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
#, c-format
msgid "Container name is: %s"
msgstr ""
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
#, c-format
msgid "Container published with fingerprint: %s"
msgstr ""
-#: lxc/image.go:170
+#: lxc/image.go:173
msgid "Copy aliases from source"
msgstr ""
@@ -262,85 +286,90 @@ msgstr ""
msgid "Copy the container without its snapshots"
msgstr ""
-#: lxc/image.go:360
+#: lxc/image.go:422
#, c-format
msgid "Copying the image: %s"
msgstr ""
-#: lxc/remote.go:247
+#: lxc/remote.go:243
msgid "Could not create server cert dir"
msgstr ""
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
msgid "Create any directories necessary"
msgstr ""
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
#, c-format
msgid "Created: %s"
msgstr ""
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
#, c-format
msgid "Creating %s"
msgstr ""
-#: lxc/init.go:180
+#: lxc/init.go:192
msgid "Creating the container"
msgstr ""
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
msgid "DESCRIPTION"
msgstr ""
-#: lxc/storage.go:609
+#: lxc/storage.go:655
msgid "DRIVER"
msgstr ""
-#: lxc/publish.go:38
+#: lxc/publish.go:39
msgid "Define a compression algorithm: for image or none"
msgstr ""
-#: lxc/config.go:688
+#: lxc/config.go:803
#, c-format
msgid "Device %s added to %s"
msgstr ""
-#: lxc/config.go:875
+#: lxc/config.go:1037
#, c-format
msgid "Device %s removed from %s"
msgstr ""
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
msgstr ""
#: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
msgid "Disable stdin (reads from /dev/null)"
msgstr ""
-#: lxc/info.go:145
+#: lxc/info.go:154
msgid "Disk usage:"
msgstr ""
-#: lxc/list.go:609
+#: lxc/list.go:614
msgid "EPHEMERAL"
msgstr ""
-#: lxc/config.go:312
+#: lxc/config.go:351
msgid "EXPIRY DATE"
msgstr ""
-#: lxc/main.go:45
+#: lxc/main.go:47
msgid "Enable debug mode"
msgstr ""
-#: lxc/main.go:44
+#: lxc/main.go:46
msgid "Enable verbose mode"
msgstr ""
-#: lxc/exec.go:61
+#: lxc/exec.go:62
msgid "Environment variable to set (e.g. HOME=/home/foo)"
msgstr ""
@@ -348,7 +377,7 @@ msgstr ""
msgid "Environment:"
msgstr ""
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
msgid "Ephemeral container"
msgstr ""
@@ -356,16 +385,21 @@ msgstr ""
msgid "Event type to listen for"
msgstr ""
-#: lxc/image.go:470
+#: lxc/image.go:556
#, c-format
msgid "Expires: %s"
msgstr ""
-#: lxc/image.go:472
+#: lxc/image.go:558
msgid "Expires: never"
msgstr ""
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
msgid "FINGERPRINT"
msgstr ""
@@ -379,16 +413,25 @@ msgstr ""
msgid "Failed to generate 'lxc.1': %v"
msgstr ""
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
#: lxc/list.go:131
msgid "Fast mode (same as --columns=nsacPt)"
msgstr ""
-#: lxc/image.go:459
+#: lxc/image.go:545
#, c-format
msgid "Fingerprint: %s"
msgstr ""
-#: lxc/exec.go:63
+#: lxc/exec.go:64
msgid "Force pseudo-terminal allocation"
msgstr ""
@@ -396,39 +439,39 @@ msgstr ""
msgid "Force the container to shutdown"
msgstr ""
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
msgid "Force the removal of stopped containers"
msgstr ""
-#: lxc/main.go:46
+#: lxc/main.go:48
msgid "Force using the local unix socket"
msgstr ""
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
msgid "Format (csv|json|table|yaml)"
msgstr ""
-#: lxc/remote.go:80
+#: lxc/remote.go:81
msgid "Generating a client certificate. This may take a minute..."
msgstr ""
-#: lxc/list.go:454
+#: lxc/list.go:459
msgid "IPV4"
msgstr ""
-#: lxc/list.go:455
+#: lxc/list.go:460
msgid "IPV6"
msgstr ""
-#: lxc/config.go:311
+#: lxc/config.go:350
msgid "ISSUE DATE"
msgstr ""
-#: lxc/main.go:139
+#: lxc/main.go:153
msgid "If this is your first time using LXD, you should also run: lxd init"
msgstr ""
-#: lxc/main.go:47
+#: lxc/main.go:49
msgid "Ignore aliases when determining what command to run"
msgstr ""
@@ -436,245 +479,229 @@ msgstr ""
msgid "Ignore the container state (only for start)"
msgstr ""
-#: lxc/image.go:422
+#: lxc/image.go:508
msgid "Image already up to date."
msgstr ""
-#: lxc/image.go:363
+#: lxc/image.go:436
msgid "Image copied successfully!"
msgstr ""
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
#, c-format
msgid "Image imported with fingerprint: %s"
msgstr ""
-#: lxc/image.go:420
+#: lxc/image.go:506
msgid "Image refreshed successfully!"
msgstr ""
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
#, c-format
msgid "Invalid URL scheme \"%s\" in \"%s\""
msgstr ""
-#: lxc/config.go:290
+#: lxc/config.go:329
msgid "Invalid certificate"
msgstr ""
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
msgid "Invalid configuration key"
msgstr ""
-#: lxc/file.go:357
+#: lxc/file.go:513
#, c-format
msgid "Invalid path %s"
msgstr ""
-#: lxc/file.go:291
+#: lxc/file.go:443
#, c-format
msgid "Invalid source %s"
msgstr ""
-#: lxc/file.go:80
+#: lxc/file.go:221
#, c-format
msgid "Invalid target %s"
msgstr ""
-#: lxc/info.go:126
+#: lxc/info.go:135
msgid "Ips:"
msgstr ""
-#: lxc/image.go:171
+#: lxc/image.go:174
msgid "Keep the image up to date after initial copy"
msgstr ""
-#: lxc/list.go:459
+#: lxc/list.go:464
msgid "LAST USED AT"
msgstr ""
-#: lxc/main.go:31
+#: lxc/main.go:33
msgid "LXD socket not found; is LXD installed and running?"
msgstr ""
-#: lxc/image.go:475
+#: lxc/image.go:561
#, c-format
msgid "Last used: %s"
msgstr ""
-#: lxc/image.go:477
+#: lxc/image.go:563
msgid "Last used: never"
msgstr ""
-#: lxc/info.go:241
+#: lxc/info.go:250
msgid "Log:"
msgstr ""
-#: lxc/network.go:460
+#: lxc/network.go:506
msgid "MANAGED"
msgstr ""
-#: lxc/image.go:169
+#: lxc/image.go:172
msgid "Make image public"
msgstr ""
-#: lxc/publish.go:34
+#: lxc/publish.go:35
msgid "Make the image public"
msgstr ""
-#: lxc/info.go:163
+#: lxc/info.go:172
msgid "Memory (current)"
msgstr ""
-#: lxc/info.go:167
+#: lxc/info.go:176
msgid "Memory (peak)"
msgstr ""
-#: lxc/info.go:179
+#: lxc/info.go:188
msgid "Memory usage:"
msgstr ""
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
msgid "Missing summary."
msgstr ""
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
msgid "More than one device matches, specify the device name."
msgstr ""
-#: lxc/file.go:279
+#: lxc/file.go:431
msgid "More than one file to download, but target is not a directory"
msgstr ""
-#: lxc/move.go:35
+#: lxc/move.go:38
msgid "Move the container without its snapshots"
msgstr ""
-#: lxc/action.go:68
+#: lxc/action.go:72
msgid "Must supply container name for: "
msgstr ""
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
msgid "NAME"
msgstr ""
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
msgid "NO"
msgstr ""
-#: lxc/info.go:91
+#: lxc/info.go:99
#, c-format
msgid "Name: %s"
msgstr ""
-#: lxc/network.go:222
+#: lxc/network.go:250
#, c-format
msgid "Network %s created"
msgstr ""
-#: lxc/network.go:325
+#: lxc/network.go:366
#, c-format
msgid "Network %s deleted"
msgstr ""
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
msgid "Network name"
msgstr ""
-#: lxc/info.go:196
+#: lxc/info.go:205
msgid "Network usage:"
msgstr ""
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
msgid "New alias to define at target"
msgstr ""
-#: lxc/config.go:321
+#: lxc/config.go:360
msgid "No certificate provided to add"
msgstr ""
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
msgid "No device found for this network"
msgstr ""
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
msgid "No device found for this storage volume."
msgstr ""
-#: lxc/config.go:344
+#: lxc/config.go:392
msgid "No fingerprint specified."
msgstr ""
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
msgid "Only \"custom\" volumes can be attached to containers."
msgstr ""
-#: lxc/remote.go:135
+#: lxc/remote.go:136
msgid "Only https URLs are supported for simplestreams"
msgstr ""
-#: lxc/image.go:549
+#: lxc/image.go:632
msgid "Only https:// is supported for remote image import."
msgstr ""
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
msgid "Only managed networks can be modified."
msgstr ""
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
msgid "Options:"
msgstr ""
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
msgid "Override the terminal mode (auto, interactive or non-interactive)"
msgstr ""
-#: lxc/list.go:611
+#: lxc/list.go:616
msgid "PERSISTENT"
msgstr ""
-#: lxc/list.go:461
+#: lxc/list.go:466
msgid "PID"
msgstr ""
-#: lxc/list.go:462
+#: lxc/list.go:467
msgid "PROFILES"
msgstr ""
-#: lxc/remote.go:397
+#: lxc/remote.go:408
msgid "PROTOCOL"
msgstr ""
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
msgid "PUBLIC"
msgstr ""
-#: lxc/info.go:190
+#: lxc/info.go:199
msgid "Packets received"
msgstr ""
-#: lxc/info.go:191
+#: lxc/info.go:200
msgid "Packets sent"
msgstr ""
@@ -686,24 +713,24 @@ msgstr ""
msgid "Path to an alternate server directory"
msgstr ""
-#: lxc/main.go:202
+#: lxc/main.go:216
msgid "Pause containers."
msgstr ""
-#: lxc/main.go:35
+#: lxc/main.go:37
msgid "Permission denied, are you in the lxd group?"
msgstr ""
-#: lxc/info.go:108
+#: lxc/info.go:117
#, c-format
msgid "Pid: %d"
msgstr ""
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
msgid "Press enter to open the editor again"
msgstr ""
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
msgid "Press enter to start the editor again"
msgstr ""
@@ -719,143 +746,143 @@ msgstr ""
msgid "Print verbose information"
msgstr ""
-#: lxc/info.go:132
+#: lxc/info.go:141
#, c-format
msgid "Processes: %d"
msgstr ""
-#: lxc/profile.go:314
+#: lxc/profile.go:344
#, c-format
msgid "Profile %s added to %s"
msgstr ""
-#: lxc/profile.go:209
+#: lxc/profile.go:218
#, c-format
msgid "Profile %s created"
msgstr ""
-#: lxc/profile.go:279
+#: lxc/profile.go:292
#, c-format
msgid "Profile %s deleted"
msgstr ""
-#: lxc/profile.go:345
+#: lxc/profile.go:379
#, c-format
msgid "Profile %s removed from %s"
msgstr ""
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
msgid "Profile to apply to the new container"
msgstr ""
-#: lxc/profile.go:295
+#: lxc/profile.go:321
#, c-format
msgid "Profiles %s applied to %s"
msgstr ""
-#: lxc/info.go:106
+#: lxc/info.go:115
#, c-format
msgid "Profiles: %s"
msgstr ""
-#: lxc/image.go:479
+#: lxc/image.go:565
msgid "Properties:"
msgstr ""
-#: lxc/remote.go:69
+#: lxc/remote.go:70
msgid "Public image server"
msgstr ""
-#: lxc/image.go:462
+#: lxc/image.go:548
#, c-format
msgid "Public: %s"
msgstr ""
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
msgid "Recursively push or pull files"
msgstr ""
-#: lxc/image.go:413
+#: lxc/image.go:489
#, c-format
msgid "Refreshing the image: %s"
msgstr ""
-#: lxc/remote.go:67
+#: lxc/remote.go:68
msgid "Remote admin password"
msgstr ""
-#: lxc/info.go:93
+#: lxc/info.go:101
#, c-format
msgid "Remote: %s"
msgstr ""
-#: lxc/delete.go:41
+#: lxc/delete.go:42
#, c-format
msgid "Remove %s (yes/no): "
msgstr ""
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
msgid "Require user confirmation"
msgstr ""
-#: lxc/info.go:129
+#: lxc/info.go:138
msgid "Resources:"
msgstr ""
-#: lxc/main.go:210
+#: lxc/main.go:224
msgid "Restart containers."
msgstr ""
-#: lxc/init.go:253
+#: lxc/init.go:286
#, c-format
msgid "Retrieving image: %s"
msgstr ""
-#: lxc/image.go:229
+#: lxc/image.go:232
msgid "SIZE"
msgstr ""
-#: lxc/list.go:463
+#: lxc/list.go:468
msgid "SNAPSHOTS"
msgstr ""
-#: lxc/storage.go:610
+#: lxc/storage.go:656
msgid "SOURCE"
msgstr ""
-#: lxc/list.go:464
+#: lxc/list.go:469
msgid "STATE"
msgstr ""
-#: lxc/remote.go:399
+#: lxc/remote.go:410
msgid "STATIC"
msgstr ""
-#: lxc/list.go:466
+#: lxc/list.go:471
msgid "STORAGE POOL"
msgstr ""
-#: lxc/remote.go:240
+#: lxc/remote.go:236
msgid "Server certificate NACKed by user"
msgstr ""
-#: lxc/remote.go:302
+#: lxc/remote.go:313
msgid "Server doesn't trust us after adding our cert"
msgstr ""
-#: lxc/remote.go:68
+#: lxc/remote.go:69
msgid "Server protocol (lxd or simplestreams)"
msgstr ""
-#: lxc/file.go:63
+#: lxc/file.go:65
msgid "Set the file's gid on push"
msgstr ""
-#: lxc/file.go:64
+#: lxc/file.go:66
msgid "Set the file's perms on push"
msgstr ""
-#: lxc/file.go:62
+#: lxc/file.go:64
msgid "Set the file's uid on push"
msgstr ""
@@ -867,78 +894,83 @@ msgstr ""
msgid "Show client version"
msgstr ""
-#: lxc/info.go:38
+#: lxc/info.go:39
msgid "Show the container's last 100 log lines?"
msgstr ""
-#: lxc/config.go:33
+#: lxc/config.go:35
msgid "Show the expanded configuration"
msgstr ""
-#: lxc/image.go:460
+#: lxc/image.go:546
#, c-format
msgid "Size: %.2fMB"
msgstr ""
-#: lxc/info.go:210
+#: lxc/info.go:219
msgid "Snapshots:"
msgstr ""
-#: lxc/action.go:134
+#: lxc/action.go:142
#, c-format
msgid "Some containers failed to %s"
msgstr ""
-#: lxc/image.go:493
+#: lxc/image.go:579
msgid "Source:"
msgstr ""
-#: lxc/main.go:220
+#: lxc/main.go:234
msgid "Start containers."
msgstr ""
-#: lxc/launch.go:152
+#: lxc/launch.go:59
#, c-format
msgid "Starting %s"
msgstr ""
-#: lxc/info.go:100
+#: lxc/info.go:109
#, c-format
msgid "Status: %s"
msgstr ""
-#: lxc/main.go:226
+#: lxc/main.go:240
msgid "Stop containers."
msgstr ""
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
msgid "Stop the container if currently running"
msgstr ""
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
msgid "Stopping container failed!"
msgstr ""
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
#, c-format
msgid "Storage pool %s created"
msgstr ""
-#: lxc/storage.go:486
+#: lxc/storage.go:527
#, c-format
msgid "Storage pool %s deleted"
msgstr ""
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
msgid "Storage pool name"
msgstr ""
-#: lxc/storage.go:720
+#: lxc/storage.go:782
#, c-format
msgid "Storage volume %s created"
msgstr ""
-#: lxc/storage.go:730
+#: lxc/storage.go:797
#, c-format
msgid "Storage volume %s deleted"
msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
msgid "Store the container state (only for stop)"
msgstr ""
-#: lxc/info.go:171
+#: lxc/info.go:180
msgid "Swap (current)"
msgstr ""
-#: lxc/info.go:175
+#: lxc/info.go:184
msgid "Swap (peak)"
msgstr ""
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
msgid "TYPE"
msgstr ""
-#: lxc/delete.go:91
+#: lxc/delete.go:105
msgid "The container is currently running, stop it first or pass --force."
msgstr ""
-#: lxc/publish.go:92
+#: lxc/publish.go:101
msgid ""
"The container is currently running. Use --force to have it stopped and "
"restarted."
msgstr ""
-#: lxc/init.go:326
+#: lxc/init.go:358
msgid "The container you are starting doesn't have any network attached to it."
msgstr ""
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
msgid "The device doesn't exist"
msgstr ""
-#: lxc/init.go:310
+#: lxc/init.go:342
#, c-format
msgid "The local image '%s' couldn't be found, trying '%s:' instead."
msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
msgid "The opposite of \"lxc pause\" is \"lxc start\"."
msgstr ""
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
msgid "The specified device doesn't exist"
msgstr ""
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
msgid "The specified device doesn't match the network"
msgstr ""
-#: lxc/publish.go:65
+#: lxc/publish.go:74
msgid "There is no \"image name\". Did you want an alias?"
msgstr ""
@@ -1011,49 +1047,49 @@ msgstr ""
msgid "Time to wait for the container before killing it"
msgstr ""
-#: lxc/image.go:463
+#: lxc/image.go:549
msgid "Timestamps:"
msgstr ""
-#: lxc/init.go:328
+#: lxc/init.go:360
msgid "To attach a network to a container, use: lxc network attach"
msgstr ""
-#: lxc/init.go:327
+#: lxc/init.go:359
msgid "To create a new network, use: lxc network create"
msgstr ""
-#: lxc/main.go:140
+#: lxc/main.go:154
msgid "To start your first container, try: lxc launch ubuntu:16.04"
msgstr ""
-#: lxc/image.go:551
+#: lxc/image.go:657
#, c-format
msgid "Transferring image: %s"
msgstr ""
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
#, c-format
msgid "Try `lxc info --show-log %s` for more info"
msgstr ""
-#: lxc/info.go:102
+#: lxc/info.go:111
msgid "Type: ephemeral"
msgstr ""
-#: lxc/info.go:104
+#: lxc/info.go:113
msgid "Type: persistent"
msgstr ""
-#: lxc/image.go:230
+#: lxc/image.go:233
msgid "UPLOAD DATE"
msgstr ""
-#: lxc/remote.go:396
+#: lxc/remote.go:407
msgid "URL"
msgstr ""
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
msgid "USED BY"
msgstr ""
@@ -1061,11 +1097,16 @@ msgstr ""
msgid "Unable to find help2man."
msgstr ""
-#: lxc/remote.go:110
+#: lxc/remote.go:111
msgid "Unable to read remote TLS certificate"
msgstr ""
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
#, c-format
msgid "Uploaded: %s"
msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
msgid "Usage: lxc <command> [options]"
msgstr ""
-#: lxc/config.go:58
+#: lxc/config.go:60
msgid ""
"Usage: lxc config <subcommand> [options]\n"
"\n"
@@ -1168,7 +1209,7 @@ msgid ""
"Copy containers within or in between LXD instances."
msgstr ""
-#: lxc/delete.go:26
+#: lxc/delete.go:27
msgid ""
"Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
"[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
"Delete containers and snapshots."
msgstr ""
-#: lxc/exec.go:52
+#: lxc/exec.go:53
msgid ""
"Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
"interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
"AND stdout are terminals (stderr is ignored)."
msgstr ""
-#: lxc/file.go:36
+#: lxc/file.go:38
msgid ""
"Usage: lxc file <subcommand> [options]\n"
"\n"
@@ -1231,7 +1272,7 @@ msgid ""
"Help page for the LXD client."
msgstr ""
-#: lxc/image.go:69
+#: lxc/image.go:72
msgid ""
"Usage: lxc image <subcommand> [options]\n"
"\n"
@@ -1336,7 +1377,7 @@ msgid ""
"image alias name."
msgstr ""
-#: lxc/info.go:25
+#: lxc/info.go:26
msgid ""
"Usage: lxc info [<remote>:][<container>] [--show-log]\n"
"\n"
@@ -1349,7 +1390,7 @@ msgid ""
" For LXD server information."
msgstr ""
-#: lxc/init.go:75
+#: lxc/init.go:76
msgid ""
"Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
" lxc init ubuntu:16.04 u1"
msgstr ""
-#: lxc/launch.go:23
+#: lxc/launch.go:20
msgid ""
"Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
"profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
" Only show log message."
msgstr ""
-#: lxc/move.go:19
+#: lxc/move.go:22
msgid ""
"Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
"<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
" Rename a snapshot."
msgstr ""
-#: lxc/network.go:49
+#: lxc/network.go:50
msgid ""
"Usage: lxc network <subcommand> [options]\n"
"\n"
@@ -1565,7 +1606,7 @@ msgid ""
" Update a network using the content of network.yaml"
msgstr ""
-#: lxc/profile.go:49
+#: lxc/profile.go:51
msgid ""
"Usage: lxc profile <subcommand> [options]\n"
"\n"
@@ -1647,7 +1688,7 @@ msgid ""
" Remove all profile from \"foo\""
msgstr ""
-#: lxc/publish.go:27
+#: lxc/publish.go:28
msgid ""
"Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
"alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
"Publish containers as images."
msgstr ""
-#: lxc/remote.go:38
+#: lxc/remote.go:39
msgid ""
"Usage: lxc remote <subcommand> [options]\n"
"\n"
@@ -1684,7 +1725,7 @@ msgid ""
" Print the default remote."
msgstr ""
-#: lxc/restore.go:21
+#: lxc/restore.go:22
msgid ""
"Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
"\n"
@@ -1700,7 +1741,7 @@ msgid ""
" Restore the snapshot."
msgstr ""
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
msgid ""
"Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
"\n"
@@ -1714,7 +1755,7 @@ msgid ""
" Create a snapshot of \"u1\" called \"snap0\"."
msgstr ""
-#: lxc/storage.go:61
+#: lxc/storage.go:62
msgid ""
"Usage: lxc storage <subcommand> [options]\n"
"\n"
@@ -1814,157 +1855,128 @@ msgid ""
"Print the version number of this client tool."
msgstr ""
-#: lxc/delete.go:45
+#: lxc/delete.go:46
msgid "User aborted delete operation."
msgstr ""
-#: lxc/restore.go:37
+#: lxc/restore.go:38
msgid ""
"Whether or not to restore the container's running state from snapshot (if "
"available)"
msgstr ""
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
msgid "Whether or not to snapshot the container's running state"
msgstr ""
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
msgid "YES"
msgstr ""
-#: lxc/exec.go:125
+#: lxc/exec.go:126
msgid "You can't pass -t and -T at the same time"
msgstr ""
-#: lxc/exec.go:129
+#: lxc/exec.go:130
msgid "You can't pass -t or -T at the same time as --mode"
msgstr ""
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
msgstr ""
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
msgstr ""
-#: lxc/remote.go:359
+#: lxc/remote.go:370
msgid "can't remove the default remote"
msgstr ""
-#: lxc/file.go:125
+#: lxc/file.go:269
msgid "can't supply uid/gid/mode in recursive mode"
msgstr ""
-#: lxc/remote.go:385
+#: lxc/remote.go:396
msgid "default"
msgstr ""
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
msgid "didn't get any affected image, container or snapshot from server"
msgstr ""
-#: lxc/image.go:454
+#: lxc/image.go:540
msgid "disabled"
msgstr ""
-#: lxc/image.go:456
+#: lxc/image.go:542
msgid "enabled"
msgstr ""
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
#, c-format
msgid "error: %v"
msgstr ""
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
#, c-format
msgid "error: unknown command: %s"
msgstr ""
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
msgid "no"
msgstr ""
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
msgid "ok (y/n)?"
msgstr ""
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
#, c-format
msgid "processing aliases failed %s\n"
msgstr ""
-#: lxc/file.go:381
+#: lxc/file.go:541
msgid "recursive edit doesn't make sense :("
msgstr ""
-#: lxc/remote.go:421
+#: lxc/remote.go:432
#, c-format
msgid "remote %s already exists"
msgstr ""
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
#, c-format
msgid "remote %s doesn't exist"
msgstr ""
-#: lxc/remote.go:334
+#: lxc/remote.go:345
#, c-format
msgid "remote %s exists as <%s>"
msgstr ""
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
#, c-format
msgid "remote %s is static and cannot be modified"
msgstr ""
-#: lxc/info.go:221
+#: lxc/info.go:230
msgid "stateful"
msgstr ""
-#: lxc/info.go:223
+#: lxc/info.go:232
msgid "stateless"
msgstr ""
-#: lxc/info.go:217
+#: lxc/info.go:226
#, c-format
msgid "taken at %s"
msgstr ""
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
msgid "wrong number of subcommand arguments"
msgstr ""
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
msgid "yes"
msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
From 859ef42d7adbd98623cb1535e00dee3c69151009 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:50:31 -0400
Subject: [PATCH 26/28] Revert "config: Implement temporary Legacy function"
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit 713cb1b0ce913040ce7cea1de6cc82d595b6e826.
This was only needed during the port and can be now reverted.
Keeping around so that the individual commits can still be built which
would make bisection easier.
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/config/legacy.go | 31 -------------------------------
1 file changed, 31 deletions(-)
delete mode 100644 lxc/config/legacy.go
diff --git a/lxc/config/legacy.go b/lxc/config/legacy.go
deleted file mode 100644
index d286f1f03..000000000
--- a/lxc/config/legacy.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package config
-
-import (
- "github.com/lxc/lxd"
-)
-
-// Legacy returns a legacy *lxd.Config
-func (c *Config) Legacy() *lxd.Config {
- conf := &lxd.Config{
- DefaultRemote: c.DefaultRemote,
- Aliases: c.Aliases,
- ConfigDir: c.ConfigDir,
- }
-
- remotes := map[string]lxd.RemoteConfig{}
-
- for k, v := range c.Remotes {
- remote := lxd.RemoteConfig{
- Addr: v.Addr,
- Public: v.Public,
- Protocol: v.Protocol,
- Static: v.Static,
- }
-
- remotes[k] = remote
- }
-
- conf.Remotes = remotes
-
- return conf
-}
From 6ae38754b5b11a4db307ba47288ff75d8d330da0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:56:24 -0400
Subject: [PATCH 27/28] Add deprecation warning for old client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
client.go | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/client.go b/client.go
index 77a3890bb..8353335a0 100644
--- a/client.go
+++ b/client.go
@@ -1,5 +1,9 @@
package lxd
+// DEPRECATED: This package is now deprecated in favor of github.com/lxc/lxd/client
+//
+// This package will be entirely removed from the code tree with LXD 2.16
+
import (
"bytes"
"crypto/x509"
From 48782b7ae2d1af0d3594a89fa0368b6a03d619e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:58:19 -0400
Subject: [PATCH 28/28] client: Drop experimental tag from new client
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
client/doc.go | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/client/doc.go b/client/doc.go
index f54f5b9db..f2de23949 100644
--- a/client/doc.go
+++ b/client/doc.go
@@ -1,14 +1,5 @@
// Package lxd implements a client for the LXD API
//
-// Warning
-//
-// This API isn't considered STABLE yet!
-//
-// This client library is planned to become the new supported Go library
-// for LXD which will come with guaranteed API stability. New functions and
-// struct arguments may be added over time but no existing signature or
-// type will be changed and structs will only gain new members.
-//
// Overview
//
// This package lets you connect to LXD daemons or SimpleStream image
More information about the lxc-devel
mailing list