@@ -240,166 +240,146 @@ def generate_by_swagger_tag(profile, swagger_tag, extension_or_module_name, cli_
240240 help = "Module name of the CLI extension target."
241241)
242242def generate (spec , module , cli_path = None , cli_extension_path = None ):
243- def to_aaz ( ):
244- try :
245- module_manager = SwaggerSpecsManager (). get_module_manager ( Config . DEFAULT_PLANE , spec )
243+ def _collect_resources ( spec ):
244+ module_manager = SwaggerSpecsManager (). get_module_manager ( Config . DEFAULT_PLANE , spec )
245+ rps = module_manager . get_resource_providers ( )
246246
247- rps = module_manager . get_resource_providers ()
248- for r in rps :
249- if isinstance (r , TypeSpecResourceProvider ):
250- continue
247+ results = {}
248+ for r in rps :
249+ if isinstance (r , TypeSpecResourceProvider ):
250+ continue
251251
252- rp = module_manager .get_openapi_resource_provider (r .name )
253- tag = r .default_tag
254-
255- resource_map = rp .get_resource_map_by_tag (tag )
256- if not resource_map :
257- raise InvalidAPIUsage (f"Tag `{ tag } ` is not exist" )
258-
259- version_resource_map = {}
260- for resource_id , version_map in resource_map .items ():
261- v_list = [v for v in version_map ]
262- if len (v_list ) > 1 :
263- raise InvalidAPIUsage (
264- f"Tag `{ tag } ` contains multiple api versions of one resource." ,
265- payload = {
266- "Resource" : resource_id ,
267- "versions" : v_list ,
268- }
269- )
270-
271- v = v_list [0 ]
272- if v not in version_resource_map :
273- version_resource_map [v ] = []
274- version_resource_map [v ].append ({"id" : resource_id })
275-
276- ws = WorkspaceManager .new (
277- name = spec ,
278- plane = Config .DEFAULT_PLANE ,
279- folder = WorkspaceManager .IN_MEMORY , # use workspace else use in memory folder
280- mod_names = spec ,
281- resource_provider = rp .name ,
282- swagger_manager = SwaggerSpecsManager (),
283- aaz_manager = AAZSpecsManager (),
284- source = SourceTypeEnum .OpenAPI ,
285- )
286- for version , resources in version_resource_map .items ():
287- ws .add_new_resources_by_swagger (mod_names = spec , version = version , resources = resources )
288-
289- # provide default short summary
290- for node in ws .iter_command_tree_nodes ():
291- if not node .help :
292- node .help = CMDHelp ()
293- if not node .help .short :
294- node .help .short = f"Manage { node .names [- 1 ]} "
295-
296- for leaf in ws .iter_command_tree_leaves ():
297- if not leaf .help :
298- leaf .help = CMDHelp ()
299- if not leaf .help .short :
300- n = leaf .names [- 1 ]
301- n = n [0 ].upper () + n [1 :]
302- leaf .help .short = f"{ n } { leaf .names [- 2 ]} "
303-
304- # generate examples
305- cfg_editor = ws .load_cfg_editor_by_command (leaf )
306- command = cfg_editor .find_command (* leaf .names )
307- examples = ws .generate_examples_by_swagger (leaf , command )
308- leaf .examples = examples
309-
310- if not ws .is_in_memory :
311- ws .save ()
312-
313- ws .generate_to_aaz ()
314-
315- except InvalidAPIUsage as err :
316- logger .error (err , exc_info = True )
317- raise sys .exit (1 )
318-
319- except ValueError as err :
320- logger .error (err , exc_info = True )
321- raise sys .exit (1 )
252+ rp = module_manager .get_openapi_resource_provider (r .name )
253+ tag = r .default_tag
322254
323- def to_cli ():
324- try :
325- module_manager = SwaggerSpecsManager ().get_module_manager (Config .DEFAULT_PLANE , spec )
326- rps = module_manager .get_resource_providers ()
327- for r in rps :
328- if isinstance (r , TypeSpecResourceProvider ):
329- continue
255+ resource_map = rp .get_resource_map_by_tag (tag )
256+ if not resource_map :
257+ raise InvalidAPIUsage (f"Tag `{ tag } ` is not exist." )
330258
331- rp = module_manager .get_openapi_resource_provider (r .name )
332- tag = r .default_tag
259+ results [rp .name ] = (resource_map , tag )
333260
334- resource_map = rp .get_resource_map_by_tag (tag )
335- if not resource_map :
336- raise InvalidAPIUsage (f"Tag `{ tag } ` is not exist" )
261+ return results
262+
263+ def _normalize_resource_map (resource_map , tag ):
264+ # covert resource_map to {version: [resources]}
265+ version_resource_map = {}
266+ for resource_id , version_map in resource_map .items ():
267+ v_list = list (version_map )
268+ if len (v_list ) > 1 :
269+ raise InvalidAPIUsage (
270+ f"Tag `{ tag } ` contains multiple api versions of one resource" ,
271+ payload = {"Resource" : resource_id , "versions" : v_list },
272+ )
273+
274+ v = v_list [0 ]
275+ version_resource_map .setdefault (v , []).append ({"id" : resource_id })
337276
338- commands_map = {}
339- for resource_id , version_map in resource_map .items ():
340- v_list = [v for v in version_map ]
341- if len (v_list ) > 1 :
342- raise InvalidAPIUsage (
343- f"Tag `{ tag } ` contains multiple api versions of one resource" ,
344- payload = {
345- "Resource" : resource_id ,
346- "versions" : v_list ,
347- }
348- )
277+ return version_resource_map
349278
350- v = v_list [0 ]
351- cfg_reader = AAZSpecsManager ().load_resource_cfg_reader (Config .DEFAULT_PLANE , resource_id , v )
352- if not cfg_reader :
353- logger .error (f"Command models not exist in aaz for resource: { resource_id } version: { v } ." )
354- continue
279+ def to_aaz ():
280+ results = _collect_resources (spec )
281+
282+ for rp_name , (resource_map , tag ) in results .items ():
283+ version_resource_map = _normalize_resource_map (resource_map , tag )
284+
285+ ws = WorkspaceManager .new (
286+ name = spec ,
287+ plane = Config .DEFAULT_PLANE ,
288+ folder = WorkspaceManager .IN_MEMORY ,
289+ mod_names = spec ,
290+ resource_provider = rp_name ,
291+ swagger_manager = SwaggerSpecsManager (),
292+ aaz_manager = AAZSpecsManager (),
293+ source = SourceTypeEnum .OpenAPI ,
294+ )
295+ for version , resources in version_resource_map .items ():
296+ ws .add_new_resources_by_swagger (mod_names = spec , version = version , resources = resources )
297+
298+ # complete default help
299+ for node in ws .iter_command_tree_nodes ():
300+ node .help = node .help or CMDHelp ()
301+ if not node .help .short :
302+ node .help .short = f"Manage { node .names [- 1 ]} ."
303+
304+ for leaf in ws .iter_command_tree_leaves ():
305+ leaf .help = leaf .help or CMDHelp ()
306+ if not leaf .help .short :
307+ n = leaf .names [- 1 ]
308+ leaf .help .short = f"{ n .capitalize ()} { leaf .names [- 2 ]} "
309+
310+ cfg_editor = ws .load_cfg_editor_by_command (leaf )
311+ command = cfg_editor .find_command (* leaf .names )
312+ leaf .examples = ws .generate_examples_by_swagger (leaf , command )
313+
314+ if not ws .is_in_memory :
315+ ws .save ()
316+
317+ ws .generate_to_aaz ()
355318
356- for cmd_names , command in cfg_reader .iter_commands ():
357- key = tuple (cmd_names )
358- if key in commands_map and commands_map [key ] != command .version :
359- raise ValueError (f"Multi version contained for command: { '' .join (cmd_names )} versions: { commands_map [key ]} , { command .version } " )
319+ def to_cli ():
320+ results = _collect_resources (spec )
360321
361- commands_map [key ] = command .version
322+ commands_map = {}
323+ for _ , (resource_map , tag ) in results .items ():
324+ for resource_id , version_map in resource_map .items ():
325+ v_list = list (version_map )
326+ if len (v_list ) > 1 :
327+ raise InvalidAPIUsage (
328+ f"Tag `{ tag } ` contains multiple api versions of one resource" ,
329+ payload = {"Resource" : resource_id , "versions" : v_list },
330+ )
331+
332+ v = v_list [0 ]
333+ cfg_reader = AAZSpecsManager ().load_resource_cfg_reader (Config .DEFAULT_PLANE , resource_id , v )
334+ if not cfg_reader :
335+ logger .error (f"Command models not exist in aaz for resource: { resource_id } version: { v } ." )
336+ continue
362337
363- if cli_path is not None :
364- assert Config .CLI_PATH is not None
365- manager = AzMainManager ()
338+ for cmd_names , command in cfg_reader .iter_commands ():
339+ key = tuple (cmd_names )
340+ if key in commands_map and commands_map [key ] != command .version :
341+ raise ValueError (f"Multi version contained for command: { '' .join (cmd_names )} versions: { commands_map [key ]} , { command .version } " )
366342
367- else :
368- assert cli_extension_path is not None
369- assert Config .CLI_EXTENSION_PATH is not None
370- manager = AzExtensionManager ()
343+ commands_map [key ] = command .version
371344
372- if not manager . has_module ( module ) :
373- logger . info ( f"Create cli module ` { module } `." )
374- manager . create_new_mod ( module )
345+ if cli_path is not None :
346+ assert Config . CLI_PATH is not None
347+ manager = AzMainManager ( )
375348
376- logger .info (f"Load cli module `{ module } `." )
377- ext = manager .load_module (module )
349+ else : # generate ext module by default
350+ assert Config .CLI_EXTENSION_PATH is not None
351+ manager = AzExtensionManager ()
378352
379- profile = _build_profile (Config .CLI_DEFAULT_PROFILE , commands_map )
353+ if not manager .has_module (module ):
354+ logger .info (f"Create cli module `{ module } `." )
355+ manager .create_new_mod (module )
380356
381- ext .profiles [profile .name ] = profile
382- logger .info (f"Regenerate module `{ module } `." )
383- manager .update_module (module , ext .profiles )
357+ logger .info (f"Load cli module `{ module } `." )
358+ ext = manager .load_module (module )
384359
385- except InvalidAPIUsage as err :
386- logger .error (err , exc_info = True )
387- raise sys .exit (1 )
360+ profile = _build_profile (Config .CLI_DEFAULT_PROFILE , commands_map )
361+ ext .profiles [profile .name ] = profile
388362
389- except ValueError as err :
390- logger .error (err , exc_info = True )
391- raise sys .exit (1 )
363+ logger .info (f"Regenerate module `{ module } `." )
364+ manager .update_module (module , ext .profiles )
392365
393366 if cli_path and cli_extension_path :
394367 logger .error ("Please provide either `--cli-path` or `--cli-extension-path`." )
395368 raise sys .exit (1 )
396369
397370 spec_path = os .path .join (Config .SWAGGER_PATH , "specification" , spec )
398371 if not os .path .exists (spec_path ) or not os .path .isdir (spec_path ):
399- raise ValueError ("Please provide a valid specification name." )
372+ raise ValueError (f"Cannot find the specification name under { Config . SWAGGER_PATH } ." )
400373
401- to_aaz ()
402- to_cli ()
374+ try :
375+ to_aaz ()
376+ logger .info ("✔ Finished generating AAZ model." )
377+ to_cli ()
378+ logger .info ("✔ Finished generating AAZ codes." )
379+
380+ except (InvalidAPIUsage , ValueError ) as err :
381+ logger .error (err , exc_info = True )
382+ raise sys .exit (1 )
403383
404384
405385def _build_profile (profile_name , commands_map ):
0 commit comments