func FindExistingInstance()

in gke-windows-builder/builder/builder/gce.go [185:226]


func FindExistingInstance(ctx context.Context, bs *WindowsBuildServerConfig, projectID string) (*Server, error) {
	s := &Server{projectID: projectID, zone: *bs.Zone}
	var err error
	if err = s.newGCEService(ctx); err != nil {
		log.Printf("Failed to start GCE service to create servers: %+v", err)
		return nil, err
	}

	instanceList, err := s.service.Instances.
		List(projectID, *bs.Zone).
		Filter(buildListInstancesFilter(bs.GetLabelsMap(), bs.InstanceNamePrefix)).
		Do()

	if err != nil {
		log.Printf("Failed to list relevant instances: %v", err)
		return nil, err
	}

	foundInstancesList := []*compute.Instance{}

	// Filter by network and subnetwork
	for instance := range instanceList.Items {
		//log.Printf("Network %s", instanceList.Items[instance].NetworkInterfaces[0].Network)
		//log.Printf("Subnetwork %s", instanceList.Items[instance].NetworkInterfaces[0].Subnetwork)
		if instanceList.Items[instance].NetworkInterfaces[0].Network == ProjectNetworkUrl(bs.NetworkConfig) &&
			instanceList.Items[instance].NetworkInterfaces[0].Subnetwork == InstanceSubnetworkUrl(bs.NetworkConfig) {
			foundInstancesList = append(foundInstancesList, instanceList.Items[instance])
		}
	}

	if len(foundInstancesList) == 0 {
		log.Printf("Found no relevant instances")
		return nil, nil
	}

	random.Seed(time.Now().Unix())
	chosenInstance := foundInstancesList[random.Intn(len(foundInstancesList))]

	log.Printf("Found %d relevant instances for version: %s, chose %s", len(foundInstancesList), *bs.ImageVersion, chosenInstance.Name)

	return existingServer(ctx, *bs.Zone, projectID, chosenInstance.Name, bs.UseInternalIP)
}