]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/msg_types: entity_addrvec_t parse() and operator<<
authorSage Weil <sage@redhat.com>
Wed, 23 May 2018 15:37:18 +0000 (10:37 -0500)
committerSage Weil <sage@redhat.com>
Sun, 27 May 2018 22:26:25 +0000 (17:26 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/msg/msg_types.cc
src/msg/msg_types.h
src/test/test_addrs.cc

index cc706822284afe2f4e19b8915df45588532c7d31..525661e52d9b0ad4f3b183c12f501bea95138cd8 100644 (file)
@@ -220,6 +220,26 @@ ostream& operator<<(ostream& out, const sockaddr *sa)
 
 // entity_addrvec_t
 
+bool entity_addrvec_t::parse(const char *s, const char **end)
+{
+  v.clear();
+  while (*s) {
+    entity_addr_t a;
+    bool r = a.parse(s, end);
+    if (!r) {
+      break;
+    }
+    v.push_back(a);
+    s = *end;
+    while (*s == ',' ||
+          *s == ' ' ||
+          *s == ';') {
+      ++s;
+    }
+  }
+  return !v.empty();
+}
+
 void entity_addrvec_t::encode(bufferlist& bl, uint64_t features) const
 {
   using ceph::encode;
index 8b115affb661cbfa734b90655d8f3ee75d5f4368..ccbcd377f0e6cc4115720e187f70aa0e8844fae4 100644 (file)
@@ -535,10 +535,22 @@ struct entity_addrvec_t {
   unsigned size() const { return v.size(); }
   bool empty() const { return v.empty(); }
 
+  bool parse(const char *s, const char **end = 0);
+
   void encode(bufferlist& bl, uint64_t features) const;
   void decode(bufferlist::const_iterator& bl);
   void dump(Formatter *f) const;
   static void generate_test_instances(list<entity_addrvec_t*>& ls);
+
+  friend ostream& operator<<(ostream& out, const entity_addrvec_t& av) {
+    if (av.v.empty()) {
+      return out;
+    } else if (av.v.size() == 1) {
+      return out << av.v[0];
+    } else {
+      return out << av.v;
+    }
+  }
 };
 WRITE_CLASS_ENCODER_FEATURES(entity_addrvec_t);
 
index 9e672315fb331173e4bb12bf7e0a2ba44090f990..24db6cdd2fa85a61d1f91c03d47ef47fff4fc529 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include "include/types.h"
+#include "include/stringify.h"
 #include "msg/msg_types.h"
 #include "gtest/gtest.h"
 
@@ -237,3 +238,29 @@ TEST(Msgr, TestAddrvecEncodeAddrDecode3)
   ASSERT_NE(addr, addrvec.v[0]); // it's not the first addr(which is non-legacy)
   ASSERT_NE(addr, entity_addr_t(1, 0)); // it's not a blank addr either
 }
+
+const char *addrvec_parse_checks[][3] = {
+  { "127.0.0.1", "127.0.0.1:0/0", "" },
+  { "127.0.0.1 foo", "127.0.0.1:0/0", " foo" },
+  { "127.0.0.1 1.2.3.4 foo", "[127.0.0.1:0/0,1.2.3.4:0/0]", " foo" },
+  { "127.0.0.1 :: - foo", "[127.0.0.1:0/0,[::]:0/0,-]", " foo" },
+  { NULL, NULL, NULL },
+};
+
+TEST(entity_addrvec_t, parse)
+{
+  entity_addrvec_t addrvec;
+
+  for (auto v : { addr_checks, addr_checks2, addrvec_parse_checks }) {
+    for (unsigned i = 0; v[i][0]; ++i) {
+      const char *end = "";
+      addrvec.parse(v[i][0], &end);
+      string out = stringify(addrvec);
+      string left = end;
+      cout << "'" << v[i][0] << "' -> '" << out << "' + '" << left << "'"
+          << std::endl;
+      ASSERT_EQ(out, v[i][1]);
+      ASSERT_EQ(left, v[i][2]);
+    }
+  }
+}