Skip to content

Commit

Permalink
[Spring Cloud] Add buildpack-binding command for Enterprise tier. (#4302
Browse files Browse the repository at this point in the history
)

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

* Add create, show, set, delete and list for buildpack-binding.
* Add enable app insights when create Enterprise tier.

Signed-off-by: Pan Li <panli@microsoft.com>

* Minor change.

Signed-off-by: Pan Li <panli@microsoft.com>

* format.

Signed-off-by: Pan Li <panli@microsoft.com>

* Make linter happy.

Signed-off-by: Pan Li <panli@microsoft.com>

* Reset help.py.

Signed-off-by: Pan Li <panli@microsoft.com>

* Re-add help.py

Signed-off-by: Pan Li <panli@microsoft.com>

* Add EOF.

Signed-off-by: Pan Li <panli@microsoft.com>

* Add UT for create enterprise tier with app insights.

Signed-off-by: Pan Li <panli@microsoft.com>

* Add record test for buildpack bindings.

Signed-off-by: Pan Li <panli@microsoft.com>

* Resolve comments.

Signed-off-by: Pan Li <panli@microsoft.com>

* Resolve comments.

Signed-off-by: Pan Li <panli@microsoft.com>

* Resolve comments and make static check happy.

Signed-off-by: Pan Li <panli@microsoft.com>

* Make static check happy.

Signed-off-by: Pan Li <panli@microsoft.com>

* Resolve comments.

Signed-off-by: Pan Li <panli@microsoft.com>

* Resolve comments.

Signed-off-by: Pan Li <panli@microsoft.com>

* Replace CRLF to LF.

Signed-off-by: Pan Li <panli@microsoft.com>

* Minor change format.

Signed-off-by: Pan Li <panli@microsoft.com>

* Make static check happy.

Signed-off-by: Pan Li <panli@microsoft.com>

* Merge parmas.

Signed-off-by: Pan Li <panli@microsoft.com>
  • Loading branch information
Incarnation-p-lee committed Jan 11, 2022
1 parent 6b20f68 commit f549964
Show file tree
Hide file tree
Showing 9 changed files with 1,993 additions and 7 deletions.
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:
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

0 comments on commit f549964

Please sign in to comment.