LCOV - code coverage report
Current view: top level - root/contrail/src/contrail-analytics/contrail-collector - options.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 436 476 91.6 %
Date: 2026-08-03 02:19:58 Functions: 8 9 88.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
       3             :  */
       4             : #include "options.h"
       5             : 
       6             : #include <fstream>
       7             : #include <iostream>
       8             : #include <boost/foreach.hpp>
       9             : #include <boost/assign/list_of.hpp>
      10             : #include <boost/assign/list_of.hpp>
      11             : #include <boost/functional/hash.hpp>
      12             : 
      13             : #include <analytics/buildinfo.h>
      14             : #include "base/contrail_ports.h"
      15             : #include "base/logging.h"
      16             : #include "base/misc_utils.h"
      17             : #include "base/address_util.h"
      18             : #include "base/util.h"
      19             : #include <base/options_util.h>
      20             : #include <analytics/viz_constants.h>
      21             : #include <database/gendb_constants.h>
      22             : 
      23             : #include "config-client-mgr/config_client_manager.h"
      24             : 
      25             : using namespace std;
      26             : using namespace boost::asio::ip;
      27             : using namespace boost::assign;
      28             : namespace opt = boost::program_options;
      29             : using namespace options::util;
      30             : 
      31             : // Process command line options for collector   .
      32           8 : Options::Options() {
      33           8 : }
      34             : 
      35           8 : bool Options::Parse(EventManager &evm, int argc, char *argv[]) {
      36          16 :     opt::options_description cmdline_options("Allowed options");
      37           8 :     Initialize(evm, cmdline_options);
      38             : 
      39           8 :     Process(argc, argv, cmdline_options);
      40           8 :     return true;
      41           8 : }
      42             : 
      43             : // Initialize collector's command line option tags with appropriate default
      44             : // values. Options can from a config file as well. By default, we read
      45             : // options from /etc/contrail/contrail-collector.conf
      46           8 : void Options::Initialize(EventManager &evm,
      47             :                          opt::options_description &cmdline_options) {
      48           8 :     boost::system::error_code error;
      49           8 :     string hostname = ResolveCanonicalName();
      50           8 :     string host_ip = GetHostIp(evm.io_service(), hostname);
      51             : 
      52           8 :     if (host_ip.empty()) {
      53             :         cout << "Error! Cannot resolve host " << hostname <<
      54           0 :                 "to a valid IP address";
      55           0 :         exit(-1);
      56             :     }
      57             : 
      58             :     map<string, vector<string> >::const_iterator it =
      59           8 :         g_vns_constants.ServicesDefaultConfigurationFiles.find(
      60             :             g_vns_constants.SERVICE_COLLECTOR);
      61           8 :     assert(it != g_vns_constants.ServicesDefaultConfigurationFiles.end());
      62           8 :     const vector<string> &conf_files(it->second);
      63             : 
      64          16 :     opt::options_description generic("Generic options");
      65             : 
      66             :     // Command line only options.
      67           8 :     ostringstream conf_files_oss;
      68           8 :     bool first = true;
      69          56 :     BOOST_FOREACH(const string &cfile, conf_files) {
      70          24 :         if (first) {
      71           8 :             conf_files_oss << cfile;
      72           8 :             first = false;
      73             :         } else {
      74          16 :             conf_files_oss << ", " << cfile;
      75             :         }
      76             :     }
      77           8 :     generic.add_options()
      78          16 :         ("conf_file", opt::value<vector<string> >()->default_value(
      79          16 :              conf_files, conf_files_oss.str()),
      80             :              "Configuration file")
      81           8 :          ("help", "help message")
      82           8 :         ("version", "Display version information")
      83             :     ;
      84             : 
      85           8 :     uint16_t default_redis_port = ContrailPorts::RedisUvePort();
      86           8 :     uint16_t default_ks_port = ContrailPorts::KeystonePort();
      87           8 :     uint16_t default_collector_port = ContrailPorts::CollectorPort();
      88             :     uint16_t default_collector_structured_syslog_port =
      89           8 :         ContrailPorts::CollectorStructuredSyslogPort();
      90           8 :     uint16_t default_partitions = 15;
      91           8 :     uint16_t default_http_server_port = ContrailPorts::HttpPortCollector();
      92           8 :     uint32_t default_disk_usage_percentage_high_watermark0 = 90;
      93           8 :     uint32_t default_disk_usage_percentage_low_watermark0 = 85;
      94           8 :     uint32_t default_disk_usage_percentage_high_watermark1 = 80;
      95           8 :     uint32_t default_disk_usage_percentage_low_watermark1 = 75;
      96           8 :     uint32_t default_disk_usage_percentage_high_watermark2 = 70;
      97           8 :     uint32_t default_disk_usage_percentage_low_watermark2 = 60;
      98           8 :     uint32_t default_pending_compaction_tasks_high_watermark0 = 400;
      99           8 :     uint32_t default_pending_compaction_tasks_low_watermark0 = 300;
     100           8 :     uint32_t default_pending_compaction_tasks_high_watermark1 = 200;
     101           8 :     uint32_t default_pending_compaction_tasks_low_watermark1 = 150;
     102           8 :     uint32_t default_pending_compaction_tasks_high_watermark2 = 100;
     103           8 :     uint32_t default_pending_compaction_tasks_low_watermark2 = 80;
     104           8 :     std::string default_high_watermark0_message_severity_level = "SYS_EMERG";
     105           8 :     std::string default_low_watermark0_message_severity_level = "SYS_ALERT";
     106           8 :     std::string default_high_watermark1_message_severity_level = "SYS_ERR";
     107           8 :     std::string default_low_watermark1_message_severity_level = "SYS_WARN";
     108           8 :     std::string default_high_watermark2_message_severity_level = "SYS_DEBUG";
     109           8 :     std::string default_low_watermark2_message_severity_level = "INVALID";
     110             : 
     111           8 :     vector<string> default_cassandra_server_list;
     112           8 :     string default_cassandra_server;
     113           8 :     default_cassandra_server_list.push_back(default_cassandra_server);
     114             : 
     115             :     // e.g. "ModuleClientState-max_sm_queue_count:AggProxySumAnomalyEWM01:AggProxySum"
     116             : 
     117           8 :     vector<string> default_kafka_broker_list;
     118           8 :     default_kafka_broker_list.push_back("");
     119             : 
     120           8 :     string default_api_server("127.0.0.1:8082");
     121           8 :     vector<string> default_api_server_list = list_of(default_api_server);
     122             : 
     123           8 :     vector<string> default_structured_syslog_tcp_forward_destination;
     124           8 :     default_structured_syslog_tcp_forward_destination.push_back("");
     125             : 
     126           8 :     vector<string> default_structured_syslog_kafka_broker_list;
     127           8 :     default_structured_syslog_kafka_broker_list.push_back("");
     128             : 
     129           8 :     string default_structured_syslog_kafka_topic("structured_syslog");
     130           8 :     uint16_t default_structured_syslog_kafka_partitions = 30;
     131           8 :     uint64_t default_structured_syslog_active_session_map_limit = 1000000;
     132             : 
     133             :     // Command line and config file options.
     134          16 :     opt::options_description cassandra_config("Cassandra Configuration options");
     135           8 :     cassandra_config.add_options()
     136          16 :         ("CASSANDRA.cassandra_user", opt::value<string>()->default_value(""),
     137             :               "Cassandra user name")
     138          16 :         ("CASSANDRA.cassandra_password", opt::value<string>()->default_value(""),
     139             :               "Cassandra password")
     140           8 :         ("CASSANDRA.cassandra_use_ssl", opt::bool_switch(&cassandra_options_.use_ssl_),
     141             :               "SSL communication enable/disable with Cassandra")
     142          16 :         ("CASSANDRA.cassandra_ca_certs", opt::value<string>()->default_value(""),
     143             :               "Path to file with CA certificates")
     144          16 :         ("CASSANDRA.compaction_strategy",
     145           8 :             opt::value<string>()->default_value(
     146             :                 GenDb::g_gendb_constants.SIZE_TIERED_COMPACTION_STRATEGY),
     147             :             "Cassandra compaction strategy")
     148           8 :         ("CASSANDRA.flow_tables.compaction_strategy",
     149           8 :             opt::value<string>()->default_value(
     150             :                 GenDb::g_gendb_constants.DATE_TIERED_COMPACTION_STRATEGY),
     151             :             "Cassandra compaction strategy for flow tables");
     152             : 
     153             :     // Command line and config file options.
     154          16 :     opt::options_description database_config("Database Configuration options");
     155           8 :     database_config.add_options()
     156          16 :         ("DATABASE.disk_usage_percentage.high_watermark0",
     157           8 :             opt::value<uint32_t>()->default_value(
     158             :                 default_disk_usage_percentage_high_watermark0),
     159             :             "Disk usage percentage high watermark 0")
     160          16 :         ("DATABASE.disk_usage_percentage.low_watermark0",
     161           8 :             opt::value<uint32_t>()->default_value(
     162             :                 default_disk_usage_percentage_low_watermark0),
     163             :             "Disk usage percentage low watermark 0")
     164          16 :         ("DATABASE.disk_usage_percentage.high_watermark1",
     165           8 :             opt::value<uint32_t>()->default_value(
     166             :                 default_disk_usage_percentage_high_watermark1),
     167             :             "Disk usage percentage high watermark 1")
     168          16 :         ("DATABASE.disk_usage_percentage.low_watermark1",
     169           8 :             opt::value<uint32_t>()->default_value(
     170             :                 default_disk_usage_percentage_low_watermark1),
     171             :             "Disk usage percentage low watermark 1")
     172          16 :         ("DATABASE.disk_usage_percentage.high_watermark2",
     173           8 :             opt::value<uint32_t>()->default_value(
     174             :                 default_disk_usage_percentage_high_watermark2),
     175             :             "Disk usage percentage high watermark 2")
     176          16 :         ("DATABASE.disk_usage_percentage.low_watermark2",
     177           8 :             opt::value<uint32_t>()->default_value(
     178             :                 default_disk_usage_percentage_low_watermark2),
     179             :             "Disk usage percentage low watermark 2")
     180          16 :         ("DATABASE.pending_compaction_tasks.high_watermark0",
     181           8 :             opt::value<uint32_t>()->default_value(
     182             :                 default_pending_compaction_tasks_high_watermark0),
     183             :             "Cassandra pending compaction tasks high watermark 0")
     184          16 :         ("DATABASE.pending_compaction_tasks.low_watermark0",
     185           8 :             opt::value<uint32_t>()->default_value(
     186             :                 default_pending_compaction_tasks_low_watermark0),
     187             :             "Cassandra pending compaction tasks low watermark 0")
     188          16 :         ("DATABASE.pending_compaction_tasks.high_watermark1",
     189           8 :             opt::value<uint32_t>()->default_value(
     190             :                 default_pending_compaction_tasks_high_watermark1),
     191             :             "Cassandra pending compaction tasks high watermark 1")
     192          16 :         ("DATABASE.pending_compaction_tasks.low_watermark1",
     193           8 :             opt::value<uint32_t>()->default_value(
     194             :                 default_pending_compaction_tasks_low_watermark1),
     195             :             "Cassandra pending compaction tasks low watermark 1")
     196          16 :         ("DATABASE.pending_compaction_tasks.high_watermark2",
     197           8 :             opt::value<uint32_t>()->default_value(
     198             :                 default_pending_compaction_tasks_high_watermark2),
     199             :             "Cassandra pending compaction tasks high watermark 2")
     200          16 :         ("DATABASE.pending_compaction_tasks.low_watermark2",
     201           8 :             opt::value<uint32_t>()->default_value(
     202             :                 default_pending_compaction_tasks_low_watermark2),
     203             :             "Cassandra pending compaction tasks low watermark 2")
     204          16 :         ("DATABASE.high_watermark0.message_severity_level",
     205           8 :             opt::value<string>()->default_value(
     206             :                 default_high_watermark0_message_severity_level),
     207             :             "High Watermark 0 Message severity level")
     208          16 :         ("DATABASE.low_watermark0.message_severity_level",
     209           8 :             opt::value<string>()->default_value(
     210             :                 default_low_watermark0_message_severity_level),
     211             :             "Low Watermark 0 Message severity level")
     212          16 :         ("DATABASE.high_watermark1.message_severity_level",
     213           8 :             opt::value<string>()->default_value(
     214             :                 default_high_watermark1_message_severity_level),
     215             :             "High Watermark 1 Message severity level")
     216          16 :         ("DATABASE.low_watermark1.message_severity_level",
     217           8 :             opt::value<string>()->default_value(
     218             :                 default_low_watermark1_message_severity_level),
     219             :             "Low Watermark 1 Message severity level")
     220          16 :         ("DATABASE.high_watermark2.message_severity_level",
     221           8 :             opt::value<string>()->default_value(
     222             :                 default_high_watermark2_message_severity_level),
     223             :             "High Watermark 2 Message severity level")
     224          16 :         ("DATABASE.low_watermark2.message_severity_level",
     225           8 :             opt::value<string>()->default_value(
     226             :                 default_low_watermark2_message_severity_level),
     227             :             "Low Watermark 2 Message severity level")
     228             : 
     229          16 :         ("DATABASE.cluster_id", opt::value<string>()->default_value(""),
     230             :              "Analytics Cluster Id")
     231          16 :         ("DATABASE.disable_all_writes",
     232           8 :             opt::bool_switch(&cassandra_options_.disable_all_db_writes_),
     233             :             "Disable all writes to the database")
     234          16 :         ("DATABASE.disable_statistics_writes",
     235           8 :             opt::bool_switch(&cassandra_options_.disable_db_stats_writes_),
     236             :             "Disable statistics writes to the database")
     237           8 :         ("DATABASE.disable_message_writes",
     238           8 :             opt::bool_switch(&cassandra_options_.disable_db_messages_writes_),
     239             :             "Disable message writes to the database")
     240             :         ;
     241             : 
     242             :     // Command line and config file options.
     243          16 :     opt::options_description collector_config("Collector Configuration options");
     244           8 :     collector_config.add_options()
     245           8 :         ("COLLECTOR.port", opt::value<uint16_t>()->default_value(
     246             :                                                 default_collector_port),
     247             :              "Listener port of sandesh collector server")
     248          16 :         ("COLLECTOR.server",
     249          16 :              opt::value<string>()->default_value("0.0.0.0"),
     250             :              "IP address of sandesh collector server")
     251          16 :         ("STRUCTURED_SYSLOG_COLLECTOR.port",
     252           8 :             opt::value<uint16_t>()->default_value(
     253             :                 default_collector_structured_syslog_port),
     254             :          "Listener port of Structured Syslog collector server")
     255          16 :         ("STRUCTURED_SYSLOG_COLLECTOR.tcp_forward_destination",
     256          16 :            opt::value<vector<string> >()->default_value(
     257             :                default_structured_syslog_tcp_forward_destination, ""),
     258             :              "Structured Syslog Forward Destination List")
     259          16 :         ("STRUCTURED_SYSLOG_COLLECTOR.kafka_broker_list",
     260          16 :            opt::value<vector<string> >()->default_value(
     261             :                default_structured_syslog_kafka_broker_list, ""),
     262             :              "Structured Syslog Kafka Broker List")
     263          16 :         ("STRUCTURED_SYSLOG_COLLECTOR.kafka_topic",
     264          16 :            opt::value<string>()->default_value(
     265             :                default_structured_syslog_kafka_topic, "structured_syslog"),
     266             :              "Structured Syslog Kafka Topic")
     267          16 :         ("STRUCTURED_SYSLOG_COLLECTOR.kafka_partitions",
     268           8 :            opt::value<uint16_t>()->default_value(
     269             :                default_structured_syslog_kafka_partitions),
     270             :              "Structured Syslog Number of Kafka Partitions")
     271           8 :         ("STRUCTURED_SYSLOG_COLLECTOR.active_session_map_limit",
     272           8 :            opt::value<uint64_t>()->default_value(
     273             :                default_structured_syslog_active_session_map_limit),
     274             :              "Structured Syslog Max Num of Active Sessions in Session Config Map")
     275             :         ;
     276             : 
     277             :     // Command line and config file options.
     278          16 :     opt::options_description config("Configuration options");
     279           8 :     config.add_options()
     280          16 :         ("DEFAULT.analytics_data_ttl",
     281          16 :              opt::value<uint64_t>()->default_value(
     282           0 :                  g_viz_constants.TtlValuesDefault.find(
     283           8 :                  TtlType::GLOBAL_TTL)->second),
     284             :              "TTL in hours for analytics data")
     285          16 :         ("DEFAULT.analytics_config_audit_ttl",
     286          16 :              opt::value<uint64_t>()->default_value(
     287           0 :                  g_viz_constants.TtlValuesDefault.find(
     288           8 :                  TtlType::CONFIGAUDIT_TTL)->second),
     289             :              "TTL in hours for analytics configuration audit data")
     290          16 :         ("DEFAULT.analytics_statistics_ttl",
     291          16 :              opt::value<uint64_t>()->default_value(
     292           0 :                  g_viz_constants.TtlValuesDefault.find(
     293           8 :                  TtlType::STATSDATA_TTL)->second),
     294             :              "TTL in hours for analytics statistics data")
     295          16 :         ("DEFAULT.analytics_flow_ttl",
     296          16 :              opt::value<uint64_t>()->default_value(
     297           0 :                  g_viz_constants.TtlValuesDefault.find(
     298           8 :                  TtlType::FLOWDATA_TTL)->second),
     299             :              "TTL in hours for analytics flow data")
     300          16 :         ("DEFAULT.cassandra_server_list",
     301           8 :            opt::value<vector<string> >()->default_value(
     302             :                default_cassandra_server_list, default_cassandra_server),
     303             :              "Cassandra server list")
     304          16 :         ("DEFAULT.zookeeper_server_list",
     305          16 :             opt::value<string>()->default_value(""),
     306             :             "Zookeeper server list")
     307          16 :         ("DEFAULT.partitions",
     308           8 :             opt::value<uint16_t>()->default_value(
     309             :                 default_partitions),
     310             :          "Number of partitions to use for publishing to kafka")
     311           8 :         ("DEFAULT.dup", opt::bool_switch(&dup_), "Internal use flag")
     312           8 :         ("DEFAULT.hostip", opt::value<string>()->default_value(host_ip),
     313             :              "IP address of collector")
     314           8 :         ("DEFAULT.hostname", opt::value<string>()->default_value(hostname),
     315             :              "Hostname of collector")
     316          16 :         ("DEFAULT.http_server_port",
     317           8 :              opt::value<uint16_t>()->default_value(default_http_server_port),
     318             :              "Sandesh HTTP listener port")
     319             : 
     320           8 :         ("DEFAULT.log_category", opt::value<string>(),
     321             :              "Category filter for local logging of sandesh messages")
     322           8 :         ("DEFAULT.log_disable", opt::bool_switch(&log_disable_),
     323             :              "Disable sandesh logging")
     324          16 :         ("DEFAULT.log_file", opt::value<string>()->default_value("<stdout>"),
     325             :              "Filename for the logs to be written to")
     326          16 :         ("DEFAULT.log_property_file", opt::value<string>()->default_value(""),
     327             :              "log4cplus property file name")
     328          16 :         ("DEFAULT.log_files_count",
     329           8 :              opt::value<int>()->default_value(10),
     330             :              "Maximum log file roll over index")
     331          16 :         ("DEFAULT.log_file_size",
     332           8 :              opt::value<long>()->default_value(1024*1024),
     333             :              "Maximum size of the log file")
     334          16 :         ("DEFAULT.log_level", opt::value<string>()->default_value("SYS_NOTICE"),
     335             :              "Severity level for local logging of sandesh messages")
     336           8 :         ("DEFAULT.log_local", opt::bool_switch(&log_local_),
     337             :              "Enable local logging of sandesh messages")
     338           8 :         ("DEFAULT.use_syslog", opt::bool_switch(&use_syslog_),
     339             :              "Enable logging to syslog")
     340          16 :         ("DEFAULT.syslog_facility", opt::value<string>()->default_value("LOG_LOCAL0"),
     341             :              "Syslog facility to receive log lines")
     342           8 :         ("DEFAULT.test_mode", opt::bool_switch(&test_mode_),
     343             :              "Enable collector to run in test-mode")
     344           8 :         ("DEFAULT.disable_flow_collection",
     345           8 :             opt::bool_switch(&disable_flow_collection_),
     346             :             "Disable flow message collection")
     347             :         ;
     348             : 
     349             :     // Command line and config file options.
     350          16 :     opt::options_description kafka_config("Kafka Configuration options");
     351           8 :     kafka_config.add_options()
     352          16 :         ("KAFKA.kafka_broker_list",
     353          16 :            opt::value<vector<string> >()->default_value(
     354             :                default_kafka_broker_list, ""),
     355             :              "kafka broker list")
     356          16 :         ("KAFKA.kafka_ssl_enable",
     357           8 :              opt::value<bool>()->default_value(false),
     358             :              "Enable SSL Encryptions for Kafka connection")
     359          16 :         ("KAFKA.kafka_keyfile", opt::value<std::string>()->default_value(
     360             :          "/etc/contrail/ssl/private/server-privkey.pem"),
     361             :          "kafka SSL private key")
     362          16 :         ("KAFKA.kafka_certfile", opt::value<std::string>()->default_value(
     363             :          "/etc/contrail/ssl/certs/server.pem"),
     364             :          "kafka SSL certificate")
     365           8 :         ("KAFKA.kafka_ca_cert", opt::value<std::string>()->default_value(
     366             :          "/etc/contrail/ssl/certs/ca-cert.pem"),
     367             :          "Kafka CA SSL certificate")
     368             :         ;
     369             : 
     370             :     // Command line and config file options.
     371          16 :     opt::options_description redis_config("Redis Configuration options");
     372           8 :     redis_config.add_options()
     373          16 :         ("REDIS.port",
     374           8 :              opt::value<uint16_t>()->default_value(default_redis_port),
     375             :              "Port of Redis-uve server")
     376          16 :         ("REDIS.server", opt::value<string>()->default_value("127.0.0.1"),
     377             :              "IP address of Redis Server")
     378           8 :         ("REDIS.password", opt::value<string>()->default_value(""),
     379             :              "password for Redis Server")
     380             :         ;
     381             : 
     382             :     // Command line and config file options.
     383          16 :     opt::options_description keystone_config("Keystone Configuration options");
     384           8 :     keystone_config.add_options()
     385          16 :         ("KEYSTONE.auth_host", opt::value<string>()->default_value("127.0.0.1"),
     386             :              "IP address of keystone Server")
     387          16 :         ("KEYSTONE.auth_port",
     388           8 :              opt::value<uint16_t>()->default_value(default_ks_port),
     389             :              "Keystone auth server port")
     390          16 :         ("KEYSTONE.auth_protocol", opt::value<string>()->default_value("http"),
     391             :              "protocol used to authenticate with Keystone Server")
     392          16 :         ("KEYSTONE.admin_user", opt::value<string>()->default_value("admin"),
     393             :              "Keystone username")
     394          16 :         ("KEYSTONE.admin_password", opt::value<string>()->default_value(
     395             :                     "admin123"), "Keystone password")
     396          16 :         ("KEYSTONE.admin_tenant_name", opt::value<string>()->default_value(
     397             :                     "tenant"), "Keystone tenant")
     398           8 :         ("KEYSTONE.insecure", opt::bool_switch(&ks_insecure_),
     399             :                     "keystone using tls")
     400          16 :         ("KEYSTONE.auth_url", opt::value<string>()->default_value("a.com"),
     401             :                     "keystone auth url")
     402          16 :         ("KEYSTONE.memcache_servers", opt::value<string>()->default_value(
     403             :                     "127.0.0.1:11211"), "memcache servers")
     404          16 :         ("KEYSTONE.certfile", opt::value<string>()->default_value(
     405             :                     "/etc/contrail/ks-cert"), "Keystone certificate")
     406          16 :         ("KEYSTONE.keyfile", opt::value<string>()->default_value(
     407             :                     "/etc/contrail/ks-key"), "Keystone private key")
     408           8 :         ("KEYSTONE.cafile", opt::value<string>()->default_value(
     409             :                     "/etc/contrail/ks-ca"), "Keystone CA chain")
     410             :         ;
     411             : 
     412           8 :     vector<string> default_config_db_server_list;
     413           8 :     string default_config_db_server(host_ip + ":9042");
     414           8 :     default_config_db_server_list.push_back(default_config_db_server);
     415             : 
     416           8 :     vector<string> default_rabbitmq_server_list;
     417           8 :     string default_rabbitmq_server(host_ip + ":5672");
     418           8 :     default_rabbitmq_server_list.push_back(default_rabbitmq_server);
     419             :     // configdb_config options.
     420          16 :     opt::options_description configdb_config("Config database Configuration options");
     421           8 :     configdb_config.add_options()
     422          16 :         ("CONFIGDB.config_db_server_list",
     423           8 :              opt::value<vector<string> >()->default_value(
     424             :              default_config_db_server_list, default_config_db_server),
     425             :              "Config database server list")
     426          16 :         ("CONFIGDB.config_db_username",
     427          16 :              opt::value<string>()->default_value(""),
     428             :              "ConfigDB user")
     429          16 :         ("CONFIGDB.config_db_password",
     430          16 :              opt::value<string>()->default_value(""),
     431             :              "ConfigDB password")
     432          16 :         ("CONFIGDB.config_db_use_ssl",
     433           8 :              opt::value<bool>()->default_value(false),
     434             :              "Use SSL for Cassandra connection")
     435          16 :         ("CONFIGDB.config_db_ca_certs",
     436          16 :              opt::value<string>()->default_value(""),
     437             :              "CA Certificate file for SSL Cassandra connection")
     438          16 :         ("CONFIGDB.rabbitmq_server_list",
     439           8 :              opt::value<vector<string> >()->default_value(
     440             :              default_rabbitmq_server_list, default_rabbitmq_server),
     441             :              "RabbitMQ server list")
     442          16 :         ("CONFIGDB.rabbitmq_user",
     443          16 :              opt::value<string>()->default_value("guest"),
     444             :              "RabbitMQ user")
     445          16 :         ("CONFIGDB.rabbitmq_password",
     446          16 :              opt::value<string>()->default_value("guest"),
     447             :              "RabbitMQ password")
     448          16 :         ("CONFIGDB.rabbitmq_vhost",
     449          16 :              opt::value<string>()->default_value(""),
     450             :              "RabbitMQ vhost")
     451          16 :         ("CONFIGDB.rabbitmq_use_ssl",
     452           8 :              opt::value<bool>()->default_value(false),
     453             :              "Use SSL for RabbitMQ connection")
     454          16 :         ("CONFIGDB.rabbitmq_ssl_version",
     455          16 :              opt::value<string>()->default_value(""),
     456             :              "SSL version for RabbitMQ connection")
     457          16 :         ("CONFIGDB.rabbitmq_ssl_keyfile",
     458          16 :              opt::value<string>()->default_value(""),
     459             :              "Keyfile for SSL RabbitMQ connection")
     460          16 :         ("CONFIGDB.rabbitmq_ssl_certfile",
     461          16 :              opt::value<string>()->default_value(""),
     462             :              "Certificate file for SSL RabbitMQ connection")
     463           8 :         ("CONFIGDB.rabbitmq_ssl_ca_certs",
     464           8 :              opt::value<string>()->default_value(""),
     465             :              "CA Certificate file for SSL RabbitMQ connection")
     466             :         ;
     467             : 
     468             :     // Command line and config file options.
     469          16 :     opt::options_description sandesh_config("Sandesh Configuration options");
     470           8 :     sandesh::options::AddOptions(&sandesh_config, &sandesh_config_);
     471             : 
     472             :     // Command line and config file options for api-server
     473          16 :     opt::options_description api_server_config("Api-Server Configuration options");
     474           8 :     api_server_config.add_options()
     475          16 :         ("API_SERVER.api_server_list",
     476           8 :          opt::value<vector<string> >()->default_value(
     477             :             default_api_server_list, default_api_server),
     478             :             "Api-Server list")
     479           8 :         ("API_SERVER.api_server_use_ssl",
     480           8 :          opt::bool_switch(&api_server_use_ssl_),
     481             :          "Use ssl for connecting to Api-Server")
     482             :         ;
     483             : 
     484           8 :     config_file_options_.add(config).add(cassandra_config)
     485           8 :         .add(database_config).add(sandesh_config).add(keystone_config).add(kafka_config)
     486           8 :         .add(collector_config).add(redis_config).add(api_server_config).add(configdb_config);
     487           8 :     cmdline_options.add(generic).add(config).add(cassandra_config)
     488           8 :         .add(database_config).add(sandesh_config).add(keystone_config).add(kafka_config)
     489           8 :         .add(collector_config).add(redis_config).add(api_server_config).add(configdb_config);
     490           8 : }
     491             : 
     492          16 : static bool ValidateCompactionStrategyOption(
     493             :     const std::string &compaction_strategy,
     494             :     const std::string &option) {
     495          25 :     if (!((compaction_strategy ==
     496           9 :         GenDb::g_gendb_constants.DATE_TIERED_COMPACTION_STRATEGY) ||
     497           9 :         (compaction_strategy ==
     498           8 :         GenDb::g_gendb_constants.LEVELED_COMPACTION_STRATEGY) ||
     499           8 :         (compaction_strategy ==
     500             :         GenDb::g_gendb_constants.SIZE_TIERED_COMPACTION_STRATEGY) ||
     501           0 :         (compaction_strategy ==
     502             :         GenDb::g_gendb_constants.TIME_WINDOW_COMPACTION_STRATEGY))) {
     503             :         cout << "Invalid " << option <<  ", please select one of [" <<
     504             :             GenDb::g_gendb_constants.DATE_TIERED_COMPACTION_STRATEGY << ", " <<
     505             :             GenDb::g_gendb_constants.LEVELED_COMPACTION_STRATEGY << ", " <<
     506             :             GenDb::g_gendb_constants.SIZE_TIERED_COMPACTION_STRATEGY << ", " <<
     507           0 :             GenDb::g_gendb_constants.TIME_WINDOW_COMPACTION_STRATEGY << "]" <<
     508           0 :             endl;
     509           0 :         return false;
     510             :     }
     511          16 :     return true;
     512             : }
     513             : 
     514          24 : uint32_t Options::GenerateHash(const std::vector<std::string> &list) {
     515          24 :     std::string concat_servers;
     516          24 :     std::vector<std::string>::const_iterator iter;
     517          48 :     for (iter = list.begin(); iter != list.end(); iter++) {
     518          24 :         concat_servers += *iter;
     519             :     }
     520             :     boost::hash<std::string> string_hash;
     521          48 :     return(string_hash(concat_servers));
     522          24 : }
     523             : 
     524           8 : uint32_t Options::GenerateHash(const ConfigClientOptions &config) {
     525           8 :     uint32_t chk_sum = GenerateHash(config.config_db_server_list);
     526           8 :     chk_sum += GenerateHash(config.rabbitmq_server_list);
     527             :     boost::hash<std::string> string_hash;
     528           8 :     chk_sum += string_hash(config.rabbitmq_user);
     529           8 :     chk_sum += string_hash(config.rabbitmq_password);
     530           8 :     chk_sum += string_hash(config.config_db_username);
     531           8 :     chk_sum += string_hash(config.config_db_password);
     532           8 :     return chk_sum;
     533             : }
     534             : 
     535             : // Process command line options. They can come from a conf file as well. Options
     536             : // from command line always overrides those that come from the config file.
     537           8 : void Options::Process(int argc, char *argv[],
     538             :         opt::options_description &cmdline_options) {
     539             :     // Process options off command line first.
     540           8 :     opt::variables_map var_map;
     541           8 :     opt::store(opt::parse_command_line(argc, argv, cmdline_options), var_map);
     542             :     // Process options off configuration file.
     543           8 :     GetOptValue< vector<string> >(var_map, config_file_,
     544             :                                   "conf_file");
     545           8 :     ifstream config_file_in;
     546          24 :     for(std::vector<int>::size_type i = 0; i != config_file_.size(); i++) {
     547          16 :         config_file_in.open(config_file_[i].c_str());
     548          16 :         if (config_file_in.good()) {
     549           8 :            opt::store(opt::parse_config_file(config_file_in, config_file_options_, true),
     550             :                    var_map);
     551             :         }
     552          16 :         config_file_in.close();
     553             :     }
     554             : 
     555           8 :     opt::notify(var_map);
     556             : 
     557           8 :     if (var_map.count("help")) {
     558           0 :         cout << cmdline_options << endl;
     559           0 :         exit(0);
     560             :     }
     561             : 
     562           8 :     if (var_map.count("version")) {
     563           0 :         cout << BuildInfo << endl;
     564           0 :         exit(0);
     565             :     }
     566             : 
     567             :     // Retrieve the options.
     568           8 :     GetOptValue<uint16_t>(var_map, collector_port_, "COLLECTOR.port");
     569           8 :     GetOptValue<string>(var_map, collector_server_, "COLLECTOR.server");
     570          16 :     GetOptValue<uint32_t>(
     571           8 :         var_map, db_write_options_.disk_usage_percentage_high_watermark0_,
     572             :         "DATABASE.disk_usage_percentage.high_watermark0");
     573          16 :     GetOptValue<uint32_t>(
     574           8 :         var_map, db_write_options_.disk_usage_percentage_low_watermark0_,
     575             :         "DATABASE.disk_usage_percentage.low_watermark0");
     576          16 :     GetOptValue<uint32_t>(
     577           8 :         var_map, db_write_options_.disk_usage_percentage_high_watermark1_,
     578             :         "DATABASE.disk_usage_percentage.high_watermark1");
     579          16 :     GetOptValue<uint32_t>(
     580           8 :         var_map, db_write_options_.disk_usage_percentage_low_watermark1_,
     581             :         "DATABASE.disk_usage_percentage.low_watermark1");
     582          16 :     GetOptValue<uint32_t>(
     583           8 :         var_map, db_write_options_.disk_usage_percentage_high_watermark2_,
     584             :         "DATABASE.disk_usage_percentage.high_watermark2");
     585          16 :     GetOptValue<uint32_t>(
     586           8 :         var_map, db_write_options_.disk_usage_percentage_low_watermark2_,
     587             :         "DATABASE.disk_usage_percentage.low_watermark2");
     588          16 :     GetOptValue<uint32_t>(
     589           8 :         var_map, db_write_options_.pending_compaction_tasks_high_watermark0_,
     590             :         "DATABASE.pending_compaction_tasks.high_watermark0");
     591          16 :     GetOptValue<uint32_t>(
     592           8 :         var_map, db_write_options_.pending_compaction_tasks_low_watermark0_,
     593             :         "DATABASE.pending_compaction_tasks.low_watermark0");
     594          16 :     GetOptValue<uint32_t>(
     595           8 :         var_map, db_write_options_.pending_compaction_tasks_high_watermark1_,
     596             :         "DATABASE.pending_compaction_tasks.high_watermark1");
     597          16 :     GetOptValue<uint32_t>(
     598           8 :         var_map, db_write_options_.pending_compaction_tasks_low_watermark1_,
     599             :         "DATABASE.pending_compaction_tasks.low_watermark1");
     600          16 :     GetOptValue<uint32_t>(
     601           8 :         var_map, db_write_options_.pending_compaction_tasks_high_watermark2_,
     602             :         "DATABASE.pending_compaction_tasks.high_watermark2");
     603          16 :     GetOptValue<uint32_t>(
     604           8 :         var_map, db_write_options_.pending_compaction_tasks_low_watermark2_,
     605             :         "DATABASE.pending_compaction_tasks.low_watermark2");
     606             : 
     607          16 :     GetOptValue<string>(
     608           8 :         var_map, db_write_options_.high_watermark0_message_severity_level_,
     609             :         "DATABASE.high_watermark0.message_severity_level");
     610          16 :     GetOptValue<string>(
     611           8 :         var_map, db_write_options_.low_watermark0_message_severity_level_,
     612             :         "DATABASE.low_watermark0.message_severity_level");
     613          16 :     GetOptValue<string>(
     614           8 :         var_map, db_write_options_.high_watermark1_message_severity_level_,
     615             :         "DATABASE.high_watermark1.message_severity_level");
     616          16 :     GetOptValue<string>(
     617           8 :         var_map, db_write_options_.low_watermark1_message_severity_level_,
     618             :         "DATABASE.low_watermark1.message_severity_level");
     619          16 :     GetOptValue<string>(
     620           8 :         var_map, db_write_options_.high_watermark2_message_severity_level_,
     621             :         "DATABASE.high_watermark2.message_severity_level");
     622          16 :     GetOptValue<string>(
     623           8 :         var_map, db_write_options_.low_watermark2_message_severity_level_,
     624             :         "DATABASE.low_watermark2.message_severity_level");
     625             : 
     626           8 :     if (GetOptValueIfNotDefaulted<uint16_t>(var_map, collector_structured_syslog_port_,
     627             :             "STRUCTURED_SYSLOG_COLLECTOR.port")) {
     628           2 :         collector_structured_syslog_port_configured_ = true;
     629             :     } else {
     630           6 :         collector_structured_syslog_port_configured_ = false;
     631             :     }
     632           8 :     GetOptValue< vector<string> >(var_map, collector_structured_syslog_tcp_forward_destination_,
     633             :                                   "STRUCTURED_SYSLOG_COLLECTOR.tcp_forward_destination");
     634             : 
     635           8 :     GetOptValue< vector<string> >(var_map, collector_structured_syslog_kafka_broker_list_,
     636             :                                   "STRUCTURED_SYSLOG_COLLECTOR.kafka_broker_list");
     637             : 
     638           8 :     GetOptValue<string>(var_map, collector_structured_syslog_kafka_topic_,
     639             :                                   "STRUCTURED_SYSLOG_COLLECTOR.kafka_topic");
     640             : 
     641           8 :     GetOptValue<uint16_t>(var_map, collector_structured_syslog_kafka_partitions_,
     642             :                                   "STRUCTURED_SYSLOG_COLLECTOR.kafka_partitions");
     643             :     
     644           8 :     GetOptValue<uint64_t>(var_map, collector_structured_syslog_active_session_map_limit_,
     645             :                                   "STRUCTURED_SYSLOG_COLLECTOR.active_session_map_limit");
     646             : 
     647           8 :     GetOptValue<uint64_t>(var_map, analytics_data_ttl_,
     648             :                      "DEFAULT.analytics_data_ttl");
     649           8 :     if (analytics_data_ttl_ == (uint64_t)-1) {
     650           0 :         analytics_data_ttl_ = g_viz_constants.TtlValuesDefault.find(TtlType::GLOBAL_TTL)->second;
     651             :     }
     652           8 :     GetOptValue<uint64_t>(var_map, analytics_config_audit_ttl_,
     653             :                      "DEFAULT.analytics_config_audit_ttl");
     654           8 :     if (analytics_config_audit_ttl_ == (uint64_t)-1) {
     655           0 :         analytics_config_audit_ttl_ = g_viz_constants.TtlValuesDefault.find(TtlType::CONFIGAUDIT_TTL)->second;
     656             :     }
     657           8 :     GetOptValue<uint64_t>(var_map, analytics_statistics_ttl_,
     658             :                      "DEFAULT.analytics_statistics_ttl");
     659           8 :     if (analytics_statistics_ttl_ == (uint64_t)-1) {
     660           0 :         analytics_statistics_ttl_ = g_viz_constants.TtlValuesDefault.find(TtlType::STATSDATA_TTL)->second;
     661             :     }
     662           8 :     GetOptValue<uint64_t>(var_map, analytics_flow_ttl_,
     663             :                      "DEFAULT.analytics_flow_ttl");
     664           8 :     if (analytics_flow_ttl_ == (uint64_t)-1) {
     665           0 :         analytics_flow_ttl_ = g_viz_constants.TtlValuesDefault.find(TtlType::FLOWDATA_TTL)->second;
     666             :     }
     667             : 
     668           8 :     GetOptValue< vector<string> >(var_map, cassandra_server_list_,
     669             :                                   "DEFAULT.cassandra_server_list");
     670           8 :     GetOptValue<string>(var_map, zookeeper_server_list_,
     671             :                         "DEFAULT.zookeeper_server_list");
     672           8 :     GetOptValue< vector<string> >(var_map, kafka_broker_list_,
     673             :                                   "KAFKA.kafka_broker_list");
     674           8 :     GetOptValue<uint16_t>(var_map, partitions_, "DEFAULT.partitions");
     675           8 :     GetOptValue<string>(var_map, host_ip_, "DEFAULT.hostip");
     676           8 :     GetOptValue<string>(var_map, hostname_, "DEFAULT.hostname");
     677           8 :     GetOptValue<uint16_t>(var_map, http_server_port_,
     678             :                           "DEFAULT.http_server_port");
     679             : 
     680           8 :     GetOptValue<string>(var_map, log_category_, "DEFAULT.log_category");
     681           8 :     GetOptValue<string>(var_map, log_file_, "DEFAULT.log_file");
     682           8 :     GetOptValue<string>(var_map, log_property_file_, "DEFAULT.log_property_file");
     683           8 :     GetOptValue<int>(var_map, log_files_count_, "DEFAULT.log_files_count");
     684           8 :     GetOptValue<long>(var_map, log_file_size_, "DEFAULT.log_file_size");
     685           8 :     GetOptValue<string>(var_map, log_level_, "DEFAULT.log_level");
     686           8 :     GetOptValue<bool>(var_map, use_syslog_, "DEFAULT.use_syslog");
     687           8 :     GetOptValue<string>(var_map, syslog_facility_, "DEFAULT.syslog_facility");
     688           8 :     GetOptValue<string>(var_map, kafka_prefix_, "DATABASE.cluster_id");
     689           8 :     GetOptValue<bool>(var_map, kafka_options_.ssl_enable, "KAFKA.kafka_ssl_enable");
     690           8 :     GetOptValue<string>(var_map, kafka_options_.keyfile, "KAFKA.kafka_keyfile");
     691           8 :     GetOptValue<string>(var_map, kafka_options_.certfile, "KAFKA.kafka_certfile");
     692           8 :     GetOptValue<string>(var_map, kafka_options_.ca_cert, "KAFKA.kafka_ca_cert");
     693           8 :     GetOptValue<uint16_t>(var_map, redis_port_, "REDIS.port");
     694           8 :     GetOptValue<string>(var_map, redis_server_, "REDIS.server");
     695           8 :     GetOptValue<string>(var_map, redis_password_, "REDIS.password");
     696             : 
     697           8 :     GetOptValue<string>(var_map, cassandra_options_.cluster_id_, "DATABASE.cluster_id");
     698             : 
     699           8 :     GetOptValue<string>(var_map, cassandra_options_.user_,
     700             :         "CASSANDRA.cassandra_user");
     701           8 :     GetOptValue<string>(var_map, cassandra_options_.password_,
     702             :         "CASSANDRA.cassandra_password");
     703           8 :     GetOptValue<bool>(var_map, cassandra_options_.use_ssl_,
     704             :         "CASSANDRA.cassandra_use_ssl");
     705           8 :     GetOptValue<string>(var_map, cassandra_options_.ca_certs_,
     706             :         "CASSANDRA.cassandra_ca_certs");
     707           8 :     GetOptValue<string>(var_map, cassandra_options_.compaction_strategy_,
     708             :         "CASSANDRA.compaction_strategy");
     709           8 :     GetOptValue<string>(var_map, cassandra_options_.replication_factor_,
     710             :         "CASSANDRA.replication_factor");
     711          16 :     if (!ValidateCompactionStrategyOption(
     712           8 :         cassandra_options_.compaction_strategy_,
     713             :         "CASSANDRA.compaction_strategy")) {
     714           0 :         exit(-1);
     715             :     }
     716          16 :     GetOptValue<string>(var_map,
     717           8 :         cassandra_options_.flow_tables_compaction_strategy_,
     718             :         "CASSANDRA.flow_tables.compaction_strategy");
     719          16 :     if (!ValidateCompactionStrategyOption(
     720           8 :         cassandra_options_.flow_tables_compaction_strategy_,
     721             :         "CASSANDRA.flow_tables.compaction_strategy")) {
     722           0 :         exit(-1);
     723             :     }
     724           8 :     GetOptValue<uint16_t>(var_map, ks_port_, "KEYSTONE.auth_port");
     725           8 :     GetOptValue<string>(var_map, ks_server_, "KEYSTONE.auth_host");
     726           8 :     GetOptValue<string>(var_map, ks_protocol_, "KEYSTONE.auth_protocol");
     727           8 :     GetOptValue<string>(var_map, ks_user_, "KEYSTONE.admin_user");
     728           8 :     GetOptValue<string>(var_map, ks_password_, "KEYSTONE.admin_password");
     729           8 :     GetOptValue<string>(var_map, ks_tenant_, "KEYSTONE.admin_tenant_name");
     730           8 :     GetOptValue<string>(var_map, ks_authurl_, "KEYSTONE.auth_url");
     731           8 :     GetOptValue<string>(var_map, memcache_servers_, "KEYSTONE.memcache_servers");
     732           8 :     GetOptValue<string>(var_map, ks_cert_, "KEYSTONE.certfile");
     733           8 :     GetOptValue<string>(var_map, ks_key_, "KEYSTONE.keyfile");
     734           8 :     GetOptValue<string>(var_map, ks_ca_, "KEYSTONE.cafile");
     735             : 
     736           8 :     sandesh::options::ProcessOptions(var_map, &sandesh_config_);
     737             : 
     738           8 :     GetOptValue< vector<string> >(var_map, api_server_list_,
     739             :                                   "API_SERVER.api_server_list");
     740           8 :     api_server_checksum_ = GenerateHash(api_server_list_);
     741           8 :     std::random_shuffle(api_server_list_.begin(), api_server_list_.end());
     742             : 
     743           8 :     GetOptValue<bool>(var_map, api_server_use_ssl_,
     744             :                       "API_SERVER.api_server_use_ssl");
     745           8 :     ParseConfigOptions(var_map);
     746           8 : }
     747             : 
     748           0 : void Options::ParseReConfig() {
     749             :     // ReParse the filtered config params
     750           0 :     opt::variables_map var_map;
     751           0 :     ifstream config_file_in;
     752           0 :     for(std::vector<int>::size_type i = 0; i != config_file_.size(); i++) {
     753           0 :         config_file_in.open(config_file_[i].c_str());
     754           0 :         if (config_file_in.good()) {
     755           0 :            opt::store(opt::parse_config_file(config_file_in,
     756           0 :                                     config_file_options_, true), var_map);
     757             :         }
     758           0 :         config_file_in.close();
     759             :     }
     760           0 :     api_server_list_.clear();
     761           0 :     GetOptValue< vector<string> >(var_map, api_server_list_,
     762             :                                   "API_SERVER.api_server_list");
     763           0 :     uint32_t new_checksum = GenerateHash(api_server_list_);
     764           0 :     if (api_server_checksum_ != new_checksum) {
     765           0 :         api_server_checksum_ = new_checksum;
     766           0 :         std::random_shuffle(api_server_list_.begin(),
     767             :                             api_server_list_.end());
     768             :     }
     769             : 
     770           0 :     uint32_t old_config_chksum = configdb_chksum_;
     771           0 :     ParseConfigOptions(var_map);
     772           0 :     if ((old_config_chksum != configdb_chksum_) && config_client_manager_) {
     773           0 :         config_client_manager_->ReinitConfigClient(configdb_options());
     774             :     }
     775           0 : }
     776             : 
     777           8 : void Options::ParseConfigOptions(const boost::program_options::variables_map
     778             :                                  &var_map) {
     779           8 :     configdb_options_.config_db_server_list.clear();
     780          16 :     GetOptValue< vector<string> >(var_map,
     781           8 :                                   configdb_options_.config_db_server_list,
     782             :                                   "CONFIGDB.config_db_server_list");
     783          16 :     GetOptValue<string>(var_map,
     784           8 :                      configdb_options_.config_db_username,
     785             :                      "CONFIGDB.config_db_username");
     786          16 :     GetOptValue<string>(var_map,
     787           8 :                      configdb_options_.config_db_password,
     788             :                      "CONFIGDB.config_db_password");
     789          16 :     GetOptValue<bool>(var_map,
     790           8 :                      configdb_options_.config_db_use_ssl,
     791             :                      "CONFIGDB.config_db_use_ssl");
     792          16 :     GetOptValue<string>(var_map,
     793           8 :                      configdb_options_.config_db_ca_certs,
     794             :                      "CONFIGDB.config_db_ca_certs");
     795           8 :     configdb_options_.rabbitmq_server_list.clear();
     796          16 :     GetOptValue< vector<string> >(var_map,
     797           8 :                      configdb_options_.rabbitmq_server_list,
     798             :                      "CONFIGDB.rabbitmq_server_list");
     799          16 :     GetOptValue<string>(var_map,
     800           8 :                      configdb_options_.rabbitmq_user,
     801             :                      "CONFIGDB.rabbitmq_user");
     802          16 :     GetOptValue<string>(var_map,
     803           8 :                      configdb_options_.rabbitmq_password,
     804             :                      "CONFIGDB.rabbitmq_password");
     805          16 :     GetOptValue<string>(var_map,
     806           8 :                      configdb_options_.rabbitmq_vhost,
     807             :                      "CONFIGDB.rabbitmq_vhost");
     808          16 :     GetOptValue<bool>(var_map,
     809           8 :                      configdb_options_.rabbitmq_use_ssl,
     810             :                      "CONFIGDB.rabbitmq_use_ssl");
     811          16 :     GetOptValue<string>(var_map,
     812           8 :                      configdb_options_.rabbitmq_ssl_version,
     813             :                      "CONFIGDB.rabbitmq_ssl_version");
     814          16 :     GetOptValue<string>(var_map,
     815           8 :                      configdb_options_.rabbitmq_ssl_keyfile,
     816             :                      "CONFIGDB.rabbitmq_ssl_keyfile");
     817          16 :     GetOptValue<string>(var_map,
     818           8 :                      configdb_options_.rabbitmq_ssl_certfile,
     819             :                      "CONFIGDB.rabbitmq_ssl_certfile");
     820          16 :     GetOptValue<string>(var_map,
     821           8 :                      configdb_options_.rabbitmq_ssl_ca_certs,
     822             :                      "CONFIGDB.rabbitmq_ssl_ca_certs");
     823           8 :     configdb_chksum_ = GenerateHash(configdb_options_);
     824           8 : }

Generated by: LCOV version 1.14