func createCloudSpannerInstanceIfMissing()

in spanner_prober/prober/proberlib.go [456:500]


func createCloudSpannerInstanceIfMissing(ctx context.Context, instanceClient *instance.InstanceAdminClient, opt ProberOptions) error {
	// Skip instance creation requests if the instance already exists.
	if checkInstancePresence(ctx, instanceClient, opt) {
		return nil
	}

	op, err := instanceClient.CreateInstance(ctx, &instancepb.CreateInstanceRequest{
		Parent:     opt.projectURI(),
		InstanceId: opt.instanceName(),
		Instance: &instancepb.Instance{
			Name:            opt.instanceURI(),
			Config:          opt.instanceConfigURI(),
			DisplayName:     opt.instanceName(),
			NodeCount:       int32(opt.NodeCount),
			ProcessingUnits: int32(opt.ProcessingUnits),
		},
	})

	// If instance create operations fails, check if the instance was already created. If no, return error.
	if err != nil {
		if status.Code(err) != codes.AlreadyExists {
			return err
		}
	} else if _, err := op.Wait(ctx); err != nil {
		return err
	}

	// Wait for instance to be ready.
	var retries int
	for {
		var resp *instancepb.Instance
		resp, err = instanceClient.GetInstance(ctx, &instancepb.GetInstanceRequest{
			Name: opt.instanceURI(),
		})
		if err != nil || resp.State == instancepb.Instance_READY {
			return err
		}
		select {
		case <-time.After(backoff(baseLRORetryDelay, maxLRORetryDelay, retries)):
		case <-ctx.Done():
			return ctx.Err()
		}
		retries++
	}
}