func()

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
}