Change in vdsm[master]: ceph: Undefine existing secret if usage changed

nsoffer at redhat.com nsoffer at redhat.com
Sun May 17 00:51:10 UTC 2015


Nir Soffer has uploaded a new change for review.

Change subject: ceph: Undefine existing secret if usage changed
......................................................................

ceph: Undefine existing secret if usage changed

When re-defining a secret, libvirt does not allow to change the usage
id.  We know that we will have to change the usage id in the next
version, when moving secrets from Cinder provider to the storage domain
using the Cinder provider.

So now lookup existing secrets and undefine secrets with different
usage id before defining new secret.

Change-Id: Ib258f0be1cdd4f2672b9adaad35da13d48279ce6
Signed-off-by: Nir Soffer <nsoffer at redhat.com>
---
M tests/vmSecretTests.py
M vdsm/virt/secret.py
2 files changed, 22 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/67/40967/1

diff --git a/tests/vmSecretTests.py b/tests/vmSecretTests.py
index c4b5f80..edd835d 100644
--- a/tests/vmSecretTests.py
+++ b/tests/vmSecretTests.py
@@ -197,6 +197,16 @@
         virsec2 = self.connection.secrets[sec2["uuid"]]
         self.assertEqual("sec2 new password", virsec2.value)
 
+    def test_register_change_usage_id(self):
+        sec = make_secret(usage_value="ovirt/provider_uuid/secert_uuid")
+        secret.register([sec])
+        # Change usage id
+        sec["usage"]["value"] = "ovirt/domain_uuid/secret_uuid"
+        res = secret.register([sec])
+        self.assertEqual(res, response.success())
+        virsec = self.connection.secrets[sec["uuid"]]
+        self.assertEqual("ovirt/domain_uuid/secret_uuid", virsec.usage_id)
+
     def test_register_libvirt_error(self):
         def fail(xml):
             raise vmfakelib.Error(libvirt.VIR_ERR_INTERNAL_ERROR)
diff --git a/vdsm/virt/secret.py b/vdsm/virt/secret.py
index 2ce9da0..b780772 100644
--- a/vdsm/virt/secret.py
+++ b/vdsm/virt/secret.py
@@ -90,6 +90,18 @@
         self.description = params.get("description")
 
     def register(self, con):
+        # This is racy, but we don't have a better way. This is unlikely to
+        # fail, as we own libvirt and its secrets, and we do not modify the
+        # same secrets concurrently.
+        try:
+            virsecret = con.secretLookupByUUIDString(self.uuid)
+        except libvirt.libvirtError as e:
+            if e.get_error_code() != libvirt.VIR_ERR_NO_SECRET:
+                raise
+        else:
+            if virsecret.usageID() != self.usage.value:
+                virsecret.undefine()
+
         virsecret = con.secretDefineXML(self.toxml())
         virsecret.setValue(self.password.value)
 


-- 
To view, visit https://gerrit.ovirt.org/40967
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib258f0be1cdd4f2672b9adaad35da13d48279ce6
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Nir Soffer <nsoffer at redhat.com>


More information about the vdsm-patches mailing list