Convert Config API to Stable endpoints. (#846)

This commit is contained in:
Mukundan Sundararajan 2023-05-09 23:16:54 +05:30 committed by GitHub
parent 135b109201
commit aaa5f7bc76
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 612 additions and 528 deletions

View File

@ -38,7 +38,7 @@ jobs:
spring-boot-version: 2.3.6.RELEASE
experimental: false
env:
GOVER: 1.19
GOVER: "1.20"
GOOS: linux
GOARCH: amd64
GOPROXY: https://proxy.golang.org
@ -47,7 +47,7 @@ jobs:
DAPR_RUNTIME_VER: 1.10.6-rc.2
DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v1.10.0/install/install.sh
DAPR_CLI_REF:
DAPR_REF:
DAPR_REF: 1415e23b14628db70adf9403f5a18876f40b6924
steps:
- uses: actions/checkout@v3
- name: Set up OpenJDK ${{ env.JDK_VER }}

View File

@ -32,7 +32,7 @@ jobs:
matrix:
java: [ 11, 13, 15, 16 ]
env:
GOVER: 1.19
GOVER: "1.20"
GOOS: linux
GOARCH: amd64
GOPROXY: https://proxy.golang.org
@ -41,7 +41,7 @@ jobs:
DAPR_RUNTIME_VER: 1.10.6-rc.2
DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/v1.10.0/install/install.sh
DAPR_CLI_REF:
DAPR_REF:
DAPR_REF: 1415e23b14628db70adf9403f5a18876f40b6924
steps:
- uses: actions/checkout@v3
- name: Set up OpenJDK ${{ env.JDK_VER }}

View File

@ -13,6 +13,7 @@ limitations under the License.
package io.dapr.examples.configuration.grpc;
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.DaprPreviewClient;
import io.dapr.client.domain.ConfigurationItem;
@ -44,8 +45,8 @@ public class ConfigurationClient {
* @throws Exception throws Exception
*/
public static void main(String[] args) throws Exception {
try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) {
System.out.println("Using preview client...");
try (DaprClient client = (new DaprClientBuilder()).build()) {
System.out.println("Using Dapr client...");
getConfigurations(client);
subscribeConfigurationRequest(client);
}
@ -56,7 +57,7 @@ public class ConfigurationClient {
*
* @param client DaprPreviewClient object
*/
public static void getConfigurations(DaprPreviewClient client) {
public static void getConfigurations(DaprClient client) {
System.out.println("*******trying to retrieve configurations for a list of keys********");
List<String> keys = new ArrayList<>();
keys.add("myconfig1");
@ -76,7 +77,7 @@ public class ConfigurationClient {
*
* @param client DaprPreviewClient object
*/
public static void subscribeConfigurationRequest(DaprPreviewClient client) {
public static void subscribeConfigurationRequest(DaprClient client) {
System.out.println("Subscribing to key: myconfig1");
SubscribeConfigurationRequest req = new SubscribeConfigurationRequest(
CONFIG_STORE_NAME, Collections.singletonList("myconfig1"));

View File

@ -1,7 +1,6 @@
## Retrieve Configurations via Configuration API
This example provides the different capabilities provided by Dapr Java SDK for Configuration. For further information about Configuration APIs please refer to [this link](https://docs.dapr.io/developing-applications/building-blocks/configuration/)
**This API is available in Preview Mode**.
### Using the ConfigurationAPI
@ -63,7 +62,7 @@ public class ConfigurationClient {
*/
public static void main(String[] args) throws Exception {
try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) {
System.out.println("Using preview client...");
System.out.println("Using Dapr client...");
getConfigurations(client);
subscribeConfigurationRequestWithSubscribe(client);
unsubscribeConfigurationItems(client);
@ -134,7 +133,7 @@ Use the following command to run this example-
<!-- STEP
name: Run ConfigurationClient example
expected_stdout_lines:
- "== APP == Using preview client..."
- "== APP == Using Dapr client..."
- "== APP == *******trying to retrieve configurations for a list of keys********"
- "== APP == val1 : key ->myconfig1"
- "== APP == val2 : key ->myconfig2"
@ -155,7 +154,7 @@ dapr run --components-path ./components/configuration --app-id configgrpc --log-
### Sample output
```
== APP == Using preview client...
== APP == Using Dapr client...
== APP == *******trying to retrieve configurations for a list of keys********
== APP == val1 : key ->myconfig1
== APP == val2 : key ->myconfig2

View File

@ -14,6 +14,7 @@ limitations under the License.
package io.dapr.examples.configuration.http;
import io.dapr.client.DaprApiProtocol;
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.DaprPreviewClient;
import io.dapr.client.domain.ConfigurationItem;
@ -42,8 +43,8 @@ public class ConfigurationClient {
*/
public static void main(String[] args) throws Exception {
System.getProperties().setProperty(Properties.API_PROTOCOL.getName(), DaprApiProtocol.HTTP.name());
try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) {
System.out.println("Using preview client...");
try (DaprClient client = (new DaprClientBuilder()).build()) {
System.out.println("Using Dapr client...");
getConfigurations(client);
subscribeConfigurationRequest(client);
}
@ -54,7 +55,7 @@ public class ConfigurationClient {
*
* @param client DaprPreviewClient object
*/
public static void getConfigurations(DaprPreviewClient client) {
public static void getConfigurations(DaprClient client) {
System.out.println("*******trying to retrieve configurations for a list of keys********");
List<String> keys = new ArrayList<>();
keys.add("myconfig1");
@ -79,7 +80,7 @@ public class ConfigurationClient {
*
* @param client DaprPreviewClient object
*/
public static void subscribeConfigurationRequest(DaprPreviewClient client) throws InterruptedException {
public static void subscribeConfigurationRequest(DaprClient client) throws InterruptedException {
System.out.println("Subscribing to key: myconfig2");
SubscribeConfigurationRequest req = new SubscribeConfigurationRequest(
CONFIG_STORE_NAME, Collections.singletonList("myconfig2"));

View File

@ -64,7 +64,7 @@ public class ConfigurationClient {
public static void main(String[] args) throws Exception {
System.getProperties().setProperty(Properties.API_PROTOCOL.getName(), DaprApiProtocol.HTTP.name());
try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) {
System.out.println("Using preview client...");
System.out.println("Using Dapr client...");
getConfigurations(client);
subscribeConfigurationRequest(client);
}
@ -153,7 +153,7 @@ Use the following command to run this example-
<!-- STEP
name: Run ConfigurationClient example
expected_stdout_lines:
- "== APP == Using preview client..."
- "== APP == Using Dapr client..."
- "== APP == *******trying to retrieve configurations for a list of keys********"
- "== APP == val1 : key ->myconfig1"
- "== APP == val2 : key ->myconfig2"
@ -184,7 +184,7 @@ docker exec dapr_redis redis-cli MSET myconfig2 "updated_val2||1"
### Sample output
```
== APP == Using preview client...
== APP == Using Dapr client...
== APP == *******trying to retrieve configurations for a list of keys********
== APP == val1 : key ->myconfig1
== APP == val2 : key ->myconfig2

View File

@ -16,7 +16,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<grpc.version>1.42.1</grpc.version>
<protobuf.version>3.17.3</protobuf.version>
<dapr.proto.baseurl>https://raw.githubusercontent.com/dapr/dapr/v1.10.0-rc.2/dapr/proto</dapr.proto.baseurl>
<dapr.proto.baseurl>https://raw.githubusercontent.com/dapr/dapr/1415e23b14628db70adf9403f5a18876f40b6924/dapr/proto</dapr.proto.baseurl>
<os-maven-plugin.version>1.6.2</os-maven-plugin.version>
<maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
<maven-antrun-plugin.version>1.8</maven-antrun-plugin.version>
@ -65,7 +65,7 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>

View File

@ -103,7 +103,7 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>

View File

@ -13,8 +13,8 @@ limitations under the License.
package io.dapr.it.configuration.grpc;
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.DaprPreviewClient;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
@ -37,7 +37,7 @@ public class ConfigurationClientIT extends BaseIT {
private static DaprRun daprRun;
private static DaprPreviewClient daprPreviewClient;
private static DaprClient daprClient;
private static String key = "myconfig1";
@ -63,12 +63,12 @@ public class ConfigurationClientIT extends BaseIT {
public static void init() throws Exception {
daprRun = startDaprApp(ConfigurationClientIT.class.getSimpleName(), 5000);
daprRun.switchToGRPC();
daprPreviewClient = new DaprClientBuilder().buildPreviewClient();
daprClient = new DaprClientBuilder().build();
}
@AfterClass
public static void tearDown() throws Exception {
daprPreviewClient.close();
daprClient.close();
}
@Before
@ -78,13 +78,13 @@ public class ConfigurationClientIT extends BaseIT {
@Test
public void getConfiguration() {
ConfigurationItem ci = daprPreviewClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1").block();
ConfigurationItem ci = daprClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1").block();
assertEquals(ci.getValue(), "myconfigvalue1");
}
@Test
public void getConfigurations() {
Map<String, ConfigurationItem> cis = daprPreviewClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1", "myconfigkey2").block();
Map<String, ConfigurationItem> cis = daprClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1", "myconfigkey2").block();
assertTrue(cis.size() == 2);
assertTrue(cis.containsKey("myconfigkey1"));
assertTrue(cis.containsKey("myconfigkey2"));
@ -94,7 +94,7 @@ public class ConfigurationClientIT extends BaseIT {
@Test
public void subscribeConfiguration() {
Runnable subscribeTask = () -> {
Flux<SubscribeConfigurationResponse> outFlux = daprPreviewClient
Flux<SubscribeConfigurationResponse> outFlux = daprClient
.subscribeConfiguration(CONFIG_STORE_NAME, "myconfigkey1", "myconfigkey2");
outFlux.subscribe(update -> {
if (update.getItems().size() == 0 ) {
@ -132,7 +132,7 @@ public class ConfigurationClientIT extends BaseIT {
AtomicReference<Disposable> disposableAtomicReference = new AtomicReference<>();
AtomicReference<String> subscriptionId = new AtomicReference<>();
Runnable subscribeTask = () -> {
Flux<SubscribeConfigurationResponse> outFlux = daprPreviewClient
Flux<SubscribeConfigurationResponse> outFlux = daprClient
.subscribeConfiguration(CONFIG_STORE_NAME, "myconfigkey1");
disposableAtomicReference.set(outFlux
.subscribe(update -> {
@ -163,7 +163,7 @@ public class ConfigurationClientIT extends BaseIT {
// To ensure key starts getting updated
inducingSleepTime(1000);
UnsubscribeConfigurationResponse res = daprPreviewClient.unsubscribeConfiguration(
UnsubscribeConfigurationResponse res = daprClient.unsubscribeConfiguration(
subscriptionId.get(),
CONFIG_STORE_NAME
).block();

View File

@ -1,7 +1,7 @@
package io.dapr.it.configuration.http;
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.DaprPreviewClient;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.it.BaseIT;
import io.dapr.it.DaprRun;
@ -21,7 +21,7 @@ public class ConfigurationIT extends BaseIT {
private static DaprRun daprRun;
private static DaprPreviewClient daprPreviewClient;
private static DaprClient daprClient;
private static String key = "myconfig1";
@ -39,12 +39,12 @@ public class ConfigurationIT extends BaseIT {
public static void init() throws Exception {
daprRun = startDaprApp(ConfigurationIT.class.getSimpleName(), 5000);
daprRun.switchToHTTP();
daprPreviewClient = new DaprClientBuilder().buildPreviewClient();
daprClient = new DaprClientBuilder().build();
}
@AfterClass
public static void tearDown() throws Exception {
daprPreviewClient.close();
daprClient.close();
}
@Before
@ -54,14 +54,14 @@ public class ConfigurationIT extends BaseIT {
@Test
public void getConfiguration() {
ConfigurationItem ci = daprPreviewClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1").block();
ConfigurationItem ci = daprClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1").block();
assertEquals(ci.getKey(), "myconfigkey1");
assertEquals(ci.getValue(), "myconfigvalue1");
}
@Test
public void getConfigurations() {
Map<String, ConfigurationItem> cis = daprPreviewClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1", "myconfigkey2").block();
Map<String, ConfigurationItem> cis = daprClient.getConfiguration(CONFIG_STORE_NAME, "myconfigkey1", "myconfigkey2").block();
assertTrue(cis.size() == 2);
assertTrue(cis.containsKey("myconfigkey1"));
assertTrue(cis.containsKey("myconfigkey2"));

View File

@ -1,7 +1,7 @@
package io.dapr.it.configuration.http;
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.DaprPreviewClient;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.it.BaseIT;
@ -23,7 +23,7 @@ public class ConfigurationSubscribeIT extends BaseIT {
private static DaprRun daprRun;
private static DaprPreviewClient daprPreviewClient;
private static DaprClient daprClient;
private static String key = "myconfig1";
@ -46,12 +46,12 @@ public class ConfigurationSubscribeIT extends BaseIT {
true,
60000);
daprRun.switchToHTTP();
daprPreviewClient = new DaprClientBuilder().buildPreviewClient();
daprClient = new DaprClientBuilder().build();
}
@AfterClass
public static void tearDown() throws Exception {
daprPreviewClient.close();
daprClient.close();
}
@Before
@ -62,14 +62,14 @@ public class ConfigurationSubscribeIT extends BaseIT {
@Test
public void subscribeAndUnsubscribeConfiguration() {
AtomicReference<String> subId= new AtomicReference<>("");
Flux<SubscribeConfigurationResponse> outFlux = daprPreviewClient
Flux<SubscribeConfigurationResponse> outFlux = daprClient
.subscribeConfiguration(CONFIG_STORE_NAME, "myconfigkey1", "myconfigkey2");
outFlux.subscribe(items -> {
subId.set(items.getSubscriptionId());
});
assertTrue(subId.get().length() > 0);
UnsubscribeConfigurationResponse res = daprPreviewClient.unsubscribeConfiguration(
UnsubscribeConfigurationResponse res = daprClient.unsubscribeConfiguration(
subId.get(),
CONFIG_STORE_NAME
).block();

View File

@ -13,10 +13,12 @@ limitations under the License.
package io.dapr.client;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.DeleteStateRequest;
import io.dapr.client.domain.ExecuteStateTransactionRequest;
import io.dapr.client.domain.GetBulkSecretRequest;
import io.dapr.client.domain.GetBulkStateRequest;
import io.dapr.client.domain.GetConfigurationRequest;
import io.dapr.client.domain.GetSecretRequest;
import io.dapr.client.domain.GetStateRequest;
import io.dapr.client.domain.HttpExtension;
@ -26,8 +28,13 @@ import io.dapr.client.domain.PublishEventRequest;
import io.dapr.client.domain.SaveStateRequest;
import io.dapr.client.domain.State;
import io.dapr.client.domain.StateOptions;
import io.dapr.client.domain.SubscribeConfigurationRequest;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.TransactionalStateOperation;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.utils.TypeRef;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;
@ -559,6 +566,99 @@ public interface DaprClient extends AutoCloseable {
*/
Mono<Map<String, Map<String, String>>> getBulkSecret(GetBulkSecretRequest request);
/**
* Retrieve a configuration based on a provided key.
*
* @param storeName Name of the configuration store
* @param key key of the configuration item which is to be retrieved
* @return Mono of the Configuration Item
*/
Mono<ConfigurationItem> getConfiguration(String storeName, String key);
/**
* Retrieve a configuration based on a provided key.
*
* @param storeName Name of the configuration store
* @param key key of the configuration item which is to be retrieved
* @param metadata optional metadata
* @return Mono of the Configuration Item
*/
Mono<ConfigurationItem> getConfiguration(String storeName, String key, Map<String, String> metadata);
/**
* Retrieve Map of configurations based on a provided variable number of keys.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be retrieved
* @return Mono of Map of ConfigurationItems
*/
Mono<Map<String, ConfigurationItem>> getConfiguration(String storeName, String... keys);
/**
* Retrieve Map of configurations based on a provided variable number of keys.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be retrieved
* @param metadata optional metadata
* @return Mono of Map of ConfigurationItems
*/
Mono<Map<String, ConfigurationItem>> getConfiguration(String storeName, List<String> keys,
Map<String, String> metadata);
/**
* Retrieve Map of configurations based on a provided configuration request object.
*
* @param request request for retrieving Configurations for a list keys
* @return Mono of Map of ConfigurationItems
*/
Mono<Map<String, ConfigurationItem>> getConfiguration(GetConfigurationRequest request);
/**
* Subscribe to the keys for any change.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be subscribed
* @return Flux of {@link SubscribeConfigurationResponse} instance
*/
Flux<SubscribeConfigurationResponse> subscribeConfiguration(String storeName, String... keys);
/**
* Subscribe to the keys for any change.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be subscribed
* @param metadata optional metadata
* @return Flux of {@link SubscribeConfigurationResponse} instance
*/
Flux<SubscribeConfigurationResponse> subscribeConfiguration(String storeName, List<String> keys,
Map<String, String> metadata);
/**
* Subscribe to the keys for any change.
*
* @param request request for subscribing to any change for the given keys in request
* @return Flux of {@link SubscribeConfigurationResponse} instance
*/
Flux<SubscribeConfigurationResponse> subscribeConfiguration(SubscribeConfigurationRequest request);
/**
* Unsubscribe from previously subscribed keys.
*
* @param id subscription id returned by subscribeConfiguration API.
* @param storeName Name of the configuration store.
* @return Mono of {@link UnsubscribeConfigurationResponse} instance.
*/
Mono<UnsubscribeConfigurationResponse> unsubscribeConfiguration(String id, String storeName);
/**
* Unsubscribe from previously subscribed keys.
*
* @param request request for unsubscribing to any change for the given subscription id in request
* @return Mono of {@link UnsubscribeConfigurationResponse} instance.
*/
Mono<UnsubscribeConfigurationResponse> unsubscribeConfiguration(UnsubscribeConfigurationRequest request);
/**
* Gracefully shutdown the dapr runtime.
*

View File

@ -881,18 +881,18 @@ public class DaprClientGrpc extends AbstractDaprClient {
}
DaprProtos.GetConfigurationRequest envelope = builder.build();
return this.getConfigurationAlpha1(envelope);
return this.getConfiguration(envelope);
} catch (Exception ex) {
return DaprException.wrapMono(ex);
}
}
private Mono<Map<String, ConfigurationItem>> getConfigurationAlpha1(DaprProtos.GetConfigurationRequest envelope) {
private Mono<Map<String, ConfigurationItem>> getConfiguration(DaprProtos.GetConfigurationRequest envelope) {
return Mono.deferContextual(
context ->
this.<DaprProtos.GetConfigurationResponse>createMono(
it -> intercept(context, asyncStub).getConfigurationAlpha1(envelope, it)
it -> intercept(context, asyncStub).getConfiguration(envelope, it)
)
).map(
it -> {
@ -932,7 +932,7 @@ public class DaprClientGrpc extends AbstractDaprClient {
DaprProtos.SubscribeConfigurationRequest envelope = builder.build();
return this.<DaprProtos.SubscribeConfigurationResponse>createFlux(
it -> intercept(asyncStub).subscribeConfigurationAlpha1(envelope, it)
it -> intercept(asyncStub).subscribeConfiguration(envelope, it)
).map(
it -> {
Map<String, ConfigurationItem> configMap = new HashMap<>();
@ -972,7 +972,7 @@ public class DaprClientGrpc extends AbstractDaprClient {
DaprProtos.UnsubscribeConfigurationRequest envelope = builder.build();
return this.<DaprProtos.UnsubscribeConfigurationResponse>createMono(
it -> intercept(asyncStub).unsubscribeConfigurationAlpha1(envelope, it)
it -> intercept(asyncStub).unsubscribeConfiguration(envelope, it)
).map(
it -> new UnsubscribeConfigurationResponse(it.getOk(), it.getMessage())
);

View File

@ -809,7 +809,7 @@ public class DaprClientHttp extends AbstractDaprClient {
Map<String, List<String>> queryArgs = metadataToQueryArgs(metadata);
queryParams.putAll(queryArgs);
String[] pathSegments = new String[] {DaprHttp.ALPHA_1_API_VERSION, "configuration", configurationStoreName };
String[] pathSegments = new String[] {DaprHttp.API_VERSION, "configuration", configurationStoreName };
return Mono.deferContextual(
context -> this.client
.invokeApi(
@ -870,7 +870,7 @@ public class DaprClientHttp extends AbstractDaprClient {
queryParams.putAll(queryArgs);
String[] pathSegments =
new String[] { DaprHttp.ALPHA_1_API_VERSION, "configuration", configurationStoreName, "subscribe" };
new String[] { DaprHttp.API_VERSION, "configuration", configurationStoreName, "subscribe" };
SubscribeConfigurationResponse res = Mono.deferContextual(
context -> this.client.invokeApi(
DaprHttp.HttpMethods.GET.name(),
@ -911,7 +911,7 @@ public class DaprClientHttp extends AbstractDaprClient {
}
String[] pathSegments = new String[]
{ DaprHttp.ALPHA_1_API_VERSION, "configuration", configStoreName, id, "unsubscribe" };
{ DaprHttp.API_VERSION, "configuration", configStoreName, id, "unsubscribe" };
return Mono.deferContextual(
context -> this.client

View File

@ -13,23 +13,28 @@ limitations under the License.
package io.dapr.client;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.DeleteStateRequest;
import io.dapr.client.domain.ExecuteStateTransactionRequest;
import io.dapr.client.domain.GetBulkSecretRequest;
import io.dapr.client.domain.GetBulkStateRequest;
import io.dapr.client.domain.GetConfigurationRequest;
import io.dapr.client.domain.GetSecretRequest;
import io.dapr.client.domain.GetStateRequest;
import io.dapr.client.domain.HttpExtension;
import io.dapr.client.domain.InvokeBindingRequest;
import io.dapr.client.domain.InvokeMethodRequest;
import io.dapr.client.domain.PublishEventRequest;
import io.dapr.client.domain.QueryStateRequest;
import io.dapr.client.domain.QueryStateResponse;
import io.dapr.client.domain.SaveStateRequest;
import io.dapr.client.domain.State;
import io.dapr.client.domain.StateOptions;
import io.dapr.client.domain.SubscribeConfigurationRequest;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.TransactionalStateOperation;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.utils.TypeRef;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;
@ -500,6 +505,88 @@ class DaprClientProxy implements DaprClient {
return client.getBulkSecret(request);
}
/**
* {@inheritDoc}
*/
@Override
public Mono<ConfigurationItem> getConfiguration(String storeName, String key) {
return client.getConfiguration(storeName, key);
}
/**
* {@inheritDoc}
*/
@Override
public Mono<ConfigurationItem> getConfiguration(String storeName, String key, Map<String, String> metadata) {
return client.getConfiguration(storeName, key, metadata);
}
/**
* {@inheritDoc}
*/
@Override
public Mono<Map<String, ConfigurationItem>> getConfiguration(String storeName, String... keys) {
return client.getConfiguration(storeName, keys);
}
/**
* {@inheritDoc}
*/
@Override
public Mono<Map<String, ConfigurationItem>> getConfiguration(String storeName, List<String> keys,
Map<String, String> metadata) {
return client.getConfiguration(storeName, keys, metadata);
}
/**
* {@inheritDoc}
*/
@Override
public Mono<Map<String, ConfigurationItem>> getConfiguration(GetConfigurationRequest request) {
return client.getConfiguration(request);
}
/**
* {@inheritDoc}
*/
@Override
public Flux<SubscribeConfigurationResponse> subscribeConfiguration(String storeName, String... keys) {
return client.subscribeConfiguration(storeName, keys);
}
/**
* {@inheritDoc}
*/
@Override
public Flux<SubscribeConfigurationResponse> subscribeConfiguration(String storeName, List<String> keys,
Map<String, String> metadata) {
return client.subscribeConfiguration(storeName, keys, metadata);
}
/**
* {@inheritDoc}
*/
@Override
public Flux<SubscribeConfigurationResponse> subscribeConfiguration(SubscribeConfigurationRequest request) {
return client.subscribeConfiguration(request);
}
/**
* {@inheritDoc}
*/
@Override
public Mono<UnsubscribeConfigurationResponse> unsubscribeConfiguration(String id, String storeName) {
return client.unsubscribeConfiguration(id, storeName);
}
/**
* {@inheritDoc}
*/
@Override
public Mono<UnsubscribeConfigurationResponse> unsubscribeConfiguration(UnsubscribeConfigurationRequest request) {
return client.unsubscribeConfiguration(request);
}
/**
* {@inheritDoc}
*/

View File

@ -17,17 +17,10 @@ import io.dapr.client.domain.BulkPublishEntry;
import io.dapr.client.domain.BulkPublishRequest;
import io.dapr.client.domain.BulkPublishResponse;
import io.dapr.client.domain.BulkPublishResponseFailedEntry;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.GetConfigurationRequest;
import io.dapr.client.domain.QueryStateRequest;
import io.dapr.client.domain.QueryStateResponse;
import io.dapr.client.domain.SubscribeConfigurationRequest;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.client.domain.query.Query;
import io.dapr.utils.TypeRef;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;
@ -40,99 +33,6 @@ import java.util.Map;
*/
public interface DaprPreviewClient extends AutoCloseable {
/**
* Retrieve a configuration based on a provided key.
*
* @param storeName Name of the configuration store
* @param key key of the configuration item which is to be retrieved
* @return Mono of the Configuration Item
*/
Mono<ConfigurationItem> getConfiguration(String storeName, String key);
/**
* Retrieve a configuration based on a provided key.
*
* @param storeName Name of the configuration store
* @param key key of the configuration item which is to be retrieved
* @param metadata optional metadata
* @return Mono of the Configuration Item
*/
Mono<ConfigurationItem> getConfiguration(String storeName, String key, Map<String, String> metadata);
/**
* Retrieve Map of configurations based on a provided variable number of keys.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be retrieved
* @return Mono of Map of ConfigurationItems
*/
Mono<Map<String, ConfigurationItem>> getConfiguration(String storeName, String... keys);
/**
* Retrieve Map of configurations based on a provided variable number of keys.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be retrieved
* @param metadata optional metadata
* @return Mono of Map of ConfigurationItems
*/
Mono<Map<String, ConfigurationItem>> getConfiguration(String storeName, List<String> keys,
Map<String, String> metadata);
/**
* Retrieve Map of configurations based on a provided configuration request object.
*
* @param request request for retrieving Configurations for a list keys
* @return Mono of Map of ConfigurationItems
*/
Mono<Map<String, ConfigurationItem>> getConfiguration(GetConfigurationRequest request);
/**
* Subscribe to the keys for any change.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be subscribed
* @return Flux of {@link SubscribeConfigurationResponse} instance
*/
Flux<SubscribeConfigurationResponse> subscribeConfiguration(String storeName, String... keys);
/**
* Subscribe to the keys for any change.
*
* @param storeName Name of the configuration store
* @param keys keys of the configurations which are to be subscribed
* @param metadata optional metadata
* @return Flux of {@link SubscribeConfigurationResponse} instance
*/
Flux<SubscribeConfigurationResponse> subscribeConfiguration(String storeName, List<String> keys,
Map<String, String> metadata);
/**
* Subscribe to the keys for any change.
*
* @param request request for subscribing to any change for the given keys in request
* @return Flux of {@link SubscribeConfigurationResponse} instance
*/
Flux<SubscribeConfigurationResponse> subscribeConfiguration(SubscribeConfigurationRequest request);
/**
* Subscribe to the keys for any change.
*
* @param id subscription id returned by subscribeConfiguration API.
* @param storeName Name of the configuration store.
* @return Mono of {@link UnsubscribeConfigurationResponse} instance.
*/
Mono<UnsubscribeConfigurationResponse> unsubscribeConfiguration(String id, String storeName);
/**
* Subscribe to the keys for any change.
*
* @param request request for unsubscribing to any change for the given subscription id in request
* @return Mono of {@link UnsubscribeConfigurationResponse} instance.
*/
Mono<UnsubscribeConfigurationResponse> unsubscribeConfiguration(UnsubscribeConfigurationRequest request);
/**
* Query for states using a query string.
*

View File

@ -16,6 +16,7 @@ package io.dapr.client;
import com.google.protobuf.Any;
import com.google.protobuf.ByteString;
import com.google.protobuf.Empty;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.DeleteStateRequest;
import io.dapr.client.domain.ExecuteStateTransactionRequest;
import io.dapr.client.domain.GetBulkStateRequest;
@ -24,7 +25,10 @@ import io.dapr.client.domain.HttpExtension;
import io.dapr.client.domain.PublishEventRequest;
import io.dapr.client.domain.State;
import io.dapr.client.domain.StateOptions;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.TransactionalStateOperation;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.config.Properties;
import io.dapr.serializer.DaprObjectSerializer;
import io.dapr.serializer.DefaultObjectSerializer;
@ -53,6 +57,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@ -82,6 +87,8 @@ public class DaprClientGrpcTest {
private static final String STATE_STORE_NAME = "MyStateStore";
private static final String CONFIG_STORE_NAME = "MyConfigStore";
private static final String SECRET_STORE_NAME = "MySecretStore";
private Closeable closeable;
@ -2098,6 +2105,248 @@ public class DaprClientGrpcTest {
assertEquals("2", secrets.get("two").get("b"));
}
@Test
public void getConfigurationTestErrorScenario() {
assertThrows(IllegalArgumentException.class, () -> {
client.getConfiguration("", "key").block();
});
}
@Test
public void getSingleConfigurationTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getSingleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfiguration(any(DaprProtos.GetConfigurationRequest.class), any());
ConfigurationItem ci = client.getConfiguration(CONFIG_STORE_NAME, "configkey1").block();
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void getSingleConfigurationWithMetadataTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getSingleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfiguration(any(DaprProtos.GetConfigurationRequest.class), any());
Map<String, String> reqMetadata = new HashMap<>();
reqMetadata.put("meta1", "value1");
ConfigurationItem ci = client.getConfiguration(CONFIG_STORE_NAME, "configkey1", reqMetadata).block();
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void getMultipleConfigurationTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getMultipleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfiguration(any(DaprProtos.GetConfigurationRequest.class), any());
Map<String, ConfigurationItem> cis = client.getConfiguration(CONFIG_STORE_NAME, "configkey1","configkey2").block();
assertEquals(2, cis.size());
assertTrue("configkey1", cis.containsKey("configkey1"));
assertEquals("configvalue1", cis.get("configkey1").getValue());
assertEquals("1", cis.get("configkey1").getVersion());
assertTrue("configkey2", cis.containsKey("configkey2"));
assertEquals("configvalue2", cis.get("configkey2").getValue());
assertEquals("1", cis.get("configkey2").getVersion());
}
@Test
public void getMultipleConfigurationWithMetadataTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getMultipleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfiguration(any(DaprProtos.GetConfigurationRequest.class), any());
Map<String, String> reqMetadata = new HashMap<>();
reqMetadata.put("meta1", "value1");
List<String> keys = Arrays.asList("configkey1","configkey2");
Map<String, ConfigurationItem> cis = client.getConfiguration(CONFIG_STORE_NAME, keys, reqMetadata).block();
assertEquals(2, cis.size());
assertTrue("configkey1", cis.containsKey("configkey1"));
assertEquals("configvalue1", cis.get("configkey1").getValue());
}
@Test
public void subscribeConfigurationTest() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.SubscribeConfigurationResponse responseEnvelope = DaprProtos.SubscribeConfigurationResponse.newBuilder()
.putAllItems(configs)
.setId("subscription_id")
.build();
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.SubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.SubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(responseEnvelope);
observer.onCompleted();
return null;
}).when(daprStub).subscribeConfiguration(any(DaprProtos.SubscribeConfigurationRequest.class), any());
Iterator<SubscribeConfigurationResponse> itr = client.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertTrue(res.getItems().containsKey("configkey1"));
assertEquals("subscription_id", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void subscribeConfigurationTestWithMetadata() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.SubscribeConfigurationResponse responseEnvelope = DaprProtos.SubscribeConfigurationResponse.newBuilder()
.putAllItems(configs)
.setId("subscription_id")
.build();
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.SubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.SubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(responseEnvelope);
observer.onCompleted();
return null;
}).when(daprStub).subscribeConfiguration(any(DaprProtos.SubscribeConfigurationRequest.class), any());
Map<String, String> reqMetadata = new HashMap<>();
List<String> keys = Arrays.asList("configkey1");
Iterator<SubscribeConfigurationResponse> itr = client.subscribeConfiguration(CONFIG_STORE_NAME, keys, reqMetadata).toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertTrue(res.getItems().containsKey("configkey1"));
assertEquals("subscription_id", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void subscribeConfigurationWithErrorTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.SubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.SubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onError(new RuntimeException());
observer.onCompleted();
return null;
}).when(daprStub).subscribeConfiguration(any(DaprProtos.SubscribeConfigurationRequest.class), any());
assertThrowsDaprException(ExecutionException.class, () -> {
client.subscribeConfiguration(CONFIG_STORE_NAME, "key").blockFirst();
});
assertThrows(IllegalArgumentException.class, () -> {
client.subscribeConfiguration("", "key").blockFirst();
});
}
@Test
public void unsubscribeConfigurationTest() {
DaprProtos.UnsubscribeConfigurationResponse responseEnvelope = DaprProtos.UnsubscribeConfigurationResponse.newBuilder()
.setOk(true)
.setMessage("unsubscribed_message")
.build();
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.UnsubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.UnsubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(responseEnvelope);
observer.onCompleted();
return null;
}).when(daprStub).unsubscribeConfiguration(any(DaprProtos.UnsubscribeConfigurationRequest.class), any());
UnsubscribeConfigurationResponse
response = client.unsubscribeConfiguration("subscription_id", CONFIG_STORE_NAME).block();
assertTrue(response.getIsUnsubscribed());
assertEquals("unsubscribed_message", response.getMessage());
}
@Test
public void unsubscribeConfigurationTestWithError() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.UnsubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.UnsubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onError(new RuntimeException());
observer.onCompleted();
return null;
}).when(daprStub).unsubscribeConfiguration(any(DaprProtos.UnsubscribeConfigurationRequest.class), any());
assertThrowsDaprException(ExecutionException.class, () -> {
client.unsubscribeConfiguration("subscription_id", CONFIG_STORE_NAME).block();
});
assertThrows(IllegalArgumentException.class, () -> {
client.unsubscribeConfiguration("", CONFIG_STORE_NAME).block();
});
UnsubscribeConfigurationRequest req = new UnsubscribeConfigurationRequest("subscription_id", "");
assertThrows(IllegalArgumentException.class, () -> {
client.unsubscribeConfiguration(req).block();
});
}
private DaprProtos.GetConfigurationResponse getSingleMockResponse() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.GetConfigurationResponse responseEnvelope = DaprProtos.GetConfigurationResponse.newBuilder()
.putAllItems(configs)
.build();
return responseEnvelope;
}
private DaprProtos.GetConfigurationResponse getMultipleMockResponse() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
configs.put("configkey2", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue2")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.GetConfigurationResponse responseEnvelope = DaprProtos.GetConfigurationResponse.newBuilder()
.putAllItems(configs)
.build();
return responseEnvelope;
}
/* If this test is failing, it means that a new value was added to StateOptions.Consistency
* enum, without creating a mapping to one of the proto defined gRPC enums
*/

View File

@ -15,6 +15,7 @@ package io.dapr.client;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.DeleteStateRequest;
import io.dapr.client.domain.GetBulkStateRequest;
import io.dapr.client.domain.GetStateRequest;
@ -23,7 +24,10 @@ import io.dapr.client.domain.InvokeMethodRequest;
import io.dapr.client.domain.PublishEventRequest;
import io.dapr.client.domain.State;
import io.dapr.client.domain.StateOptions;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.TransactionalStateOperation;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.config.Properties;
import io.dapr.exceptions.DaprException;
import io.dapr.serializer.DaprObjectSerializer;
@ -51,6 +55,7 @@ import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import reactor.util.context.ContextView;
@ -58,6 +63,7 @@ import reactor.util.context.ContextView;
import static io.dapr.utils.TestUtils.assertThrowsDaprException;
import static io.dapr.utils.TestUtils.findFreePort;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@ -68,6 +74,8 @@ public class DaprClientHttpTest {
private static final String STATE_STORE_NAME = "MyStateStore";
private static final String CONFIG_STORE_NAME = "MyConfigStore";
private static final String SECRET_STORE_NAME = "MySecretStore";
private final String EXPECTED_RESULT =
@ -1304,6 +1312,120 @@ public class DaprClientHttpTest {
assertEquals("2", secrets.get("two").get("b"));
}
@Test
public void getConfigurationTestErrorScenario() {
assertThrows(IllegalArgumentException.class, () -> {
daprClientHttp.getConfiguration("", "key").block();
});
assertThrows(IllegalArgumentException.class, () -> {
daprClientHttp.getConfiguration(" ", "key").block();
});
}
@Test
public void getConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0/configuration/MyConfigStore")
.param("key","configkey1")
.respond("{\"configkey1\" : {\"value\" : \"configvalue1\",\"version\" : \"1\"}}");
ConfigurationItem ci = daprClientHttp.getConfiguration(CONFIG_STORE_NAME, "configkey1").block();
assertNotNull(ci);
assertEquals("configkey1", ci.getKey());
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void getAllConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0/configuration/MyConfigStore")
.respond("{\"configkey1\" : {\"value\" : \"configvalue1\",\"version\" : \"1\"}}");
ConfigurationItem ci = daprClientHttp.getConfiguration(CONFIG_STORE_NAME, "configkey1").block();
assertNotNull(ci);
assertEquals("configkey1", ci.getKey());
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void subscribeConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0/configuration/MyConfigStore/subscribe")
.param("key", "configkey1")
.respond("{\"id\":\"1234\"}");
Iterator<SubscribeConfigurationResponse> itr = daprClientHttp.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertEquals("1234", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void subscribeAllConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0/configuration/MyConfigStore/subscribe")
.respond("{\"id\":\"1234\"}");
Iterator<SubscribeConfigurationResponse> itr = daprClientHttp.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertEquals("1234", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void unsubscribeConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0/configuration/MyConfigStore/1234/unsubscribe")
.respond("{\"ok\": true}");
UnsubscribeConfigurationResponse res = daprClientHttp.unsubscribeConfiguration("1234", CONFIG_STORE_NAME).block();
assertTrue(res.getIsUnsubscribed());
}
@Test
public void unsubscribeConfigurationTestWithError() {
assertThrows(IllegalArgumentException.class, () -> {
daprClientHttp.unsubscribeConfiguration("", CONFIG_STORE_NAME).block();
});
UnsubscribeConfigurationRequest req = new UnsubscribeConfigurationRequest("subscription_id", "");
assertThrows(IllegalArgumentException.class, () -> {
daprClientHttp.unsubscribeConfiguration(req).block();
});
mockInterceptor.addRule()
.get()
.path("/v1.0/configuration/MyConfigStore/1234/unsubscribe")
.respond("{\"ok\": false, \"message\": \"some error while unsubscribing\"}");
UnsubscribeConfigurationResponse res = daprClientHttp.unsubscribeConfiguration("1234", CONFIG_STORE_NAME).block();
assertFalse(res.getIsUnsubscribed());
}
@Test
public void subscribeConfigurationTestWithError() {
assertThrows(IllegalArgumentException.class, () -> {
daprClientHttp.subscribeConfiguration("", "key1").blockFirst();
});
mockInterceptor.addRule()
.get()
.path("/v1.0/configuration/MyConfigStore/subscribe")
.param("key", "configkey1")
.respond(500);
assertThrows(DaprException.class, () -> {
daprClientHttp.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").blockFirst();
});
}
@Test
public void closeException() {
DaprHttp daprHttp = Mockito.mock(DaprHttp.class);

View File

@ -20,17 +20,12 @@ import com.google.protobuf.ByteString;
import io.dapr.client.domain.BulkPublishRequest;
import io.dapr.client.domain.BulkPublishEntry;
import io.dapr.client.domain.BulkPublishResponse;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.QueryStateItem;
import io.dapr.client.domain.QueryStateRequest;
import io.dapr.client.domain.QueryStateResponse;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.client.domain.query.Query;
import io.dapr.serializer.DaprObjectSerializer;
import io.dapr.serializer.DefaultObjectSerializer;
import io.dapr.v1.CommonProtos;
import io.dapr.v1.DaprGrpc;
import io.dapr.v1.DaprProtos;
import io.grpc.Status;
@ -47,19 +42,15 @@ import reactor.core.publisher.Mono;
import java.io.Closeable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import static io.dapr.utils.TestUtils.assertThrowsDaprException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
@ -72,7 +63,6 @@ import static org.mockito.Mockito.when;
public class DaprPreviewClientGrpcTest {
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String CONFIG_STORE_NAME = "MyConfigStore";
private static final String QUERY_STORE_NAME = "testQueryStore";
private static final String PUBSUB_NAME = "testPubsub";
@ -295,248 +285,6 @@ public class DaprPreviewClientGrpcTest {
Assert.assertEquals("expected no entries to be failed", 0, result.getFailedEntries().size());
}
@Test
public void getConfigurationTestErrorScenario() {
assertThrows(IllegalArgumentException.class, () -> {
previewClient.getConfiguration("", "key").block();
});
}
@Test
public void getSingleConfigurationTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getSingleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfigurationAlpha1(any(DaprProtos.GetConfigurationRequest.class), any());
ConfigurationItem ci = previewClient.getConfiguration(CONFIG_STORE_NAME, "configkey1").block();
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void getSingleConfigurationWithMetadataTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getSingleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfigurationAlpha1(any(DaprProtos.GetConfigurationRequest.class), any());
Map<String, String> reqMetadata = new HashMap<>();
reqMetadata.put("meta1", "value1");
ConfigurationItem ci = previewClient.getConfiguration(CONFIG_STORE_NAME, "configkey1", reqMetadata).block();
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void getMultipleConfigurationTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getMultipleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfigurationAlpha1(any(DaprProtos.GetConfigurationRequest.class), any());
Map<String, ConfigurationItem> cis = previewClient.getConfiguration(CONFIG_STORE_NAME, "configkey1","configkey2").block();
assertEquals(2, cis.size());
assertTrue("configkey1", cis.containsKey("configkey1"));
assertEquals("configvalue1", cis.get("configkey1").getValue());
assertEquals("1", cis.get("configkey1").getVersion());
assertTrue("configkey2", cis.containsKey("configkey2"));
assertEquals("configvalue2", cis.get("configkey2").getValue());
assertEquals("1", cis.get("configkey2").getVersion());
}
@Test
public void getMultipleConfigurationWithMetadataTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.GetConfigurationResponse> observer =
(StreamObserver<DaprProtos.GetConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(getMultipleMockResponse());
observer.onCompleted();
return null;
}).when(daprStub).getConfigurationAlpha1(any(DaprProtos.GetConfigurationRequest.class), any());
Map<String, String> reqMetadata = new HashMap<>();
reqMetadata.put("meta1", "value1");
List<String> keys = Arrays.asList("configkey1","configkey2");
Map<String, ConfigurationItem> cis = previewClient.getConfiguration(CONFIG_STORE_NAME, keys, reqMetadata).block();
assertEquals(2, cis.size());
assertTrue("configkey1", cis.containsKey("configkey1"));
assertEquals("configvalue1", cis.get("configkey1").getValue());
}
@Test
public void subscribeConfigurationTest() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.SubscribeConfigurationResponse responseEnvelope = DaprProtos.SubscribeConfigurationResponse.newBuilder()
.putAllItems(configs)
.setId("subscription_id")
.build();
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.SubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.SubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(responseEnvelope);
observer.onCompleted();
return null;
}).when(daprStub).subscribeConfigurationAlpha1(any(DaprProtos.SubscribeConfigurationRequest.class), any());
Iterator<SubscribeConfigurationResponse> itr = previewClient.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertTrue(res.getItems().containsKey("configkey1"));
assertEquals("subscription_id", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void subscribeConfigurationTestWithMetadata() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.SubscribeConfigurationResponse responseEnvelope = DaprProtos.SubscribeConfigurationResponse.newBuilder()
.putAllItems(configs)
.setId("subscription_id")
.build();
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.SubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.SubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(responseEnvelope);
observer.onCompleted();
return null;
}).when(daprStub).subscribeConfigurationAlpha1(any(DaprProtos.SubscribeConfigurationRequest.class), any());
Map<String, String> reqMetadata = new HashMap<>();
List<String> keys = Arrays.asList("configkey1");
Iterator<SubscribeConfigurationResponse> itr = previewClient.subscribeConfiguration(CONFIG_STORE_NAME, keys, reqMetadata).toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertTrue(res.getItems().containsKey("configkey1"));
assertEquals("subscription_id", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void subscribeConfigurationWithErrorTest() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.SubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.SubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onError(new RuntimeException());
observer.onCompleted();
return null;
}).when(daprStub).subscribeConfigurationAlpha1(any(DaprProtos.SubscribeConfigurationRequest.class), any());
assertThrowsDaprException(ExecutionException.class, () -> {
previewClient.subscribeConfiguration(CONFIG_STORE_NAME, "key").blockFirst();
});
assertThrows(IllegalArgumentException.class, () -> {
previewClient.subscribeConfiguration("", "key").blockFirst();
});
}
@Test
public void unsubscribeConfigurationTest() {
DaprProtos.UnsubscribeConfigurationResponse responseEnvelope = DaprProtos.UnsubscribeConfigurationResponse.newBuilder()
.setOk(true)
.setMessage("unsubscribed_message")
.build();
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.UnsubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.UnsubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onNext(responseEnvelope);
observer.onCompleted();
return null;
}).when(daprStub).unsubscribeConfigurationAlpha1(any(DaprProtos.UnsubscribeConfigurationRequest.class), any());
UnsubscribeConfigurationResponse
response = previewClient.unsubscribeConfiguration("subscription_id", CONFIG_STORE_NAME).block();
assertTrue(response.getIsUnsubscribed());
assertEquals("unsubscribed_message", response.getMessage());
}
@Test
public void unsubscribeConfigurationTestWithError() {
doAnswer((Answer<Void>) invocation -> {
StreamObserver<DaprProtos.UnsubscribeConfigurationResponse> observer =
(StreamObserver<DaprProtos.UnsubscribeConfigurationResponse>) invocation.getArguments()[1];
observer.onError(new RuntimeException());
observer.onCompleted();
return null;
}).when(daprStub).unsubscribeConfigurationAlpha1(any(DaprProtos.UnsubscribeConfigurationRequest.class), any());
assertThrowsDaprException(ExecutionException.class, () -> {
previewClient.unsubscribeConfiguration("subscription_id", CONFIG_STORE_NAME).block();
});
assertThrows(IllegalArgumentException.class, () -> {
previewClient.unsubscribeConfiguration("", CONFIG_STORE_NAME).block();
});
UnsubscribeConfigurationRequest req = new UnsubscribeConfigurationRequest("subscription_id", "");
assertThrows(IllegalArgumentException.class, () -> {
previewClient.unsubscribeConfiguration(req).block();
});
}
private DaprProtos.GetConfigurationResponse getSingleMockResponse() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.GetConfigurationResponse responseEnvelope = DaprProtos.GetConfigurationResponse.newBuilder()
.putAllItems(configs)
.build();
return responseEnvelope;
}
private DaprProtos.GetConfigurationResponse getMultipleMockResponse() {
Map<String, String> metadata = new HashMap<>();
metadata.put("meta1", "value1");
Map<String, CommonProtos.ConfigurationItem> configs = new HashMap<>();
configs.put("configkey1", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue1")
.setVersion("1")
.putAllMetadata(metadata)
.build());
configs.put("configkey2", CommonProtos.ConfigurationItem.newBuilder()
.setValue("configvalue2")
.setVersion("1")
.putAllMetadata(metadata)
.build());
DaprProtos.GetConfigurationResponse responseEnvelope = DaprProtos.GetConfigurationResponse.newBuilder()
.putAllItems(configs)
.build();
return responseEnvelope;
}
@Test
public void queryStateExceptionsTest() {
assertThrows(IllegalArgumentException.class, () -> {

View File

@ -13,15 +13,10 @@ limitations under the License.
package io.dapr.client;
import io.dapr.client.domain.ConfigurationItem;
import io.dapr.client.domain.QueryStateRequest;
import io.dapr.client.domain.QueryStateResponse;
import io.dapr.client.domain.SubscribeConfigurationResponse;
import io.dapr.client.domain.UnsubscribeConfigurationRequest;
import io.dapr.client.domain.UnsubscribeConfigurationResponse;
import io.dapr.client.domain.query.Query;
import io.dapr.config.Properties;
import io.dapr.exceptions.DaprException;
import io.dapr.utils.TypeRef;
import okhttp3.OkHttpClient;
import okhttp3.mock.Behavior;
@ -29,16 +24,12 @@ import okhttp3.mock.MockInterceptor;
import org.junit.Before;
import org.junit.Test;
import java.util.Iterator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class DaprPreviewClientHttpTest {
private static final String CONFIG_STORE_NAME = "MyConfigStore";
private DaprPreviewClient daprPreviewClientHttp;
@ -107,118 +98,4 @@ public class DaprPreviewClientHttpTest {
assertEquals("result must be same", "testData", response.getResults().get(0).getValue());
assertEquals("result must be same", "6f54ad94-dfb9-46f0-a371-e42d550adb7d", response.getResults().get(0).getEtag());
}
@Test
public void getConfigurationTestErrorScenario() {
assertThrows(IllegalArgumentException.class, () -> {
daprPreviewClientHttp.getConfiguration("", "key").block();
});
assertThrows(IllegalArgumentException.class, () -> {
daprPreviewClientHttp.getConfiguration(" ", "key").block();
});
}
@Test
public void getConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0-alpha1/configuration/MyConfigStore")
.param("key","configkey1")
.respond("{\"configkey1\" : {\"value\" : \"configvalue1\",\"version\" : \"1\"}}");
ConfigurationItem ci = daprPreviewClientHttp.getConfiguration(CONFIG_STORE_NAME, "configkey1").block();
assertNotNull(ci);
assertEquals("configkey1", ci.getKey());
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void getAllConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0-alpha1/configuration/MyConfigStore")
.respond("{\"configkey1\" : {\"value\" : \"configvalue1\",\"version\" : \"1\"}}");
ConfigurationItem ci = daprPreviewClientHttp.getConfiguration(CONFIG_STORE_NAME, "configkey1").block();
assertNotNull(ci);
assertEquals("configkey1", ci.getKey());
assertEquals("configvalue1", ci.getValue());
assertEquals("1", ci.getVersion());
}
@Test
public void subscribeConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0-alpha1/configuration/MyConfigStore/subscribe")
.param("key", "configkey1")
.respond("{\"id\":\"1234\"}");
Iterator<SubscribeConfigurationResponse> itr = daprPreviewClientHttp.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertEquals("1234", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void subscribeAllConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0-alpha1/configuration/MyConfigStore/subscribe")
.respond("{\"id\":\"1234\"}");
Iterator<SubscribeConfigurationResponse> itr = daprPreviewClientHttp.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").toIterable().iterator();
assertTrue(itr.hasNext());
SubscribeConfigurationResponse res = itr.next();
assertEquals("1234", res.getSubscriptionId());
assertFalse(itr.hasNext());
}
@Test
public void unsubscribeConfigurationTest() {
mockInterceptor.addRule()
.get()
.path("/v1.0-alpha1/configuration/MyConfigStore/1234/unsubscribe")
.respond("{\"ok\": true}");
UnsubscribeConfigurationResponse res = daprPreviewClientHttp.unsubscribeConfiguration("1234", CONFIG_STORE_NAME).block();
assertTrue(res.getIsUnsubscribed());
}
@Test
public void unsubscribeConfigurationTestWithError() {
assertThrows(IllegalArgumentException.class, () -> {
daprPreviewClientHttp.unsubscribeConfiguration("", CONFIG_STORE_NAME).block();
});
UnsubscribeConfigurationRequest req = new UnsubscribeConfigurationRequest("subscription_id", "");
assertThrows(IllegalArgumentException.class, () -> {
daprPreviewClientHttp.unsubscribeConfiguration(req).block();
});
mockInterceptor.addRule()
.get()
.path("/v1.0-alpha1/configuration/MyConfigStore/1234/unsubscribe")
.respond("{\"ok\": false, \"message\": \"some error while unsubscribing\"}");
UnsubscribeConfigurationResponse res = daprPreviewClientHttp.unsubscribeConfiguration("1234", CONFIG_STORE_NAME).block();
assertFalse(res.getIsUnsubscribed());
}
@Test
public void subscribeConfigurationTestWithError() {
assertThrows(IllegalArgumentException.class, () -> {
daprPreviewClientHttp.subscribeConfiguration("", "key1").blockFirst();
});
mockInterceptor.addRule()
.get()
.path("/v1.0-alpha1/configuration/MyConfigStore/subscribe")
.param("key", "configkey1")
.respond(500);
assertThrows(DaprException.class, () -> {
daprPreviewClientHttp.subscribeConfiguration(CONFIG_STORE_NAME, "configkey1").blockFirst();
});
}
}