Skip to content

Commit 298f56a

Browse files
committed
add ge
1 parent f748ebd commit 298f56a

File tree

10 files changed

+80
-52
lines changed

10 files changed

+80
-52
lines changed

src/aaz_dev/cli/controller/az_arg_group_generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ def render_arg_base(arg, cmd_ctx, arg_kwargs=None):
297297
elif isinstance(arg, CMDByteArgBase):
298298
raise NotImplementedError()
299299
elif isinstance(arg, CMDBinaryArgBase):
300-
arg_type = "AAZFileBytesArg"
300+
arg_type = "AAZFileUploadArg"
301301
elif isinstance(arg, CMDStringArgBase):
302302
arg_type = "AAZStrArg"
303303
enum_kwargs = parse_arg_enum(arg.enum)

src/aaz_dev/cli/controller/az_operation_generator.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from command.model.configuration import (
2-
CMDHttpOperation, CMDHttpRequestJsonBody, CMDArraySchema, CMDInstanceUpdateOperation, CMDRequestJson, CMDHttpRequestBytesBody, CMDRequestBytes,
2+
CMDHttpOperation, CMDHttpRequestJsonBody, CMDArraySchema, CMDInstanceUpdateOperation, CMDRequestJson, CMDHttpRequestBinaryBody, CMDRequestBinary,
33
CMDHttpResponseJsonBody, CMDObjectSchema, CMDSchema, CMDStringSchemaBase, CMDIntegerSchemaBase, CMDFloatSchemaBase,
44
CMDBooleanSchemaBase, CMDObjectSchemaBase, CMDArraySchemaBase, CMDClsSchemaBase, CMDJsonInstanceUpdateAction,
55
CMDObjectSchemaDiscriminator, CMDSchemaEnum, CMDJsonInstanceCreateAction, CMDJsonInstanceDeleteAction, CMDBinarySchema,
@@ -114,11 +114,13 @@ def __init__(self, name, cmd_ctx, operation, client_endpoints):
114114
self.content = None
115115
self.form_content = None
116116
self.stream_content = None
117+
self.content_as_binary = None
117118
if self._operation.http.request.body:
118119
body = self._operation.http.request.body
119120
if isinstance(body, CMDHttpRequestJsonBody):
120121
self.content = AzHttpRequestContentGenerator(self._cmd_ctx, body)
121-
elif isinstance(body, CMDHttpRequestBytesBody):
122+
elif isinstance(body, CMDHttpRequestBinaryBody):
123+
self.content_as_binary = True
122124
self.content = AzHttpRequestContentBytesGenerator(self._cmd_ctx, body)
123125
else:
124126
raise NotImplementedError()
@@ -262,13 +264,19 @@ def header_parameters(self):
262264
True,
263265
{}
264266
])
265-
elif isinstance(body, CMDHttpRequestBytesBody):
267+
elif isinstance(body, CMDHttpRequestBinaryBody):
266268
parameters.append([
267269
"Content-Type",
268270
"application/octet-stream",
269271
True,
270272
{}
271273
])
274+
parameters.append([
275+
"Content-Length",
276+
"self.ctx.file_length",
277+
False,
278+
{}
279+
])
272280
if self.success_responses:
273281
for response in self.success_responses:
274282
if response._response.body is not None and isinstance(response._response.body, CMDHttpResponseJsonBody):
@@ -520,12 +528,10 @@ def iter_scopes(self):
520528
yield scopes
521529

522530
class AzHttpRequestContentBytesGenerator:
523-
VALUE_NAME = "_content_value"
524-
BUILDER_NAME = "_builder"
525531

526532
def __init__(self, cmd_ctx, body):
527533
self._cmd_ctx = cmd_ctx
528-
assert isinstance(body.bytes, CMDRequestBytes)
534+
assert isinstance(body.bytes, CMDRequestBinary)
529535
self._bodycontent = body.bytes
530536
self.ref = None
531537
if self._bodycontent.ref:
@@ -537,11 +543,6 @@ def __init__(self, cmd_ctx, body):
537543
if self._bodycontent.schema.arg:
538544
self.arg_key, hide = self._cmd_ctx.get_argument(self._bodycontent.schema.arg)
539545
assert not hide
540-
self.typ, self.typ_kwargs, self.cls_builder_name = render_schema(
541-
self._bodycontent.schema, self._cmd_ctx.update_clses, name=self._bodycontent.schema.name)
542-
543-
def iter_scopes(self):
544-
pass
545546

546547

547548
class AzHttpResponseGenerator:
@@ -1024,7 +1025,7 @@ def render_schema_base(schema, cls_map, schema_kwargs=None):
10241025
elif isinstance(schema, CMDIdentityObjectSchemaBase):
10251026
schema_type = "AAZIdentityObjectType"
10261027
elif isinstance(schema, CMDBinarySchema):
1027-
schema_type = "AAZBytesType"
1028+
schema_type = "AAZFileUploadType"
10281029
elif isinstance(schema, CMDObjectSchemaBase):
10291030
if schema.props or schema.discriminators:
10301031
schema_type = "AAZObjectType"

src/aaz_dev/cli/templates/aaz/command/_cmd.py.j2

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,21 @@ class {{ leaf.cls_name }}(
236236

237237
@register_callback
238238
def pre_operations(self):
239+
{%- if leaf.http_operations[0].content is not none and leaf.http_operations[0].content_as_binary is not none %}
240+
self.ctx.file_content, self.ctx.file_handler, self.ctx.file_length = {{ leaf.http_operations[0].content.arg_key }}.to_serialized_data()
241+
{%- else %}
239242
pass
243+
{%- endif %}
240244

241245
@register_callback
242246
def post_operations(self):
247+
{%- if leaf.http_operations[0].content is not none and leaf.http_operations[0].content_as_binary is not none %}
248+
if self.ctx.file_handler is not None:
249+
self.ctx.file_handler.close()
250+
self.ctx.file_handler = None
251+
{%- else %}
243252
pass
253+
{%- endif %}
244254

245255
{%- for op in leaf.operations %}
246256
{%- if op.name in ("pre_instance_update", "post_instance_update", "post_instance_create") %}
@@ -485,7 +495,7 @@ class {{ leaf.cls_name }}(
485495
return parameters
486496
{%- endif %}
487497

488-
{%- if op.content is not none %}
498+
{%- if op.content is not none and op.content_as_binary is none %}
489499

490500
@property
491501
def content(self):
@@ -548,6 +558,13 @@ class {{ leaf.cls_name }}(
548558
return self.serialize_content({{ op.content.VALUE_NAME }})
549559
{%- endif %}
550560

561+
{%- if op.content is not none and op.content_as_binary is not none %}
562+
563+
@property
564+
def content(self):
565+
return self.ctx.file_content
566+
{%- endif %}
567+
551568
{%- if op.form_content is not none %}
552569

553570
@property
@@ -556,6 +573,13 @@ class {{ leaf.cls_name }}(
556573
return None
557574
{%- endif %}
558575

576+
{%- if op.content is not none and op.content_as_binary is not none %}
577+
578+
@property
579+
def stream_content(self):
580+
return self.ctx.file_handler
581+
{%- endif %}
582+
559583
{%- if op.stream_content is not none %}
560584

561585
@property

src/aaz_dev/command/model/configuration/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
CMDConditionAndOperator, CMDConditionOrOperator, CMDConditionNotOperator, CMDConditionHasValueOperator, \
3636
CMDCondition
3737
from ._configuration import CMDConfiguration
38-
from ._content import CMDRequestJson, CMDResponseJson, CMDRequestBytes
38+
from ._content import CMDRequestJson, CMDResponseJson, CMDRequestBinary
3939
from ._example import CMDCommandExample
4040
from ._fields import CMDBooleanField, CMDStageField, CMDVariantField, CMDClassField, \
4141
CMDPrimitiveField, CMDRegularExpressionField, CMDVersionField, CMDResourceIdField, CMDCommandNameField, \
@@ -47,7 +47,7 @@
4747
CMDHttpRequest, \
4848
CMDHttpResponseHeaderItem, CMDHttpResponseHeader, CMDHttpResponse, \
4949
CMDHttpAction
50-
from ._http_request_body import CMDHttpRequestBody, CMDHttpRequestJsonBody, CMDHttpRequestBytesBody
50+
from ._http_request_body import CMDHttpRequestBody, CMDHttpRequestJsonBody, CMDHttpRequestBinaryBody
5151
from ._http_response_body import CMDHttpResponseBody, CMDHttpResponseJsonBody
5252
from ._instance_create import CMDInstanceCreateAction, CMDJsonInstanceCreateAction
5353
from ._instance_delete import CMDInstanceDeleteAction, CMDJsonInstanceDeleteAction

src/aaz_dev/command/model/configuration/_arg_builder.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,7 @@ def get_sub_args(self):
197197
item.arg = discriminator_mapping[prop.name][item.value]
198198
continue
199199
sub_builder = self.get_sub_builder(schema=prop, ref_args=sub_ref_args)
200-
sub_arg = sub_builder.get_args()
201-
sub_args.extend(sub_arg)
200+
sub_args.extend(sub_builder.get_args())
202201

203202
self.schema.props = [prop for prop in self.schema.props if prop not in removed]
204203
if isinstance(self.schema, CMDIdentityObjectSchema) and (not self._is_update_action or self.schema.action):

src/aaz_dev/command/model/configuration/_content.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ def reformat(self, schema_cls_map, **kwargs):
6363
def register_cls(self, cls_register_map, **kwargs):
6464
_iter_over_schema_for_cls_register(self.schema, cls_register_map)
6565

66-
class CMDRequestBytes(Model):
67-
"""Used for Request Bytes Body"""
66+
class CMDRequestBinary(Model):
67+
"""Used for Request Binary Body"""
6868

6969
ref = CMDVariantField()
7070

src/aaz_dev/command/model/configuration/_http_request_body.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from schematics.models import Model
22
from schematics.types import ModelType
33

4-
from ._content import CMDRequestJson, CMDRequestBytes
4+
from ._content import CMDRequestJson, CMDRequestBinary
55

66

77
class CMDHttpRequestBody(Model):
@@ -51,10 +51,10 @@ def reformat(self, **kwargs):
5151
def register_cls(self, **kwargs):
5252
self.json.register_cls(**kwargs)
5353

54-
class CMDHttpRequestBytesBody(CMDHttpRequestBody):
54+
class CMDHttpRequestBinaryBody(CMDHttpRequestBody):
5555
POLYMORPHIC_KEY = "bytes"
5656

57-
bytes = ModelType(CMDRequestBytes, required=True)
57+
bytes = ModelType(CMDRequestBinary, required=True)
5858

5959
def generate_args(self, ref_args, var_prefix=None):
6060
return self.bytes.generate_args(ref_args=ref_args, var_prefix=var_prefix)

src/aaz_dev/swagger/controller/command_generator.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from command.model.configuration import CMDCommandGroup, CMDCommand, CMDHttpOperation, CMDHttpRequest, \
77
CMDSchemaDefault, CMDHttpResponseJsonBody, CMDArrayOutput, CMDJsonInstanceUpdateAction, \
88
CMDInstanceUpdateOperation, CMDRequestJson, DEFAULT_CONFIRMATION_PROMPT, CMDClsSchemaBase, CMDHttpResponse, \
9-
CMDResponseJson, CMDResource
9+
CMDResponseJson, CMDResource, CMDHttpRequestBinaryBody
1010
from swagger.model.schema.cmd_builder import CMDBuilder
1111
from swagger.model.schema.fields import MutabilityEnum
1212
from swagger.model.schema.path_item import PathItem
@@ -404,10 +404,13 @@ def create_draft_command_group(self, resource,
404404
delete_command.confirmation = DEFAULT_CONFIRMATION_PROMPT # add confirmation for delete command by default
405405
command_group.commands.append(delete_command)
406406

407+
skip_update = False
407408
if path_item.put is not None and 'put' in methods:
408409
cmd_builder = CMDBuilder(path=resource.path, method='put', mutability=MutabilityEnum.Create,
409410
parameterized_host=parameterized_host)
410411
op = self.generate_operation(cmd_builder, path_item, instance_var)
412+
if isinstance(op.http.request.body, CMDHttpRequestBinaryBody):
413+
skip_update = True
411414
create_command = self.generate_command(path_item, resource, instance_var, cmd_builder, op)
412415
command_group.commands.append(create_command)
413416

@@ -426,29 +429,30 @@ def create_draft_command_group(self, resource,
426429
command_group.commands.append(head_command)
427430

428431
# update command
429-
if update_by is None:
430-
update_by_patch_command = None
431-
update_by_generic_command = None
432-
if path_item.patch is not None and 'patch' in methods:
433-
cmd_builder = CMDBuilder(path=resource.path, method='patch', mutability=MutabilityEnum.Update,
434-
parameterized_host=parameterized_host)
435-
op = self.generate_operation(cmd_builder, path_item, instance_var)
436-
update_by_patch_command = self.generate_command(path_item, resource, instance_var, cmd_builder, op)
437-
if path_item.get is not None and path_item.put is not None and 'get' in methods and 'put' in methods:
438-
cmd_builder = CMDBuilder(path=resource.path,
439-
parameterized_host=parameterized_host)
440-
get_op = self.generate_operation(
441-
cmd_builder, path_item, instance_var, method='get', mutability=MutabilityEnum.Read)
442-
put_op = self.generate_operation(
443-
cmd_builder, path_item, instance_var, method='put', mutability=MutabilityEnum.Update)
444-
update_by_generic_command = self.generate_generic_update_command(path_item, resource, instance_var, cmd_builder, get_op, put_op)
445-
# generic update command first, patch update command after that
446-
if update_by_generic_command:
447-
command_group.commands.append(update_by_generic_command)
448-
elif update_by_patch_command:
449-
command_group.commands.append(update_by_patch_command)
450-
else:
451-
if update_by == 'GenericOnly':
432+
if not skip_update:
433+
if update_by is None:
434+
update_by_patch_command = None
435+
update_by_generic_command = None
436+
if path_item.patch is not None and 'patch' in methods:
437+
cmd_builder = CMDBuilder(path=resource.path, method='patch', mutability=MutabilityEnum.Update,
438+
parameterized_host=parameterized_host)
439+
op = self.generate_operation(cmd_builder, path_item, instance_var)
440+
update_by_patch_command = self.generate_command(path_item, resource, instance_var, cmd_builder, op)
441+
if path_item.get is not None and path_item.put is not None and 'get' in methods and 'put' in methods:
442+
cmd_builder = CMDBuilder(path=resource.path,
443+
parameterized_host=parameterized_host)
444+
get_op = self.generate_operation(
445+
cmd_builder, path_item, instance_var, method='get', mutability=MutabilityEnum.Read)
446+
put_op = self.generate_operation(
447+
cmd_builder, path_item, instance_var, method='put', mutability=MutabilityEnum.Update)
448+
update_by_generic_command = self.generate_generic_update_command(path_item, resource, instance_var,
449+
cmd_builder, get_op, put_op)
450+
# generic update command first, patch update command after that
451+
if update_by_generic_command:
452+
command_group.commands.append(update_by_generic_command)
453+
elif update_by_patch_command:
454+
command_group.commands.append(update_by_patch_command)
455+
elif update_by == 'GenericOnly':
452456
if path_item.get is None or path_item.put is None:
453457
raise exceptions.InvalidAPIUsage(f"Invalid update_by resource: resource needs to have 'get' and 'put' operations: '{resource}'")
454458
if 'get' not in methods or 'put' not in methods:

src/aaz_dev/swagger/model/schema/operation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from schematics.types import StringType, ModelType, ListType, DictType, BooleanType, PolyModelType
66

77
from command.model.configuration import CMDHttpOperation, CMDHttpAction, CMDHttpRequest, CMDHttpRequestPath, \
8-
CMDHttpRequestQuery, CMDHttpRequestHeader, CMDHttpRequestJsonBody, CMDRequestJson, CMDRequestBytes, CMDHttpRequestBytesBody, CMDHttpOperationLongRunning
8+
CMDHttpRequestQuery, CMDHttpRequestHeader, CMDHttpRequestJsonBody, CMDRequestJson, CMDRequestBinary, CMDHttpRequestBinaryBody, CMDHttpOperationLongRunning
99
from swagger.utils import exceptions
1010
from swagger.utils.tools import swagger_resource_path_to_resource_id_template
1111
from .example_item import XmsExamplesField
@@ -225,8 +225,8 @@ def to_cmd(self, builder, parent_parameters, host_path, **kwargs):
225225
if isinstance(model, CMDRequestJson):
226226
request.body = CMDHttpRequestJsonBody()
227227
request.body.json = model
228-
elif isinstance(model, CMDRequestBytes):
229-
request.body = CMDHttpRequestBytesBody()
228+
elif isinstance(model, CMDRequestBinary):
229+
request.body = CMDHttpRequestBinaryBody()
230230
request.body.bytes = model
231231
else:
232232
raise NotImplementedError()

src/aaz_dev/swagger/model/schema/parameter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22

33
from command.model.configuration import CMDRequestJson, CMDBooleanSchema, CMDStringSchema, CMDObjectSchema, \
4-
CMDArraySchema, CMDFloatSchema, CMDIntegerSchema, CMDBinarySchema, CMDRequestBytes
4+
CMDArraySchema, CMDFloatSchema, CMDIntegerSchema, CMDBinarySchema, CMDRequestBinary
55
from schematics.models import Model
66
from schematics.types import StringType, BooleanType, ModelType, PolyModelType, BaseType
77
from swagger.utils import exceptions
@@ -206,7 +206,7 @@ def to_cmd(self, builder, **kwargs):
206206
)
207207
return None
208208
if isinstance(v, CMDBinarySchema):
209-
model = CMDRequestBytes()
209+
model = CMDRequestBinary()
210210
model.schema = v
211211
v.required = self.required
212212
elif isinstance(v, (

0 commit comments

Comments
 (0)