Revision c01a7953 lib/cmdlib/network.py

b/lib/cmdlib/network.py
128 128
    for tag in self.op.tags:
129 129
      objects.TaggableObject.ValidateTag(tag)
130 130

  
131
    self.nobj = objects.Network(name=self.op.network_name,
132
                                network=self.op.network,
133
                                gateway=self.op.gateway,
134
                                network6=self.op.network6,
135
                                gateway6=self.op.gateway6,
136
                                mac_prefix=self.op.mac_prefix,
137
                                uuid=self.network_uuid)
138

  
139
    # Initialize the associated address pool
140
    try:
141
      self.pool = network.AddressPool.InitializeNetwork(self.nobj)
142
    except errors.AddressPoolError, err:
143
      raise errors.OpPrereqError("Cannot create IP address pool for network"
144
                               " '%s': %s" % (self.op.network_name, err))
145

  
131 146
  def BuildHooksEnv(self):
132 147
    """Build hooks env.
133 148

  
......
147 162
    """Add the ip pool to the cluster.
148 163

  
149 164
    """
150
    nobj = objects.Network(name=self.op.network_name,
151
                           network=self.op.network,
152
                           gateway=self.op.gateway,
153
                           network6=self.op.network6,
154
                           gateway6=self.op.gateway6,
155
                           mac_prefix=self.op.mac_prefix,
156
                           uuid=self.network_uuid)
157
    # Initialize the associated address pool
158
    try:
159
      pool = network.AddressPool.InitializeNetwork(nobj)
160
    except errors.AddressPoolError, err:
161
      raise errors.OpExecError("Cannot create IP address pool for network"
162
                               " '%s': %s" % (self.op.network_name, err))
163

  
164 165
    # Check if we need to reserve the nodes and the cluster master IP
165 166
    # These may not be allocated to any instances in routed mode, as
166 167
    # they wouldn't function anyway.
......
168 169
      for node in self.cfg.GetAllNodesInfo().values():
169 170
        for ip in [node.primary_ip, node.secondary_ip]:
170 171
          try:
171
            if pool.Contains(ip):
172
              pool.Reserve(ip)
172
            if self.pool.Contains(ip):
173
              self.pool.Reserve(ip, True)
173 174
              self.LogInfo("Reserved IP address of node '%s' (%s)",
174 175
                           node.name, ip)
175 176
          except errors.AddressPoolError, err:
......
178 179

  
179 180
      master_ip = self.cfg.GetClusterInfo().master_ip
180 181
      try:
181
        if pool.Contains(master_ip):
182
          pool.Reserve(master_ip)
182
        if self.pool.Contains(master_ip):
183
          self.pool.Reserve(master_ip, True)
183 184
          self.LogInfo("Reserved cluster master IP address (%s)", master_ip)
184 185
      except errors.AddressPoolError, err:
185 186
        self.LogWarning("Cannot reserve cluster master IP address (%s): %s",
......
188 189
    if self.op.add_reserved_ips:
189 190
      for ip in self.op.add_reserved_ips:
190 191
        try:
191
          pool.Reserve(ip, external=True)
192
          self.pool.Reserve(ip, external=True)
192 193
        except errors.AddressPoolError, err:
193 194
          raise errors.OpExecError("Cannot reserve IP address '%s': %s" %
194 195
                                   (ip, err))
195 196

  
196 197
    if self.op.tags:
197 198
      for tag in self.op.tags:
198
        nobj.AddTag(tag)
199
        self.nobj.AddTag(tag)
199 200

  
200
    self.cfg.AddNetwork(nobj, self.proc.GetECId(), check_uuid=False)
201
    self.cfg.AddNetwork(self.nobj, self.proc.GetECId(), check_uuid=False)
201 202
    del self.remove_locks[locking.LEVEL_NETWORK]
202 203

  
203 204

  
......
300 301
        self.gateway = None
301 302
      else:
302 303
        self.gateway = self.op.gateway
303
        if self.pool.IsReserved(self.gateway):
304
          raise errors.OpPrereqError("Gateway IP address '%s' is already"
305
                                     " reserved" % self.gateway,
306
                                     errors.ECODE_STATE)
307 304

  
308 305
    if self.op.mac_prefix:
309 306
      if self.op.mac_prefix == constants.VALUE_NONE:
......
352 349
    """
353 350
    #TODO: reserve/release via temporary reservation manager
354 351
    #      extend cfg.ReserveIp/ReleaseIp with the external flag
352
    ec_id = self.proc.GetECId()
355 353
    if self.op.gateway:
356 354
      if self.gateway == self.network.gateway:
357 355
        self.LogWarning("Gateway is already %s", self.gateway)
358 356
      else:
359 357
        if self.gateway:
360
          self.pool.Reserve(self.gateway, external=True)
358
          self.cfg.ReserveIp(self.network_uuid, self.gateway, True, ec_id)
361 359
        if self.network.gateway:
362
          self.pool.Release(self.network.gateway, external=True)
360
          self.cfg.ReleaseIp(self.network_uuid, self.network.gateway, True, ec_id)
363 361
        self.network.gateway = self.gateway
364 362

  
365 363
    if self.op.add_reserved_ips:
366 364
      for ip in self.op.add_reserved_ips:
367
        try:
368
          if self.pool.IsReserved(ip):
369
            self.LogWarning("IP address %s is already reserved", ip)
370
          else:
371
            self.pool.Reserve(ip, external=True)
372
        except errors.AddressPoolError, err:
373
          self.LogWarning("Cannot reserve IP address %s: %s", ip, err)
365
        self.cfg.ReserveIp(self.network_uuid, ip, True, ec_id)
374 366

  
375 367
    if self.op.remove_reserved_ips:
376 368
      for ip in self.op.remove_reserved_ips:
377 369
        if ip == self.network.gateway:
378 370
          self.LogWarning("Cannot unreserve Gateway's IP")
379 371
          continue
380
        try:
381
          if not self.pool.IsReserved(ip):
382
            self.LogWarning("IP address %s is already unreserved", ip)
383
          else:
384
            self.pool.Release(ip, external=True)
385
        except errors.AddressPoolError, err:
386
          self.LogWarning("Cannot release IP address %s: %s", ip, err)
372
        self.cfg.ReleaseIp(self.network_uuid, ip, True, ec_id)
387 373

  
388 374
    if self.op.mac_prefix:
389 375
      self.network.mac_prefix = self.mac_prefix

Also available in: Unified diff