in fixtures.go [368:429]
func (t *TestVM) CreateDerivativeVM(name string) (*TestVM, error) {
t.testWorkflow.counter++
stepSuffix := fmt.Sprintf("%s-%d", t.name, t.testWorkflow.counter)
vmname := fmt.Sprintf("derivative-%s", name)
// Stop the source VM.
lastStep, err := t.testWorkflow.getLastStepForVM(t.name)
if err != nil {
return nil, fmt.Errorf("failed to resolve last step")
}
stopStep, err := t.testWorkflow.addStopStep(stepSuffix, t.name)
if err != nil {
return nil, err
}
if err := t.testWorkflow.wf.AddDependency(stopStep, lastStep); err != nil {
return nil, err
}
// Wait for the source VM to stop.
waitStopStep, err := t.testWorkflow.addWaitStoppedStep("stopped-"+stepSuffix, t.name)
if err != nil {
return nil, err
}
if err := t.testWorkflow.wf.AddDependency(waitStopStep, stopStep); err != nil {
return nil, err
}
// Now detach the boot disk from the source VM.
detachStepName := fmt.Sprintf("detach-disk-%s", stepSuffix)
detachDiskStep, err := t.testWorkflow.appendDetachDiskStep(detachStepName, t.name, []string{t.name})
if err != nil {
return nil, err
}
if err := t.testWorkflow.wf.AddDependency(detachDiskStep, waitStopStep); err != nil {
return nil, err
}
// Create a new instance using the original boot disk.
daisyInst := &daisy.Instance{}
bootDisk := &compute.Disk{Name: t.name}
createVMStep, i, err := t.testWorkflow.addNewVMStep([]*compute.Disk{bootDisk}, daisyInst)
if err != nil {
return nil, err
}
if err := t.testWorkflow.wf.AddDependency(createVMStep, detachDiskStep); err != nil {
return nil, err
}
// Override the name with the derivative name.
i.Name = vmname
// Add wait step for the new VM.
waitStep, err := t.testWorkflow.addWaitStep(vmname, vmname)
if err != nil {
return nil, err
}
if err := t.testWorkflow.wf.AddDependency(waitStep, createVMStep); err != nil {
return nil, err
}
return &TestVM{name: vmname, testWorkflow: t.testWorkflow, instance: i}, nil
}