diff options
author | John Eckersberg <jeckersb@redhat.com> | 2009-03-04 19:37:47 -0500 |
---|---|---|
committer | John Eckersberg <jeckersb@redhat.com> | 2009-03-13 13:52:35 -0400 |
commit | e4923bec0d0ecf7f3f50b80491d4b990cf8cfe53 (patch) | |
tree | 8d04e81969668062d3575639b64b38743e182a5f | |
parent | a3105537c7c247889dbbd0ed940a493058f48bb7 (diff) | |
download | cobbler-e4923bec0d0ecf7f3f50b80491d4b990cf8cfe53.tar.gz cobbler-e4923bec0d0ecf7f3f50b80491d4b990cf8cfe53.tar.xz cobbler-e4923bec0d0ecf7f3f50b80491d4b990cf8cfe53.zip |
Leaving a network now works
-rw-r--r-- | cobbler/item_network.py | 26 | ||||
-rw-r--r-- | cobbler/item_system.py | 23 |
2 files changed, 40 insertions, 9 deletions
diff --git a/cobbler/item_network.py b/cobbler/item_network.py index d1806cfd..1f300b5b 100644 --- a/cobbler/item_network.py +++ b/cobbler/item_network.py @@ -109,7 +109,7 @@ class Network(item.Item): return str(item['ip']) return None - def subscribe_system(self, name, intf, ip=None): + def subscribe_system(self, system, intf, ip=None): """ Join a system to the network. If ip is passed in, try to claim that specific address, otherwise just grab the first @@ -120,7 +120,19 @@ class Network(item.Item): raise CX(_("Network %s has no free addresses" % self.cidr)) ip = self.free_addresses[0][0] - self._allocate_address(name, intf, ip) + self._allocate_address(system, intf, ip) + + def unsubscribe_system(self, system, intf): + """ + Remove a system from the network. Allocate it's address back + into the free pool. + """ + addr = self.get_assigned_address(system, intf) + if not addr: + raise CX(_("Attempting to unsubscribe %s:%s from %s, but not subscribed" % (system, intf, self.name))) + + self._remove_from_used(addr) + self._add_to_free(addr) def _addr_available(self, addr): """ @@ -131,6 +143,16 @@ class Network(item.Item): return True return False + def _add_to_free(self, addr, compact=True): + """ + Add addr to the list of free addresses. If compact is True, + then take the list of CIDRs in free_addresses and compact it. + """ + addr = _IP(addr).cidr() + self.free_addresses.append(addr) + if compact: + self.free_addreses = self._compact(self.free_addresses) + def _remove_from_free(self, addr): """ Take addr off of the list of free addresses diff --git a/cobbler/item_system.py b/cobbler/item_system.py index 4fa8a709..8ab80396 100644 --- a/cobbler/item_system.py +++ b/cobbler/item_system.py @@ -433,15 +433,24 @@ class System(item.Item): def set_network(self,network,interface): """ - Add an interface to a network object + Add an interface to a network object. If network is empty, + clear the network. """ intf = self.__get_interface(interface) - net = self.config.networks().find(name=network) - if net == None: - raise CX(_("Network %s does not exist" % network)) - net.subscribe_system(self.name, interface, intf['ip_address']) - intf['network'] = network - self.config.serialize() # explicitly save the modified net + + if network != '': # Join + net = self.config.networks().find(name=network) + if net == None: + raise CX(_("Network %s does not exist" % network)) + net.subscribe_system(self.name, interface, intf['ip_address']) + intf['network'] = network + else: # leave + net = self.config.networks().find(name=intf['network']) + net.unsubscribe_system(self.name, interface) + + # FIXME figure out why the network collection doesn't + # serialize itself out to disk without this + self.config.serialize() def set_ip_address(self,address,interface): """ |