Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/it/java/io/weaviate/containers/Weaviate.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public enum Version {
V134(1, 34, 7),
V135(1, 35, 2),
V136(1, 36, 9),
V137(1, 37, "0-rc.0");
V137(1, 37, "0-rc.1");
Comment thread
bevzzz marked this conversation as resolved.
Outdated

public final SemanticVersion semver;

Expand Down
4 changes: 4 additions & 0 deletions src/it/java/io/weaviate/integration/RbacITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io.weaviate.client6.v1.api.rbac.AliasesPermission;
import io.weaviate.client6.v1.api.rbac.BackupsPermission;
import io.weaviate.client6.v1.api.rbac.ClusterPermission;
import io.weaviate.client6.v1.api.rbac.McpPermission;
import io.weaviate.client6.v1.api.rbac.CollectionsPermission;
import io.weaviate.client6.v1.api.rbac.DataPermission;
import io.weaviate.client6.v1.api.rbac.GroupsPermission;
Expand Down Expand Up @@ -83,6 +84,9 @@ public void test_roles_Lifecycle() throws IOException {
permissions.add(
Permission.groups("my-group", GroupType.OIDC, GroupsPermission.Action.READ));
});
requireAtLeast(Weaviate.Version.V137, () -> {
permissions.add(Permission.mcp(McpPermission.Action.MANAGE));
});

// Act: create role
client.roles.create(nsRole, permissions);
Expand Down
40 changes: 40 additions & 0 deletions src/main/java/io/weaviate/client6/v1/api/rbac/McpPermission.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.weaviate.client6.v1.api.rbac;

import java.util.Arrays;
import java.util.List;

import com.google.gson.annotations.SerializedName;

public record McpPermission(
@SerializedName("actions") List<Action> actions) implements Permission {

public McpPermission(Action... actions) {
this(Arrays.asList(actions));
}

@Override
public Permission.Kind _kind() {
return Permission.Kind.MCP;
}

@Override
public Object self() {
return this;
}

public enum Action implements RbacAction<Action> {
@SerializedName("manage_mcp")
MANAGE("manage_mcp");

private final String jsonValue;

private Action(String jsonValue) {
this.jsonValue = jsonValue;
}

@Override
public String jsonValue() {
return jsonValue;
}
}
}
14 changes: 13 additions & 1 deletion src/main/java/io/weaviate/client6/v1/api/rbac/Permission.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ enum Kind implements JsonEnum<Kind> {
USERS("users"),

// Fake permission kinds: Weaviate does not use those.
CLUSTER("cluster");
CLUSTER("cluster"),
MCP("mcp");

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

/**
* Create {@link McpPermission}.
*/
public static McpPermission mcp(McpPermission.Action... actions) {
checkDeprecation(actions);
return new McpPermission(actions);
}

/**
* Create {@link ReplicatePermission}.
*
Expand Down Expand Up @@ -222,6 +231,7 @@ private final void init(Gson gson) {
addAdapter(gson, Permission.Kind.ROLES, RolesPermission.class);
addAdapter(gson, Permission.Kind.NODES, NodesPermission.class);
addAdapter(gson, Permission.Kind.TENANTS, TenantsPermission.class);
addAdapter(gson, Permission.Kind.MCP, McpPermission.class);
addAdapter(gson, Permission.Kind.REPLICATE, ReplicatePermission.class);
addAdapter(gson, Permission.Kind.USERS, UsersPermission.class);
addAdapter(gson, Permission.Kind.CLUSTER, ClusterPermission.class);
Expand Down Expand Up @@ -283,6 +293,8 @@ public Permission read(JsonReader in) throws IOException {
var actionString = action.getAsString();
if (actionString.endsWith("_cluster")) {
kind = Permission.Kind.CLUSTER;
} else if (actionString.endsWith("_mcp")) {
kind = Permission.Kind.MCP;
} else {
throw new IllegalArgumentException("unknown RBAC action " + actionString);
}
Expand Down
17 changes: 17 additions & 0 deletions src/test/java/io/weaviate/client6/v1/internal/json/JSONTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
import io.weaviate.client6.v1.api.rbac.AliasesPermission;
import io.weaviate.client6.v1.api.rbac.BackupsPermission;
import io.weaviate.client6.v1.api.rbac.ClusterPermission;
import io.weaviate.client6.v1.api.rbac.McpPermission;
import io.weaviate.client6.v1.api.rbac.CollectionsPermission;
import io.weaviate.client6.v1.api.rbac.DataPermission;
import io.weaviate.client6.v1.api.rbac.GroupsPermission;
Expand Down Expand Up @@ -1473,6 +1474,22 @@ public static Object[][] testCases() {
}
"""
},
{
Role.class,
new Role(
"rock-n-role",
List.of(
new McpPermission(
List.of(McpPermission.Action.MANAGE)))),
"""
{
"name": "rock-n-role",
"permissions": [
{ "action": "manage_mcp" }
]
}
"""
},
{
Role.class,
new Role(
Expand Down
Loading