8
8
9
9
import etcd3
10
10
11
+ check_conflict = False
12
+ dry_run = False
13
+
11
14
def remove_prefix (s , prefix ):
12
15
return s [len (prefix ):].lstrip ('/' ) if s .startswith (prefix ) else s
13
16
@@ -40,7 +43,13 @@ def range_prefix(meta, obj_prefix, fn):
40
43
orig_key = kv .key .decode ('utf-8' )
41
44
objname = remove_prefix (orig_key , orig_prefix )
42
45
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 :
44
53
print ('convert %s to %s' % (orig_key , new_key ))
45
54
46
55
if not range_response .more :
@@ -66,7 +75,8 @@ def _trans(self, podname, orig_value):
66
75
return
67
76
68
77
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 )
70
80
return new_key
71
81
72
82
@@ -98,7 +108,8 @@ def _trans_info(self, nodename, orig_value):
98
108
self .pod_nodes [nodename ] = json .loads (orig_value )
99
109
100
110
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 )
102
113
return new_key
103
114
104
115
def _trans_pod (self , node_pod_pair , orig_value ):
@@ -117,7 +128,8 @@ def _trans_pod(self, node_pod_pair, orig_value):
117
128
self .pod_nodes [nodename ] = {}
118
129
119
130
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 )
121
133
return new_key
122
134
123
135
def _trans_cert (self , cert_key , orig_value ):
@@ -130,7 +142,8 @@ def _trans_cert(self, cert_key, orig_value):
130
142
return
131
143
132
144
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 )
134
147
return new_key
135
148
136
149
def _trans_workload (self , node_wrk_pair , orig_value ):
@@ -144,7 +157,8 @@ def _trans_workload(self, node_wrk_pair, orig_value):
144
157
145
158
new_key = os .path .join (self .meta .new_root_prefix , self .info_prefix , '%s:workloads' % nodename , wrk_id )
146
159
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 ))
148
162
return new_key
149
163
150
164
def _belong_pod (self , nodename ):
@@ -202,7 +216,8 @@ def _trans_container(self, wrk_id, orig_value):
202
216
203
217
new_key = os .path .join (self .meta .new_root_prefix , self .wrk_prefix , wrk_id )
204
218
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 ))
206
221
return new_key
207
222
208
223
def _trans_deploy (self , deploy_key , orig_value ):
@@ -219,7 +234,8 @@ def _trans_deploy(self, deploy_key, orig_value):
219
234
220
235
new_key = os .path .join (self .meta .new_root_prefix , self .deploy_prefix , appname , entrypoint , nodename , wrk_id )
221
236
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 ))
223
239
224
240
return new_key
225
241
@@ -316,13 +332,22 @@ def getargs():
316
332
ap .add_argument ('-p' , '--pod' , dest = 'podname' )
317
333
ap .add_argument ('--etcd-host' , default = '127.0.0.1' )
318
334
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' )
319
337
return ap .parse_args ()
320
338
321
339
def connect_etcd (host , port ):
322
340
return etcd3 .client (host = host , port = port )
323
341
324
342
def main ():
325
343
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
+
326
351
etcd = connect_etcd (args .etcd_host , args .etcd_port )
327
352
trans = Transfer (etcd , args .orig_root_prefix , args .new_root_prefix )
328
353
trans .trans (args .podname )
0 commit comments