Add missing data to Dapr Metadata and its components (#1059)

* Add missing data to Dapr Metadata and its components

Signed-off-by: Artur Ciocanu <ciocanu@adobe.com>

* Add metadata field to subscription

Signed-off-by: Artur Ciocanu <ciocanu@adobe.com>

---------

Signed-off-by: Artur Ciocanu <ciocanu@adobe.com>
Co-authored-by: Artur Ciocanu <ciocanu@adobe.com>
This commit is contained in:
artur-ciocanu 2024-06-26 11:12:42 -07:00 committed by GitHub
parent 363b6f9af8
commit 64f291f3bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 189 additions and 42 deletions

View File

@ -16,6 +16,7 @@ package io.dapr.client;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import com.google.protobuf.Empty; import com.google.protobuf.Empty;
import io.dapr.client.domain.ActorMetadata;
import io.dapr.client.domain.AppConnectionPropertiesHealthMetadata; import io.dapr.client.domain.AppConnectionPropertiesHealthMetadata;
import io.dapr.client.domain.AppConnectionPropertiesMetadata; import io.dapr.client.domain.AppConnectionPropertiesMetadata;
import io.dapr.client.domain.BulkPublishEntry; import io.dapr.client.domain.BulkPublishEntry;
@ -65,6 +66,8 @@ import io.dapr.utils.TypeRef;
import io.dapr.v1.CommonProtos; import io.dapr.v1.CommonProtos;
import io.dapr.v1.DaprGrpc; import io.dapr.v1.DaprGrpc;
import io.dapr.v1.DaprProtos; import io.dapr.v1.DaprProtos;
import io.dapr.v1.DaprProtos.ActiveActorsCount;
import io.dapr.v1.DaprProtos.ActorRuntime;
import io.dapr.v1.DaprProtos.AppConnectionHealthProperties; import io.dapr.v1.DaprProtos.AppConnectionHealthProperties;
import io.dapr.v1.DaprProtos.AppConnectionProperties; import io.dapr.v1.DaprProtos.AppConnectionProperties;
import io.dapr.v1.DaprProtos.MetadataHTTPEndpoint; import io.dapr.v1.DaprProtos.MetadataHTTPEndpoint;
@ -1266,14 +1269,27 @@ public class DaprClientImpl extends AbstractDaprClient {
String id = response.getId(); String id = response.getId();
String runtimeVersion = response.getRuntimeVersion(); String runtimeVersion = response.getRuntimeVersion();
List<String> enabledFeatures = response.getEnabledFeaturesList(); List<String> enabledFeatures = response.getEnabledFeaturesList();
List<ActorMetadata> actors = getActors(response);
Map<String, String> attributes = response.getExtendedMetadataMap(); Map<String, String> attributes = response.getExtendedMetadataMap();
List<ComponentMetadata> components = getComponents(response); List<ComponentMetadata> components = getComponents(response);
List<HttpEndpointMetadata> httpEndpoints = getHttpEndpoints(response); List<HttpEndpointMetadata> httpEndpoints = getHttpEndpoints(response);
List<SubscriptionMetadata> subscriptions = getSubscriptions(response); List<SubscriptionMetadata> subscriptions = getSubscriptions(response);
AppConnectionPropertiesMetadata appConnectionProperties = getAppConnectionProperties(response); AppConnectionPropertiesMetadata appConnectionProperties = getAppConnectionProperties(response);
return new DaprMetadata(id, runtimeVersion, enabledFeatures, attributes, components, httpEndpoints, subscriptions, return new DaprMetadata(id, runtimeVersion, enabledFeatures, actors, attributes, components, httpEndpoints,
appConnectionProperties); subscriptions, appConnectionProperties);
}
private List<ActorMetadata> getActors(DaprProtos.GetMetadataResponse response) {
ActorRuntime actorRuntime = response.getActorRuntime();
List<ActiveActorsCount> activeActorsList = actorRuntime.getActiveActorsList();
List<ActorMetadata> actors = new ArrayList<>();
for (ActiveActorsCount aac : activeActorsList) {
actors.add(new ActorMetadata(aac.getType(), aac.getCount()));
}
return actors;
} }
private List<ComponentMetadata> getComponents(DaprProtos.GetMetadataResponse response) { private List<ComponentMetadata> getComponents(DaprProtos.GetMetadataResponse response) {
@ -1281,7 +1297,7 @@ public class DaprClientImpl extends AbstractDaprClient {
List<ComponentMetadata> components = new ArrayList<>(); List<ComponentMetadata> components = new ArrayList<>();
for (RegisteredComponents rc : registeredComponentsList) { for (RegisteredComponents rc : registeredComponentsList) {
components.add(new ComponentMetadata(rc.getName(), rc.getType(), rc.getVersion())); components.add(new ComponentMetadata(rc.getName(), rc.getType(), rc.getVersion(), rc.getCapabilitiesList()));
} }
return components; return components;
@ -1295,9 +1311,10 @@ public class DaprClientImpl extends AbstractDaprClient {
List<PubsubSubscriptionRule> rulesList = s.getRules().getRulesList(); List<PubsubSubscriptionRule> rulesList = s.getRules().getRulesList();
List<RuleMetadata> rules = new ArrayList<>(); List<RuleMetadata> rules = new ArrayList<>();
for (PubsubSubscriptionRule r : rulesList) { for (PubsubSubscriptionRule r : rulesList) {
rules.add(new RuleMetadata(r.getPath())); rules.add(new RuleMetadata(r.getMatch(), r.getPath()));
} }
subscriptions.add(new SubscriptionMetadata(s.getTopic(), s.getPubsubName(), s.getDeadLetterTopic(), rules)); subscriptions.add(new SubscriptionMetadata(s.getPubsubName(), s.getTopic(), s.getMetadataMap(), rules,
s.getDeadLetterTopic()));
} }
return subscriptions; return subscriptions;

View File

@ -0,0 +1,41 @@
/*
* Copyright 2024 The Dapr Authors
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
limitations under the License.
*/
package io.dapr.client.domain;
/**
* ActorMetadata describes a registered Dapr Actor.
*/
public final class ActorMetadata {
private final String type;
private final int count;
/**
* Constructor for a ActorMetadata.
*
* @param type of the actor
* @param count number of actors of a particular type
*/
public ActorMetadata(String type, int count) {
this.type = type;
this.count = count;
}
public String getType() {
return type;
}
public int getCount() {
return count;
}
}

View File

@ -13,6 +13,9 @@ limitations under the License.
package io.dapr.client.domain; package io.dapr.client.domain;
/**
* AppConnectionPropertiesHealthMetadata describes the application health properties.
*/
public final class AppConnectionPropertiesHealthMetadata { public final class AppConnectionPropertiesHealthMetadata {
private final String healthCheckPath; private final String healthCheckPath;

View File

@ -13,6 +13,9 @@ limitations under the License.
package io.dapr.client.domain; package io.dapr.client.domain;
/**
* AppConnectionPropertiesMetadata describes the application connection properties.
*/
public final class AppConnectionPropertiesMetadata { public final class AppConnectionPropertiesMetadata {
private final int port; private final int port;

View File

@ -13,16 +13,18 @@ limitations under the License.
package io.dapr.client.domain; package io.dapr.client.domain;
import java.util.Objects; import java.util.Collections;
import java.util.List;
/** /**
* ComponentMetadata describes a Dapr Component. * ComponentMetadata describes a Dapr Component.
*/ */
public final class ComponentMetadata { public final class ComponentMetadata {
private String name; private final String name;
private String type; private final String type;
private String version; private final String version;
private final List<String> capabilities;
/** /**
* Constructor for a ComponentMetadata. * Constructor for a ComponentMetadata.
@ -30,11 +32,13 @@ public final class ComponentMetadata {
* @param name of the component * @param name of the component
* @param type component type * @param type component type
* @param version version of the component * @param version version of the component
* @param capabilities capabilities of the component
*/ */
public ComponentMetadata(String name, String type, String version) { public ComponentMetadata(String name, String type, String version, List<String> capabilities) {
this.name = name; this.name = name;
this.type = type; this.type = type;
this.version = version; this.version = version;
this.capabilities = capabilities == null ? Collections.emptyList() : Collections.unmodifiableList(capabilities);
} }
public String getName() { public String getName() {
@ -49,4 +53,8 @@ public final class ComponentMetadata {
return version; return version;
} }
public List<String> getCapabilities() {
return capabilities;
}
} }

View File

@ -25,6 +25,7 @@ public final class DaprMetadata {
private final String id; private final String id;
private final String runtimeVersion; private final String runtimeVersion;
private final List<String> enabledFeatures; private final List<String> enabledFeatures;
private final List<ActorMetadata> actors;
private final Map<String, String> attributes; private final Map<String, String> attributes;
private final List<ComponentMetadata> components; private final List<ComponentMetadata> components;
private final List<HttpEndpointMetadata> httpEndpoints; private final List<HttpEndpointMetadata> httpEndpoints;
@ -37,19 +38,21 @@ public final class DaprMetadata {
* @param id of the application * @param id of the application
* @param runtimeVersion Dapr version * @param runtimeVersion Dapr version
* @param enabledFeatures list of enabled features * @param enabledFeatures list of enabled features
* @param actors list of registered features
* @param attributes map of extended attributes * @param attributes map of extended attributes
* @param components list of registered components * @param components list of registered components
* @param httpEndpoints list of registered http endpoints * @param httpEndpoints list of registered http endpoints
* @param subscriptions list of registered subscription * @param subscriptions list of registered subscription
* @param appConnectionProperties connection properties of the application * @param appConnectionProperties connection properties of the application
*/ */
public DaprMetadata(String id, String runtimeVersion, List<String> enabledFeatures, Map<String, String> attributes, public DaprMetadata(String id, String runtimeVersion, List<String> enabledFeatures, List<ActorMetadata> actors,
List<ComponentMetadata> components, List<HttpEndpointMetadata> httpEndpoints, Map<String, String> attributes, List<ComponentMetadata> components, List<HttpEndpointMetadata> httpEndpoints,
List<SubscriptionMetadata> subscriptions, AppConnectionPropertiesMetadata appConnectionProperties) { List<SubscriptionMetadata> subscriptions, AppConnectionPropertiesMetadata appConnectionProperties) {
this.id = id; this.id = id;
this.runtimeVersion = runtimeVersion; this.runtimeVersion = runtimeVersion;
this.enabledFeatures = enabledFeatures == null ? Collections.emptyList() : this.enabledFeatures = enabledFeatures == null ? Collections.emptyList() :
Collections.unmodifiableList(enabledFeatures); Collections.unmodifiableList(enabledFeatures);
this.actors = actors == null ? Collections.emptyList() : Collections.unmodifiableList(actors);
this.attributes = attributes == null ? Collections.emptyMap() : Collections.unmodifiableMap(attributes); this.attributes = attributes == null ? Collections.emptyMap() : Collections.unmodifiableMap(attributes);
this.components = components == null ? Collections.emptyList() : Collections.unmodifiableList(components); this.components = components == null ? Collections.emptyList() : Collections.unmodifiableList(components);
this.httpEndpoints = httpEndpoints == null ? Collections.emptyList() : Collections.unmodifiableList(httpEndpoints); this.httpEndpoints = httpEndpoints == null ? Collections.emptyList() : Collections.unmodifiableList(httpEndpoints);
@ -69,6 +72,10 @@ public final class DaprMetadata {
return enabledFeatures; return enabledFeatures;
} }
public List<ActorMetadata> getActors() {
return actors;
}
public Map<String, String> getAttributes() { public Map<String, String> getAttributes() {
return attributes; return attributes;
} }

View File

@ -13,6 +13,9 @@ limitations under the License.
package io.dapr.client.domain; package io.dapr.client.domain;
/**
* HttpEndpointMetadata describes a registered Dapr HTTP endpoint.
*/
public final class HttpEndpointMetadata { public final class HttpEndpointMetadata {
private final String name; private final String name;

View File

@ -17,12 +17,25 @@ package io.dapr.client.domain;
* RuleMetadata describes the Subscription Rule's Metadata. * RuleMetadata describes the Subscription Rule's Metadata.
*/ */
public final class RuleMetadata { public final class RuleMetadata {
private String path;
public RuleMetadata(String path) { private final String match;
private final String path;
/**
* Constructor for a RuleMetadata.
*
* @param match CEL expression to match the message
* @param path path to route the message
*/
public RuleMetadata(String match, String path) {
this.match = match;
this.path = path; this.path = path;
} }
public String getMatch() {
return match;
}
public String getPath() { public String getPath() {
return path; return path;
} }

View File

@ -15,48 +15,55 @@ package io.dapr.client.domain;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Map;
/** /**
* SubscriptionMetadata describes the Subscription Metadata. * SubscriptionMetadata describes the Subscription Metadata.
*/ */
public final class SubscriptionMetadata { public final class SubscriptionMetadata {
private String topic;
private String pubsubname; private final String pubsubname;
private String deadLetterTopic; private final String topic;
private List<RuleMetadata> rules; private final Map<String, String> metadata;
private final List<RuleMetadata> rules;
private final String deadLetterTopic;
/** /**
* Constructor for a SubscriptionMetadata. * Constructor for a SubscriptionMetadata.
* *
* @param topic of the pubsub component
* @param pubsubname component name * @param pubsubname component name
* @param deadLetterTopic dead letter topic * @param topic of the pubsub component
* @param metadata of the pubsub component
* @param rules subscription path rules * @param rules subscription path rules
* @param deadLetterTopic dead letter topic
*/ */
public SubscriptionMetadata(String topic, String pubsubname, String deadLetterTopic, List<RuleMetadata> rules) { public SubscriptionMetadata(String pubsubname, String topic, Map<String, String> metadata, List<RuleMetadata> rules,
this.topic = topic; String deadLetterTopic) {
this.pubsubname = pubsubname; this.pubsubname = pubsubname;
this.deadLetterTopic = deadLetterTopic; this.topic = topic;
this.metadata = metadata == null ? Collections.emptyMap() : Collections.unmodifiableMap(metadata);
this.rules = rules == null ? Collections.emptyList() : Collections.unmodifiableList(rules); this.rules = rules == null ? Collections.emptyList() : Collections.unmodifiableList(rules);
} this.deadLetterTopic = deadLetterTopic;
public String getTopic() {
return topic;
} }
public String getPubsubname() { public String getPubsubname() {
return pubsubname; return pubsubname;
} }
public String getTopic() {
public String getDeadLetterTopic() { return topic;
return deadLetterTopic;
} }
public Map<String, String> getMetadata() {
return metadata;
}
public List<RuleMetadata> getRules() { public List<RuleMetadata> getRules() {
return rules; return rules;
} }
public String getDeadLetterTopic() {
return deadLetterTopic;
}
} }

View File

@ -16,13 +16,32 @@ package io.dapr.client;
import com.google.protobuf.Any; import com.google.protobuf.Any;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import com.google.protobuf.Empty; import com.google.protobuf.Empty;
import io.dapr.client.domain.*; import io.dapr.client.domain.AppConnectionPropertiesHealthMetadata;
import io.dapr.client.domain.AppConnectionPropertiesMetadata;
import io.dapr.client.domain.ComponentMetadata;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.DaprMetadata;
import io.dapr.client.domain.DeleteStateRequest;
import io.dapr.client.domain.ExecuteStateTransactionRequest;
import io.dapr.client.domain.GetBulkStateRequest;
import io.dapr.client.domain.GetStateRequest;
import io.dapr.client.domain.PublishEventRequest;
import io.dapr.client.domain.RuleMetadata;
import io.dapr.client.domain.State;
import io.dapr.client.domain.StateOptions;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.SubscriptionMetadata;
import io.dapr.client.domain.TransactionalStateOperation;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.serializer.DaprObjectSerializer; import io.dapr.serializer.DaprObjectSerializer;
import io.dapr.serializer.DefaultObjectSerializer; import io.dapr.serializer.DefaultObjectSerializer;
import io.dapr.utils.TypeRef; import io.dapr.utils.TypeRef;
import io.dapr.v1.CommonProtos; import io.dapr.v1.CommonProtos;
import io.dapr.v1.DaprGrpc; import io.dapr.v1.DaprGrpc;
import io.dapr.v1.DaprProtos; import io.dapr.v1.DaprProtos;
import io.dapr.v1.DaprProtos.ActiveActorsCount;
import io.dapr.v1.DaprProtos.ActorRuntime;
import io.dapr.v1.DaprProtos.AppConnectionHealthProperties; import io.dapr.v1.DaprProtos.AppConnectionHealthProperties;
import io.dapr.v1.DaprProtos.AppConnectionProperties; import io.dapr.v1.DaprProtos.AppConnectionProperties;
import io.dapr.v1.DaprProtos.MetadataHTTPEndpoint; import io.dapr.v1.DaprProtos.MetadataHTTPEndpoint;
@ -2076,6 +2095,15 @@ public class DaprClientGrpcTest {
@Test @Test
public void getMetadataTest() { public void getMetadataTest() {
ActiveActorsCount activeActorsCount = DaprProtos.ActiveActorsCount.newBuilder()
.setType("actor")
.setCount(1)
.build();
ActorRuntime actorRuntime = DaprProtos.ActorRuntime.newBuilder()
.addActiveActors(activeActorsCount)
.build();
RegisteredComponents registeredComponents = DaprProtos.RegisteredComponents.newBuilder() RegisteredComponents registeredComponents = DaprProtos.RegisteredComponents.newBuilder()
.setName("statestore") .setName("statestore")
.setType("state.redis") .setType("state.redis")
@ -2112,11 +2140,11 @@ public class DaprClientGrpcTest {
.setHealth(healthProperties) .setHealth(healthProperties)
.build(); .build();
DaprProtos.GetMetadataResponse responseEnvelope = DaprProtos.GetMetadataResponse.newBuilder() DaprProtos.GetMetadataResponse responseEnvelope = DaprProtos.GetMetadataResponse.newBuilder()
.setId("app") .setId("app")
.setRuntimeVersion("1.1x.x") .setRuntimeVersion("1.1x.x")
.addAllEnabledFeatures(Collections.emptyList()) .addAllEnabledFeatures(Collections.emptyList())
.setActorRuntime(actorRuntime)
.putAllExtendedMetadata(Collections.emptyMap()) .putAllExtendedMetadata(Collections.emptyMap())
.addAllRegisteredComponents(Collections.singletonList(registeredComponents)) .addAllRegisteredComponents(Collections.singletonList(registeredComponents))
.addAllHttpEndpoints(Collections.singletonList(httpEndpoint)) .addAllHttpEndpoints(Collections.singletonList(httpEndpoint))
@ -2141,20 +2169,37 @@ public class DaprClientGrpcTest {
assertEquals(0, metadata.getEnabledFeatures().size()); assertEquals(0, metadata.getEnabledFeatures().size());
assertEquals(0, metadata.getAttributes().size()); assertEquals(0, metadata.getAttributes().size());
// Actors
assertEquals(1, metadata.getActors().size());
assertEquals(activeActorsCount.getType(), metadata.getActors().get(0).getType());
assertEquals(activeActorsCount.getCount(), metadata.getActors().get(0).getCount());
// Components // Components
assertEquals(1, metadata.getComponents().size()); assertEquals(1, metadata.getComponents().size());
assertEquals(registeredComponents.getName(), metadata.getComponents().get(0).getName());
assertEquals(registeredComponents.getVersion(), metadata.getComponents().get(0).getVersion()); ComponentMetadata componentMetadata = metadata.getComponents().get(0);
assertEquals(registeredComponents.getType(), metadata.getComponents().get(0).getType());
assertEquals(registeredComponents.getName(), componentMetadata.getName());
assertEquals(registeredComponents.getVersion(), componentMetadata.getVersion());
assertEquals(registeredComponents.getType(), componentMetadata.getType());
assertEquals(registeredComponents.getCapabilitiesList(), componentMetadata.getCapabilities());
// Subscriptions // Subscriptions
assertEquals(1, metadata.getSubscriptions().size()); assertEquals(1, metadata.getSubscriptions().size());
assertEquals(pubsubSubscription.getPubsubName(), metadata.getSubscriptions().get(0).getPubsubname());
assertEquals(pubsubSubscription.getTopic(), metadata.getSubscriptions().get(0).getTopic()); SubscriptionMetadata subscriptionMetadata = metadata.getSubscriptions().get(0);
assertEquals(pubsubSubscription.getPubsubName(), subscriptionMetadata.getPubsubname());
assertEquals(pubsubSubscription.getTopic(), subscriptionMetadata.getTopic());
assertEquals(pubsubSubscription.getDeadLetterTopic(), subscriptionMetadata.getDeadLetterTopic());
// Subscription Rules // Subscription Rules
assertEquals(1, metadata.getSubscriptions().get(0).getRules().size()); assertEquals(1, subscriptionMetadata.getRules().size());
assertEquals(pubsubSubscription.getRules().getRules(0).getPath(), metadata.getSubscriptions().get(0).getRules().get(0).getPath());
RuleMetadata ruleMetadata = subscriptionMetadata.getRules().get(0);
assertEquals(pubsubSubscription.getRules().getRules(0).getMatch(), ruleMetadata.getMatch());
assertEquals(pubsubSubscription.getRules().getRules(0).getPath(), ruleMetadata.getPath());
// HTTP Endpoints // HTTP Endpoints
assertEquals(1, metadata.getHttpEndpoints().size()); assertEquals(1, metadata.getHttpEndpoints().size());