Skip to content

Commit 7e5a755

Browse files
authored
add check-conflict and dry-run (#381)
1 parent b5f324a commit 7e5a755

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

scripts/meta_transfer_as_rename2workload.py

+33-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
import etcd3
1010

11+
check_conflict = False
12+
dry_run = False
13+
1114
def remove_prefix(s, prefix):
1215
return s[len(prefix):].lstrip('/') if s.startswith(prefix) else s
1316

@@ -40,7 +43,13 @@ def range_prefix(meta, obj_prefix, fn):
4043
orig_key = kv.key.decode('utf-8')
4144
objname = remove_prefix(orig_key, orig_prefix)
4245
new_key = fn(objname, kv.value.decode('utf-8'))
43-
if new_key:
46+
if not new_key:
47+
continue
48+
49+
if check_conflict:
50+
if etcd.get(new_key)[0]:
51+
print('conflict: new key exists! original: %s, new: %s' % (orig_key, new_key))
52+
else:
4453
print('convert %s to %s' % (orig_key, new_key))
4554

4655
if not range_response.more:
@@ -66,7 +75,8 @@ def _trans(self, podname, orig_value):
6675
return
6776

6877
new_key = os.path.join(self.meta.new_root_prefix, self.pod_prefix, podname)
69-
self.meta.etcd.put(new_key, orig_value)
78+
if not dry_run:
79+
self.meta.etcd.put(new_key, orig_value)
7080
return new_key
7181

7282

@@ -98,7 +108,8 @@ def _trans_info(self, nodename, orig_value):
98108
self.pod_nodes[nodename] = json.loads(orig_value)
99109

100110
new_key = os.path.join(self.meta.new_root_prefix, self.info_prefix, nodename)
101-
self.meta.etcd.put(new_key, orig_value)
111+
if not dry_run:
112+
self.meta.etcd.put(new_key, orig_value)
102113
return new_key
103114

104115
def _trans_pod(self, node_pod_pair, orig_value):
@@ -117,7 +128,8 @@ def _trans_pod(self, node_pod_pair, orig_value):
117128
self.pod_nodes[nodename] = {}
118129

119130
new_key = os.path.join(self.meta.new_root_prefix, self.info_prefix, '%s:pod' % podname, nodename)
120-
self.meta.etcd.put(new_key, orig_value)
131+
if not dry_run:
132+
self.meta.etcd.put(new_key, orig_value)
121133
return new_key
122134

123135
def _trans_cert(self, cert_key, orig_value):
@@ -130,7 +142,8 @@ def _trans_cert(self, cert_key, orig_value):
130142
return
131143

132144
new_key = os.path.join(self.meta.new_root_prefix, self.info_prefix, '%s:%s' % (nodename, cert_type))
133-
self.meta.etcd.put(new_key, orig_value)
145+
if not dry_run:
146+
self.meta.etcd.put(new_key, orig_value)
134147
return new_key
135148

136149
def _trans_workload(self, node_wrk_pair, orig_value):
@@ -144,7 +157,8 @@ def _trans_workload(self, node_wrk_pair, orig_value):
144157

145158
new_key = os.path.join(self.meta.new_root_prefix, self.info_prefix, '%s:workloads' % nodename, wrk_id)
146159
wrk = Workload.conv(orig_value, self)
147-
self.meta.etcd.put(new_key, json.dumps(wrk))
160+
if not dry_run:
161+
self.meta.etcd.put(new_key, json.dumps(wrk))
148162
return new_key
149163

150164
def _belong_pod(self, nodename):
@@ -202,7 +216,8 @@ def _trans_container(self, wrk_id, orig_value):
202216

203217
new_key = os.path.join(self.meta.new_root_prefix, self.wrk_prefix, wrk_id)
204218
wrk = self.conv(orig_value, self.node_transfer)
205-
self.meta.etcd.put(new_key, json.dumps(wrk))
219+
if not dry_run:
220+
self.meta.etcd.put(new_key, json.dumps(wrk))
206221
return new_key
207222

208223
def _trans_deploy(self, deploy_key, orig_value):
@@ -219,7 +234,8 @@ def _trans_deploy(self, deploy_key, orig_value):
219234

220235
new_key = os.path.join(self.meta.new_root_prefix, self.deploy_prefix, appname, entrypoint, nodename, wrk_id)
221236
wrk = self.conv(orig_value, self.node_transfer)
222-
self.meta.etcd.put(new_key, json.dumps(wrk))
237+
if not dry_run:
238+
self.meta.etcd.put(new_key, json.dumps(wrk))
223239

224240
return new_key
225241

@@ -316,13 +332,22 @@ def getargs():
316332
ap.add_argument('-p', '--pod', dest='podname')
317333
ap.add_argument('--etcd-host', default='127.0.0.1')
318334
ap.add_argument('--etcd-port', type=int, default=2379)
335+
ap.add_argument('--dry-run', dest='dry_run', action='store_true', help='dry run, will not actually migrate')
336+
ap.add_argument('--check-conflict', dest='check_conflict', action='store_true', help='check conflict, checks if destination already has the key')
319337
return ap.parse_args()
320338

321339
def connect_etcd(host, port):
322340
return etcd3.client(host=host, port=port)
323341

324342
def main():
325343
args = getargs()
344+
345+
global dry_run, check_conflict
346+
dry_run = args.dry_run
347+
check_conflict = args.check_conflict
348+
if check_conflict:
349+
dry_run = True
350+
326351
etcd = connect_etcd(args.etcd_host, args.etcd_port)
327352
trans = Transfer(etcd, args.orig_root_prefix, args.new_root_prefix)
328353
trans.trans(args.podname)

0 commit comments

Comments
 (0)