Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
137ee73
fix: --title --kind --custom-property parameters (#1)
blackchoey Mar 29, 2024
6596e67
feat: support yaml file in register command (#3)
blackchoey Apr 3, 2024
3eb2b4a
fix: workspace parameter should not be required (#2)
blackchoey Apr 3, 2024
5501669
style: fix lint issues (#6)
blackchoey Apr 9, 2024
d0ab204
chore: update codeowner for apic-extension (#5)
blackchoey Apr 9, 2024
606ee6f
feat: revert changes to min cli version (#4)
blackchoey Apr 9, 2024
f8bfdb2
feat: resolve comments to CLI experience (#10)
blackchoey Apr 15, 2024
d480a18
feat: mark "apic api register" command as preview (#13)
blackchoey Apr 16, 2024
2ffa2bb
feat: remove --terms-of-service parameter (#12)
blackchoey Apr 16, 2024
ee81ed8
feat: remove --workspace-name parameter (#11)
blackchoey Apr 16, 2024
39e2b0f
feat: support python 3.8 and 3.9 (#14)
blackchoey Apr 17, 2024
78092fd
feat: fix command descriptions (#17)
blackchoey Apr 22, 2024
6664704
tests: add test cases for 'apic service' commands (#16)
blackchoey Apr 22, 2024
52f66c9
feat: Use 03-01 spec from azure-rest-api-specs repo to regenerate CLI…
blackchoey Apr 22, 2024
71006ce
fix: CLI errors (#20)
blackchoey Apr 22, 2024
b9653df
feat: mark some parameters as required (#21)
blackchoey Apr 23, 2024
dee68ec
feat: bump version to 1.0.0b5 and update changelog (#18)
blackchoey Apr 23, 2024
5e8b743
build: fix ci (#22)
blackchoey Apr 23, 2024
f1165eb
fix: service update command failure (#28)
blackchoey Apr 25, 2024
2896933
doc: fix command samples (#30)
blackchoey Apr 25, 2024
dc8bed5
doc: update changelog per feedback (#29)
blackchoey Apr 25, 2024
447acf0
doc: remove extra spaces in register command help message (#34)
blackchoey Apr 25, 2024
a716873
doc: update api definition and metadata command samples (#36)
blackchoey Apr 26, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

/src/subscription/ @wilcobmsft

/src/apic-extension/ @arpishahmsft
/src/apic-extension/ @arpishahmsft @blackchoey @adashen
Comment thread
blackchoey marked this conversation as resolved.

/src/alias/ @Juliehzl

Expand Down
9 changes: 8 additions & 1 deletion src/apic-extension/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,14 @@ Release History

1.0.0b5
+++++
* Remove: All portal commands as it should not be exposed to customers.
* Add: Support yaml file for `az apic api register` command.
* Update: Command names, parameter names, and command descriptions for better understanding. Please leverage `-h` option or refer Azure CLI reference doc to see full list of commands and parameters.
* Update: Introduction to parameter constraints to ensure that valid values are provided.
* Update: Minimum Azure CLI version requirement is updated to 2.57.
* Fix: Various bug fixes for lastest preview version.
* Remove: Portal commands as we don't support this capability any longer.
* Remove: `--workspace-name` and `--terms-of-service` parameters are removed as they are not expected to be exposed.
* Remove: `head` commands in each command group are removed.

1.0.0b4
+++++
Expand Down
18 changes: 7 additions & 11 deletions src/apic-extension/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ az apic service delete --resource-group api-center-test --service-name contosoeu
az apic service delete --resource-group arpi-test-rg1 -s apictestcli3
```

Show Workspace Example
```
Az apic workspace show -g api-center-test -s contosoeuap --name devdiv
```

Create API Examples
```
az apic api create -g api-center-test -s contosoeuap --name echo-api --title "Echo API" --kind "rest"
Expand All @@ -50,10 +45,10 @@ az apic api create --resource-group api-center-test --service-name contosoeuap -

Update API Examples
```
az apic api update -g api-center-test -s contosoeuap --name echo-api --summary "Basic REST API service" -w default
az apic api update -g api-center-test -s contosoeuap --name echo-api --summary "Basic REST API service"
```
```
az apic api update --resource-group api-center-test -s contosoeuap --name echo-api --summary "Basic REST API service" --workspace-name default
az apic api update --resource-group api-center-test -s contosoeuap --name echo-api --summary "Basic REST API service"
```

LIST Api Example
Expand Down Expand Up @@ -90,10 +85,10 @@ az apic api version create --resource-group api-center-test --service-name conto

UPDATE Api Version Examples
```
Az apic api version update -g api-center-test -s contosoeuap --api-name echo-api --name 2023-01-01 --title "2023-01-01" -w default
Az apic api version update -g api-center-test -s contosoeuap --api-name echo-api --name 2023-01-01 --title "2023-01-01"
```
```
az apic api version update --resource-group api-center-test --service-name contosoeuap --api-name echo-api --name 2023-01-01 --title "2023-01-01" --workspace-name default
az apic api version update --resource-group api-center-test --service-name contosoeuap --api-name echo-api --name 2023-01-01 --title "2023-01-01"
```

LIST Api Version Examples
Expand Down Expand Up @@ -127,7 +122,7 @@ az apic api definition create -g api-center-test -s contosoeuap --api-name echo-

UPDATE API Definition Example
```
az apic api definition update -g api-center-test -s contosoeuap --api-name echo-api --version 2023-01-01 --name "openapi" --title "OpenAPI" -w default
az apic api definition update -g api-center-test -s contosoeuap --api-name echo-api --version 2023-01-01 --name "openapi" --title "OpenAPI"
```

SHOW API Definition Example
Expand Down Expand Up @@ -209,7 +204,7 @@ Where envcreate1.json contains

UPDATE Environment
```
az apic environment update -g api-center-test -s contosoeuap --name public --title "Public cloud" -w default
az apic environment update -g api-center-test -s contosoeuap --name public --title "Public cloud"
```

LIST Environment
Expand Down Expand Up @@ -283,4 +278,5 @@ az apic metadata-schema export-metadata-schema -g api-center-test -s contosoeuap
Register API or Quick Add
```
az apic api register -g api-center-test -s contosoeuap --api-location "C:/Users/arpishah/examples/cli-examples/spec-examples/openai.json" --environment-name public
az apic api register -g api-center-test -s contosoeuap --api-location "C:/Users/arpishah/examples/cli-examples/spec-examples/openai.yml" --environment-name public
```
Comment thread
blackchoey marked this conversation as resolved.
22 changes: 20 additions & 2 deletions src/apic-extension/azext_apic_extension/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
#
# Code generated by aaz-dev-tools
# --------------------------------------------------------------------------------------------
from typing import Type

from azure.cli.core import AzCommandsLoader
from azure.cli.core.aaz import AAZCommand
from azext_apic_extension._help import helps # pylint: disable=unused-import


Expand All @@ -19,7 +21,7 @@ def __init__(self, cli_ctx=None):
custom_command_type=custom_command_type)

def load_command_table(self, args):
from azext_apic_extension.commands import load_command_table
from azext_apic_extension.commands import load_custom_commands
from azure.cli.core.aaz import load_aaz_command_table
try:
from . import aaz
Expand All @@ -31,12 +33,28 @@ def load_command_table(self, args):
aaz_pkg_name=aaz.__name__,
args=args
)
load_command_table(self, args)
load_command_patches(self)
load_custom_commands(self, args)
return self.command_table

def load_arguments(self, command):
from azext_apic_extension._params import load_arguments
load_arguments(self, command)


def is_aaz_command_subclass(value: Type) -> bool:
return isinstance(value, type) and issubclass(value, AAZCommand)


def load_command_patches(loader: AzCommandsLoader) -> None:
import inspect
from azext_apic_extension import command_patches

for _, value in inspect.getmembers(command_patches):
# Only load custom commands from the command_patches module
if is_aaz_command_subclass(value) and value.__module__ == command_patches.__name__:
if value.AZ_NAME:
loader.command_table[value.AZ_NAME] = value(loader=loader)


COMMAND_LOADER_CLS = ApicExtensionCommandsLoader
5 changes: 3 additions & 2 deletions src/apic-extension/azext_apic_extension/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@

helps['apic api register'] = """
type: command
short-summary: Single Command for registering api, api version, api definition, import spec, create deployment provided a spec file.
short-summary: Registers a new API with version, definition, and associated deployments using the specification file as the source of truth.
parameters:
- name: --api-location -l
type: string
short-summary: Location of spec file .
short-summary: Location of spec file.
- name: --resource-group -g
type: string
short-summary: Resource group name.
Expand All @@ -30,4 +30,5 @@
- name: Register api by providing spec file.
text: |
az apic api register -g api-center-test -s contosoeuap --api-location "examples/cli-examples/spec-examples/openai.json" --environment-name public
az apic api register -g api-center-test -s contosoeuap --api-location "examples/cli-examples/spec-examples/openai.yml" --environment-name public
Comment thread
blackchoey marked this conversation as resolved.
"""
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from .__cmd_group import *
from ._create import *
from ._delete import *
from ._head import *
from ._list import *
from ._show import *
from ._update import *
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@
"apic api create",
)
class Create(AAZCommand):
"""Create new or updates existing API.
"""Register a new API or update an existing API.

:example: Create API
az apic api create -g contoso-resources -s contoso --name echo-api --title "Echo API"
az apic api create -g contoso-resources -s contoso --api-id echo-api --title "Echo API" --type REST

:example: Create API with custom properties
Comment thread
blackchoey marked this conversation as resolved.
az apic api create -g contoso-resources -s contoso --api-id echo-api --title "Echo API" --type REST --custom-properties '{\"public-facing\":true}'
"""

_aaz_info = {
Expand All @@ -44,11 +47,12 @@ def _build_arguments_schema(cls, *args, **kwargs):
# define Arg Group ""

_args_schema = cls._args_schema
_args_schema.api_name = AAZStrArg(
options=["--api", "--name", "--api-name"],
help="The name of the API.",
_args_schema.api_id = AAZStrArg(
options=["--api-id"],
help="The id of the API.",
required=True,
fmt=AAZStrArgFormat(
pattern="^[a-zA-Z0-9-]{3,90}$",
max_length=90,
min_length=1,
),
Expand All @@ -61,6 +65,7 @@ def _build_arguments_schema(cls, *args, **kwargs):
help="The name of the API Center service.",
required=True,
fmt=AAZStrArgFormat(
pattern="^[a-zA-Z0-9-]{3,90}$",
max_length=90,
min_length=1,
),
Expand All @@ -71,6 +76,7 @@ def _build_arguments_schema(cls, *args, **kwargs):
required=True,
default="default",
fmt=AAZStrArgFormat(
pattern="^[a-zA-Z0-9-]{3,90}$",
max_length=90,
min_length=1,
),
Expand All @@ -84,7 +90,7 @@ def _build_arguments_schema(cls, *args, **kwargs):
arg_group="Properties",
help="The contact information for the API.",
)
_args_schema.custom_properties = AAZObjectArg(
_args_schema.custom_properties = AAZFreeFormDictArg(
options=["--custom-properties"],
arg_group="Properties",
help="The custom metadata defined for API catalog entities.",
Expand All @@ -103,10 +109,11 @@ def _build_arguments_schema(cls, *args, **kwargs):
arg_group="Properties",
help="Additional, external documentation for the API.",
)
_args_schema.kind = AAZStrArg(
options=["--kind"],
_args_schema.type = AAZStrArg(
options=["--type"],
arg_group="Properties",
help="Kind of API. For example, REST or GraphQL.",
help="Type of API.",
required=True,
enum={"graphql": "graphql", "grpc": "grpc", "rest": "rest", "soap": "soap", "webhook": "webhook", "websocket": "websocket"},
)
_args_schema.license = AAZObjectArg(
Expand All @@ -122,15 +129,11 @@ def _build_arguments_schema(cls, *args, **kwargs):
max_length=200,
),
)
_args_schema.terms_of_service = AAZObjectArg(
options=["--terms-of-service"],
arg_group="Properties",
help="Terms of service for the API.",
)
_args_schema.title = AAZStrArg(
options=["--title"],
arg_group="Properties",
help="API title.",
required=True,
fmt=AAZStrArgFormat(
max_length=50,
min_length=1,
Expand Down Expand Up @@ -212,16 +215,6 @@ def _build_arguments_schema(cls, *args, **kwargs):
max_length=200,
),
)

terms_of_service = cls._args_schema.terms_of_service
terms_of_service.url = AAZStrArg(
options=["url"],
help="URL pointing to the terms of service.",
required=True,
fmt=AAZStrArgFormat(
max_length=200,
),
)
return cls._args_schema

def _execute_operations(self):
Expand Down Expand Up @@ -271,7 +264,7 @@ def error_format(self):
def url_parameters(self):
parameters = {
**self.serialize_url_param(
"apiName", self.ctx.args.api_name,
"apiName", self.ctx.args.api_id,
required=True,
),
**self.serialize_url_param(
Expand Down Expand Up @@ -322,18 +315,17 @@ def content(self):
typ=AAZObjectType,
typ_kwargs={"flags": {"required": True, "client_flatten": True}}
)
_builder.set_prop("properties", AAZObjectType, typ_kwargs={"flags": {"client_flatten": True}})
_builder.set_prop("properties", AAZObjectType, ".", typ_kwargs={"flags": {"required": True, "client_flatten": True}})

properties = _builder.get(".properties")
if properties is not None:
properties.set_prop("contacts", AAZListType, ".contacts")
properties.set_prop("customProperties", AAZObjectType, ".custom_properties")
properties.set_prop("customProperties", AAZFreeFormDictType, ".custom_properties")
properties.set_prop("description", AAZStrType, ".description")
properties.set_prop("externalDocumentation", AAZListType, ".external_documentation")
properties.set_prop("kind", AAZStrType, ".kind", typ_kwargs={"flags": {"required": True}})
properties.set_prop("kind", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}})
properties.set_prop("license", AAZObjectType, ".license")
properties.set_prop("summary", AAZStrType, ".summary")
properties.set_prop("termsOfService", AAZObjectType, ".terms_of_service")
properties.set_prop("title", AAZStrType, ".title", typ_kwargs={"flags": {"required": True}})

contacts = _builder.get(".properties.contacts")
Expand All @@ -346,6 +338,10 @@ def content(self):
_elements.set_prop("name", AAZStrType, ".name")
_elements.set_prop("url", AAZStrType, ".url")

custom_properties = _builder.get(".properties.customProperties")
if custom_properties is not None:
custom_properties.set_anytype_elements(".")

external_documentation = _builder.get(".properties.externalDocumentation")
if external_documentation is not None:
external_documentation.set_elements(AAZObjectType, ".")
Expand All @@ -362,10 +358,6 @@ def content(self):
license.set_prop("name", AAZStrType, ".name")
license.set_prop("url", AAZStrType, ".url")

terms_of_service = _builder.get(".properties.termsOfService")
if terms_of_service is not None:
terms_of_service.set_prop("url", AAZStrType, ".url", typ_kwargs={"flags": {"required": True}})

return self.serialize_content(_content_value)

def on_200_201(self, session):
Expand Down Expand Up @@ -393,7 +385,7 @@ def _build_schema_on_200_201(cls):
flags={"read_only": True},
)
_schema_on_200_201.properties = AAZObjectType(
flags={"client_flatten": True},
flags={"required": True, "client_flatten": True},
)
_schema_on_200_201.system_data = AAZObjectType(
serialized_name="systemData",
Expand All @@ -405,7 +397,7 @@ def _build_schema_on_200_201(cls):

properties = cls._schema_on_200_201.properties
properties.contacts = AAZListType()
properties.custom_properties = AAZObjectType(
properties.custom_properties = AAZFreeFormDictType(
serialized_name="customProperties",
)
properties.description = AAZStrType()
Expand All @@ -418,6 +410,7 @@ def _build_schema_on_200_201(cls):
properties.license = AAZObjectType()
properties.lifecycle_stage = AAZStrType(
serialized_name="lifecycleStage",
flags={"read_only": True},
)
properties.summary = AAZStrType()
properties.terms_of_service = AAZObjectType(
Expand Down
Loading