Revision 031d2db1 lib/network.py

b/lib/network.py
153 153
  def Validate(self):
154 154
    assert len(self.reservations) == self._GetSize()
155 155
    assert len(self.ext_reservations) == self._GetSize()
156
    all_res = self.reservations & self.ext_reservations
157
    assert not all_res.any()
158 156

  
159 157
    if self.gateway is not None:
160 158
      assert self.gateway in self.network
......
188 186
    """
189 187
    return self.all_reservations.to01().replace("1", "X").replace("0", ".")
190 188

  
191
  def IsReserved(self, address):
189
  def IsReserved(self, address, external=False):
192 190
    """Checks if the given IP is reserved.
193 191

  
194 192
    """
195 193
    idx = self._GetAddrIndex(address)
196
    return self.all_reservations[idx]
194
    if external:
195
      return self.ext_reservations[idx]
196
    else:
197
      return self.reservations[idx]
197 198

  
198 199
  def Reserve(self, address, external=False):
199 200
    """Mark an address as used.
200 201

  
201 202
    """
202
    if self.IsReserved(address):
203
      raise errors.AddressPoolError("%s is already reserved" % address)
203
    if self.IsReserved(address, external):
204
      if external:
205
        msg = "IP %s is already externally reserved" % address
206
      else:
207
        msg = "IP %s is already used by an instance" % address
208
      raise errors.AddressPoolError(msg)
209

  
204 210
    self._Mark(address, external=external)
205 211

  
206 212
  def Release(self, address, external=False):
207 213
    """Release a given address reservation.
208 214

  
209 215
    """
216
    if not self.IsReserved(address, external):
217
      if external:
218
        msg = "IP %s is not externally reserved" % address
219
      else:
220
        msg = "IP %s is not used by an instance" % address
221
      raise errors.AddressPoolError(msg)
222

  
210 223
    self._Mark(address, value=False, external=external)
211 224

  
212 225
  def GetFreeAddress(self):

Also available in: Unified diff