Skip to content

Commit

Permalink
Merge pull request #559 from rgooch/master
Browse files Browse the repository at this point in the history
Leave source VM in original state and new VM stopped when copying VM.
  • Loading branch information
rgooch committed Feb 11, 2019
2 parents d97ddb9 + 6e0ecea commit 22205fb
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 28 deletions.
11 changes: 2 additions & 9 deletions cmd/vm-control/copyVm.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,24 +84,17 @@ func copyVmFromHypervisor(sourceHypervisorAddress string, vmIP net.IP,
defer destHypervisor.Close()
request := hyper_proto.CopyVmRequest{
AccessToken: accessToken,
DhcpTimeout: *dhcpTimeout,
IpAddress: vmIP,
SourceHypervisor: sourceHypervisorAddress,
}
var reply hyper_proto.CopyVmResponse
logger.Debugf(0, "copying VM to %s\n", destHypervisorAddress)
if err := callCopyVm(destHypervisor, request, &reply, logger); err != nil {
return err
}
if err := acknowledgeVm(destHypervisor, reply.IpAddress); err != nil {
return fmt.Errorf("error acknowledging VM: %s", err)
}
fmt.Println(reply.IpAddress)
if reply.DhcpTimedOut {
return errors.New("DHCP ACK timed out")
}
if *dhcpTimeout > 0 {
logger.Debugln(0, "Received DHCP ACK")
}
return maybeWatchVm(destHypervisor, destHypervisorAddress, reply.IpAddress,
logger)
return nil
}
1 change: 1 addition & 0 deletions cmd/vm-control/migrateVm.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ func migrateVmFromHypervisor(sourceHypervisorAddress string, vmIP net.IP,
return err
}
defer destHypervisor.Close()
logger.Debugf(0, "migrating VM to %s\n", destHypervisorAddress)
conn, err := destHypervisor.Call("Hypervisor.MigrateVm")
if err != nil {
return err
Expand Down
28 changes: 11 additions & 17 deletions hypervisor/manager/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,15 +346,18 @@ func (m *Manager) copyVm(conn *srpc.Conn, request proto.CopyVmRequest,
if err != nil {
return err
}
switch getInfoReply.VmInfo.State {
case proto.StateStopped, proto.StateRunning:
default:
return errors.New("VM is not stopped or running")
}
accessToken := request.AccessToken
vmInfo := getInfoReply.VmInfo
vmInfo.Address = proto.Address{}
vmInfo.SecondaryAddresses = nil
vmInfo.Uncommitted = false
vm, err := m.allocateVm(proto.CreateVmRequest{
DhcpTimeout: request.DhcpTimeout,
VmInfo: vmInfo,
}, conn.GetAuthInformation())
vm, err := m.allocateVm(proto.CreateVmRequest{VmInfo: vmInfo},
conn.GetAuthInformation())
vm.OwnerUsers = getInfoReply.VmInfo.OwnerUsers
vm.Volumes = vmInfo.Volumes
if err := <-tryAllocateMemory(vmInfo.MemoryInMiB); err != nil {
Expand All @@ -376,9 +379,6 @@ func (m *Manager) copyVm(conn *srpc.Conn, request proto.CopyVmRequest,
return
}
vm.cleanup()
if getInfoReply.VmInfo.State == proto.StateRunning {
hyperclient.StartVm(hypervisor, request.IpAddress, accessToken)
}
}()
vm.ownerUsers = make(map[string]struct{}, len(vm.OwnerUsers))
for _, username := range vm.OwnerUsers {
Expand Down Expand Up @@ -406,6 +406,7 @@ func (m *Manager) copyVm(conn *srpc.Conn, request proto.CopyVmRequest,
if err != nil {
return err
}
defer hyperclient.StartVm(hypervisor, request.IpAddress, accessToken)
err = sendVmCopyMessage(conn, encoder, "update volume(s)")
if err != nil {
return err
Expand All @@ -420,18 +421,11 @@ func (m *Manager) copyVm(conn *srpc.Conn, request proto.CopyVmRequest,
if err != nil {
return err
}
if err := sendVmCopyMessage(conn, encoder, "starting VM"); err != nil {
return err
}
dhcpTimedOut, err := vm.startManaging(request.DhcpTimeout, false)
if err != nil {
return err
}
vm.setState(proto.StateStopped)
vm.destroyTimer = time.AfterFunc(time.Second*15, vm.autoDestroy)
response := proto.CopyVmResponse{
DhcpTimedOut: dhcpTimedOut,
Final: true,
IpAddress: vm.Address.IpAddress,
Final: true,
IpAddress: vm.Address.IpAddress,
}
if err := encoder.Encode(response); err != nil {
return err
Expand Down
8 changes: 8 additions & 0 deletions lib/fsutil/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,19 @@ import (
"hash"
"io"
"os"
"syscall"
"time"

"github.com/Symantec/Dominator/lib/log"
)

const (
DirPerms = syscall.S_IRWXU | syscall.S_IRGRP | syscall.S_IXGRP |
syscall.S_IROTH | syscall.S_IXOTH
PrivateFilePerms = syscall.S_IRUSR | syscall.S_IWUSR
PublicFilePerms = PrivateFilePerms | syscall.S_IRGRP | syscall.S_IROTH
)

var (
ErrorChecksumMismatch = errors.New("checksum mismatch")
)
Expand Down
2 changes: 0 additions & 2 deletions proto/hypervisor/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,11 @@ type CommitImportedVmResponse struct {

type CopyVmRequest struct {
AccessToken []byte
DhcpTimeout time.Duration
IpAddress net.IP
SourceHypervisor string
}

type CopyVmResponse struct { // Multiple responses are sent.
DhcpTimedOut bool
Error string
Final bool // If true, this is the final response.
IpAddress net.IP
Expand Down

0 comments on commit 22205fb

Please sign in to comment.