use of io.etcd.jetcd.kv.TxnResponse in project jetcd by coreos.
the class KVTest method testTxnGetAndDeleteWithPrefix.
@Test
void testTxnGetAndDeleteWithPrefix() throws ExecutionException, InterruptedException {
String prefix = randomString();
ByteSequence sampleKey = bytesOf(prefix);
int numPrefixes = 10;
putKeysWithPrefix(prefix, numPrefixes);
// always false cmp
Cmp cmp = new Cmp(sampleKey, Cmp.Op.EQUAL, CmpTarget.value(bytesOf("not_exists")));
Op.PutOp putOp = Op.put(bytesOf("other_string"), bytesOf("other_value"), PutOption.DEFAULT);
Op.GetOp getByPrefix = Op.get(sampleKey, GetOption.newBuilder().isPrefix(true).build());
Op.DeleteOp delete = Op.delete(sampleKey, DeleteOption.newBuilder().isPrefix(true).withPrevKV(true).build());
TxnResponse txnResponse = kvClient.txn().If(cmp).Then(putOp).Else(getByPrefix, delete).commit().get();
List<GetResponse> getResponse = txnResponse.getGetResponses();
assertThat(getResponse).hasSize(1);
assertThat(getResponse.get(0).getKvs()).hasSize(10);
assertThat(getResponse.get(0).getKvs()).anyMatch(keyValue -> keyValue.getKey().startsWith(sampleKey));
List<DeleteResponse> deleteResponses = txnResponse.getDeleteResponses();
assertThat(deleteResponses).hasSize(1);
assertThat(deleteResponses.get(0).getDeleted()).isEqualTo(10);
assertThat(deleteResponses.get(0).getPrevKvs()).anyMatch(keyValue -> keyValue.getKey().startsWith(sampleKey));
assertThat(txnResponse.getPutResponses()).isEmpty();
}
use of io.etcd.jetcd.kv.TxnResponse in project jetcd by coreos.
the class TxnResponseTest method setUp.
@BeforeEach
public void setUp() {
io.etcd.jetcd.api.TxnResponse response = io.etcd.jetcd.api.TxnResponse.newBuilder().addResponses(ResponseOp.newBuilder().setResponsePut(PutResponse.getDefaultInstance())).addResponses(ResponseOp.newBuilder().setResponseDeleteRange(DeleteRangeResponse.getDefaultInstance())).addResponses(ResponseOp.newBuilder().setResponseRange(RangeResponse.getDefaultInstance())).addResponses(ResponseOp.newBuilder().setResponseTxn(io.etcd.jetcd.api.TxnResponse.getDefaultInstance())).build();
txnResponse = new TxnResponse(response, ByteSequence.EMPTY);
}
use of io.etcd.jetcd.kv.TxnResponse in project jetcd by coreos.
the class KVNamespaceTest method testTxn.
@Test
public void testTxn() throws Exception {
// kvClient without namespace used as the judge for the final result
kvClient = TestUtil.client(cluster).build().getKVClient();
// kvClient with one namespace used to test operations with namespace
ByteSequence namespace = ByteSequence.from(TestUtil.randomByteSequence().concat(ByteSequence.NAMESPACE_DELIMITER).getBytes());
kvClientWithNamespace = TestUtil.client(cluster).namespace(namespace).build().getKVClient();
// put a key in root namespace, assert that it cannot be seen using kvClient with namespace
ByteSequence cmpKey = getNonexistentKey();
putKVWithAssertion(kvClient, cmpKey, TestUtil.randomByteSequence(), null);
ByteSequence key1 = getNonexistentKey();
ByteSequence value1 = TestUtil.randomByteSequence();
putKVWithAssertion(kvClientWithNamespace, key1, value1, null);
ByteSequence key2 = getNonexistentKey();
ByteSequence value2 = TestUtil.randomByteSequence();
putKVWithAssertion(kvClientWithNamespace, key2, value2, null);
// test comparison passes, with put operation.
{
Txn txn = kvClientWithNamespace.txn();
CompletableFuture<TxnResponse> txnFuture = txn.If(new Cmp(cmpKey, Cmp.Op.EQUAL, CmpTarget.version(0))).Then(Op.put(key1, TestUtil.randomByteSequence(), PutOption.newBuilder().withPrevKV().build())).Else(Op.put(key2, TestUtil.randomByteSequence(), PutOption.newBuilder().withPrevKV().build())).commit();
TxnResponse txnResponse = txnFuture.get();
assertThat(txnResponse.getPutResponses().size()).isEqualTo(1);
assertThat(txnResponse.getPutResponses().get(0).hasPrevKv()).isTrue();
assertThat(txnResponse.getPutResponses().get(0).getPrevKv().getKey()).isEqualTo(key1);
assertThat(txnResponse.getPutResponses().get(0).getPrevKv().getValue()).isEqualTo(value1);
}
// test comparison fails, with get operation.
{
Txn txn = kvClientWithNamespace.txn();
CompletableFuture<TxnResponse> txnFuture = txn.If(new Cmp(key1, Cmp.Op.EQUAL, CmpTarget.version(0))).Then(Op.get(key1, GetOption.newBuilder().build())).Else(Op.get(key2, GetOption.newBuilder().build())).commit();
TxnResponse txnResponse = txnFuture.get();
assertThat(txnResponse.getGetResponses().size()).isEqualTo(1);
assertThat(txnResponse.getGetResponses().get(0).getKvs().size()).isEqualTo(1);
assertThat(txnResponse.getGetResponses().get(0).getKvs().get(0).getKey()).isEqualTo(key2);
assertThat(txnResponse.getGetResponses().get(0).getKvs().get(0).getValue()).isEqualTo(value2);
}
// test delete operation
{
Txn txn = kvClientWithNamespace.txn();
CompletableFuture<TxnResponse> txnFuture = txn.If(new Cmp(key1, Cmp.Op.GREATER, CmpTarget.version(0))).Then(Op.delete(key2, DeleteOption.newBuilder().withPrevKV(true).build())).Else(Op.delete(key1, DeleteOption.newBuilder().withPrevKV(true).build())).commit();
TxnResponse txnResponse = txnFuture.get();
assertThat(txnResponse.getDeleteResponses().size()).isEqualTo(1);
assertThat(txnResponse.getDeleteResponses().get(0).getPrevKvs().size()).isEqualTo(1);
assertThat(txnResponse.getDeleteResponses().get(0).getPrevKvs().get(0).getKey()).isEqualTo(key2);
assertThat(txnResponse.getDeleteResponses().get(0).getPrevKvs().get(0).getValue()).isEqualTo(value2);
}
}
use of io.etcd.jetcd.kv.TxnResponse in project jetcd by coreos.
the class KVNamespaceTest method testNestedTxn.
@Test
public void testNestedTxn() throws Exception {
// kvClient without namespace used as the judge for the final result
kvClient = TestUtil.client(cluster).build().getKVClient();
// kvClient with one namespace used to test operations with namespace
ByteSequence namespace = ByteSequence.from(TestUtil.randomByteSequence().concat(ByteSequence.NAMESPACE_DELIMITER).getBytes());
kvClientWithNamespace = TestUtil.client(cluster).namespace(namespace).build().getKVClient();
ByteSequence cmpKey1 = getNonexistentKey();
putKVWithAssertion(kvClient, cmpKey1, TestUtil.randomByteSequence(), null);
ByteSequence cmpKey2 = getNonexistentKey();
putKVWithAssertion(kvClientWithNamespace, cmpKey2, TestUtil.randomByteSequence(), null);
ByteSequence key1 = getNonexistentKey();
ByteSequence value1 = TestUtil.randomByteSequence();
putKVWithAssertion(kvClientWithNamespace, key1, value1, null);
ByteSequence key2 = getNonexistentKey();
ByteSequence value2 = TestUtil.randomByteSequence();
putKVWithAssertion(kvClientWithNamespace, key2, value2, null);
{
Txn txn = kvClientWithNamespace.txn();
ByteSequence nextValue1 = TestUtil.randomByteSequence();
CompletableFuture<TxnResponse> txnFuture = txn.If(new Cmp(cmpKey1, Cmp.Op.EQUAL, CmpTarget.version(0))).Then(Op.txn(new Cmp[] { new Cmp(cmpKey2, Cmp.Op.GREATER, CmpTarget.version(0)) }, new Op[] { Op.put(key1, nextValue1, PutOption.newBuilder().withPrevKV().build()) }, new Op[] { Op.put(key2, TestUtil.randomByteSequence(), PutOption.newBuilder().withPrevKV().build()) })).Else(Op.txn(new Cmp[] { new Cmp(cmpKey2, Cmp.Op.GREATER, CmpTarget.version(0)) }, new Op[] { Op.put(key2, TestUtil.randomByteSequence(), PutOption.newBuilder().withPrevKV().build()) }, new Op[] { Op.put(key1, TestUtil.randomByteSequence(), PutOption.newBuilder().withPrevKV().build()) })).commit();
TxnResponse response = txnFuture.get();
assertThat(response.getTxnResponses().size()).isEqualTo(1);
assertThat(response.getTxnResponses().get(0).getPutResponses().size()).isEqualTo(1);
assertThat(response.getTxnResponses().get(0).getPutResponses().get(0).hasPrevKv()).isTrue();
assertThat(response.getTxnResponses().get(0).getPutResponses().get(0).getPrevKv().getKey()).isEqualTo(key1);
assertThat(response.getTxnResponses().get(0).getPutResponses().get(0).getPrevKv().getValue()).isEqualTo(value1);
value1 = nextValue1;
assertExistentKey(kvClient, ByteSequence.from(namespace.concat(key1).getBytes()), value1);
}
}
Aggregations