Skip to content

Commit 1bd734b

Browse files
authored
[systemd-generator] add support for platform config file (#18730)
In addition to /etc/sonic/generated_services.conf, the generator now processes the platform config in /usr/share/sonic/device/%platform/services.conf - Why I did it This is to support platform-specific systemd-sonic-generator config file. It allows loading additional services based on platform (/etc/machine.conf) information on boot. - How I did it Added /usr/share/sonic/device/%platform/services.conf processing (if such file exists). The %platform is already available in systemd-sonic-generator (read from /etc/machine.conf) The unit test is updated to cover new functionality. - How to verify it Run the systemd-sonic-generator unit tests Signed-off-by: Yakiv Huryk <[email protected]>
1 parent 4839a7b commit 1bd734b

File tree

3 files changed

+73
-12
lines changed

3 files changed

+73
-12
lines changed

src/systemd-sonic-generator/ssg-test.cc

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ const std::string TEST_ROOT_DIR = "tests/ssg-test/";
4444
const std::string TEST_UNIT_FILE_PREFIX = TEST_ROOT_DIR + "systemd/";
4545
const std::string TEST_LIB_NETWORK = TEST_UNIT_FILE_PREFIX + "network/";
4646
const std::string TEST_ASIC_CONF_FORMAT = TEST_ROOT_DIR + "%s/asic.conf";
47-
const std::string TEST_PLATFORM_CONF_FORMAT = TEST_ROOT_DIR + "%s/platform.json";
47+
const std::string TEST_PLATFORM_FILE_FORMAT = TEST_ROOT_DIR + "%s/platform.json";
4848
const std::string TEST_MACHINE_CONF = TEST_ROOT_DIR + "machine.conf";
49+
const std::string TEST_PLATFORM_CONF_FORMAT = TEST_ROOT_DIR + "%s/services.conf";
4950

5051
const std::string TEST_PLATFORM_DIR = TEST_ROOT_DIR + "test_platform/";
5152
const std::string TEST_ASIC_CONF = TEST_PLATFORM_DIR + "asic.conf";
@@ -58,6 +59,7 @@ const std::string TEST_CONFIG_FILE = TEST_ROOT_DIR + "generated_services.conf";
5859

5960
const std::string TEST_UNIT_FILES = "tests/testfiles/";
6061

62+
const std::string TEST_PLATFORM_CONFIG = TEST_PLATFORM_DIR + "services.conf";
6163

6264
/* Input data for generated_services.conf */
6365
const std::vector<std::string> generated_services = {
@@ -87,6 +89,7 @@ class SystemdSonicGeneratorFixture : public testing::Test {
8789
config_file_ = g_config_file;
8890
machine_config_file_ = g_machine_config_file;
8991
asic_conf_format_ = g_asic_conf_format;
92+
platform_conf_format_ = g_platform_conf_format;
9093
}
9194

9295
/* Restore global vars */
@@ -95,6 +98,7 @@ class SystemdSonicGeneratorFixture : public testing::Test {
9598
g_config_file = config_file_;
9699
g_machine_config_file = machine_config_file_;
97100
g_asic_conf_format = asic_conf_format_;
101+
g_platform_conf_format = platform_conf_format_;
98102

99103
g_ssg_test_mutex.unlock();
100104
}
@@ -104,6 +108,7 @@ class SystemdSonicGeneratorFixture : public testing::Test {
104108
const char* config_file_;
105109
const char* machine_config_file_;
106110
const char* asic_conf_format_;
111+
const char* platform_conf_format_;
107112
};
108113

109114
/*
@@ -166,6 +171,11 @@ class SsgFunctionTest : public SystemdSonicGeneratorFixture {
166171
ASSERT_NE(fp, nullptr);
167172
fputs("onie_platform=test_platform", fp);
168173
fclose(fp);
174+
175+
fp = fopen(TEST_PLATFORM_CONFIG.c_str(), "w");
176+
ASSERT_NE(fp, nullptr);
177+
fputs("platform_specific.service\n", fp);
178+
fclose(fp);
169179
generate_generated_services_conf();
170180
copyfiles(TEST_UNIT_FILES.c_str(), TEST_UNIT_FILE_PREFIX.c_str());
171181
}
@@ -360,7 +370,7 @@ class SsgMainTest : public SsgFunctionTest {
360370
g_config_file = TEST_CONFIG_FILE.c_str();
361371
g_machine_config_file = TEST_MACHINE_CONF.c_str();
362372
g_asic_conf_format = TEST_ASIC_CONF_FORMAT.c_str();
363-
g_platform_file_format = TEST_PLATFORM_CONF_FORMAT.c_str();
373+
g_platform_file_format = TEST_PLATFORM_FILE_FORMAT.c_str();
364374
std::string lib_systemd = fs::current_path().string() + "/" + TEST_UNIT_FILE_PREFIX;
365375
g_lib_systemd = lib_systemd.c_str();
366376
std::string etc_systemd = fs::current_path().string() + "/" + TEST_OUTPUT_DIR;
@@ -573,6 +583,11 @@ TEST_F(SystemdSonicGeneratorFixture, get_global_vars) {
573583
EXPECT_STREQ(get_asic_conf_format(), ASIC_CONF_FORMAT);
574584
g_asic_conf_format = TEST_ASIC_CONF_FORMAT.c_str();
575585
EXPECT_STREQ(get_asic_conf_format(), TEST_ASIC_CONF_FORMAT.c_str());
586+
587+
EXPECT_EQ(g_platform_conf_format, nullptr);
588+
EXPECT_STREQ(get_platform_conf_format(), PLATFORM_CONF_FORMAT);
589+
g_platform_conf_format = TEST_PLATFORM_CONF_FORMAT.c_str();
590+
EXPECT_STREQ(get_platform_conf_format(), TEST_PLATFORM_CONF_FORMAT.c_str());
576591
}
577592

578593
TEST_F(SystemdSonicGeneratorFixture, global_vars) {
@@ -592,6 +607,7 @@ TEST_F(SsgFunctionTest, missing_file) {
592607
EXPECT_TRUE(fs::exists(TEST_UNIT_FILE_PREFIX.c_str()));
593608
EXPECT_TRUE(fs::exists(TEST_OUTPUT_DIR.c_str()));
594609
EXPECT_TRUE(fs::exists(TEST_PLATFORM_DIR.c_str()));
610+
EXPECT_TRUE(fs::exists(TEST_PLATFORM_CONFIG.c_str()));
595611
}
596612

597613
/* TEST insert_instance_number() */
@@ -637,7 +653,7 @@ TEST_F(SsgFunctionTest, get_unit_files) {
637653
g_etc_systemd = TEST_OUTPUT_DIR.c_str();
638654
g_config_file = TEST_CONFIG_FILE.c_str();
639655
char* unit_files[NUM_UNIT_FILES] = { NULL };
640-
int num_unit_files = get_unit_files(unit_files);
656+
int num_unit_files = get_unit_files(g_config_file, unit_files, NUM_UNIT_FILES);
641657
// Exclude the midplane-network-{npu/dpu}.service which is only used for smart switch
642658
auto non_smart_switch_generated_services = generated_services;
643659
non_smart_switch_generated_services.erase(
@@ -666,6 +682,17 @@ TEST_F(SsgFunctionTest, get_unit_files) {
666682
}
667683
}
668684

685+
/* TEST get_platform_unit_files()*/
686+
TEST_F(SsgFunctionTest, get_platform_unit_files) {
687+
g_unit_file_prefix = TEST_UNIT_FILE_PREFIX.c_str();
688+
g_config_file = TEST_CONFIG_FILE.c_str();
689+
g_platform_conf_format = TEST_PLATFORM_CONF_FORMAT.c_str();
690+
char* unit_files[NUM_UNIT_FILES];
691+
int num_unit_files = get_platform_unit_files(unit_files, NUM_UNIT_FILES);
692+
EXPECT_EQ(num_unit_files, 1);
693+
EXPECT_EQ(std::string(unit_files[0]), "platform_specific.service");
694+
}
695+
669696
/* TEST ssg_main() argv error */
670697
TEST_F(SsgMainTest, ssg_main_argv) {
671698
std::vector<char*> argv_;

src/systemd-sonic-generator/systemd-sonic-generator.cpp

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const char* CONFIG_FILE = "/etc/sonic/generated_services.conf";
2727
const char* MACHINE_CONF_FILE = "/host/machine.conf";
2828
const char* ASIC_CONF_FORMAT = "/usr/share/sonic/device/%s/asic.conf";
2929
const char* PLATFORM_FILE_FORMAT = "/usr/share/sonic/device/%s/platform.json";
30+
const char* PLATFORM_CONF_FORMAT = "/usr/share/sonic/device/%s/services.conf";
3031
const char* DPU_PREFIX = "dpu";
3132

3233

@@ -65,6 +66,13 @@ const char* get_platform_file_format() {
6566
return (g_platform_file_format) ? g_platform_file_format : PLATFORM_FILE_FORMAT;
6667
}
6768

69+
const char* g_platform_conf_format = NULL;
70+
const char* get_platform_conf_format() {
71+
return (g_platform_conf_format) ? g_platform_conf_format : PLATFORM_CONF_FORMAT;
72+
}
73+
74+
const char* get_platform();
75+
6876
static int num_asics;
6977
static char** multi_instance_services;
7078
static int num_multi_inst;
@@ -440,16 +448,15 @@ int get_install_targets(std::string unit_file, char* targets[]) {
440448
}
441449

442450

443-
int get_unit_files(char* unit_files[]) {
451+
int get_unit_files(const char* config_file, char* unit_files[], int unit_files_size) {
444452
/***
445-
Reads a list of unit files to be installed from /etc/sonic/generated_services.conf
453+
Reads a list of unit files to be installed from config_file
446454
***/
447455
FILE *fp;
448456
char *line = NULL;
449457
size_t len = 0;
450458
ssize_t read;
451459
char *pos;
452-
const char* config_file = get_config_file();
453460

454461
fp = fopen(config_file, "r");
455462

@@ -459,12 +466,14 @@ int get_unit_files(char* unit_files[]) {
459466
}
460467

461468
int num_unit_files = 0;
462-
num_multi_inst = 0;
463469

464-
multi_instance_services = (char**) calloc(MAX_NUM_UNITS, sizeof(char *));
470+
if (!multi_instance_services) {
471+
num_multi_inst = 0;
472+
multi_instance_services = (char**) calloc(MAX_NUM_UNITS, sizeof(char *));
473+
}
465474

466475
while ((read = getline(&line, &len, fp)) != -1) {
467-
if (num_unit_files >= MAX_NUM_UNITS) {
476+
if (num_unit_files >= unit_files_size) {
468477
fprintf(stderr, "Maximum number of units exceeded, ignoring extras\n");
469478
break;
470479
}
@@ -501,6 +510,23 @@ int get_unit_files(char* unit_files[]) {
501510
return num_unit_files;
502511
}
503512

513+
int get_platform_unit_files(char* unit_files[], int unit_files_size)
514+
{
515+
const char* platform = get_platform();
516+
if (!platform) {
517+
return 0;
518+
}
519+
520+
char config_file[PATH_MAX];
521+
snprintf(config_file, PATH_MAX, get_platform_conf_format(), platform);
522+
523+
if (access(config_file, R_OK) != 0) {
524+
return 0;
525+
}
526+
527+
return get_unit_files(config_file, unit_files, unit_files_size);
528+
}
529+
504530

505531
std::string insert_instance_number(const std::string& unit_file, int instance, const std::string& instance_prefix) {
506532
/***
@@ -957,7 +983,7 @@ static int render_network_service_for_smart_switch() {
957983
size_t file_size = ftell(fp);
958984
fseek(fp, 0, SEEK_SET);
959985
size_t len = file_size + buffer_instruction.length() + 1;
960-
char *unit_content = (char*) malloc(len);
986+
char *unit_content = (char*) calloc(len, sizeof(unit_content));
961987
if (unit_content == NULL) {
962988
fprintf(stderr, "Failed to allocate memory for %s\n", unit_path.c_str());
963989
fclose(fp);
@@ -1080,7 +1106,9 @@ int ssg_main(int argc, char **argv) {
10801106
num_dpus = get_num_of_dpu();
10811107

10821108
install_dir = std::string(argv[1]) + "/";
1083-
num_unit_files = get_unit_files(unit_files);
1109+
const char* config_file = get_config_file();
1110+
num_unit_files = get_unit_files(config_file, unit_files, MAX_NUM_UNITS);
1111+
num_unit_files += get_platform_unit_files(&unit_files[num_unit_files], MAX_NUM_UNITS - num_unit_files);
10841112

10851113
// Install and render midplane network service for smart switch
10861114
if (smart_switch) {
@@ -1125,6 +1153,8 @@ int ssg_main(int argc, char **argv) {
11251153
free(multi_instance_services[i]);
11261154
}
11271155
free(multi_instance_services);
1156+
multi_instance_services = NULL;
1157+
num_multi_inst = 0;
11281158

11291159
if (is_valid_pointer(platform_info)) {
11301160
json_object_put(platform_info);

src/systemd-sonic-generator/systemd-sonic-generator.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,28 @@ extern const char* CONFIG_FILE;
1818
extern const char* MACHINE_CONF_FILE;
1919
extern const char* ASIC_CONF_FORMAT;
2020
extern const char* PLATFORM_FILE_FORMAT;
21+
extern const char* PLATFORM_CONF_FORMAT;
2122
extern const char* g_lib_systemd;
2223
extern const char* g_etc_systemd;
2324
extern const char* g_unit_file_prefix;
2425
extern const char* g_config_file;
2526
extern const char* g_machine_config_file;
2627
extern const char* g_asic_conf_format;
2728
extern const char* g_platform_file_format;
29+
extern const char* g_platform_conf_format;
2830

2931
/* C-functions under test */
3032
extern const char* get_unit_file_prefix();
3133
extern const char* get_config_file();
3234
extern const char* get_machine_config_file();
3335
extern const char* get_asic_conf_format();
36+
extern const char* get_platform_conf_format();
3437
extern std::string insert_instance_number(const std::string& unit_file, int instance, const std::string& instance_prefix);
3538
extern int ssg_main(int argc, char** argv);
3639
extern int get_num_of_asic();
3740
extern int get_install_targets(std::string unit_file, char* targets[]);
38-
extern int get_unit_files(char* unit_files[]);
41+
extern int get_unit_files(const char* config_file, char* unit_files[], int unit_files_size);
42+
extern int get_platform_unit_files(char* unit_files[], int unit_files_size);
3943
// #ifdef __cplusplus
4044
// }
4145
// #endif

0 commit comments

Comments
 (0)