summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Eckersberg <jeckersb@redhat.com>2009-03-04 19:37:47 -0500
committerJohn Eckersberg <jeckersb@redhat.com>2009-03-13 13:52:35 -0400
commite4923bec0d0ecf7f3f50b80491d4b990cf8cfe53 (patch)
tree8d04e81969668062d3575639b64b38743e182a5f
parenta3105537c7c247889dbbd0ed940a493058f48bb7 (diff)
downloadcobbler-e4923bec0d0ecf7f3f50b80491d4b990cf8cfe53.tar.gz
cobbler-e4923bec0d0ecf7f3f50b80491d4b990cf8cfe53.tar.xz
cobbler-e4923bec0d0ecf7f3f50b80491d4b990cf8cfe53.zip
Leaving a network now works
-rw-r--r--cobbler/item_network.py26
-rw-r--r--cobbler/item_system.py23
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):
"""