From 55a2b887a557818aca22af6c33913b760df5e846 Mon Sep 17 00:00:00 2001 From: Tom Flynn Date: Mon, 8 Jun 2020 19:26:36 -0700 Subject: [PATCH] Rename TupleData/TupleDataSet to OvsdbValue/OvsdbValues Populate array types in local store Signed-off-by: Tom Flynn --- agent-ovs/ovs/JsonRpc.cpp | 162 +++++++++---------- agent-ovs/ovs/OvsdbConnection.cpp | 39 +++-- agent-ovs/ovs/OvsdbTransactMessage.cpp | 73 +++------ agent-ovs/ovs/include/OvsdbMessage.h | 72 ++++++--- agent-ovs/ovs/include/OvsdbState.h | 2 +- agent-ovs/ovs/include/OvsdbTransactMessage.h | 14 +- agent-ovs/ovs/test/NetFlowRenderer_test.cpp | 2 +- agent-ovs/ovs/test/SpanRenderer_test.cpp | 2 +- 8 files changed, 184 insertions(+), 182 deletions(-) diff --git a/agent-ovs/ovs/JsonRpc.cpp b/agent-ovs/ovs/JsonRpc.cpp index edb7e975f..4f2e9cdd4 100644 --- a/agent-ovs/ovs/JsonRpc.cpp +++ b/agent-ovs/ovs/JsonRpc.cpp @@ -32,37 +32,37 @@ void JsonRpc::handleTransaction(uint64_t reqId, const Document& payload_) { } void JsonRpc::createNetFlow(const string& brUuid, const string& target, const int& timeout, bool addidtointerface ) { - vector tuples; - tuples.emplace_back("", target); - TupleDataSet tdSet(tuples); + vector values; + values.emplace_back(target); + OvsdbValues tdSet(values); OvsdbTransactMessage msg1(OvsdbOperation::INSERT, OvsdbTable::NETFLOW); msg1.rowData["targets"] = tdSet; - tuples.clear(); - tuples.emplace_back("", timeout); - TupleDataSet tdSet2(tuples); + values.clear(); + values.emplace_back(timeout); + OvsdbValues tdSet2(values); msg1.rowData["active_timeout"] = tdSet2; - tuples.clear(); - tuples.emplace_back("", addidtointerface); - TupleDataSet tdSet3(tuples); + values.clear(); + values.emplace_back(addidtointerface); + OvsdbValues tdSet3(values); msg1.rowData["add_id_to_interface"] = tdSet3; const string uuid_name = "netflow1"; - msg1.kvPairs.emplace_back("uuid-name", uuid_name); + msg1.externalKey = make_pair("uuid-name", uuid_name); OvsdbTransactMessage msg2(OvsdbOperation::UPDATE, OvsdbTable::BRIDGE); set> condSet; condSet.emplace("_uuid", OvsdbFunction::EQ, brUuid); msg2.conditions = condSet; - tuples.clear(); - tuples.emplace_back("named-uuid", uuid_name); - TupleDataSet tdSet4(tuples); + values.clear(); + values.emplace_back("named-uuid", uuid_name); + OvsdbValues tdSet4(values); msg2.rowData.emplace("netflow", tdSet4); // make sure there is no ipfix config - tuples.clear(); - TupleDataSet emptySet(tuples, "set"); + values.clear(); + OvsdbValues emptySet("set", values); msg2.rowData.emplace("ipfix", emptySet); const list requests = {msg1, msg2}; @@ -70,38 +70,38 @@ void JsonRpc::createNetFlow(const string& brUuid, const string& target, const in } void JsonRpc::createIpfix(const string& brUuid, const string& target, const int& sampling) { - vector tuples; - tuples.emplace_back("", target); - TupleDataSet tdSet(tuples); + vector values; + values.emplace_back(target); + OvsdbValues tdSet(values); OvsdbTransactMessage msg1(OvsdbOperation::INSERT, OvsdbTable::IPFIX); msg1.rowData.emplace("targets", tdSet); if (sampling != 0) { - tuples.clear(); - tuples.emplace_back("", sampling); - TupleDataSet tdSet2(tuples); + values.clear(); + values.emplace_back(sampling); + OvsdbValues tdSet2(values); msg1.rowData.emplace("sampling", tdSet2); } - tuples.clear(); + values.clear(); static const string enabled("true"); - tuples.emplace_back("enable-tunnel-sampling", enabled); - TupleDataSet tdSet3(tuples, "map"); + values.emplace_back("enable-tunnel-sampling", enabled); + OvsdbValues tdSet3("map", values); msg1.rowData.emplace("other_config", tdSet3); const string uuid_name = "ipfix1"; - msg1.kvPairs.emplace_back("uuid-name", uuid_name); + msg1.externalKey = make_pair("uuid-name", uuid_name); OvsdbTransactMessage msg2(OvsdbOperation::UPDATE, OvsdbTable::BRIDGE); set> condSet; condSet.emplace("_uuid", OvsdbFunction::EQ, brUuid); msg2.conditions = condSet; - tuples.clear(); - tuples.emplace_back("named-uuid", uuid_name); - TupleDataSet tdSet4(tuples); + values.clear(); + values.emplace_back("named-uuid", uuid_name); + OvsdbValues tdSet4(values); msg2.rowData.emplace("ipfix", tdSet4); // make sure there is no netflow config - tuples.clear(); - TupleDataSet emptySet(tuples, "set"); + values.clear(); + OvsdbValues emptySet("set", values); msg2.rowData.emplace("netflow", emptySet); const list requests = {msg1, msg2}; @@ -114,8 +114,8 @@ void JsonRpc::deleteNetFlow(const string& brName) { condSet.emplace("name", OvsdbFunction::EQ, brName); msg.conditions = condSet; - vector tuples; - TupleDataSet tdSet(tuples, "set"); + vector values; + OvsdbValues tdSet("set", values); msg.rowData.emplace("netflow", tdSet); list msgs = {msg}; @@ -128,8 +128,8 @@ void JsonRpc::deleteIpfix(const string& brName) { condSet.emplace("name", OvsdbFunction::EQ, brName); msg.conditions = condSet; - vector tuples; - TupleDataSet tdSet(tuples, "set"); + vector values; + OvsdbValues tdSet("set", values); msg.rowData.emplace("ipfix", tdSet); const list requests = {msg}; @@ -142,9 +142,9 @@ bool JsonRpc::updateBridgePorts(const string& brName, const string& portUuid, bo condSet.emplace("name", OvsdbFunction::EQ, brName); msg1.conditions = condSet; - vector tuples; - tuples.emplace_back("uuid", portUuid); - TupleDataSet tdSet = TupleDataSet(tuples); + vector values; + values.emplace_back("uuid", portUuid); + OvsdbValues tdSet = OvsdbValues(values); msg1.mutateRowData.emplace("ports", std::make_pair(addToList ? OvsdbOperation::INSERT : OvsdbOperation::DELETE, tdSet)); LOG(DEBUG) << (addToList ? "inserting " : "deleting ") << portUuid; const list requests = {msg1}; @@ -400,59 +400,59 @@ bool JsonRpc::createMirror(const string& brUuid, const string& name, const set tuples; + vector values; // src ports set> rdata; populatePortUuids(srcPorts, portUuidMap, rdata); - tuples.reserve(rdata.size()); + values.reserve(rdata.size()); for (auto pair : rdata) { LOG(INFO) << "entry " << get<0>(pair).c_str() << " - " << get<1>(pair).c_str(); const string val = get<1>(pair); - tuples.emplace_back(get<0>(pair).c_str(), val); + values.emplace_back(get<0>(pair).c_str(), val); } - LOG(INFO) << "mirror src_port size " << tuples.size(); - TupleDataSet tdSet(tuples, "set"); + LOG(INFO) << "mirror src_port size " << values.size(); + OvsdbValues tdSet("set", values); msg1.rowData.emplace("select_src_port", tdSet); // dst ports rdata.clear(); - tuples.clear(); + values.clear(); populatePortUuids(dstPorts, portUuidMap, rdata); for (auto pair : rdata) { LOG(INFO) << "entry " << get<0>(pair).c_str() << " - " << get<1>(pair).c_str(); const string val = get<1>(pair); - tuples.emplace_back(get<0>(pair).c_str(), val); + values.emplace_back(get<0>(pair).c_str(), val); } - LOG(INFO) << "mirror dst_port size " << tuples.size(); - TupleDataSet tdSet2(tuples, "set"); + LOG(INFO) << "mirror dst_port size " << values.size(); + OvsdbValues tdSet2("set", values); msg1.rowData.emplace("select_dst_port", tdSet2); // output ports string outputPortUuid = portUuidMap[ERSPAN_PORT_PREFIX + name]; LOG(WARNING) << "output port uuid " << outputPortUuid; - tuples.clear(); - tuples.emplace_back("uuid", outputPortUuid); - TupleDataSet tdSet3(tuples); + values.clear(); + values.emplace_back("uuid", outputPortUuid); + OvsdbValues tdSet3(values); msg1.rowData.emplace("output_port", tdSet3); // name - tuples.clear(); - tuples.emplace_back("", name); - TupleDataSet tdSet4(tuples); + values.clear(); + values.emplace_back(name); + OvsdbValues tdSet4(values); msg1.rowData.emplace("name", tdSet4); const string uuid_name = "mirror1"; - msg1.kvPairs.emplace_back("uuid-name", uuid_name); + msg1.externalKey = make_pair("uuid-name", uuid_name); // msg2 - tuples.clear(); + values.clear(); OvsdbTransactMessage msg2(OvsdbOperation::MUTATE, OvsdbTable::BRIDGE); set> condSet; condSet.emplace("_uuid", OvsdbFunction::EQ, brUuid); msg2.conditions = condSet; - tuples.emplace_back("named-uuid", uuid_name); - TupleDataSet tdSet5(tuples); + values.emplace_back("named-uuid", uuid_name); + OvsdbValues tdSet5(values); msg2.mutateRowData.emplace("mirrors", std::make_pair(OvsdbOperation::INSERT, tdSet5)); const list requests = {msg1, msg2}; @@ -465,50 +465,50 @@ bool JsonRpc::createMirror(const string& brUuid, const string& name, const set tuples; - tuples.emplace_back("", params.getPortName()); - TupleDataSet tdSet(tuples); + vector values; + values.emplace_back(params.getPortName()); + OvsdbValues tdSet(values); msg1.rowData.emplace("name", tdSet); // uuid-name const string uuid_name = "port1"; - msg1.kvPairs.emplace_back("uuid-name", uuid_name); + msg1.externalKey = make_pair("uuid-name", uuid_name); // interfaces - tuples.clear(); + values.clear(); const string named_uuid = "interface1"; - tuples.emplace_back("named-uuid", named_uuid); - TupleDataSet tdSet2(tuples); + values.emplace_back("named-uuid", named_uuid); + OvsdbValues tdSet2(values); msg1.rowData.emplace("interfaces", tdSet2); // uuid-name OvsdbTransactMessage msg2(OvsdbOperation::INSERT, OvsdbTable::INTERFACE); - msg2.kvPairs.emplace_back("uuid-name", named_uuid); + msg2.externalKey = make_pair("uuid-name", named_uuid); // row entries // name - tuples.clear(); - tuples.emplace_back("", params.getPortName()); - TupleDataSet tdSet3(tuples); + values.clear(); + values.emplace_back(params.getPortName()); + OvsdbValues tdSet3(values); msg2.rowData.emplace("name", tdSet3); - tuples.clear(); + values.clear(); const string typeString("erspan"); - TupleData typeData("", typeString); - tuples.push_back(typeData); - TupleDataSet tdSet4(tuples); + OvsdbValue typeData(typeString); + values.push_back(typeData); + OvsdbValues tdSet4(values); msg2.rowData.emplace("type", tdSet4); - tuples.clear(); - tuples.emplace_back("erspan_ver", std::to_string(params.getVersion())); - tuples.emplace_back("remote_ip", params.getRemoteIp()); - TupleDataSet tdSet5(tuples, "map"); + values.clear(); + values.emplace_back("erspan_ver", std::to_string(params.getVersion())); + values.emplace_back("remote_ip", params.getRemoteIp()); + OvsdbValues tdSet5("map", values); msg2.rowData.emplace("options", tdSet5); OvsdbTransactMessage msg3(OvsdbOperation::MUTATE, OvsdbTable::BRIDGE); - tuples.clear(); - tuples.emplace_back("named-uuid", uuid_name); - TupleDataSet tdSet6(tuples); + values.clear(); + values.emplace_back("named-uuid", uuid_name); + OvsdbValues tdSet6(values); msg3.mutateRowData.emplace("ports", std::make_pair(OvsdbOperation::INSERT, tdSet6)); set> condSet; condSet.emplace("name", OvsdbFunction::EQ, bridgeName); @@ -545,9 +545,9 @@ bool JsonRpc::deleteMirror(const string& brName, const string& sessionName) { condSet.emplace("name", OvsdbFunction::EQ, brName); msg.conditions = condSet; - vector tuples; - tuples.emplace_back("uuid", sessionUuid); - TupleDataSet tdSet = TupleDataSet(tuples); + vector values; + values.emplace_back("uuid", sessionUuid); + OvsdbValues tdSet = OvsdbValues(values); msg.mutateRowData.emplace("mirrors", std::make_pair(OvsdbOperation::DELETE, tdSet)); list requests = {msg}; diff --git a/agent-ovs/ovs/OvsdbConnection.cpp b/agent-ovs/ovs/OvsdbConnection.cpp index c10e1bb2d..94c59f8e4 100644 --- a/agent-ovs/ovs/OvsdbConnection.cpp +++ b/agent-ovs/ovs/OvsdbConnection.cpp @@ -192,7 +192,7 @@ void OvsdbConnection::handleTransactionError(uint64_t reqId, const Document& pay } } -void populateValues(const Value& value, map& values) { +void populateValues(const Value& value, string& type, map& values) { assert(value.IsArray()); if (value.GetArray().Size() == 2) { if (value[0].IsString()) { @@ -200,6 +200,7 @@ void populateValues(const Value& value, map& values) { if (arrayType == "uuid" && value[1].IsString()) { values[value[1].GetString()]; } else if (arrayType == "set" && value[1].IsArray()) { + type = arrayType; for (Value::ConstValueIterator memberItr = value[1].GetArray().Begin(); memberItr != value[1].GetArray().End(); ++memberItr) { if (memberItr->IsArray()) { @@ -213,6 +214,7 @@ void populateValues(const Value& value, map& values) { } } } else if (arrayType == "map") { + type = arrayType; for (Value::ConstValueIterator memberItr = value[1].GetArray().Begin(); memberItr != value[1].GetArray().End(); ++memberItr) { if (memberItr->IsArray()) { @@ -260,16 +262,19 @@ bool processRowUpdate(const Value& value, OvsdbRowDetails& rowDetails) { const std::string propName = propItr->name.GetString(); if (propItr->value.IsString()) { std::string stringValue = propItr->value.GetString(); - rowDetails[propName] = TupleData("", stringValue); + rowDetails[propName] = OvsdbValue(stringValue); } else if (propItr->value.IsArray()) { map items; - populateValues(propItr->value, items); + string type; + populateValues(propItr->value, type, items); + opflexagent::Dtype dataType = type.empty() ? opflexagent::Dtype::STRING : (type == "map" ? Dtype::MAP : Dtype::SET); + rowDetails[propName] = OvsdbValue(dataType, type, items); } else if (propItr->value.IsInt()) { int intValue = propItr->value.GetInt(); - rowDetails[propName] = TupleData("", intValue); + rowDetails[propName] = OvsdbValue(intValue); } else if (propItr->value.IsBool()) { bool boolValue = propItr->value.GetBool(); - rowDetails[propName] = TupleData("", boolValue); + rowDetails[propName] = OvsdbValue(boolValue); } } } @@ -292,7 +297,7 @@ void OvsdbConnection::handleMonitor(uint64_t reqId, const Document& payload) { if (itr->name.IsString() && itr->value.IsObject()) { OvsdbRowDetails rowDetails; std::string uuid = itr->name.GetString(); - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); std::string bridgeName; processRowUpdate(itr->value, rowDetails); if (rowDetails.find("name") != rowDetails.end()) { @@ -314,7 +319,7 @@ void OvsdbConnection::handleMonitor(uint64_t reqId, const Document& payload) { if (itr->name.IsString() && itr->value.IsObject()) { std::string uuid = itr->name.GetString(); OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); processRowUpdate(itr->value, rowDetails); tableState[uuid] = rowDetails; } @@ -329,7 +334,7 @@ void OvsdbConnection::handleMonitor(uint64_t reqId, const Document& payload) { if (itr->name.IsString() && itr->value.IsObject()) { std::string uuid = itr->name.GetString(); OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); processRowUpdate(itr->value, rowDetails); tableState[uuid] = rowDetails; } @@ -344,7 +349,7 @@ void OvsdbConnection::handleMonitor(uint64_t reqId, const Document& payload) { if (itr->name.IsString() && itr->value.IsObject()) { std::string uuid = itr->name.GetString(); OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); processRowUpdate(itr->value, rowDetails); tableState[uuid] = rowDetails; } @@ -359,7 +364,7 @@ void OvsdbConnection::handleMonitor(uint64_t reqId, const Document& payload) { if (itr->name.IsString() && itr->value.IsObject()) { OvsdbRowDetails rowDetails; std::string uuid = itr->name.GetString(); - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); processRowUpdate(itr->value, rowDetails); tableState[uuid] = rowDetails; } @@ -374,7 +379,7 @@ void OvsdbConnection::handleMonitor(uint64_t reqId, const Document& payload) { if (itr->name.IsString() && itr->value.IsObject()) { OvsdbRowDetails rowDetails; std::string uuid = itr->name.GetString(); - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); processRowUpdate(itr->value, rowDetails); tableState[uuid] = rowDetails; } @@ -415,7 +420,7 @@ void OvsdbConnection::handleUpdate(const Document& payload) { string rowUuid = itr->name.GetString(); LOG(WARNING) << "bridge uuid " << rowUuid; OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", rowUuid); + rowDetails["uuid"] = OvsdbValue(rowUuid); bool addRow = processRowUpdate(itr->value, rowDetails); if (addRow) { LOG(WARNING) << "received updated row for bridge " << rowUuid; @@ -435,7 +440,7 @@ void OvsdbConnection::handleUpdate(const Document& payload) { string rowUuid = itr->name.GetString(); LOG(WARNING) << "mirror uuid " << rowUuid; OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", rowUuid); + rowDetails["uuid"] = OvsdbValue(rowUuid); bool addRow = processRowUpdate(itr->value, rowDetails); if (addRow) { LOG(WARNING) << "received updated row for mirror " << rowUuid; @@ -456,7 +461,7 @@ void OvsdbConnection::handleUpdate(const Document& payload) { string rowUuid = itr->name.GetString(); LOG(WARNING) << "ipfix uuid " << rowUuid; OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", rowUuid); + rowDetails["uuid"] = OvsdbValue(rowUuid); bool addRow = processRowUpdate(itr->value, rowDetails); if (addRow) { LOG(WARNING) << "received updated row for ipfix " << rowUuid; @@ -477,7 +482,7 @@ void OvsdbConnection::handleUpdate(const Document& payload) { string rowUuid = itr->name.GetString(); LOG(WARNING) << "netflow uuid " << rowUuid; OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", rowUuid); + rowDetails["uuid"] = OvsdbValue(rowUuid); bool addRow = processRowUpdate(itr->value, rowDetails); if (addRow) { LOG(WARNING) << "received updated row for netflow " << rowUuid; @@ -498,7 +503,7 @@ void OvsdbConnection::handleUpdate(const Document& payload) { string rowUuid = itr->name.GetString(); LOG(WARNING) << "port uuid " << rowUuid; OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", rowUuid); + rowDetails["uuid"] = OvsdbValue(rowUuid); bool addRow = processRowUpdate(itr->value, rowDetails); if (addRow) { LOG(WARNING) << "received updated row for port " << rowUuid; @@ -518,7 +523,7 @@ void OvsdbConnection::handleUpdate(const Document& payload) { string rowUuid = itr->name.GetString(); LOG(WARNING) << "interface uuid " << rowUuid; OvsdbRowDetails rowDetails; - rowDetails["uuid"] = TupleData("", rowUuid); + rowDetails["uuid"] = OvsdbValue(rowUuid); bool addRow = processRowUpdate(itr->value, rowDetails); if (addRow) { LOG(WARNING) << "received updated row for interface " << rowUuid; diff --git a/agent-ovs/ovs/OvsdbTransactMessage.cpp b/agent-ovs/ovs/OvsdbTransactMessage.cpp index d1996cda8..be66d2b06 100644 --- a/agent-ovs/ovs/OvsdbTransactMessage.cpp +++ b/agent-ovs/ovs/OvsdbTransactMessage.cpp @@ -19,58 +19,28 @@ namespace opflexagent { -void writePair(yajr::rpc::SendHandler& writer, const TupleData& bPtr, bool kvPair) { - const string& key = bPtr.getKey(); - if (bPtr.getType() == Dtype::INTEGER) { - if (kvPair) { - writer.String(key.c_str()); - writer.Int(bPtr.getIntValue()); - } else { - if (!key.empty()) { - writer.StartArray(); - writer.String(key.c_str()); - } - writer.Int(bPtr.getIntValue()); - if (!key.empty()) { - writer.EndArray(); - } - } - } else if (bPtr.getType() == Dtype::STRING) { - if (kvPair) { - writer.String(key.c_str()); - writer.String(bPtr.getStringValue().c_str()); - } else { - if (!key.empty()) { - writer.StartArray(); - writer.String(key.c_str()); - } - writer.String(bPtr.getStringValue().c_str()); - if (!key.empty()) { - writer.EndArray(); - } +void writeValue(yajr::rpc::SendHandler& writer, const OvsdbValue& value) { + if (value.getType() == Dtype::INTEGER) { + writer.Int(value.getIntValue()); + } else if (value.getType() == Dtype::STRING) { + if (!value.getKey().empty()) { + writer.StartArray(); + writer.String(value.getKey().c_str()); } - } else if (bPtr.getType() == Dtype::BOOL) { - if (kvPair) { - writer.String(key.c_str()); - writer.Bool(bPtr.getBoolValue()); - } else { - if (!key.empty()) { - writer.StartArray(); - writer.String(key.c_str()); - } - writer.Bool(bPtr.getBoolValue()); - if (!key.empty()) { - writer.EndArray(); - } + writer.String(value.getStringValue().c_str()); + if (!value.getKey().empty()) { + writer.EndArray(); } + } else if (value.getType() == Dtype::BOOL) { + writer.Bool(value.getBoolValue()); } } bool OvsdbTransactMessage::operator()(yajr::rpc::SendHandler& writer) const { - for (auto& pair : kvPairs) { - writePair(writer, pair, true); + if (!externalKey.first.empty()) { + writer.String(externalKey.first.c_str()); + writer.String(externalKey.second.c_str()); } - if (getOperation() != OvsdbOperation::INSERT) { writer.String("where"); writer.StartArray(); @@ -115,20 +85,19 @@ bool OvsdbTransactMessage::operator()(yajr::rpc::SendHandler& writer) const { string col = rowEntry.first; LOG(DEBUG) << "row label " << col; writer.String(col.c_str()); - const TupleDataSet& tdsPtr = rowEntry.second; + const OvsdbValues& tdsPtr = rowEntry.second; if (!tdsPtr.label.empty()) { writer.StartArray(); writer.String(tdsPtr.label.c_str()); writer.StartArray(); LOG(DEBUG) << "label " << tdsPtr.label; - - for (auto& val : tdsPtr.tuples) { - writePair(writer, val, false); + for (auto& val : tdsPtr.values) { + writeValue(writer, val); } writer.EndArray(); writer.EndArray(); } else { - writePair(writer, *(tdsPtr.tuples.begin()), false); + writeValue(writer, *(tdsPtr.values.begin())); } } writer.EndObject(); @@ -143,8 +112,8 @@ bool OvsdbTransactMessage::operator()(yajr::rpc::SendHandler& writer) const { writer.String(col.c_str()); string mutateRowOperation = toString(rowEntry.second.first); writer.String(mutateRowOperation.c_str()); - const TupleDataSet &tdsPtr = rowEntry.second.second; - writePair(writer, *(tdsPtr.tuples.begin()), false); + const OvsdbValues &tdsPtr = rowEntry.second.second; + writeValue(writer, *(tdsPtr.values.begin())); writer.EndArray(); } writer.EndArray(); diff --git a/agent-ovs/ovs/include/OvsdbMessage.h b/agent-ovs/ovs/include/OvsdbMessage.h index 4cd8f5ef3..1489292dd 100644 --- a/agent-ovs/ovs/include/OvsdbMessage.h +++ b/agent-ovs/ovs/include/OvsdbMessage.h @@ -108,55 +108,69 @@ class OvsdbMessage : public JsonRpcMessage { /** * enum for data types to be sent over JSON/RPC */ -enum class Dtype {STRING, INTEGER, BOOL}; +enum class Dtype {STRING, INTEGER, BOOL, SET, MAP}; /** - * Class to represent JSON/RPC tuple data. + * Class to represent an OVSDB value */ -class TupleData { +class OvsdbValue { public: - TupleData() : type(Dtype::STRING), iVal(-1), bVal(false) {} + /** Default constructor */ + OvsdbValue() : type(Dtype::STRING), iVal(-1), bVal(false) {} + /** * constructor - * @param key_ the key string * @param val value */ - TupleData(const std::string& key_, const std::string& val) : key(key_), type(Dtype::STRING), sVal(val), iVal(-1), bVal(false) {} + OvsdbValue(const std::string& val) : type(Dtype::STRING), sVal(val), iVal(-1), bVal(false) {} /** * constructor * @param key_ the key string * @param val value */ - TupleData(const std::string& key_, bool val) : key(key_), type(Dtype::BOOL), iVal(-1), bVal(val) {} + OvsdbValue(const std::string& key_, const std::string& val) : key(key_), type(Dtype::STRING), sVal(val), iVal(-1), bVal(false) {} + + /** + * constructor + * @param val value + */ + OvsdbValue(bool val) : type(Dtype::BOOL), iVal(-1), bVal(val) {} + + /** + * constructor + * @param val value + */ + OvsdbValue(int val) : type(Dtype::INTEGER), iVal(val), bVal(false) {} + /** * constructor * @param key_ the key string * @param val value */ - TupleData(const std::string& key_, int val) : key(key_), type(Dtype::INTEGER), iVal(val), bVal(false) {} + OvsdbValue(Dtype type_, const std::string& key_, const std::map& val) : key(key_), type(type_), iVal(-1), bVal(false), collection(val) {} /** * Copy constructor * * @param copy Object to copy from */ - TupleData(const TupleData& copy) : key(copy.key), type(copy.type), sVal(copy.sVal), iVal(copy.iVal), bVal(copy.bVal) {} + OvsdbValue(const OvsdbValue& copy) : key(copy.key), type(copy.type), sVal(copy.sVal), iVal(copy.iVal), bVal(copy.bVal), collection(copy.collection) {} /** * Assignment operator */ - TupleData& operator=(const TupleData& rhs) = default; + OvsdbValue& operator=(const OvsdbValue& rhs) = default; /** * Move operator */ - TupleData& operator=(TupleData&&) = default; + OvsdbValue& operator=(OvsdbValue&&) = default; /** * Destructor */ - virtual ~TupleData() {} + virtual ~OvsdbValue() {} /** Get key */ const std::string& getKey() const { @@ -192,48 +206,62 @@ class TupleData { return iVal; } + /** + * Get the value when set to a collection type + * @return collection by value + */ + std::map getCollectionValue() const { + return collection; + } + private: std::string key; Dtype type; std::string sVal; int iVal; bool bVal; + std::map collection; }; /** - * class for representing JSON/RPC tuple data set + * class for representing OVSDB values */ -class TupleDataSet { +class OvsdbValues { public: /** * Default constructor */ - TupleDataSet() {} + OvsdbValues() {} /** * Copy constructor */ - TupleDataSet(const TupleDataSet& s) : label(s.label), tuples(s.tuples) {} + OvsdbValues(const OvsdbValues& s) : label(s.label), values(s.values) {} + + /** + * constructor that takes a label and set of values + */ + OvsdbValues(const std::string& l, const std::vector& m) : label(l), values(m) {} /** - * constructor that takes a tuple + * constructor that takes a set of values */ - TupleDataSet(const std::vector& m, std::string l = "") : label(l), tuples(m) {} + OvsdbValues(const std::vector& m) : values(m) {} /** * Assignment operator */ - TupleDataSet& operator=(TupleDataSet& rhs) = default; + OvsdbValues& operator=(OvsdbValues& rhs) = default; - virtual ~TupleDataSet() {} + virtual ~OvsdbValues() {} /** - * label for collection type, viz. map, set + * label if this is a collection type */ std::string label; /** * tuple data */ - std::vector tuples; + std::vector values; }; } diff --git a/agent-ovs/ovs/include/OvsdbState.h b/agent-ovs/ovs/include/OvsdbState.h index 3c4d89a05..ada5e9455 100644 --- a/agent-ovs/ovs/include/OvsdbState.h +++ b/agent-ovs/ovs/include/OvsdbState.h @@ -27,7 +27,7 @@ using std::unique_lock; using std::unordered_map; /** Contents of a row in an OVSDB table */ -typedef unordered_map OvsdbRowDetails; +typedef unordered_map OvsdbRowDetails; /** Contents of an OVSDB table */ typedef unordered_map OvsdbTableDetails; diff --git a/agent-ovs/ovs/include/OvsdbTransactMessage.h b/agent-ovs/ovs/include/OvsdbTransactMessage.h index 380b900d0..dfdf2d6da 100644 --- a/agent-ovs/ovs/include/OvsdbTransactMessage.h +++ b/agent-ovs/ovs/include/OvsdbTransactMessage.h @@ -40,8 +40,8 @@ class OvsdbTransactMessage : public OvsdbMessage { * Copy constructor */ OvsdbTransactMessage(const OvsdbTransactMessage& copy) : OvsdbMessage("transact", REQUEST), - conditions(copy.conditions), columns(copy.columns), rowData(copy.rowData), mutateRowData(copy.mutateRowData), kvPairs(copy.kvPairs), - operation(copy.getOperation()), table(copy.getTable()) {} + conditions(copy.conditions), columns(copy.columns), rowData(copy.rowData), mutateRowData(copy.mutateRowData), + externalKey(copy.externalKey), operation(copy.getOperation()), table(copy.getTable()) {} /** * Assignment operator @@ -85,15 +85,15 @@ class OvsdbTransactMessage : public OvsdbMessage { /** * map of row data */ - unordered_map rowData; + unordered_map rowData; /** * mutate row data */ - unordered_map> mutateRowData; + unordered_map> mutateRowData; /** - * key value pairs + * generated key name to value */ - vector kvPairs; + pair externalKey; private: OvsdbOperation operation; @@ -128,7 +128,7 @@ class TransactReq : public OvsdbMessage { virtual bool operator()(yajr::rpc::SendHandler& writer) const { writer.StartArray(); writer.String("Open_vSwitch"); - for (auto tr : transList) { + for (auto& tr : transList) { writer.StartObject(); tr.serializePayload(writer); writer.EndObject(); diff --git a/agent-ovs/ovs/test/NetFlowRenderer_test.cpp b/agent-ovs/ovs/test/NetFlowRenderer_test.cpp index 431c4e898..c4f9a1e86 100644 --- a/agent-ovs/ovs/test/NetFlowRenderer_test.cpp +++ b/agent-ovs/ovs/test/NetFlowRenderer_test.cpp @@ -36,7 +36,7 @@ class NetFlowRendererFixture : public BaseFixture { // simulate results of monitor OvsdbRowDetails rowDetails; std::string uuid = " 9b7295f4-07a8-41ac-a681-e0ee82560262"; - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); OvsdbTableDetails tableDetails; tableDetails["br-int"] = rowDetails; conn->getOvsdbState().fullUpdate(OvsdbTable::BRIDGE, tableDetails); diff --git a/agent-ovs/ovs/test/SpanRenderer_test.cpp b/agent-ovs/ovs/test/SpanRenderer_test.cpp index 6b7d4cc22..9b6decc56 100644 --- a/agent-ovs/ovs/test/SpanRenderer_test.cpp +++ b/agent-ovs/ovs/test/SpanRenderer_test.cpp @@ -37,7 +37,7 @@ class SpanRendererFixture : public BaseFixture { // simulate results of monitor OvsdbRowDetails rowDetails; std::string uuid = " 9b7295f4-07a8-41ac-a681-e0ee82560262"; - rowDetails["uuid"] = TupleData("", uuid); + rowDetails["uuid"] = OvsdbValue(uuid); OvsdbTableDetails tableDetails; tableDetails["br-int"] = rowDetails; conn->getOvsdbState().fullUpdate(OvsdbTable::BRIDGE, tableDetails);