Skip to content

Commit 36d659f

Browse files
mirskifaGitHub Enterprise
authored andcommitted
Allow externally provided template when using Native HA (#712)
1 parent 105d1f7 commit 36d659f

File tree

11 files changed

+85
-17
lines changed

11 files changed

+85
-17
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* Fix APAR IT46430
88
* Changed build Dockerfile to reduce file duplication across image layers
99
* Changed shutdown flow to continue reaping orphan processes during queue manager shutdown
10+
* Allow Native HA configuration to be externally provided rather than generated from template
1011

1112
## 9.4.0.0 (2024-06)
1213

ha/native-ha.ini.tpl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
NativeHALocalInstance:
2-
Name={{ .Name }}
32
{{ if .ShouldConfigureTLS }}
43
{{ if .CertificateLabel }}
54
CertificateLabel={{ .CertificateLabel }}

internal/ha/ha.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ import (
2828

2929
// ConfigureNativeHA configures native high availability
3030
func ConfigureNativeHA(log *logger.Logger) error {
31+
if !envConfigPresent() {
32+
return nil
33+
}
34+
log.Println("Configuring Native HA using values provided in environment variables")
3135
fileLink := "/run/native-ha.ini"
3236
templateFile := "/etc/mqm/native-ha.ini.tpl"
3337
fipsAvailable := fips.IsFIPSEnabled()
@@ -47,9 +51,28 @@ func loadConfigAndGenerate(templatePath string, outputPath string, fipsAvailable
4751
return cfg.generate(templatePath, outputPath, log)
4852
}
4953

54+
func envConfigPresent() bool {
55+
checkVars := []string{
56+
"MQ_NATIVE_HA_INSTANCE_0_NAME",
57+
"MQ_NATIVE_HA_INSTANCE_0_REPLICATION_ADDRESS",
58+
"MQ_NATIVE_HA_INSTANCE_1_NAME",
59+
"MQ_NATIVE_HA_INSTANCE_1_REPLICATION_ADDRESS",
60+
"MQ_NATIVE_HA_INSTANCE_2_NAME",
61+
"MQ_NATIVE_HA_INSTANCE_2_REPLICATION_ADDRESS",
62+
"MQ_NATIVE_HA_TLS",
63+
"MQ_NATIVE_HA_CIPHERSPEC",
64+
"MQ_NATIVE_HA_KEY_REPOSITORY",
65+
}
66+
for _, checkVar := range checkVars {
67+
if os.Getenv(checkVar) != "" {
68+
return true
69+
}
70+
}
71+
return false
72+
}
73+
5074
func loadConfigFromEnv(log *logger.Logger) (*haConfig, error) {
5175
cfg := &haConfig{
52-
Name: os.Getenv("HOSTNAME"),
5376
Instances: [3]haInstance{
5477
{
5578
Name: os.Getenv("MQ_NATIVE_HA_INSTANCE_0_NAME"),
@@ -90,7 +113,6 @@ func loadConfigFromEnv(log *logger.Logger) (*haConfig, error) {
90113
}
91114

92115
type haConfig struct {
93-
Name string
94116
Instances [3]haInstance
95117
Group haGroupConfig
96118

internal/ha/ha_test.go

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ func TestConfigFromEnv(t *testing.T) {
4141
{
4242
TestName: "Minimal config",
4343
env: map[string]string{
44-
"HOSTNAME": "minimal-config",
4544
"MQ_NATIVE_HA_INSTANCE_0_NAME": "minimal-config-instance0",
4645
"MQ_NATIVE_HA_INSTANCE_1_NAME": "minimal-config-instance1",
4746
"MQ_NATIVE_HA_INSTANCE_2_NAME": "minimal-config-instance2",
@@ -50,7 +49,6 @@ func TestConfigFromEnv(t *testing.T) {
5049
"MQ_NATIVE_HA_INSTANCE_2_REPLICATION_ADDRESS": "minimal-config-instance2(9145)",
5150
},
5251
expected: haConfig{
53-
Name: "minimal-config",
5452
Instances: [3]haInstance{
5553
{"minimal-config-instance0", "minimal-config-instance0(9145)"},
5654
{"minimal-config-instance1", "minimal-config-instance1(9145)"},
@@ -61,7 +59,6 @@ func TestConfigFromEnv(t *testing.T) {
6159
{
6260
TestName: "Full TLS config",
6361
env: map[string]string{
64-
"HOSTNAME": "tls-config",
6562
"MQ_NATIVE_HA_INSTANCE_0_NAME": "tls-config-instance0",
6663
"MQ_NATIVE_HA_INSTANCE_1_NAME": "tls-config-instance1",
6764
"MQ_NATIVE_HA_INSTANCE_2_NAME": "tls-config-instance2",
@@ -77,7 +74,6 @@ func TestConfigFromEnv(t *testing.T) {
7774
fips: asRef(false),
7875
},
7976
expected: haConfig{
80-
Name: "tls-config",
8177
Instances: [3]haInstance{
8278
{"tls-config-instance0", "tls-config-instance0(9145)"},
8379
{"tls-config-instance1", "tls-config-instance1(9145)"},
@@ -95,7 +91,6 @@ func TestConfigFromEnv(t *testing.T) {
9591
{
9692
TestName: "Group TLS (live plain) config",
9793
env: map[string]string{
98-
"HOSTNAME": "group-live-plain-config",
9994
"MQ_NATIVE_HA_INSTANCE_0_NAME": "group-live-plain-config0",
10095
"MQ_NATIVE_HA_INSTANCE_1_NAME": "group-live-plain-config1",
10196
"MQ_NATIVE_HA_INSTANCE_2_NAME": "group-live-plain-config2",
@@ -118,7 +113,6 @@ func TestConfigFromEnv(t *testing.T) {
118113
fips: asRef(false),
119114
},
120115
expected: haConfig{
121-
Name: "group-live-plain-config",
122116
Instances: [3]haInstance{
123117
{"group-live-plain-config0", "group-live-plain-config0(9145)"},
124118
{"group-live-plain-config1", "group-live-plain-config1(9145)"},
@@ -168,6 +162,10 @@ func TestConfigFromEnv(t *testing.T) {
168162
t.Fatalf("Failed to create test logger: %s", err.Error())
169163
}
170164

165+
if !envConfigPresent() {
166+
t.Fatalf("Check for Native HA config by environment variable unexpectedly reported false")
167+
}
168+
171169
// Load config from env
172170
cfg, err := loadConfigFromEnv(testLogger)
173171
t.Log(logBuffer.String())
@@ -185,6 +183,62 @@ func TestConfigFromEnv(t *testing.T) {
185183
}
186184
}
187185

186+
func TestCheckEnv(t *testing.T) {
187+
tests := []struct {
188+
name string
189+
env map[string]string
190+
expect bool
191+
}{
192+
{
193+
name: "empty env",
194+
expect: false,
195+
},
196+
{
197+
name: "Native HA with external config",
198+
env: map[string]string{
199+
"HOSTNAME": "external-config",
200+
"MQ_NATIVE_HA": "true",
201+
},
202+
expect: false,
203+
},
204+
{
205+
name: "Native HA with env config",
206+
env: map[string]string{
207+
"MQ_NATIVE_HA": "true",
208+
"MQ_NATIVE_HA_INSTANCE_0_NAME": "minimal-config-instance0",
209+
"MQ_NATIVE_HA_INSTANCE_1_NAME": "minimal-config-instance1",
210+
"MQ_NATIVE_HA_INSTANCE_2_NAME": "minimal-config-instance2",
211+
"MQ_NATIVE_HA_INSTANCE_0_REPLICATION_ADDRESS": "minimal-config-instance0(9145)",
212+
"MQ_NATIVE_HA_INSTANCE_1_REPLICATION_ADDRESS": "minimal-config-instance1(9145)",
213+
"MQ_NATIVE_HA_INSTANCE_2_REPLICATION_ADDRESS": "minimal-config-instance2(9145)",
214+
},
215+
expect: true,
216+
},
217+
}
218+
for _, test := range tests {
219+
t.Run(test.name, func(t *testing.T) {
220+
// Set environment for test
221+
savedEnv := make([]string, len(os.Environ()))
222+
copy(savedEnv, os.Environ())
223+
defer func() {
224+
os.Clearenv()
225+
for _, env := range savedEnv {
226+
parts := strings.SplitN(env, "=", 2)
227+
os.Setenv(parts[0], parts[1])
228+
}
229+
}()
230+
for key, value := range test.env {
231+
os.Setenv(key, value)
232+
}
233+
234+
actual := envConfigPresent()
235+
if actual != test.expect {
236+
t.Fatalf("Incorrect result from environment variable check (actual: %v != expected: %v)", actual, test.expect)
237+
}
238+
})
239+
}
240+
}
241+
188242
func TestTemplatingFromConfig(t *testing.T) {
189243
tests := []struct {
190244
TestName string
@@ -332,7 +386,6 @@ func TestTemplatingFromConfig(t *testing.T) {
332386

333387
func applyTestDefaults(testConfig haConfig) haConfig {
334388
baseName := "test-config"
335-
setIfBlank(&testConfig.Name, baseName)
336389
for i := 0; i < 3; i++ {
337390
instName := fmt.Sprintf("%s-instance%d", baseName, i)
338391
replAddress := fmt.Sprintf("%s(9145)", instName)

internal/ha/test_fixtures/group-live-minimal.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
NativeHALocalInstance:
2-
Name=test-config
32
GroupName=alpha
43
GroupCertificateLabel=recoveryTLS
54
KeyRepository=/run/runmqserver/ha/tls/key

internal/ha/test_fixtures/group-live-plain-ha.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
NativeHALocalInstance:
2-
Name=test-config
32
CipherSpec=NULL
43
GroupName=alpha
54
GroupCertificateLabel=recoveryTLS

internal/ha/test_fixtures/group-recovery-minimal.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
NativeHALocalInstance:
2-
Name=test-config
32
GroupName=beta
43
GroupCertificateLabel=recoveryTLS
54
GroupRole=Recovery

internal/ha/test_fixtures/minimal-config.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
NativeHALocalInstance:
2-
Name=test-config
32
NativeHAInstance:
43
Name=test-config-instance0
54
ReplicationAddress=test-config-instance0(9145)

internal/ha/test_fixtures/tls-basic-fips.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
NativeHALocalInstance:
2-
Name=test-config
32
CertificateLabel=baseTLS
43
KeyRepository=/run/runmqserver/ha/tls/key
54
SSLFipsRequired=Yes

internal/ha/test_fixtures/tls-basic.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
NativeHALocalInstance:
2-
Name=test-config
32
CertificateLabel=baseTLS
43
KeyRepository=/run/runmqserver/ha/tls/key
54
SSLFipsRequired=No

0 commit comments

Comments
 (0)