Skip to content

Commit d92aae6

Browse files
committed
incorporate requested changes
1 parent 51c8726 commit d92aae6

File tree

4 files changed

+111
-108
lines changed

4 files changed

+111
-108
lines changed

samples/snippets/src/main/java/com/example/spanner/AddAndDropDatabaseRole.java

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -24,59 +24,62 @@
2424
import com.google.common.collect.ImmutableList;
2525
import com.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata;
2626
import java.util.concurrent.ExecutionException;
27+
import java.util.concurrent.TimeUnit;
28+
import java.util.concurrent.TimeoutException;
2729

2830
public class AddAndDropDatabaseRole {
2931

30-
static void addAndDropDatabaseRole() throws InterruptedException, ExecutionException {
32+
static void addAndDropDatabaseRole() {
3133
// TODO(developer): Replace these variables before running the sample.
3234
String projectId = "my-project";
3335
String instanceId = "my-instance";
3436
String databaseId = "my-database";
3537
String parentRole = "new-parent";
3638
String childRole = "new-child";
39+
addAndDropDatabaseRole(projectId, instanceId, databaseId, parentRole, childRole);
40+
}
3741

42+
static void addAndDropDatabaseRole(
43+
String projectId, String instanceId, String databaseId, String parentRole, String childRole) {
3844
try (Spanner spanner =
3945
SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) {
40-
DatabaseAdminClient adminClient = spanner.getDatabaseAdminClient();
41-
addAndDropDatabaseRole(adminClient, instanceId, databaseId, parentRole, childRole);
46+
final DatabaseAdminClient adminClient = spanner.getDatabaseAdminClient();
47+
OperationFuture<Void, UpdateDatabaseDdlMetadata> operation =
48+
adminClient.updateDatabaseDdl(
49+
instanceId,
50+
databaseId,
51+
ImmutableList.of(
52+
"CREATE ROLE " + parentRole,
53+
"GRANT SELECT ON TABLE Albums TO ROLE " + parentRole,
54+
"CREATE ROLE " + childRole,
55+
"GRANT ROLE " + parentRole + " TO ROLE " + childRole),
56+
null);
57+
try {
58+
System.out.println("Waiting for role create operation to complete...");
59+
operation.get(5, TimeUnit.MINUTES);
60+
System.out.printf(
61+
"Created roles %s and %s and granted privileges%n", parentRole, childRole);
62+
// Delete role and membership.
63+
operation =
64+
adminClient.updateDatabaseDdl(
65+
instanceId,
66+
databaseId,
67+
ImmutableList.of(
68+
"REVOKE ROLE " + parentRole + " FROM ROLE " + childRole,
69+
"DROP ROLE " + childRole),
70+
null);
71+
System.out.println("Waiting for role revoke & drop operation to complete...");
72+
operation.get(5, TimeUnit.MINUTES);
73+
System.out.printf("Revoked privileges and dropped role %s%n", childRole);
74+
} catch (ExecutionException | TimeoutException e) {
75+
System.out.printf(
76+
"Error: AddAndDropDatabaseRole failed with error message %s\n", e.getMessage());
77+
e.printStackTrace();
78+
} catch (InterruptedException e) {
79+
System.out.println(
80+
"Error: Waiting for AddAndDropDatabaseRole operation to finish was interrupted");
81+
}
4282
}
4383
}
44-
45-
static void addAndDropDatabaseRole(
46-
DatabaseAdminClient adminClient,
47-
String instanceId,
48-
String databaseId,
49-
String parentRole,
50-
String childRole)
51-
throws InterruptedException, ExecutionException {
52-
OperationFuture<Void, UpdateDatabaseDdlMetadata> operation =
53-
adminClient.updateDatabaseDdl(
54-
instanceId,
55-
databaseId,
56-
ImmutableList.of(
57-
"CREATE ROLE " + parentRole,
58-
"GRANT SELECT ON TABLE Albums TO ROLE " + parentRole,
59-
"CREATE ROLE " + childRole,
60-
"GRANT ROLE " + parentRole + " TO ROLE " + childRole),
61-
null);
62-
63-
// Wait for the operation to finish.
64-
// This will throw an ExecutionException if the operation fails.
65-
operation.get();
66-
System.out.printf("Created roles %s and %s and granted privileges%n", parentRole, childRole);
67-
68-
// Delete role and membership.
69-
operation =
70-
adminClient.updateDatabaseDdl(
71-
instanceId,
72-
databaseId,
73-
ImmutableList.of(
74-
"REVOKE ROLE " + parentRole + " FROM ROLE " + childRole, "DROP ROLE " + childRole),
75-
null);
76-
// Wait for the operation to finish.
77-
// This will throw an ExecutionException if the operation fails.
78-
operation.get();
79-
System.out.printf("Revoked privileges and dropped role %s%n", childRole);
80-
}
8184
}
8285
// [END spanner_add_and_drop_database_role]

samples/snippets/src/main/java/com/example/spanner/EnableFineGrainedAccess.java

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -36,59 +36,66 @@ static void enableFineGrainedAccess() {
3636
String iamMember = "user:[email protected]";
3737
String role = "new-parent";
3838
String title = "my condition title";
39-
40-
try (Spanner spanner =
41-
SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) {
42-
DatabaseAdminClient adminClient = spanner.getDatabaseAdminClient();
43-
enableFineGrainedAccess(adminClient, instanceId, databaseId, iamMember, title, role);
44-
}
39+
enableFineGrainedAccess(projectId, instanceId, databaseId, iamMember, title, role);
4540
}
4641

4742
static void enableFineGrainedAccess(
48-
DatabaseAdminClient adminClient,
43+
String projectId,
4944
String instanceId,
5045
String databaseId,
5146
String iamMember,
5247
String title,
5348
String role) {
54-
Policy policy = adminClient.getDatabaseIAMPolicy(instanceId, databaseId, 3);
55-
int policyVersion = policy.getVersion();
56-
if (policy.getVersion() < 3) {
57-
policyVersion = 3;
58-
}
59-
List<String> members = new ArrayList<>();
60-
members.add(iamMember);
61-
List<Binding> bindings = new ArrayList<>(policy.getBindingsList());
49+
try (Spanner spanner =
50+
SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) {
51+
final DatabaseAdminClient adminClient = spanner.getDatabaseAdminClient();
52+
Policy policy = adminClient.getDatabaseIAMPolicy(instanceId, databaseId, 3);
53+
int policyVersion = policy.getVersion();
54+
/* getDatabaseIAMPolicy returns the IAM policy for the given database
55+
*
56+
* The policy in the response might use the policy version that you specified, or it might use
57+
* a lower policy version. For example, if you specify version 3, but the policy has no
58+
* conditional role bindings, the response uses version 1. Valid values are 0, 1, and 3.
59+
*
60+
*/
61+
if (policy.getVersion() < 3) {
62+
// conditional role bindings work with policy version 3
63+
policyVersion = 3;
64+
}
65+
List<String> members = new ArrayList<>();
66+
members.add(iamMember);
67+
List<Binding> bindings = new ArrayList<>(policy.getBindingsList());
6268

63-
bindings.add(
64-
Binding.newBuilder()
65-
.setRole("roles/spanner.fineGrainedAccessUser")
66-
.setMembers(members)
67-
.build());
69+
bindings.add(
70+
Binding.newBuilder()
71+
.setRole("roles/spanner.fineGrainedAccessUser")
72+
.setMembers(members)
73+
.build());
6874

69-
bindings.add(
70-
Binding.newBuilder()
71-
.setRole("roles/spanner.databaseRoleUser")
72-
.setCondition(
73-
Condition.newBuilder()
74-
.setDescription(title)
75-
.setExpression(
76-
String.format("resource.name.endsWith(\"/databaseRoles/%s\")", role))
77-
.setTitle(title)
78-
.build())
79-
.setMembers(members)
80-
.build());
75+
bindings.add(
76+
Binding.newBuilder()
77+
.setRole("roles/spanner.databaseRoleUser")
78+
.setCondition(
79+
Condition.newBuilder()
80+
.setDescription(title)
81+
.setExpression(
82+
String.format("resource.name.endsWith(\"/databaseRoles/%s\")", role))
83+
.setTitle(title)
84+
.build())
85+
.setMembers(members)
86+
.build());
8187

82-
Policy policyWithConditions =
83-
Policy.newBuilder()
84-
.setVersion(policyVersion)
85-
.setEtag(policy.getEtag())
86-
.setBindings(bindings)
87-
.build();
88-
Policy response =
89-
adminClient.setDatabaseIAMPolicy(instanceId, databaseId, policyWithConditions);
90-
System.out.printf(
91-
"Enabled fine-grained access in IAM with version %d%n", response.getVersion());
88+
Policy policyWithConditions =
89+
Policy.newBuilder()
90+
.setVersion(policyVersion)
91+
.setEtag(policy.getEtag())
92+
.setBindings(bindings)
93+
.build();
94+
Policy response =
95+
adminClient.setDatabaseIAMPolicy(instanceId, databaseId, policyWithConditions);
96+
System.out.printf(
97+
"Enabled fine-grained access in IAM with version %d%n", response.getVersion());
98+
}
9299
}
93100
}
94101
// [END spanner_enable_fine_grained_access]

samples/snippets/src/main/java/com/example/spanner/ListDatabaseRoles.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,27 @@ static void listDatabaseRoles() throws InterruptedException, ExecutionException
3131
String projectId = "my-project";
3232
String instanceId = "my-instance";
3333
String databaseId = "my-database";
34+
listDatabaseRoles(projectId, instanceId, databaseId);
35+
}
3436

37+
static void listDatabaseRoles(String projectId, String instanceId, String databaseId) {
3538
try (Spanner spanner =
3639
SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) {
37-
DatabaseAdminClient adminClient = spanner.getDatabaseAdminClient();
38-
listDatabaseRoles(adminClient, projectId, instanceId, databaseId);
39-
}
40-
}
41-
42-
static void listDatabaseRoles(
43-
DatabaseAdminClient adminClient, String projectId, String instanceId, String databaseId)
44-
throws InterruptedException, ExecutionException {
45-
String databasePath = DatabaseId.of(projectId, instanceId, databaseId).getName();
46-
System.out.println("List of Database roles");
47-
for (DatabaseRole role : adminClient.listDatabaseRoles(instanceId, databaseId).iterateAll()) {
48-
if (!role.getName().startsWith(databasePath + "/databaseRoles/")) {
49-
throw new RuntimeException(
50-
"Role +"
51-
+ role.getName()
52-
+ "does not have prefix ["
53-
+ databasePath
54-
+ "/databaseRoles/"
55-
+ "]");
40+
final DatabaseAdminClient adminClient = spanner.getDatabaseAdminClient();
41+
String databasePath = DatabaseId.of(projectId, instanceId, databaseId).getName();
42+
System.out.println("List of Database roles");
43+
for (DatabaseRole role : adminClient.listDatabaseRoles(instanceId, databaseId).iterateAll()) {
44+
if (!role.getName().startsWith(databasePath + "/databaseRoles/")) {
45+
throw new RuntimeException(
46+
"Role +"
47+
+ role.getName()
48+
+ "does not have prefix ["
49+
+ databasePath
50+
+ "/databaseRoles/"
51+
+ "]");
52+
}
53+
System.out.printf("%s%n", role.getName());
5654
}
57-
System.out.printf("%s%n", role.getName());
5855
}
5956
}
6057
}

samples/snippets/src/test/java/com/example/spanner/DatabaseRolesIT.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,7 @@ public void testAddAndDropDatabaseRole() throws Exception {
103103
SampleRunner.runSample(
104104
() ->
105105
AddAndDropDatabaseRole.addAndDropDatabaseRole(
106-
databaseAdminClient,
107-
instanceId,
108-
databaseId.getDatabase(),
109-
"new-parent",
110-
"new-child"));
106+
projectId, instanceId, databaseId.getDatabase(), "new-parent", "new-child"));
111107
assertTrue(out.contains("Created roles new_parent and new_child and granted privileges"));
112108
assertTrue(out.contains("Revoked privileges and dropped role new_child"));
113109
}
@@ -118,7 +114,7 @@ public void testListDatabaseRoles() throws Exception {
118114
SampleRunner.runSample(
119115
() ->
120116
ListDatabaseRoles.listDatabaseRoles(
121-
databaseAdminClient, projectId, instanceId, databaseId.getDatabase()));
117+
projectId, instanceId, databaseId.getDatabase()));
122118
assertTrue(out.contains("new_parent"));
123119
}
124120

0 commit comments

Comments
 (0)