func populatePrepareSteps()

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
}