Skip to content

Commit 506dedf

Browse files
authored
Merge pull request #560 from weaviate/mcp-rbac
Add MCP RBAC permission
2 parents e959ae7 + 7c1cee9 commit 506dedf

6 files changed

Lines changed: 88 additions & 3 deletions

File tree

.github/workflows/test.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ jobs:
9292
fail-fast: false
9393
matrix:
9494
WEAVIATE_VERSION:
95-
["1.32.24", "1.33.11", "1.34.7", "1.35.2", "1.36.9", "1.37.0-rc.0"]
95+
["1.32.24", "1.33.11", "1.34.7", "1.35.2", "1.36.9", "1.37.1"]
9696
steps:
9797
- uses: actions/checkout@v4
9898

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

Lines changed: 2 additions & 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, 1);
4949

5050
public final SemanticVersion semver;
5151

@@ -308,6 +308,7 @@ public Weaviate build() {
308308

309309
// Required in v1.36.1, but we'll just set it by default.
310310
c.withEnv("OBJECTS_TTL_DELETE_SCHEDULE", "@hourly");
311+
c.withEnv("ENABLE_EXPERIMENTAL_ALTER_SCHEMA_DROP_VECTOR_INDEX_ENDPOINT", "true");
311312

312313
var apiKeyUsers = new HashSet<String>();
313314
apiKeyUsers.addAll(adminUsers);

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

Lines changed: 7 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,12 @@ 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(
89+
McpPermission.Action.CREATE,
90+
McpPermission.Action.READ,
91+
McpPermission.Action.UPDATE));
92+
});
8693

8794
// Act: create role
8895
client.roles.create(nsRole, permissions);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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("create_mcp")
27+
CREATE("create_mcp"),
28+
29+
@SerializedName("read_mcp")
30+
READ("read_mcp"),
31+
32+
@SerializedName("update_mcp")
33+
UPDATE("update_mcp");
34+
35+
private final String jsonValue;
36+
37+
private Action(String jsonValue) {
38+
this.jsonValue = jsonValue;
39+
}
40+
41+
@Override
42+
public String jsonValue() {
43+
return jsonValue;
44+
}
45+
}
46+
}

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: 19 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,24 @@ 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.CREATE, McpPermission.Action.READ, McpPermission.Action.UPDATE)))),
1484+
"""
1485+
{
1486+
"name": "rock-n-role",
1487+
"permissions": [
1488+
{ "action": "create_mcp" },
1489+
{ "action": "read_mcp" },
1490+
{ "action": "update_mcp" }
1491+
]
1492+
}
1493+
"""
1494+
},
14761495
{
14771496
Role.class,
14781497
new Role(

0 commit comments

Comments
 (0)