60
60
CFG_SER_IP : "" ,
61
61
CFG_SER_PORT : "6443" ,
62
62
CFG_SER_DISABLE : "false" ,
63
- CFG_SER_INSECURE : "false "
63
+ CFG_SER_INSECURE : "true "
64
64
}
65
65
66
66
dflt_st_ser = {
88
88
JOIN_LATENCY = "join_latency_on_boot_seconds"
89
89
JOIN_RETRY = "retry_join_interval_seconds"
90
90
LABEL_RETRY = "retry_labels_update_seconds"
91
+ TAG_IMAGE_LATEST = "tag_latest_image_on_wait_seconds"
91
92
USE_K8S_PROXY = "use_k8s_as_http_proxy"
92
93
93
94
remote_ctr_config = {
94
95
JOIN_LATENCY : 10 ,
95
96
JOIN_RETRY : 10 ,
96
97
LABEL_RETRY : 2 ,
98
+ TAG_IMAGE_LATEST : 30 ,
97
99
USE_K8S_PROXY : ""
98
100
}
99
101
100
102
def log_debug (m ):
101
103
msg = "{}: {}" .format (inspect .stack ()[1 ][3 ], m )
102
- print (msg )
104
+ # print(msg)
103
105
syslog .syslog (syslog .LOG_DEBUG , msg )
104
106
105
107
@@ -148,6 +150,8 @@ def init():
148
150
with open (SONIC_CTR_CONFIG , "r" ) as s :
149
151
d = json .load (s )
150
152
remote_ctr_config .update (d )
153
+ if UNIT_TESTING :
154
+ remote_ctr_config [TAG_IMAGE_LATEST ] = 0
151
155
152
156
153
157
class MainServer :
@@ -172,11 +176,11 @@ def register_db(self, db_name):
172
176
self .db_connectors [db_name ] = swsscommon .DBConnector (db_name , 0 )
173
177
174
178
175
- def register_timer (self , ts , handler ):
179
+ def register_timer (self , ts , handler , args = () ):
176
180
""" Register timer based handler.
177
181
The handler will be called on/after give timestamp, ts
178
182
"""
179
- self .timer_handlers [ts ].append (handler )
183
+ self .timer_handlers [ts ].append (( handler , args ) )
180
184
181
185
182
186
def register_handler (self , db_name , table_name , handler ):
@@ -235,7 +239,7 @@ def run(self):
235
239
lst = self .timer_handlers [k ]
236
240
del self .timer_handlers [k ]
237
241
for fn in lst :
238
- fn ( )
242
+ fn [ 0 ]( * fn [ 1 ] )
239
243
else :
240
244
timeout = (k - ct_ts ).seconds
241
245
break
@@ -426,6 +430,54 @@ def do_join(self, ip, port, insecure):
426
430
format (remote_ctr_config [JOIN_RETRY ], self .start_time ))
427
431
428
432
433
+ def tag_latest_image (server , feat , docker_id , image_ver ):
434
+ res = 1
435
+ if not UNIT_TESTING :
436
+ status = os .system ("docker ps |grep {} >/dev/null" .format (docker_id ))
437
+ if status :
438
+ syslog .syslog (syslog .LOG_ERR ,
439
+ "Feature {}:{} is not stable" .format (feat , image_ver ))
440
+ else :
441
+ image_item = os .popen ("docker inspect {} |jq -r .[].Image" .format (docker_id )).read ().strip ()
442
+ if image_item :
443
+ image_id = image_item .split (":" )[1 ][:12 ]
444
+ image_info = os .popen ("docker images |grep {}" .format (image_id )).read ().split ()
445
+ if image_info :
446
+ image_rep = image_info [0 ]
447
+ res = os .system ("docker tag {} {}:latest" .format (image_id , image_rep ))
448
+ if res != 0 :
449
+ syslog .syslog (syslog .LOG_ERR ,
450
+ "Failed to tag {}:{} to latest" .format (image_rep , image_ver ))
451
+ else :
452
+ syslog .syslog (syslog .LOG_INFO ,
453
+ "Successfully tag {}:{} to latest" .format (image_rep , image_ver ))
454
+ feat_status = os .popen ("docker inspect {} |jq -r .[].State.Running" .format (feat )).read ().strip ()
455
+ if feat_status :
456
+ if feat_status == 'true' :
457
+ os .system ("docker stop {}" .format (feat ))
458
+ syslog .syslog (syslog .LOG_ERR ,
459
+ "{} should not run, stop it" .format (feat ))
460
+ os .system ("docker rm {}" .format (feat ))
461
+ syslog .syslog (syslog .LOG_INFO ,
462
+ "Delete previous {} container" .format (feat ))
463
+ else :
464
+ syslog .syslog (syslog .LOG_ERR ,
465
+ "Failed to docker images |grep {} to get image repo" .format (image_id ))
466
+ else :
467
+ syslog .syslog (syslog .LOG_ERR ,
468
+ "Failed to inspect container:{} to get image id" .format (docker_id ))
469
+ else :
470
+ server .mod_db_entry (STATE_DB_NAME ,
471
+ FEATURE_TABLE , feat , {"tag_latest" : "true" })
472
+ res = 0
473
+ if res :
474
+ log_debug ("failed to tag {}:{} to latest" .format (feat , image_ver ))
475
+ else :
476
+ log_debug ("successfully tag {}:{} to latest" .format (feat , image_ver ))
477
+
478
+ return res
479
+
480
+
429
481
#
430
482
# Feature changes
431
483
#
@@ -523,6 +575,19 @@ def on_state_update(self, key, op, data):
523
575
self .st_data [key ] = _update_entry (dflt_st_feat , data )
524
576
remote_state = self .st_data [key ][ST_FEAT_REMOTE_STATE ]
525
577
578
+ if (old_remote_state != remote_state ) and (remote_state == "running" ):
579
+ # Tag latest
580
+ start_time = datetime .datetime .now () + datetime .timedelta (
581
+ seconds = remote_ctr_config [TAG_IMAGE_LATEST ])
582
+ self .server .register_timer (start_time , tag_latest_image , (
583
+ self .server ,
584
+ key ,
585
+ self .st_data [key ][ST_FEAT_CTR_ID ],
586
+ self .st_data [key ][ST_FEAT_CTR_VER ]))
587
+
588
+ log_debug ("try to tag latest label after {} seconds @{}" .format (
589
+ remote_ctr_config [TAG_IMAGE_LATEST ], start_time ))
590
+
526
591
if (not init ) and (
527
592
(old_remote_state == remote_state ) or (remote_state != "pending" )):
528
593
# no change or nothing to do.
0 commit comments