Skip to content

Commit 2d0bd3f

Browse files
committed
clean up entities created by tests
1 parent 0d61180 commit 2d0bd3f

File tree

8 files changed

+325
-213
lines changed

8 files changed

+325
-213
lines changed

integration-tests/src/main/java/org/apache/polaris/service/it/env/CatalogApi.java

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,16 @@
2727
import jakarta.ws.rs.core.MultivaluedHashMap;
2828
import jakarta.ws.rs.core.Response;
2929
import java.net.URI;
30+
import java.util.ArrayList;
31+
import java.util.HashMap;
3032
import java.util.List;
3133
import java.util.Map;
3234
import org.apache.iceberg.catalog.Namespace;
35+
import org.apache.iceberg.catalog.TableIdentifier;
3336
import org.apache.iceberg.rest.RESTUtil;
3437
import org.apache.iceberg.rest.requests.CreateNamespaceRequest;
3538
import org.apache.iceberg.rest.responses.ListNamespacesResponse;
39+
import org.apache.iceberg.rest.responses.ListTablesResponse;
3640
import org.apache.iceberg.rest.responses.OAuthTokenResponse;
3741

3842
public class CatalogApi extends RestApi {
@@ -72,21 +76,88 @@ public void createNamespace(String catalogName, String namespaceName) {
7276
}
7377
}
7478

75-
public List<Namespace> listNamespaces(String catalog) {
76-
try (Response response = request("v1/{cat}/namespaces", Map.of("cat", catalog)).get()) {
79+
public List<Namespace> listNamespaces(String catalog, Namespace parent) {
80+
Map<String, String> queryParams = new HashMap<>();
81+
if (!parent.isEmpty()) {
82+
queryParams.put("parent", RESTUtil.encodeNamespace(parent));
83+
}
84+
try (Response response =
85+
request("v1/{cat}/namespaces", Map.of("cat", catalog), queryParams).get()) {
7786
assertThat(response.getStatus()).isEqualTo(OK.getStatusCode());
7887
ListNamespacesResponse res = response.readEntity(ListNamespacesResponse.class);
7988
return res.namespaces();
8089
}
8190
}
8291

83-
public void deleteNamespaces(String catalog, Namespace namespace) {
92+
public List<Namespace> listAllNamespacesChildFirst(String catalog) {
93+
List<Namespace> result = new ArrayList<>();
94+
for (int idx = -1; idx < result.size(); idx++) {
95+
Namespace parent = Namespace.empty();
96+
if (idx >= 0) {
97+
parent = result.get(idx);
98+
}
99+
100+
result.addAll(listNamespaces(catalog, parent));
101+
}
102+
103+
return result.reversed();
104+
}
105+
106+
public void deleteNamespace(String catalog, Namespace namespace) {
107+
String ns = RESTUtil.encodeNamespace(namespace);
84108
try (Response response =
109+
request("v1/{cat}/namespaces/" + ns, Map.of("cat", catalog)).delete()) {
110+
assertThat(response.getStatus()).isEqualTo(NO_CONTENT.getStatusCode());
111+
}
112+
}
113+
114+
public void purge(String catalog) {
115+
listAllNamespacesChildFirst(catalog).forEach(ns -> purge(catalog, ns));
116+
}
117+
118+
public void purge(String catalog, Namespace ns) {
119+
listTables(catalog, ns).forEach(t -> dropTable(catalog, t));
120+
listViews(catalog, ns).forEach(t -> dropView(catalog, t));
121+
deleteNamespace(catalog, ns);
122+
}
123+
124+
public List<TableIdentifier> listTables(String catalog, Namespace namespace) {
125+
String ns = RESTUtil.encodeNamespace(namespace);
126+
try (Response res =
127+
request("v1/{cat}/namespaces/" + ns + "/tables", Map.of("cat", catalog)).get()) {
128+
assertThat(res.getStatus()).isEqualTo(Response.Status.OK.getStatusCode());
129+
return res.readEntity(ListTablesResponse.class).identifiers();
130+
}
131+
}
132+
133+
public void dropTable(String catalog, TableIdentifier id) {
134+
String ns = RESTUtil.encodeNamespace(id.namespace());
135+
try (Response res =
85136
request(
86-
"v1/{cat}/namespaces/{ns}",
87-
Map.of("cat", catalog, "ns", RESTUtil.encodeNamespace(namespace)))
137+
"v1/{cat}/namespaces/" + ns + "/tables/{table}",
138+
Map.of("cat", catalog, "table", id.name()))
88139
.delete()) {
89-
assertThat(response.getStatus()).isEqualTo(NO_CONTENT.getStatusCode());
140+
assertThat(res.getStatus()).isEqualTo(NO_CONTENT.getStatusCode());
141+
}
142+
}
143+
144+
public List<TableIdentifier> listViews(String catalog, Namespace namespace) {
145+
String ns = RESTUtil.encodeNamespace(namespace);
146+
try (Response res =
147+
request("v1/{cat}/namespaces/" + ns + "/views", Map.of("cat", catalog)).get()) {
148+
assertThat(res.getStatus()).isEqualTo(Response.Status.OK.getStatusCode());
149+
return res.readEntity(ListTablesResponse.class).identifiers();
150+
}
151+
}
152+
153+
public void dropView(String catalog, TableIdentifier id) {
154+
String ns = RESTUtil.encodeNamespace(id.namespace());
155+
try (Response res =
156+
request(
157+
"v1/{cat}/namespaces/" + ns + "/views/{view}",
158+
Map.of("cat", catalog, "view", id.name()))
159+
.delete()) {
160+
assertThat(res.getStatus()).isEqualTo(NO_CONTENT.getStatusCode());
90161
}
91162
}
92163
}

integration-tests/src/main/java/org/apache/polaris/service/it/env/ManagementApi.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.polaris.core.admin.model.CatalogRole;
3636
import org.apache.polaris.core.admin.model.CatalogRoles;
3737
import org.apache.polaris.core.admin.model.Catalogs;
38+
import org.apache.polaris.core.admin.model.CreatePrincipalRequest;
3839
import org.apache.polaris.core.admin.model.GrantCatalogRoleRequest;
3940
import org.apache.polaris.core.admin.model.GrantPrincipalRoleRequest;
4041
import org.apache.polaris.core.admin.model.GrantResource;
@@ -66,6 +67,13 @@ public PrincipalWithCredentials createPrincipal(String name) {
6667
}
6768
}
6869

70+
public PrincipalWithCredentials createPrincipal(CreatePrincipalRequest request) {
71+
try (Response createPResponse = request("v1/principals").post(Entity.json(request))) {
72+
assertThat(createPResponse).returns(CREATED.getStatusCode(), Response::getStatus);
73+
return createPResponse.readEntity(PrincipalWithCredentials.class);
74+
}
75+
}
76+
6977
public void createPrincipalRole(String name) {
7078
createPrincipalRole(new PrincipalRole(name));
7179
}
@@ -231,18 +239,26 @@ public List<Catalog> listCatalogs() {
231239
}
232240

233241
public void deleteCatalogRole(String catalogName, CatalogRole role) {
242+
deleteCatalogRole(catalogName, role.getName());
243+
}
244+
245+
public void deleteCatalogRole(String catalogName, String roleName) {
234246
try (Response response =
235247
request(
236248
"v1/catalogs/{cat}/catalog-roles/{role}",
237-
Map.of("cat", catalogName, "role", role.getName()))
249+
Map.of("cat", catalogName, "role", roleName))
238250
.delete()) {
239251
assertThat(response.getStatus()).isEqualTo(NO_CONTENT.getStatusCode());
240252
}
241253
}
242254

243255
public void deletePrincipal(Principal principal) {
256+
deletePrincipal(principal.getName());
257+
}
258+
259+
public void deletePrincipal(String principalName) {
244260
try (Response response =
245-
request("v1/principals/{name}", Map.of("name", principal.getName())).delete()) {
261+
request("v1/principals/{name}", Map.of("name", principalName)).delete()) {
246262
assertThat(response.getStatus()).isEqualTo(NO_CONTENT.getStatusCode());
247263
}
248264
}
@@ -253,4 +269,12 @@ public void deletePrincipalRole(PrincipalRole role) {
253269
assertThat(response.getStatus()).isEqualTo(NO_CONTENT.getStatusCode());
254270
}
255271
}
272+
273+
public void dropCatalog(String catalogName) {
274+
listCatalogRoles(catalogName).stream()
275+
.filter(cr -> !cr.getName().equals("catalog_admin"))
276+
.forEach(role -> deleteCatalogRole(catalogName, role));
277+
278+
deleteCatalog(catalogName);
279+
}
256280
}

integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,30 @@ public String obtainToken(ClientCredentials credentials) {
9696
return anon.obtainToken(credentials);
9797
}
9898

99+
private boolean ownedName(String name) {
100+
return name != null && name.contains(clientId);
101+
}
102+
103+
public void cleanUp(ClientCredentials credentials) {
104+
ManagementApi managementApi = managementApi(credentials);
105+
CatalogApi catalogApi = catalogApi(credentials);
106+
107+
managementApi.listCatalogs().stream()
108+
.filter(c -> ownedName(c.getName()))
109+
.forEach(
110+
c -> {
111+
catalogApi.purge(c.getName());
112+
managementApi.dropCatalog(c.getName());
113+
});
114+
115+
managementApi.listPrincipalRoles().stream()
116+
.filter(r -> ownedName(r.getName()))
117+
.forEach(managementApi::deletePrincipalRole);
118+
managementApi.listPrincipals().stream()
119+
.filter(p -> ownedName(p.getName()))
120+
.forEach(p -> managementApi.deletePrincipal(p.getName()));
121+
}
122+
99123
@Override
100124
public void close() throws Exception {
101125
client.close();

integration-tests/src/main/java/org/apache/polaris/service/it/env/RestApi.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,18 @@ public Invocation.Builder request(String path) {
4242
}
4343

4444
public Invocation.Builder request(String path, Map<String, String> templateValues) {
45+
return request(path, templateValues, Map.of());
46+
}
47+
48+
public Invocation.Builder request(
49+
String path, Map<String, String> templateValues, Map<String, String> queryParams) {
4550
WebTarget target = client.target(uri).path(path);
4651
for (Map.Entry<String, String> entry : templateValues.entrySet()) {
4752
target = target.resolveTemplate(entry.getKey(), entry.getValue());
4853
}
54+
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
55+
target = target.queryParam(entry.getKey(), entry.getValue());
56+
}
4957
Invocation.Builder request = target.request("application/json");
5058
request = request.header(PolarisApiEndpoints.REALM_HEADER, endpoints.realm());
5159
if (authToken != null) {

0 commit comments

Comments
 (0)