Skip to content

Commit 1488170

Browse files
authored
[Containerapp] az containerapp create/update: Fix --bind/--unbind when cloud is not AzureCloud (#8405)
1 parent bebcb68 commit 1488170

File tree

4 files changed

+48
-29
lines changed

4 files changed

+48
-29
lines changed

src/containerapp/HISTORY.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Release History
44
===============
55
upcoming
66
++++++
7+
* 'az containerapp create/update': Fix an issue about `--bind`/`--unbind` when the cloud is not AzureCloud.
78
* 'az containerapp debug': Open an SSH-like interactive shell within a container app debug console.
89
* 'az containerapp connected-env certificate upload/remove': Support `--no-wait`.
910
* 'az containerapp connected-env dapr-component set/remove': Support `--no-wait`.

src/containerapp/azext_containerapp/_client_factory.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,9 @@ def connected_k8s_client_factory(cli_ctx, subscription_id=None):
152152

153153
r = get_mgmt_service_client(cli_ctx, ConnectedKubernetesClient, subscription_id=subscription_id)
154154
return r.connected_cluster
155+
156+
157+
def get_linker_client(cmd):
158+
from azure.mgmt.servicelinker import ServiceLinkerManagementClient
159+
linker_client = get_mgmt_service_client(cmd.cli_ctx, ServiceLinkerManagementClient, subscription_bound=False)
160+
return linker_client

src/containerapp/azext_containerapp/_utils.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ def validate_binding_name(binding_name):
117117

118118

119119
def check_unique_bindings(cmd, service_connectors_def_list, service_bindings_def_list, resource_group_name, name):
120+
from ._client_factory import get_linker_client
121+
120122
linker_client = get_linker_client(cmd)
121123
containerapp_def = None
122124

@@ -127,7 +129,10 @@ def check_unique_bindings(cmd, service_connectors_def_list, service_bindings_def
127129
all_bindings = []
128130

129131
if containerapp_def:
130-
managed_bindings = linker_client.linker.list(resource_uri=containerapp_def["id"])
132+
if is_cloud_supported_by_service_connector(cmd.cli_ctx):
133+
managed_bindings = linker_client.linker.list(resource_uri=containerapp_def["id"])
134+
else:
135+
managed_bindings = []
131136
service_binds = containerapp_def["properties"].get("template", {}).get("serviceBinds", [])
132137

133138
if managed_bindings:
@@ -735,6 +740,12 @@ def is_cloud_supported_by_connected_env(cli_ctx):
735740
return False
736741

737742

743+
def is_cloud_supported_by_service_connector(cli_ctx):
744+
if cli_ctx.cloud.name == 'AzureCloud':
745+
return True
746+
return False
747+
748+
738749
class AppType(Enum):
739750
ContainerApp = 1
740751
ContainerAppJob = 2

src/containerapp/azext_containerapp/containerapp_decorator.py

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
is_registry_msi_system, validate_container_app_name, AppType,
3030
safe_set, parse_metadata_flags, parse_auth_flags,
3131
ensure_workload_profile_supported, _generate_secret_volume_name,
32-
get_linker_client,
3332
safe_get, _update_revision_env_secretrefs, _add_or_update_tags, _populate_secret_values,
3433
clean_null_values, _add_or_update_env_vars, _remove_env_vars, _get_acr_cred, _ensure_identity_resource_id,
3534
create_acrpull_role_assignment, _ensure_location_allowed, get_default_workload_profile_name_from_env,
@@ -43,7 +42,7 @@
4342
ManagedServiceIdentity as ManagedServiceIdentityModel,
4443
)
4544

46-
from azure.cli.core.commands.client_factory import get_subscription_id
45+
from azure.cli.core.commands.client_factory import get_subscription_id, get_mgmt_service_client
4746
from azure.mgmt.core.tools import parse_resource_id, is_valid_resource_id
4847

4948
from knack.log import get_logger
@@ -52,7 +51,7 @@
5251
from msrest.exceptions import DeserializationError
5352

5453
from ._clients import ManagedEnvironmentClient, ConnectedEnvironmentClient, ManagedEnvironmentPreviewClient
55-
from ._client_factory import handle_raw_exception, handle_non_404_status_code_exception
54+
from ._client_factory import handle_raw_exception, handle_non_404_status_code_exception, get_linker_client
5655
from ._models import (
5756
RegistryCredentials as RegistryCredentialsModel,
5857
ContainerResources as ContainerResourcesModel,
@@ -70,7 +69,7 @@
7069
infer_runtime_option
7170
)
7271
from ._utils import parse_service_bindings, check_unique_bindings, is_registry_msi_system_environment, \
73-
env_has_managed_identity, create_acrpull_role_assignment_if_needed
72+
env_has_managed_identity, create_acrpull_role_assignment_if_needed, is_cloud_supported_by_service_connector
7473
from ._validators import validate_create, validate_runtime
7574
from ._constants import (HELLO_WORLD_IMAGE,
7675
CONNECTED_ENVIRONMENT_TYPE,
@@ -1592,25 +1591,26 @@ def _update_container_app_source(self, cmd, source, build_env_vars, registry_ser
15921591

15931592
def post_process(self, r):
15941593
# Delete managed bindings
1595-
linker_client = None
1596-
if self.get_argument_unbind_service_bindings():
1597-
linker_client = get_linker_client(self.cmd)
1598-
for item in self.get_argument_unbind_service_bindings():
1599-
while r["properties"]["provisioningState"].lower() == "inprogress":
1600-
r = self.client.show(self.cmd, self.get_argument_resource_group_name(), self.get_argument_name())
1601-
time.sleep(1)
1602-
linker_client.linker.begin_delete(resource_uri=r["id"], linker_name=item).result()
1603-
1604-
# Update managed bindings
1605-
if self.get_argument_service_connectors_def_list() is not None:
1606-
linker_client = get_linker_client(self.cmd) if linker_client is None else linker_client
1607-
for item in self.get_argument_service_connectors_def_list():
1608-
while r["properties"]["provisioningState"].lower() == "inprogress":
1609-
r = self.client.show(self.cmd, self.get_argument_resource_group_name(), self.get_argument_name())
1610-
time.sleep(1)
1611-
linker_client.linker.begin_create_or_update(resource_uri=r["id"],
1612-
parameters=item["parameters"],
1613-
linker_name=item["linker_name"]).result()
1594+
if is_cloud_supported_by_service_connector(self.cmd.cli_ctx):
1595+
linker_client = None
1596+
if self.get_argument_unbind_service_bindings():
1597+
linker_client = get_linker_client(self.cmd)
1598+
for item in self.get_argument_unbind_service_bindings():
1599+
while r["properties"]["provisioningState"].lower() == "inprogress":
1600+
r = self.client.show(self.cmd, self.get_argument_resource_group_name(), self.get_argument_name())
1601+
time.sleep(1)
1602+
linker_client.linker.begin_delete(resource_uri=r["id"], linker_name=item).result()
1603+
1604+
# Update managed bindings
1605+
if self.get_argument_service_connectors_def_list() is not None:
1606+
linker_client = get_linker_client(self.cmd) if linker_client is None else linker_client
1607+
for item in self.get_argument_service_connectors_def_list():
1608+
while r["properties"]["provisioningState"].lower() == "inprogress":
1609+
r = self.client.show(self.cmd, self.get_argument_resource_group_name(), self.get_argument_name())
1610+
time.sleep(1)
1611+
linker_client.linker.begin_create_or_update(resource_uri=r["id"],
1612+
parameters=item["parameters"],
1613+
linker_name=item["linker_name"]).result()
16141614
return r
16151615

16161616
def set_up_service_bindings(self):
@@ -1644,11 +1644,12 @@ def set_up_service_bindings(self):
16441644
for update_item in service_bindings_def_list:
16451645
if service_bindings_used_map[update_item["name"]] is False:
16461646
# Check if it doesn't exist in existing service linkers
1647-
managed_bindings = linker_client.linker.list(resource_uri=self.containerapp_def["id"])
1648-
if managed_bindings:
1649-
managed_bindings_list = [item.name for item in managed_bindings]
1650-
if update_item["name"] in managed_bindings_list:
1651-
raise ValidationError("Binding names across managed and dev services should be unique.")
1647+
if is_cloud_supported_by_service_connector(self.cmd.cli_ctx):
1648+
managed_bindings = linker_client.linker.list(resource_uri=self.containerapp_def["id"])
1649+
if managed_bindings:
1650+
managed_bindings_list = [item.name for item in managed_bindings]
1651+
if update_item["name"] in managed_bindings_list:
1652+
raise ValidationError("Binding names across managed and dev services should be unique.")
16521653

16531654
self.new_containerapp["properties"]["template"]["serviceBinds"].append(update_item)
16541655

0 commit comments

Comments
 (0)