Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8892dbd
Update CSP version (#50)
shlokpatel57 Jun 8, 2026
16ae077
Adding CLI changes for AGC Scenario (#30)
junw98 Jun 16, 2026
218975b
[az-cli][connectedk8s][MultiCloudConnector] Allow AgentNotInstalled t…
ikanni Jun 16, 2026
3c1b025
Update CODEOWNERS for connectedk8s directory
jianyunt Jun 30, 2026
a21af0a
ensure correlation propagation happens e2e for connectedk8s proxy (#51)
revchandra Jul 1, 2026
a35fd15
Fix telemetry "Unknown" errors: wrap string exceptions, add missing i…
ashnanze Jul 2, 2026
f5931fa
Update csp version (#55)
shlokpatel57 Jul 14, 2026
0c618ef
Fix azdev style pass with targeted cleanup (#52)
ashnanze Jul 21, 2026
a5df55d
removing workload identity preview feature flag (#60)
deeksha345 Jul 22, 2026
d248929
Add Diagnosis Logic for Helm Timeouts to improve failure classificati…
jmccormick7 Jul 24, 2026
2843656
Fix ruff lint and format violations (#64)
ashnanze Jul 24, 2026
4903861
move kubeadm to be evaluated last (#65)
deeksha345 Jul 27, 2026
034ffb1
Add prediagnostic telemetry for onboarding failures (#54)
ashnanze Jul 27, 2026
3f3bccb
Add 'Arc' keyword to --proxy-skip-range for Azure Arc private-link en…
Tareesh21 Aug 1, 2026
34e5a91
Fix pre-onboarding diagnostic checks grading NotCompleted job as Pass…
ashnanze Aug 5, 2026
1806661
Bump version to 1.11.2 and update HISTORY.rst
ashnanze Aug 5, 2026
5896ba3
Fix azdev scan false positive in test_utils_: use string concat for P…
ashnanze Aug 6, 2026
10f5e17
update proxy tests to build the url at runtime to avoid failing the (…
jmccormick7 Aug 10, 2026
42bdfdf
Remove fork-specific testing directory (not for upstream)
ashnanze Aug 7, 2026
7140824
Remove committed whl artifact and revert fork-specific workflow changes
ashnanze Aug 7, 2026
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 @@ -90,7 +90,7 @@

/src/ip-group/ @necusjz @kairu-ms @jsntcy

/src/connectedk8s/ @bavneetsingh16 @deeksha345 @anagg929 @atchutbarli @bgriddaluru
/src/connectedk8s/ @jmccormick7 @deeksha345 @anagg929 @jianyunt @bgriddaluru

/src/storagesync/ @jsntcy

Expand Down
15 changes: 15 additions & 0 deletions src/connectedk8s/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

Release History
===============
1.11.2
+++++++
* Fix telemetry `Unknown` errors: wrap string exceptions, add missing instrumentation, and catch-all decorator for unhandled exceptions.
* Propagate correlation ID end-to-end for `az connectedk8s proxy`.
* [MultiCloudConnector] Allow AgentNotInstalled to Agent conversion in connected clusters.
* Add debug log for helm binary location.
* Add diagnosis logic for helm timeouts to improve failure classification.
* Move kubeadm distribution detection to be evaluated last to prevent incorrect cluster distribution classification.
* Updated CLIENT_PROXY_VERSION to 1.3.034631.
* Removed workload identity preview feature flag.
* Added telemetry for pre-onboarding diagnostic results, including diagnostics execution failures.
* Add `Arc` to `--proxy-skip-range` default values for Azure Arc private-link endpoints.
* Fix pre-onboarding diagnostic checks incorrectly grading a NotCompleted job as Passed when partial container output is present.
* Updated clusterdiagnosticchecks image to 1.36.1.

1.11.1
+++++++
* Added ARM64 support for Helm binary installation.
Expand Down
2 changes: 1 addition & 1 deletion src/connectedk8s/azext_connectedk8s/_client_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ def signed_session(
self, session: requests.Session | None = None
) -> requests.Session:
session = session or requests.Session()
header = "{} {}".format("Bearer", self.access_token)
header = f"Bearer {self.access_token}"
session.headers["Authorization"] = header
return session

Expand Down
84 changes: 82 additions & 2 deletions src/connectedk8s/azext_connectedk8s/_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,30 @@
"timed out waiting for the condition",
"connection refused",
]
Helm_Timeout_Messages = (
"timed out waiting for the condition",
"context deadline exceeded",
"deadline exceeded",
)
Helm_Timeout_Signal_Classifications = (
"ImagePullFailure",
"CrashLoopBackOff",
"ContainerCreateFailure",
"PendingOrUnschedulable",
"ClusterResourceOrSchedulingConstraint",
"MissingIdentityCertificateSecret",
"MissingKubeAadProxyCertificateSecret",
"KeyPairOrIdentityCertificateSync",
)
Helm_Timeout_Resolved_Classifications = (
"GenericHelmTimeout",
"ImagePullFailure",
"PendingOrUnschedulable",
"ClusterIdentityFailure",
)
Max_Helm_Timeout_Diagnostic_Evidence = 8
Max_Helm_Timeout_Event_Evidence = 5
Cluster_Identity_Operator_Prefix = "clusteridentityoperator"
Custom_Locations_Provider_Namespace = "Microsoft.ExtendedLocation"
Connected_Cluster_Provider_Namespace = "Microsoft.Kubernetes"
Kubernetes_Configuration_Provider_Namespace = "Microsoft.KubernetesConfiguration"
Expand All @@ -91,6 +115,7 @@
USGovCloud_OriginalName = "AZUREUSGOVERNMENT"
Dogfood_RMEndpoint = "https://api-dogfood.resources.windows-int.net/"
Client_Request_Id_Header = "x-ms-client-request-id"
Correlation_Request_Id_Header = "x-ms-correlation-request-id"
Default_Onboarding_Source_Tracking_Guid = "77ade16b-0f55-403b-b7d2-739554a897f2"
Custom_Access_Token_Env_Var_Sub_Id_Missing_Fault_Type = "Required environment variable SubscriptionId not set, for custom Azure access token"
Custom_Access_Token_Env_Var_Tenant_Id_Missing_Fault_Type = (
Expand Down Expand Up @@ -124,6 +149,26 @@
PublicKey_Export_Fault_Type = "publickey-export-error"
PrivateKey_Export_Fault_Type = "privatekey-export-error"
Install_HelmRelease_Fault_Type = "helm-release-install-error"
Helm_Timeout_ImagePull_Fault_Type = "helm-timeout-image-pull-failure"
Helm_Timeout_PendingOrUnschedulable_Fault_Type = "helm-timeout-pending-or-unschedulable"
Helm_Timeout_ClusterIdentity_Fault_Type = "helm-timeout-cluster-identity-error"
Helm_Timeout_Generic_Fault_Type = "helm-timeout-error"
# Customer-facing AZK8S error codes surfaced for Helm timeout classifications.
# Ranges follow the error code chart: Helm & Agent Lifecycle (0500-0599),
# Network & Connectivity (0300-0399).
Helm_Timeout_PendingOrUnschedulable_Error_Code = "AZK8S0512"
Helm_Timeout_ImagePull_Error_Code = "AZK8S0513"
Helm_Timeout_Generic_Error_Code = "AZK8S0514"
Helm_Timeout_ClusterIdentity_Error_Code = "AZK8S0309"
Install_Prediagnostics_Fault_Type = "prediagnostics-failure"
Install_Prediagnostics_Job_Execution_Error_Fault_Type = (
"prediagnostics-job-execution-error"
)
Post_Diagnostic_Precheck_Fault_Type = "post-diagnostic-precheck-failure"
Telemetry_Onboarding_Error_Type_Key = "Context.Default.AzureCLI.onboardingErrorType"
Telemetry_Onboarding_Error_Message_Key = (
"Context.Default.AzureCLI.onboardingErrorMessage"
)
Delete_HelmRelease_Fault_Type = "helm-release-delete-error"
Check_PodStatus_Fault_Type = "check-pod-status-error"
Kubernetes_Connectivity_FaultType = "kubernetes-cluster-connection-error"
Expand All @@ -147,6 +192,14 @@
Agent_State_Succeeded = "Succeeded"
Agent_State_Failed = "Failed"
Agent_State_Timeout = 15
Agent_State_Timeout_Fault_Type = "agent-state-timeout-error"
Provisioned_Cluster_Operation_Fault_Type = "provisioned-cluster-unsupported-operation"
Update_No_Params_Fault_Type = "update-no-parameters-specified"
Update_Proxy_Conflict_Fault_Type = "update-proxy-parameters-conflict"
Connected_Cluster_Resource_Id_None_Fault_Type = (
"connected-cluster-resource-id-none-error"
)
Custom_Locations_Enable_Failed_Fault_Type = "custom-locations-enable-failed"
Get_Credentials_Failed_Fault_Type = "failed-to-get-list-cluster-user-credentials"
Failed_To_Merge_Credentials_Fault_Type = "failed-to-merge-credentials"
Kubeconfig_Failed_To_Load_Fault_Type = "failed-to-load-kubeconfig-file"
Expand Down Expand Up @@ -194,6 +247,16 @@
No_Param_Error = "No parameters were specified with update command. Please run az connectedk8s update --help to check parameters available for update"
Gateway_ArmId_Is_Invalid = "The provided Gateway ArmID in --gateway-resource-id {} is invalid. Please provide a valid Gateway ArmID."
EnableProxy_Conflict_Error = "Conflict detected: --disable-proxy can not be set with --https-proxy, --http-proxy, --proxy-skip-range and --proxy-cert at the same time. Please run az connectedk8s update --help for more information about the parameters"

# --proxy-skip-range keyword that expands to the Azure Arc private-link endpoints.
Proxy_Skip_Range_Arc_Keyword = "arc"
# Arc private-link endpoint host suffixes the "arc" keyword expands to.
Arc_Private_Link_Endpoints = [
".his.arc.azure.{cloud_based_domain}",
".dp.kubernetesconfiguration.azure.{cloud_based_domain}",
".guestconfiguration.azure.{cloud_based_domain}",
]

Manual_Upgrade_Called_In_Auto_Update_Enabled = (
"Manual Upgrade was called while in auto_Update enabled mode"
)
Expand Down Expand Up @@ -368,6 +431,18 @@
Diagnostic_Check_Passed = "Passed"
Diagnostic_Check_Failed = "Failed"
Diagnostic_Check_Incomplete = "Incomplete"
Diagnostic_Check_Starting = "Starting"
Diagnostic_Check_Not_Applicable = "NotApplicable"

# Prediagnostic job execution status values
Job_Status_Not_Started = "NotStarted"
Job_Status_Running = "Running"
Job_Status_Completed = "Completed"
Job_Status_Not_Completed = "NotCompleted"
Job_Status_Not_Scheduled = "NotScheduled"
Job_Status_Cleanup_Failed = "CleanupFailed"
Job_Status_Execution_Failed = "ExecutionFailed"

# Name of the checks and operations
Retrieve_Arc_Agents_Event_Logs = "retrieved_arc_agents_event_logs"
Retrieve_Arc_Agents_Logs = "retrieved_arc_agents_logs"
Expand Down Expand Up @@ -418,7 +493,7 @@

# Connect Precheck Diagnoser constants
Cluster_Diagnostic_Checks_Job_Registry_Path = (
"azurearck8s/helmchart/stable/clusterdiagnosticchecks:1.31.2"
"azurearck8s/helmchart/stable/clusterdiagnosticchecks:1.36.1"
)
Cluster_Diagnostic_Checks_Helm_Install_Failed_Fault_Type = (
"Error while installing cluster diagnostic checks helm release"
Expand All @@ -442,6 +517,7 @@
Outbound_Connectivity_Check_Failed_For_Onboarding = (
"Outbound network connectivity check failed for onboarding"
)
Outbound_Connectivity_Non2xx_Response_Type = "prediagnostics-outbound-non2xx-response"
DNS_Check_Failed = "DNS Resolution failed"
Cluster_Diagnostic_Prechecks_Failed = "Cluster diagnostic prechecks failed"
Cluster_Diagnostic_Prechecks_Incomplete = (
Expand Down Expand Up @@ -475,8 +551,12 @@
"Outbound network connectivity check failed for Cluster Connect"
)
DNS_Check_Result_String = "DNS Result:"
Entra_Connectivity_Check_Result_String = (
"Entra Authentication Endpoint Connectivity Check Result"
)
CRD_Ownership_Check_Failed_String = "Check Failed: CRD"
AZ_CLI_ADAL_TO_MSAL_MIGRATE_VERSION = "2.30.0"
CLIENT_PROXY_VERSION = "1.3.033892"
CLIENT_PROXY_VERSION = "1.3.034631"
CLIENT_PROXY_FOLDER = ".clientproxy"
API_SERVER_PORT = 47011
CLIENT_PROXY_PORT = 47010
Expand Down
4 changes: 2 additions & 2 deletions src/connectedk8s/azext_connectedk8s/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
- name: Onboard a connected kubernetes cluster by specifying the kubeconfig and kubecontext.
text: az connectedk8s connect -g resourceGroupName -n connectedClusterName --kube-config /path/to/kubeconfig --kube-context kubeContextName
- name: Onboard a connected kubernetes cluster by specifying the https proxy, http proxy, no proxy settings.
text: az connectedk8s connect -g resourceGroupName -n connectedClusterName --proxy-https https://proxy-url --proxy-http http://proxy-url --proxy-skip-range excludedIP,excludedCIDR,exampleCIDRfollowed,10.0.0.0/24
text: az connectedk8s connect -g resourceGroupName -n connectedClusterName --proxy-https https://proxy-url --proxy-http http://proxy-url --proxy-skip-range excludedIP,excludedCIDR,exampleCIDRfollowed,10.0.0.0/24,Arc
- name: Onboard a connected kubernetes cluster by specifying the https proxy, http proxy, no proxy with cert settings.
text: az connectedk8s connect -g resourceGroupName -n connectedClusterName --proxy-cert /path/to/crt --proxy-https https://proxy-url --proxy-http http://proxy-url --proxy-skip-range excludedIP,excludedCIDR,exampleCIDRfollowed,10.0.0.0/24
- name: Onboard a connected kubernetes cluster with private link feature enabled by specifying private link parameters.
Expand All @@ -46,7 +46,7 @@
short-summary: Update properties of the arc onboarded kubernetes cluster.
examples:
- name: Update proxy values for the agents
text: az connectedk8s update -g resourceGroupName -n connectedClusterName --proxy-cert /path/to/crt --proxy-https https://proxy-url --proxy-http http://proxy-url --proxy-skip-range excludedIP,excludedCIDR,exampleCIDRfollowed,10.0.0.0/24
text: az connectedk8s update -g resourceGroupName -n connectedClusterName --proxy-cert /path/to/crt --proxy-https https://proxy-url --proxy-http http://proxy-url --proxy-skip-range excludedIP,excludedCIDR,exampleCIDRfollowed,10.0.0.0/24,Arc
- name: Disable proxy settings for agents
text: az connectedk8s update -g resourceGroupName -n connectedClusterName --disable-proxy
- name: Disable auto-upgrade of agents
Expand Down
15 changes: 5 additions & 10 deletions src/connectedk8s/azext_connectedk8s/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
features_types = CLIArgumentType(nargs="+", choices=CaseInsensitiveList(Feature_Values))


def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None: # pylint: disable=too-many-statements
pls_arm_id_type = CLIArgumentType(
options_list=["--private-link-scope-resource-id", "--pls-arm-id"],
arg_group="PrivateLink",
Expand Down Expand Up @@ -97,7 +97,8 @@ def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
"no_proxy",
options_list=["--proxy-skip-range"],
arg_group="Proxy",
help="List of URLs/CIDRs for which proxy should not to be used.",
help="List of URLs/CIDRs for which proxy should not be used. Pass the "
"keyword 'Arc' to bypass the proxy for the linked Azure Arc private-link endpoints.",
)
c.argument(
"proxy_cert",
Expand Down Expand Up @@ -187,14 +188,12 @@ def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
options_list=["--enable-oidc-issuer"],
arg_group="Workload Identity",
help="Enable creation of OIDC issuer url used for workload identity federation",
is_preview=True,
)
c.argument(
"self_hosted_issuer",
options_list=["--self-hosted-issuer"],
arg_group="Workload Identity",
help="Self hosted issuer url for public cloud clusters - AKS, GKE, EKS",
is_preview=True,
validator=validate_self_hosted_issuer,
)
c.argument(
Expand All @@ -203,7 +202,6 @@ def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
options_list=["--enable-workload-identity", "--enable-wi"],
arg_group="Workload Identity",
help="Enable workload identity webhook",
is_preview=True,
)
c.argument(
"gateway_resource_id",
Expand Down Expand Up @@ -263,7 +261,8 @@ def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
"no_proxy",
options_list=["--proxy-skip-range"],
arg_group="Proxy",
help="List of URLs/CIDRs for which proxy should not to be used.",
help="List of URLs/CIDRs for which proxy should not be used. Pass the "
"keyword 'Arc' to bypass the proxy for the linked Azure Arc private-link endpoints.",
)
c.argument(
"distribution",
Expand Down Expand Up @@ -321,15 +320,13 @@ def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
options_list=["--enable-oidc-issuer"],
arg_group="Workload Identity",
help="Enable creation of OIDC issuer url used for workload identity federation",
is_preview=True,
validator=validate_enable_oidc_issuer_updates,
)
c.argument(
"self_hosted_issuer",
options_list=["--self-hosted-issuer"],
arg_group="Workload Identity",
help="Self hosted issuer url for public cloud clusters - AKS, GKE, EKS",
is_preview=True,
validator=validate_self_hosted_issuer,
)
c.argument(
Expand All @@ -338,7 +335,6 @@ def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
options_list=["--enable-workload-identity", "--enable-wi"],
arg_group="Workload Identity",
help="Enable workload identity webhook",
is_preview=True,
validator=validate_workload_identity_updates,
)
c.argument(
Expand All @@ -347,7 +343,6 @@ def load_arguments(self: Connectedk8sCommandsLoader, _: CLICommand) -> None:
options_list=["--disable-workload-identity", "--disable-wi"],
arg_group="Workload Identity",
help="Disable workload identity webhook",
is_preview=True,
validator=validate_workload_identity_updates,
)
c.argument(
Expand Down
Loading
Loading