Skip to content

Commit 33ac34e

Browse files
authored
Move command line options and parser to separate classes (sonic-net#541)
* Move ntf_queue to proper NotificationQueue class * Move command line options and parser to separate classes * Address comments * Address comments
1 parent da71bdb commit 33ac34e

9 files changed

+416
-241
lines changed

syncd/CommandLineOptions.cpp

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#include "CommandLineOptions.h"
2+
3+
#include "swss/logger.h"
4+
5+
#include <sstream>
6+
7+
CommandLineOptions::CommandLineOptions()
8+
{
9+
SWSS_LOG_ENTER();
10+
11+
// default values for command line options
12+
13+
m_enableDiagShell = false;
14+
m_enableTempView = false;
15+
m_disableExitSleep = false;
16+
m_enableUnittests = false;
17+
m_enableConsistencyCheck = false;
18+
m_enableSyncMode = false;
19+
20+
m_startType = SAI_START_TYPE_COLD_BOOT;
21+
22+
m_profileMapFile = "";
23+
24+
#ifdef SAITHRIFT
25+
26+
m_runRPCServer = false;
27+
28+
m_portMapFile = "";
29+
30+
#endif // SAITHRIFT
31+
32+
}
33+
34+
std::string CommandLineOptions::getCommandLineString() const
35+
{
36+
SWSS_LOG_ENTER();
37+
38+
std::stringstream ss;
39+
40+
ss << " EnableDiagShell=" << (m_enableDiagShell ? "YES" : "NO");
41+
ss << " EnableTempView=" << (m_enableTempView ? "YES" : "NO");
42+
ss << " DisableExitSleep=" << (m_disableExitSleep ? "YES" : "NO");
43+
ss << " EnableUnittests=" << (m_enableUnittests ? "YES" : "NO");
44+
ss << " EnableConsistencyCheck=" << (m_enableConsistencyCheck ? "YES" : "NO");
45+
ss << " EnableSyncMode=" << (m_enableSyncMode ? "YES" : "NO");
46+
ss << " StartType=" << startTypeToString(m_startType);
47+
ss << " ProfileMapFile=" << m_profileMapFile;
48+
49+
#ifdef SAITHRIFT
50+
51+
ss << " RunRPCServer=" << (m_runRPCServer ? "YES" ? "NO");
52+
ss << " PortMapFile=" << m_portMapFile;
53+
54+
#endif // SAITHRIFT
55+
56+
return ss.str();
57+
}
58+
59+
sai_start_type_t CommandLineOptions::startTypeStringToStartType(
60+
_In_ const std::string& startType)
61+
{
62+
SWSS_LOG_ENTER();
63+
64+
if (startType == STRING_SAI_START_TYPE_COLD_BOOT)
65+
return SAI_START_TYPE_COLD_BOOT;
66+
67+
if (startType == STRING_SAI_START_TYPE_WARM_BOOT)
68+
return SAI_START_TYPE_WARM_BOOT;
69+
70+
if (startType == STRING_SAI_START_TYPE_FAST_BOOT)
71+
return SAI_START_TYPE_FAST_BOOT;
72+
73+
if (startType == STRING_SAI_START_TYPE_FASTFAST_BOOT)
74+
return SAI_START_TYPE_FASTFAST_BOOT;
75+
76+
if (startType == STRING_SAI_START_TYPE_UNKNOWN)
77+
return SAI_START_TYPE_UNKNOWN;
78+
79+
SWSS_LOG_WARN("unknown startType: '%s'", startType.c_str());
80+
81+
return SAI_START_TYPE_UNKNOWN;
82+
}
83+
84+
std::string CommandLineOptions::startTypeToString(
85+
_In_ sai_start_type_t startType)
86+
{
87+
SWSS_LOG_ENTER();
88+
89+
switch (startType)
90+
{
91+
case SAI_START_TYPE_COLD_BOOT:
92+
return STRING_SAI_START_TYPE_COLD_BOOT;
93+
94+
case SAI_START_TYPE_WARM_BOOT:
95+
return STRING_SAI_START_TYPE_WARM_BOOT;
96+
97+
case SAI_START_TYPE_FAST_BOOT:
98+
return STRING_SAI_START_TYPE_FAST_BOOT;
99+
100+
case SAI_START_TYPE_FASTFAST_BOOT:
101+
return STRING_SAI_START_TYPE_FASTFAST_BOOT;
102+
103+
case SAI_START_TYPE_UNKNOWN:
104+
return STRING_SAI_START_TYPE_UNKNOWN;
105+
106+
default:
107+
108+
SWSS_LOG_WARN("unknown startType '%d'", startType);
109+
110+
return STRING_SAI_START_TYPE_UNKNOWN;
111+
}
112+
}
113+

syncd/CommandLineOptions.h

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#pragma once
2+
3+
#include "swss/sal.h"
4+
5+
#include <string>
6+
7+
#define STRING_SAI_START_TYPE_COLD_BOOT "cold"
8+
#define STRING_SAI_START_TYPE_WARM_BOOT "warm"
9+
#define STRING_SAI_START_TYPE_FAST_BOOT "fast"
10+
#define STRING_SAI_START_TYPE_FASTFAST_BOOT "fastfast"
11+
#define STRING_SAI_START_TYPE_UNKNOWN "unknown"
12+
13+
typedef enum _sai_start_type_t
14+
{
15+
SAI_START_TYPE_COLD_BOOT = 0,
16+
17+
SAI_START_TYPE_WARM_BOOT = 1,
18+
19+
SAI_START_TYPE_FAST_BOOT = 2,
20+
21+
/**
22+
* A special type of boot used by Mellanox platforms to start in 'fastfast'
23+
* boot mode
24+
*/
25+
SAI_START_TYPE_FASTFAST_BOOT = 3,
26+
27+
/**
28+
* Set at last, just for error purpose.
29+
*/
30+
SAI_START_TYPE_UNKNOWN
31+
32+
} sai_start_type_t;
33+
34+
class CommandLineOptions
35+
{
36+
public:
37+
38+
CommandLineOptions();
39+
40+
virtual ~CommandLineOptions() = default;
41+
42+
public:
43+
44+
virtual std::string getCommandLineString() const;
45+
46+
public:
47+
48+
static sai_start_type_t startTypeStringToStartType(
49+
_In_ const std::string& startType);
50+
51+
static std::string startTypeToString(
52+
_In_ sai_start_type_t startType);
53+
54+
public:
55+
56+
bool m_enableDiagShell;
57+
bool m_enableTempView;
58+
bool m_disableExitSleep;
59+
bool m_enableUnittests;
60+
61+
/**
62+
* When set to true will enable DB vs ASIC consistency check after
63+
* comparison logic.
64+
*/
65+
bool m_enableConsistencyCheck;
66+
67+
bool m_enableSyncMode;
68+
69+
sai_start_type_t m_startType;
70+
71+
std::string m_profileMapFile;
72+
73+
#ifdef SAITHRIFT
74+
bool m_runRPCServer;
75+
std::string m_portMapFile;
76+
#endif // SAITHRIFT
77+
78+
};
79+

syncd/CommandLineOptionsParser.cpp

+154
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
#include "CommandLineOptionsParser.h"
2+
3+
#include <getopt.h>
4+
5+
std::shared_ptr<CommandLineOptions> CommandLineOptionsParser::parseCommandLine(
6+
_In_ int argc,
7+
_In_ char **argv)
8+
{
9+
SWSS_LOG_ENTER();
10+
11+
auto options = std::make_shared<CommandLineOptions>();
12+
13+
#ifdef SAITHRIFT
14+
const char* const optstring = "dp:t:uSUCsrm:h";
15+
#else
16+
const char* const optstring = "dp:t:uSUCsh";
17+
#endif // SAITHRIFT
18+
19+
while(true)
20+
{
21+
static struct option long_options[] =
22+
{
23+
{ "diag", no_argument, 0, 'd' },
24+
{ "profile", required_argument, 0, 'p' },
25+
{ "startType", required_argument, 0, 't' },
26+
{ "useTempView", no_argument, 0, 'u' },
27+
{ "disableExitSleep", no_argument, 0, 'S' },
28+
{ "enableUnittests", no_argument, 0, 'U' },
29+
{ "enableConsistencyCheck", no_argument, 0, 'C' },
30+
{ "syncMode", no_argument, 0, 's' },
31+
#ifdef SAITHRIFT
32+
{ "rpcserver", no_argument, 0, 'r' },
33+
{ "portmap", required_argument, 0, 'm' },
34+
#endif // SAITHRIFT
35+
{ "help", no_argument, 0, 'h' },
36+
{ 0, 0, 0, 0 }
37+
};
38+
39+
int option_index = 0;
40+
41+
int c = getopt_long(argc, argv, optstring, long_options, &option_index);
42+
43+
if (c == -1)
44+
{
45+
break;
46+
}
47+
48+
switch (c)
49+
{
50+
case 'd':
51+
options->m_enableDiagShell = true;
52+
break;
53+
54+
case 'p':
55+
options->m_profileMapFile = std::string(optarg);
56+
break;
57+
58+
case 't':
59+
options->m_startType = CommandLineOptions::startTypeStringToStartType(optarg);
60+
61+
if (options->m_startType == SAI_START_TYPE_UNKNOWN)
62+
{
63+
SWSS_LOG_ERROR("unknown start type '%s'", optarg);
64+
exit(EXIT_FAILURE);
65+
}
66+
break;
67+
68+
case 'u':
69+
options->m_enableTempView = true;
70+
break;
71+
72+
case 'S':
73+
options->m_disableExitSleep = true;
74+
break;
75+
76+
case 'U':
77+
options->m_enableUnittests = true;
78+
break;
79+
80+
case 'C':
81+
options->m_enableConsistencyCheck = true;
82+
break;
83+
84+
case 's':
85+
options->m_enableSyncMode = true;
86+
break;
87+
88+
#ifdef SAITHRIFT
89+
case 'r':
90+
options->m_runRPCServer = true;
91+
break;
92+
case 'm':
93+
options->m_portMapFile = std::string(optarg);
94+
break;
95+
#endif // SAITHRIFT
96+
97+
case 'h':
98+
printUsage();
99+
exit(EXIT_SUCCESS);
100+
101+
case '?':
102+
SWSS_LOG_WARN("unknown option %c", optopt);
103+
printUsage();
104+
exit(EXIT_FAILURE);
105+
106+
default:
107+
SWSS_LOG_ERROR("getopt_long failure");
108+
exit(EXIT_FAILURE);
109+
}
110+
}
111+
112+
return options;
113+
}
114+
115+
void CommandLineOptionsParser::printUsage()
116+
{
117+
SWSS_LOG_ENTER();
118+
119+
#ifdef SAITHRIFT
120+
std::cout << "Usage: syncd [-d] [-p profile] [-t type] [-u] [-S] [-U] [-C] [-s] [-r] [-m portmap] [-h]" << std::endl;
121+
#else
122+
std::cout << "Usage: syncd [-d] [-p profile] [-t type] [-u] [-S] [-U] [-C] [-s] [-h]" << std::endl;
123+
#endif // SAITHRIFT
124+
125+
std::cout << " -d --diag" << std::endl;
126+
std::cout << " Enable diagnostic shell" << std::endl;
127+
std::cout << " -p --profile profile" << std::endl;
128+
std::cout << " Provide profile map file" << std::endl;
129+
std::cout << " -t --startType type" << std::endl;
130+
std::cout << " Specify start type (cold|warm|fast|fastfast) " << std::endl;
131+
std::cout << " -u --useTempView" << std::endl;
132+
std::cout << " Use temporary view between init and apply" << std::endl;
133+
std::cout << " -S --disableExitSleep" << std::endl;
134+
std::cout << " Disable sleep when syncd crashes" << std::endl;
135+
std::cout << " -U --enableUnittests" << std::endl;
136+
std::cout << " Metadata enable unittests" << std::endl;
137+
std::cout << " -C --enableConsistencyCheck" << std::endl;
138+
std::cout << " Enable consisteny check DB vs ASIC after comparison logic" << std::endl;
139+
std::cout << " -s --syncMode" << std::endl;
140+
std::cout << " Enable synchronous mode" << std::endl;
141+
142+
#ifdef SAITHRIFT
143+
144+
std::cout << " -r --rpcserver" << std::endl;
145+
std::cout << " Enable rpcserver" << std::endl;
146+
std::cout << " -m --portmap portmap" << std::endl;
147+
std::cout << " Specify port map file" << std::endl;
148+
149+
#endif // SAITHRIFT
150+
151+
std::cout << " -h --help" << std::endl;
152+
std::cout << " Print out this message" << std::endl;
153+
}
154+

syncd/CommandLineOptionsParser.h

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
3+
#include "syncd.h"
4+
#include "CommandLineOptions.h"
5+
6+
#include <memory>
7+
8+
class CommandLineOptionsParser
9+
{
10+
private:
11+
12+
CommandLineOptionsParser() = delete;
13+
14+
~CommandLineOptionsParser() = delete;
15+
16+
public:
17+
18+
static std::shared_ptr<CommandLineOptions> parseCommandLine(
19+
_In_ int argc,
20+
_In_ char **argv);
21+
22+
static void printUsage();
23+
};

syncd/Makefile.am

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ syncd_SOURCES = \
2323
syncd_applyview.cpp \
2424
syncd_flex_counter.cpp \
2525
TimerWatchdog.cpp \
26-
NotificationQueue.cpp
26+
NotificationQueue.cpp \
27+
CommandLineOptions.cpp \
28+
CommandLineOptionsParser.cpp
2729

2830
syncd_CPPFLAGS = $(DBGFLAGS) $(AM_CPPFLAGS) $(CFLAGS_COMMON) $(SAIFLAGS)
2931
syncd_LDADD = -lhiredis -lswsscommon $(SAILIB) -lpthread -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -ldl
@@ -50,7 +52,9 @@ tests_SOURCES = \
5052
syncd_applyview.cpp \
5153
syncd_flex_counter.cpp \
5254
TimerWatchdog.cpp \
53-
NotificationQueue.cpp
55+
NotificationQueue.cpp \
56+
CommandLineOptions.cpp \
57+
CommandLineOptionsParser.cpp
5458

5559
tests_CPPFLAGS = $(DBGFLAGS) $(AM_CPPFLAGS) $(CFLAGS_COMMON)
5660
tests_LDADD = -lhiredis -lswsscommon -lpthread -L$(top_srcdir)/lib/src/.libs -lsairedis -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta

0 commit comments

Comments
 (0)