@@ -102,6 +102,52 @@ def generate_generic_update_command(cls, path_item, resource, instance_var, cmd_
102102 command .name = f"{ group_name } update"
103103 return command
104104
105+ @classmethod
106+ def generate_specific_update_command (cls , path_item , resource , instance_var , cmd_builder , get_op , patch_op ):
107+ command = CMDCommand ()
108+ command .version = cls .generate_command_version (resource )
109+ command .resources = [
110+ resource .to_cmd () if not isinstance (resource , CMDResource ) else resource
111+ ]
112+ assert path_item .get is not None
113+ assert path_item .patch is not None
114+
115+ cmd_builder .apply_cls_definitions (get_op , patch_op )
116+
117+ if patch_op .http .request .body is None :
118+ return None
119+
120+ if not cls ._set_api_version_parameter (get_op .http .request , api_version = resource .version ):
121+ logger .warning (f"Cannot Find api version parameter: { resource .path } , 'get' : { path_item .traces } " )
122+ if not cls ._set_api_version_parameter (patch_op .http .request , api_version = resource .version ):
123+ logger .warning (f"Cannot Find api version parameter: { resource .path } , 'patch' : { path_item .traces } " )
124+
125+ if not command .build_output_by_operation (get_op ):
126+ return None
127+
128+ if not command .build_output_by_operation (patch_op ):
129+ return None
130+
131+ cls ._filter_generic_update_parameters (get_op , patch_op )
132+
133+ command .description = patch_op .description
134+ json_update_op = cls ._generate_instance_patch_operation (patch_op , instance_var )
135+ command .operations = [
136+ get_op ,
137+ json_update_op ,
138+ patch_op
139+ ]
140+
141+ command .generate_args ()
142+ command .generate_outputs ()
143+
144+ assert command .outputs
145+
146+ group_name = cls .generate_command_group_name_by_resource (
147+ resource_path = resource .path , rp_name = resource .rp_name )
148+ command .name = f"{ group_name } update"
149+ return command
150+
105151 @staticmethod
106152 def _set_api_version_parameter (request , api_version ):
107153 assert isinstance (request , CMDHttpRequest )
@@ -254,6 +300,17 @@ def _generate_instance_update_operation(put_op, instance_var):
254300 put_op .http .request .body .json .schema = None
255301 return json_update_op
256302
303+ @staticmethod
304+ def _generate_instance_patch_operation (patch_op , instance_var ):
305+ json_update_op = CMDInstanceUpdateOperation ()
306+ json_update_op .instance_update = CMDJsonInstanceUpdateAction ()
307+ json_update_op .instance_update .ref = instance_var
308+ json_update_op .instance_update .json = CMDRequestJson ()
309+ json_update_op .instance_update .json .schema = patch_op .http .request .body .json .schema
310+
311+ patch_op .http .request .body .json .ref = instance_var
312+ return json_update_op
313+
257314 @staticmethod
258315 def _filter_generic_update_parameters (get_op , put_op ):
259316 """Get operation may contain useless query or header parameters for update, ignore them"""
@@ -470,11 +527,24 @@ def create_draft_command_group(self, resource,
470527 raise exceptions .InvalidAPIUsage (f"Invalid update_by resource: resource needs to have 'patch' operation: '{ resource } '" )
471528 if 'patch' not in methods :
472529 raise exceptions .InvalidAPIUsage (f"Invalid update_by resource: '{ resource } ': 'patch' not in methods: '{ methods } '" )
473- cmd_builder = CMDBuilder (path = resource .path , method = 'patch' , mutability = MutabilityEnum .Update ,
474- parameterized_host = parameterized_host )
475- op = self .generate_operation (cmd_builder , path_item , instance_var )
476- patch_update_command = self .generate_command (path_item , resource , instance_var , cmd_builder , op )
477- command_group .commands .append (patch_update_command )
530+
531+ if kwargs .get ('is_identity' , False ) is True :
532+ cmd_builder = CMDBuilder (path = resource .path , parameterized_host = parameterized_host )
533+ get_op = self .generate_operation (cmd_builder , path_item , instance_var , method = 'get' , mutability = MutabilityEnum .Read )
534+ patch_op = self .generate_operation (cmd_builder , path_item , instance_var , method = 'patch' , mutability = MutabilityEnum .Update )
535+ specific_update_command = self .generate_specific_update_command (path_item , resource , instance_var , cmd_builder , get_op , patch_op )
536+
537+ if specific_update_command is None :
538+ raise exceptions .InvalidAPIUsage (f"Invalid update_by resource: failed to generate specific update: '{ resource } '" )
539+
540+ command_group .commands .append (specific_update_command )
541+
542+ else :
543+ cmd_builder = CMDBuilder (path = resource .path , method = 'patch' , mutability = MutabilityEnum .Update ,
544+ parameterized_host = parameterized_host )
545+ op = self .generate_operation (cmd_builder , path_item , instance_var )
546+ patch_update_command = self .generate_command (path_item , resource , instance_var , cmd_builder , op )
547+ command_group .commands .append (patch_update_command )
478548 # elif update_by == 'GenericAndPatch':
479549 # # TODO: add support for generic and patch merge
480550 # if path_item.get is None or path_item.put is None or path_item.patch is None:
0 commit comments