Statistics
| Branch: | Tag: | Revision:

root / scripts / gnt-debug @ 9d95c3af

History | View | Annotate | Download (7.8 kB)

1 fd3ee040 Iustin Pop
#!/usr/bin/python
2 fd3ee040 Iustin Pop
#
3 fd3ee040 Iustin Pop
4 fd3ee040 Iustin Pop
# Copyright (C) 2006, 2007 Google Inc.
5 fd3ee040 Iustin Pop
#
6 fd3ee040 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 fd3ee040 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 fd3ee040 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 fd3ee040 Iustin Pop
# (at your option) any later version.
10 fd3ee040 Iustin Pop
#
11 fd3ee040 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 fd3ee040 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 fd3ee040 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 fd3ee040 Iustin Pop
# General Public License for more details.
15 fd3ee040 Iustin Pop
#
16 fd3ee040 Iustin Pop
# You should have received a copy of the GNU General Public License
17 fd3ee040 Iustin Pop
# along with this program; if not, write to the Free Software
18 fd3ee040 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 fd3ee040 Iustin Pop
# 02110-1301, USA.
20 fd3ee040 Iustin Pop
21 fd3ee040 Iustin Pop
22 2f79bd34 Iustin Pop
# pylint: disable-msg=W0401,W0614
23 2f79bd34 Iustin Pop
# W0401: Wildcard import ganeti.cli
24 2f79bd34 Iustin Pop
# W0614: Unused import %s from wildcard import (since we need cli)
25 2f79bd34 Iustin Pop
26 fd3ee040 Iustin Pop
import sys
27 f1c66d13 Iustin Pop
import simplejson
28 f1c66d13 Iustin Pop
import time
29 f1c66d13 Iustin Pop
30 fd3ee040 Iustin Pop
from optparse import make_option
31 fd3ee040 Iustin Pop
32 fd3ee040 Iustin Pop
from ganeti.cli import *
33 9d5ba39a Iustin Pop
from ganeti import cli
34 fd3ee040 Iustin Pop
from ganeti import opcodes
35 fd3ee040 Iustin Pop
from ganeti import constants
36 fd3ee040 Iustin Pop
from ganeti import utils
37 fd3ee040 Iustin Pop
from ganeti import errors
38 fd3ee040 Iustin Pop
39 fd3ee040 Iustin Pop
40 fd3ee040 Iustin Pop
def Delay(opts, args):
41 fd3ee040 Iustin Pop
  """Sleeps for a while
42 fd3ee040 Iustin Pop
43 6099bfcf Iustin Pop
  @param opts: the command line options selected by the user
44 6099bfcf Iustin Pop
  @type args: list
45 6099bfcf Iustin Pop
  @param args: should contain only one element, the duration
46 6099bfcf Iustin Pop
      the sleep
47 6099bfcf Iustin Pop
  @rtype: int
48 6099bfcf Iustin Pop
  @return: the desired exit code
49 6099bfcf Iustin Pop
50 fd3ee040 Iustin Pop
  """
51 fd3ee040 Iustin Pop
  delay = float(args[0])
52 fd3ee040 Iustin Pop
  op = opcodes.OpTestDelay(duration=delay,
53 fd3ee040 Iustin Pop
                           on_master=opts.on_master,
54 fd3ee040 Iustin Pop
                           on_nodes=opts.on_nodes)
55 17621a25 Michael Hanselmann
  SubmitOpCode(op)
56 fd3ee040 Iustin Pop
57 fd3ee040 Iustin Pop
  return 0
58 fd3ee040 Iustin Pop
59 fd3ee040 Iustin Pop
60 f1c66d13 Iustin Pop
def GenericOpCodes(opts, args):
61 6099bfcf Iustin Pop
  """Send any opcode to the master.
62 6099bfcf Iustin Pop
63 6099bfcf Iustin Pop
  @todo: The function is broken and needs to be converted to the
64 6099bfcf Iustin Pop
      current job queue API
65 6099bfcf Iustin Pop
  @param opts: the command line options selected by the user
66 6099bfcf Iustin Pop
  @type args: list
67 6099bfcf Iustin Pop
  @param args: should contain only one element, the path of
68 6099bfcf Iustin Pop
      the file with the opcode definition
69 6099bfcf Iustin Pop
  @rtype: int
70 6099bfcf Iustin Pop
  @return: the desired exit code
71 f1c66d13 Iustin Pop
72 f1c66d13 Iustin Pop
  """
73 9d5ba39a Iustin Pop
  cl = cli.GetClient()
74 9d95c3af Iustin Pop
  jex = cli.JobExecutor(cl=cl, verbose=opts.verbose)
75 9d95c3af Iustin Pop
76 9d95c3af Iustin Pop
  job_cnt = 0
77 9d95c3af Iustin Pop
  op_cnt = 0
78 9d95c3af Iustin Pop
  if opts.timing_stats:
79 9d95c3af Iustin Pop
    ToStdout("Loading...")
80 9d95c3af Iustin Pop
  for job_idx in range(opts.rep_job):
81 9d95c3af Iustin Pop
    for fname in args:
82 9d95c3af Iustin Pop
      op_data = simplejson.loads(open(fname).read())
83 9d95c3af Iustin Pop
      op_list = [opcodes.OpCode.LoadOpCode(val) for val in op_data]
84 9d95c3af Iustin Pop
      op_list = op_list * opts.rep_op
85 9d95c3af Iustin Pop
      jex.QueueJob("file %s/%d" % (fname, job_idx), *op_list)
86 9d95c3af Iustin Pop
      op_cnt += len(op_list)
87 9d95c3af Iustin Pop
      job_cnt += 1
88 9d95c3af Iustin Pop
89 9d95c3af Iustin Pop
  if opts.timing_stats:
90 9d95c3af Iustin Pop
    t1 = time.time()
91 9d95c3af Iustin Pop
    ToStdout("Submitting...")
92 9d95c3af Iustin Pop
  jex.SubmitPending()
93 9d95c3af Iustin Pop
94 9d95c3af Iustin Pop
  if opts.timing_stats:
95 9d95c3af Iustin Pop
    t2 = time.time()
96 9d95c3af Iustin Pop
    ToStdout("Executing...")
97 b59252fe Iustin Pop
  jex.GetResults()
98 9d95c3af Iustin Pop
  if opts.timing_stats:
99 9d95c3af Iustin Pop
    t3 = time.time()
100 9d95c3af Iustin Pop
    ToStdout("C:op     %4d" % op_cnt)
101 9d95c3af Iustin Pop
    ToStdout("C:job    %4d" % job_cnt)
102 9d95c3af Iustin Pop
    ToStdout("T:submit %4.4f" % (t2-t1))
103 9d95c3af Iustin Pop
    ToStdout("T:exec   %4.4f" % (t3-t2))
104 9d95c3af Iustin Pop
    ToStdout("T:total  %4.4f" % (t3-t1))
105 f1c66d13 Iustin Pop
  return 0
106 f1c66d13 Iustin Pop
107 f1c66d13 Iustin Pop
108 d61df03e Iustin Pop
def TestAllocator(opts, args):
109 6099bfcf Iustin Pop
  """Runs the test allocator opcode.
110 d61df03e Iustin Pop
111 6099bfcf Iustin Pop
  @param opts: the command line options selected by the user
112 6099bfcf Iustin Pop
  @type args: list
113 6099bfcf Iustin Pop
  @param args: should contain only one element, the iallocator name
114 6099bfcf Iustin Pop
  @rtype: int
115 6099bfcf Iustin Pop
  @return: the desired exit code
116 6099bfcf Iustin Pop
117 6099bfcf Iustin Pop
  """
118 d61df03e Iustin Pop
  try:
119 d61df03e Iustin Pop
    disks = [{"size": utils.ParseUnit(val), "mode": 'w'}
120 d61df03e Iustin Pop
             for val in opts.disks.split(",")]
121 d61df03e Iustin Pop
  except errors.UnitParseError, err:
122 3a24c527 Iustin Pop
    ToStderr("Invalid disks parameter '%s': %s", opts.disks, err)
123 d61df03e Iustin Pop
    return 1
124 d61df03e Iustin Pop
125 d61df03e Iustin Pop
  nics = [val.split("/") for val in opts.nics.split(",")]
126 d61df03e Iustin Pop
  for row in nics:
127 d61df03e Iustin Pop
    while len(row) < 3:
128 d61df03e Iustin Pop
      row.append(None)
129 d61df03e Iustin Pop
    for i in range(3):
130 d61df03e Iustin Pop
      if row[i] == '':
131 d61df03e Iustin Pop
        row[i] = None
132 d61df03e Iustin Pop
  nic_dict = [{"mac": v[0], "ip": v[1], "bridge": v[2]} for v in nics]
133 d61df03e Iustin Pop
134 d61df03e Iustin Pop
  if opts.tags is None:
135 d61df03e Iustin Pop
    opts.tags = []
136 d61df03e Iustin Pop
  else:
137 d61df03e Iustin Pop
    opts.tags = opts.tags.split(",")
138 d61df03e Iustin Pop
139 d61df03e Iustin Pop
  op = opcodes.OpTestAllocator(mode=opts.mode,
140 d61df03e Iustin Pop
                               name=args[0],
141 d61df03e Iustin Pop
                               mem_size=opts.mem,
142 d61df03e Iustin Pop
                               disks=disks,
143 d61df03e Iustin Pop
                               disk_template=opts.disk_template,
144 d61df03e Iustin Pop
                               nics=nic_dict,
145 d61df03e Iustin Pop
                               os=opts.os_type,
146 d61df03e Iustin Pop
                               vcpus=opts.vcpus,
147 d61df03e Iustin Pop
                               tags=opts.tags,
148 d61df03e Iustin Pop
                               direction=opts.direction,
149 d61df03e Iustin Pop
                               allocator=opts.allocator,
150 d61df03e Iustin Pop
                               )
151 d61df03e Iustin Pop
  result = SubmitOpCode(op)
152 3a24c527 Iustin Pop
  ToStdout("%s" % result)
153 d61df03e Iustin Pop
  return 0
154 d61df03e Iustin Pop
155 d61df03e Iustin Pop
156 fd3ee040 Iustin Pop
commands = {
157 fd3ee040 Iustin Pop
  'delay': (Delay, ARGS_ONE,
158 fd3ee040 Iustin Pop
            [DEBUG_OPT,
159 fd3ee040 Iustin Pop
             make_option("--no-master", dest="on_master", default=True,
160 fd3ee040 Iustin Pop
                         action="store_false",
161 fd3ee040 Iustin Pop
                         help="Do not sleep in the master code"),
162 fd3ee040 Iustin Pop
             make_option("-n", dest="on_nodes", default=[],
163 fd3ee040 Iustin Pop
                         action="append",
164 fd3ee040 Iustin Pop
                         help="Select nodes to sleep on"),
165 fd3ee040 Iustin Pop
             ],
166 9a033156 Iustin Pop
            "[opts...] <duration>", "Executes a TestDelay OpCode"),
167 99036060 Iustin Pop
  'submit-job': (GenericOpCodes, ARGS_ATLEAST(1),
168 f1c66d13 Iustin Pop
                 [DEBUG_OPT,
169 9d95c3af Iustin Pop
                  make_option("--op-repeat", type="int", default="1",
170 9d95c3af Iustin Pop
                              dest="rep_op",
171 9d95c3af Iustin Pop
                              help="Repeat the opcode sequence this number"
172 9d95c3af Iustin Pop
                              " of times"),
173 9d95c3af Iustin Pop
                  make_option("--job-repeat", type="int", default="1",
174 9d95c3af Iustin Pop
                              dest="rep_job",
175 9d95c3af Iustin Pop
                              help="Repeat the job this number"
176 9d95c3af Iustin Pop
                              " of times"),
177 9d95c3af Iustin Pop
                  make_option("-v", "--verbose", default=False,
178 9d95c3af Iustin Pop
                              action="store_true",
179 9d95c3af Iustin Pop
                              help="Make the operation more verbose"),
180 9d95c3af Iustin Pop
                  make_option("--timing-stats", default=False,
181 9d95c3af Iustin Pop
                              action="store_true",
182 9d95c3af Iustin Pop
                              help="Show timing stats"),
183 f1c66d13 Iustin Pop
                  ],
184 99036060 Iustin Pop
                 "<op_list_file...>", "Submits jobs built from json files"
185 99036060 Iustin Pop
                 " containing a list of serialized opcodes"),
186 d61df03e Iustin Pop
  'allocator': (TestAllocator, ARGS_ONE,
187 d61df03e Iustin Pop
                [DEBUG_OPT,
188 d61df03e Iustin Pop
                 make_option("--dir", dest="direction",
189 d61df03e Iustin Pop
                             default="in", choices=["in", "out"],
190 d61df03e Iustin Pop
                             help="Show allocator input (in) or allocator"
191 d61df03e Iustin Pop
                             " results (out)"),
192 d61df03e Iustin Pop
                 make_option("--algorithm", dest="allocator",
193 d61df03e Iustin Pop
                             default=None,
194 d61df03e Iustin Pop
                             help="Allocator algorithm name"),
195 d61df03e Iustin Pop
                 make_option("-m", "--mode", default="relocate",
196 d61df03e Iustin Pop
                             choices=["relocate", "allocate"],
197 d61df03e Iustin Pop
                             help="Request mode, either allocate or"
198 8901997e Iustin Pop
                             " relocate"),
199 d61df03e Iustin Pop
                 cli_option("--mem", default=128, type="unit",
200 d61df03e Iustin Pop
                            help="Memory size for the instance (MiB)"),
201 d61df03e Iustin Pop
                 make_option("--disks", default="4096,4096",
202 d61df03e Iustin Pop
                             help="Comma separated list of disk sizes (MiB)"),
203 d61df03e Iustin Pop
                 make_option("-t", "--disk-template", default="drbd",
204 d61df03e Iustin Pop
                             help="Select the disk template"),
205 d61df03e Iustin Pop
                 make_option("--nics", default="00:11:22:33:44:55",
206 d61df03e Iustin Pop
                             help="Comma separated list of nics, each nic"
207 d61df03e Iustin Pop
                             " definition is of form mac/ip/bridge, if"
208 d61df03e Iustin Pop
                             " missing values are replace by None"),
209 d61df03e Iustin Pop
                 make_option("-o", "--os-type", default=None,
210 d61df03e Iustin Pop
                             help="Select os for the instance"),
211 d61df03e Iustin Pop
                 make_option("-p", "--vcpus", default=1, type="int",
212 d61df03e Iustin Pop
                             help="Select number of VCPUs for the instance"),
213 d61df03e Iustin Pop
                 make_option("--tags", default=None,
214 d61df03e Iustin Pop
                             help="Comma separated list of tags"),
215 d61df03e Iustin Pop
                 ],
216 9a033156 Iustin Pop
                "{opts...} <instance>", "Executes a TestAllocator OpCode"),
217 fd3ee040 Iustin Pop
  }
218 fd3ee040 Iustin Pop
219 fd3ee040 Iustin Pop
220 fd3ee040 Iustin Pop
if __name__ == '__main__':
221 fd3ee040 Iustin Pop
  sys.exit(GenericMain(commands))