Antoni Segura Puimedon has uploaded a new change for review. Change subject: netconfpersistence: overload the subtraction operator ......................................................................
netconfpersistence: overload the subtraction operator This patch makes it easy to diff two network configurations in a way that gives you a resulting Config object that can be used for a setupNetworks operation. If the current configuration is B and we want to put the system in state A, we'd do: diff = A - B setupNetwork(diff.networks, diff.bonds, {}) Change-Id: I70a3be5610492fd3cb27d49703e04a84cfad57d1 Signed-off-by: Antoni S. Puimedon <asegu...@redhat.com> --- M lib/vdsm/netconfpersistence.py M tests/netconfpersistenceTests.py 2 files changed, 46 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/28/21728/1 diff --git a/lib/vdsm/netconfpersistence.py b/lib/vdsm/netconfpersistence.py index 0cc6805..d4aad23 100644 --- a/lib/vdsm/netconfpersistence.py +++ b/lib/vdsm/netconfpersistence.py @@ -50,6 +50,26 @@ return '%s(%s, %s)' % (self.__class__.__name__, self.networks, self.bonds) + def __sub__(self, other): + """Returns a diff that shows the config that should be changed for + going from other to self.""" + diff = Config('') + diff.networks = self._confDictDiff(self.networks, other.networks) + diff.bonds = self._confDictDiff(self.bonds, other.bonds) + return diff + + @staticmethod + def _confDictDiff(lhs, rhs): + result = {} + for name in rhs: + if name not in lhs: + result[name] = {'remove': True} + + for name, attr in lhs.iteritems(): + if name not in rhs or attr != rhs[name]: + result[name] = lhs[name] + return result + def _networkPath(self, network): return self.networksPath + network diff --git a/tests/netconfpersistenceTests.py b/tests/netconfpersistenceTests.py index 7a96f6b..0d5d9ae 100644 --- a/tests/netconfpersistenceTests.py +++ b/tests/netconfpersistenceTests.py @@ -78,3 +78,29 @@ self.assertTrue(os.path.exists(filePath)) persistence.delete() self.assertFalse(os.path.exists(filePath)) + + def testDiff(self): + configA = Config(self.tempdir) + configA.setNetwork(NETWORK, NETWORK_ATTRIBUTES) + configA.setBonding(BONDING, BONDING_ATTRIBUTES) + + configB = Config(self.tempdir) + configB.setNetwork(NETWORK, NETWORK_ATTRIBUTES) + configB.setBonding(BONDING, BONDING_ATTRIBUTES) + + diff = configA - configB + self.assertEqual(diff.networks, {}) + self.assertEqual(diff.bonds, {}) + + EVIL_NETWORK = 'jarjar' + EVIL_BONDING_ATTRIBUTES = {'options': 'mode=3', 'nics': ['eth3']} + configB.setNetwork(EVIL_NETWORK, NETWORK_ATTRIBUTES) + configB.setBonding(BONDING, EVIL_BONDING_ATTRIBUTES) + + diff = configA - configB + self.assertEqual(diff.networks[EVIL_NETWORK], {'remove': True}) + self.assertEqual(diff.bonds[BONDING], BONDING_ATTRIBUTES) + + configB.removeNetwork(NETWORK) + diff = configA - configB + self.assertIn(NETWORK, diff.networks) -- To view, visit http://gerrit.ovirt.org/21728 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I70a3be5610492fd3cb27d49703e04a84cfad57d1 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Antoni Segura Puimedon <asegu...@redhat.com> _______________________________________________ vdsm-patches mailing list vdsm-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches