77 "strings"
88 "testing"
99
10+ "gopkg.in/yaml.v3"
11+
1012 . "github.com/onsi/ginkgo/v2"
1113 . "github.com/onsi/gomega"
1214 appsv1 "k8s.io/api/apps/v1"
@@ -315,6 +317,10 @@ var _ = Describe("Storage controller medium tests", func() {
315317
316318 storage .Spec .Service .GRPC .Port = 2137
317319
320+ configWithNewPorts , err := patchGRPCPortsInConfiguration (storage .Spec .Configuration , 2137 , - 1 )
321+ Expect (err ).To (BeNil ())
322+ storage .Spec .Configuration = configWithNewPorts
323+
318324 Expect (k8sClient .Update (ctx , & storage )).Should (Succeed ())
319325
320326 var svc corev1.Service
@@ -349,9 +355,13 @@ var _ = Describe("Storage controller medium tests", func() {
349355 Namespace : testobjects .YdbNamespace ,
350356 }, & storage )).Should (Succeed ())
351357
352- storage .Spec .Service .GRPC .Port = 2135
358+ storage .Spec .Service .GRPC .Port = v1alpha1 . GRPCPort
353359 storage .Spec .Service .GRPC .AdditionalPort = 2136
354360
361+ configWithNewPorts , err := patchGRPCPortsInConfiguration (storage .Spec .Configuration , 2135 , 2136 )
362+ Expect (err ).To (BeNil ())
363+ storage .Spec .Configuration = configWithNewPorts
364+
355365 Expect (k8sClient .Update (ctx , & storage )).Should (Succeed ())
356366
357367 var svc corev1.Service
@@ -370,7 +380,7 @@ var _ = Describe("Storage controller medium tests", func() {
370380
371381 ports := svc .Spec .Ports
372382 g .Expect (len (ports )).To (Equal (2 ), "expected 2 ports but got %d" , len (ports ))
373- g .Expect (ports [0 ].Port ).To (Equal (int32 (2135 )))
383+ g .Expect (ports [0 ].Port ).To (Equal (int32 (v1alpha1 . GRPCPort )))
374384 g .Expect (ports [0 ].Name ).To (Equal (v1alpha1 .GRPCServicePortName ))
375385 g .Expect (ports [1 ].Port ).To (Equal (storage .Spec .Service .GRPC .AdditionalPort ))
376386 g .Expect (ports [1 ].Name ).To (Equal (v1alpha1 .GRPCServiceAdditionalPortName ))
@@ -380,5 +390,52 @@ var _ = Describe("Storage controller medium tests", func() {
380390 "Service %s/%s should eventually have proper ports" , testobjects .YdbNamespace , serviceName ,
381391 )
382392 })
393+
394+ By ("Forbid to edit grpc ports, when out of sync with YDB config..." , func () {
395+ storage := v1alpha1.Storage {}
396+ Expect (k8sClient .Get (ctx , types.NamespacedName {
397+ Name : testobjects .StorageName ,
398+ Namespace : testobjects .YdbNamespace ,
399+ }, & storage )).Should (Succeed ())
400+
401+ storage .Spec .Service .GRPC .Port = v1alpha1 .GRPCPort
402+ By ("Specify 2136 in manifest spec..." )
403+ storage .Spec .Service .GRPC .AdditionalPort = 2136
404+
405+ By ("And then specify 2137 in manifest spec..." )
406+ configWithNewPorts , err := patchGRPCPortsInConfiguration (storage .Spec .Configuration , v1alpha1 .GRPCPort , 2137 )
407+ Expect (err ).To (BeNil ())
408+ storage .Spec .Configuration = configWithNewPorts
409+
410+ err = k8sClient .Update (ctx , & storage )
411+ Expect (err ).To (MatchError (ContainSubstring ("grpc port mismatch" )))
412+ })
383413 })
384414})
415+
416+ func patchGRPCPortsInConfiguration (in string , port , sslPort int ) (string , error ) {
417+ m := make (map [string ]interface {})
418+ if err := yaml .Unmarshal ([]byte (in ), & m ); err != nil {
419+ return "" , err
420+ }
421+
422+ cfg , _ := m ["grpc_config" ].(map [string ]interface {})
423+ if cfg == nil {
424+ cfg = make (map [string ]interface {})
425+ }
426+
427+ if sslPort != - 1 {
428+ cfg ["ssl_port" ] = sslPort
429+ }
430+ if port != - 1 {
431+ cfg ["port" ] = port
432+ }
433+ m ["grpc_config" ] = cfg
434+
435+ res , err := yaml .Marshal (m )
436+ if err != nil {
437+ return "" , err
438+ }
439+
440+ return string (res ), nil
441+ }
0 commit comments