diff --git a/ops/jujuversion.py b/ops/jujuversion.py index c5d075c4a..bb8151b13 100755 --- a/ops/jujuversion.py +++ b/ops/jujuversion.py @@ -121,5 +121,10 @@ def has_secrets(self) -> bool: # * In 3.0.2, secret-get "--update" was renamed to "--refresh", and # secret-get-info was separated into its own hook tool # * In 3.0.3, a bug with observer labels was fixed (juju/juju#14916) - # TODO(benhoyt): update to 3.0.3+ once shipped (for juju/juju#14916 fix) - return (self.major, self.minor, self.patch) >= (3, 0, 2) + return (self.major, self.minor, self.patch) >= (3, 0, 3) + + @property + def supports_open_port_on_k8s(self) -> bool: + """Report whether this Juju version supports open-port on Kubernetes.""" + # Support added: https://bugs.launchpad.net/juju/+bug/1920960 + return (self.major, self.minor, self.patch) >= (3, 0, 3) diff --git a/ops/model.py b/ops/model.py index 47cc2ea67..4bd4342f3 100644 --- a/ops/model.py +++ b/ops/model.py @@ -265,14 +265,8 @@ def get_secret(self, *, id: Optional[str] = None, label: Optional[str] = None) - if id is not None: # Canonicalize to "secret:" form for consistency in backend calls. id = Secret._canonicalize_id(id) - try: - content = self._backend.secret_get(id=id, label=label) - return Secret(self._backend, id=id, label=label, content=content) - except ModelError: - # TODO(benhoyt): remove the secret-info-get fallback once - # juju/juju#14916 is fixed (should be in Juju 3.0.3) - info = self._backend.secret_info_get(id=id, label=label) - return Secret(self._backend, id=info.id, label=info.label) + content = self._backend.secret_get(id=id, label=label) + return Secret(self._backend, id=id, label=label, content=content) class _ModelCache: diff --git a/test/test_jujuversion.py b/test/test_jujuversion.py index 0d180a633..7e0423058 100755 --- a/test/test_jujuversion.py +++ b/test/test_jujuversion.py @@ -69,10 +69,17 @@ def test_has_controller_storage(self): self.assertFalse(ops.JujuVersion('2.7.9').has_controller_storage()) def test_has_secrets(self): - self.assertTrue(ops.JujuVersion('3.0.2').has_secrets) - self.assertFalse(ops.JujuVersion('3.0.1').has_secrets) + self.assertTrue(ops.JujuVersion('3.0.3').has_secrets) + self.assertTrue(ops.JujuVersion('3.1.0').has_secrets) + self.assertFalse(ops.JujuVersion('3.0.2').has_secrets) self.assertFalse(ops.JujuVersion('2.9.30').has_secrets) + def test_supports_open_port_on_k8s(self): + self.assertTrue(ops.JujuVersion('3.0.3').supports_open_port_on_k8s) + self.assertTrue(ops.JujuVersion('3.3.0').supports_open_port_on_k8s) + self.assertFalse(ops.JujuVersion('3.0.2').supports_open_port_on_k8s) + self.assertFalse(ops.JujuVersion('2.9.30').supports_open_port_on_k8s) + def test_parsing_errors(self): invalid_versions = [ "xyz", diff --git a/test/test_model.py b/test/test_model.py index be09fa5e4..b1e063b71 100755 --- a/test/test_model.py +++ b/test/test_model.py @@ -2954,7 +2954,6 @@ def test_get_secret_no_args(self): def test_get_secret_not_found(self): script = """echo 'ERROR secret "123" not found' >&2; exit 1""" fake_script(self, 'secret-get', script) - fake_script(self, 'secret-info-get', script) with self.assertRaises(ops.SecretNotFoundError): self.model.get_secret(id='123') @@ -2962,7 +2961,6 @@ def test_get_secret_not_found(self): def test_get_secret_other_error(self): script = """echo 'ERROR other error' >&2; exit 1""" fake_script(self, 'secret-get', script) - fake_script(self, 'secret-info-get', script) with self.assertRaises(ops.ModelError) as cm: self.model.get_secret(id='123') diff --git a/tox.ini b/tox.ini index 0bc99fa2a..a7700b048 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,7 @@ [tox] skipsdist=True skip_missing_interpreters = True -envlist = lint, unit +envlist = lint, static, unit [vars] # These need to be relative paths because autopep8 doesn't handle absolute