bigtable: Add retry to all idempotent RPCs

This commit completes the work in 1dc634da581031aa02c02fca493a65e269895b57.

Fixes #653

Change-Id: I3abb51793db61e38dde7f70e5eff18734d9d40aa
Reviewed-on: https://code-review.googlesource.com/33450
Reviewed-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/bigtable/admin.go b/bigtable/admin.go
index 0692469..ee06163 100644
--- a/bigtable/admin.go
+++ b/bigtable/admin.go
@@ -371,7 +371,12 @@
 			req.PageSize = int32(pageSize)
 		}
 
-		resp, err := ac.tClient.ListSnapshots(ctx, req)
+		var resp *btapb.ListSnapshotsResponse
+		err := gax.Invoke(ctx, func(ctx context.Context) error {
+			var err error
+			resp, err = ac.tClient.ListSnapshots(ctx, req)
+			return err
+		}, retryOptions...)
 		if err != nil {
 			return "", err
 		}
@@ -470,7 +475,12 @@
 		Name: snapshotPath,
 	}
 
-	resp, err := ac.tClient.GetSnapshot(ctx, req)
+	var resp *btapb.Snapshot
+	err := gax.Invoke(ctx, func(ctx context.Context) error {
+		var err error
+		resp, err = ac.tClient.GetSnapshot(ctx, req)
+		return err
+	}, retryOptions...)
 	if err != nil {
 		return nil, err
 	}
@@ -717,7 +727,12 @@
 	req := &btapb.ListInstancesRequest{
 		Parent: "projects/" + iac.project,
 	}
-	res, err := iac.iClient.ListInstances(ctx, req)
+	var res *btapb.ListInstancesResponse
+	err := gax.Invoke(ctx, func(ctx context.Context) error {
+		var err error
+		res, err = iac.iClient.ListInstances(ctx, req)
+		return err
+	}, retryOptions...)
 	if err != nil {
 		return nil, err
 	}
@@ -747,7 +762,12 @@
 	req := &btapb.GetInstanceRequest{
 		Name: "projects/" + iac.project + "/instances/" + instanceID,
 	}
-	res, err := iac.iClient.GetInstance(ctx, req)
+	var res *btapb.Instance
+	err := gax.Invoke(ctx, func(ctx context.Context) error {
+		var err error
+		res, err = iac.iClient.GetInstance(ctx, req)
+		return err
+	}, retryOptions...)
 	if err != nil {
 		return nil, err
 	}
@@ -829,7 +849,12 @@
 func (iac *InstanceAdminClient) Clusters(ctx context.Context, instanceID string) ([]*ClusterInfo, error) {
 	ctx = mergeOutgoingMetadata(ctx, iac.md)
 	req := &btapb.ListClustersRequest{Parent: "projects/" + iac.project + "/instances/" + instanceID}
-	res, err := iac.iClient.ListClusters(ctx, req)
+	var res *btapb.ListClustersResponse
+	err := gax.Invoke(ctx, func(ctx context.Context) error {
+		var err error
+		res, err = iac.iClient.ListClusters(ctx, req)
+		return err
+	}, retryOptions...)
 	if err != nil {
 		return nil, err
 	}
@@ -852,7 +877,12 @@
 func (iac *InstanceAdminClient) GetCluster(ctx context.Context, instanceID, clusterID string) (*ClusterInfo, error) {
 	ctx = mergeOutgoingMetadata(ctx, iac.md)
 	req := &btapb.GetClusterRequest{Name: "projects/" + iac.project + "/instances/" + instanceID + "/clusters/" + clusterID}
-	c, err := iac.iClient.GetCluster(ctx, req)
+	var c *btapb.Cluster
+	err := gax.Invoke(ctx, func(ctx context.Context) error {
+		var err error
+		c, err = iac.iClient.GetCluster(ctx, req)
+		return err
+	}, retryOptions...)
 	if err != nil {
 		return nil, err
 	}
@@ -988,8 +1018,16 @@
 	profileRequest := &btapb.GetAppProfileRequest{
 		Name: "projects/" + iac.project + "/instances/" + instanceID + "/appProfiles/" + name,
 	}
-	return iac.iClient.GetAppProfile(ctx, profileRequest)
-
+	var ap *btapb.AppProfile
+	err := gax.Invoke(ctx, func(ctx context.Context) error {
+		var err error
+		ap, err = iac.iClient.GetAppProfile(ctx, profileRequest)
+		return err
+	}, retryOptions...)
+	if err != nil {
+		return nil, err
+	}
+	return ap, err
 }
 
 // ListAppProfiles lists information about app profiles in an instance.
@@ -1002,7 +1040,12 @@
 	pit := &ProfileIterator{}
 	fetch := func(pageSize int, pageToken string) (string, error) {
 		listRequest.PageToken = pageToken
-		profileRes, err := iac.iClient.ListAppProfiles(ctx, listRequest)
+		var profileRes *btapb.ListAppProfilesResponse
+		err := gax.Invoke(ctx, func(ctx context.Context) error {
+			var err error
+			profileRes, err = iac.iClient.ListAppProfiles(ctx, listRequest)
+			return err
+		}, retryOptions...)
 		if err != nil {
 			return "", err
 		}