Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Spring Cloud] Add buildpack-binding command for Enterprise tier. #4302

Merged
merged 21 commits into from
Jan 11, 2022
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
61 changes: 61 additions & 0 deletions src/spring-cloud/azext_spring_cloud/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -846,3 +846,64 @@
type: command
short-summary: Unbind a custom-domain of the API portal.
"""

helps['spring-cloud build-service'] = """
type: group
short-summary: (Support Enterprise Tier Only) Commands to manage build service in Azure Spring Cloud.
"""

helps['spring-cloud build-service builder'] = """
type: group
short-summary: (Support Enterprise Tier Only) Commands to manage builder of build service.
"""

helps['spring-cloud build-service builder buildpack-binding'] = """
type: group
short-summary: (Support Enterprise Tier Only) Commands to manage buildpack-binding of builder.
"""

helps['spring-cloud build-service builder buildpack-binding create'] = """
type: command
short-summary: (Support Enterprise Tier Only) Create a buildpack binding.
examples:
- name: Create a buildpack binding without properties or secrets.
text: az spring-cloud build-service builder buildpack-binding create --name first-binding --builder-name first-builder --type ApplicationInsights --service MyCluster --resource-group MyResourceGroup
- name: Create a buildpack binding with only secrets.
text: az spring-cloud build-service builder buildpack-binding create --name first-binding --builder-name first-builder --type ApplicationInsights --secrets k1=v1 k2=v2 --service MyCluster --resource-group MyResourceGroup
- name: Create a buildpack binding with only properties.
text: az spring-cloud build-service builder buildpack-binding create --name first-binding --builder-name first-builder --type ApplicationInsights --properties a=b c=d --service MyCluster --resource-group MyResourceGroup
- name: Create a buildpack binding with properties and secrets.
text: az spring-cloud build-service builder buildpack-binding create --name first-binding --builder-name first-builder --type ApplicationInsights --properties a=b c=d --secrets k1=v1 k2=v2 --service MyCluster --resource-group MyResourceGroup
"""

helps['spring-cloud build-service builder buildpack-binding set'] = """
type: command
short-summary: (Support Enterprise Tier Only) Set a buildpack binding.
examples:
- name: Set a buildpack binding with properties and secrets.
text: az spring-cloud build-service builder buildpack-binding set --name first-binding --builder-name first-builder --type ApplicationInsights --properties a=b c=d --secrets k1=v1 k2=v2 --service MyCluster --resource-group MyResourceGroup
"""

helps['spring-cloud build-service builder buildpack-binding show'] = """
type: command
short-summary: (Support Enterprise Tier Only) Show a buildpack binding. The secrets will be masked.
examples:
- name: Show a buildpack binding.
text: az spring-cloud build-service builder buildpack-binding show --name first-binding --builder-name first-builder --service MyCluster --resource-group MyResourceGroup
"""

helps['spring-cloud build-service builder buildpack-binding list'] = """
type: command
short-summary: (Support Enterprise Tier Only) List all buildpack binding in a builder. The secrets will be masked.
examples:
- name: List all buildpack binding of a builder.
text: az spring-cloud build-service builder buildpack-binding list --builder-name first-builder --service MyCluster --resource-group MyResourceGroup
"""

helps['spring-cloud build-service builder buildpack-binding delete'] = """
type: command
short-summary: (Support Enterprise Tier Only) Delete a buildpack binding.
examples:
- name: Delete a buildpack binding.
text: az spring-cloud build-service builder buildpack-binding delete --name first-binding --builder-name first-builder --service MyCluster --resource-group MyResourceGroup
"""
46 changes: 43 additions & 3 deletions src/spring-cloud/azext_spring_cloud/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,18 @@
validate_tracing_parameters_asc_create, validate_tracing_parameters_asc_update,
validate_app_insights_parameters, validate_instance_count, validate_java_agent_parameters,
validate_jar)
from ._validators_enterprise import (only_support_enterprise,
validate_git_uri, validate_acs_patterns,
validate_routes)
from ._validators_enterprise import (only_support_enterprise, validate_git_uri, validate_acs_patterns, validate_routes,
validate_buildpack_binding_exist, validate_buildpack_binding_not_exist,
validate_buildpack_binding_properties, validate_buildpack_binding_secrets)
from ._app_validator import (fulfill_deployment_param, active_deployment_exist, active_deployment_exist_under_app,
ensure_not_active_deployment, validate_deloy_path, validate_deloyment_create_path,
validate_cpu, validate_memory)
from ._utils import ApiType


from .vendored_sdks.appplatform.v2020_07_01.models import RuntimeVersion, TestKeyType
from .vendored_sdks.appplatform.v2022_01_01_preview.models \
import _app_platform_management_client_enums as v20220101_preview_AppPlatformEnums
from .vendored_sdks.appplatform.v2022_01_01_preview.models._app_platform_management_client_enums import SupportedRuntimeValue, TestKeyType

name_type = CLIArgumentType(options_list=[
Expand Down Expand Up @@ -500,3 +504,39 @@ def prepare_logs_argument(c):
c.argument('app_name', type=str, help="The Azure Spring Cloud app name to configure the route.")
c.argument('routes_json', type=str, help="The JSON array of API routes.", validator=validate_routes)
c.argument('routes_file', type=str, help="The file path of JSON array of API routes.", validator=validate_routes)

for scope in ['spring-cloud build-service builder buildpack-binding create']:
with self.argument_context(scope) as c:
c.argument('name', name_type, help='Name for buildpack binding.', validator=validate_buildpack_binding_not_exist)

for scope in ['spring-cloud build-service builder buildpack-binding create',
'spring-cloud build-service builder buildpack-binding set']:
with self.argument_context(scope) as c:
c.argument('type',
arg_type=get_enum_type(v20220101_preview_AppPlatformEnums.BindingType),
help='Required type for buildpack binding.')
c.argument('properties',
help='Non-sensitive properties for launchProperties. Format "key[=value]".',
nargs='*',
validator=validate_buildpack_binding_properties)
c.argument('secrets',
help='Sensitive properties for launchProperties. '
'Once put, it will be encrypted and never return to user. '
'Format "key[=value]".',
nargs='*',
validator=validate_buildpack_binding_secrets)

for scope in ['spring-cloud build-service builder buildpack-binding set',
'spring-cloud build-service builder buildpack-binding show',
'spring-cloud build-service builder buildpack-binding delete']:
with self.argument_context(scope) as c:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
with self.argument_context(scope) as c:
for scope in ['show', 'delete']:
with self.argument_context('spring-cloud build-service builder buildpack-binding {}'.format(scope)) as c:

c.argument('name', name_type, help='Name for buildpack binding.', validator=validate_buildpack_binding_exist)

for scope in ['spring-cloud build-service builder buildpack-binding create',
'spring-cloud build-service builder buildpack-binding set',
'spring-cloud build-service builder buildpack-binding list',
'spring-cloud build-service builder buildpack-binding show',
'spring-cloud build-service builder buildpack-binding delete']:
with self.argument_context(scope) as c:
c.argument('builder_name', help='The name for builder.', default="default")
c.argument('service', service_name_type, validator=only_support_enterprise)
53 changes: 51 additions & 2 deletions src/spring-cloud/azext_spring_cloud/_validators_enterprise.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
# pylint: disable=too-few-public-methods, unused-argument, redefined-builtin

from re import match

from azure.cli.core.commands.validators import validate_tag
from azure.core.exceptions import ResourceNotFoundError
from azure.cli.core.azclierror import (ArgumentUsageError, ClientRequestError,
InvalidArgumentValueError,
MutuallyExclusiveArgumentError)
Expand All @@ -15,8 +16,11 @@
from ._resource_quantity import validate_cpu as validate_and_normalize_cpu
from ._resource_quantity import \
validate_memory as validate_and_normalize_memory
from ._util_enterprise import is_enterprise_tier
from ._util_enterprise import (
is_enterprise_tier, get_client
)
from ._validators import validate_instance_count
from .buildpack_binding import (DEFAULT_BUILD_SERVICE_NAME)

logger = get_logger(__name__)

Expand Down Expand Up @@ -116,3 +120,48 @@ def validate_api_portal_instance_count(namespace):
if namespace.api_portal_instance_count is not None:
if namespace.api_portal_instance_count < 1:
raise InvalidArgumentValueError("--api-portal-instance-count must be greater than 0")


def validate_buildpack_binding_properties(namespace):
""" Extracts multiple space-separated properties in key[=value] format """
if isinstance(namespace.properties, list):
properties_dict = {}
for item in namespace.properties:
properties_dict.update(validate_tag(item))
namespace.properties = properties_dict


def validate_buildpack_binding_secrets(namespace):
""" Extracts multiple space-separated secrets in key[=value] format """
if isinstance(namespace.secrets, list):
secrets_dict = {}
for item in namespace.secrets:
secrets_dict.update(validate_tag(item))
namespace.secrets = secrets_dict


def validate_buildpack_binding_not_exist(cmd, namespace):
client = get_client(cmd)
try:
binding_resource = client.buildpack_binding.get(namespace.resource_group,
namespace.service,
DEFAULT_BUILD_SERVICE_NAME,
namespace.builder_name,
namespace.name)
if binding_resource is not None:
raise ClientRequestError('buildpack Binding {} in builder {} already exists '
'in resource group {}, service {}. You can edit it by set command.'
.format(namespace.name, namespace.resource_group, namespace.service, namespace.builder_name))
except ResourceNotFoundError:
# Excepted case
pass


def validate_buildpack_binding_exist(cmd, namespace):
client = get_client(cmd)
# If not exists exception will be raised
client.buildpack_binding.get(namespace.resource_group,
namespace.service,
DEFAULT_BUILD_SERVICE_NAME,
namespace.builder_name,
namespace.name)
Loading