[lxc-devel] [lxd/master] Fix migration of VMs
stgraber on Github
lxc-bot at linuxcontainers.org
Tue Jul 28 22:54:14 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200728/d6effc87/attachment.bin>
-------------- next part --------------
From fe18cbdb747e1c802887a03d2d25aa210ab0e7df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 28 Jul 2020 18:50:52 -0400
Subject: [PATCH 1/2] client: Move proxyMigration
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 | 85 ----------------------------------------
client/lxd_instances.go | 85 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 85 insertions(+), 85 deletions(-)
diff --git a/client/lxd_containers.go b/client/lxd_containers.go
index 6a65051d2a..61fa5a3b8a 100644
--- a/client/lxd_containers.go
+++ b/client/lxd_containers.go
@@ -499,91 +499,6 @@ func (r *ProtocolLXD) CopyContainer(source InstanceServer, container api.Contain
return r.tryCreateContainer(req, info.Addresses)
}
-func (r *ProtocolLXD) proxyMigration(targetOp *operation, targetSecrets map[string]string, source InstanceServer, sourceOp *operation, sourceSecrets map[string]string) error {
- // Sanity checks
- for n := range targetSecrets {
- _, ok := sourceSecrets[n]
- if !ok {
- return fmt.Errorf("Migration target expects the \"%s\" socket but source isn't providing it", n)
- }
- }
-
- if targetSecrets["control"] == "" {
- return fmt.Errorf("Migration target didn't setup the required \"control\" socket")
- }
-
- // Struct used to hold everything together
- type proxy struct {
- done chan bool
- sourceConn *websocket.Conn
- targetConn *websocket.Conn
- }
-
- proxies := map[string]*proxy{}
-
- // Connect the control socket
- sourceConn, err := source.GetOperationWebsocket(sourceOp.ID, sourceSecrets["control"])
- if err != nil {
- return err
- }
-
- targetConn, err := r.GetOperationWebsocket(targetOp.ID, targetSecrets["control"])
- if err != nil {
- return err
- }
-
- proxies["control"] = &proxy{
- done: shared.WebsocketProxy(sourceConn, targetConn),
- sourceConn: sourceConn,
- targetConn: targetConn,
- }
-
- // Connect the data sockets
- for name := range sourceSecrets {
- if name == "control" {
- continue
- }
-
- // Handle resets (used for multiple objects)
- sourceConn, err := source.GetOperationWebsocket(sourceOp.ID, sourceSecrets[name])
- if err != nil {
- break
- }
-
- targetConn, err := r.GetOperationWebsocket(targetOp.ID, targetSecrets[name])
- if err != nil {
- break
- }
-
- proxies[name] = &proxy{
- sourceConn: sourceConn,
- targetConn: targetConn,
- done: shared.WebsocketProxy(sourceConn, targetConn),
- }
- }
-
- // Cleanup once everything is done
- go func() {
- // Wait for control socket
- <-proxies["control"].done
- proxies["control"].sourceConn.Close()
- proxies["control"].targetConn.Close()
-
- // Then deal with the others
- for name, proxy := range proxies {
- if name == "control" {
- continue
- }
-
- <-proxy.done
- proxy.sourceConn.Close()
- proxy.targetConn.Close()
- }
- }()
-
- return nil
-}
-
// UpdateContainer updates the container definition
func (r *ProtocolLXD) UpdateContainer(name string, container api.ContainerPut, ETag string) (Operation, error) {
// Send the request
diff --git a/client/lxd_instances.go b/client/lxd_instances.go
index 8140aa1798..45d192760f 100644
--- a/client/lxd_instances.go
+++ b/client/lxd_instances.go
@@ -2216,3 +2216,88 @@ func (r *ProtocolLXD) GetInstanceBackupFile(instanceName string, name string, re
return &resp, nil
}
+
+func (r *ProtocolLXD) proxyMigration(targetOp *operation, targetSecrets map[string]string, source InstanceServer, sourceOp *operation, sourceSecrets map[string]string) error {
+ // Sanity checks
+ for n := range targetSecrets {
+ _, ok := sourceSecrets[n]
+ if !ok {
+ return fmt.Errorf("Migration target expects the \"%s\" socket but source isn't providing it", n)
+ }
+ }
+
+ if targetSecrets["control"] == "" {
+ return fmt.Errorf("Migration target didn't setup the required \"control\" socket")
+ }
+
+ // Struct used to hold everything together
+ type proxy struct {
+ done chan bool
+ sourceConn *websocket.Conn
+ targetConn *websocket.Conn
+ }
+
+ proxies := map[string]*proxy{}
+
+ // Connect the control socket
+ sourceConn, err := source.GetOperationWebsocket(sourceOp.ID, sourceSecrets["control"])
+ if err != nil {
+ return err
+ }
+
+ targetConn, err := r.GetOperationWebsocket(targetOp.ID, targetSecrets["control"])
+ if err != nil {
+ return err
+ }
+
+ proxies["control"] = &proxy{
+ done: shared.WebsocketProxy(sourceConn, targetConn),
+ sourceConn: sourceConn,
+ targetConn: targetConn,
+ }
+
+ // Connect the data sockets
+ for name := range sourceSecrets {
+ if name == "control" {
+ continue
+ }
+
+ // Handle resets (used for multiple objects)
+ sourceConn, err := source.GetOperationWebsocket(sourceOp.ID, sourceSecrets[name])
+ if err != nil {
+ break
+ }
+
+ targetConn, err := r.GetOperationWebsocket(targetOp.ID, targetSecrets[name])
+ if err != nil {
+ break
+ }
+
+ proxies[name] = &proxy{
+ sourceConn: sourceConn,
+ targetConn: targetConn,
+ done: shared.WebsocketProxy(sourceConn, targetConn),
+ }
+ }
+
+ // Cleanup once everything is done
+ go func() {
+ // Wait for control socket
+ <-proxies["control"].done
+ proxies["control"].sourceConn.Close()
+ proxies["control"].targetConn.Close()
+
+ // Then deal with the others
+ for name, proxy := range proxies {
+ if name == "control" {
+ continue
+ }
+
+ <-proxy.done
+ proxy.sourceConn.Close()
+ proxy.targetConn.Close()
+ }
+ }()
+
+ return nil
+}
From cb4270a313657b33fd5ef01247f1d43b05a47dd3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 28 Jul 2020 18:51:24 -0400
Subject: [PATCH 2/2] lxd: Port remaining calls to instance
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes #7701
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/instance_post.go | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/lxd/instance_post.go b/lxd/instance_post.go
index fa8dcaeedf..8111451073 100644
--- a/lxd/instance_post.go
+++ b/lxd/instance_post.go
@@ -327,17 +327,17 @@ func containerPostClusteringMigrate(d *Daemon, c instance.Instance, oldName, new
}
// First make a copy on the new node of the container to be moved.
- entry, _, err := source.GetContainer(oldName)
+ entry, _, err := source.GetInstance(oldName)
if err != nil {
return errors.Wrap(err, "Failed to get instance info")
}
- args := lxd.ContainerCopyArgs{
+ args := lxd.InstanceCopyArgs{
Name: destName,
Mode: "pull",
}
- copyOp, err := dest.CopyContainer(source, *entry, &args)
+ copyOp, err := dest.CopyInstance(source, *entry, &args)
if err != nil {
return errors.Wrap(err, "Failed to issue copy instance API request")
}
@@ -348,7 +348,7 @@ func containerPostClusteringMigrate(d *Daemon, c instance.Instance, oldName, new
}
// Delete the container on the original node.
- deleteOp, err := source.DeleteContainer(oldName)
+ deleteOp, err := source.DeleteInstance(oldName)
if err != nil {
return errors.Wrap(err, "Failed to issue delete instance API request")
}
More information about the lxc-devel
mailing list