22import os
33import sys
44import logging
5-
5+ import time
66
77from collections import defaultdict
88from kubernetes .client import Configuration
99
1010from ydb .tools .ydbd_slice import nodes , handlers
11- from ydb .tools .ydbd_slice .kube import api , kubectl , yaml , generate , cms
11+ from ydb .tools .ydbd_slice .kube import api , kubectl , yaml , generate , cms , dynconfig
1212
1313
1414logger = logging .getLogger (__name__ )
@@ -148,6 +148,13 @@ def get_nodes(api_client, project_path, manifests):
148148 return node_list
149149
150150
151+ def get_domain (api_client , project_path , manifests ):
152+ for (_ , _ , kind , _ , _ , data ) in manifests :
153+ if kind != 'storage' :
154+ continue
155+ return data ['spec' ]['domain' ]
156+
157+
151158def manifests_ydb_set_image (project_path , manifests , image ):
152159 for (path , api_version , kind , namespace , name , data ) in manifests :
153160 if not (kind in ['storage' , 'database' ] and api_version in ['ydb.tech/v1alpha1' ]):
@@ -245,9 +252,20 @@ def slice_nodeclaim_delete(api_client, project_path, manifests):
245252 sys .exit (e .args [0 ])
246253
247254
255+ def wait_for_storage (api_client , project_path , manifests ):
256+ for (path , api_version , kind , namespace , name , data ) in manifests :
257+ if not (kind in ['storage' ] and api_version in ['ydb.tech/v1alpha1' ]):
258+ continue
259+ namespace = data ['metadata' ]['namespace' ]
260+ name = data ['metadata' ]['name' ]
261+ try :
262+ api .wait_storage_state_ready (api_client , namespace , name )
263+ except TimeoutError as e :
264+ sys .exit (e .args [0 ])
265+
248266#
249267# macro level ydb functions
250- def slice_ydb_apply (api_client , project_path , manifests ):
268+ def slice_ydb_apply (api_client , project_path , manifests , dynamic_config_type ):
251269 # process storages first
252270 for (path , api_version , kind , namespace , name , data ) in manifests :
253271 if not (kind in ['storage' , 'database' ] and api_version in ['ydb.tech/v1alpha1' ]):
@@ -264,28 +282,36 @@ def slice_ydb_apply(api_client, project_path, manifests):
264282 data ['spec' ] = new_data ['spec' ]
265283 update_manifest (path , data )
266284
267- config_items = cms .get_from_files (project_path )
268- if config_items is not None :
269- logger .debug (
270- f'found { len (config_items )} legacy cms config items, '
271- 'need to wait for storage to become ready to apply configs'
272- )
273- # if configs present, then wait for storage
274- for (path , api_version , kind , namespace , name , data ) in manifests :
275- if not (kind in ['storage' ] and api_version in ['ydb.tech/v1alpha1' ]):
276- continue
277- namespace = data ['metadata' ]['namespace' ]
278- name = data ['metadata' ]['name' ]
279- try :
280- api .wait_storage_state_ready (api_client , namespace , name )
281- except TimeoutError as e :
282- sys .exit (e .args [0 ])
285+ if dynamic_config_type in ['both' , 'yaml' ]:
286+ local_config = dynconfig .get_local_config (project_path )
287+ if local_config is not None :
288+ wait_for_storage (api_client , project_path , manifests )
289+
290+ node_list = get_nodes (api_client , project_path , manifests )
291+ domain = get_domain (api_client , project_path , manifests )
292+
293+ with dynconfig .Client (node_list , domain ) as dynconfig_client :
294+ remote_config = dynconfig .get_remote_config (dynconfig_client )
295+
296+ if remote_config is None or remote_config != local_config :
297+ new_config = dynconfig .apply_config (dynconfig_client , project_path )
298+ dynconfig .write_local_config (project_path , new_config )
299+
300+ if dynamic_config_type in ['both' , 'proto' ]:
301+ config_items = cms .get_from_files (project_path )
302+ if config_items is not None :
303+ logger .debug (
304+ f'found { len (config_items )} legacy cms config items, '
305+ 'need to wait for storage to become ready to apply configs'
306+ )
307+ # if configs present, then wait for storage
308+ wait_for_storage (api_client , project_path , manifests )
283309
284- # and apply configs
285- node_list = get_nodes (api_client , project_path , manifests )
286- if len (node_list ) == 0 :
287- raise RuntimeError ('no nodes found, cannot apply legacy cms config items.' )
288- cms .apply_legacy_cms_config_items (config_items , [f'grpc://{ i } :2135' for i in node_list ])
310+ # and apply configs
311+ node_list = get_nodes (api_client , project_path , manifests )
312+ if len (node_list ) == 0 :
313+ raise RuntimeError ('no nodes found, cannot apply legacy cms config items.' )
314+ cms .apply_legacy_cms_config_items (config_items , [f'grpc://{ i } :2135' for i in node_list ])
289315
290316 # process databases later
291317 for (path , api_version , kind , namespace , name , data ) in manifests :
@@ -432,23 +458,23 @@ def slice_generate(project_path, user, slice_name, template, template_vars):
432458 sys .exit (f'Slice template { template } not implemented.' )
433459
434460
435- def slice_install (project_path , manifests , wait_ready ):
461+ def slice_install (project_path , manifests , wait_ready , dynamic_config_type ):
436462 with api .ApiClient () as api_client :
437463 slice_namespace_apply (api_client , project_path , manifests )
438464 slice_nodeclaim_apply (api_client , project_path , manifests )
439465 slice_nodeclaim_wait_ready (api_client , project_path , manifests )
440466 slice_ydb_delete (api_client , project_path , manifests )
441467 slice_ydb_storage_wait_pods_deleted (api_client , project_path , manifests )
442468 slice_nodeclaim_format (api_client , project_path , manifests )
443- slice_ydb_apply (api_client , project_path , manifests )
469+ slice_ydb_apply (api_client , project_path , manifests , dynamic_config_type )
444470 slice_ydb_wait_ready (api_client , project_path , manifests , wait_ready )
445471
446472
447- def slice_update (project_path , manifests , wait_ready ):
473+ def slice_update (project_path , manifests , wait_ready , dynamic_config_type ):
448474 with api .ApiClient () as api_client :
449475 slice_nodeclaim_apply (api_client , project_path , manifests )
450476 slice_nodeclaim_wait_ready (api_client , project_path , manifests )
451- slice_ydb_apply (api_client , project_path , manifests )
477+ slice_ydb_apply (api_client , project_path , manifests , dynamic_config_type )
452478 slice_ydb_restart (api_client , project_path , manifests )
453479 slice_ydb_wait_ready (api_client , project_path , manifests , wait_ready )
454480
@@ -458,9 +484,9 @@ def slice_stop(project_path, manifests):
458484 slice_ydb_delete (api_client , project_path , manifests )
459485
460486
461- def slice_start (project_path , manifests , wait_ready ):
487+ def slice_start (project_path , manifests , wait_ready , dynamic_config_type ):
462488 with api .ApiClient () as api_client :
463- slice_ydb_apply (api_client , project_path , manifests )
489+ slice_ydb_apply (api_client , project_path , manifests , dynamic_config_type )
464490 slice_ydb_wait_ready (api_client , project_path , manifests , wait_ready )
465491
466492
@@ -474,12 +500,12 @@ def slice_nodes(project_path, manifests):
474500 slice_nodeclaim_nodes (api_client , project_path , manifests )
475501
476502
477- def slice_format (project_path , manifests , wait_ready ):
503+ def slice_format (project_path , manifests , wait_ready , dynamic_config_type ):
478504 with api .ApiClient () as api_client :
479505 slice_ydb_delete (api_client , project_path , manifests )
480506 slice_ydb_storage_wait_pods_deleted (api_client , project_path , manifests )
481507 slice_nodeclaim_format (api_client , project_path , manifests )
482- slice_ydb_apply (api_client , project_path , manifests )
508+ slice_ydb_apply (api_client , project_path , manifests , dynamic_config_type )
483509 slice_ydb_wait_ready (api_client , project_path , manifests , wait_ready )
484510
485511
0 commit comments