in windows-builder/builder/builder/gce.go [148:240]
func (s *Server) newInstance(bs *BuilderServer) error {
scmd := startupCmd // TODO: find better way to take address of const
name := "windows-builder-" + uuid.New()
machineType := *bs.MachineType
if machineType == "" {
machineType = "n1-standard-1"
}
diskType := *bs.DiskType
if diskType == "" {
diskType = "pd-standard"
}
accessConfigs := []*compute.AccessConfig{}
if !*bs.UseInternalNet || *bs.CreateExternalIP {
accessConfigs = []*compute.AccessConfig{
&compute.AccessConfig{
Type: "ONE_TO_ONE_NAT",
Name: "External NAT",
},
}
}
instance := &compute.Instance{
Name: name,
MachineType: prefix + s.projectID + "/zones/" + *bs.Zone + "/machineTypes/" + machineType,
Disks: []*compute.AttachedDisk{
{
AutoDelete: true,
Boot: true,
Type: "PERSISTENT",
InitializeParams: &compute.AttachedDiskInitializeParams{
DiskName: fmt.Sprintf("%s-pd", name),
SourceImage: prefix + *bs.ImageUrl,
DiskSizeGb: *bs.DiskSizeGb,
DiskType: prefix + s.projectID + "/zones/" + *bs.Zone + "/diskTypes/" + diskType,
},
},
},
Metadata: &compute.Metadata{
Items: []*compute.MetadataItems{
&compute.MetadataItems{
Key: "windows-startup-script-cmd",
Value: &scmd,
},
},
},
NetworkInterfaces: []*compute.NetworkInterface{
&compute.NetworkInterface{
AccessConfigs: accessConfigs,
Network: prefix + s.projectID + "/global/networks/" + *bs.VPC,
Subnetwork: prefix + s.projectID + "/regions/" + *bs.Region + "/subnetworks/" + *bs.Subnet,
},
},
ServiceAccounts: []*compute.ServiceAccount{
{
Email: bs.GetServiceAccountEmail(s.projectID),
Scopes: []string{
compute.CloudPlatformScope,
},
},
},
Labels: bs.GetLabelsMap(),
Scheduling: &compute.Scheduling{
Preemptible: *bs.Preemptible,
},
Tags: &compute.Tags {
Items: bs.GetTags(),
},
}
op, err := s.service.Instances.Insert(s.projectID, *bs.Zone, instance).Do()
if err != nil {
log.Printf("GCE Instances insert call failed: %v", err)
return err
}
err = s.waitForComputeOperation(op, bs)
if err != nil {
log.Printf("Wait for instance start failed: %v", err)
return err
}
etag := op.Header.Get("Etag")
inst, err := s.service.Instances.Get(s.projectID, *bs.Zone, name).IfNoneMatch(etag).Do()
if err != nil {
log.Printf("Could not get GCE Instance details after creation: %v", err)
return err
}
log.Printf("Successfully created instance: %s", inst.Name)
s.instance = inst
return nil
}