Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 7 additions & 2 deletions src/spring/HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
Release History
===============
1.12.0 (WIP)
1.12.0
---
* Add new command `az spring container-registry create` to craete container registry resource.
* Add new command `az spring container-registry delete` to delete container registry resource.
* Add new command `az spring container-registry list` to list all the container registry resources.
* Add new command `az spring build-service update` to update build service.
* Add new command `az spring build-service show` to show build service resource.
* Add new parameter `--workload-profile` for `az spring app create` and `az spring app update`.

1.11.3
Expand Down Expand Up @@ -216,4 +221,4 @@ and `spring app deployment update` have new arguments "--enable-liveness-probe",

1.0.0
---
* Initialize extension "Spring" to manage Azure Spring Apps resources.
* Initialize extension "Spring" to manage Azure Spring Apps resources.
26 changes: 24 additions & 2 deletions src/spring/azext_spring/_build_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import json
from azure.cli.core.util import sdk_no_wait
from .vendored_sdks.appplatform.v2023_03_01_preview import models
from .vendored_sdks.appplatform.v2023_05_01_preview import models
from ._buildservices_factory import BuildService
from azure.cli.core.commands import LongRunningOperation
from azure.cli.core.commands.client_factory import get_subscription_id
Expand Down Expand Up @@ -89,7 +89,7 @@ def builder_delete(cmd, client, resource_group, service, name, no_wait=False):
return sdk_no_wait(no_wait, client.build_service_builder.begin_delete, resource_group, service, DEFAULT_BUILD_SERVICE_NAME, name)


def update_container_registry(cmd, client, resource_group, service, name=None, server=None, username=None, password=None):
def create_or_update_container_registry(cmd, client, resource_group, service, name=None, server=None, username=None, password=None):
container_registry_properties = models.ContainerRegistryProperties(
credentials=models.ContainerRegistryBasicCredentials(
server=server,
Expand All @@ -105,6 +105,14 @@ def container_registry_show(cmd, client, resource_group, service, name=None):
return client.container_registries.get(resource_group, service, name)


def container_registry_delete(cmd, client, resource_group, service, name, no_wait=False):
return sdk_no_wait(no_wait, client.container_registries.begin_delete, resource_group, service, name)


def container_registry_list(cmd, client, resource_group, service):
return client.container_registries.list(resource_group, service)


def create_or_update_build(cmd, client, resource_group, service, name=None, builder=None, build_env=None,
build_cpu=None, build_memory=None, source_path=None, artifact_path=None, disable_validation=None):
build_service = BuildService(cmd, client, resource_group, service)
Expand Down Expand Up @@ -141,6 +149,20 @@ def build_result_list(cmd, client, resource_group, service, build_name=None):
return client.build_service.list_build_results(resource_group, service, DEFAULT_BUILD_SERVICE_NAME, build_name)


def update_build_service(cmd, client, resource_group, service, registry_name=None):
subscription = get_subscription_id(cmd.cli_ctx)
service_resource_id = '/subscriptions/{}/resourceGroups/{}/providers/Microsoft.AppPlatform/Spring/{}'.format(subscription, resource_group, service)
build_service_properties = models.BuildServiceProperties(
container_registry='{}/containerregistries/{}'.format(service_resource_id, registry_name) if registry_name else None)
build_service_resource = models.BuildService(
properties=build_service_properties)
return client.build_service.begin_create_or_update(resource_group, service, DEFAULT_BUILD_SERVICE_NAME, build_service_resource)


def build_service_show(cmd, client, resource_group, service):
return client.build_service.get_build_service(resource_group, service, DEFAULT_BUILD_SERVICE_NAME)


def _update_builder(builder_file, builder_json):
if builder_file is not None:
with open(builder_file, 'r') as json_file:
Expand Down
2 changes: 1 addition & 1 deletion src/spring/azext_spring/_client_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# --------------------------------------------------------------------------------------------
from azure.cli.core.commands.client_factory import get_mgmt_service_client
from azure.cli.core.profiles import ResourceType
from .vendored_sdks.appplatform.v2023_03_01_preview import AppPlatformManagementClient
from .vendored_sdks.appplatform.v2023_05_01_preview import AppPlatformManagementClient


def cf_spring(cli_ctx, *_):
Expand Down
46 changes: 44 additions & 2 deletions src/spring/azext_spring/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,24 @@
short-summary: (Enterprise Tier Only) Commands to manage Build Service
"""

helps['spring build-service update'] = """
type: command
short-summary: Update the build service.
examples:
- name: Update the build service when using your own container registry.
text: az spring build-service update --registry-name my-acr --service clitest --resource-group cli
- name: Update the build service when using ASA own container registry.
text: az spring build-service update --service clitest --resource-group cli
"""

helps['spring build-service show'] = """
type: command
short-summary: Show the build service.
examples:
- name: Show the build service.
text: az spring build-service show --service clitest --resource-group cli
"""

helps['spring build-service builder'] = """
type: group
short-summary: (Enterprise Tier Only) Commands to manage Builder Resource
Expand Down Expand Up @@ -797,20 +815,44 @@
short-summary: (Enterprise Tier Only) Commands to manage Container Registry Resource
"""

helps['spring container-registry create'] = """
type: command
short-summary: Create a container registry.
examples:
- name: Create a container registry.
text: az spring container-registry create --name my-acr --server test.azurecr.io --username test --password xxx --service clitest --resource-group cli
"""

helps['spring container-registry update'] = """
type: command
short-summary: Update a container registry.
examples:
- name: Update a container registry.
text: az spring container-registry update --name default --server test.azurecr.io --username test --password xxx --service clitest --resource-group cli
text: az spring container-registry update --name my-acr --server test.azurecr.io --username test --password xxx --service clitest --resource-group cli
"""

helps['spring container-registry delete'] = """
type: command
short-summary: Delete a container registry.
examples:
- name: Delete a container registry.
text: az spring container-registry delete --name my-acr --service clitest --resource-group cli
"""

helps['spring container-registry show'] = """
type: command
short-summary: Show a container registry.
examples:
- name: Show a container registry.
text: az spring container-registry show --name default --service clitest --resource-group cli
text: az spring container-registry show --name my-acr --service clitest --resource-group cli
"""

helps['spring container-registry list'] = """
type: command
short-summary: List all container registries.
examples:
- name: List all container registries.
text: az spring container-registry list --service clitest --resource-group cli
"""

helps['spring application-live-view'] = """
Expand Down
28 changes: 21 additions & 7 deletions src/spring/azext_spring/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
validate_managed_environment, validate_dataplane_public_endpoint)
from ._validators_enterprise import (only_support_enterprise, validate_builder_resource, validate_builder_create,
validate_source_path, validate_artifact_path, validate_build_create,
validate_build_update, validate_container_registry, validate_central_build_instance,
validate_build_update, validate_container_registry_create,
validate_container_registry_update, validate_central_build_instance,
validate_builder_update, validate_build_pool_size, validate_build_service,
validate_git_uri, validate_acc_git_url, validate_acc_git_refs, validate_acs_patterns, validate_config_file_patterns,
validate_routes, validate_gateway_instance_count, validate_git_interval,
Expand Down Expand Up @@ -705,14 +706,27 @@ def prepare_logs_argument(c):
with self.argument_context('spring container-registry') as c:
c.argument('service', service_name_type, validator=only_support_enterprise)

with self.argument_context('spring container-registry create') as c:
c.argument('name', help="The container registry name.", validator=validate_container_registry_create)
c.argument('server', help="The container registry sever.", validator=validate_container_registry_create)
c.argument('username', help="The container registry username.", validator=validate_container_registry_create)
c.argument('password', help="The container registry password.", validator=validate_container_registry_create)

with self.argument_context('spring container-registry update') as c:
c.argument('name', help="The container registry name.", validator=validate_container_registry)
c.argument('server', help="The container registry sever.", validator=validate_container_registry)
c.argument('username', help="The container registry username.", validator=validate_container_registry)
c.argument('password', help="The container registry password.", validator=validate_container_registry)
c.argument('name', help="The container registry name.", validator=validate_container_registry_update)
c.argument('server', help="The container registry sever.", validator=validate_container_registry_update)
c.argument('username', help="The container registry username.", validator=validate_container_registry_update)
c.argument('password', help="The container registry password.", validator=validate_container_registry_update)

for scope in ['show', 'delete']:
with self.argument_context('spring container-registry {}'.format(scope)) as c:
c.argument('name', help="The container registry name.")

with self.argument_context('spring build-service') as c:
c.argument('service', service_name_type, validator=only_support_enterprise)

with self.argument_context('spring container-registry show') as c:
c.argument('name', help="The container registry name.")
with self.argument_context('spring build-service update') as c:
c.argument('registry_name', help="The container registry name.")

with self.argument_context('spring build-service build') as c:
c.argument('service', service_name_type, validator=validate_central_build_instance)
Expand Down
14 changes: 14 additions & 0 deletions src/spring/azext_spring/_transformers.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,3 +325,17 @@ def transform_build_result_output(result):
item['Image'] = item['properties']['image']

return result if is_list else result[0]


def transform_container_registry_output(result):
is_list = isinstance(result, list)

if not is_list:
result = [result]

for item in result:
item['Name'] = item['name']
item['Server'] = item['properties']['server']
item['Username'] = item['properties']['username']

return result if is_list else result[0]
2 changes: 1 addition & 1 deletion src/spring/azext_spring/_util_enterprise.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

# pylint: disable=wrong-import-order

from .vendored_sdks.appplatform.v2023_03_01_preview import AppPlatformManagementClient
from .vendored_sdks.appplatform.v2023_05_01_preview import AppPlatformManagementClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client


Expand Down
23 changes: 21 additions & 2 deletions src/spring/azext_spring/_validators_enterprise.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,10 +245,29 @@ def validate_artifact_path(namespace):
"https://aka.ms/ascdependencies for more details")


def validate_container_registry(cmd, namespace):
def validate_container_registry_update(cmd, namespace):
validate_container_registry(namespace)
client = get_client(cmd)
try:
client.container_registries.get(namespace.resource_group, namespace.service, namespace.name)
except ResourceNotFoundError:
raise ClientRequestError('Container Registry {} does not exist.'.format(namespace.name))


def validate_container_registry_create(cmd, namespace):
validate_container_registry(namespace)
client = get_client(cmd)
try:
container_registry = client.container_registries.get(namespace.resource_group, namespace.service, namespace.name)
if container_registry is not None:
raise ClientRequestError('Container Registry {} already exists.'.format(namespace.name))
except ResourceNotFoundError:
pass


def validate_container_registry(namespace):
if not namespace.name or not namespace.username or not namespace.password or not namespace.server:
raise InvalidArgumentValueError('The --name, --server, --username and --password must be provided.')
validate_central_build_instance(cmd, namespace)


def validate_cpu(namespace):
Expand Down
15 changes: 11 additions & 4 deletions src/spring/azext_spring/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
transform_predefined_accelerator_output,
transform_customized_accelerator_output,
transform_build_output,
transform_build_result_output)
transform_build_result_output,
transform_container_registry_output)
from ._validators import validate_app_insights_command_not_supported_tier
from ._marketplace import (transform_marketplace_plan_output)
from ._validators_enterprise import (validate_gateway_update, validate_api_portal_update, validate_dev_tool_portal, validate_customized_accelerator, validate_central_build_instance)
Expand Down Expand Up @@ -396,8 +397,11 @@ def load_command_table(self, _):
with self.command_group('spring container-registry',
custom_command_type=build_service_cmd_group,
exception_handler=handle_asc_exception) as g:
g.custom_command('update', 'update_container_registry', supports_no_wait=True)
g.custom_command('create', 'create_or_update_container_registry', supports_no_wait=True)
g.custom_command('update', 'create_or_update_container_registry', supports_no_wait=True)
g.custom_show_command('show', 'container_registry_show')
g.custom_show_command('list', 'container_registry_list', table_transformer=transform_container_registry_output)
g.custom_command('delete', 'container_registry_delete', supports_no_wait=True, confirmation=True)

with self.command_group('spring build-service build',
custom_command_type=build_service_cmd_group,
Expand All @@ -414,8 +418,11 @@ def load_command_table(self, _):
g.custom_show_command('show', 'build_result_show')
g.custom_show_command('list', 'build_result_list', table_transformer=transform_build_result_output)

with self.command_group('spring build-service', exception_handler=handle_asc_exception):
pass
with self.command_group('spring build-service',
custom_command_type=build_service_cmd_group,
exception_handler=handle_asc_exception) as g:
g.custom_command('update', 'update_build_service', supports_no_wait=True)
g.custom_show_command('show', 'build_service_show')

with self.command_group('spring', exception_handler=handle_asc_exception):
pass
Loading