in cli_tools/gce_windows_upgrade/upgrader/workflows.go [46:214]
func populatePrepareSteps(u *upgrader, w *daisy.Workflow) error {
currentExecutablePath := os.Args[0]
w.Sources = map[string]string{"upgrade_script.ps1": path.ToWorkingDir("upgrade_script.ps1", currentExecutablePath)}
stepStopInstance, err := daisyutils.NewStep(w, "stop-instance")
if err != nil {
return err
}
stepStopInstance.StopInstances = &daisy.StopInstances{
Instances: []string{u.instanceURI},
}
prevStep := stepStopInstance
if u.CreateMachineBackup {
stepBackupMachineImage, err := daisyutils.NewStep(w, "backup-machine-image", stepStopInstance)
if err != nil {
return err
}
stepBackupMachineImage.CreateMachineImages = &daisy.CreateMachineImages{
&daisy.MachineImage{
MachineImage: compute.MachineImage{
Name: u.machineImageBackupName,
SourceInstance: u.instanceURI,
},
Resource: daisy.Resource{
ExactName: true,
NoCleanup: true,
},
},
}
prevStep = stepBackupMachineImage
}
stepBackupOSDiskSnapshot, err := daisyutils.NewStep(w, "backup-os-disk-snapshot", prevStep)
if err != nil {
return err
}
stepBackupOSDiskSnapshot.CreateSnapshots = &daisy.CreateSnapshots{
&daisy.Snapshot{
Snapshot: compute.Snapshot{
Name: u.osDiskSnapshotName,
SourceDisk: u.osDiskURI,
},
Resource: daisy.Resource{
ExactName: true,
NoCleanup: true,
},
},
}
stepCreateNewOSDisk, err := daisyutils.NewStep(w, "create-new-os-disk", stepBackupOSDiskSnapshot)
if err != nil {
return err
}
stepCreateNewOSDisk.CreateDisks = &daisy.CreateDisks{
&daisy.Disk{
Disk: compute.Disk{
Name: u.newOSDiskName,
Zone: u.instanceZone,
Type: u.osDiskType,
SourceSnapshot: u.osDiskSnapshotName,
Licenses: []string{upgradePaths[u.SourceOS][u.TargetOS].licenseToAdd},
},
Resource: daisy.Resource{
ExactName: true,
NoCleanup: true,
},
},
}
stepDetachOldOSDisk, err := daisyutils.NewStep(w, "detach-old-os-disk", stepCreateNewOSDisk)
if err != nil {
return err
}
stepDetachOldOSDisk.DetachDisks = &daisy.DetachDisks{
&daisy.DetachDisk{
Instance: u.instanceURI,
DeviceName: daisyutils.GetDeviceURI(u.instanceProject, u.instanceZone, u.osDiskDeviceName),
},
}
stepAttachNewOSDisk, err := daisyutils.NewStep(w, "attach-new-os-disk", stepDetachOldOSDisk)
if err != nil {
return err
}
stepAttachNewOSDisk.AttachDisks = &daisy.AttachDisks{
&daisy.AttachDisk{
Instance: u.instanceURI,
AttachedDisk: compute.AttachedDisk{
Source: u.newOSDiskName,
DeviceName: u.osDiskDeviceName,
AutoDelete: u.osDiskAutoDelete,
Boot: true,
},
},
}
stepCreateInstallDisk, err := daisyutils.NewStep(w, "create-install-disk", stepAttachNewOSDisk)
if err != nil {
return err
}
stepCreateInstallDisk.CreateDisks = &daisy.CreateDisks{
&daisy.Disk{
Disk: compute.Disk{
Name: u.installMediaDiskName,
Zone: u.instanceZone,
Type: "pd-ssd",
SourceImage: "projects/compute-image-tools/global/images/family/windows-install-media",
},
Resource: daisy.Resource{
ExactName: true,
NoCleanup: true,
},
},
}
if u.UseStagingInstallMedia {
(*stepCreateInstallDisk.CreateDisks)[0].SourceImage = "projects/bct-prod-images/global/images/family/windows-install-media"
}
stepAttachInstallDisk, err := daisyutils.NewStep(w, "attach-install-disk", stepCreateInstallDisk)
if err != nil {
return err
}
stepAttachInstallDisk.AttachDisks = &daisy.AttachDisks{
&daisy.AttachDisk{
Instance: u.instanceURI,
AttachedDisk: compute.AttachedDisk{
Source: u.installMediaDiskName,
AutoDelete: true,
},
},
}
prevStep = stepAttachInstallDisk
// If there isn't an original url, just skip the backup step.
if u.originalWindowsStartupScriptURL != nil {
fmt.Printf("\nDetected an existing metadata for key '%v', value='%v'. Will backup to '%v'.\n\n", metadataWindowsStartupScriptURL,
*u.originalWindowsStartupScriptURL, metadataWindowsStartupScriptURLBackup)
stepBackupScript, err := daisyutils.NewStep(w, "backup-script", stepAttachInstallDisk)
if err != nil {
return err
}
stepBackupScript.UpdateInstancesMetadata = &daisy.UpdateInstancesMetadata{
&daisy.UpdateInstanceMetadata{
Instance: u.instanceURI,
Metadata: map[string]string{metadataWindowsStartupScriptURLBackup: *u.originalWindowsStartupScriptURL},
},
}
prevStep = stepBackupScript
}
stepSetScript, err := daisyutils.NewStep(w, "set-script", prevStep)
if err != nil {
return err
}
stepSetScript.UpdateInstancesMetadata = &daisy.UpdateInstancesMetadata{
&daisy.UpdateInstanceMetadata{
Instance: u.instanceURI,
Metadata: map[string]string{
metadataWindowsStartupScriptURL: "${SOURCESPATH}/upgrade_script.ps1",
"expected-current-version": upgradePaths[u.SourceOS][u.TargetOS].expectedCurrentVersion,
"expected-new-version": upgradePaths[u.SourceOS][u.TargetOS].expectedNewVersion,
"install-folder": upgradePaths[u.SourceOS][u.TargetOS].installFolder,
},
},
}
return nil
}