Documentation and pool manager configuration changes

* Add options to pool manager
* Add required options tester
* Improve api_server multi option handling
* Make option names more sensible
* Document options
* Fix documentation errors

Change-Id: I7a175b23ba3cf8fa40dea746901f260981e3af4c
This commit is contained in:
Andrew Hutchings 2012-11-06 12:36:40 +00:00
parent 8c24bdcb0b
commit f69fd0f4cf
5 changed files with 143 additions and 14 deletions

View File

@ -30,7 +30,9 @@ Global Section
The ``[global]`` section contains options common to the various Libra The ``[global]`` section contains options common to the various Libra
utilities (worker, mgm, etc). This section is read before any other utilities (worker, mgm, etc). This section is read before any other
section, so values may be overridden by the other sections:: section, so values may be overridden by the other sections:
.. code-block:: ini
[global] [global]
verbose = true verbose = true
@ -70,11 +72,11 @@ Pool Manager Section
nova_region = region nova_region = region
nova_keyname = default nova_keyname = default
nova_secgroup = default nova_secgroup = default
haproxy_image = 12345 nova_image = 12345
api_servers = 10.0.0.1:8889 10.0.0.2:8889 nova_image_size = 102
api_server = 10.0.0.1:8889 10.0.0.2:8889
nodes = 10 nodes = 10
check_interval = 5 check_interval = 5
image_size = 102
Worker Command Line Options Worker Command Line Options
@ -147,16 +149,34 @@ Pool Manager Command Line Options
--------------------------------- ---------------------------------
.. program:: libra_pool_mgm.py .. program:: libra_pool_mgm.py
.. option:: --api_server <HOST:PORT>
The hostname/IP and port colon separated for use with the HP REST API
driver. Can be specified multiple times for multiple servers
.. option:: -c <FILE>, --config <FILE> .. option:: -c <FILE>, --config <FILE>
Load options from the specified configuration file. Command line Load options from the specified configuration file. Command line
options will take precedence over any options specified in the options will take precedence over any options specified in the
configuration file. configuration file.
.. option:: --check_interval <CHECK_INTERVAL>
How often to check the API server to see if noew nodes are needed
(in value is minutes)
.. option:: -d, --debug .. option:: -d, --debug
Enable debugging output. Enable debugging output.
.. option:: --driver <DRIVER>
API driver to use. Valid driver options are:
* *hp_rest* - HP REST API, talks to the HP Cloud API server (based
on Atlas API)
This is the default driver.
.. option:: --group <GROUP> .. option:: --group <GROUP>
Specifies the group for the process when run in daemon mode. Specifies the group for the process when run in daemon mode.
@ -176,6 +196,43 @@ Pool Manager Command Line Options
Do not run as a daemon. This option is useful for debugging purposes Do not run as a daemon. This option is useful for debugging purposes
only as the worker is intended to be run as a daemon normally. only as the worker is intended to be run as a daemon normally.
.. option:: --nodes <NODES>
The size of the pool of spare nodes the pool manager should keep.
.. option:: --nova_auth_url <NOVA_AUTH_URL>
The URL used to authenticate for the Nova API
.. option:: --nova_user <NOVA_USER>
The username to autenticate for the Nova API
.. option:: --nova_tenant <NOVA_TENANT>
The tenant to use for the Nova API
.. option:: --nova_region <NOVA_REGION>
The region to use for the Nova API
.. option:: --nova_keyname <NOVA_KEYNAME>
The key name to use when spinning up nodes in the Nova API
.. option:: --nova_secgroup <NOVA_SECGROUP>
The security group to use when spinning up nodes in the Nova API
.. option:: --nova_image <NOVA_IMAGE>
The image ID to use on new nodes spun up in the Nova API
.. option:: --nova_image_size <NOVA_IMAGE_SIZE>
The flavor ID (image size ID) to use for new nodes spun up in the Nova
API
.. option:: -p <PID>, --pid <PID> .. option:: -p <PID>, --pid <PID>
Name of the PID file to use. Default is: Name of the PID file to use. Default is:

View File

@ -15,7 +15,10 @@ Gearman Task
Server Class Server Class
------------ ------------
.. py:module:: libra.worker.worker ..
Commenting out this because it causes error, should fall through from
previous usage
.. py:module:: libra.worker.worker
.. py:class:: Server(logger, servers, reconnect_sleep) .. py:class:: Server(logger, servers, reconnect_sleep)
@ -85,8 +88,10 @@ LoadBalancerDriver Class
Known Load Balancer Drivers Dictionary Known Load Balancer Drivers Dictionary
-------------------------------------- --------------------------------------
..
.. py:module:: libra.worker.drivers Commenting out this because it causes error, should fall through from
previous usage
.. py:module:: libra.worker.drivers
.. py:data:: known_drivers .. py:data:: known_drivers

View File

@ -44,9 +44,8 @@ nova_tenant = tenant
nova_region = region nova_region = region
nova_keyname = default nova_keyname = default
nova_secgroup = default nova_secgroup = default
haproxy_image = 12345 nova_image = 12345
api_servers = 10.0.0.1:8889 10.0.0.2:8889 nova_image_size = 102
api_server = 10.0.0.1:8889 10.0.0.2:8889
nodes = 10 nodes = 10
check_interval = 5 check_interval = 5
# 100 - xsmall, 101 - small, 102 - medium
image_size = 102

View File

@ -25,7 +25,6 @@ API_VERSION = 'v1'
class HPRestDriver(MgmDriver): class HPRestDriver(MgmDriver):
def __init__(self, addresses, logger): def __init__(self, addresses, logger):
addresses = addresses.split(' ')
self.logger = logger self.logger = logger
random.shuffle(addresses) random.shuffle(addresses)
for address in addresses: for address in addresses:

View File

@ -19,6 +19,7 @@ import pwd
import signal import signal
import time import time
import sys import sys
import os
import threading import threading
from libra.openstack.common import importutils from libra.openstack.common import importutils
@ -53,6 +54,9 @@ class Server(object):
'Scheduling node check for {check} minutes' 'Scheduling node check for {check} minutes'
.format(check=self.args.check_interval) .format(check=self.args.check_interval)
) )
# NOTE(LinuxJedi): Threading lock is for the case in the future where
# we need two timers, we don't want them to both execute their trigger
# at the same time.
self.rlock = threading.RLock() self.rlock = threading.RLock()
self.check_nodes() self.check_nodes()
while True: while True:
@ -62,7 +66,7 @@ class Server(object):
""" check if known nodes are used """ """ check if known nodes are used """
with self.rlock: with self.rlock:
self.logger.info('Checking if new nodes are needed') self.logger.info('Checking if new nodes are needed')
api = self.driver_class(self.args.api_servers, self.logger) api = self.driver_class(self.args.api_server, self.logger)
if api.is_online(): if api.is_online():
self.logger.info( self.logger.info(
'Connected to {url}'.format(url=api.get_url()) 'Connected to {url}'.format(url=api.get_url())
@ -143,6 +147,10 @@ class Server(object):
def main(): def main():
options = Options('mgm', 'Node Management Daemon') options = Options('mgm', 'Node Management Daemon')
options.parser.add_argument(
'--api_server', action='append', metavar='HOST:POST',
help='a list of API servers to connect to (for HP REST API driver)'
)
options.parser.add_argument( options.parser.add_argument(
'--nodes', type=int, default=1, '--nodes', type=int, default=1,
help='number of nodes' help='number of nodes'
@ -156,8 +164,69 @@ def main():
choices=known_drivers.keys(), default='hp_rest', choices=known_drivers.keys(), default='hp_rest',
help='type of device to use' help='type of device to use'
) )
options.parser.add_argument(
'--nova_auth_url',
help='the auth URL for the Nova API'
)
options.parser.add_argument(
'--nova_user',
help='the username for the Nova API'
)
options.parser.add_argument(
'--nova_region',
help='the region to use for the Nova API'
)
options.parser.add_argument(
'--nova_tenant',
help='the tenant for the Nova API'
)
options.parser.add_argument(
'--nova_keyname',
help='the key name for new nodes spun up in the Nova API'
)
options.parser.add_argument(
'--nova_secgroup',
help='the security group for new nodes spun up in the Nova API'
)
options.parser.add_argument(
'--nova_image',
help='the image ID to use for new nodes spun up in the Nova API'
)
options.parser.add_argument(
'--nova_image_size',
help='the image size ID (flavor ID) to use for new nodes spun up in'
' the Nova API'
)
args = options.run() args = options.run()
required_args = [
'nova_image', 'nova_image_size', 'nova_secgroup', 'nova_keyname',
'nova_tenant', 'nova_region', 'nova_user', 'nova_auth_url'
]
# NOTE(LinuxJedi): We are checking for required args here because the
# parser can't yet check both command line and config file to see if an
# option has been set
for req in required_args:
test_var = getattr(args, req)
if test_var is None:
sys.stderr.write(
'{app}: error: argument --{test_var} is required\n'
.format(app=os.path.basename(sys.argv[0]), test_var=req))
return 2
if not args.api_server:
# NOTE(shrews): Can't set a default in argparse method because the
# value is appended to the specified default.
args.api_server.append('localhost:8889')
elif not isinstance(args.api_server, list):
# NOTE(shrews): The Options object cannot intelligently handle
# creating a list from an option that may have multiple values.
# We convert it to the expected type here.
svr_list = args.api_server.split()
args.api_server = svr_list
logger = setup_logging('libra_mgm', args) logger = setup_logging('libra_mgm', args)
server = Server(logger, args) server = Server(logger, args)