// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #include "rgw_common.h" #include "rgw_rados.h" #include "rgw_log.h" #include "rgw_acl.h" #include "rgw_acl_s3.h" #include "rgw_cache.h" #include "common/Formatter.h" static string shadow_ns = RGW_OBJ_NS_SHADOW; static void init_bucket(rgw_bucket *b, const char *t, const char *n, const char *dp, const char *ip, const char *m, const char *id) { b->tenant = t; b->name = n; b->marker = m; b->bucket_id = id; b->explicit_placement.data_pool = rgw_pool(dp); b->explicit_placement.index_pool = rgw_pool(ip); } void RGWObjManifestPart::generate_test_instances(std::list& o) { o.push_back(new RGWObjManifestPart); RGWObjManifestPart *p = new RGWObjManifestPart; rgw_bucket b; init_bucket(&b, "tenant", "bucket", ".pool", ".index_pool", "marker_", "12"); p->loc = rgw_obj(b, "object"); p->loc_ofs = 512 * 1024; p->size = 128 * 1024; o.push_back(p); } void RGWObjManifest::obj_iterator::seek(uint64_t o) { ofs = o; if (manifest->explicit_objs) { explicit_iter = manifest->objs.upper_bound(ofs); if (explicit_iter != manifest->objs.begin()) { --explicit_iter; } if (ofs >= manifest->obj_size) { ofs = manifest->obj_size; return; } update_explicit_pos(); update_location(); return; } if (o < manifest->get_head_size()) { rule_iter = manifest->rules.begin(); stripe_ofs = 0; stripe_size = manifest->get_head_size(); if (rule_iter != manifest->rules.end()) { cur_part_id = rule_iter->second.start_part_num; cur_override_prefix = rule_iter->second.override_prefix; } update_location(); return; } rule_iter = manifest->rules.upper_bound(ofs); next_rule_iter = rule_iter; if (rule_iter != manifest->rules.begin()) { --rule_iter; } if (rule_iter == manifest->rules.end()) { update_location(); return; } RGWObjManifestRule& rule = rule_iter->second; if (rule.part_size > 0) { cur_part_id = rule.start_part_num + (ofs - rule.start_ofs) / rule.part_size; } else { cur_part_id = rule.start_part_num; } part_ofs = rule.start_ofs + (cur_part_id - rule.start_part_num) * rule.part_size; if (rule.stripe_max_size > 0) { cur_stripe = (ofs - part_ofs) / rule.stripe_max_size; stripe_ofs = part_ofs + cur_stripe * rule.stripe_max_size; if (!cur_part_id && manifest->get_head_size() > 0) { cur_stripe++; } } else { cur_stripe = 0; stripe_ofs = part_ofs; } if (!rule.part_size) { stripe_size = rule.stripe_max_size; stripe_size = MIN(manifest->get_obj_size() - stripe_ofs, stripe_size); } else { uint64_t next = MIN(stripe_ofs + rule.stripe_max_size, part_ofs + rule.part_size); stripe_size = next - stripe_ofs; } cur_override_prefix = rule.override_prefix; update_location(); } void RGWObjManifest::obj_iterator::update_location() { if (manifest->explicit_objs) { location = explicit_iter->second.loc; return; } if (ofs < manifest->get_head_size()) { location = manifest->get_obj(); location.set_placement_rule(manifest->get_head_placement_rule()); return; } manifest->get_implicit_location(cur_part_id, cur_stripe, ofs, &cur_override_prefix, &location); } void RGWObjManifest::obj_iterator::update_explicit_pos() { ofs = explicit_iter->first; stripe_ofs = ofs; map::iterator next_iter = explicit_iter; ++next_iter; if (next_iter != manifest->objs.end()) { stripe_size = next_iter->first - ofs; } else { stripe_size = manifest->obj_size - ofs; } } void RGWObjManifest::generate_test_instances(std::list& o) { RGWObjManifest *m = new RGWObjManifest; for (int i = 0; i<10; i++) { RGWObjManifestPart p; rgw_bucket b; init_bucket(&b, "tenant", "bucket", ".pool", ".index_pool", "marker_", "12"); p.loc = rgw_obj(b, "object"); p.loc_ofs = 0; p.size = 512 * 1024; m->objs[(uint64_t)i * 512 * 1024] = p; } m->obj_size = 5 * 1024 * 1024; o.push_back(m); o.push_back(new RGWObjManifest); } void RGWObjManifest::get_implicit_location(uint64_t cur_part_id, uint64_t cur_stripe, uint64_t ofs, string *override_prefix, rgw_obj_select *location) { rgw_obj loc; string& oid = loc.key.name; string& ns = loc.key.ns; if (!override_prefix || override_prefix->empty()) { oid = prefix; } else { oid = *override_prefix; } if (!cur_part_id) { if (ofs < max_head_size) { location->set_placement_rule(head_placement_rule); *location = obj; return; } else { char buf[16]; snprintf(buf, sizeof(buf), "%d", (int)cur_stripe); oid += buf; ns = shadow_ns; } } else { char buf[32]; if (cur_stripe == 0) { snprintf(buf, sizeof(buf), ".%d", (int)cur_part_id); oid += buf; ns= RGW_OBJ_NS_MULTIPART; } else { snprintf(buf, sizeof(buf), ".%d_%d", (int)cur_part_id, (int)cur_stripe); oid += buf; ns = shadow_ns; } } if (!tail_placement.bucket.name.empty()) { loc.bucket = tail_placement.bucket; } else { loc.bucket = obj.bucket; } // Always overwrite instance with tail_instance // to get the right shadow object location loc.key.set_instance(tail_instance); location->set_placement_rule(tail_placement.placement_rule); *location = loc; } void rgw_log_entry::generate_test_instances(list& o) { rgw_log_entry *e = new rgw_log_entry; e->object_owner = "object_owner"; e->bucket_owner = "bucket_owner"; e->bucket = "bucket"; e->remote_addr = "1.2.3.4"; e->user = "user"; e->obj = rgw_obj_key("obj"); e->uri = "http://uri/bucket/obj"; e->http_status = "200"; e->error_code = "error_code"; e->bytes_sent = 1024; e->bytes_received = 512; e->obj_size = 2048; e->user_agent = "user_agent"; e->referrer = "referrer"; e->bucket_id = "10"; o.push_back(e); o.push_back(new rgw_log_entry); } void ACLPermission::generate_test_instances(list& o) { ACLPermission *p = new ACLPermission; p->set_permissions(RGW_PERM_WRITE_ACP); o.push_back(p); o.push_back(new ACLPermission); } void ACLGranteeType::generate_test_instances(list& o) { ACLGranteeType *t = new ACLGranteeType; t->set(ACL_TYPE_CANON_USER); o.push_back(t); o.push_back(new ACLGranteeType); } /* the following is copied here from rgw_acl_s3.cc, to avoid having to have excessive linking with everything it needs */ #define RGW_URI_ALL_USERS "http://acs.amazonaws.com/groups/global/AllUsers" #define RGW_URI_AUTH_USERS "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" static string rgw_uri_all_users = RGW_URI_ALL_USERS; static string rgw_uri_auth_users = RGW_URI_AUTH_USERS; ACLGroupTypeEnum ACLGrant::uri_to_group(string& uri) { // this is required for backward compatibility return ACLGrant_S3::uri_to_group(uri); } ACLGroupTypeEnum ACLGrant_S3::uri_to_group(string& uri) { if (uri.compare(rgw_uri_all_users) == 0) return ACL_GROUP_ALL_USERS; else if (uri.compare(rgw_uri_auth_users) == 0) return ACL_GROUP_AUTHENTICATED_USERS; return ACL_GROUP_NONE; } void ACLGrant::generate_test_instances(list& o) { rgw_user id("rgw"); string name, email; name = "Mr. RGW"; email = "r@gw"; ACLGrant *g1 = new ACLGrant; g1->set_canon(id, name, RGW_PERM_READ); g1->email = email; o.push_back(g1); ACLGrant *g2 = new ACLGrant; g1->set_group(ACL_GROUP_AUTHENTICATED_USERS, RGW_PERM_WRITE); o.push_back(g2); o.push_back(new ACLGrant); } void RGWAccessControlList::generate_test_instances(list& o) { RGWAccessControlList *acl = new RGWAccessControlList(NULL); list glist; list::iterator iter; ACLGrant::generate_test_instances(glist); for (iter = glist.begin(); iter != glist.end(); ++iter) { ACLGrant *grant = *iter; acl->add_grant(grant); delete grant; } o.push_back(acl); o.push_back(new RGWAccessControlList(NULL)); } void ACLOwner::generate_test_instances(list& o) { ACLOwner *owner = new ACLOwner; owner->id = "rgw"; owner->display_name = "Mr. RGW"; o.push_back(owner); o.push_back(new ACLOwner); } void RGWAccessControlPolicy::generate_test_instances(list& o) { list acl_list; list::iterator iter; for (iter = acl_list.begin(); iter != acl_list.end(); ++iter) { RGWAccessControlList::generate_test_instances(acl_list); iter = acl_list.begin(); RGWAccessControlPolicy *p = new RGWAccessControlPolicy(NULL); RGWAccessControlList *l = *iter; p->acl = *l; string name = "radosgw"; rgw_user id("rgw"); p->owner.set_name(name); p->owner.set_id(id); o.push_back(p); delete l; } o.push_back(new RGWAccessControlPolicy(NULL)); } void ObjectMetaInfo::generate_test_instances(list& o) { ObjectMetaInfo *m = new ObjectMetaInfo; m->size = 1024 * 1024; o.push_back(m); o.push_back(new ObjectMetaInfo); } void ObjectCacheInfo::generate_test_instances(list& o) { ObjectCacheInfo *i = new ObjectCacheInfo; i->status = 0; i->flags = CACHE_FLAG_MODIFY_XATTRS; string s = "this is a string"; string s2 = "this is a another string"; bufferlist data, data2; ::encode(s, data); ::encode(s2, data2); i->data = data; i->xattrs["x1"] = data; i->xattrs["x2"] = data2; i->rm_xattrs["r2"] = data2; i->rm_xattrs["r3"] = data; i->meta.size = 512 * 1024; o.push_back(i); o.push_back(new ObjectCacheInfo); } void RGWCacheNotifyInfo::generate_test_instances(list& o) { o.push_back(new RGWCacheNotifyInfo); } void RGWAccessKey::generate_test_instances(list& o) { RGWAccessKey *k = new RGWAccessKey; k->id = "id"; k->key = "key"; k->subuser = "subuser"; o.push_back(k); o.push_back(new RGWAccessKey); } void RGWSubUser::generate_test_instances(list& o) { RGWSubUser *u = new RGWSubUser; u->name = "name"; u->perm_mask = 0xf; o.push_back(u); o.push_back(new RGWSubUser); } void RGWUserInfo::generate_test_instances(list& o) { RGWUserInfo *i = new RGWUserInfo; i->auid = 1; i->user_id = "user_id"; i->display_name = "display_name"; i->user_email = "user@email"; RGWAccessKey k1, k2; k1.id = "id1"; k1.key = "key1"; k2.id = "id2"; k2.subuser = "subuser"; RGWSubUser u; u.name = "id2"; u.perm_mask = 0x1; i->access_keys[k1.id] = k1; i->swift_keys[k2.id] = k2; i->subusers[u.name] = u; o.push_back(i); o.push_back(new RGWUserInfo); } void rgw_bucket::generate_test_instances(list& o) { rgw_bucket *b = new rgw_bucket; init_bucket(b, "tenant", "name", "pool", ".index_pool", "marker", "123"); o.push_back(b); o.push_back(new rgw_bucket); } void RGWBucketInfo::generate_test_instances(list& o) { RGWBucketInfo *i = new RGWBucketInfo; init_bucket(&i->bucket, "tenant", "bucket", "pool", ".index_pool", "marker", "10"); i->owner = "owner"; i->flags = BUCKET_SUSPENDED; o.push_back(i); o.push_back(new RGWBucketInfo); } void RGWZoneGroup::generate_test_instances(list& o) { RGWZoneGroup *r = new RGWZoneGroup; o.push_back(r); o.push_back(new RGWZoneGroup); } void RGWZone::generate_test_instances(list &o) { RGWZone *z = new RGWZone; o.push_back(z); o.push_back(new RGWZone); } void RGWZoneParams::generate_test_instances(list &o) { o.push_back(new RGWZoneParams); o.push_back(new RGWZoneParams); } void RGWOLHInfo::generate_test_instances(list &o) { RGWOLHInfo *olh = new RGWOLHInfo; olh->removed = false; o.push_back(olh); o.push_back(new RGWOLHInfo); } void RGWBucketEnt::generate_test_instances(list& o) { RGWBucketEnt *e = new RGWBucketEnt; init_bucket(&e->bucket, "tenant", "bucket", "pool", ".index_pool", "marker", "10"); e->size = 1024; e->size_rounded = 4096; e->count = 1; o.push_back(e); o.push_back(new RGWBucketEnt); } void RGWUploadPartInfo::generate_test_instances(list& o) { RGWUploadPartInfo *i = new RGWUploadPartInfo; i->num = 1; i->size = 10 * 1024 * 1024; i->etag = "etag"; o.push_back(i); o.push_back(new RGWUploadPartInfo); } void rgw_obj::generate_test_instances(list& o) { rgw_bucket b; init_bucket(&b, "tenant", "bucket", "pool", ".index_pool", "marker", "10"); rgw_obj *obj = new rgw_obj(b, "object"); o.push_back(obj); o.push_back(new rgw_obj); }