in tools/gke-disk-image-builder/imager.go [126:268]
func GenerateDiskImage(ctx context.Context, req Request) error {
startupScriptFile, err := buildDiskStartupScript(req)
if err != nil {
return err
}
imageLabels, err := buildImageLabels(req)
if err != nil {
return err
}
defer startupScriptFile.Close()
defer os.Remove(startupScriptFile.Name())
preloadDiskWorkflow := daisy.New()
preloadDiskWorkflow.Name = req.JobName
preloadDiskWorkflow.Project = req.ProjectName
preloadDiskWorkflow.Zone = req.Zone
preloadDiskWorkflow.GCSPath = req.GCSPath
preloadDiskWorkflow.OAuthPath = req.GCPOAuth
preloadDiskWorkflow.DefaultTimeout = req.Timeout.String()
preloadDiskWorkflow.Sources = map[string]string{
"startup.sh": startupScriptFile.Name(),
}
preloadDiskWorkflow.Steps = map[string]*daisy.Step{
"create-disk": {
CreateDisks: &daisy.CreateDisks{
&daisy.Disk{
Resource: daisy.Resource{
ExactName: true,
},
Disk: compute.Disk{
Name: fmt.Sprintf("%s-disk", req.JobName),
Type: req.DiskType,
SizeGb: req.DiskSizeGB,
},
},
},
},
"create-instance": {
CreateInstances: &daisy.CreateInstances{
Instances: []*daisy.Instance{
&daisy.Instance{
InstanceBase: daisy.InstanceBase{
Resource: daisy.Resource{
ExactName: true,
},
StartupScript: "startup.sh",
},
Instance: compute.Instance{
Name: fmt.Sprintf("%s-instance", req.JobName),
MachineType: fmt.Sprintf("zones/%s/machineTypes/%s", req.Zone, req.MachineType),
ServiceAccounts: []*compute.ServiceAccount{
&compute.ServiceAccount{
Email: req.ServiceAccount,
Scopes: []string{
"https://www.googleapis.com/auth/cloud-platform",
},
},
},
NetworkInterfaces: []*compute.NetworkInterface{
{
Network: req.Network,
Subnetwork: req.Subnet,
},
},
Disks: []*compute.AttachedDisk{
&compute.AttachedDisk{
AutoDelete: true,
Boot: true,
Type: "PERSISTENT",
DeviceName: fmt.Sprintf("%s-bootable-disk", req.JobName),
Mode: "READ_WRITE",
InitializeParams: &compute.AttachedDiskInitializeParams{
DiskSizeGb: req.DiskSizeGB,
DiskType: fmt.Sprintf("projects/%s/zones/%s/diskTypes/%s", req.ProjectName, req.Zone, req.DiskType),
SourceImage: "projects/debian-cloud/global/images/debian-11-bullseye-v20230912",
},
},
&compute.AttachedDisk{
AutoDelete: true,
Boot: false,
DiskSizeGb: req.DiskSizeGB,
DeviceName: deviceName,
Source: fmt.Sprintf("%s-disk", req.JobName),
},
},
},
},
},
},
},
"wait-on-image-creation": {
WaitForInstancesSignal: &daisy.WaitForInstancesSignal{
&daisy.InstanceSignal{
Name: fmt.Sprintf("%s-instance", req.JobName),
SerialOutput: &daisy.SerialOutput{
Port: 1,
SuccessMatch: "Unpacking is completed",
FailureMatch: []string{
"startup-script-url exit status 1",
"Failed to pull and unpack the image",
},
},
},
},
},
"detach-disk": {
DetachDisks: &daisy.DetachDisks{
&daisy.DetachDisk{
Instance: fmt.Sprintf("%s-instance", req.JobName),
DeviceName: deviceName,
},
},
},
"create-image": {
CreateImages: &daisy.CreateImages{
Images: []*daisy.Image{
&daisy.Image{
ImageBase: daisy.ImageBase{
Resource: daisy.Resource{
NoCleanup: true,
ExactName: true,
},
},
Image: compute.Image{
Name: req.ImageName,
SourceDisk: fmt.Sprintf("%s-disk", req.JobName),
Family: req.ImageFamilyName,
Labels: imageLabels,
},
},
},
},
},
}
preloadDiskWorkflow.Dependencies = map[string][]string{
"create-instance": {"create-disk"},
"wait-on-image-creation": {"create-instance"},
"detach-disk": {"wait-on-image-creation"},
"create-image": {"detach-disk"},
}
return run(ctx, preloadDiskWorkflow)
}