about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nixos/doc/manual/release-notes/rl-2405.section.md10
-rw-r--r--pkgs/tools/admin/azure-cli/0001-optional-immutable-configuration-dir.patch98
-rw-r--r--pkgs/tools/admin/azure-cli/default.nix78
-rw-r--r--pkgs/tools/admin/azure-cli/extensions-generated.nix982
-rw-r--r--pkgs/tools/admin/azure-cli/python-packages.nix13
-rwxr-xr-xpkgs/tools/admin/azure-cli/query-extension-index.sh163
-rw-r--r--pkgs/top-level/all-packages.nix2
7 files changed, 1342 insertions, 4 deletions
diff --git a/nixos/doc/manual/release-notes/rl-2405.section.md b/nixos/doc/manual/release-notes/rl-2405.section.md
index 49be4fa456ba4..3b0987df12f37 100644
--- a/nixos/doc/manual/release-notes/rl-2405.section.md
+++ b/nixos/doc/manual/release-notes/rl-2405.section.md
@@ -235,6 +235,16 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
 
 - The legacy and long deprecated systemd target `network-interfaces.target` has been removed. Use `network.target` instead.
 
+- `azure-cli` now has extension support. For example, to install the `aks-preview` extension, use
+
+  ```nix
+  environment.systemPackages = [
+    (azure-cli.withExtensions [ azure-cli.extensions.aks-preview ]);
+  ];
+  ```
+  To make the `azure-cli` immutable and prevent clashes in case `azure-cli` is also installed via other package managers, some configuration files were moved into the derivation.
+  This can be disabled by overriding `withImmutableConfig = false` when building `azure-cli`.
+
 - `services.frp.settings` now generates the frp configuration file in TOML format as [recommended by upstream](https://github.com/fatedier/frp#configuration-files), instead of the legacy INI format. This has also introduced other changes in the configuration file structure and options.
   - The `settings.common` section in the configuration is no longer valid and all the options form inside it now goes directly under `settings`.
   - The `_` separating words in the configuration options is removed so the options are now in camel case. For example: `server_addr` becomes `serverAddr`, `server_port` becomes `serverPort` etc.
diff --git a/pkgs/tools/admin/azure-cli/0001-optional-immutable-configuration-dir.patch b/pkgs/tools/admin/azure-cli/0001-optional-immutable-configuration-dir.patch
new file mode 100644
index 0000000000000..e163915d1c724
--- /dev/null
+++ b/pkgs/tools/admin/azure-cli/0001-optional-immutable-configuration-dir.patch
@@ -0,0 +1,98 @@
+From c12adfdefd8a091e1fa870305a3cc61de6426914 Mon Sep 17 00:00:00 2001
+From: Paul Meyer <49727155+katexochen@users.noreply.github.com>
+Date: Thu, 14 Dec 2023 21:16:20 +0100
+Subject: [PATCH] optional immutable configuration dir
+
+Adding the possibility to configure an immutable configuration dir via
+env variable `AZURE_IMMUTABLE_DIR`. This path is used for the files
+that configure the dynamic behavior of the CLI code.
+An immutable session is used for these files to ensure we don't try to
+write to them.
+
+Signed-off-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
+---
+ azure/cli/core/__init__.py |  5 +++--
+ azure/cli/core/_session.py | 19 ++++++++++++++++---
+ .../cli/core/extension/dynamic_install.py     |  3 ++-
+ 3 files changed, 21 insertions(+), 6 deletions(-)
+
+diff --git a/azure/cli/core/__init__.py b/azure/cli/core/__init__.py
+index d112633ec..20b6d045b 100644
+--- a/azure/cli/core/__init__.py
++++ b/azure/cli/core/__init__.py
+@@ -75,12 +75,13 @@ class AzCli(CLI):
+         self.data['query_active'] = False
+
+         azure_folder = self.config.config_dir
++        azure_immutable_folder = os.environ.get('AZURE_IMMUTABLE_DIR', azure_folder)
+         ensure_dir(azure_folder)
+         ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json'))
+         CONFIG.load(os.path.join(azure_folder, 'az.json'))
+         SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600)
+-        INDEX.load(os.path.join(azure_folder, 'commandIndex.json'))
+-        VERSIONS.load(os.path.join(azure_folder, 'versionCheck.json'))
++        INDEX.load(os.path.join(azure_immutable_folder, 'commandIndex.json'))
++        VERSIONS.load(os.path.join(azure_immutable_folder, 'versionCheck.json'))
+         handle_version_update()
+
+         self.cloud = get_active_cloud(self)
+diff --git a/azure/cli/core/_session.py b/azure/cli/core/_session.py
+index 471a0344c..acaef6fb8 100644
+--- a/azure/cli/core/_session.py
++++ b/azure/cli/core/_session.py
+@@ -85,6 +85,19 @@ class Session(MutableMapping):
+         return len(self.data)
+
+
++class ImmutableSession(Session):
++    """
++    A session that is backed by an immutable JSON file. This session is read-only.
++    """
++    def save(self):
++        if os.getenv('AZURE_IMMUTABLE_DIR'):
++            get_logger(__name__).log(logging.DEBUG,
++                                     "Skipping update of file %s due to immutable directory.",
++                                     self.filename)
++            return
++        super().save()
++
++
+ # ACCOUNT contains subscriptions information
+ ACCOUNT = Session()
+
+@@ -95,16 +108,16 @@ CONFIG = Session()
+ SESSION = Session()
+
+ # INDEX contains {top-level command: [command_modules and extensions]} mapping index
+-INDEX = Session()
++INDEX = ImmutableSession()
+
+ # VERSIONS provides local versions and pypi versions.
+ # DO NOT USE it to get the current version of azure-cli,
+ # it could be lagged behind and can be used to check whether
+ # an upgrade of azure-cli happens
+-VERSIONS = Session()
++VERSIONS = ImmutableSession()
+
+ # EXT_CMD_TREE provides command to extension name mapping
+-EXT_CMD_TREE = Session()
++EXT_CMD_TREE = ImmutableSession()
+
+ # CLOUD_ENDPOINTS provides endpoints/suffixes of clouds
+ CLOUD_ENDPOINTS = Session()
+diff --git a/azure/cli/core/extension/dynamic_install.py b/azure/cli/core/extension/dynamic_install.py
+index cb03980a0..29279be2b 100644
+--- a/azure/cli/core/extension/dynamic_install.py
++++ b/azure/cli/core/extension/dynamic_install.py
+@@ -17,7 +17,8 @@ def _get_extension_command_tree(cli_ctx):
+     VALID_SECOND = 3600 * 24 * 10
+     if not cli_ctx:
+         return None
+-    EXT_CMD_TREE.load(os.path.join(cli_ctx.config.config_dir, 'extensionCommandTree.json'), VALID_SECOND)
++    azure_immutable_folder = os.environ.get('AZURE_IMMUTABLE_DIR', cli_ctx.config.config_dir)
++    EXT_CMD_TREE.load(os.path.join(azure_immutable_folder, 'extensionCommandTree.json'), VALID_SECOND)
+     if not EXT_CMD_TREE.data:
+         import posixpath
+         import requests
+--
+2.42.0
diff --git a/pkgs/tools/admin/azure-cli/default.nix b/pkgs/tools/admin/azure-cli/default.nix
index 9d92a10cc2881..0b9fc0523bf14 100644
--- a/pkgs/tools/admin/azure-cli/default.nix
+++ b/pkgs/tools/admin/azure-cli/default.nix
@@ -1,7 +1,20 @@
 { lib
 , callPackage
+, callPackages
+, stdenvNoCC
+, fetchurl
 , fetchFromGitHub
 , installShellFiles
+, python3
+
+  # Whether to include patches that enable placing certain behavior-defining
+  # configuration files in the Nix store.
+, withImmutableConfig ? true
+
+  # List of extensions/plugins to include.
+, withExtensions ? [ ]
+
+, azure-cli
 }:
 
 let
@@ -17,9 +30,52 @@ let
 
   # put packages that needs to be overridden in the py package scope
   py = callPackage ./python-packages.nix { inherit src version; };
+
+  # Builder for Azure CLI extensions. Extensions are Python wheels that
+  # outside of nix would be fetched by the CLI itself from various sources.
+  mkAzExtension =
+    { pname
+    , version
+    , url
+    , sha256
+    , description
+    }: python3.pkgs.buildPythonPackage {
+      inherit pname version;
+      format = "wheel";
+      src = fetchurl { inherit url sha256; };
+      meta = with lib; {
+        inherit description;
+        inherit (azure-cli.meta) platforms maintainers;
+        homepage = "https://github.com/Azure/azure-cli-extensions";
+        changelog = "https://github.com/Azure/azure-cli-extensions/blob/main/src/${pname}/HISTORY.rst";
+        license = lib.licenses.mit;
+        sourceProvenance = [ sourceTypes.fromSource ];
+      };
+    };
+
+  extensions = callPackages ./extensions-generated.nix { inherit mkAzExtension; };
+
+  extensionDir = stdenvNoCC.mkDerivation {
+    name = "azure-cli-extensions";
+    dontUnpack = true;
+    installPhase =
+      let
+        namePaths = map (p: "${p.pname},${p}/${python3.sitePackages}") withExtensions;
+      in
+      ''
+        for line in ${lib.concatStringsSep " " namePaths}; do
+          name=$(echo $line | cut -d',' -f1)
+          path=$(echo $line | cut -d',' -f2)
+          mkdir -p $out/$name
+          for f in $(ls $path); do
+            ln -s $path/$f $out/$name/$f
+          done
+        done
+      '';
+  };
 in
 
-py.pkgs.toPythonApplication (py.pkgs.buildAzureCliPackage {
+py.pkgs.toPythonApplication (py.pkgs.buildAzureCliPackage rec {
   pname = "azure-cli";
   inherit version src;
 
@@ -177,7 +233,13 @@ py.pkgs.toPythonApplication (py.pkgs.buildAzureCliPackage {
       --replace register-python-argcomplete ${py.pkgs.argcomplete}/bin/register-python-argcomplete
     installShellCompletion --bash --name az.bash az.completion.sh
     installShellCompletion --zsh --name _az az.completion.sh
-
+  '' + lib.optionalString withImmutableConfig ''
+    export HOME=$TMPDIR
+    $out/bin/az --version
+    mkdir -p $out/etc/azure
+    mv $TMPDIR/.azure/commandIndex.json $out/etc/azure/commandIndex.json
+    mv $TMPDIR/.azure/versionCheck.json $out/etc/azure/versionCheck.json
+  '' + ''
     # remove garbage
     rm $out/bin/az.bat
     rm $out/bin/az.completion.sh
@@ -187,7 +249,12 @@ py.pkgs.toPythonApplication (py.pkgs.buildAzureCliPackage {
   # it's just a shebang script which calls `python -m azure.cli "$@"`
   postFixup = ''
     wrapProgram $out/bin/az \
-      --set PYTHONPATH $PYTHONPATH
+  '' + lib.optionalString withImmutableConfig ''
+    --set AZURE_IMMUTABLE_DIR $out/etc/azure \
+  '' + lib.optionalString (withExtensions != [ ]) ''
+    --set AZURE_EXTENSION_DIR ${extensionDir} \
+  '' + ''
+    --set PYTHONPATH "${python3.pkgs.makePythonPath propagatedBuildInputs}:$out/${python3.sitePackages}"
   '';
 
   doInstallCheck = true;
@@ -270,6 +337,11 @@ py.pkgs.toPythonApplication (py.pkgs.buildAzureCliPackage {
     "azure.storage.common"
   ];
 
+  passthru = {
+    inherit extensions;
+    withExtensions = extensions: azure-cli.override { withExtensions = extensions; };
+  };
+
   meta = with lib; {
     homepage = "https://github.com/Azure/azure-cli";
     description = "Next generation multi-platform command line experience for Azure";
diff --git a/pkgs/tools/admin/azure-cli/extensions-generated.nix b/pkgs/tools/admin/azure-cli/extensions-generated.nix
new file mode 100644
index 0000000000000..8e872e7bba258
--- /dev/null
+++ b/pkgs/tools/admin/azure-cli/extensions-generated.nix
@@ -0,0 +1,982 @@
+# This file packages Azure CLI extensions that don't have any requirements.
+# Extensions with requirements should be placed in another file, so this one
+# can be re-generated during update.
+#
+# Attributes were generated using the query-extension-index.sh script:
+#   ./query-extension-index.sh --requirements=false --download --nix --cli-version=<version>
+{ mkAzExtension }:
+{
+  account = mkAzExtension rec {
+    pname = "account";
+    version = "0.2.5";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/account-${version}-py3-none-any.whl";
+    sha256 = "0b94df323acfc48ea3141904649106bb85695187dbf63aa3b8448ec12bc00c23";
+    description = "Microsoft Azure Command-Line Tools SubscriptionClient Extension";
+  };
+  acrquery = mkAzExtension rec {
+    pname = "acrquery";
+    version = "1.0.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/acrquery-${version}-py3-none-any.whl";
+    sha256 = "9094137a4d08f2ede7b662c99df0665f338aae7bcaf4976bed5d42df754571f1";
+    description = "Microsoft Azure Command-Line Tools AcrQuery Extension";
+  };
+  acrtransfer = mkAzExtension rec {
+    pname = "acrtransfer";
+    version = "1.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/acrtransfer-${version}-py3-none-any.whl";
+    sha256 = "668b94d0341b663a610212f318b899a53be60ae0eb59c47e162f5dabd3483551";
+    description = "Microsoft Azure Command-Line Tools Acrtransfer Extension";
+  };
+  ad = mkAzExtension rec {
+    pname = "ad";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/ad-${version}-py3-none-any.whl";
+    sha256 = "61df234e10759e9916c1d447ab02b82637de10fd97c31a17252e1f5183853883";
+    description = "Microsoft Azure Command-Line Tools DomainServicesResourceProvider Extension";
+  };
+  adp = mkAzExtension rec {
+    pname = "adp";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/adp-${version}-py3-none-any.whl";
+    sha256 = "fd64519832f4fd314431f87176507e10249b8d165537f81d05c9ea5185ae84ec";
+    description = "Microsoft Azure Command-Line Tools Adp Extension";
+  };
+  aem = mkAzExtension rec {
+    pname = "aem";
+    version = "0.3.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/aem-${version}-py2.py3-none-any.whl";
+    sha256 = "25aaf9006ab1d115d7c484cfda1c9ad0e3617af6d2140db87499aaea81b67ff8";
+    description = "Manage Azure Enhanced Monitoring Extensions for SAP";
+  };
+  ai-examples = mkAzExtension rec {
+    pname = "ai-examples";
+    version = "0.2.5";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/ai_examples-${version}-py2.py3-none-any.whl";
+    sha256 = "badbdf5fc2e0b4a85c4124d3fc92859b582adf8f30f5727440ce81942140099a";
+    description = "Add AI powered examples to help content";
+  };
+  aks-preview = mkAzExtension rec {
+    pname = "aks-preview";
+    version = "1.0.0b5";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/aks_preview-${version}-py2.py3-none-any.whl";
+    sha256 = "75378ea07dea6fdadb115e41e8394003fd63282560648fa92d8f055f1e2536eb";
+    description = "Provides a preview for upcoming AKS features";
+  };
+  akshybrid = mkAzExtension rec {
+    pname = "akshybrid";
+    version = "0.1.2";
+    url = "https://hybridaksstorage.z13.web.core.windows.net/HybridAKS/CLI/akshybrid-${version}-py3-none-any.whl";
+    sha256 = "9767cda444c421573bc220e01cd58a67c30a36175cedba68b0454a3c6e983a8e";
+    description = "Microsoft Azure Command-Line Tools HybridContainerService Extension";
+  };
+  alb = mkAzExtension rec {
+    pname = "alb";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/alb-${version}-py3-none-any.whl";
+    sha256 = "b020cd8cd3da6299dc978499dae452768b7651c3ed8e05f2f0b321bd9b8354d4";
+    description = "Microsoft Azure Command-Line Tools ALB Extension";
+  };
+  alertsmanagement = mkAzExtension rec {
+    pname = "alertsmanagement";
+    version = "0.2.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/alertsmanagement-${version}-py3-none-any.whl";
+    sha256 = "b45a5752924ab1205ff5862f03a4a465eccb4dd8e79900023498d674aa68665b";
+    description = "Microsoft Azure Command-Line Tools AlertsManagementClient Extension";
+  };
+  amg = mkAzExtension rec {
+    pname = "amg";
+    version = "1.2.9";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/amg-${version}-py3-none-any.whl";
+    sha256 = "dbea8dd0e85dd2f30f30cb66f0dd7f9d0314a7ff9765a4d074622b75aeccad2f";
+    description = "Microsoft Azure Command-Line Tools Azure Managed Grafana Extension";
+  };
+  amlfs = mkAzExtension rec {
+    pname = "amlfs";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/amlfs-${version}-py3-none-any.whl";
+    sha256 = "21b5a12943e727315288aa0ca1c49a25803a656b7f388c3c637596cfdf67bd1d";
+    description = "Microsoft Azure Command-Line Tools Amlfs Extension";
+  };
+  apic-extension = mkAzExtension rec {
+    pname = "apic-extension";
+    version = "1.0.0b4";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/apic_extension-${version}-py3-none-any.whl";
+    sha256 = "67294fd30190b66b339c8d550e58e1401117b313bea638fb0c126dec26249408";
+    description = "Microsoft Azure Command-Line Tools ApicExtension Extension";
+  };
+  appservice-kube = mkAzExtension rec {
+    pname = "appservice-kube";
+    version = "0.1.9";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/appservice_kube-${version}-py2.py3-none-any.whl";
+    sha256 = "9107762296c67ef4035256a9790b075040f263804116a3f9a6866227ff6019ed";
+    description = "Microsoft Azure Command-Line Tools App Service on Kubernetes Extension";
+  };
+  authV2 = mkAzExtension rec {
+    pname = "authV2";
+    version = "0.1.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/authV2-${version}-py3-none-any.whl";
+    sha256 = "eb05636f8c78e2f83b7f452fe56f5a9ae496d6909dc36924ae5f98a2fb5bce41";
+    description = "Microsoft Azure Command-Line Tools Authv2 Extension";
+  };
+  automanage = mkAzExtension rec {
+    pname = "automanage";
+    version = "0.1.2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/automanage-${version}-py3-none-any.whl";
+    sha256 = "42341a6cfdacb3af0433b10b3e9bcb5226d4c7fb59730378408a957662266551";
+    description = "Microsoft Azure Command-Line Tools Automanage Extension";
+  };
+  automation = mkAzExtension rec {
+    pname = "automation";
+    version = "0.2.2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/automation-${version}-py3-none-any.whl";
+    sha256 = "1337a8bf90739df646231533801cce9050bad641c627382468c86af5f2f99d89";
+    description = "Microsoft Azure Command-Line Tools AutomationClient Extension";
+  };
+  azure-firewall = mkAzExtension rec {
+    pname = "azure-firewall";
+    version = "1.0.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/azure_firewall-${version}-py2.py3-none-any.whl";
+    sha256 = "920023c55ae72d7e85baa43d81d96683be0e8348228b6f8e89e479fd4092c0f8";
+    description = "Manage Azure Firewall resources";
+  };
+  azurelargeinstance = mkAzExtension rec {
+    pname = "azurelargeinstance";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/azurelargeinstance-${version}-py3-none-any.whl";
+    sha256 = "a6e38c623cf14a9528df9f28aa98d9642c1e73c0a815becdce842e3a2f0f49ac";
+    description = "Microsoft Azure Command-Line Tools Azurelargeinstance Extension";
+  };
+  azurestackhci = mkAzExtension rec {
+    pname = "azurestackhci";
+    version = "0.2.9";
+    url = "https://hybridaksstorage.z13.web.core.windows.net/SelfServiceVM/CLI/azurestackhci-${version}-py3-none-any.whl";
+    sha256 = "2557b2fe3fa2f951a2794ba967555ba54c2e93eb75538152f21ab2fb568fef16";
+    description = "Microsoft Azure Command-Line Tools AzureStackHCI Extension";
+  };
+  baremetal-infrastructure = mkAzExtension rec {
+    pname = "baremetal-infrastructure";
+    version = "2.0.1";
+    url = "https://github.com/Azure/azure-baremetalinfrastructure-cli-extension/releases/download/${version}/baremetal_infrastructure-2.0.1-py2.py3-none-any.whl";
+    sha256 = "ea127d64603c8a45774cdf9aa80c4c8b5839a42719971b296beb96105fe5ef2d";
+    description = "Additional commands for working with BareMetal instances";
+  };
+  bastion = mkAzExtension rec {
+    pname = "bastion";
+    version = "0.3.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/bastion-${version}-py3-none-any.whl";
+    sha256 = "c20d8e423acef3b6728c9abdfe90ad4a7020f2d122068983d7b59b9e3fef84c3";
+    description = "Microsoft Azure Command-Line Tools Bastion Extension";
+  };
+  billing-benefits = mkAzExtension rec {
+    pname = "billing-benefits";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/billing_benefits-${version}-py3-none-any.whl";
+    sha256 = "f71250d1c26690cc0e175cd5c9bcd59e76c7b701bb3a47c8273e4cf8bcca878e";
+    description = "Microsoft Azure Command-Line Tools BillingBenefits Extension";
+  };
+  blockchain = mkAzExtension rec {
+    pname = "blockchain";
+    version = "0.1.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/blockchain-${version}-py3-none-any.whl";
+    sha256 = "95a4788ab10052f6c1b4122db6ab140705db528e5cb3db3358580d703a2a7204";
+    description = "Microsoft Azure Command-Line Tools BlockchainManagementClient Extension";
+  };
+  blueprint = mkAzExtension rec {
+    pname = "blueprint";
+    version = "0.3.2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/blueprint-${version}-py3-none-any.whl";
+    sha256 = "58d3835446dd93e585b0f6b520a2db6551b8a927e35e25da4747d4cf8a4c009b";
+    description = "Microsoft Azure Command-Line Tools Blueprint Extension";
+  };
+  change-analysis = mkAzExtension rec {
+    pname = "change-analysis";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/change_analysis-${version}-py3-none-any.whl";
+    sha256 = "49f1761a1b1ad29169af2ecd5793e10ddec797ebb2610e7c70e1b1ab2b75126a";
+    description = "Microsoft Azure Command-Line Tools ChangeAnalysis Extension";
+  };
+  cli-translator = mkAzExtension rec {
+    pname = "cli-translator";
+    version = "0.3.0";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/cli_translator-${version}-py3-none-any.whl";
+    sha256 = "9ea6162d37fc3390be4dce64cb05c5c588070104f3e92a701ab475473565a8a9";
+    description = "Translate ARM template to executable Azure CLI scripts";
+  };
+  confidentialledger = mkAzExtension rec {
+    pname = "confidentialledger";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/confidentialledger-${version}-py3-none-any.whl";
+    sha256 = "3afbf49f10cdddd9675562364ce2275f6f70eb5318fa85b658d711b1e24dc94e";
+    description = "Microsoft Azure Command-Line Tools ConfidentialLedger Extension";
+  };
+  confluent = mkAzExtension rec {
+    pname = "confluent";
+    version = "0.4.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/confluent-${version}-py3-none-any.whl";
+    sha256 = "7b812940a77094bc916c745a61b7732966de4e7943a7541c0a402c0d912bc6af";
+    description = "Microsoft Azure Command-Line Tools ConfluentManagementClient Extension";
+  };
+  connectedmachine = mkAzExtension rec {
+    pname = "connectedmachine";
+    version = "0.7.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/connectedmachine-${version}-py3-none-any.whl";
+    sha256 = "792975ebf0260767481b2ffab0aa3154509c55a9ab60c7f987c3fdead726cd82";
+    description = "Microsoft Azure Command-Line Tools ConnectedMachine Extension";
+  };
+  connectedvmware = mkAzExtension rec {
+    pname = "connectedvmware";
+    version = "0.2.4";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/connectedvmware-${version}-py2.py3-none-any.whl";
+    sha256 = "8a96c790317dfee523d548c28a51191746ff3b45ede4fee56e804d195de437f6";
+    description = "Microsoft Azure Command-Line Tools Connectedvmware Extension";
+  };
+  connection-monitor-preview = mkAzExtension rec {
+    pname = "connection-monitor-preview";
+    version = "0.1.0";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/connection_monitor_preview-${version}-py2.py3-none-any.whl";
+    sha256 = "9a796d5187571990d27feb9efeedde38c194f13ea21cbf9ec06131196bfd821d";
+    description = "Microsoft Azure Command-Line Connection Monitor V2 Extension";
+  };
+  cosmosdb-preview = mkAzExtension rec {
+    pname = "cosmosdb-preview";
+    version = "0.26.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/cosmosdb_preview-${version}-py2.py3-none-any.whl";
+    sha256 = "c761a022fa8e849534d51bb51c6b6a7c01b541a5f018532f7fe312f74f689b06";
+    description = "Microsoft Azure Command-Line Tools Cosmosdb-preview Extension";
+  };
+  costmanagement = mkAzExtension rec {
+    pname = "costmanagement";
+    version = "0.3.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/costmanagement-${version}-py3-none-any.whl";
+    sha256 = "5661a2082ecca000b0c764dc92585e2aa601ccd5eeeb296397533cf4da814cf6";
+    description = "Microsoft Azure Command-Line Tools CostManagementClient Extension";
+  };
+  csvmware = mkAzExtension rec {
+    pname = "csvmware";
+    version = "0.3.0";
+    url = "https://github.com/Azure/az-csvmware-cli/releases/download/${version}/csvmware-0.3.0-py2.py3-none-any.whl";
+    sha256 = "dfb9767f05ac13c762ea9dc4327169e63a5c11879123544b200edb9a2c9a8a42";
+    description = "Manage Azure VMware Solution by CloudSimple";
+  };
+  custom-providers = mkAzExtension rec {
+    pname = "custom-providers";
+    version = "0.2.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/custom_providers-${version}-py2.py3-none-any.whl";
+    sha256 = "a9938f09c86fa4575e3c887206908cac15920af528c537c0b998362a1c43daf7";
+    description = "Microsoft Azure Command-Line Tools Custom Providers Extension";
+  };
+  customlocation = mkAzExtension rec {
+    pname = "customlocation";
+    version = "0.1.3";
+    url = "https://arcplatformcliextprod.blob.core.windows.net/customlocation/customlocation-${version}-py2.py3-none-any.whl";
+    sha256 = "5e36435b1a81de25e74e70c45c2ac9f98065138c35050f29210ae40c18484e28";
+    description = "Microsoft Azure Command-Line Tools Customlocation Extension";
+  };
+  databox = mkAzExtension rec {
+    pname = "databox";
+    version = "1.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/databox-${version}-py3-none-any.whl";
+    sha256 = "7b41a60521d7cf652d4cdca052fc9d2ec6371f3d7884ec0a74ba9a7d5001d7bb";
+    description = "Microsoft Azure Command-Line Tools Databox Extension";
+  };
+  databricks = mkAzExtension rec {
+    pname = "databricks";
+    version = "0.10.2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/databricks-${version}-py3-none-any.whl";
+    sha256 = "7db0b97b497512671343c472fad2ca7a0987ac2cddc0ae0ceab227e3d017718f";
+    description = "Microsoft Azure Command-Line Tools DatabricksClient Extension";
+  };
+  datadog = mkAzExtension rec {
+    pname = "datadog";
+    version = "0.1.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/datadog-${version}-py3-none-any.whl";
+    sha256 = "9a38fd5d6d01646f299ee7b5f68e82ad708889c7d0bd72e0b6b6b13e5455e937";
+    description = "Microsoft Azure Command-Line Tools MicrosoftDatadogClient Extension";
+  };
+  datafactory = mkAzExtension rec {
+    pname = "datafactory";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/datafactory-${version}-py3-none-any.whl";
+    sha256 = "30941f7e2c093f040c958db024367b750068a5181554b23f7403f4522375c41e";
+    description = "Microsoft Azure Command-Line Tools DataFactoryManagementClient Extension";
+  };
+  datamigration = mkAzExtension rec {
+    pname = "datamigration";
+    version = "0.6.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/datamigration-${version}-py3-none-any.whl";
+    sha256 = "4a07a5272762f8f53f9fe61b295a800e63c0ea2900a29a526df2eabbe732bca7";
+    description = "Microsoft Azure Command-Line Tools DataMigrationManagementClient Extension";
+  };
+  dataprotection = mkAzExtension rec {
+    pname = "dataprotection";
+    version = "0.11.2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/dataprotection-${version}-py3-none-any.whl";
+    sha256 = "ce31a7bb0c939d6eb6d71971f89441abaee172a3ba5b74dae0ebe88e4a8f5300";
+    description = "Microsoft Azure Command-Line Tools DataProtectionClient Extension";
+  };
+  datashare = mkAzExtension rec {
+    pname = "datashare";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/datashare-${version}-py3-none-any.whl";
+    sha256 = "f1a801bd0c38eb2ebf9c2fb4e0b43a98470ae7b40bbcd05eb2aa596d69579c9e";
+    description = "Microsoft Azure Command-Line Tools DataShareManagementClient Extension";
+  };
+  deploy-to-azure = mkAzExtension rec {
+    pname = "deploy-to-azure";
+    version = "0.2.0";
+    url = "https://github.com/Azure/deploy-to-azure-cli-extension/releases/download/20200318.1/deploy_to_azure-${version}-py2.py3-none-any.whl";
+    sha256 = "f925080ee7abc3aef733d4c6313170bdedaa9569af1b95427383bc3c59e4ceb8";
+    description = "Deploy to Azure using Github Actions";
+  };
+  desktopvirtualization = mkAzExtension rec {
+    pname = "desktopvirtualization";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/desktopvirtualization-${version}-py3-none-any.whl";
+    sha256 = "6de28d6be58dd65ad8f25a9fa084676c54684f00f9938f5db7d0392282783e04";
+    description = "Microsoft Azure Command-Line Tools DesktopVirtualizationAPIClient Extension";
+  };
+  dev-spaces = mkAzExtension rec {
+    pname = "dev-spaces";
+    version = "1.0.6";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/dev_spaces-${version}-py2.py3-none-any.whl";
+    sha256 = "71041808b27cd9d33fd905c5080c97f61291816f2dddd6dcdb2e66b9fb6ebf59";
+    description = "Dev Spaces provides a rapid, iterative Kubernetes development experience for teams";
+  };
+  devcenter = mkAzExtension rec {
+    pname = "devcenter";
+    version = "5.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/devcenter-${version}-py3-none-any.whl";
+    sha256 = "873ce4ec274710a361ba2a6bf93d8820949d955bf4386881d9a37ed87bb0d054";
+    description = "Microsoft Azure Command-Line Tools DevCenter Extension";
+  };
+  diskpool = mkAzExtension rec {
+    pname = "diskpool";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/diskpool-${version}-py3-none-any.whl";
+    sha256 = "9ae6aaea85a17529da2a4e51c2ba2aba55b4b26816d5618eafd0f9fdc43b67b7";
+    description = "Microsoft Azure Command-Line Tools StoragePoolManagement Extension";
+  };
+  dms-preview = mkAzExtension rec {
+    pname = "dms-preview";
+    version = "0.15.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/dms_preview-${version}-py2.py3-none-any.whl";
+    sha256 = "556c145c03b8d529d8e77f7b35702fb8de382891635e858f928117f33688ee9c";
+    description = "Support for new Database Migration Service scenarios";
+  };
+  dnc = mkAzExtension rec {
+    pname = "dnc";
+    version = "0.2.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/dnc-${version}-py3-none-any.whl";
+    sha256 = "e38474ca9b28bed5dde388cf73dff9e3504825032b03c5bf8930c25caf292026";
+    description = "Microsoft Azure Command-Line Tools Dnc Extension";
+  };
+  dns-resolver = mkAzExtension rec {
+    pname = "dns-resolver";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/dns_resolver-${version}-py3-none-any.whl";
+    sha256 = "1c4bb8216e509c2f08fa75c45930ec377768326f30cb9ab125842aa9352c6e2e";
+    description = "Microsoft Azure Command-Line Tools DnsResolverManagementClient Extension";
+  };
+  dynatrace = mkAzExtension rec {
+    pname = "dynatrace";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/dynatrace-${version}-py3-none-any.whl";
+    sha256 = "112a7e423461d1b6f7c385fe8b73b4f2b850e2570c35a54a4bbcc2e87afec661";
+    description = "Microsoft Azure Command-Line Tools Dynatrace Extension";
+  };
+  edgeorder = mkAzExtension rec {
+    pname = "edgeorder";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/edgeorder-${version}-py3-none-any.whl";
+    sha256 = "186a06d0f8603f7e0faeed5296ecc73bf1096e0d681acea42d5ebccc1670357b";
+    description = "Microsoft Azure Command-Line Tools EdgeOrderManagementClient Extension";
+  };
+  elastic = mkAzExtension rec {
+    pname = "elastic";
+    version = "1.0.0b2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/elastic-${version}-py3-none-any.whl";
+    sha256 = "1d99dbcc10b99185b4cd9b64a8835d80b424226e5cf5d40b3e3ae1d435532657";
+    description = "Microsoft Azure Command-Line Tools MicrosoftElastic Extension";
+  };
+  elastic-san = mkAzExtension rec {
+    pname = "elastic-san";
+    version = "1.0.0b2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/elastic_san-${version}-py3-none-any.whl";
+    sha256 = "6d2f1247ae78e431d4834989df581cd21241d16b97071bf672fb8b71ee3ad702";
+    description = "Microsoft Azure Command-Line Tools ElasticSan Extension";
+  };
+  eventgrid = mkAzExtension rec {
+    pname = "eventgrid";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/eventgrid-${version}-py2.py3-none-any.whl";
+    sha256 = "662ca2a381efcf821a16648ff3b89edbe21f4e9887e18ffa7ee0dbbaf0332ede";
+    description = "Microsoft Azure Command-Line Tools EventGrid Command Module";
+  };
+  express-route-cross-connection = mkAzExtension rec {
+    pname = "express-route-cross-connection";
+    version = "0.1.1";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/express_route_cross_connection-${version}-py2.py3-none-any.whl";
+    sha256 = "b83f723baae0ea04557a87f358fa2131baf15d45cd3aba7a9ab42d14ec80df38";
+    description = "Manage customer ExpressRoute circuits using an ExpressRoute cross-connection";
+  };
+  fleet = mkAzExtension rec {
+    pname = "fleet";
+    version = "1.0.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/fleet-${version}-py3-none-any.whl";
+    sha256 = "cd93b819d0a8c1ab50f4aec00b31623fd01040362c4cd633a89ba03fc894eb73";
+    description = "Microsoft Azure Command-Line Tools Fleet Extension";
+  };
+  fluid-relay = mkAzExtension rec {
+    pname = "fluid-relay";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/fluid_relay-${version}-py3-none-any.whl";
+    sha256 = "9217666f8134a38e09aeda905e7cc83994332a5ab563ec8935b9ff6c91563e8c";
+    description = "Microsoft Azure Command-Line Tools FluidRelay Extension";
+  };
+  footprint = mkAzExtension rec {
+    pname = "footprint";
+    version = "1.0.0";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/footprint-${version}-py3-none-any.whl";
+    sha256 = "4aa59288bf46cfd68519f1f7f63d3e33af16d80632b84c283cc7152129260b2c";
+    description = "Microsoft Azure Command-Line Tools FootprintMonitoringManagementClient Extension";
+  };
+  front-door = mkAzExtension rec {
+    pname = "front-door";
+    version = "1.0.17";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/front_door-${version}-py3-none-any.whl";
+    sha256 = "20996a4d864963451572b71fecf4906f3e7fe8f403a651a1d1e98363df63d095";
+    description = "Manage networking Front Doors";
+  };
+  fzf = mkAzExtension rec {
+    pname = "fzf";
+    version = "1.0.2";
+    url = "https://pahealyfzf.blob.core.windows.net/fzf/fzf-${version}-py2.py3-none-any.whl";
+    sha256 = "84abeed03b4bbfa7b8c0be08d9366ff3040e2160df4f5a539f0e1c9e0a1c359c";
+    description = "Microsoft Azure Command-Line Tools fzf Extension";
+  };
+  graphservices = mkAzExtension rec {
+    pname = "graphservices";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/graphservices-${version}-py3-none-any.whl";
+    sha256 = "8aeda3901e944b038f4e812b0b7099798d2bd82d55e03e785017a504c14583e5";
+    description = "Microsoft Azure Command-Line Tools Graphservices Extension";
+  };
+  guestconfig = mkAzExtension rec {
+    pname = "guestconfig";
+    version = "0.1.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/guestconfig-${version}-py3-none-any.whl";
+    sha256 = "94836a5d21ee1071cd40b163d2c80c32a6a81b9dc85d91371f7e4fb35141e273";
+    description = "Microsoft Azure Command-Line Tools GuestConfigurationClient Extension";
+  };
+  hack = mkAzExtension rec {
+    pname = "hack";
+    version = "0.4.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/hack-${version}-py2.py3-none-any.whl";
+    sha256 = "f9e600457e3a9fffc3235a7b30176d9f0a7f4d39ac01ea3e2668bcbdee6398a6";
+    description = "Microsoft Azure Command-Line Tools Hack Extension";
+  };
+  hardware-security-modules = mkAzExtension rec {
+    pname = "hardware-security-modules";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/hardware_security_modules-${version}-py3-none-any.whl";
+    sha256 = "ac4a10e2cc64a4d0818e48ffbcddfeb4307dd56b8875bc01c02687d473c9fe9b";
+    description = "Microsoft Azure Command-Line Tools AzureDedicatedHSMResourceProvider Extension";
+  };
+  hdinsightonaks = mkAzExtension rec {
+    pname = "hdinsightonaks";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/hdinsightonaks-${version}-py3-none-any.whl";
+    sha256 = "566c30d67d6b524ac25f77342121e0e7a6ed4ab0af561fcc6e94b0629a03f40c";
+    description = "Microsoft Azure Command-Line Tools Hdinsightonaks Extension";
+  };
+  healthbot = mkAzExtension rec {
+    pname = "healthbot";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/healthbot-${version}-py3-none-any.whl";
+    sha256 = "9134fad2511516e714a5db346d63865af0badf0599ade3f1c15faca0055585a3";
+    description = "Microsoft Azure Command-Line Tools HealthbotClient Extension";
+  };
+  healthcareapis = mkAzExtension rec {
+    pname = "healthcareapis";
+    version = "0.4.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/healthcareapis-${version}-py3-none-any.whl";
+    sha256 = "a25d7d57d4fd3adcc37581d0acc1d6c6a46dcd0351933ed37cfba9d1abd60978";
+    description = "Microsoft Azure Command-Line Tools HealthcareApisManagementClient Extension";
+  };
+  hpc-cache = mkAzExtension rec {
+    pname = "hpc-cache";
+    version = "0.1.5";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/hpc_cache-${version}-py2.py3-none-any.whl";
+    sha256 = "852cb417aadf0ad07e3c51413858c413bf71ea6cb49ba58289d9572f9a350507";
+    description = "Microsoft Azure Command-Line Tools StorageCache Extension";
+  };
+  image-copy-extension = mkAzExtension rec {
+    pname = "image-copy-extension";
+    version = "0.2.13";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/image_copy_extension-${version}-py2.py3-none-any.whl";
+    sha256 = "b0d12bf3c74500790d58d99a6c32562548712cb872b7942e8ad481e270521b19";
+    description = "Support for copying managed vm images between regions";
+  };
+  image-gallery = mkAzExtension rec {
+    pname = "image-gallery";
+    version = "0.1.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/image_gallery-${version}-py2.py3-none-any.whl";
+    sha256 = "6260c1f4bfb589d2ba0569317358a149caabbbd49a048e69328e44871694aacd";
+    description = "Support for Azure Image Gallery";
+  };
+  import-export = mkAzExtension rec {
+    pname = "import-export";
+    version = "0.1.1";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/import_export-${version}-py3-none-any.whl";
+    sha256 = "0680948362e12138c9582e68e471533482749bd660bfe3c8c2a4d856e90927b0";
+    description = "Microsoft Azure Command-Line Tools StorageImportExport Extension";
+  };
+  init = mkAzExtension rec {
+    pname = "init";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/init-${version}-py3-none-any.whl";
+    sha256 = "1177fc293dc118b449b761ec2c728d39755fc3939de8d4bfd89cce1bfb218e86";
+    description = "Microsoft Azure Command-Line Tools Init Extension";
+  };
+  internet-analyzer = mkAzExtension rec {
+    pname = "internet-analyzer";
+    version = "0.1.0rc6";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/internet_analyzer-${version}-py2.py3-none-any.whl";
+    sha256 = "0708d9f598d1618d138eebcf18354d97c7b3a2c90570959df077e04d419d32c3";
+    description = "Microsoft Azure Command-Line Tools Internet Analyzer Extension";
+  };
+  ip-group = mkAzExtension rec {
+    pname = "ip-group";
+    version = "0.1.2";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/ip_group-${version}-py2.py3-none-any.whl";
+    sha256 = "afba2d8a8a612863b63f504d6cff6d559610b961e4c77dc2fd49b9fe03ec67a2";
+    description = "Microsoft Azure Command-Line Tools IpGroup Extension";
+  };
+  k8s-extension = mkAzExtension rec {
+    pname = "k8s-extension";
+    version = "1.6.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/k8s_extension-${version}-py3-none-any.whl";
+    sha256 = "27a9996a9ace11856f37719ae697f0ac98d368dde6eb8648d111aafc136599a7";
+    description = "Microsoft Azure Command-Line Tools K8s-extension Extension";
+  };
+  kusto = mkAzExtension rec {
+    pname = "kusto";
+    version = "0.5.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/kusto-${version}-py3-none-any.whl";
+    sha256 = "cf5729e9d02029a189182523543285c9737d515f41c610c8338d43f872f9f01d";
+    description = "Microsoft Azure Command-Line Tools KustoManagementClient Extension";
+  };
+  log-analytics = mkAzExtension rec {
+    pname = "log-analytics";
+    version = "0.2.2";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/log_analytics-${version}-py2.py3-none-any.whl";
+    sha256 = "c04c42a26d50db82d14f76e209184b18d4cce17b458817ac607e3ff975641eb2";
+    description = "Support for Azure Log Analytics query capabilities";
+  };
+  log-analytics-solution = mkAzExtension rec {
+    pname = "log-analytics-solution";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/log_analytics_solution-${version}-py2.py3-none-any.whl";
+    sha256 = "c0a4252da4c29032c4e956b768860529509e88a1ecef7f3a3189cb701a305c6b";
+    description = "Support for Azure Log Analytics Solution";
+  };
+  logic = mkAzExtension rec {
+    pname = "logic";
+    version = "1.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/logic-${version}-py3-none-any.whl";
+    sha256 = "14c18768c02ee9c370ac7eed0f23206eee7d344a10382a3083b17b5e1848cfcd";
+    description = "Microsoft Azure Command-Line Tools Logic Extension";
+  };
+  logz = mkAzExtension rec {
+    pname = "logz";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/logz-${version}-py3-none-any.whl";
+    sha256 = "6a937dbb8c5a758b29afd45ecfc101743a5bf2491f2fba60e8ea512d5b765840";
+    description = "Microsoft Azure Command-Line Tools MicrosoftLogz Extension";
+  };
+  maintenance = mkAzExtension rec {
+    pname = "maintenance";
+    version = "1.5.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/maintenance-${version}-py3-none-any.whl";
+    sha256 = "4f1336fed4fa2cbea640627676a6cab4399c1b29ae23cb21fe73c9bea0d80a7f";
+    description = "Microsoft Azure Command-Line Tools MaintenanceManagementClient Extension";
+  };
+  managedccfs = mkAzExtension rec {
+    pname = "managedccfs";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/managedccfs-${version}-py3-none-any.whl";
+    sha256 = "378f425f35420373e9703a5dc8c0f05ca8176fb8404b38610d4de828f7c23d37";
+    description = "Microsoft Azure Command-Line Tools Managedccfs Extension";
+  };
+  managednetworkfabric = mkAzExtension rec {
+    pname = "managednetworkfabric";
+    version = "4.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/managednetworkfabric-${version}-py3-none-any.whl";
+    sha256 = "f80f528a099862fa8e792f770943a832dbb958b503cc5cc8cb6f58766056d857";
+    description = "Support for managednetworkfabric commands based on 2023-06-15 API version";
+  };
+  managementpartner = mkAzExtension rec {
+    pname = "managementpartner";
+    version = "0.1.3";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/managementpartner-${version}-py2.py3-none-any.whl";
+    sha256 = "22ddf4b1cdc77e99262cb6089c4d96040065828a1d38a2709fdb945d3c851839";
+    description = "Support for Management Partner preview";
+  };
+  mixed-reality = mkAzExtension rec {
+    pname = "mixed-reality";
+    version = "0.0.5";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/mixed_reality-${version}-py2.py3-none-any.whl";
+    sha256 = "026aaf58f9ad02d74837d21a1f5c122264a59814e0b7c395c26e5fdc1293187e";
+    description = "Mixed Reality Azure CLI Extension";
+  };
+  mobile-network = mkAzExtension rec {
+    pname = "mobile-network";
+    version = "0.2.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/mobile_network-${version}-py3-none-any.whl";
+    sha256 = "66bd39f687c2ac030ab6bd44b8746ec8d64c4804b44592c0bb1ffda837dce22b";
+    description = "Microsoft Azure Command-Line Tools MobileNetwork Extension";
+  };
+  monitor-control-service = mkAzExtension rec {
+    pname = "monitor-control-service";
+    version = "1.0.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/monitor_control_service-${version}-py3-none-any.whl";
+    sha256 = "66475eb79c577ea566c74f986b9ef6af936580beb02dde622701370323d430a3";
+    description = "Microsoft Azure Command-Line Tools MonitorClient Extension";
+  };
+  network-analytics = mkAzExtension rec {
+    pname = "network-analytics";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/network_analytics-${version}-py3-none-any.whl";
+    sha256 = "c8d7e195f913298ac03ef8eb1f8d7fb09526956d3eb750a8cd447ae8f61d4317";
+    description = "Microsoft Azure Command-Line Tools NetworkAnalytics Extension";
+  };
+  networkcloud = mkAzExtension rec {
+    pname = "networkcloud";
+    version = "2.0.0b2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/networkcloud-${version}-py3-none-any.whl";
+    sha256 = "28c43560516e254ab60708c0ac8cf868795ce76e4aa9da1548584b22331af467";
+    description = "Support for Azure Operator Nexus network cloud commands based on 2023-10-01-preview API version";
+  };
+  new-relic = mkAzExtension rec {
+    pname = "new-relic";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/new_relic-${version}-py3-none-any.whl";
+    sha256 = "9ce69f1684cea14acba0f2fdb473e47e0a06745e383bb5144954c5e85e416199";
+    description = "Microsoft Azure Command-Line Tools NewRelic Extension";
+  };
+  next = mkAzExtension rec {
+    pname = "next";
+    version = "0.1.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/next-${version}-py2.py3-none-any.whl";
+    sha256 = "83c4e03427f190203e094c14e4f7e79cec989f1277e16b9256bb9fe688aa5e07";
+    description = "Microsoft Azure Command-Line Tools Next Extension";
+  };
+  nginx = mkAzExtension rec {
+    pname = "nginx";
+    version = "0.1.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/nginx-${version}-py2.py3-none-any.whl";
+    sha256 = "3234129a26043a68e80ee1ae31c36e7ef8b2691a096cd6fc557e3a46fea8170e";
+    description = "Microsoft Azure Command-Line Tools Nginx Extension";
+  };
+  notification-hub = mkAzExtension rec {
+    pname = "notification-hub";
+    version = "1.0.0a1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/notification_hub-${version}-py3-none-any.whl";
+    sha256 = "a03751b715700e0d18a38e808bfeed164335024c9608c4bfd53aeacc731d1099";
+    description = "Microsoft Azure Command-Line Tools Notification Hub Extension";
+  };
+  nsp = mkAzExtension rec {
+    pname = "nsp";
+    version = "0.3.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/nsp-${version}-py3-none-any.whl";
+    sha256 = "3e53051a70693a5da8c563118d0f695efc8465eab769ca64416fc8a16ba6e72a";
+    description = "Microsoft Azure Command-Line Tools Nsp Extension";
+  };
+  offazure = mkAzExtension rec {
+    pname = "offazure";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/offazure-${version}-py3-none-any.whl";
+    sha256 = "1918817070ae9e0ceef57b93366d18b6e8bf577fd632e7da999e1e2abbb53656";
+    description = "Microsoft Azure Command-Line Tools AzureMigrateV2 Extension";
+  };
+  orbital = mkAzExtension rec {
+    pname = "orbital";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/orbital-${version}-py3-none-any.whl";
+    sha256 = "4259fb8ff560440d63251cc9721bb3f2283452f2399134514611f886fa350f37";
+    description = "Microsoft Azure Command-Line Tools Orbital Extension";
+  };
+  palo-alto-networks = mkAzExtension rec {
+    pname = "palo-alto-networks";
+    version = "1.1.1b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/palo_alto_networks-${version}-py3-none-any.whl";
+    sha256 = "8d4f6a4b72366bd57780bd158d6c25b363999e1a13ea85d491809cc9a4d29608";
+    description = "Microsoft Azure Command-Line Tools PaloAltoNetworks Extension";
+  };
+  peering = mkAzExtension rec {
+    pname = "peering";
+    version = "0.2.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/peering-${version}-py3-none-any.whl";
+    sha256 = "b068c12b47f17304af51431a2ae975339b7d4601a180e83916efae73d7c42600";
+    description = "Microsoft Azure Command-Line Tools PeeringManagementClient Extension";
+  };
+  portal = mkAzExtension rec {
+    pname = "portal";
+    version = "0.1.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/portal-${version}-py3-none-any.whl";
+    sha256 = "3c3ebe23f59db5f2d286ca52cf8cfbbc5983ce8073622de11a35dab95800a996";
+    description = "Microsoft Azure Command-Line Tools Portal Extension";
+  };
+  powerbidedicated = mkAzExtension rec {
+    pname = "powerbidedicated";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/powerbidedicated-${version}-py2.py3-none-any.whl";
+    sha256 = "e1e58bb6f57edde4793f4c66a0c10a2776f842172878162385f2b1d21539de6e";
+    description = "Microsoft Azure Command-Line Tools PowerBIDedicated Extension";
+  };
+  providerhub = mkAzExtension rec {
+    pname = "providerhub";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/providerhub-${version}-py3-none-any.whl";
+    sha256 = "9cda8fed546254987e5c5f872b4119105796c89de8d65d385638dac155bdf01e";
+    description = "Microsoft Azure Command-Line Tools ProviderHub Extension";
+  };
+  purview = mkAzExtension rec {
+    pname = "purview";
+    version = "0.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/purview-${version}-py3-none-any.whl";
+    sha256 = "706cc2550fbd07b8b676345c2f26c5ba66550905bc8ec224c6c4e5637c497266";
+    description = "Microsoft Azure Command-Line Tools PurviewManagementClient Extension";
+  };
+  qumulo = mkAzExtension rec {
+    pname = "qumulo";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/qumulo-${version}-py3-none-any.whl";
+    sha256 = "9973f580a3fc20cc2fe5558a1cfdc10ddfc6567982d12f37008bbfec7aafcf9b";
+    description = "Microsoft Azure Command-Line Tools Qumulo Extension";
+  };
+  quota = mkAzExtension rec {
+    pname = "quota";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/quota-${version}-py3-none-any.whl";
+    sha256 = "8b4c3475df0c3544dbcc28e4875eb5b163d72b40aff4250aafdad94180c3f995";
+    description = "Microsoft Azure Command-Line Tools AzureQuotaExtensionAPI Extension";
+  };
+  redisenterprise = mkAzExtension rec {
+    pname = "redisenterprise";
+    version = "0.1.4";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/redisenterprise-${version}-py3-none-any.whl";
+    sha256 = "cb59ab44eb12b51ecc62f8a5b6302d166be5d6388cf8ff21bc49f2829128d031";
+    description = "Microsoft Azure Command-Line Tools RedisEnterprise Extension";
+  };
+  reservation = mkAzExtension rec {
+    pname = "reservation";
+    version = "0.3.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/reservation-${version}-py3-none-any.whl";
+    sha256 = "649f086b02305d142f2f08ea96f52a322a165a6f2a958f3287f53550938ab912";
+    description = "Microsoft Azure Command-Line Tools Reservation Extension";
+  };
+  resource-graph = mkAzExtension rec {
+    pname = "resource-graph";
+    version = "2.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/resource_graph-${version}-py2.py3-none-any.whl";
+    sha256 = "62c81e3d62ce60c5a0a485829d00bdb0c733145ee93fb6098c14e3b27ee27c40";
+    description = "Support for querying Azure resources with Resource Graph";
+  };
+  resource-mover = mkAzExtension rec {
+    pname = "resource-mover";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/resource_mover-${version}-py3-none-any.whl";
+    sha256 = "3bc9f41aa30c4f6bc04ff780dc30e8df05bfc887f2adbdf9e89d59f8389e55f3";
+    description = "Microsoft Azure Command-Line Tools ResourceMoverServiceAPI Extension";
+  };
+  sap-hana = mkAzExtension rec {
+    pname = "sap-hana";
+    version = "0.6.5";
+    url = "https://github.com/Azure/azure-hanaonazure-cli-extension/releases/download/${version}/sap_hana-0.6.5-py2.py3-none-any.whl";
+    sha256 = "b4554c125f3a0eb5c891cec396e7705f6e91d4d81789acef20e3c4d172fa4543";
+    description = "Additional commands for working with SAP HanaOnAzure instances";
+  };
+  scenario-guide = mkAzExtension rec {
+    pname = "scenario-guide";
+    version = "0.1.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/scenario_guide-${version}-py3-none-any.whl";
+    sha256 = "4264b48b4b980334488a3fdb3bc43241e828a2742c35ce48985f3bebf019e8f8";
+    description = "Microsoft Azure Command-Line Tools Scenario Guidance Extension";
+  };
+  scheduled-query = mkAzExtension rec {
+    pname = "scheduled-query";
+    version = "0.5.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/scheduled_query-${version}-py2.py3-none-any.whl";
+    sha256 = "b141ce4ff7678484561e9f3c842d8249112a465b7a0da07a6da49856920f8534";
+    description = "Microsoft Azure Command-Line Tools Scheduled_query Extension";
+  };
+  scvmm = mkAzExtension rec {
+    pname = "scvmm";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/scvmm-${version}-py2.py3-none-any.whl";
+    sha256 = "565aa9d75dd4d276df2f8ffec5311bd2ae16a2d6172d525a7763fc5972b262b7";
+    description = "Microsoft Azure Command-Line Tools SCVMM Extension";
+  };
+  self-help = mkAzExtension rec {
+    pname = "self-help";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/self_help-${version}-py3-none-any.whl";
+    sha256 = "a57d629f75443666af570188716eaf2b9182da41f6d2f958f6d53d79b830b23e";
+    description = "Microsoft Azure Command-Line Tools SelfHelp Extension";
+  };
+  sentinel = mkAzExtension rec {
+    pname = "sentinel";
+    version = "0.2.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/sentinel-${version}-py3-none-any.whl";
+    sha256 = "5511544b4e342b03a4a4263617c603d87442ad5179ce9d8c0d1fd10915f93b7a";
+    description = "Microsoft Azure Command-Line Tools Sentinel Extension";
+  };
+  site-recovery = mkAzExtension rec {
+    pname = "site-recovery";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/site_recovery-${version}-py3-none-any.whl";
+    sha256 = "ab19142c9a2e06190b6dac272d8cf29e179c9e283f965f8e3a4d29275b847ce5";
+    description = "Microsoft Azure Command-Line Tools SiteRecovery Extension";
+  };
+  spring = mkAzExtension rec {
+    pname = "spring";
+    version = "1.19.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/spring-${version}-py3-none-any.whl";
+    sha256 = "80cbd41e563231e500670402b01e95150adce18b7c128320c3d2393284e0d5d5";
+    description = "Microsoft Azure Command-Line Tools spring Extension";
+  };
+  spring-cloud = mkAzExtension rec {
+    pname = "spring-cloud";
+    version = "3.1.8";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/spring_cloud-${version}-py3-none-any.whl";
+    sha256 = "14993abe3524c28a42b2e9ba0f0a8a7083162ba9174975e09d8cea834b9829ee";
+    description = "Microsoft Azure Command-Line Tools spring-cloud Extension";
+  };
+  stack-hci = mkAzExtension rec {
+    pname = "stack-hci";
+    version = "1.1.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/stack_hci-${version}-py3-none-any.whl";
+    sha256 = "9bb0350f6c28ac2068a5a4a20bbcf74ae34b392d05eb148c403c618525cbadef";
+    description = "Microsoft Azure Command-Line Tools AzureStackHCIClient Extension";
+  };
+  stack-hci-vm = mkAzExtension rec {
+    pname = "stack-hci-vm";
+    version = "0.1.11";
+    url = "https://hybridaksstorage.z13.web.core.windows.net/SelfServiceVM/CLI/stack_hci_vm-${version}.1-py3-none-any.whl";
+    sha256 = "cc99134288545178d08b18abd5b7c9e3d099d2add8b52ab9308f6c5fd97ae60c";
+    description = "Microsoft Azure Command-Line Tools AzureStackHCIClient Extension ";
+  };
+  staticwebapp = mkAzExtension rec {
+    pname = "staticwebapp";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/staticwebapp-${version}-py3-none-any.whl";
+    sha256 = "fb1dcd876fc2d829cc7a1cc545e9445364d43357d888bb3deeb36a716b805717";
+    description = "Microsoft Azure Command-Line Tools Staticwebapp Extension";
+  };
+  storage-blob-preview = mkAzExtension rec {
+    pname = "storage-blob-preview";
+    version = "0.7.2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/storage_blob_preview-${version}-py2.py3-none-any.whl";
+    sha256 = "002b7779f4c6531fdb714f77bcea5d3d96007a7ff5b86869f8e56aad98298b23";
+    description = "Microsoft Azure Command-Line Tools Storage-blob-preview Extension";
+  };
+  storage-mover = mkAzExtension rec {
+    pname = "storage-mover";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/storage_mover-${version}-py3-none-any.whl";
+    sha256 = "2682859ea376194a6942713ad673fd426555ce2d4ebe9545e45d18da4fed98b1";
+    description = "Microsoft Azure Command-Line Tools StorageMover Extension";
+  };
+  storagesync = mkAzExtension rec {
+    pname = "storagesync";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/storagesync-${version}-py2.py3-none-any.whl";
+    sha256 = "1f6997e186199058e60d8fdc020c407d4f92d8e78286189c1887e57a371b43c1";
+    description = "Microsoft Azure Command-Line Tools MicrosoftStorageSync Extension";
+  };
+  stream-analytics = mkAzExtension rec {
+    pname = "stream-analytics";
+    version = "1.0.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/stream_analytics-${version}-py3-none-any.whl";
+    sha256 = "15443fd8a73d319a5c9fbc586c9727d1ce1a31e11fd3f3c7e4fcbc97ad076aaa";
+    description = "Microsoft Azure Command-Line Tools StreamAnalyticsManagementClient Extension";
+  };
+  subscription = mkAzExtension rec {
+    pname = "subscription";
+    version = "0.1.5";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/subscription-${version}-py2.py3-none-any.whl";
+    sha256 = "ff7896aebc46862a6d30ac5f4cf64bdd40cb50e5437cea299590896d75f1013e";
+    description = "Support for subscription management preview";
+  };
+  support = mkAzExtension rec {
+    pname = "support";
+    version = "1.0.3";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/support-${version}-py2.py3-none-any.whl";
+    sha256 = "9f5b4ebc6a90b48d2a3c18ce7b74d89240275dcf23aa836b8509882b1ee28c56";
+    description = "Microsoft Azure Command-Line Tools Support Extension";
+  };
+  timeseriesinsights = mkAzExtension rec {
+    pname = "timeseriesinsights";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/timeseriesinsights-${version}-py3-none-any.whl";
+    sha256 = "c578804a6cfbb4ef8ab91de2130bba8f6139f2fadea4ed1e38b05ea62c7aa95d";
+    description = "Microsoft Azure Command-Line Tools TimeSeriesInsightsClient Extension";
+  };
+  traffic-collector = mkAzExtension rec {
+    pname = "traffic-collector";
+    version = "0.1.2";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/traffic_collector-${version}-py3-none-any.whl";
+    sha256 = "98bda4d9a9233efb0ae1c5fae1a6c2a42942e8a71b0ebf19d3a7193548b13ff2";
+    description = "Microsoft Azure Command-Line Tools TrafficCollector Extension";
+  };
+  virtual-network-manager = mkAzExtension rec {
+    pname = "virtual-network-manager";
+    version = "1.0.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/virtual_network_manager-${version}-py3-none-any.whl";
+    sha256 = "a18581c625791fb29736e7ec1b9e18d4a00f3765a8600192e10c892fd27b7ba1";
+    description = "Microsoft Azure Command-Line Tools NetworkManagementClient Extension";
+  };
+  virtual-network-tap = mkAzExtension rec {
+    pname = "virtual-network-tap";
+    version = "0.1.0";
+    url = "https://azurecliprod.blob.core.windows.net/cli-extensions/virtual_network_tap-${version}-py2.py3-none-any.whl";
+    sha256 = "7e3f634f8eb701cf6fef504159785bc90e6f5bd2482e459469dd9ab30601aa35";
+    description = "Manage virtual network taps (VTAP)";
+  };
+  virtual-wan = mkAzExtension rec {
+    pname = "virtual-wan";
+    version = "0.3.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/virtual_wan-${version}-py2.py3-none-any.whl";
+    sha256 = "e5f4e9d4398cf0fcd656c0107386adbc8493e69e3158af6c5145ed23aaf77165";
+    description = "Manage virtual WAN, hubs, VPN gateways and VPN sites";
+  };
+  vm-repair = mkAzExtension rec {
+    pname = "vm-repair";
+    version = "1.0.0b1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/vm_repair-${version}-py2.py3-none-any.whl";
+    sha256 = "7e6b9fb9952a56811d65de87b87b0403a6161edfa82284a43fa58f176e397b8b";
+    description = "Auto repair commands to fix VMs";
+  };
+  vmware = mkAzExtension rec {
+    pname = "vmware";
+    version = "6.0.1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/vmware-${version}-py2.py3-none-any.whl";
+    sha256 = "2e07a4ddf1b244cfe8b63a29b7f82c3ec94294f10bacfe8fd604841d290020b5";
+    description = "Azure VMware Solution commands";
+  };
+  webapp = mkAzExtension rec {
+    pname = "webapp";
+    version = "0.4.0";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/webapp-${version}-py2.py3-none-any.whl";
+    sha256 = "908b0df07cef652176a0f2bf0fdcf58b5d16fb4903ee3c06f73f0bb3913a5c0f";
+    description = "Additional commands for Azure AppService";
+  };
+  workloads = mkAzExtension rec {
+    pname = "workloads";
+    version = "0.1.0a1";
+    url = "https://azcliprod.blob.core.windows.net/cli-extensions/workloads-${version}-py3-none-any.whl";
+    sha256 = "0e5ba95c3799d043fc2ba869ce0c5b2eea200357a8b0cbd2b2733bb91d4cc7a8";
+    description = "Microsoft Azure Command-Line Tools Workloads Extension";
+  };
+}
diff --git a/pkgs/tools/admin/azure-cli/python-packages.nix b/pkgs/tools/admin/azure-cli/python-packages.nix
index b01341f1a2caa..7e643a0a2ef6d 100644
--- a/pkgs/tools/admin/azure-cli/python-packages.nix
+++ b/pkgs/tools/admin/azure-cli/python-packages.nix
@@ -1,4 +1,5 @@
-{ stdenv
+{ lib
+, stdenv
 , python3
 , fetchPypi
 , fetchpatch
@@ -30,6 +31,16 @@ let
 
         sourceRoot = "${src.name}/src/azure-cli-core";
 
+        patches = [
+          # Adding the possibility to configure an immutable configuration dir via `AZURE_IMMUTABLE_DIR`.
+          # This enables us to place configuration files that alter the behavior of the CLI in the Nix store.
+          #
+          # This is a downstream patch without an commit or PR upstream.
+          # There is an issue to discuss possible solutions upstream:
+          # https://github.com/Azure/azure-cli/issues/28093
+          ./0001-optional-immutable-configuration-dir.patch
+        ];
+
         propagatedBuildInputs = with self; [
           argcomplete
           azure-cli-telemetry
diff --git a/pkgs/tools/admin/azure-cli/query-extension-index.sh b/pkgs/tools/admin/azure-cli/query-extension-index.sh
new file mode 100755
index 0000000000000..8dbd45ce937e6
--- /dev/null
+++ b/pkgs/tools/admin/azure-cli/query-extension-index.sh
@@ -0,0 +1,163 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+function usage() {
+    {
+        echo "${0} - query Azure CLI extension index"
+        echo
+        echo "The Azure CLI extension index contains all versions of all extensions. This"
+        echo "script queries the index for the latest version of an extensions that is"
+        echo "compatible with the specified version of the Azure CLI. Data for that extension"
+        echo "is filtered for fields relevant to package the extension in Nix."
+        echo
+        echo "Usage:"
+        echo "  --cli-version=<version>      version of azure-cli (required)"
+        echo "  --extension=<name>           name of extension to query"
+        echo "  --file=<path>                path to extension index file"
+        echo "  --download                   download extension index file"
+        echo "  --nix                        output Nix expression"
+        echo "  --requirements=<true/false>  filter for extensions with/without requirements"
+    } >&2
+}
+
+for arg in "$@"; do
+    case "$arg" in
+        --cli-version=*)
+            cliVer="${arg#*=}"
+            shift
+            ;;
+        --extension=*)
+            extName="${arg#*=}"
+            shift
+            ;;
+        --file=*)
+            extensionFile="${arg#*=}"
+            shift
+            ;;
+        --download)
+            download=true
+            shift
+            ;;
+        --nix)
+            nix=true
+            shift
+            ;;
+        --requirements=*)
+            requirements="${arg#*=}"
+            shift
+            ;;
+        --help)
+            usage
+            exit 0
+            ;;
+        *)
+            echo "Unknown argument: $arg" >&2
+            exit 1
+            ;;
+    esac
+done
+
+if [[ -z "${cliVer:-}" ]]; then
+    echo "Missing --cli-version argument" >&2
+    exit 1
+fi
+if [[ -z "${extensionFile:-}" && -z "${download:-}" ]]; then
+    echo "Either --file or --download must be specified" >&2
+    exit 1
+fi
+if [[ -n "${extName:-}" && -n "${requirements:-}" ]]; then
+    echo "--requirements can only be used when listing all extensions" >&2
+    exit 1
+fi
+
+if [[ "${download:-}" == true ]]; then
+    extensionFile="$(mktemp)"
+    echo "Downloading extensions index to ${extensionFile}" >&2
+    curl -fsSL "https://azcliextensionsync.blob.core.windows.net/index1/index.json" > "${extensionFile}"
+fi
+
+# shellcheck disable=SC2016
+jqProgram='
+    def opt(f):
+        . as $in | try f catch $in
+        ;
+
+    def version_to_array:
+        sub("\\+.*$"; "")
+        | capture("^(?<v>[^a-z-]+)(?:(?<p>.*))?") | [.v, .p // empty]
+        | map(split(".")
+        | map(opt(tonumber)))
+        | flatten
+        ;
+
+    def version_le($contstraint):
+        version_to_array as $v
+        | $contstraint | version_to_array as $c
+        | $v[0] < $c[0] or
+          ($v[0] == $c[0] and $v[1] < $c[1]) or
+          ($v[0] == $c[0] and $v[1] == $c[1] and $v[2] < $c[2]) or
+          ($v[0] == $c[0] and $v[1] == $c[1] and $v[2] == $c[2] and $v[3] <= $c[3])
+        ;
+
+    def max_constrained_version($constraint):
+        [
+            .[] | select(.metadata."azext.minCliCoreVersion" // "0.0.0" | version_le($cliVer))
+        ]
+        | sort_by(.metadata.version | version_to_array)
+        | last
+        ;
+
+    def translate_struct:
+        {
+            pname : .metadata.name,
+            description: .metadata.summary,
+            version: .metadata.version,
+            url: .downloadUrl,
+            sha256: .sha256Digest,
+            license: .metadata.license,
+            requires: .metadata.run_requires.[0].requires
+        }
+        ;
+
+    def to_nix:
+        [.].[] as $in
+        | .version as $version
+        | .description as $description
+        | .url | sub($version;"${version}") as $url
+        | $description |rtrimstr(".") as $description
+        | $in.pname + " = mkAzExtension rec {\n" +
+        "  pname = \"" + $in.pname + "\";\n" +
+        "  version = \"" + $in.version + "\";\n" +
+        "  url = \"" + $url + "\";\n" +
+        "  sha256 = \"" + $in.sha256 + "\";\n" +
+        "  description = \"" + $description + "\";\n" +
+        "};"
+        ;
+
+    def main:
+        .extensions
+        | map(max_constrained_version($cliVer))
+        | .[]
+        | translate_struct
+        | if $extName  != "" then
+            select(.pname == $extName)
+        elif $requirements == "false" then
+            select(.requires == null)
+        elif $requirements == "true" then
+            select(.requires != null)
+        end
+        | if $nix == "true" then
+            to_nix
+        end
+        ;
+
+    main
+'
+
+jq -r \
+    --arg cliVer "${cliVer}" \
+    --arg extName "${extName:-}" \
+    --arg nix "${nix:-}" \
+    --arg requirements "${requirements:-}" \
+    "$jqProgram" "${extensionFile}"
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index b38be7cb95108..b45914047c3f2 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -3395,6 +3395,8 @@ with pkgs;
 
   azure-cli = callPackage ../tools/admin/azure-cli { };
 
+  azure-cli-extensions = recurseIntoAttrs azure-cli.extensions;
+
   azure-functions-core-tools = callPackage ../development/tools/azure-functions-core-tools { };
 
   azure-static-sites-client = callPackage ../development/tools/azure-static-sites-client { };