Allow network-less instances
[ganeti-local] / scripts / gnt-instance
index a28a997..5af186c 100755 (executable)
@@ -302,15 +302,21 @@ def AddInstance(opts, args):
     for nidx, ndict in opts.nics.items():
       nidx = int(nidx)
       nics[nidx] = ndict
+  elif opts.no_nics:
+    # no nics
+    nics = []
   else:
     # default of one nic, all auto
     nics = [{}]
 
-  if not opts.disks and opts.disk_template != constants.DT_DISKLESS:
-    raise errors.OpPrereqError("No disk information specified")
-  elif opts.disks and opts.disk_template == constants.DT_DISKLESS:
-    raise errors.OpPrereqError("Diskless instance but disk information passeD")
+  if opts.disk_template == constants.DT_DISKLESS:
+    if opts.disks:
+      raise errors.OpPrereqError("Diskless instance but disk"
+                                 " information passed")
+    disks = []
   else:
+    if not opts.disks:
+      raise errors.OpPrereqError("No disk information specified")
     try:
       disk_max = max(int(didx[0])+1 for didx in opts.disks)
     except ValueError, err:
@@ -913,6 +919,7 @@ def _FormatBlockDevInfo(buf, dev, indent_level, static):
     data = "  - %s, " % dev["iv_name"]
   else:
     data = "  - "
+  data += "access mode: %s, " % dev["mode"]
   data += "type: %s" % dev["dev_type"]
   if dev["logical_id"] is not None:
     data += ", logical_id: %s" % (dev["logical_id"],)
@@ -1034,7 +1041,7 @@ def SetInstanceParams(opts, args):
   @return: the desired exit code
 
   """
-  if not (opts.ip or opts.bridge or opts.mac or
+  if not (opts.nics or opts.disks or
           opts.hypervisor or opts.beparams):
     ToStderr("Please give at least one of the parameters.")
     return 1
@@ -1043,9 +1050,27 @@ def SetInstanceParams(opts, args):
     opts.beparams[constants.BE_MEMORY] = utils.ParseUnit(
       opts.beparams[constants.BE_MEMORY])
 
+  for idx, (nic_op, nic_dict) in enumerate(opts.nics):
+    try:
+      nic_op = int(nic_op)
+      opts.nics[idx] = (nic_op, nic_dict)
+    except ValueError:
+      pass
+
+  for idx, (disk_op, disk_dict) in enumerate(opts.disks):
+    try:
+      disk_op = int(disk_op)
+      opts.disks[idx] = (disk_op, disk_dict)
+    except ValueError:
+      pass
+    if disk_op == constants.DDM_ADD:
+      if 'size' not in disk_dict:
+        raise errors.OpPrereqError("Missing required parameter 'size'")
+      disk_dict['size'] = utils.ParseUnit(disk_dict['size'])
+
   op = opcodes.OpSetInstanceParams(instance_name=args[0],
-                                   ip=opts.ip,
-                                   bridge=opts.bridge, mac=opts.mac,
+                                   nics=opts.nics,
+                                   disks=opts.disks,
                                    hvparams=opts.hypervisor,
                                    beparams=opts.beparams,
                                    force=opts.force)
@@ -1123,6 +1148,8 @@ add_opts = [
              default=[], dest="nics",
              action="append",
              type="identkeyval"),
+  make_option("--no-nics", default=False, action="store_true",
+              help="Do not create any network cards for the instance"),
   make_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
               action="store_false", help="Don't wait for sync (DANGEROUS!)"),
   make_option("--no-start", dest="start", default=True,
@@ -1247,21 +1274,20 @@ commands = {
                     "Replaces all disks for the instance"),
   'modify': (SetInstanceParams, ARGS_ONE,
              [DEBUG_OPT, FORCE_OPT,
-              make_option("-i", "--ip", dest="ip",
-                          help="IP address ('none' or numeric IP)",
-                          default=None, type="string", metavar="<ADDRESS>"),
-              make_option("-b", "--bridge", dest="bridge",
-                          help="Bridge to connect this instance to",
-                          default=None, type="string", metavar="<bridge>"),
-              make_option("--mac", dest="mac",
-                          help="MAC address", default=None,
-                          type="string", metavar="<MACADDRESS>"),
               keyval_option("-H", "--hypervisor", type="keyval",
                             default={}, dest="hypervisor",
                             help="Change hypervisor parameters"),
               keyval_option("-B", "--backend", type="keyval",
                             default={}, dest="beparams",
                             help="Change backend parameters"),
+              ikv_option("--disk", help="Disk changes",
+                         default=[], dest="disks",
+                         action="append",
+                         type="identkeyval"),
+              ikv_option("--net", help="NIC changes",
+                         default=[], dest="nics",
+                         action="append",
+                         type="identkeyval"),
               SUBMIT_OPT,
               ],
              "<instance>", "Alters the parameters of an instance"),