Skip to content

Commit 5834fe9

Browse files
brrusinoCopilot
andcommitted
[k8s-extension] ChaosStudio: pass chart version through; bump to 1.9.2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent dc4578d commit 5834fe9

4 files changed

Lines changed: 77 additions & 24 deletions

File tree

‎src/k8s-extension/HISTORY.rst‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
33
Release History
44
===============
5+
1.9.2
6+
+++++++++++++++++++
7+
* Microsoft.ChaosStudio: pass --version through to the extension service; default to the latest registered version instead of pinning chart 0.1.6.
8+
59
1.9.1
610
+++++++++++++++++++
711
* Add Fleet support for Kubernetes extension and cluster-scoped extension type commands.

‎src/k8s-extension/azext_k8s_extension/partner_extensions/ChaosStudio.py‎

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from azure.cli.core.util import send_raw_request, sdk_no_wait
2020
from knack.log import get_logger
2121
from knack.util import CLIError
22+
from packaging.version import InvalidVersion, Version
2223
from ..vendored_sdks.models import Extension, PatchExtension, Scope, ScopeCluster
2324
from .._client_factory import cf_k8s_extension_types
2425
from .DefaultExtension import DefaultExtension
@@ -104,7 +105,6 @@ class ChaosStudio(DefaultExtension):
104105
DEFAULT_CLUSTER_TYPE = "managedclusters"
105106
DEFAULT_RELEASE_NAMESPACE = "chaos-infrastructure"
106107
DEFAULT_RELEASE_TRAIN = "dev"
107-
DEFAULT_VERSION = "0.1.6"
108108
WORKSPACE_ID_KEY = "chaos-workspace-id"
109109
EXISTING_ROLE_KEY = "chaos-existing-role-definition-id"
110110

@@ -191,7 +191,12 @@ def Create(
191191
)
192192
if not workspace_id:
193193
raise InvalidArgumentValueError("'chaos-workspace-id' is required.")
194-
self._validate_version(version or self.DEFAULT_VERSION)
194+
release_train = release_train or self.DEFAULT_RELEASE_TRAIN
195+
if not version:
196+
# auto-upgrade is forced off, so the extension RP needs an explicit version.
197+
version = self._latest_registered_version(
198+
cmd, resource_group_name, cluster_rp, cluster_type, cluster_name, release_train
199+
)
195200
release_namespace = self._resolve_release_namespace(
196201
release_namespace
197202
)
@@ -207,23 +212,33 @@ def Create(
207212
extension_type=extension_type,
208213
auto_upgrade_minor_version=False,
209214
auto_upgrade_mode=None,
210-
release_train=release_train or self.DEFAULT_RELEASE_TRAIN,
211-
version=version or self.DEFAULT_VERSION,
215+
release_train=release_train,
216+
version=version,
212217
scope=extension_scope,
213218
configuration_settings=configuration_settings,
214219
configuration_protected_settings=configuration_protected_settings,
215220
)
216221
return extension, name, False
217222

218-
@classmethod
219-
def _validate_version(cls, version):
220-
# Only the coordinated bootstrap contract is known compatible. Availability
221-
# remains an extension-RP registration check, not a version-number inference.
222-
if version != cls.DEFAULT_VERSION:
223+
@staticmethod
224+
def _latest_registered_version(cmd, resource_group_name, cluster_rp, cluster_type, cluster_name, release_train):
225+
versions = cf_k8s_extension_types(cmd.cli_ctx).cluster_list_versions(
226+
resource_group_name, cluster_rp, cluster_type, cluster_name,
227+
"Microsoft.ChaosStudio", release_train=release_train,
228+
)
229+
candidates = []
230+
for item in versions or []:
231+
value = getattr(getattr(item, "properties", None), "version", None)
232+
try:
233+
candidates.append((Version(value), value))
234+
except (InvalidVersion, TypeError):
235+
continue
236+
if not candidates:
223237
raise InvalidArgumentValueError(
224-
"Microsoft.ChaosStudio staged installation requires chart {}. "
225-
"It must be published and registered before installation.".format(cls.DEFAULT_VERSION)
238+
"No Microsoft.ChaosStudio version is registered for this cluster on release train '{}'. "
239+
"Pass --version once one is available.".format(release_train)
226240
)
241+
return max(candidates)[1]
227242

228243
@classmethod
229244
def _reject_managed_overrides(cls, *settings):
@@ -264,7 +279,6 @@ def _stage(cls, extension):
264279
"The existing extension is not a staged platform-identity installation. "
265280
"Automatic migration of older manual identities is not supported."
266281
)
267-
cls._validate_version(extension.version)
268282
return value
269283

270284
def Install(self, cmd, client, resource_group_name, cluster_rp, cluster_type,
@@ -451,7 +465,6 @@ def Update(
451465
configuration_protected_settings or {}
452466
)
453467
self._reject_managed_overrides(supplied_settings, configuration_protected_settings)
454-
self._validate_version(version or original_extension.version)
455468
if self._stage(original_extension) != "true":
456469
raise InvalidArgumentValueError("Resume bootstrap with create before updating settings.")
457470
self._require_success(original_extension)
@@ -504,11 +517,7 @@ def Update(
504517
or getattr(original_extension, "release_train", None)
505518
or self.DEFAULT_RELEASE_TRAIN
506519
),
507-
version=(
508-
version
509-
or getattr(original_extension, "version", None)
510-
or self.DEFAULT_VERSION
511-
),
520+
version=version or getattr(original_extension, "version", None),
512521
configuration_settings=configuration_settings,
513522
configuration_protected_settings=configuration_protected_settings,
514523
)

‎src/k8s-extension/azext_k8s_extension/tests/latest/test_chaos_studio.py‎

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -405,12 +405,52 @@ def test_endpoint_mismatch_fails_before_writes(self):
405405
self.run_install()
406406
self.assertFalse(any(e[0] in ("create", "update", "arm-put") for e in self.events))
407407

408-
def test_old_or_unregistered_version_rejected_before_writes(self):
409-
with self.assertRaises(InvalidArgumentValueError):
410-
self.prepare(version="0.1.3")
411-
self.versions.return_value = []
408+
def registered(self, *versions):
409+
self.versions.return_value = [SimpleNamespace(properties=SimpleNamespace(version=v)) for v in versions]
410+
411+
def test_unregistered_version_rejected_before_writes(self):
412+
self.registered("0.1.6")
412413
with self.assertRaisesRegex(AzureResponseError, "not registered"):
413-
self.run_install()
414+
self.run_install(version="0.1.3")
415+
self.assertFalse(any(e[0] in ("create", "update", "arm-put") for e in self.events))
416+
417+
def test_omitted_version_resolves_to_latest_registered(self):
418+
self.registered("0.1.6", "0.2.10", "0.2.9", "not-a-version")
419+
extension = self.prepare()
420+
self.assertEqual(extension.version, "0.2.10")
421+
self.assertFalse(extension.auto_upgrade_minor_version)
422+
self.versions.assert_called_with("rg", "Microsoft.ContainerService", "managedClusters", "cluster",
423+
"Microsoft.ChaosStudio", release_train="dev")
424+
self.registered()
425+
with self.assertRaisesRegex(InvalidArgumentValueError, "No Microsoft.ChaosStudio version"):
426+
self.prepare()
427+
428+
def test_create_update_delete_at_registered_non_pinned_version(self):
429+
self.registered("0.1.6", "0.2.0", "0.3.0")
430+
result = self.run_install(version="0.2.0")
431+
self.assertEqual(result.version, "0.2.0")
432+
create = next(e[1] for e in self.events if e[0] == "create")
433+
self.assertEqual(create.version, "0.2.0")
434+
update = self.partner.Update(self.cmd, "rg", "cluster", None, None, None, "0.3.0",
435+
{}, {}, self.client.extension)
436+
self.assertEqual(update.version, "0.3.0")
437+
update = self.partner.Update(self.cmd, "rg", "cluster", None, None, None, None,
438+
{}, {}, self.client.extension)
439+
self.assertEqual(update.version, "0.2.0")
440+
self.events.clear()
441+
with patch("azext_k8s_extension.partner_extensions.DefaultExtension.DefaultExtension.Delete"):
442+
self.partner.Delete(self.cmd, self.client, "rg", "cluster", "chaos",
443+
"managedClusters", "Microsoft.ContainerService", True)
444+
self.assertIn(("arm-delete", CONNECTION), [e[0:2] for e in self.events])
445+
446+
def test_resume_rejects_version_mismatch(self):
447+
self.registered("0.2.0", "0.3.0")
448+
self.client.fail_after_create = True
449+
with self.assertRaises(AzureResponseError):
450+
self.run_install(version="0.2.0")
451+
self.events.clear()
452+
with self.assertRaisesRegex(AzureResponseError, "version or state conflicts"):
453+
self.run_install(version="0.3.0")
414454
self.assertFalse(any(e[0] in ("create", "update", "arm-put") for e in self.events))
415455

416456
def test_customer_cannot_override_stage_identity_or_endpoint(self):

‎src/k8s-extension/setup.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"azure-mgmt-network>=18.0.0",
3737
]
3838

39-
VERSION = "1.9.1"
39+
VERSION = "1.9.2"
4040

4141
with open("README.rst", "r", encoding="utf-8") as f:
4242
README = f.read()

0 commit comments

Comments
 (0)