func()

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
}