ganeti-local
11 years agocmdlib: Use locked nodes as node whitelist
Michael Hanselmann [Tue, 4 Dec 2012 14:53:55 +0000 (15:53 +0100)]
cmdlib: Use locked nodes as node whitelist

Also actually start using opportunistic locks (if requested).

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agocmdlib: Opportunistic locking on instance creation
Michael Hanselmann [Fri, 7 Dec 2012 12:29:49 +0000 (13:29 +0100)]
cmdlib: Opportunistic locking on instance creation

Adds a new parameter to “OpInstanceCreate” and “OpInstanceMultiAlloc” to
use opportunistic locks.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agocmdlib: Node whitelist support for allocation request
Michael Hanselmann [Tue, 27 Nov 2012 06:33:26 +0000 (07:33 +0100)]
cmdlib: Node whitelist support for allocation request

Forward the node whitelist to the iallocator plugin.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agomcpu: Verify node allocation lock mode
Michael Hanselmann [Mon, 26 Nov 2012 06:02:35 +0000 (07:02 +0100)]
mcpu: Verify node allocation lock mode

Add verification code to mcpu to check an LU's locks. Two whitelists are
provided to exclude LUs from the two tests.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Bernardo Dal Seno <bdalseno@google.com>

11 years ago_ExportQuery: Use node allocation lock
Michael Hanselmann [Mon, 26 Nov 2012 09:09:26 +0000 (10:09 +0100)]
_ExportQuery: Use node allocation lock

Block instance allocations when all node locks will be acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUBackupExport: Use node allocation lock
Michael Hanselmann [Mon, 26 Nov 2012 09:09:38 +0000 (10:09 +0100)]
LUBackupExport: Use node allocation lock

Block instance allocations when all node locks will be acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUBackupRemove: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:44:58 +0000 (04:44 +0100)]
LUBackupRemove: Use node allocation lock

Block instance allocations when all node locks will be acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUInstanceMultiAlloc: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:43:48 +0000 (04:43 +0100)]
LUInstanceMultiAlloc: Use node allocation lock

Avoid conflicts between instance allocations.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUInstanceRecreateDisks: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:43:08 +0000 (04:43 +0100)]
LUInstanceRecreateDisks: Use node allocation lock

Block instance allocations when all node locks will be acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUNodeSetParams: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:42:27 +0000 (04:42 +0100)]
LUNodeSetParams: Use node allocation lock

Block instance allocations when all node locks will be acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUNodeQueryvols: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:41:52 +0000 (04:41 +0100)]
LUNodeQueryvols: Use node allocation lock

Block instance allocations when all node locks will be acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUOobCommand: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:41:34 +0000 (04:41 +0100)]
LUOobCommand: Use node allocation lock

If no node names are given, all node locks are acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFix typo in comment
Michele Tartara [Thu, 6 Dec 2012 16:45:40 +0000 (17:45 +0100)]
Fix typo in comment

There was a typo in the docstring of the parseMessage function of the
confd server.

Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoRevert "Network and address pool"
Helga Velroyen [Thu, 6 Dec 2012 18:35:44 +0000 (19:35 +0100)]
Revert "Network and address pool"

This reverts commit b9a616e132af9bba718d2da8c94eeec7af886814, which
depends on the "bitvec" library. We need to investigate a bit further that
dependency, as it in turns depends on "vector" 0.9.1 or *below*, since
0.10.* removed support for Data.Vector.Unboxed.Safe which it uses.

Signed-off-by: Helga Velroyen <helgav@google.com>
Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoNetwork and address pool
Helga Velroyen [Tue, 27 Nov 2012 09:34:02 +0000 (10:34 +0100)]
Network and address pool

Implementation of the network and address pool class in
Haskell. Not complete yet. Includes unit tests that cover
all functionality that is so far implemented.

Signed-off-by: Helga Velroyen <helgav@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoFix node-daemon-setup test with older pyOpenSSL
Michael Hanselmann [Thu, 6 Dec 2012 15:43:53 +0000 (16:43 +0100)]
Fix node-daemon-setup test with older pyOpenSSL

Older versions use “-----BEGIN RSA PRIVATE KEY-----” instead of
“-----BEGIN PRIVATE KEY-----”.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd tool to clean up node
Michael Hanselmann [Wed, 5 Dec 2012 15:02:11 +0000 (16:02 +0100)]
Add tool to clean up node

Sometimes a node is not removed properly from a cluster (especially
during development). This new tool stops all daemons and removes (after
making copies) the most critical files.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoSwitch from scp/ssh to node daemon setup utility
Michael Hanselmann [Fri, 30 Nov 2012 10:34:39 +0000 (11:34 +0100)]
Switch from scp/ssh to node daemon setup utility

This patch does away with many calls to scp and by means of using
“tools/node-daemon-setup”, verifies most of the values before writing
them to files.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd tool to configure node daemon
Michael Hanselmann [Tue, 27 Nov 2012 10:43:57 +0000 (11:43 +0100)]
Add tool to configure node daemon

The design for this is in “doc/design-node-add.rst”. The tool receives a
JSON data structure on stdin and configures the node's daemon after
verifying the received values.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agomake genMaybe more Just
Guido Trotter [Thu, 6 Dec 2012 11:32:16 +0000 (12:32 +0100)]
make genMaybe more Just

There is a common conception that Just something is more worth than
Nothing. So we're biasing our tests towards that. As such let's generate
Nothing fewer times, and Just subgen more times. The values were copied
from the "official" maybe generator.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoLocking related fixes for networks
Dimitris Aragiorgis [Wed, 5 Dec 2012 16:28:14 +0000 (18:28 +0200)]
Locking related fixes for networks

Use GetNetwork() only when having already aquired the lock,
i.e. in CheckPrereq().

In LUNetworkConnect/Disconnect do not include Network info in Hooks
environment, so that network locking can be avoided if conflicts
are not checked.

Invoke _CheckNodeGroupInstances() only in case of conflicts check,
because otherwise owned instances are None, which results to an error.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoFix build breakage in Jobs.hs test code
Iustin Pop [Thu, 6 Dec 2012 08:58:21 +0000 (09:58 +0100)]
Fix build breakage in Jobs.hs test code

Commit 3bdbe4b3 (“Jobs.hs: move OpStatus and JobStatus ADTs to
Types.hs”) removed the TemplateHaskell language pragma from
htest/Test/Ganeti/Jobs.hs due to a hlint warning, but that is bad: it
means the testSuite call is no longer interpreted as a splice, so it results in:

  Parse error: naked expression at top level

With newer GHCs. To fix this, we restore the pragma, and add an hlint
ignore.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoconfigure.ac: fix reading of HLINT environment variable
Dato Simó [Wed, 5 Dec 2012 15:16:02 +0000 (15:16 +0000)]
configure.ac: fix reading of HLINT environment variable

configure.ac advertised that the HLINT environment variable could be set to
specify the path to the 'hlint' tool. However, HLINT was being initialized
to "no" inside configure.ac, which broke this usage.

Signed-off-by: Dato Simó <dato@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoHbal.hs: move job execution functions to Jobs.hs
Dato Simó [Tue, 20 Nov 2012 14:54:11 +0000 (14:54 +0000)]
Hbal.hs: move job execution functions to Jobs.hs

Ganeti.Jobs now holds functions that can be used to submit and monitor the
status of jobs. In particular, execJobsWait and waitForJobs are factored
out of Hbal.hs.

Signed-off-by: Dato Simó <dato@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoHbal.hs: use Result (), not Bool, as return value for exec*
Dato Simó [Wed, 7 Nov 2012 19:40:01 +0000 (19:40 +0000)]
Hbal.hs: use Result (), not Bool, as return value for exec*

Previously, functions in Hbal.hs related to execution of jobsets were
returning only IO Bool, and printing any errors they found directly to
stderr on their own.

I'm going to be moving some of these functions to a library module in
future commits, and it makes sense that they won't print to stderr, but
rather return an error condition. To make diffs more readable, I change the
return value in Hbal.hs itself, so that the next commit deals only with the
move. It's now `main` that prints any Bad result to stderr.

Signed-off-by: Dato Simó <dato@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoHbal.hs: rename functions that deal with early termination
Dato Simó [Thu, 15 Nov 2012 12:45:48 +0000 (12:45 +0000)]
Hbal.hs: rename functions that deal with early termination

In Hbal.hs, it's easy to get lost in the flow of exec* functions
because their names are similar and don't convey their different
purposes (e.g. runJobSet, execJobSet, execWrapper).

This patch renames 'runJobSet' to 'execWithCancel', and 'execWrapper'
to 'execCancelWrapper', since these two functions deal, in particular,
with early termination when the user presses ^C.

Signed-off-by: Dato Simó <dato@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoHbal.hs: fix typo in signal handler names (hangle -> handle)
Dato Simó [Wed, 7 Nov 2012 17:38:01 +0000 (17:38 +0000)]
Hbal.hs: fix typo in signal handler names (hangle -> handle)

'hangleSigInt' and 'hangleSigTerm' are renamed to 'handleSigInt' and
'handleSigTerm', respectively.

Signed-off-by: Dato Simó <dato@google.com>
Reviewed-by: Michele Tartara <mtartara@google.com>

11 years agoJobs.hs: move OpStatus and JobStatus ADTs to Types.hs
Dato Simó [Tue, 20 Nov 2012 14:34:48 +0000 (14:34 +0000)]
Jobs.hs: move OpStatus and JobStatus ADTs to Types.hs

This leaves Ganeti/Jobs.hs and Test/Ganeti/Jobs.hs empty, but they're the
target of a future move of some functions, so we leave them around, and
don't delete them, to avoid unnecessary delete/create diffs.

Signed-off-by: Dato Simó <dato@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoMakefile: Reset environment for epydoc
Michael Hanselmann [Wed, 5 Dec 2012 16:41:54 +0000 (17:41 +0100)]
Makefile: Reset environment for epydoc

epydoc allows overriding configuration values via environment variables.
While this might be useful in certain use cases, but as no prefix
whatsoever is used, conflicts are easily created. Some people have the
environment variable “NAME” set, effectively overriding the project name
set in epydoc.conf. A bug in epydoc causes an error if non-ASCII
characters, such as German umlauts, are used in NAME.

$ NAME=Täscht make py-apidoc
[…]
UNEXPECTED ERROR:
'ascii' codec can't decode byte 0xc3 in position 73: ordinal not in range(128)

$ parse=false make py-apidoc
[…]
epydoc: error: Invalid option combination: --parse-only and --introspect-only.

This patch changes the call in Makefile to reset the environment given
to epydoc save for PATH and PYTHONPATH.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agojqueue: Don't modify input opcode when changing priority
Michael Hanselmann [Wed, 5 Dec 2012 12:42:45 +0000 (13:42 +0100)]
jqueue: Don't modify input opcode when changing priority

Commit 4679547 implemented the ability to change job's priority after it
was submitted. The code contained a bug whereby it would modify the
input data for an opcode, something the job queue shouldn't do (logical
units do for historical reasons).

This patch removes the line modifying the opcode input and adjusts the
tests.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoUse new util function for mac_prefix validation
Dimitris Aragiorgis [Wed, 5 Dec 2012 14:08:10 +0000 (16:08 +0200)]
Use new util function for mac_prefix validation

Use new NormalizeAndValidateThreeOctetMacPrefix() util function in
LUNetworkAdd/LUNetworkSetParams to validate network's MAC prefix.
Additionally, move the check in CheckArguments() in the case of
LUNetworkAdd.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoLUClusterRedistConf: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:41:15 +0000 (04:41 +0100)]
LUClusterRedistConf: Use node allocation lock

All node locks are acquired.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoLUClusterRepairDiskSizes: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:40:17 +0000 (04:40 +0100)]
LUClusterRepairDiskSizes: Use node allocation lock

This opcode acquires all node resource locks, which conflicts with
instance allocations.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoLUGroupVerifyDisks: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:39:46 +0000 (04:39 +0100)]
LUGroupVerifyDisks: Use node allocation lock

See comment in code.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoLUClusterVerifyGroup: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:39:20 +0000 (04:39 +0100)]
LUClusterVerifyGroup: Use node allocation lock

See comment in code.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoLUInstanceReplaceDisks: Acquire node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 01:47:13 +0000 (02:47 +0100)]
LUInstanceReplaceDisks: Acquire node allocation lock

If the lock was acquired in the first place (only when an iallocator is
used), it is released as soon as possible.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoLUInstanceChangeGroup: Acquire node allocation lock
Michael Hanselmann [Thu, 22 Nov 2012 23:08:32 +0000 (00:08 +0100)]
LUInstanceChangeGroup: Acquire node allocation lock

Changing instances' groups shouldn't conflict with instance allocations.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoAcquire node allocation lock during node query
Michael Hanselmann [Thu, 22 Nov 2012 22:29:07 +0000 (23:29 +0100)]
Acquire node allocation lock during node query

If locking is used (usually by ganeti-watcher), node allocations must be
temporarily blocked.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoMention dsh/cssh in man page for "gnt-cluster command"
Michael Hanselmann [Wed, 5 Dec 2012 10:36:22 +0000 (11:36 +0100)]
Mention dsh/cssh in man page for "gnt-cluster command"

Until now they are only mentioned in “doc/admin.rst” and the man page
for “ganeti-listrunner”.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoiallocator: Add node whitelist
Michael Hanselmann [Fri, 23 Nov 2012 01:56:04 +0000 (02:56 +0100)]
iallocator: Add node whitelist

In the future instance creations might have a lock on all nodes as was
the case until the implementation of opportunistic locking. Nodes for
which the lock is not held will be shown to the iallocator plugin as if
they were marked offline.

This patch adds a new parameter named “node_whitelist” to
“IAReqInstanceAlloc”. If set to a list, only nodes contained within are
shown as online.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoAllow ignoring successful commands in "gnt-cluster command"
Michael Hanselmann [Tue, 4 Dec 2012 17:10:15 +0000 (18:10 +0100)]
Allow ignoring successful commands in "gnt-cluster command"

In some cases it is useful to ignore the output of and avoid mentioning
successful commands. One would be when looking for a certain string in
a file:

  $ gnt-cluster command egrep -q '^testing$' /etc/...

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

11 years agoAdd "proper coloring" unittest check
Guido Trotter [Mon, 3 Dec 2012 13:13:34 +0000 (14:13 +0100)]
Add "proper coloring" unittest check

We have to check that for each edge its vertices have different colors.

This is very easy to do with a vertex-to-color map, but not so easy with
a color-to-vertex one. Since all our coloring algorithms created a
vertex-to-color map behind the scenes and then converted it, we flip
them back to returning it directly, and do the conversion explicitly
where we need it (which for now is everywhere except when testing this
property).

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoFix Dsatur and add Dcolor
Guido Trotter [Mon, 3 Dec 2012 08:25:32 +0000 (09:25 +0100)]
Fix Dsatur and add Dcolor

Our Dsatur implementation was incorrect: while the paper defined the
degree of saturation of a vertex as the number of different colors it is
adjacent to, we were using the number of colors, without considering
uniqueness. This effectively implemented a different algorithm, which is
very similar to the previous one, and while it performs slightly worse
on average it still beats Dsatur on some cases.

So we refactor the implementation to effectively support both algorithms
without code duplication, and then we export both the old algorithms as
"Dcolor" and the new one as "Dsatur". Since these are all fast
algorithms in hroller we will still be able to pick the best result.

Note that the new Dsatur implementation uses an IntSet to calculate the
uniqueness. Results with nub + length on a list were significantly
slower.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoHTools/Node: add mkNodeGraph function
Guido Trotter [Sat, 1 Dec 2012 09:45:02 +0000 (10:45 +0100)]
HTools/Node: add mkNodeGraph function

This function helps treating node node problems as graph problems.
It can transform a list of nodes plus a list of instances into a graph
which uses the nodes as vertices, and instances as edges connecting them
(as long as they have both a primary and a secondary node)

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd tests for verticesByDegree{Asc,Desc}
Guido Trotter [Thu, 29 Nov 2012 08:57:59 +0000 (09:57 +0100)]
Add tests for verticesByDegree{Asc,Desc}

This brings our coverage of Graph.hs to 100%

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoGaneti/HTools/Graph Add isColorable
Guido Trotter [Wed, 28 Nov 2012 09:28:53 +0000 (10:28 +0100)]
Ganeti/HTools/Graph Add isColorable

Check whether coloring on a given graph makes sense. This is the case
only if there are no loops and the graph is undirected.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd Dsatur implementation
Guido Trotter [Fri, 30 Nov 2012 17:15:29 +0000 (18:15 +0100)]
Add Dsatur implementation

Implement the Dsatur algorithm for Graph coloring. This also abstracts
the neighColors function into two subfunctions that this algorithm can
reuse.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd Ganeti.HTools.Graph
Guido Trotter [Sat, 24 Nov 2012 10:47:05 +0000 (11:47 +0100)]
Add Ganeti.HTools.Graph

This module implements some algorithms on Data.Graph data structures.
At the moment its main functionality is an LF-color implementation
(greedy coloring in descending order of degree). There are also a few
extra functions to calculate the degree order, and convert the node to
color mapping to color to nodes.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoerrors: Show error descriptions in API documentation
Michael Hanselmann [Tue, 4 Dec 2012 15:06:23 +0000 (16:06 +0100)]
errors: Show error descriptions in API documentation

Comments with a colon after the hash sign (“#:”) show up in the
epydoc output.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoSmall improvement to rpc-test
Iustin Pop [Fri, 30 Nov 2012 00:30:18 +0000 (01:30 +0100)]
Small improvement to rpc-test

This will show smaller/better error messages: full node dumps are no
longer included.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFix locking mistake introduced in commit 5cc1f88
Michael Hanselmann [Tue, 4 Dec 2012 12:38:55 +0000 (13:38 +0100)]
Fix locking mistake introduced in commit 5cc1f88

The node resource locks were not set correctly on instance import.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoSwitch luxi submit job calls to use MetaOpCode
Iustin Pop [Mon, 3 Dec 2012 11:22:00 +0000 (12:22 +0100)]
Switch luxi submit job calls to use MetaOpCode

This patch changes the luxi submit job calls to use wrapped opcodes,
and therefore it changes Hbal to submit actual meta opcodes. For
nicety, hbal also submits a comment now, showing who generated the
job.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agohbal: restore nice job ID display
Iustin Pop [Mon, 3 Dec 2012 11:41:15 +0000 (12:41 +0100)]
hbal: restore nice job ID display

This fixes:

  Got job IDs JobId {fromJobId = 1052613}

And restores to:

  Got job IDs 1052624

Other improvements could be done here, of course.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd safety check on job dependency/TIsLength
Iustin Pop [Mon, 3 Dec 2012 10:59:52 +0000 (11:59 +0100)]
Add safety check on job dependency/TIsLength

If TIsLength is applied to a non-container item, it will fail (type
error) due to invalid application of len(). Since this can happen on
user-supplied data, we add an explicit TList/TTuple check (the TTuple
test is a new one).

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd CommonOpParams and MetaOpCode types
Iustin Pop [Mon, 3 Dec 2012 10:30:12 +0000 (11:30 +0100)]
Add CommonOpParams and MetaOpCode types

This patch adds the "meta" opcode type and the common op
params. Compatibility tests with Python are changed to pass Meta
opcodes.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoRemove unused THH function 'saveLuxiField'
Iustin Pop [Mon, 3 Dec 2012 10:19:39 +0000 (11:19 +0100)]
Remove unused THH function 'saveLuxiField'

This was deprecated via commit 88609f00, “Switch Luxi TH code from
simple to custom fields”.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoChange opcode/luxi showJSON generation in THH
Iustin Pop [Tue, 4 Dec 2012 09:55:02 +0000 (10:55 +0100)]
Change opcode/luxi showJSON generation in THH

Currently, the opcode and luxi "showJSON" functions generate directly
a JSValue; in contrast, the object (single-constructor) types generate
a 'toDict' function, and then `showJSON = makeObj . toDict`. This is
useful, as the 'dict' form can be manipulated if needed.

This patch changes the opcode and luxi types to behave the same; we
generate a dict, and then (since this differs between opcodes and
luxi) generate showJSON either as `makeObj . toDict` (for opcodes), or
(for luxi) `showJSON . map sn . toDict`.

The change is needed for MetaOpCode implementation.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd a type alias for simpler THH signatures
Iustin Pop [Mon, 3 Dec 2012 09:41:13 +0000 (10:41 +0100)]
Add a type alias for simpler THH signatures

This is reused in more than just a few places, so adding it makes the
signatures much nicer.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd types and parameters for common opcode implementation
Iustin Pop [Mon, 3 Dec 2012 09:17:32 +0000 (10:17 +0100)]
Add types and parameters for common opcode implementation

This will go into a separate type; this patch adds the needed
underlying types and parameters.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd a negative type
Iustin Pop [Wed, 28 Nov 2012 08:33:06 +0000 (09:33 +0100)]
Add a negative type

This mirrors the positive one, and will be needed for relative job
IDs.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd a 'real' type for JobIds
Iustin Pop [Tue, 27 Nov 2012 15:45:39 +0000 (16:45 +0100)]
Add a 'real' type for JobIds

Currently, the job ID is a simple type alias. This is suboptimal, as
it means we can't use a custom JSON (or Arbitrary) instance for it.

The patch changes it into a newtype, and then a) simplifies some
deserialisation code and b) changes some more fields to this new type
(rather than plain 'Int').

We also move the JobId to types, since it will be needed in opcodes as
well.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd type for finalised job statuses
Iustin Pop [Tue, 27 Nov 2012 14:57:24 +0000 (15:57 +0100)]
Add type for finalised job statuses

For now, we don't need a pending job status type as well, so we'll
delay adding that until later.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd test for opcode fields equivalence
Iustin Pop [Mon, 26 Nov 2012 15:55:26 +0000 (16:55 +0100)]
Add test for opcode fields equivalence

As opposed to the existing test, which tests the type/serialisation of
fields, this one simply tests the equivalence of the list of fields
for each opcode.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFix Haskell OpNetworkAdd
Iustin Pop [Mon, 3 Dec 2012 12:53:01 +0000 (13:53 +0100)]
Fix Haskell OpNetworkAdd

Commit 213076f (“Fix locking in networks”) changed Python OpNetworkAdd
without corresponding Haskell definition changes.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd a few missing fields from opcodes
Iustin Pop [Mon, 26 Nov 2012 15:50:02 +0000 (16:50 +0100)]
Add a few missing fields from opcodes

Due to manual conversion, a few fields were missing from the
conversion, but as they were optional our type equivalence checking
didn't detect this.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoRework/enhance original htools opcodes
Iustin Pop [Mon, 26 Nov 2012 15:44:56 +0000 (16:44 +0100)]
Rework/enhance original htools opcodes

The original htools opcodes were minimalistic and not 1:1 equivalent
with the Python ones. Let's add all missing fields and, since we
changed the order, switch to more readable record syntax for building
the opcodes.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd a function for all fields of a given OP_ID
Iustin Pop [Mon, 26 Nov 2012 13:38:35 +0000 (14:38 +0100)]
Add a function for all fields of a given OP_ID

This patch changes THH to export a new function which defines all
fields of a given OP_ID. Not very clean, since for an invalid OP_ID we
return empty list, but since it will only be used in tests it should
be good enough.

The generated code looks as follows:

    allOpFields :: String -> [String]
    allOpFields "OP_TEST_DELAY"
                  = ["duration", "on_master", "on_nodes", "repeat"]
    allOpFields "OP_INSTANCE_REPLACE_DISKS"
                  = ["disks", "early_release", "iallocator", "ignore_ipolicy",
                     "instance_name", "mode", "remote_node"]
    …
    allOpFields _ = []

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoRework custom fields handling
Iustin Pop [Mon, 26 Nov 2012 13:16:13 +0000 (14:16 +0100)]
Rework custom fields handling

This patch changes a bit the handling of custom fields. Since in
general we use custom fields to aggregate multiple entries in the JSON
object into a safer data-type, we should also have a way to declare
which extra entries this field covers (so that in the future we can
say what are all the JSON keys for an object).

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoTwo small haskell-related Makefile improvements
Iustin Pop [Mon, 3 Dec 2012 20:26:46 +0000 (21:26 +0100)]
Two small haskell-related Makefile improvements

Just some cleanup:

- don't run hlint over hpc-htools, since it's just a symlink to
  htools.hs (so we'd get duplicate warnings)
- build rpc-test in make really-all, via HS_ALL_PROGS variable

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFix long lines in Ganeti.HTools.Types and add Make check
Iustin Pop [Mon, 3 Dec 2012 20:20:00 +0000 (21:20 +0100)]
Fix long lines in Ganeti.HTools.Types and add Make check

Since hlint doesn't check style issues but rather code only issues,
let's add a simple Makefile check for too-long lines, and fix the
single bad case we have currently.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoSmall Makefile.am cleanups
Iustin Pop [Mon, 3 Dec 2012 20:13:14 +0000 (21:13 +0100)]
Small Makefile.am cleanups

Indentation within rules is fixed to always be 2 spaces (as opposed to
mixed tabs/2 spaces/4 spaces). Additionally, the check-dirs rule,
which was more complex than necessary, has been simplified: moved
auto4mte.cache to DIRCHECK_EXCLUDE, and simplify the find call and the
exit condition (no need for if test …; then exit 0; else exit 1; fi).

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFix generation of clusters via 'genEmptyCluster'
Iustin Pop [Mon, 3 Dec 2012 12:28:12 +0000 (13:28 +0100)]
Fix generation of clusters via 'genEmptyCluster'

The current uniqueness algorithm (generate random node names, suffix
them with node index) is actually wrong: a node named "21" at index 5
will end up with the same name as a node named "2" at position 15.

To fix this, we also add a character from a different "set" ("-"), so
that such mixups can't happen again, and also add an explicit check
for it.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoLUClusterSetParams: Use node allocation lock
Michael Hanselmann [Fri, 23 Nov 2012 03:40:58 +0000 (04:40 +0100)]
LUClusterSetParams: Use node allocation lock

All resources are acquired and opportunistic instance creations would
fail. Also add a TODO.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoLUInstanceCreate: Acquire node allocation lock
Michael Hanselmann [Thu, 22 Nov 2012 17:56:26 +0000 (18:56 +0100)]
LUInstanceCreate: Acquire node allocation lock

Opportunistic locks are not yet used. This patch changes
LUInstanceCreate to acquire the node allocation lock to avoid conflicts
with other opcodes acquiring many node locks.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAcquire node allocation lock for failover/migration
Michael Hanselmann [Fri, 23 Nov 2012 01:46:16 +0000 (02:46 +0100)]
Acquire node allocation lock for failover/migration

See code for an explanatory comment. The lock is released as soon as
possible.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoUse GetMultiInstanceInfo in LUNetwork* opcodes
Dimitris Aragiorgis [Fri, 30 Nov 2012 15:45:05 +0000 (17:45 +0200)]
Use GetMultiInstanceInfo in LUNetwork* opcodes

LUNetworkConnect/Disconnect looks up a nodegroup's instances for
conflicting IPs. To do so, use GetNodeGroupInstances() and
GetMulitInstanceInfo().

Additionally, check if the correct locks were acquired.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoutils.text: Function to verify MAC address prefix
Michael Hanselmann [Mon, 3 Dec 2012 16:08:42 +0000 (17:08 +0100)]
utils.text: Function to verify MAC address prefix

The network management code needs to verify a MAC address prefix.
Instead of (ab)using NormalizeAndValidateMac, clean code should be used.
Unit tests for NormalizeAndValidateMac are updated and new ones for
NormalizeAndValidateThreeOctetMacPrefix are added.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoImprove the Haskell api doc directory creation system
Michele Tartara [Mon, 3 Dec 2012 17:03:11 +0000 (18:03 +0100)]
Improve the Haskell api doc directory creation system

Instead of having two different lists of directories, now there is only one.

Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFactorize code for checking node daemon certificate
Michael Hanselmann [Wed, 28 Nov 2012 11:17:27 +0000 (12:17 +0100)]
Factorize code for checking node daemon certificate

This code is going to be used by a new utility for setting up the node
daemon. Unit tests are updated/added.

Additionally, the certificate and key stored in “server.pem” are
verified, too.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoSupport opportunistic locks in mcpu/LUs
Michael Hanselmann [Thu, 22 Nov 2012 17:37:15 +0000 (18:37 +0100)]
Support opportunistic locks in mcpu/LUs

Similar to “share_locks”, a new dictionary containing booleans for each
locking level is added to “cmdlib.LogicalUnit”. Logical units wanting to
make use of opportunistic locks will be able to configure this
dictionary accordingly.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd opportunistic locking to GanetiLockManager
Michael Hanselmann [Thu, 22 Nov 2012 17:44:33 +0000 (18:44 +0100)]
Add opportunistic locking to GanetiLockManager

Just forwarding the parameter, nothing more.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agolocking: Implement opportunistic locking in LockSet
Michael Hanselmann [Mon, 19 Nov 2012 20:59:47 +0000 (21:59 +0100)]
locking: Implement opportunistic locking in LockSet

This patch adds a new parameter to “LockSet.acquire” named
“opportunistic”. When enabled the lockset will try to acquire as many
locks as possible, but it won't wait for them (with the exception of the
lockset-internal lock in case the whole set is acquired). This is
implemented by using a timeout of 0 seconds when acquiring individual
locks. Commit 03c5291 made such acquisitions significantly cheaper.

The most complicated code included in this patch is probably the helper
function used to determine which mode to use and which timeout functions
are needed.

Full unit tests are included for the new and changed code
(“locking.py”'s overall coverage is at 97%).

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd ssconf function to read all files
Michael Hanselmann [Fri, 30 Nov 2012 10:41:48 +0000 (11:41 +0100)]
Add ssconf function to read all files

Configuring a node daemon on a newly added node will need all ssconf
values.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agobootstrap.RunNodeSetupCmd: Add IPv6 support
Michael Hanselmann [Fri, 30 Nov 2012 10:36:40 +0000 (11:36 +0100)]
bootstrap.RunNodeSetupCmd: Add IPv6 support

Commit 224ff0f modified the node SSH setup to use the system's SSH
client. Before that Paramiko was used. It's not entirely clear whehter
the latter ever supported IPv6 properly, but with this patch
“bootstrap.RunNodeSetupCmd” is changed to use it if configured. The code
for doing so is taken from “bootstrap.SetupNodeDaemon”, which is going
to use “bootstrap.RunNodeSetupCmd”.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFactorize running node setup command
Michael Hanselmann [Fri, 30 Nov 2012 09:30:25 +0000 (10:30 +0100)]
Factorize running node setup command

Part of the code used for running “prepare-node-join” can be re-used for
running a tool to configure the node daemon.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agossconf: Add dry-run support for writing files
Michael Hanselmann [Thu, 29 Nov 2012 07:27:01 +0000 (08:27 +0100)]
ssconf: Add dry-run support for writing files

A new utility for configuring the node daemon will support a dry-run
mode. This patch adds the necessary functionality to
“ssconf.SimpleStore” and provides comprehensive tests for
“SimpleStore.WriteFiles”. To enable the latter, a testing-only parameter
specifying the lockfile was added to the class.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agossconf: Add function to verify keys
Michael Hanselmann [Wed, 28 Nov 2012 12:11:08 +0000 (13:11 +0100)]
ssconf: Add function to verify keys

The new utility for configuring the node daemon will have to check
whether it received valid ssconf names.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoDesign for opportunistic locking
Michael Hanselmann [Fri, 30 Nov 2012 08:12:12 +0000 (09:12 +0100)]
Design for opportunistic locking

Add the design document for opportunistic locking.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoFix variable names in Loader.assignIndices
Guido Trotter [Sat, 1 Dec 2012 07:43:32 +0000 (08:43 +0100)]
Fix variable names in Loader.assignIndices

This function can be applied to any type of class "Element" but its
internal variables used to refer to a list of tuples containing these
elements and their names as "nodes". Moreover it built a list of name to
indices tuples referring to it as "na" (which is not very clear).

Thus nodes becomes name_element, and na name_idx.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoLUNetworkAdd: Log warning when needed
Dimitris Aragiorgis [Fri, 30 Nov 2012 15:45:08 +0000 (17:45 +0200)]
LUNetworkAdd: Log warning when needed

In case conflicts are checked, log warnings if nodes' IPs cannot
be reserved.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoUse constants.IP4_VERSION in LUNetworkAdd
Dimitris Aragiorgis [Fri, 30 Nov 2012 15:45:07 +0000 (17:45 +0200)]
Use constants.IP4_VERSION in LUNetworkAdd

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoFix locking in networks
Dimitris Aragiorgis [Fri, 30 Nov 2012 15:45:04 +0000 (17:45 +0200)]
Fix locking in networks

Ensure that locks are held only if needed.

Add conflicts_check in OpNetworkAdd. This is needed if we want to
check whether nodes/master IPs are included in network.

Depending on conflicts_check value, we have to hold node/instance locks
during OpNetworkAdd/OpNetworkConnect or not.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>

11 years agoAdd unit tests for the JSON serialization of DRBD status
Michele Tartara [Mon, 26 Nov 2012 08:37:39 +0000 (09:37 +0100)]
Add unit tests for the JSON serialization of DRBD status

The serialization itself is done by Text.JSON, so the tests deal with checking
that Text.JSON objects are created correctly from the DRBD parser data
structures.

Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd JSON serialization capabilities for DRBD status
Michele Tartara [Mon, 3 Dec 2012 08:45:30 +0000 (09:45 +0100)]
Add JSON serialization capabilities for DRBD status

The serialized JSON is not a 1:1 dump of the data structures
populated by the parser. This is done intentionally, with the
aim of producing a more stable and more meaningful output to
be used by the (future) monitoring agent and stand-alone data
collectors.

Also:
* shorten the names of some data types.
* change data type for the fields of the Time data structure

Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd two support functions for building JSON objects
Michele Tartara [Mon, 3 Dec 2012 08:31:04 +0000 (09:31 +0100)]
Add two support functions for building JSON objects

The new support functions in module Ganeti.JSON will be used by the next
commits to build JSON objects with optional (Maybe) fields, excluding
them when they contain Nothing.

Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoReduce hostname length in tests and opcode py_compat count
Iustin Pop [Mon, 3 Dec 2012 08:54:59 +0000 (09:54 +0100)]
Reduce hostname length in tests and opcode py_compat count

This improves Issue 325 - new runtime and memory consumption is about
1/10 compared to before.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

11 years agoAdd generator for an instance on a node list
Guido Trotter [Fri, 30 Nov 2012 11:19:46 +0000 (12:19 +0100)]
Add generator for an instance on a node list

Given a node list in input, we get an instance that had nodes in it.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd generator for list of arbitrary instances
Guido Trotter [Fri, 30 Nov 2012 08:17:19 +0000 (09:17 +0100)]
Add generator for list of arbitrary instances

This takes an instance generator and produces a possibly empty list of
instances.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoAdd generator for list of arbitrary nodes
Guido Trotter [Thu, 29 Nov 2012 17:23:28 +0000 (18:23 +0100)]
Add generator for list of arbitrary nodes

This generates a minimum of one node, because legal clusters never have
zero nodes.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

11 years agoFix options in hbal manpage
Guido Trotter [Sat, 1 Dec 2012 10:39:26 +0000 (11:39 +0100)]
Fix options in hbal manpage

hbal doesn't have any "-o" option, but on the other hand supports -S
(described below, but not present in the short summary)

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>