return src_obj;
}
+static inline void filter_amz_meta(meta_map_t& dest, const meta_map_t& src) {
+ std::copy_if(src.cbegin(), src.cend(),
+ std::inserter(dest, dest.end()),
+ [](const auto& m) {
+ return (boost::algorithm::starts_with(m.first, RGW_AMZ_META_PREFIX));
+ });
+}
+
+
static inline void metadata_from_attributes(
reservation_t& res, rgw::sal::Object* obj) {
auto& metadata = res.x_meta_map;
if (!filter.s3_filter.metadata_filter.kv.empty()) {
// metadata filter exists
if (res.s) {
- res.x_meta_map = res.s->info.x_meta_map;
+ filter_amz_meta(res.x_meta_map, res.s->info.x_meta_map);
}
metadata_from_attributes(res, obj);
if (!match(filter.s3_filter.metadata_filter, res.x_meta_map)) {
object(_object), src_object(_src_object), bucket(_s->bucket.get()),
object_name(_object_name),
tagset(_s->tagset),
- x_meta_map(_s->info.x_meta_map),
metadata_fetched_from_attributes(false),
user_id(_s->user->get_id().id),
user_tenant(_s->user->get_id().tenant),
req_id(_s->req_id),
yield(y)
-{}
+{
+ filter_amz_meta(x_meta_map, _s->info.x_meta_map);
+}
reservation_t::reservation_t(const DoutPrefixProvider* _dpp,
rgw::sal::RadosStore* _store,
log.error(events)
assert False, err
+META_PREFIX = 'x-amz-meta-'
+
def verify_s3_records_by_elements(records, keys, exact_match=False, deletions=False, expected_sizes={}, etags=[]):
""" verify there is at least one record per element """
err = ''
#assert_equal(key.etag[1:-1], record['s3']['object']['eTag'])
if etags:
assert_in(key.etag[1:-1], etags)
+ if len(record['s3']['object']['metadata']) > 0:
+ for meta in record['s3']['object']['metadata']:
+ assert(meta['key'].startswith(META_PREFIX))
if deletions and record['eventName'].startswith('ObjectRemoved'):
key_found = True
object_size = record['s3']['object']['size']
assert_equal(key.etag, record['s3']['object']['eTag'])
if etags:
assert_in(key.etag[1:-1], etags)
+ if len(record['s3']['object']['metadata']) > 0:
+ for meta in record['s3']['object']['metadata']:
+ assert(meta['key'].startswith(META_PREFIX))
if deletions and record['eventName'].startswith('ObjectRemoved'):
key_found = True
object_size = record['s3']['object']['size']
# delete the bucket
conn.delete_bucket(bucket_name)
-META_PREFIX = 'x-amz-meta-'
-
@attr('amqp_test')
def test_ps_s3_metadata_filter_on_master():
""" test s3 notification of metadata on master """
notification_name = bucket_name + NOTIFICATION_SUFFIX
meta_key = 'meta1'
meta_value = 'This is my metadata value'
- meta_prefix = 'x-amz-meta-'
+ meta_prefix = META_PREFIX
topic_conf_list = [{'Id': notification_name, 'TopicArn': topic_arn,
'Events': ['s3:ObjectCreated:*', 's3:ObjectRemoved:*'],
}]