From 66f9be45baf610cd25705eed2c7ee9c68b447afa Mon Sep 17 00:00:00 2001 From: lampayan Date: Tue, 7 Jun 2016 14:46:40 +0200 Subject: [PATCH] Crude DeleteV3, version 2 backward compatibility, implementation --- etcd/Client.hpp | 5 ++ etcd/DeleteRpcResponse.h | 28 ++++++++++ etcd/Value.hpp | 1 + src/CMakeLists.txt | 2 +- src/Client.cpp | 110 +++++++++++++++++++++++++++++++++++--- src/DeleteRpcResponse.cpp | 40 ++++++++++++++ src/Response.cpp | 2 - tst/EtcdTest.cpp | 87 +++++++++++++++++------------- 8 files changed, 227 insertions(+), 48 deletions(-) create mode 100644 etcd/DeleteRpcResponse.h create mode 100644 src/DeleteRpcResponse.cpp diff --git a/etcd/Client.hpp b/etcd/Client.hpp index 76dcd43..60ca4d3 100644 --- a/etcd/Client.hpp +++ b/etcd/Client.hpp @@ -42,7 +42,11 @@ namespace etcd */ pplx::task set(std::string const & key, std::string const & value); + /** + * FBDL temporary set and get items to etcd v3 + */ void setv3(std::string const&, std::string const&); + void getv3(std::string const&); /** * Creates a new key and sets it's value. Fails if the key already exists. @@ -139,6 +143,7 @@ namespace etcd pplx::task send_get_request(web::http::uri_builder & uri); pplx::task send_del_request(web::http::uri_builder & uri); pplx::task send_put_request(web::http::uri_builder & uri, std::string const & key, std::string const & value); + pplx::task removeEntry(std::string const &); web::http::client::http_client client; diff --git a/etcd/DeleteRpcResponse.h b/etcd/DeleteRpcResponse.h new file mode 100644 index 0000000..a6a2e39 --- /dev/null +++ b/etcd/DeleteRpcResponse.h @@ -0,0 +1,28 @@ +/* + * DeleteRpcResponse.h + * + * Created on: Jun 5, 2016 + * Author: ubuntu + */ + +#ifndef SRC_DELETERPCRESPONSE_H_ +#define SRC_DELETERPCRESPONSE_H_ + +#include "etcd/Response.hpp" +#include "proto/rpc.grpc.pb.h" + +namespace etcd { +class DeleteRpcResponse : public etcd::Response, public etcd::Value { +public: + DeleteRpcResponse(); + virtual ~DeleteRpcResponse(); + void fillUpV2ResponseValues(etcdserverpb::RangeResponse); + + etcdserverpb::DeleteRangeResponse deleteResponse; + grpc::Status status; + grpc::ClientContext context; + grpc::CompletionQueue completionQueue; + std::unique_ptr> rpcInstance; +}; +} +#endif /* SRC_DELETERPCRESPONSE_H_ */ diff --git a/etcd/Value.hpp b/etcd/Value.hpp index ec28dce..c39a4f3 100644 --- a/etcd/Value.hpp +++ b/etcd/Value.hpp @@ -41,6 +41,7 @@ namespace etcd protected: friend class Response; + friend class DeleteRpcResponse; Value(); Value(web::json::value const & json_value); std::string _key; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 86b607d..24468d3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(etcd-cpp-api SHARED ../proto/kv.pb.cc ../proto/auth.pb.cc ../proto/rpc.pb.cc ../proto/rpc.grpc.pb.cc Client.cpp Response.cpp Value.cpp json_constants.cpp) +add_library(etcd-cpp-api SHARED ../proto/kv.pb.cc ../proto/auth.pb.cc ../proto/rpc.pb.cc ../proto/rpc.grpc.pb.cc Client.cpp Response.cpp Value.cpp json_constants.cpp DeleteRpcResponse.cpp) set_property(TARGET etcd-cpp-api PROPERTY CXX_STANDARD 11) target_link_libraries(etcd-cpp-api ${CPPREST_LIB} boost_system ssl crypto protobuf grpc++) diff --git a/src/Client.cpp b/src/Client.cpp index 758d26c..5b25335 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -1,6 +1,7 @@ #include "etcd/Client.hpp" #include +#include "etcd/DeleteRpcResponse.h" etcd::Client::Client(std::string const & address) : client(address) @@ -97,16 +98,107 @@ pplx::task etcd::Client::modify_if(std::string const & key, std: return send_put_request(uri, "value", value); } +pplx::task etcd::Client::removeEntry(std::string const & entryKey) { + + etcd::DeleteRpcResponse *drp = new etcd::DeleteRpcResponse(); + + //get muna + std::cout<<"blocking call for get rpc first " << entryKey << std::endl; + etcdserverpb::RangeRequest rangeRequest; + rangeRequest.set_key(entryKey); + + etcdserverpb::RangeResponse rangeResponse; + grpc::ClientContext context; + + grpc::Status status = stub_->Range(&context, rangeRequest, &rangeResponse); + + std::cout << "checking status" << std::endl; + if(status.ok()) { + std::cout << "get OK" << std::endl; + std::cout << "size: " << rangeResponse.kvs_size() << std::endl; + std::cout << "kvs 0 key: " << rangeResponse.kvs(0).key() << std::endl; + std::cout << "kvs 0 value: " << rangeResponse.kvs(0).value() << std::endl; + std::cout << "kvs.Get 0 value: " << rangeResponse.kvs().Get(0).value() << std::endl; + + drp->fillUpV2ResponseValues(rangeResponse); + std::cout << "this drp object has now a previous value of: " << drp->as_string() << std::endl; + std::cout << "checking for check" << std::endl; + std::cout << "resp.prev_value().as_string: " << drp->prev_value().as_string() << std::endl; + std::cout << "resp.action(): " << drp->action() << std::endl; + } + else { + std::cout << "get NOK" << std::endl; + } + + + + //then delete + std::cout << "removing etcd v3 entry naman" << std::endl; + + etcdserverpb::DeleteRangeRequest deleteRangeRequest; + deleteRangeRequest.set_key(entryKey); + + drp->rpcInstance = stub_->AsyncDeleteRange(&drp->context, deleteRangeRequest, &drp->completionQueue); + drp->rpcInstance->Finish(&drp->deleteResponse, &drp->status, (void*)drp); + + return pplx::task([drp]() + { + std::cout << "doing delete v3 entry task" << std::endl; + void* got_tag; + bool ok = false; + etcd::Response resp; + + drp->completionQueue.Next(&got_tag, &ok); + GPR_ASSERT(got_tag == (void*)drp); + GPR_ASSERT(ok); + + etcd::DeleteRpcResponse* deleteResponse = static_cast(got_tag); + + if (deleteResponse->status.ok()){ + std::cout << "doing delete v3 entry task OK" << std::endl; + resp = *drp; //simply stripping off the response part + } + else + std::cout << "doing delete v3 entry task NOK" << std::endl; + delete deleteResponse; + std::cout << "delete done, returning" << std::endl; + return resp; + } + ); +} + + + +void etcd::Client::getv3(std::string const & key) { + std::cout<<"blocking call for get rpc " << key << std::endl; + etcdserverpb::RangeRequest rangeRequest; + rangeRequest.set_key(key); + + etcdserverpb::RangeResponse rangeResponse; + grpc::ClientContext context; + + grpc::Status status = stub_->Range(&context, rangeRequest, &rangeResponse); + + std::cout << "checking status" << std::endl; + if(status.ok()) { + std::cout << "get OK" << std::endl; + std::cout << "size: " << rangeResponse.kvs_size() << std::endl; + std::cout << "kvs 0 key: " << rangeResponse.kvs(0).key() << std::endl; + std::cout << "kvs 0 value: " << rangeResponse.kvs(0).value() << std::endl; + std::cout << "kvs.Get 0 value: " << rangeResponse.kvs().Get(0).value() << std::endl; + + DeleteRpcResponse drp; + drp.fillUpV2ResponseValues(rangeResponse); + } + else { + std::cout << "get NOK" << std::endl; + } +} + pplx::task etcd::Client::rm(std::string const & key) { - std::cout << "FBDL: rm is invoked" << std::endl; - web::http::uri_builder uri("/v2/keys" + key); // /v2/keys/test/key1 - std::cout << "FBDL url: " << uri.to_string() << std::endl; - - uri.append_query("dir=false"); // /v2/keys/test/key1?dir=false - std::cout << "FBDL url after append query: " << uri.to_string() << std::endl; - - return Response::create(client.request("DELETE", uri.to_string())); + std::cout << "FBDL: handling rm for key: " << key << std::endl; + return removeEntry(key); } pplx::task etcd::Client::rm_if(std::string const & key, std::string const & old_value) @@ -165,3 +257,5 @@ pplx::task etcd::Client::watch(std::string const & key, int from uri.append_query("recursive=true"); return send_get_request(uri); } + + diff --git a/src/DeleteRpcResponse.cpp b/src/DeleteRpcResponse.cpp new file mode 100644 index 0000000..c74c560 --- /dev/null +++ b/src/DeleteRpcResponse.cpp @@ -0,0 +1,40 @@ +/* + * DeleteRpcResponse.cpp + * + * Created on: Jun 5, 2016 + * Author: ubuntu + */ + +#include "etcd/DeleteRpcResponse.h" +#include + +etcd::DeleteRpcResponse::DeleteRpcResponse() { + // TODO Auto-generated constructor stub + +} + +etcd::DeleteRpcResponse::~DeleteRpcResponse() { + // TODO Auto-generated destructor stub + std::cout << "destroyinh delete response" << std::endl; +} + +//prototype in handling the response object +void etcd::DeleteRpcResponse::fillUpV2ResponseValues(etcdserverpb::RangeResponse getResponse) { + std::cout << "inside fillup attempting fillupv2 response values" << std::endl; + + std::cout << "setting the value of: " << getResponse.kvs().Get(0).value() << std::endl; + _prev_value.value = getResponse.kvs().Get(0).value(); + _action = "delete"; + +// //the experiments done on how to fill up the field of this object. +// //access the fields na protected sa Value +// this->Value::value = "yeah"; +// std::cout << "pre contents: " << this->_value.as_string() << std::endl; +// +// //or create an instance here and return it filled up +// DeleteRpcResponse r; +// r.Value::value = "yo!"; +// this->_value = r; //strip off value part +// +// std::cout << "contents: " << this->_value.as_string() << std::endl; +} diff --git a/src/Response.cpp b/src/Response.cpp index 664da73..5045909 100644 --- a/src/Response.cpp +++ b/src/Response.cpp @@ -5,11 +5,9 @@ pplx::task etcd::Response::create(pplx::task response_task) { - std::cout << "FBDL Response create" << std::endl; return pplx::task ( [response_task]() { - std::cout << "FBDL inside response task" << std::endl; auto json_task = response_task.get().extract_json(); return etcd::Response(response_task.get(), json_task.get()); } diff --git a/tst/EtcdTest.cpp b/tst/EtcdTest.cpp index a3411b2..514d909 100644 --- a/tst/EtcdTest.cpp +++ b/tst/EtcdTest.cpp @@ -43,6 +43,7 @@ TEST_CASE("simplified read") { etcd::Client etcd("http://127.0.0.1:4001"); CHECK("42" == etcd.get("/test/key1").get().value().as_string()); + std::cout << "get error code kahit success: " << etcd.get("/test/key1").get().error_code() << std::endl; CHECK(100 == etcd.get("/test/key2").get().error_code()); // Key not found } @@ -56,29 +57,41 @@ TEST_CASE("modify a key") CHECK("43" == etcd.modify("/test/key1", "42").get().prev_value().as_string()); } -TEST_CASE("set a key") -{ - etcd::Client etcd("http://127.0.0.1:4001"); - etcd::Response resp = etcd.set("/test/key1", "43").get(); - REQUIRE(0 == resp.error_code()); // overwrite - CHECK("set" == resp.action()); - CHECK(0 == etcd.set("/test/key2", "43").get().error_code()); // create new - CHECK("43" == etcd.set("/test/key2", "44").get().prev_value().as_string()); - CHECK("" == etcd.set("/test/key3", "44").get().prev_value().as_string()); - CHECK(102 == etcd.set("/test", "42").get().error_code()); // Not a file -} +//TEST_CASE("set a key") +//{ +// etcd::Client etcd("http://127.0.0.1:4001"); +// etcd::Response resp = etcd.set("/test/key1", "43").get(); +// REQUIRE(0 == resp.error_code()); // overwrite +// CHECK("set" == resp.action()); +// CHECK(0 == etcd.set("/test/key2", "43").get().error_code()); // create new +// CHECK("43" == etcd.set("/test/key2", "44").get().prev_value().as_string()); +// CHECK("" == etcd.set("/test/key3", "44").get().prev_value().as_string()); +// CHECK(102 == etcd.set("/test", "42").get().error_code()); // Not a file +//} +// +//FBDL rm naman +//TEST_CASE("delete a value") +//{ +// std::cout << "FBDL do a delete via rm only" < res = etcd.watch("/test/key1"); -// CHECK(!res.is_done()); -// sleep(1); -// CHECK(!res.is_done()); -// CHECK("42" == etcd.get("/test/key1").get().value().as_string()); +//TEST_CASE("FBDL wait for a value change") +//{ +// std::cout << "FBDL wait for a value change" << std::endl; +// etcd::Client etcd("http://127.0.0.1:4001"); +//// etcd.set("/test/key1", "42").wait(); +// etcd.setv3("test/key1", "42"); // -// etcd.set("/test/key1", "43").get(); -// sleep(1); -// REQUIRE(res.is_done()); -// REQUIRE("set" == res.get().action()); -// CHECK("43" == res.get().value().as_string()); -// CHECK("43" == etcd.get("/test/key1").get().value().as_string()); -} +//// pplx::task res = etcd.watch("/test/key1"); +//// CHECK(!res.is_done()); +//// sleep(1); +//// CHECK(!res.is_done()); +//// CHECK("42" == etcd.get("/test/key1").get().value().as_string()); +//// +//// etcd.set("/test/key1", "43").get(); +//// sleep(1); +//// REQUIRE(res.is_done()); +//// REQUIRE("set" == res.get().action()); +//// CHECK("43" == res.get().value().as_string()); +//// CHECK("43" == etcd.get("/test/key1").get().value().as_string()); +//} TEST_CASE("wait for a directory change") {