Statistics
| Branch: | Tag: | Revision:

root / lib / client / gnt_network.py @ 91c17910

History | View | Annotate | Download (11.6 kB)

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

54 9c784fb3 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
55 9c784fb3 Dimitris Aragiorgis
  @type args: list
56 9c784fb3 Dimitris Aragiorgis
  @param args: a list of length 1 with the network name to create
57 9c784fb3 Dimitris Aragiorgis
  @rtype: int
58 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
59 9c784fb3 Dimitris Aragiorgis

60 9c784fb3 Dimitris Aragiorgis
  """
61 9c784fb3 Dimitris Aragiorgis
  (network_name, ) = args
62 9c784fb3 Dimitris Aragiorgis
63 b34864e8 Michael Hanselmann
  if opts.network is None:
64 b34864e8 Michael Hanselmann
    raise errors.OpPrereqError("The --network option must be given",
65 b34864e8 Michael Hanselmann
                               errors.ECODE_INVAL)
66 b34864e8 Michael Hanselmann
67 8140e24f Dimitris Aragiorgis
  if opts.tags is not None:
68 8140e24f Dimitris Aragiorgis
    tags = opts.tags.split(",")
69 8140e24f Dimitris Aragiorgis
  else:
70 8140e24f Dimitris Aragiorgis
    tags = []
71 8140e24f Dimitris Aragiorgis
72 b34864e8 Michael Hanselmann
  reserved_ips = _HandleReservedIPs(opts.add_reserved_ips)
73 b34864e8 Michael Hanselmann
74 b34864e8 Michael Hanselmann
  op = opcodes.OpNetworkAdd(network_name=network_name,
75 b34864e8 Michael Hanselmann
                            gateway=opts.gateway,
76 b34864e8 Michael Hanselmann
                            network=opts.network,
77 b34864e8 Michael Hanselmann
                            gateway6=opts.gateway6,
78 b34864e8 Michael Hanselmann
                            network6=opts.network6,
79 b34864e8 Michael Hanselmann
                            mac_prefix=opts.mac_prefix,
80 b34864e8 Michael Hanselmann
                            add_reserved_ips=reserved_ips,
81 b34864e8 Michael Hanselmann
                            conflicts_check=opts.conflicts_check,
82 b34864e8 Michael Hanselmann
                            tags=tags)
83 3924c9e0 Michael Hanselmann
  SubmitOrSend(op, opts)
84 9c784fb3 Dimitris Aragiorgis
85 9c784fb3 Dimitris Aragiorgis
86 286d0218 Dimitris Aragiorgis
def _GetDefaultGroups(cl, groups):
87 286d0218 Dimitris Aragiorgis
  """Gets list of groups to operate on.
88 286d0218 Dimitris Aragiorgis

89 286d0218 Dimitris Aragiorgis
  If C{groups} doesn't contain groups, a list of all groups in the cluster is
90 286d0218 Dimitris Aragiorgis
  returned.
91 286d0218 Dimitris Aragiorgis

92 286d0218 Dimitris Aragiorgis
  @type cl: L{luxi.Client}
93 286d0218 Dimitris Aragiorgis
  @type groups: list
94 286d0218 Dimitris Aragiorgis
  @rtype: list
95 286d0218 Dimitris Aragiorgis

96 286d0218 Dimitris Aragiorgis
  """
97 286d0218 Dimitris Aragiorgis
  if groups:
98 286d0218 Dimitris Aragiorgis
    return groups
99 286d0218 Dimitris Aragiorgis
100 286d0218 Dimitris Aragiorgis
  return list(itertools.chain(*cl.QueryGroups([], ["uuid"], False)))
101 286d0218 Dimitris Aragiorgis
102 286d0218 Dimitris Aragiorgis
103 ee93aa8a Michael Hanselmann
def ConnectNetwork(opts, args):
104 9c784fb3 Dimitris Aragiorgis
  """Map a network to a node group.
105 9c784fb3 Dimitris Aragiorgis

106 9c784fb3 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
107 9c784fb3 Dimitris Aragiorgis
  @type args: list
108 ee93aa8a Michael Hanselmann
  @param args: Network, mode, physlink and node groups
109 9c784fb3 Dimitris Aragiorgis
  @rtype: int
110 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
111 9c784fb3 Dimitris Aragiorgis

112 9c784fb3 Dimitris Aragiorgis
  """
113 3924c9e0 Michael Hanselmann
  cl = GetClient()
114 9c784fb3 Dimitris Aragiorgis
115 286d0218 Dimitris Aragiorgis
  (network, mode, link) = args[:3]
116 286d0218 Dimitris Aragiorgis
  groups = _GetDefaultGroups(cl, args[3:])
117 9c784fb3 Dimitris Aragiorgis
118 3924c9e0 Michael Hanselmann
  # TODO: Change logic to support "--submit"
119 9c784fb3 Dimitris Aragiorgis
  for group in groups:
120 9c784fb3 Dimitris Aragiorgis
    op = opcodes.OpNetworkConnect(group_name=group,
121 9c784fb3 Dimitris Aragiorgis
                                  network_name=network,
122 9c784fb3 Dimitris Aragiorgis
                                  network_mode=mode,
123 9c784fb3 Dimitris Aragiorgis
                                  network_link=link,
124 9c784fb3 Dimitris Aragiorgis
                                  conflicts_check=opts.conflicts_check)
125 3924c9e0 Michael Hanselmann
    SubmitOpCode(op, opts=opts, cl=cl)
126 9c784fb3 Dimitris Aragiorgis
127 9c784fb3 Dimitris Aragiorgis
128 ee93aa8a Michael Hanselmann
def DisconnectNetwork(opts, args):
129 9c784fb3 Dimitris Aragiorgis
  """Unmap a network from a node group.
130 9c784fb3 Dimitris Aragiorgis

131 9c784fb3 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
132 9c784fb3 Dimitris Aragiorgis
  @type args: list
133 ee93aa8a Michael Hanselmann
  @param args: Network and node groups
134 9c784fb3 Dimitris Aragiorgis
  @rtype: int
135 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
136 9c784fb3 Dimitris Aragiorgis

137 9c784fb3 Dimitris Aragiorgis
  """
138 3924c9e0 Michael Hanselmann
  cl = GetClient()
139 3924c9e0 Michael Hanselmann
140 286d0218 Dimitris Aragiorgis
  (network, ) = args[:1]
141 286d0218 Dimitris Aragiorgis
  groups = _GetDefaultGroups(cl, args[1:])
142 9c784fb3 Dimitris Aragiorgis
143 3924c9e0 Michael Hanselmann
  # TODO: Change logic to support "--submit"
144 9c784fb3 Dimitris Aragiorgis
  for group in groups:
145 9c784fb3 Dimitris Aragiorgis
    op = opcodes.OpNetworkDisconnect(group_name=group,
146 37a978e7 Helga Velroyen
                                     network_name=network)
147 3924c9e0 Michael Hanselmann
    SubmitOpCode(op, opts=opts, cl=cl)
148 9c784fb3 Dimitris Aragiorgis
149 9c784fb3 Dimitris Aragiorgis
150 9c784fb3 Dimitris Aragiorgis
def ListNetworks(opts, args):
151 9c784fb3 Dimitris Aragiorgis
  """List Ip pools and their properties.
152 9c784fb3 Dimitris Aragiorgis

153 9c784fb3 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
154 9c784fb3 Dimitris Aragiorgis
  @type args: list
155 9c784fb3 Dimitris Aragiorgis
  @param args: networks to list, or empty for all
156 9c784fb3 Dimitris Aragiorgis
  @rtype: int
157 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
158 9c784fb3 Dimitris Aragiorgis

159 9c784fb3 Dimitris Aragiorgis
  """
160 9c784fb3 Dimitris Aragiorgis
  desired_fields = ParseFields(opts.output, _LIST_DEF_FIELDS)
161 9c784fb3 Dimitris Aragiorgis
  fmtoverride = {
162 503574ec Michael Hanselmann
    "group_list":
163 503574ec Michael Hanselmann
      (lambda data: utils.CommaJoin("%s (%s, %s)" % (name, mode, link)
164 503574ec Michael Hanselmann
                                    for (name, mode, link) in data),
165 503574ec Michael Hanselmann
       False),
166 9c784fb3 Dimitris Aragiorgis
    "inst_list": (",".join, False),
167 8140e24f Dimitris Aragiorgis
    "tags": (",".join, False),
168 503574ec Michael Hanselmann
    }
169 9c784fb3 Dimitris Aragiorgis
170 9c784fb3 Dimitris Aragiorgis
  return GenericList(constants.QR_NETWORK, desired_fields, args, None,
171 9c784fb3 Dimitris Aragiorgis
                     opts.separator, not opts.no_headers,
172 9c784fb3 Dimitris Aragiorgis
                     verbose=opts.verbose, format_override=fmtoverride)
173 9c784fb3 Dimitris Aragiorgis
174 9c784fb3 Dimitris Aragiorgis
175 9c784fb3 Dimitris Aragiorgis
def ListNetworkFields(opts, args):
176 9c784fb3 Dimitris Aragiorgis
  """List network fields.
177 9c784fb3 Dimitris Aragiorgis

178 9c784fb3 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
179 9c784fb3 Dimitris Aragiorgis
  @type args: list
180 9c784fb3 Dimitris Aragiorgis
  @param args: fields to list, or empty for all
181 9c784fb3 Dimitris Aragiorgis
  @rtype: int
182 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
183 9c784fb3 Dimitris Aragiorgis

184 9c784fb3 Dimitris Aragiorgis
  """
185 9c784fb3 Dimitris Aragiorgis
  return GenericListFields(constants.QR_NETWORK, args, opts.separator,
186 9c784fb3 Dimitris Aragiorgis
                           not opts.no_headers)
187 9c784fb3 Dimitris Aragiorgis
188 9c784fb3 Dimitris Aragiorgis
189 beb81ea5 Dimitris Aragiorgis
def ShowNetworkConfig(_, args):
190 9c784fb3 Dimitris Aragiorgis
  """Show network information.
191 9c784fb3 Dimitris Aragiorgis

192 9c784fb3 Dimitris Aragiorgis
  @type args: list
193 9c784fb3 Dimitris Aragiorgis
  @param args: should either be an empty list, in which case
194 9c784fb3 Dimitris Aragiorgis
      we show information about all nodes, or should contain
195 9c784fb3 Dimitris Aragiorgis
      a list of networks (names or UUIDs) to be queried for information
196 9c784fb3 Dimitris Aragiorgis
  @rtype: int
197 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
198 9c784fb3 Dimitris Aragiorgis

199 9c784fb3 Dimitris Aragiorgis
  """
200 9c784fb3 Dimitris Aragiorgis
  cl = GetClient()
201 9c784fb3 Dimitris Aragiorgis
  result = cl.QueryNetworks(fields=["name", "network", "gateway",
202 9c784fb3 Dimitris Aragiorgis
                                    "network6", "gateway6",
203 5cfa6c37 Dimitris Aragiorgis
                                    "mac_prefix",
204 9c784fb3 Dimitris Aragiorgis
                                    "free_count", "reserved_count",
205 9c784fb3 Dimitris Aragiorgis
                                    "map", "group_list", "inst_list",
206 9675661c Dimitris Aragiorgis
                                    "external_reservations",
207 9675661c Dimitris Aragiorgis
                                    "serial_no", "uuid"],
208 9c784fb3 Dimitris Aragiorgis
                            names=args, use_locking=False)
209 9c784fb3 Dimitris Aragiorgis
210 9c784fb3 Dimitris Aragiorgis
  for (name, network, gateway, network6, gateway6,
211 5cfa6c37 Dimitris Aragiorgis
       mac_prefix, free_count, reserved_count,
212 9675661c Dimitris Aragiorgis
       mapping, group_list, instances, ext_res, serial, uuid) in result:
213 9c784fb3 Dimitris Aragiorgis
    size = free_count + reserved_count
214 9c784fb3 Dimitris Aragiorgis
    ToStdout("Network name: %s", name)
215 9675661c Dimitris Aragiorgis
    ToStdout("UUID: %s", uuid)
216 9675661c Dimitris Aragiorgis
    ToStdout("Serial number: %d", serial)
217 9675661c Dimitris Aragiorgis
    ToStdout("  Subnet: %s", network)
218 9675661c Dimitris Aragiorgis
    ToStdout("  Gateway: %s", gateway)
219 9675661c Dimitris Aragiorgis
    ToStdout("  IPv6 Subnet: %s", network6)
220 9675661c Dimitris Aragiorgis
    ToStdout("  IPv6 Gateway: %s", gateway6)
221 9675661c Dimitris Aragiorgis
    ToStdout("  Mac Prefix: %s", mac_prefix)
222 9675661c Dimitris Aragiorgis
    ToStdout("  Size: %d", size)
223 9675661c Dimitris Aragiorgis
    ToStdout("  Free: %d (%.2f%%)", free_count,
224 965a542a Michael Hanselmann
             100 * float(free_count) / float(size))
225 9675661c Dimitris Aragiorgis
    ToStdout("  Usage map:")
226 9c784fb3 Dimitris Aragiorgis
    idx = 0
227 84e110aa Michael Hanselmann
    for line in textwrap.wrap(mapping, width=64):
228 9c784fb3 Dimitris Aragiorgis
      ToStdout("     %s %s %d", str(idx).rjust(3), line.ljust(64), idx + 63)
229 9c784fb3 Dimitris Aragiorgis
      idx += 64
230 9c784fb3 Dimitris Aragiorgis
    ToStdout("         (X) used    (.) free")
231 9c784fb3 Dimitris Aragiorgis
232 9c784fb3 Dimitris Aragiorgis
    if ext_res:
233 9c784fb3 Dimitris Aragiorgis
      ToStdout("  externally reserved IPs:")
234 84e110aa Michael Hanselmann
      for line in textwrap.wrap(ext_res, width=64):
235 9c784fb3 Dimitris Aragiorgis
        ToStdout("    %s" % line)
236 9c784fb3 Dimitris Aragiorgis
237 9c784fb3 Dimitris Aragiorgis
    if group_list:
238 9c784fb3 Dimitris Aragiorgis
      ToStdout("  connected to node groups:")
239 9c784fb3 Dimitris Aragiorgis
      for group in group_list:
240 9c784fb3 Dimitris Aragiorgis
        ToStdout("    %s", group)
241 9c784fb3 Dimitris Aragiorgis
    else:
242 9c784fb3 Dimitris Aragiorgis
      ToStdout("  not connected to any node group")
243 9c784fb3 Dimitris Aragiorgis
244 9c784fb3 Dimitris Aragiorgis
    if instances:
245 9c784fb3 Dimitris Aragiorgis
      ToStdout("  used by %d instances:", len(instances))
246 9c784fb3 Dimitris Aragiorgis
      for inst in instances:
247 9c784fb3 Dimitris Aragiorgis
        ((ips, networks), ) = cl.QueryInstances([inst],
248 9c784fb3 Dimitris Aragiorgis
                                                ["nic.ips", "nic.networks"],
249 9c784fb3 Dimitris Aragiorgis
                                                use_locking=False)
250 9c784fb3 Dimitris Aragiorgis
251 3c286190 Dimitris Aragiorgis
        l = lambda value: ", ".join(str(idx) + ":" + str(ip)
252 9c784fb3 Dimitris Aragiorgis
                                    for idx, (ip, net) in enumerate(value)
253 9394f4d1 Dimitris Aragiorgis
                                      if net == uuid)
254 9c784fb3 Dimitris Aragiorgis
255 beb81ea5 Dimitris Aragiorgis
        ToStdout("    %s : %s", inst, l(zip(ips, networks)))
256 9c784fb3 Dimitris Aragiorgis
    else:
257 9c784fb3 Dimitris Aragiorgis
      ToStdout("  not used by any instances")
258 9c784fb3 Dimitris Aragiorgis
259 9c784fb3 Dimitris Aragiorgis
260 9c784fb3 Dimitris Aragiorgis
def SetNetworkParams(opts, args):
261 9c784fb3 Dimitris Aragiorgis
  """Modifies an IP address pool's parameters.
262 9c784fb3 Dimitris Aragiorgis

263 9c784fb3 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
264 9c784fb3 Dimitris Aragiorgis
  @type args: list
265 9c784fb3 Dimitris Aragiorgis
  @param args: should contain only one element, the node group name
266 9c784fb3 Dimitris Aragiorgis

267 9c784fb3 Dimitris Aragiorgis
  @rtype: int
268 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
269 9c784fb3 Dimitris Aragiorgis

270 9c784fb3 Dimitris Aragiorgis
  """
271 9c784fb3 Dimitris Aragiorgis
  # TODO: add "network": opts.network,
272 9c784fb3 Dimitris Aragiorgis
  all_changes = {
273 9c784fb3 Dimitris Aragiorgis
    "gateway": opts.gateway,
274 9c784fb3 Dimitris Aragiorgis
    "add_reserved_ips": _HandleReservedIPs(opts.add_reserved_ips),
275 9c784fb3 Dimitris Aragiorgis
    "remove_reserved_ips": _HandleReservedIPs(opts.remove_reserved_ips),
276 9c784fb3 Dimitris Aragiorgis
    "mac_prefix": opts.mac_prefix,
277 9c784fb3 Dimitris Aragiorgis
    "gateway6": opts.gateway6,
278 9c784fb3 Dimitris Aragiorgis
    "network6": opts.network6,
279 9c784fb3 Dimitris Aragiorgis
  }
280 9c784fb3 Dimitris Aragiorgis
281 9c784fb3 Dimitris Aragiorgis
  if all_changes.values().count(None) == len(all_changes):
282 9c784fb3 Dimitris Aragiorgis
    ToStderr("Please give at least one of the parameters.")
283 9c784fb3 Dimitris Aragiorgis
    return 1
284 9c784fb3 Dimitris Aragiorgis
285 beb81ea5 Dimitris Aragiorgis
  # pylint: disable=W0142
286 beb81ea5 Dimitris Aragiorgis
  op = opcodes.OpNetworkSetParams(network_name=args[0], **all_changes)
287 9c784fb3 Dimitris Aragiorgis
288 9c784fb3 Dimitris Aragiorgis
  # TODO: add feedback to user, e.g. list the modifications
289 9c784fb3 Dimitris Aragiorgis
  SubmitOrSend(op, opts)
290 9c784fb3 Dimitris Aragiorgis
291 9c784fb3 Dimitris Aragiorgis
292 9c784fb3 Dimitris Aragiorgis
def RemoveNetwork(opts, args):
293 9c784fb3 Dimitris Aragiorgis
  """Remove an IP address pool from the cluster.
294 9c784fb3 Dimitris Aragiorgis

295 9c784fb3 Dimitris Aragiorgis
  @param opts: the command line options selected by the user
296 9c784fb3 Dimitris Aragiorgis
  @type args: list
297 9c784fb3 Dimitris Aragiorgis
  @param args: a list of length 1 with the id of the IP address pool to remove
298 9c784fb3 Dimitris Aragiorgis
  @rtype: int
299 9c784fb3 Dimitris Aragiorgis
  @return: the desired exit code
300 9c784fb3 Dimitris Aragiorgis

301 9c784fb3 Dimitris Aragiorgis
  """
302 9c784fb3 Dimitris Aragiorgis
  (network_name,) = args
303 9c784fb3 Dimitris Aragiorgis
  op = opcodes.OpNetworkRemove(network_name=network_name, force=opts.force)
304 3924c9e0 Michael Hanselmann
  SubmitOrSend(op, opts)
305 9c784fb3 Dimitris Aragiorgis
306 9c784fb3 Dimitris Aragiorgis
307 9c784fb3 Dimitris Aragiorgis
commands = {
308 9c784fb3 Dimitris Aragiorgis
  "add": (
309 9c784fb3 Dimitris Aragiorgis
    AddNetwork, ARGS_ONE_NETWORK,
310 213076fe Dimitris Aragiorgis
    [DRY_RUN_OPT, NETWORK_OPT, GATEWAY_OPT, ADD_RESERVED_IPS_OPT,
311 5cfa6c37 Dimitris Aragiorgis
     MAC_PREFIX_OPT, NETWORK6_OPT, GATEWAY6_OPT,
312 3924c9e0 Michael Hanselmann
     NOCONFLICTSCHECK_OPT, TAG_ADD_OPT, PRIORITY_OPT, SUBMIT_OPT],
313 9c784fb3 Dimitris Aragiorgis
    "<network_name>", "Add a new IP network to the cluster"),
314 9c784fb3 Dimitris Aragiorgis
  "list": (
315 9c784fb3 Dimitris Aragiorgis
    ListNetworks, ARGS_MANY_NETWORKS,
316 9c784fb3 Dimitris Aragiorgis
    [NOHDR_OPT, SEP_OPT, FIELDS_OPT, VERBOSE_OPT],
317 9c784fb3 Dimitris Aragiorgis
    "[<network_id>...]",
318 9c784fb3 Dimitris Aragiorgis
    "Lists the IP networks in the cluster. The available fields can be shown"
319 9c784fb3 Dimitris Aragiorgis
    " using the \"list-fields\" command (see the man page for details)."
320 9c784fb3 Dimitris Aragiorgis
    " The default list is (in order): %s." % utils.CommaJoin(_LIST_DEF_FIELDS)),
321 9c784fb3 Dimitris Aragiorgis
  "list-fields": (
322 9c784fb3 Dimitris Aragiorgis
    ListNetworkFields, [ArgUnknown()], [NOHDR_OPT, SEP_OPT], "[fields...]",
323 9c784fb3 Dimitris Aragiorgis
    "Lists all available fields for networks"),
324 9c784fb3 Dimitris Aragiorgis
  "info": (
325 9c784fb3 Dimitris Aragiorgis
    ShowNetworkConfig, ARGS_MANY_NETWORKS, [],
326 9c784fb3 Dimitris Aragiorgis
    "[<network_name>...]", "Show information about the network(s)"),
327 9c784fb3 Dimitris Aragiorgis
  "modify": (
328 9c784fb3 Dimitris Aragiorgis
    SetNetworkParams, ARGS_ONE_NETWORK,
329 9c784fb3 Dimitris Aragiorgis
    [DRY_RUN_OPT, SUBMIT_OPT, ADD_RESERVED_IPS_OPT, REMOVE_RESERVED_IPS_OPT,
330 5cfa6c37 Dimitris Aragiorgis
     GATEWAY_OPT, MAC_PREFIX_OPT, NETWORK6_OPT, GATEWAY6_OPT,
331 3924c9e0 Michael Hanselmann
     PRIORITY_OPT],
332 9c784fb3 Dimitris Aragiorgis
    "<network_name>", "Alters the parameters of a network"),
333 9c784fb3 Dimitris Aragiorgis
  "connect": (
334 ee93aa8a Michael Hanselmann
    ConnectNetwork,
335 ee93aa8a Michael Hanselmann
    [ArgNetwork(min=1, max=1),
336 e896ad3d Michael Hanselmann
     ArgChoice(min=1, max=1, choices=constants.NIC_VALID_MODES),
337 ee93aa8a Michael Hanselmann
     ArgUnknown(min=1, max=1),
338 ee93aa8a Michael Hanselmann
     ArgGroup()],
339 3924c9e0 Michael Hanselmann
    [NOCONFLICTSCHECK_OPT, PRIORITY_OPT],
340 ee93aa8a Michael Hanselmann
    "<network_name> <mode> <link> [<node_group>...]",
341 9c784fb3 Dimitris Aragiorgis
    "Map a given network to the specified node group"
342 9c784fb3 Dimitris Aragiorgis
    " with given mode and link (netparams)"),
343 9c784fb3 Dimitris Aragiorgis
  "disconnect": (
344 ee93aa8a Michael Hanselmann
    DisconnectNetwork,
345 ee93aa8a Michael Hanselmann
    [ArgNetwork(min=1, max=1), ArgGroup()],
346 37a978e7 Helga Velroyen
    [PRIORITY_OPT],
347 ee93aa8a Michael Hanselmann
    "<network_name> [<node_group>...]",
348 9c784fb3 Dimitris Aragiorgis
    "Unmap a given network from a specified node group"),
349 9c784fb3 Dimitris Aragiorgis
  "remove": (
350 3924c9e0 Michael Hanselmann
    RemoveNetwork, ARGS_ONE_NETWORK,
351 3924c9e0 Michael Hanselmann
    [FORCE_OPT, DRY_RUN_OPT, SUBMIT_OPT, PRIORITY_OPT],
352 9c784fb3 Dimitris Aragiorgis
    "[--dry-run] <network_id>",
353 9c784fb3 Dimitris Aragiorgis
    "Remove an (empty) network from the cluster"),
354 8140e24f Dimitris Aragiorgis
  "list-tags": (
355 8140e24f Dimitris Aragiorgis
    ListTags, ARGS_ONE_NETWORK, [],
356 8140e24f Dimitris Aragiorgis
    "<network_name>", "List the tags of the given network"),
357 8140e24f Dimitris Aragiorgis
  "add-tags": (
358 8140e24f Dimitris Aragiorgis
    AddTags, [ArgNetwork(min=1, max=1), ArgUnknown()],
359 8140e24f Dimitris Aragiorgis
    [TAG_SRC_OPT, PRIORITY_OPT, SUBMIT_OPT],
360 8140e24f Dimitris Aragiorgis
    "<network_name> tag...", "Add tags to the given network"),
361 8140e24f Dimitris Aragiorgis
  "remove-tags": (
362 8140e24f Dimitris Aragiorgis
    RemoveTags, [ArgNetwork(min=1, max=1), ArgUnknown()],
363 8140e24f Dimitris Aragiorgis
    [TAG_SRC_OPT, PRIORITY_OPT, SUBMIT_OPT],
364 8140e24f Dimitris Aragiorgis
    "<network_name> tag...", "Remove tags from given network"),
365 9c784fb3 Dimitris Aragiorgis
}
366 9c784fb3 Dimitris Aragiorgis
367 9c784fb3 Dimitris Aragiorgis
368 9c784fb3 Dimitris Aragiorgis
def Main():
369 8140e24f Dimitris Aragiorgis
  return GenericMain(commands, override={"tag_type": constants.TAG_NETWORK})