Statistics
| Branch: | Tag: | Revision:

root / lib / client / gnt_network.py @ f58ecd88

History | View | Annotate | Download (10.4 kB)

1 f58ecd88 Dimitris Aragiorgis
#
2 f58ecd88 Dimitris Aragiorgis
#
3 f58ecd88 Dimitris Aragiorgis
4 f58ecd88 Dimitris Aragiorgis
# Copyright (C) 2011 Google Inc.
5 f58ecd88 Dimitris Aragiorgis
#
6 f58ecd88 Dimitris Aragiorgis
# This program is free software; you can redistribute it and/or modify
7 f58ecd88 Dimitris Aragiorgis
# it under the terms of the GNU General Public License as published by
8 f58ecd88 Dimitris Aragiorgis
# the Free Software Foundation; either version 2 of the License, or
9 f58ecd88 Dimitris Aragiorgis
# (at your option) any later version.
10 f58ecd88 Dimitris Aragiorgis
#
11 f58ecd88 Dimitris Aragiorgis
# This program is distributed in the hope that it will be useful, but
12 f58ecd88 Dimitris Aragiorgis
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 f58ecd88 Dimitris Aragiorgis
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 f58ecd88 Dimitris Aragiorgis
# General Public License for more details.
15 f58ecd88 Dimitris Aragiorgis
#
16 f58ecd88 Dimitris Aragiorgis
# You should have received a copy of the GNU General Public License
17 f58ecd88 Dimitris Aragiorgis
# along with this program; if not, write to the Free Software
18 f58ecd88 Dimitris Aragiorgis
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 f58ecd88 Dimitris Aragiorgis
# 02110-1301, USA.
20 f58ecd88 Dimitris Aragiorgis
21 f58ecd88 Dimitris Aragiorgis
"""IP pool related commands"""
22 f58ecd88 Dimitris Aragiorgis
23 f58ecd88 Dimitris Aragiorgis
# pylint: disable-msg=W0401,W0614
24 f58ecd88 Dimitris Aragiorgis
# W0401: Wildcard import ganeti.cli
25 f58ecd88 Dimitris Aragiorgis
# W0614: Unused import %s from wildcard import (since we need cli)
26 f58ecd88 Dimitris Aragiorgis
27 f58ecd88 Dimitris Aragiorgis
from ganeti.cli import *
28 f58ecd88 Dimitris Aragiorgis
from ganeti import constants
29 f58ecd88 Dimitris Aragiorgis
from ganeti import opcodes
30 f58ecd88 Dimitris Aragiorgis
from ganeti import utils
31 f58ecd88 Dimitris Aragiorgis
from textwrap import wrap
32 f58ecd88 Dimitris Aragiorgis
33 f58ecd88 Dimitris Aragiorgis
34 f58ecd88 Dimitris Aragiorgis
#: default list of fields for L{ListNetworks}
35 f58ecd88 Dimitris Aragiorgis
_LIST_DEF_FIELDS = ["name", "network", "gateway", "group_cnt", "group_list"]
36 f58ecd88 Dimitris Aragiorgis
37 f58ecd88 Dimitris Aragiorgis
38 f58ecd88 Dimitris Aragiorgis
def _HandleReservedIPs(ips):
39 f58ecd88 Dimitris Aragiorgis
  if ips is not None:
40 f58ecd88 Dimitris Aragiorgis
    if ips == "":
41 f58ecd88 Dimitris Aragiorgis
      return []
42 f58ecd88 Dimitris Aragiorgis
    else:
43 f58ecd88 Dimitris Aragiorgis
      return utils.UnescapeAndSplit(ips, sep=",")
44 f58ecd88 Dimitris Aragiorgis
  return None
45 f58ecd88 Dimitris Aragiorgis
46 f58ecd88 Dimitris Aragiorgis
def AddNetwork(opts, args):
47 f58ecd88 Dimitris Aragiorgis
  """Add a network to the cluster.
48 f58ecd88 Dimitris Aragiorgis

49 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
50 f58ecd88 Dimitris Aragiorgis
  @type args: list
51 f58ecd88 Dimitris Aragiorgis
  @param args: a list of length 1 with the network name to create
52 f58ecd88 Dimitris Aragiorgis
  @rtype: int
53 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
54 f58ecd88 Dimitris Aragiorgis

55 f58ecd88 Dimitris Aragiorgis
  """
56 f58ecd88 Dimitris Aragiorgis
  (network_name, ) = args
57 f58ecd88 Dimitris Aragiorgis
58 f58ecd88 Dimitris Aragiorgis
  op = opcodes.OpNetworkAdd(network_name=network_name,
59 f58ecd88 Dimitris Aragiorgis
                            gateway=opts.gateway,
60 f58ecd88 Dimitris Aragiorgis
                            network=opts.network,
61 f58ecd88 Dimitris Aragiorgis
                            gateway6=opts.gateway6,
62 f58ecd88 Dimitris Aragiorgis
                            network6=opts.network6,
63 f58ecd88 Dimitris Aragiorgis
                            mac_prefix=opts.mac_prefix,
64 f58ecd88 Dimitris Aragiorgis
                            network_type=opts.network_type,
65 f58ecd88 Dimitris Aragiorgis
                            add_reserved_ips=_HandleReservedIPs(opts.add_reserved_ips))
66 f58ecd88 Dimitris Aragiorgis
  SubmitOpCode(op, opts=opts)
67 f58ecd88 Dimitris Aragiorgis
68 f58ecd88 Dimitris Aragiorgis
69 f58ecd88 Dimitris Aragiorgis
def MapNetwork(opts, args):
70 f58ecd88 Dimitris Aragiorgis
  """Map a network to a node group.
71 f58ecd88 Dimitris Aragiorgis

72 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
73 f58ecd88 Dimitris Aragiorgis
  @type args: list
74 f58ecd88 Dimitris Aragiorgis
  @param args: a list of length 3 with network, nodegroup, mode, physlink
75 f58ecd88 Dimitris Aragiorgis
  @rtype: int
76 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
77 f58ecd88 Dimitris Aragiorgis

78 f58ecd88 Dimitris Aragiorgis
  """
79 f58ecd88 Dimitris Aragiorgis
  network = args[0]
80 f58ecd88 Dimitris Aragiorgis
  groups = args[1]
81 f58ecd88 Dimitris Aragiorgis
  mode = args[2]
82 f58ecd88 Dimitris Aragiorgis
  link = args[3]
83 f58ecd88 Dimitris Aragiorgis
84 f58ecd88 Dimitris Aragiorgis
  #TODO: allow comma separated group names
85 f58ecd88 Dimitris Aragiorgis
  if groups == 'all':
86 f58ecd88 Dimitris Aragiorgis
    cl = GetClient()
87 f58ecd88 Dimitris Aragiorgis
    (groups, ) = cl.QueryGroups([], ['name'], False)
88 f58ecd88 Dimitris Aragiorgis
  else:
89 f58ecd88 Dimitris Aragiorgis
    groups = [groups]
90 f58ecd88 Dimitris Aragiorgis
91 f58ecd88 Dimitris Aragiorgis
  for group in groups:
92 f58ecd88 Dimitris Aragiorgis
    op = opcodes.OpNetworkConnect(group_name=group,
93 f58ecd88 Dimitris Aragiorgis
                                  network_name=network,
94 f58ecd88 Dimitris Aragiorgis
                                  network_mode=mode,
95 f58ecd88 Dimitris Aragiorgis
                                  network_link=link,
96 f58ecd88 Dimitris Aragiorgis
                                  conflicts_check=opts.conflicts_check)
97 f58ecd88 Dimitris Aragiorgis
    SubmitOpCode(op, opts=opts)
98 f58ecd88 Dimitris Aragiorgis
99 f58ecd88 Dimitris Aragiorgis
100 f58ecd88 Dimitris Aragiorgis
def UnmapNetwork(opts, args):
101 f58ecd88 Dimitris Aragiorgis
  """Unmap a network from a node group.
102 f58ecd88 Dimitris Aragiorgis

103 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
104 f58ecd88 Dimitris Aragiorgis
  @type args: list
105 f58ecd88 Dimitris Aragiorgis
  @param args: a list of length 3 with network, nodegorup
106 f58ecd88 Dimitris Aragiorgis
  @rtype: int
107 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
108 f58ecd88 Dimitris Aragiorgis

109 f58ecd88 Dimitris Aragiorgis
  """
110 f58ecd88 Dimitris Aragiorgis
  network = args[0]
111 f58ecd88 Dimitris Aragiorgis
  groups = args[1]
112 f58ecd88 Dimitris Aragiorgis
113 f58ecd88 Dimitris Aragiorgis
  #TODO: allow comma separated group names
114 f58ecd88 Dimitris Aragiorgis
  if groups == 'all':
115 f58ecd88 Dimitris Aragiorgis
    cl = GetClient()
116 f58ecd88 Dimitris Aragiorgis
    (groups, ) = cl.QueryGroups([], ['name'], False)
117 f58ecd88 Dimitris Aragiorgis
  else:
118 f58ecd88 Dimitris Aragiorgis
    groups = [groups]
119 f58ecd88 Dimitris Aragiorgis
120 f58ecd88 Dimitris Aragiorgis
  for group in groups:
121 f58ecd88 Dimitris Aragiorgis
    op = opcodes.OpNetworkDisconnect(group_name=group,
122 f58ecd88 Dimitris Aragiorgis
                                     network_name=network,
123 f58ecd88 Dimitris Aragiorgis
                                     conflicts_check=opts.conflicts_check)
124 f58ecd88 Dimitris Aragiorgis
    SubmitOpCode(op, opts=opts)
125 f58ecd88 Dimitris Aragiorgis
126 f58ecd88 Dimitris Aragiorgis
127 f58ecd88 Dimitris Aragiorgis
def ListNetworks(opts, args):
128 f58ecd88 Dimitris Aragiorgis
  """List Ip pools and their properties.
129 f58ecd88 Dimitris Aragiorgis

130 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
131 f58ecd88 Dimitris Aragiorgis
  @type args: list
132 f58ecd88 Dimitris Aragiorgis
  @param args: networks to list, or empty for all
133 f58ecd88 Dimitris Aragiorgis
  @rtype: int
134 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
135 f58ecd88 Dimitris Aragiorgis

136 f58ecd88 Dimitris Aragiorgis
  """
137 f58ecd88 Dimitris Aragiorgis
  desired_fields = ParseFields(opts.output, _LIST_DEF_FIELDS)
138 f58ecd88 Dimitris Aragiorgis
  fmtoverride = {
139 f58ecd88 Dimitris Aragiorgis
    "group_list": (",".join, False),
140 f58ecd88 Dimitris Aragiorgis
    "inst_list": (",".join, False),
141 f58ecd88 Dimitris Aragiorgis
  }
142 f58ecd88 Dimitris Aragiorgis
143 f58ecd88 Dimitris Aragiorgis
  return GenericList(constants.QR_NETWORK, desired_fields, args, None,
144 f58ecd88 Dimitris Aragiorgis
                     opts.separator, not opts.no_headers,
145 f58ecd88 Dimitris Aragiorgis
                     verbose=opts.verbose, format_override=fmtoverride)
146 f58ecd88 Dimitris Aragiorgis
147 f58ecd88 Dimitris Aragiorgis
148 f58ecd88 Dimitris Aragiorgis
def ListNetworkFields(opts, args):
149 f58ecd88 Dimitris Aragiorgis
  """List network fields.
150 f58ecd88 Dimitris Aragiorgis

151 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
152 f58ecd88 Dimitris Aragiorgis
  @type args: list
153 f58ecd88 Dimitris Aragiorgis
  @param args: fields to list, or empty for all
154 f58ecd88 Dimitris Aragiorgis
  @rtype: int
155 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
156 f58ecd88 Dimitris Aragiorgis

157 f58ecd88 Dimitris Aragiorgis
  """
158 f58ecd88 Dimitris Aragiorgis
  return GenericListFields(constants.QR_NETWORK, args, opts.separator,
159 f58ecd88 Dimitris Aragiorgis
                           not opts.no_headers)
160 f58ecd88 Dimitris Aragiorgis
161 f58ecd88 Dimitris Aragiorgis
162 f58ecd88 Dimitris Aragiorgis
def ShowNetworkConfig(opts, args):
163 f58ecd88 Dimitris Aragiorgis
  """Show network information.
164 f58ecd88 Dimitris Aragiorgis

165 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
166 f58ecd88 Dimitris Aragiorgis
  @type args: list
167 f58ecd88 Dimitris Aragiorgis
  @param args: should either be an empty list, in which case
168 f58ecd88 Dimitris Aragiorgis
      we show information about all nodes, or should contain
169 f58ecd88 Dimitris Aragiorgis
      a list of networks (names or UUIDs) to be queried for information
170 f58ecd88 Dimitris Aragiorgis
  @rtype: int
171 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
172 f58ecd88 Dimitris Aragiorgis

173 f58ecd88 Dimitris Aragiorgis
  """
174 f58ecd88 Dimitris Aragiorgis
  cl = GetClient()
175 f58ecd88 Dimitris Aragiorgis
  result = cl.QueryNetworks(fields=["name", "network", "gateway",
176 f58ecd88 Dimitris Aragiorgis
                                    "network6", "gateway6",
177 f58ecd88 Dimitris Aragiorgis
                                    "mac_prefix", "network_type",
178 f58ecd88 Dimitris Aragiorgis
                                    "free_count", "reserved_count",
179 f58ecd88 Dimitris Aragiorgis
                                    "map", "group_list", "inst_list",
180 f58ecd88 Dimitris Aragiorgis
                                    "external_reservations"],
181 f58ecd88 Dimitris Aragiorgis
                            names=args, use_locking=False)
182 f58ecd88 Dimitris Aragiorgis
183 f58ecd88 Dimitris Aragiorgis
  for (name, network, gateway, network6, gateway6,
184 f58ecd88 Dimitris Aragiorgis
       mac_prefix, network_type, free_count, reserved_count,
185 f58ecd88 Dimitris Aragiorgis
       map, group_list, instances, ext_res) in result:
186 f58ecd88 Dimitris Aragiorgis
    size = free_count + reserved_count
187 f58ecd88 Dimitris Aragiorgis
    ToStdout("Network name: %s", name)
188 f58ecd88 Dimitris Aragiorgis
    ToStdout("  subnet: %s", network)
189 f58ecd88 Dimitris Aragiorgis
    ToStdout("  gateway: %s", gateway)
190 f58ecd88 Dimitris Aragiorgis
    ToStdout("  subnet6: %s", network6)
191 f58ecd88 Dimitris Aragiorgis
    ToStdout("  gateway6: %s", gateway6)
192 f58ecd88 Dimitris Aragiorgis
    ToStdout("  mac prefix: %s", mac_prefix)
193 f58ecd88 Dimitris Aragiorgis
    ToStdout("  type: %s", network_type)
194 f58ecd88 Dimitris Aragiorgis
    ToStdout("  size: %d", size)
195 f58ecd88 Dimitris Aragiorgis
    ToStdout("  free: %d (%.2f%%)", free_count,
196 f58ecd88 Dimitris Aragiorgis
             100 * float(free_count)/float(size))
197 f58ecd88 Dimitris Aragiorgis
    ToStdout("  usage map:")
198 f58ecd88 Dimitris Aragiorgis
    idx = 0
199 f58ecd88 Dimitris Aragiorgis
    for line in wrap(map, width=64):
200 f58ecd88 Dimitris Aragiorgis
      ToStdout("     %s %s %d", str(idx).rjust(3), line.ljust(64), idx + 63)
201 f58ecd88 Dimitris Aragiorgis
      idx += 64
202 f58ecd88 Dimitris Aragiorgis
    ToStdout("         (X) used    (.) free")
203 f58ecd88 Dimitris Aragiorgis
204 f58ecd88 Dimitris Aragiorgis
    if ext_res:
205 f58ecd88 Dimitris Aragiorgis
      ToStdout("  externally reserved IPs:")
206 f58ecd88 Dimitris Aragiorgis
      for line in wrap(ext_res, width=64):
207 f58ecd88 Dimitris Aragiorgis
        ToStdout("    %s" % line)
208 f58ecd88 Dimitris Aragiorgis
209 f58ecd88 Dimitris Aragiorgis
    if group_list:
210 f58ecd88 Dimitris Aragiorgis
      ToStdout("  connected to node groups:")
211 f58ecd88 Dimitris Aragiorgis
      for group in group_list:
212 f58ecd88 Dimitris Aragiorgis
        ToStdout("    %s", group)
213 f58ecd88 Dimitris Aragiorgis
    else:
214 f58ecd88 Dimitris Aragiorgis
      ToStdout("  not connected to any node group")
215 f58ecd88 Dimitris Aragiorgis
216 f58ecd88 Dimitris Aragiorgis
    if instances:
217 f58ecd88 Dimitris Aragiorgis
      ToStdout("  used by %d instances:", len(instances))
218 f58ecd88 Dimitris Aragiorgis
      for inst in instances:
219 f58ecd88 Dimitris Aragiorgis
        ((ips, networks), ) = cl.QueryInstances([inst],
220 f58ecd88 Dimitris Aragiorgis
                                                ["nic.ips", "nic.networks"],
221 f58ecd88 Dimitris Aragiorgis
                                                use_locking=False)
222 f58ecd88 Dimitris Aragiorgis
223 f58ecd88 Dimitris Aragiorgis
        l = lambda value: ", ".join(`idx`+":"+str(ip)
224 f58ecd88 Dimitris Aragiorgis
                                    for idx, (ip, net) in enumerate(value)
225 f58ecd88 Dimitris Aragiorgis
                                      if net == name)
226 f58ecd88 Dimitris Aragiorgis
227 f58ecd88 Dimitris Aragiorgis
        ToStdout("    %s : %s", inst, l(zip(ips,networks)))
228 f58ecd88 Dimitris Aragiorgis
    else:
229 f58ecd88 Dimitris Aragiorgis
      ToStdout("  not used by any instances")
230 f58ecd88 Dimitris Aragiorgis
231 f58ecd88 Dimitris Aragiorgis
232 f58ecd88 Dimitris Aragiorgis
def SetNetworkParams(opts, args):
233 f58ecd88 Dimitris Aragiorgis
  """Modifies an IP address pool's parameters.
234 f58ecd88 Dimitris Aragiorgis

235 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
236 f58ecd88 Dimitris Aragiorgis
  @type args: list
237 f58ecd88 Dimitris Aragiorgis
  @param args: should contain only one element, the node group name
238 f58ecd88 Dimitris Aragiorgis

239 f58ecd88 Dimitris Aragiorgis
  @rtype: int
240 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
241 f58ecd88 Dimitris Aragiorgis

242 f58ecd88 Dimitris Aragiorgis
  """
243 f58ecd88 Dimitris Aragiorgis
244 f58ecd88 Dimitris Aragiorgis
  # TODO: add "network": opts.network,
245 f58ecd88 Dimitris Aragiorgis
  all_changes = {
246 f58ecd88 Dimitris Aragiorgis
    "gateway": opts.gateway,
247 f58ecd88 Dimitris Aragiorgis
    "add_reserved_ips": _HandleReservedIPs(opts.add_reserved_ips),
248 f58ecd88 Dimitris Aragiorgis
    "remove_reserved_ips": _HandleReservedIPs(opts.remove_reserved_ips),
249 f58ecd88 Dimitris Aragiorgis
    "mac_prefix": opts.mac_prefix,
250 f58ecd88 Dimitris Aragiorgis
    "network_type": opts.network_type,
251 f58ecd88 Dimitris Aragiorgis
    "gateway6": opts.gateway6,
252 f58ecd88 Dimitris Aragiorgis
    "network6": opts.network6,
253 f58ecd88 Dimitris Aragiorgis
  }
254 f58ecd88 Dimitris Aragiorgis
255 f58ecd88 Dimitris Aragiorgis
  if all_changes.values().count(None) == len(all_changes):
256 f58ecd88 Dimitris Aragiorgis
    ToStderr("Please give at least one of the parameters.")
257 f58ecd88 Dimitris Aragiorgis
    return 1
258 f58ecd88 Dimitris Aragiorgis
259 f58ecd88 Dimitris Aragiorgis
  op = opcodes.OpNetworkSetParams(network_name=args[0],
260 f58ecd88 Dimitris Aragiorgis
                                  # pylint: disable-msg=W0142
261 f58ecd88 Dimitris Aragiorgis
                                  **all_changes)
262 f58ecd88 Dimitris Aragiorgis
263 f58ecd88 Dimitris Aragiorgis
  # TODO: add feedback to user, e.g. list the modifications
264 f58ecd88 Dimitris Aragiorgis
  SubmitOrSend(op, opts)
265 f58ecd88 Dimitris Aragiorgis
266 f58ecd88 Dimitris Aragiorgis
267 f58ecd88 Dimitris Aragiorgis
def RemoveNetwork(opts, args):
268 f58ecd88 Dimitris Aragiorgis
  """Remove an IP address pool from the cluster.
269 f58ecd88 Dimitris Aragiorgis

270 f58ecd88 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
271 f58ecd88 Dimitris Aragiorgis
  @type args: list
272 f58ecd88 Dimitris Aragiorgis
  @param args: a list of length 1 with the id of the IP address pool to remove
273 f58ecd88 Dimitris Aragiorgis
  @rtype: int
274 f58ecd88 Dimitris Aragiorgis
  @return: the desired exit code
275 f58ecd88 Dimitris Aragiorgis

276 f58ecd88 Dimitris Aragiorgis
  """
277 f58ecd88 Dimitris Aragiorgis
  (network_name,) = args
278 f58ecd88 Dimitris Aragiorgis
  op = opcodes.OpNetworkRemove(network_name=network_name, force=opts.force)
279 f58ecd88 Dimitris Aragiorgis
  SubmitOpCode(op, opts=opts)
280 f58ecd88 Dimitris Aragiorgis
281 f58ecd88 Dimitris Aragiorgis
282 f58ecd88 Dimitris Aragiorgis
commands = {
283 f58ecd88 Dimitris Aragiorgis
  "add": (
284 f58ecd88 Dimitris Aragiorgis
    AddNetwork, ARGS_ONE_NETWORK,
285 f58ecd88 Dimitris Aragiorgis
    [DRY_RUN_OPT, NETWORK_OPT, GATEWAY_OPT, ADD_RESERVED_IPS_OPT,
286 f58ecd88 Dimitris Aragiorgis
     MAC_PREFIX_OPT, NETWORK_TYPE_OPT, NETWORK6_OPT, GATEWAY6_OPT],
287 f58ecd88 Dimitris Aragiorgis
    "<network_name>", "Add a new IP network to the cluster"),
288 f58ecd88 Dimitris Aragiorgis
  "list": (
289 f58ecd88 Dimitris Aragiorgis
    ListNetworks, ARGS_MANY_NETWORKS,
290 f58ecd88 Dimitris Aragiorgis
    [NOHDR_OPT, SEP_OPT, FIELDS_OPT, VERBOSE_OPT],
291 f58ecd88 Dimitris Aragiorgis
    "[<network_id>...]",
292 f58ecd88 Dimitris Aragiorgis
    "Lists the IP networks in the cluster. The available fields can be shown"
293 f58ecd88 Dimitris Aragiorgis
    " using the \"list-fields\" command (see the man page for details)."
294 f58ecd88 Dimitris Aragiorgis
    " The default list is (in order): %s." % utils.CommaJoin(_LIST_DEF_FIELDS)),
295 f58ecd88 Dimitris Aragiorgis
  "list-fields": (
296 f58ecd88 Dimitris Aragiorgis
    ListNetworkFields, [ArgUnknown()], [NOHDR_OPT, SEP_OPT], "[fields...]",
297 f58ecd88 Dimitris Aragiorgis
    "Lists all available fields for networks"),
298 f58ecd88 Dimitris Aragiorgis
  "info": (
299 f58ecd88 Dimitris Aragiorgis
    ShowNetworkConfig, ARGS_MANY_NETWORKS, [],
300 f58ecd88 Dimitris Aragiorgis
    "[<network_name>...]", "Show information about the network(s)"),
301 f58ecd88 Dimitris Aragiorgis
  "modify": (
302 f58ecd88 Dimitris Aragiorgis
    SetNetworkParams, ARGS_ONE_NETWORK,
303 f58ecd88 Dimitris Aragiorgis
    [DRY_RUN_OPT, SUBMIT_OPT, ADD_RESERVED_IPS_OPT, REMOVE_RESERVED_IPS_OPT,
304 f58ecd88 Dimitris Aragiorgis
     GATEWAY_OPT, MAC_PREFIX_OPT, NETWORK_TYPE_OPT, NETWORK6_OPT, GATEWAY6_OPT],
305 f58ecd88 Dimitris Aragiorgis
    "<network_name>", "Alters the parameters of a network"),
306 f58ecd88 Dimitris Aragiorgis
  "connect": (
307 f58ecd88 Dimitris Aragiorgis
    MapNetwork,
308 f58ecd88 Dimitris Aragiorgis
    [ArgNetwork(min=1, max=1), ArgGroup(min=1, max=1),
309 f58ecd88 Dimitris Aragiorgis
     ArgUnknown(min=1, max=1), ArgUnknown(min=1, max=1)],
310 f58ecd88 Dimitris Aragiorgis
    [NOCONFLICTSCHECK_OPT],
311 f58ecd88 Dimitris Aragiorgis
    "<network_name> <node_group> <mode> <link>",
312 f58ecd88 Dimitris Aragiorgis
    "Map a given network to the specified node group"
313 f58ecd88 Dimitris Aragiorgis
    " with given mode and link (netparams)"),
314 f58ecd88 Dimitris Aragiorgis
  "disconnect": (
315 f58ecd88 Dimitris Aragiorgis
    UnmapNetwork,
316 f58ecd88 Dimitris Aragiorgis
    [ArgNetwork(min=1, max=1), ArgGroup(min=1, max=1)],
317 f58ecd88 Dimitris Aragiorgis
    [NOCONFLICTSCHECK_OPT],
318 f58ecd88 Dimitris Aragiorgis
    "<network_name> <node_group>",
319 f58ecd88 Dimitris Aragiorgis
    "Unmap a given network from a specified node group"),
320 f58ecd88 Dimitris Aragiorgis
  "remove": (
321 f58ecd88 Dimitris Aragiorgis
    RemoveNetwork, ARGS_ONE_NETWORK, [FORCE_OPT, DRY_RUN_OPT],
322 f58ecd88 Dimitris Aragiorgis
    "[--dry-run] <network_id>",
323 f58ecd88 Dimitris Aragiorgis
    "Remove an (empty) network from the cluster"),
324 f58ecd88 Dimitris Aragiorgis
}
325 f58ecd88 Dimitris Aragiorgis
326 f58ecd88 Dimitris Aragiorgis
327 f58ecd88 Dimitris Aragiorgis
def Main():
328 f58ecd88 Dimitris Aragiorgis
  return GenericMain(commands)