in src/aaz_dev/cli/controller/az_atomic_profile_builder.py [0:0]
def _complete_command_wait_info(cls, command_group):
assert command_group.commands
wait_cmd_rids = {}
for command in command_group.commands.values():
lro_list = []
for operation in command.cfg.operations:
if isinstance(operation, CMDHttpOperation):
if operation.long_running:
lro_list.append(operation)
if len(lro_list) == 1:
# support no wait if there are only one long running operation
# not support multiple long running operations
command.support_no_wait = True
if command.register_info is not None:
# command is registered
rid = swagger_resource_path_to_resource_id(lro_list[0].http.path)
if rid not in wait_cmd_rids:
wait_cmd_rids[rid] = {
"methods": set()
}
if not wait_cmd_rids:
return
# build wait command
for command in command_group.commands.values():
for operation in command.cfg.operations:
# find get operations for wait command
if not isinstance(operation, CMDHttpOperation):
continue
rid = swagger_resource_path_to_resource_id(operation.http.path)
if rid not in wait_cmd_rids:
continue
if operation.http.request.method != 'get':
wait_cmd_rids[rid]['methods'].add(operation.http.request.method)
continue
if 'get_op' in wait_cmd_rids[rid]:
continue
# verify operation response has provisioning state field
if not cls._has_provisioning_state(operation):
continue
wait_cmd_rids[rid]['get_op'] = operation.__class__(operation.to_primitive())
wait_cmd_rids[rid]['args'] = {}
for resource in command.resources:
if rid == resource.id:
wait_cmd_rids[rid]['resource'] = resource.__class__(resource.to_primitive())
params = []
if operation.http.request.path and operation.http.request.path.params:
params += operation.http.request.path.params
if operation.http.request.query and operation.http.request.query.params:
params += operation.http.request.query.params
if operation.http.request.header and operation.http.request.header.params:
params += operation.http.request.header.params
for param in params:
if not param.arg:
continue
assert param.arg.startswith("$"), f"Not support path arg name: '{param.arg}'"
arg, arg_idx = CfgReader.find_arg_in_command_by_var(
command=command.cfg,
arg_var=param.arg
)
assert arg is not None
wait_cmd_rids[rid]['args'][arg_idx] = arg.__class__(arg.to_primitive())
for rid, value in [*wait_cmd_rids.items()]:
if "get_op" not in value:
logger.error(f'Failed to support wait command for resource: '
f'Get operation with provisioning state property does not exist: {rid}')
del wait_cmd_rids[rid]
if not wait_cmd_rids:
return
if len(wait_cmd_rids) > 1:
# Not support to generate wait command for multiple resources
logger.error(f'A wait command cannot apply on multiple resources')
return
wait_cmd_info = [*wait_cmd_rids.values()][0]
wait_command = CLIAtomicCommand()
wait_command.names = [*command_group.names, "wait"]
wait_command.help = CLICommandHelp()
wait_command.help.short = "Place the CLI in a waiting state until a condition is met."
wait_command.register_info = CLIAtomicCommandRegisterInfo()
wait_command.resources = [wait_cmd_info['resource']]
wait_command.cfg = cfg = CMDCommand()
cfg.name = "wait"
cfg.version = "undefined"
arg_group = CMDArgGroup()
cfg.arg_groups = [arg_group]
arg_group.name = ""
arg_group.args = [
*wait_cmd_info['args'].values()
]
get_op = wait_cmd_info['get_op']
cfg.operations = [get_op]
output = CMDObjectOutput()
for response in get_op.http.responses:
if response.is_error:
continue
if not isinstance(response.body, CMDHttpResponseJsonBody):
continue
if response.body.json.var:
output.ref = response.body.json.var
break
if not output.ref:
raise ValueError("Output ref is empty")
output.client_flatten = False
cfg.outputs = [output]
return wait_command