Skip to content

Commit d037f40

Browse files
authored
Merge pull request ceph#63089 from smanjara/wip-fix-object-lock-rule
rgw/multisite: sync put-object-lock-configuration
2 parents 0f53297 + c2d2357 commit d037f40

File tree

4 files changed

+78
-12
lines changed

4 files changed

+78
-12
lines changed

src/rgw/rgw_common.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2612,6 +2612,9 @@ void RGWBucketInfo::dump(Formatter *f) const
26122612
if (!empty_sync_policy()) {
26132613
encode_json("sync_policy", *sync_policy, f);
26142614
}
2615+
if (obj_lock_enabled()) {
2616+
encode_json("obj_lock", obj_lock, f);
2617+
}
26152618
}
26162619

26172620
void RGWBucketInfo::decode_json(JSONObj *obj) {
@@ -2655,6 +2658,9 @@ void RGWBucketInfo::decode_json(JSONObj *obj) {
26552658
if (!sp.empty()) {
26562659
set_sync_policy(std::move(sp));
26572660
}
2661+
if (obj_lock_enabled()) {
2662+
JSONDecoder::decode_json("obj_lock", obj_lock, obj);
2663+
}
26582664
}
26592665

26602666
list<RGWUserInfo> RGWUserInfo::generate_test_instances()

src/rgw/rgw_object_lock.cc

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55

66
using namespace std;
77

8+
void DefaultRetention::decode_json(JSONObj *obj) {
9+
JSONDecoder::decode_json("mode", mode, obj);
10+
JSONDecoder::decode_json("days", days, obj);
11+
JSONDecoder::decode_json("years", years, obj);
12+
}
13+
814
void DefaultRetention::decode_xml(XMLObj *obj) {
915
RGWXMLDecoder::decode_xml("Mode", mode, obj, true);
1016
if (mode.compare("GOVERNANCE") != 0 && mode.compare("COMPLIANCE") != 0) {
@@ -18,11 +24,11 @@ void DefaultRetention::decode_xml(XMLObj *obj) {
1824
}
1925

2026
void DefaultRetention::dump(Formatter *f) const {
21-
f->dump_string("mode", mode);
27+
encode_json("mode", mode, f);
2228
if (days > 0) {
23-
f->dump_int("days", days);
29+
encode_json("days", days, f);
2430
} else {
25-
f->dump_int("years", years);
31+
encode_json("years", years, f);
2632
}
2733
}
2834

@@ -35,6 +41,10 @@ void DefaultRetention::dump_xml(Formatter *f) const {
3541
}
3642
}
3743

44+
void ObjectLockRule::decode_json(JSONObj *obj) {
45+
JSONDecoder::decode_json("defaultRetention", defaultRetention, obj);
46+
}
47+
3848
void ObjectLockRule::decode_xml(XMLObj *obj) {
3949
RGWXMLDecoder::decode_xml("DefaultRetention", defaultRetention, obj, true);
4050
}
@@ -44,9 +54,7 @@ void ObjectLockRule::dump_xml(Formatter *f) const {
4454
}
4555

4656
void ObjectLockRule::dump(Formatter *f) const {
47-
f->open_object_section("default_retention");
48-
defaultRetention.dump(f);
49-
f->close_section();
57+
encode_json("defaultRetention", defaultRetention, f);
5058
}
5159

5260
std::list<ObjectLockRule> ObjectLockRule::generate_test_instances() {
@@ -55,6 +63,14 @@ std::list<ObjectLockRule> ObjectLockRule::generate_test_instances() {
5563
return o;
5664
}
5765

66+
void RGWObjectLock::decode_json(JSONObj *obj) {
67+
JSONDecoder::decode_json("enabled", enabled, obj);
68+
JSONDecoder::decode_json("rule_exist", rule_exist, obj);
69+
if (rule_exist) {
70+
JSONDecoder::decode_json("rule", rule, obj);
71+
}
72+
}
73+
5874
void RGWObjectLock::decode_xml(XMLObj *obj) {
5975
string enabled_str;
6076
RGWXMLDecoder::decode_xml("ObjectLockEnabled", enabled_str, obj, true);
@@ -76,12 +92,12 @@ void RGWObjectLock::dump_xml(Formatter *f) const {
7692
}
7793

7894
void RGWObjectLock::dump(Formatter *f) const {
79-
f->dump_bool("enabled", enabled);
80-
f->dump_bool("rule_exist", rule_exist);
95+
if (enabled) {
96+
encode_json("enabled", enabled, f);
97+
}
98+
encode_json("rule_exist", rule_exist, f);
8199
if (rule_exist) {
82-
f->open_object_section("rule");
83-
rule.dump(f);
84-
f->close_section();
100+
encode_json("rule", rule, f);
85101
}
86102
}
87103

src/rgw/rgw_object_lock.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "include/encoding.h"
88
#include "common/ceph_time.h"
99
#include "common/iso_8601.h"
10+
#include "common/ceph_json.h"
1011
#include "rgw_xml.h"
1112

1213
class DefaultRetention
@@ -46,6 +47,8 @@ class DefaultRetention
4647
decode(years, bl);
4748
DECODE_FINISH(bl);
4849
}
50+
51+
void decode_json(JSONObj *obj);
4952
void dump(Formatter *f) const;
5053
void decode_xml(XMLObj *obj);
5154
void dump_xml(Formatter *f) const;
@@ -81,6 +84,7 @@ class ObjectLockRule
8184
DECODE_FINISH(bl);
8285
}
8386

87+
void decode_json(JSONObj *obj);
8488
void decode_xml(XMLObj *obj);
8589
void dump_xml(Formatter *f) const;
8690
void dump(Formatter *f) const;
@@ -141,6 +145,7 @@ class RGWObjectLock
141145
DECODE_FINISH(bl);
142146
}
143147

148+
void decode_json(JSONObj *obj);
144149
void decode_xml(XMLObj *obj);
145150
void dump_xml(Formatter *f) const;
146151
ceph::real_time get_lock_until_date(const ceph::real_time& mtime) const;

src/test/rgw/rgw_multi/tests.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6075,4 +6075,43 @@ def test_copy_obj_perm_check_between_zonegroups(zonegroup):
60756075
Bucket=dest_bucket.name,
60766076
CopySource={'Bucket': source_bucket.name, 'Key': objname},
60776077
Key=objname)
6078-
assert e.response['Error']['Code'] == 'AccessDenied'
6078+
assert e.response['Error']['Code'] == 'AccessDenied'
6079+
6080+
6081+
def test_object_lock_sync():
6082+
6083+
zonegroup = realm.master_zonegroup()
6084+
zonegroup_conns = ZonegroupConns(zonegroup)
6085+
primary = zonegroup_conns.rw_zones[0]
6086+
secondary = zonegroup_conns.rw_zones[1]
6087+
6088+
bucket = primary.create_bucket(gen_bucket_name())
6089+
log.debug('created bucket=%s', bucket.name)
6090+
6091+
# enable versioning
6092+
bucket.configure_versioning(True)
6093+
zonegroup_meta_checkpoint(zonegroup)
6094+
6095+
lock_config = {
6096+
'ObjectLockEnabled': 'Enabled',
6097+
'Rule': {
6098+
'DefaultRetention': {
6099+
'Mode': 'COMPLIANCE',
6100+
'Days': 1
6101+
}
6102+
}
6103+
}
6104+
6105+
# enable object lock on bucket
6106+
primary.s3_client.put_object_lock_configuration(
6107+
Bucket=bucket.name,
6108+
ObjectLockConfiguration = lock_config)
6109+
6110+
zonegroup_meta_checkpoint(zonegroup)
6111+
zone_data_checkpoint(secondary.zone, primary.zone)
6112+
6113+
response = secondary.s3_client.get_object_lock_configuration(Bucket=bucket.name)
6114+
assert(response['ObjectLockConfiguration'] == lock_config)
6115+
6116+
6117+

0 commit comments

Comments
 (0)