Skip to content

Commit cc08f2f

Browse files
committed
Add MCP RBAC permission
1 parent e959ae7 commit cc08f2f

5 files changed

Lines changed: 75 additions & 2 deletions

File tree

src/it/java/io/weaviate/containers/Weaviate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public enum Version {
4545
V134(1, 34, 7),
4646
V135(1, 35, 2),
4747
V136(1, 36, 9),
48-
V137(1, 37, "0-rc.0");
48+
V137(1, 37, "0-rc.1");
4949

5050
public final SemanticVersion semver;
5151

src/it/java/io/weaviate/integration/RbacITest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.weaviate.client6.v1.api.rbac.AliasesPermission;
1515
import io.weaviate.client6.v1.api.rbac.BackupsPermission;
1616
import io.weaviate.client6.v1.api.rbac.ClusterPermission;
17+
import io.weaviate.client6.v1.api.rbac.McpPermission;
1718
import io.weaviate.client6.v1.api.rbac.CollectionsPermission;
1819
import io.weaviate.client6.v1.api.rbac.DataPermission;
1920
import io.weaviate.client6.v1.api.rbac.GroupsPermission;
@@ -83,6 +84,9 @@ public void test_roles_Lifecycle() throws IOException {
8384
permissions.add(
8485
Permission.groups("my-group", GroupType.OIDC, GroupsPermission.Action.READ));
8586
});
87+
requireAtLeast(Weaviate.Version.V137, () -> {
88+
permissions.add(Permission.mcp(McpPermission.Action.MANAGE));
89+
});
8690

8791
// Act: create role
8892
client.roles.create(nsRole, permissions);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.weaviate.client6.v1.api.rbac;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
6+
import com.google.gson.annotations.SerializedName;
7+
8+
public record McpPermission(
9+
@SerializedName("actions") List<Action> actions) implements Permission {
10+
11+
public McpPermission(Action... actions) {
12+
this(Arrays.asList(actions));
13+
}
14+
15+
@Override
16+
public Permission.Kind _kind() {
17+
return Permission.Kind.MCP;
18+
}
19+
20+
@Override
21+
public Object self() {
22+
return this;
23+
}
24+
25+
public enum Action implements RbacAction<Action> {
26+
@SerializedName("manage_mcp")
27+
MANAGE("manage_mcp");
28+
29+
private final String jsonValue;
30+
31+
private Action(String jsonValue) {
32+
this.jsonValue = jsonValue;
33+
}
34+
35+
@Override
36+
public String jsonValue() {
37+
return jsonValue;
38+
}
39+
}
40+
}

src/main/java/io/weaviate/client6/v1/api/rbac/Permission.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ enum Kind implements JsonEnum<Kind> {
4141
USERS("users"),
4242

4343
// Fake permission kinds: Weaviate does not use those.
44-
CLUSTER("cluster");
44+
CLUSTER("cluster"),
45+
MCP("mcp");
4546

4647
private static final Map<String, Kind> jsonValueMap = JsonEnum.collectNames(Kind.values());
4748
private final String jsonValue;
@@ -153,6 +154,14 @@ public static UsersPermission users(String userId, UsersPermission.Action... act
153154
return new UsersPermission(userId, actions);
154155
}
155156

157+
/**
158+
* Create {@link McpPermission}.
159+
*/
160+
public static McpPermission mcp(McpPermission.Action... actions) {
161+
checkDeprecation(actions);
162+
return new McpPermission(actions);
163+
}
164+
156165
/**
157166
* Create {@link ReplicatePermission}.
158167
*
@@ -222,6 +231,7 @@ private final void init(Gson gson) {
222231
addAdapter(gson, Permission.Kind.ROLES, RolesPermission.class);
223232
addAdapter(gson, Permission.Kind.NODES, NodesPermission.class);
224233
addAdapter(gson, Permission.Kind.TENANTS, TenantsPermission.class);
234+
addAdapter(gson, Permission.Kind.MCP, McpPermission.class);
225235
addAdapter(gson, Permission.Kind.REPLICATE, ReplicatePermission.class);
226236
addAdapter(gson, Permission.Kind.USERS, UsersPermission.class);
227237
addAdapter(gson, Permission.Kind.CLUSTER, ClusterPermission.class);
@@ -283,6 +293,8 @@ public Permission read(JsonReader in) throws IOException {
283293
var actionString = action.getAsString();
284294
if (actionString.endsWith("_cluster")) {
285295
kind = Permission.Kind.CLUSTER;
296+
} else if (actionString.endsWith("_mcp")) {
297+
kind = Permission.Kind.MCP;
286298
} else {
287299
throw new IllegalArgumentException("unknown RBAC action " + actionString);
288300
}

src/test/java/io/weaviate/client6/v1/internal/json/JSONTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import io.weaviate.client6.v1.api.rbac.AliasesPermission;
6767
import io.weaviate.client6.v1.api.rbac.BackupsPermission;
6868
import io.weaviate.client6.v1.api.rbac.ClusterPermission;
69+
import io.weaviate.client6.v1.api.rbac.McpPermission;
6970
import io.weaviate.client6.v1.api.rbac.CollectionsPermission;
7071
import io.weaviate.client6.v1.api.rbac.DataPermission;
7172
import io.weaviate.client6.v1.api.rbac.GroupsPermission;
@@ -1473,6 +1474,22 @@ public static Object[][] testCases() {
14731474
}
14741475
"""
14751476
},
1477+
{
1478+
Role.class,
1479+
new Role(
1480+
"rock-n-role",
1481+
List.of(
1482+
new McpPermission(
1483+
List.of(McpPermission.Action.MANAGE)))),
1484+
"""
1485+
{
1486+
"name": "rock-n-role",
1487+
"permissions": [
1488+
{ "action": "manage_mcp" }
1489+
]
1490+
}
1491+
"""
1492+
},
14761493
{
14771494
Role.class,
14781495
new Role(

0 commit comments

Comments
 (0)