in gke-windows-builder/builder/builder/gce.go [264:350]
func (s *Server) newInstance(bs *WindowsBuildServerConfig) error {
name := *bs.InstanceNamePrefix + uuid.New()
machineType := *bs.MachineType
if machineType == "" {
machineType = "e2-standard-2"
}
accessConfigs := []*compute.AccessConfig{
{
Type: "ONE_TO_ONE_NAT",
Name: "External NAT",
},
}
if !bs.ExternalNAT {
accessConfigs = nil
}
// https://cloud.google.com/compute/docs/reference/rest/v1/instances#resource:-instance
instance := &compute.Instance{
Name: name,
MachineType: computeUrlPrefix + s.projectID + "/zones/" + s.zone + "/machineTypes/" + machineType,
Disks: []*compute.AttachedDisk{
{
AutoDelete: true,
Boot: true,
Type: "PERSISTENT",
InitializeParams: &compute.AttachedDiskInitializeParams{
DiskName: fmt.Sprintf("%s-pd", name),
SourceImage: computeUrlPrefix + *bs.ImageURL,
DiskType: computeUrlPrefix + s.projectID + "/zones/" + s.zone + "/diskTypes/" + *bs.BootDiskType,
DiskSizeGb: bs.BootDiskSizeGB,
},
},
},
Metadata: &compute.Metadata{
Items: []*compute.MetadataItems{
&compute.MetadataItems{
Key: "windows-startup-script-ps1",
Value: &setupScriptPS1,
},
},
},
NetworkInterfaces: []*compute.NetworkInterface{
&compute.NetworkInterface{
AccessConfigs: accessConfigs,
},
},
ServiceAccounts: []*compute.ServiceAccount{
{
Email: bs.GetServiceAccountEmail(s.projectID),
Scopes: []string{
compute.CloudPlatformScope,
},
},
},
Labels: bs.GetLabelsMap(),
}
subnetUrl := InstanceSubnetworkUrl(bs.NetworkConfig)
if subnetUrl != "" {
// Network will be inferred from the subnetwork
instance.NetworkInterfaces[0].Subnetwork = subnetUrl
}
op, err := s.service.Instances.Insert(s.projectID, s.zone, instance).Do()
if err != nil {
log.Printf("GCE Instances insert call failed: %v", err)
return err
}
err = s.waitForComputeOperation(op)
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, s.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, version: %s", inst.Name, *bs.ImageVersion)
s.instance = inst
return nil
}