Skip to content

Commit 62fe19b

Browse files
authored
[Juniper] Only set the legacy gRPC services config if the specific node label isn't set. (#647)
* [Juniper] Only set the legacy gRPC services config if the specific node label isn't set. These config lines are now not required in D47 and will cause future config commits to fail if combined with the newer gRPC services configuration. * Format Go * Add unit tests * Handle errTimeoutError and increase config push deadline by 5 minutes. * Fix tests
1 parent 58a77e1 commit 62fe19b

File tree

2 files changed

+109
-6
lines changed

2 files changed

+109
-6
lines changed

topo/node/juniper/juniper.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ var (
3333
// For committing a very large config
3434
scrapliOperationTimeout = 300 * time.Second
3535
// Wait for PKI cert infra
36-
certGenTimeout = 10 * time.Minute
36+
certGenTimeout = 15 * time.Minute
3737
// Time between polls
3838
certGenRetrySleep = 30 * time.Second
3939
// Wait for config mode
40-
configModeTimeout = 10 * time.Minute
40+
configModeTimeout = 15 * time.Minute
4141
// Time between polls - config mode
4242
configModeRetrySleep = 30 * time.Second
4343
// Default gRPC port
@@ -196,9 +196,7 @@ func (n *Node) GRPCConfig() []string {
196196
}
197197
log.Infof("gNMI Port %d", port)
198198
portConfig := fmt.Sprintf("set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config port %d", port)
199-
return []string{
200-
"set system services extension-service request-response grpc ssl hot-reloading",
201-
"set system services extension-service request-response grpc ssl use-pki",
199+
conf := []string{
202200
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config services GNMI",
203201
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config enable true",
204202
portConfig,
@@ -207,6 +205,18 @@ func (n *Node) GRPCConfig() []string {
207205
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config listen-addresses 0.0.0.0",
208206
"commit",
209207
}
208+
// In newer Juniper releases such as D47, hot reloading and PKI support is enabled by default. On these systems, the legacy
209+
// syntax below is mutually exclusive with the new gRPC service config. Attempting to configure both will cause the config
210+
// commit to fail. Therefore, if configuring gRPC services via CLI on a release from D47 onwards, a KNE Node label of
211+
// `legacy_grpc_server_config`` should be set to `disabled.`
212+
if n.GetProto().GetLabels()["legacy_grpc_server_config"] != "disabled" {
213+
legacyConf := []string{
214+
"set system services extension-service request-response grpc ssl hot-reloading",
215+
"set system services extension-service request-response grpc ssl use-pki",
216+
}
217+
conf = append(legacyConf, conf...)
218+
}
219+
return conf
210220
}
211221

212222
// Waits and retries until CLI config mode is up and config is applied
@@ -216,7 +226,7 @@ func (n *Node) waitConfigInfraReadyAndPushConfigs(configs []string) error {
216226
for time.Since(start) < configModeTimeout {
217227
multiresp, err := n.cliConn.SendConfigs(configs)
218228
if err != nil {
219-
if strings.Contains(err.Error(), "errPrivilegeError") {
229+
if strings.Contains(err.Error(), "errPrivilegeError") || strings.Contains(err.Error(), "errTimeoutError") {
220230
log.Infof("Config mode not ready. Retrying in %v. Node %s, Resp %v", configModeRetrySleep, n.Name(), err)
221231
} else {
222232
return fmt.Errorf("failed pushing configs: %v", err)

topo/node/juniper/juniper_test.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,18 @@ func TestGenerateSelfSigned(t *testing.T) {
142142
}()
143143
configModeRetrySleep = time.Millisecond
144144

145+
origCertGenTimeout := certGenTimeout
146+
defer func() {
147+
certGenTimeout = origCertGenTimeout
148+
}()
149+
certGenTimeout = time.Second * 10
150+
151+
origConfigModeTimeout := configModeTimeout
152+
defer func() {
153+
configModeTimeout = origConfigModeTimeout
154+
}()
155+
configModeTimeout = time.Second * 10
156+
145157
tests := []struct {
146158
desc string
147159
wantErr bool
@@ -218,6 +230,87 @@ func TestGenerateSelfSigned(t *testing.T) {
218230
}
219231
}
220232

233+
func TestGRPCConfig(t *testing.T) {
234+
tests := []struct {
235+
desc string
236+
ni *node.Impl
237+
want []string
238+
}{
239+
{
240+
desc: "legacy grpc server config",
241+
ni: &node.Impl{
242+
KubeClient: fake.NewSimpleClientset(),
243+
Namespace: "test",
244+
Proto: &tpb.Node{
245+
Name: "pod1",
246+
Vendor: tpb.Vendor_JUNIPER,
247+
Config: &tpb.Config{
248+
ConfigFile: "foo",
249+
ConfigPath: "/",
250+
ConfigData: &tpb.Config_Data{
251+
Data: []byte("config file data"),
252+
},
253+
},
254+
},
255+
},
256+
want: []string{
257+
"set system services extension-service request-response grpc ssl hot-reloading",
258+
"set system services extension-service request-response grpc ssl use-pki",
259+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config services GNMI",
260+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config enable true",
261+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config port 32767",
262+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config transport-security true",
263+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config certificate-id grpc-server-cert",
264+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config listen-addresses 0.0.0.0",
265+
"commit",
266+
},
267+
},
268+
{
269+
desc: "new grpc server config",
270+
ni: &node.Impl{
271+
KubeClient: fake.NewSimpleClientset(),
272+
Namespace: "test",
273+
Proto: &tpb.Node{
274+
Name: "pod1",
275+
Vendor: tpb.Vendor_JUNIPER,
276+
Config: &tpb.Config{
277+
ConfigFile: "foo",
278+
ConfigPath: "/",
279+
ConfigData: &tpb.Config_Data{
280+
Data: []byte("config file data"),
281+
},
282+
},
283+
Labels: map[string]string{
284+
"legacy_grpc_server_config": "disabled",
285+
},
286+
},
287+
},
288+
want: []string{
289+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config services GNMI",
290+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config enable true",
291+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config port 32767",
292+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config transport-security true",
293+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config certificate-id grpc-server-cert",
294+
"set openconfig-system:system openconfig-system-grpc:grpc-servers grpc-server grpc-server config listen-addresses 0.0.0.0",
295+
"commit",
296+
},
297+
},
298+
}
299+
for _, tt := range tests {
300+
t.Run(tt.desc, func(t *testing.T) {
301+
nImpl, err := New(tt.ni)
302+
if err != nil {
303+
t.Fatalf("failed creating kne juniper node")
304+
}
305+
n, _ := nImpl.(*Node)
306+
got := n.GRPCConfig()
307+
if diff := cmp.Diff(tt.want, got); diff != "" {
308+
t.Errorf("GRPCConfig() returned unexpected diff (-want +got):\n%s", diff)
309+
}
310+
})
311+
}
312+
}
313+
221314
func TestConfigPush(t *testing.T) {
222315
ki := fake.NewSimpleClientset(&corev1.Pod{
223316
ObjectMeta: metav1.ObjectMeta{

0 commit comments

Comments
 (0)