3232
3333import argparse
3434import ipaddress
35+ import logging
3536import sys
3637import uuid
3738
4445from .loadbalancer_info import AmphoraInfo , LoadBalancerInfo , ProcessingContext
4546from .openstack_api import OpenStackAPI
4647
48+ log = logging .getLogger (__name__ )
49+
4750# Max allowed threads for --max-workers
4851MAX_WORKERS_LIMIT = 32
4952
@@ -73,11 +76,20 @@ def parse_parameters():
7376 )
7477
7578 parser .add_argument (
76- "-o" ,
77- "--output-format" ,
78- help = "Output format: 'plain', 'rich' or 'json'" ,
79- choices = ("plain" , "rich" , "json" ),
80- default = "rich" ,
79+ "-d" ,
80+ "--debug" ,
81+ help = "Enable debug log messages. (default: %(default)s)" ,
82+ action = "store_true" ,
83+ required = False ,
84+ )
85+ parser .add_argument (
86+ "--os-cloud" ,
87+ help = (
88+ "Name of the cloud to load from clouds.yaml. "
89+ "(Default '%(default)s', which uses OS_* env vars)"
90+ ),
91+ type = str ,
92+ default = "envvars" ,
8193 required = False ,
8294 )
8395 parser .add_argument (
@@ -87,6 +99,14 @@ def parse_parameters():
8799 choices = ("lb" , "amphora" ),
88100 required = True ,
89101 )
102+ parser .add_argument (
103+ "-o" ,
104+ "--output-format" ,
105+ help = "Output format. (default: %(default)s)" ,
106+ choices = ("plain" , "rich" , "json" ),
107+ default = "rich" ,
108+ required = False ,
109+ )
90110 parser .add_argument ("--name" , help = "Filter load balancers name" , type = str , required = False )
91111 parser .add_argument (
92112 "--id" , help = "Filter load balancers id (UUID)" , type = validate_uuid , required = False
@@ -121,7 +141,13 @@ def parse_parameters():
121141 )
122142 parser .add_argument (
123143 "--details" ,
124- help = "Show all load balancers/amphora details" ,
144+ help = "Show all load balancers/amphora details. (default: %(default)s)" ,
145+ action = "store_true" ,
146+ required = False ,
147+ )
148+ parser .add_argument (
149+ "--no-members" ,
150+ help = "Do not show load balancers pool members information. (default: %(default)s)" ,
125151 action = "store_true" ,
126152 required = False ,
127153 )
@@ -211,6 +237,23 @@ def validate_ip_address(value_str):
211237 raise argparse .ArgumentTypeError (f"Invalid IP address: { value_str !r} " ) from exc
212238
213239
240+ def setup_logging (log_level ):
241+ """Setup logging configuration."""
242+ datefmt = "%Y-%m-%d %H:%M:%S"
243+ msg_fmt = "%(asctime)s - %(module)s.%(funcName)s - [%(levelname)s] - %(message)s"
244+
245+ formatter = logging .Formatter (
246+ fmt = msg_fmt ,
247+ datefmt = datefmt ,
248+ )
249+ handler = logging .StreamHandler (sys .stdout )
250+ handler .setFormatter (formatter )
251+
252+ root_logger = logging .getLogger ()
253+ root_logger .setLevel (log_level )
254+ root_logger .addHandler (handler )
255+
256+
214257def query_openstack_lbs (openstackapi , args , formatter ):
215258 """
216259 Query OpenStack Load Balancers based on user-defined filters.
@@ -238,6 +281,7 @@ def query_openstack_lbs(openstackapi, args, formatter):
238281 }.items ()
239282 if v is not None
240283 }
284+ log .debug ("Retrieve load balancers filter: %s" , filter_criteria )
241285
242286 with formatter .status ("Querying load balancers and applying filters..." ):
243287 filtered_lbs_tmp = openstackapi .retrieve_load_balancers (filter_criteria )
@@ -283,6 +327,10 @@ def main():
283327
284328 args = parse_parameters ()
285329
330+ log_level = logging .DEBUG if args .debug else logging .WARNING
331+ setup_logging (log_level )
332+ log .debug ("CMD line args: %s" , args )
333+
286334 if args .output_format == "rich" and not RICH_AVAILABLE :
287335 sys .exit (
288336 "Error: 'rich' library is not installed. "
@@ -293,9 +341,18 @@ def main():
293341 formatter = get_formatter (args .output_format )
294342
295343 # Create an instance of OpenStackAPI
296- openstackapi = OpenStackAPI ()
344+ try :
345+ openstackapi = OpenStackAPI (args .os_cloud )
346+ except RuntimeError as exc :
347+ sys .exit (f"Error: { exc } " )
348+
349+ try :
350+ filtered_lbs = query_openstack_lbs (openstackapi , args , formatter )
351+ except Exception as exc : # pylint: disable=broad-exception-caught
352+ log .debug ("Error to query openstack:" , exc_info = True )
353+ sys .exit (f"Error: { exc } " )
297354
298- filtered_lbs = query_openstack_lbs ( openstackapi , args , formatter )
355+ log . info ( "Found %d load balancer(s) to process." , len ( filtered_lbs ) )
299356
300357 if not filtered_lbs :
301358 formatter .print ("No load balancer(s) found." )
@@ -305,8 +362,10 @@ def main():
305362 openstack_api = openstackapi ,
306363 details = args .details ,
307364 max_workers = args .max_workers ,
365+ no_members = args .no_members ,
308366 formatter = formatter ,
309367 )
368+ log .debug ("Process context: %s" , context )
310369
311370 for lb in filtered_lbs :
312371 if args .type == "amphora" :
0 commit comments