]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: radosgw-admin bucket list --bucket lists bucket objects
authorYehuda Sadeh <yehuda@inktank.com>
Tue, 16 Apr 2013 05:49:26 +0000 (22:49 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 8 May 2013 17:57:46 +0000 (10:57 -0700)
Also lists tag for each object.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/cls/rgw/cls_rgw.cc
src/cls/rgw/cls_rgw_types.cc
src/cls/rgw/cls_rgw_types.h
src/rgw/rgw_admin.cc
src/rgw/rgw_common.h
src/rgw/rgw_json_enc.cc
src/rgw/rgw_op.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_swift.cc

index ad2ab155346589bacc0c226fb88dd96e81265c89..461e40a662a3ac1baf321dfc8c29e130c75c344e 100644 (file)
@@ -572,6 +572,7 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist
       entry.meta = meta;
       entry.name = op.name;
       entry.exists = true;
+      entry.tag = op.tag;
       stats.num_entries++;
       stats.total_size += meta.size;
       stats.total_size_rounded += get_rounded_size(meta.size);
index 07098be86817ab29e41303b36509dedbbaa9d1cd..e2b7a07f165ab7ec06527945497c3bc195940e7b 100644 (file)
@@ -27,7 +27,6 @@ void rgw_bucket_dir_entry_meta::generate_test_instances(list<rgw_bucket_dir_entr
   m->etag = "etag";
   m->owner = "owner";
   m->owner_display_name = "display name";
-  m->tag = "tag";
   m->content_type = "content/type";
   o.push_back(m);
   o.push_back(new rgw_bucket_dir_entry_meta);
@@ -41,7 +40,6 @@ void rgw_bucket_dir_entry_meta::dump(Formatter *f) const
   f->dump_string("etag", etag);
   f->dump_string("owner", owner);
   f->dump_string("owner_display_name", owner_display_name);
-  f->dump_string("tag", tag);
   f->dump_string("content_type", content_type);
 }
 
@@ -60,6 +58,7 @@ void rgw_bucket_dir_entry::generate_test_instances(list<rgw_bucket_dir_entry*>&
     e->locator = "locator";
     e->exists = true;
     e->meta = *m;
+    e->tag = "tag";
 
     o.push_back(e);
 
@@ -84,6 +83,7 @@ void rgw_bucket_dir_entry::dump(Formatter *f) const
   f->open_object_section("meta");
   meta.dump(f);
   f->close_section();
+  f->dump_string("tag", tag);
 
   map<string, struct rgw_bucket_pending_info>::const_iterator iter = pending_map.begin();
   f->open_array_section("pending_map");
index 430b1df662ccfc85591c8363f4ba39bb4f8f8b41..3f7abaff857bf6138cae128a4f6257e206ff5a81 100644 (file)
@@ -62,7 +62,6 @@ struct rgw_bucket_dir_entry_meta {
   string etag;
   string owner;
   string owner_display_name;
-  string tag;
   string content_type;
 
   rgw_bucket_dir_entry_meta() :
@@ -143,18 +142,21 @@ void decode_packed_val(T& val, bufferlist::iterator& bl)
         ::decode(v, bl);
         val = v;
       }
+      break;
     case 2:
       {
         uint16_t v;
         ::decode(v, bl);
         val = v;
       }
+      break;
     case 4:
       {
         uint32_t v;
         ::decode(v, bl);
         val = v;
       }
+      break;
     case 8:
       {
         uint64_t v;
@@ -199,9 +201,10 @@ struct rgw_bucket_dir_entry {
   struct rgw_bucket_dir_entry_meta meta;
   map<string, struct rgw_bucket_pending_info> pending_map;
   uint64_t index_ver;
+  string tag;
 
   rgw_bucket_dir_entry() :
-    exists(false) {}
+    exists(false), index_ver(0) {}
 
   void encode(bufferlist &bl) const {
     ENCODE_START(5, 3, bl);
@@ -212,6 +215,7 @@ struct rgw_bucket_dir_entry {
     ::encode(pending_map, bl);
     ::encode(locator, bl);
     ::encode_packed_val(index_ver, bl);
+    ::encode(tag, bl);
     ENCODE_FINISH(bl);
   }
   void decode(bufferlist::iterator &bl) {
@@ -231,6 +235,7 @@ struct rgw_bucket_dir_entry {
     }
     if (struct_v >= 5) {
       ::decode_packed_val(index_ver, bl);
+      ::decode(tag, bl);
     }
     DECODE_FINISH(bl);
   }
index bc876456b487c47cdb35299ff4424ca39c0df0e5..e49dfe97729e29041f793aa6ccf5ffafef81ac66 100644 (file)
@@ -1161,9 +1161,55 @@ int main(int argc, char **argv)
     }
   }
 
-  if (opt_cmd == OPT_BUCKETS_LIST || opt_cmd == OPT_BUCKET_STATS) {
-    if (opt_cmd == OPT_BUCKET_STATS)
-      bucket_op.set_fetch_stats(true);
+  if (opt_cmd == OPT_BUCKETS_LIST) {
+    if (bucket_name.empty()) {
+      RGWBucketAdminOp::info(store, bucket_op, f);
+    } else {
+     int ret = init_bucket(bucket_name, bucket);
+      if (ret < 0) {
+        cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl;
+        return -ret;
+      }
+      formatter->open_array_section("entries");
+      bool truncated;
+      int count = 0;
+      if (max_entries < 0)
+        max_entries = 1000;
+
+      string prefix;
+      string delim;
+      vector<RGWObjEnt> result;
+      map<string, bool> common_prefixes;
+      string ns;
+      
+      do {
+        list<rgw_bi_log_entry> entries;
+        ret = store->list_objects(bucket, max_entries - count, prefix, delim,
+                                  marker, result, common_prefixes, true, ns,
+                                  &truncated, NULL);
+        if (ret < 0) {
+          cerr << "ERROR: store->list_objects(): " << cpp_strerror(-ret) << std::endl;
+          return -ret;
+        }
+
+        count += result.size();
+
+        for (vector<RGWObjEnt>::iterator iter = result.begin(); iter != result.end(); ++iter) {
+          RGWObjEnt& entry = *iter;
+          encode_json("entry", entry, formatter);
+
+          marker = entry.name;
+        }
+        formatter->flush(cout);
+      } while (truncated && count < max_entries);
+
+      formatter->close_section();
+      formatter->flush(cout);
+    }
+  }
+
+  if (opt_cmd == OPT_BUCKET_STATS) {
+    bucket_op.set_fetch_stats(true);
 
     RGWBucketAdminOp::info(store, bucket_op, f);
   }
index b36055334fb3e7cfc93f1e385d718bd819dfeb6b..65401dfc0de968fba8efc3cb397814e9d5bad741 100644 (file)
@@ -661,18 +661,14 @@ struct RGWObjEnt {
   std::string owner;
   std::string owner_display_name;
   uint64_t size;
-  time_t mtime;
+  utime_t mtime;
   string etag;
   string content_type;
+  string tag;
 
-  RGWObjEnt() : size(0), mtime(0) {}
+  RGWObjEnt() : size(0) {}
 
-  void clear() { // not clearing etag
-    name="";
-    size = 0;
-    mtime = 0;
-    content_type="";
-  }
+  void dump(Formatter *f) const;
 };
 
 /** Store basic data on bucket */
index f299f0e64b0c2745b58522e561d51fd693319abf..b376be991b3d83a72f7f0daa3cef67e905a4e681 100644 (file)
@@ -397,6 +397,18 @@ void RGWBucketInfo::dump(Formatter *f) const
   encode_json("flags", flags, f);
 }
 
+void RGWObjEnt::dump(Formatter *f) const
+{
+  encode_json("name", name, f);
+  encode_json("owner", owner, f);
+  encode_json("owner_display_name", owner_display_name, f);
+  encode_json("size", size, f);
+  encode_json("mtime", mtime, f);
+  encode_json("etag", etag, f);
+  encode_json("content_type", content_type, f);
+  encode_json("tag", tag, f);
+}
+
 void RGWBucketEnt::dump(Formatter *f) const
 {
   encode_json("bucket", bucket, f);
index b3e8c86e3f023dcdcd7c88f0b475294e7ac7bbbd..658a611915cb4cc9b10899a27c4fd00be9b11ef8 100644 (file)
@@ -748,12 +748,6 @@ public:
 struct RGWMultipartUploadEntry {
   RGWObjEnt obj;
   RGWMPObj mp;
-
-  void clear() {
-    obj.clear();
-    string empty;
-    mp.init(empty, empty);
-  }
 };
 
 class RGWListBucketMultiparts : public RGWOp {
index f2821f257232aad09f38c999d8d9d2394d211a5d..fe6b291538cf2d4f75e1601e4f852fc8f8c2dc5a 100644 (file)
@@ -4130,6 +4130,7 @@ int RGWRados::cls_bucket_list(rgw_bucket& bucket, string start, string prefix,
     e.owner = dirent.meta.owner;
     e.owner_display_name = dirent.meta.owner_display_name;
     e.content_type = dirent.meta.content_type;
+    e.tag = dirent.tag;
 
     /* oh, that shouldn't happen! */
     if (e.name.empty()) {
@@ -4306,7 +4307,7 @@ int RGWRados::check_disk_state(librados::IoCtx io_ctx,
   ACLOwner owner;
 
   object.size = astate->size;
-  object.mtime = astate->mtime;
+  object.mtime = utime_t(astate->mtime, 0);
 
   map<string, bufferlist>::iterator iter = astate->attrset.find(RGW_ATTR_ETAG);
   if (iter != astate->attrset.end()) {
@@ -4356,7 +4357,7 @@ int RGWRados::check_disk_state(librados::IoCtx io_ctx,
   list_state.meta.etag = etag;
   list_state.meta.content_type = content_type;
   if (astate->obj_tag.length() > 0)
-    list_state.meta.tag = astate->obj_tag.c_str();
+    list_state.tag = astate->obj_tag.c_str();
   list_state.meta.owner = owner.get_id();
   list_state.meta.owner_display_name = owner.get_display_name();
 
index 38fab1bd2c1790f4697f642cd1b2246911af6ba3..2268a2781c83f8adf81c88a48698951b04f05d12 100644 (file)
@@ -237,7 +237,8 @@ void RGWListBucket_ObjStore_S3::send_response()
     for (iter = objs.begin(); iter != objs.end(); ++iter) {
       s->formatter->open_array_section("Contents");
       s->formatter->dump_string("Key", iter->name);
-      dump_time(s, "LastModified", &iter->mtime);
+      time_t mtime = iter->mtime.sec();
+      dump_time(s, "LastModified", &mtime);
       s->formatter->dump_format("ETag", "\"%s\"", iter->etag.c_str());
       s->formatter->dump_int("Size", iter->size);
       s->formatter->dump_string("StorageClass", "STANDARD");
@@ -1461,7 +1462,8 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response()
       dump_owner(s, s->user.user_id, s->user.display_name, "Initiator");
       dump_owner(s, s->user.user_id, s->user.display_name);
       s->formatter->dump_string("StorageClass", "STANDARD");
-      dump_time(s, "Initiated", &iter->obj.mtime);
+      time_t mtime = iter->obj.mtime.sec();
+      dump_time(s, "Initiated", &mtime);
       s->formatter->close_section();
     }
     if (common_prefixes.size() > 0) {
index f656bfb6821e92483dc96886bf0911233cfc7621..051060a5a20075e60128e0dc463ec9e486b14667 100644 (file)
@@ -173,7 +173,8 @@ void RGWListBucket_ObjStore_SWIFT::send_response()
         }
         s->formatter->dump_string("content_type", single_content_type);
       }
-      dump_time(s, "last_modified", &iter->mtime);
+      time_t mtime = iter->mtime.sec();
+      dump_time(s, "last_modified", &mtime);
       s->formatter->close_section();
     }