1 package main
2
3 import (
4 "context"
5 "strconv"
6 "strings"
7 "testing"
8
9 "github.com/Microsoft/hcsshim/hcn"
10 "github.com/Microsoft/hcsshim/internal/computeagent"
11 computeagentMock "github.com/Microsoft/hcsshim/internal/computeagent/mock"
12 "github.com/Microsoft/hcsshim/osversion"
13 ncproxygrpcv0 "github.com/Microsoft/hcsshim/pkg/ncproxy/ncproxygrpc/v0"
14 "github.com/golang/mock/gomock"
15 )
16
17 func TestAddNIC_V0_HCN(t *testing.T) {
18 ctx := context.Background()
19 containerID := t.Name() + "-containerID"
20 networkingStore, closer, err := createTestNetworkingStore()
21 if err != nil {
22 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
23 }
24 defer closer()
25
26
27 agentCache := newComputeAgentCache()
28 gService := newGRPCService(agentCache, networkingStore)
29 v0Service := newV0ServiceWrapper(gService)
30
31
32 computeAgentCtrl := gomock.NewController(t)
33 defer computeAgentCtrl.Finish()
34 mockedService := computeagentMock.NewMockComputeAgentService(computeAgentCtrl)
35 mockedAgentClient := &computeAgentClient{nil, mockedService}
36
37
38 if err := agentCache.put(containerID, mockedAgentClient); err != nil {
39 t.Fatal(err)
40 }
41
42
43 mockedService.EXPECT().AddNIC(gomock.Any(), gomock.Any()).Return(&computeagent.AddNICInternalResponse{}, nil).AnyTimes()
44
45
46 testNetworkName := t.Name() + "-network"
47 network, err := createTestIPv4NATNetwork(testNetworkName)
48 if err != nil {
49 t.Fatalf("failed to create test network with %v", err)
50 }
51 defer func() {
52 _ = network.Delete()
53 }()
54
55 testEndpointName := t.Name() + "-endpoint"
56 endpoint, err := createTestEndpoint(testEndpointName, network.Id)
57 if err != nil {
58 t.Fatalf("failed to create test endpoint with %v", err)
59 }
60
61
62 defer func() {
63 _ = endpoint.Delete()
64 }()
65
66 testNICID := t.Name() + "-nicID"
67 req := &ncproxygrpcv0.AddNICRequest{
68 ContainerID: containerID,
69 NicID: testNICID,
70 EndpointName: testEndpointName,
71 }
72
73 _, err = v0Service.AddNIC(ctx, req)
74 if err != nil {
75 t.Fatalf("expected AddNIC to return no error, instead got %v", err)
76 }
77 }
78
79 func TestAddNIC_V0_HCN_Error_InvalidArgument(t *testing.T) {
80 ctx := context.Background()
81
82 var (
83 containerID = t.Name() + "-containerID"
84 testNICID = t.Name() + "-nicID"
85 testEndpointName = t.Name() + "-endpoint"
86 )
87
88 networkingStore, closer, err := createTestNetworkingStore()
89 if err != nil {
90 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
91 }
92 defer closer()
93
94
95 agentCache := newComputeAgentCache()
96 gService := newGRPCService(agentCache, networkingStore)
97 v0Service := newV0ServiceWrapper(gService)
98
99
100 computeAgentCtrl := gomock.NewController(t)
101 defer computeAgentCtrl.Finish()
102 mockedService := computeagentMock.NewMockComputeAgentService(computeAgentCtrl)
103 mockedAgentClient := &computeAgentClient{nil, mockedService}
104
105
106 if err := agentCache.put(containerID, mockedAgentClient); err != nil {
107 t.Fatal(err)
108 }
109
110
111 mockedService.EXPECT().AddNIC(gomock.Any(), gomock.Any()).Return(&computeagent.AddNICInternalResponse{}, nil).AnyTimes()
112
113 type config struct {
114 name string
115 containerID string
116 nicID string
117 endpointName string
118 }
119 tests := []config{
120 {
121 name: "AddNIC returns error with blank container ID",
122 containerID: "",
123 nicID: testNICID,
124 endpointName: testEndpointName,
125 },
126 {
127 name: "AddNIC returns error with blank nic ID",
128 containerID: containerID,
129 nicID: "",
130 endpointName: testEndpointName,
131 },
132 {
133 name: "AddNIC returns error with blank endpoint name",
134 containerID: containerID,
135 nicID: testNICID,
136 endpointName: "",
137 },
138 }
139
140 for _, test := range tests {
141 t.Run(test.name, func(subtest *testing.T) {
142 req := &ncproxygrpcv0.AddNICRequest{
143 ContainerID: test.containerID,
144 NicID: test.nicID,
145 EndpointName: test.endpointName,
146 }
147
148 _, err := v0Service.AddNIC(ctx, req)
149 if err == nil {
150 subtest.Fatalf("expected AddNIC to return an error")
151 }
152 })
153 }
154 }
155
156 func TestDeleteNIC_V0_HCN(t *testing.T) {
157 ctx := context.Background()
158 containerID := t.Name() + "-containerID"
159 networkingStore, closer, err := createTestNetworkingStore()
160 if err != nil {
161 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
162 }
163 defer closer()
164
165
166 agentCache := newComputeAgentCache()
167 gService := newGRPCService(agentCache, networkingStore)
168 v0Service := newV0ServiceWrapper(gService)
169
170
171 computeAgentCtrl := gomock.NewController(t)
172 defer computeAgentCtrl.Finish()
173 mockedService := computeagentMock.NewMockComputeAgentService(computeAgentCtrl)
174 mockedAgentClient := &computeAgentClient{nil, mockedService}
175
176
177 if err := agentCache.put(containerID, mockedAgentClient); err != nil {
178 t.Fatal(err)
179 }
180
181
182 mockedService.EXPECT().DeleteNIC(gomock.Any(), gomock.Any()).Return(&computeagent.DeleteNICInternalResponse{}, nil).AnyTimes()
183
184
185 network, err := createTestIPv4NATNetwork(t.Name() + "network")
186 if err != nil {
187 t.Fatalf("failed to create test network with %v", err)
188 }
189 defer func() {
190 _ = network.Delete()
191 }()
192
193 testEndpointName := t.Name() + "-endpoint"
194 endpoint, err := createTestEndpoint(testEndpointName, network.Id)
195 if err != nil {
196 t.Fatalf("failed to create test endpoint with %v", err)
197 }
198
199
200 defer func() {
201 _ = endpoint.Delete()
202 }()
203
204 testNICID := t.Name() + "-nicID"
205 req := &ncproxygrpcv0.DeleteNICRequest{
206 ContainerID: containerID,
207 NicID: testNICID,
208 EndpointName: testEndpointName,
209 }
210
211 _, err = v0Service.DeleteNIC(ctx, req)
212 if err != nil {
213 t.Fatalf("expected DeleteNIC to return no error, instead got %v", err)
214 }
215 }
216
217 func TestDeleteNIC_V0_HCN_Error_InvalidArgument(t *testing.T) {
218 ctx := context.Background()
219
220 var (
221 containerID = t.Name() + "-containerID"
222 testNICID = t.Name() + "-nicID"
223 testEndpointName = t.Name() + "-endpoint"
224 )
225
226 networkingStore, closer, err := createTestNetworkingStore()
227 if err != nil {
228 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
229 }
230 defer closer()
231
232
233 agentCache := newComputeAgentCache()
234 gService := newGRPCService(agentCache, networkingStore)
235 v0Service := newV0ServiceWrapper(gService)
236
237
238 computeAgentCtrl := gomock.NewController(t)
239 defer computeAgentCtrl.Finish()
240 mockedService := computeagentMock.NewMockComputeAgentService(computeAgentCtrl)
241 mockedAgentClient := &computeAgentClient{nil, mockedService}
242
243
244 if err := agentCache.put(containerID, mockedAgentClient); err != nil {
245 t.Fatal(err)
246 }
247
248
249 mockedService.EXPECT().DeleteNIC(gomock.Any(), gomock.Any()).Return(&computeagent.DeleteNICInternalResponse{}, nil).AnyTimes()
250
251 type config struct {
252 name string
253 containerID string
254 nicID string
255 endpointName string
256 }
257 tests := []config{
258 {
259 name: "DeleteNIC returns error with blank container ID",
260 containerID: "",
261 nicID: testNICID,
262 endpointName: testEndpointName,
263 },
264 {
265 name: "DeleteNIC returns error with blank nic ID",
266 containerID: containerID,
267 nicID: "",
268 endpointName: testEndpointName,
269 },
270 {
271 name: "DeleteNIC returns error with blank endpoint name",
272 containerID: containerID,
273 nicID: testNICID,
274 endpointName: "",
275 },
276 }
277
278 for _, test := range tests {
279 t.Run(test.name, func(subtest *testing.T) {
280 req := &ncproxygrpcv0.DeleteNICRequest{
281 ContainerID: test.containerID,
282 NicID: test.nicID,
283 EndpointName: test.endpointName,
284 }
285
286 _, err := v0Service.DeleteNIC(ctx, req)
287 if err == nil {
288 subtest.Fatalf("expected DeleteNIC to return an error")
289 }
290 })
291 }
292 }
293
294 func TestModifyNIC_V0_HCN(t *testing.T) {
295
296 if osversion.Build() < osversion.V21H1 {
297 t.Skip("Requires build +21H1")
298 }
299 ctx := context.Background()
300 containerID := t.Name() + "-containerID"
301
302 networkingStore, closer, err := createTestNetworkingStore()
303 if err != nil {
304 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
305 }
306 defer closer()
307
308
309 agentCache := newComputeAgentCache()
310 gService := newGRPCService(agentCache, networkingStore)
311 v0Service := newV0ServiceWrapper(gService)
312
313
314 computeAgentCtrl := gomock.NewController(t)
315 defer computeAgentCtrl.Finish()
316 mockedService := computeagentMock.NewMockComputeAgentService(computeAgentCtrl)
317 mockedAgentClient := &computeAgentClient{nil, mockedService}
318
319
320 if err := agentCache.put(containerID, mockedAgentClient); err != nil {
321 t.Fatal(err)
322 }
323
324
325 mockedService.EXPECT().ModifyNIC(gomock.Any(), gomock.Any()).Return(&computeagent.ModifyNICInternalResponse{}, nil).AnyTimes()
326
327 iovOffloadOn := &ncproxygrpcv0.IovEndpointPolicySetting{
328 IovOffloadWeight: 100,
329 }
330
331 type config struct {
332 name string
333 containerID string
334 iovPolicySettings *ncproxygrpcv0.IovEndpointPolicySetting
335 networkCreateFunc func(string) (*hcn.HostComputeNetwork, error)
336 }
337 tests := []config{
338 {
339 name: "ModifyNIC returns no error",
340 containerID: containerID,
341 networkCreateFunc: createTestIPv4NATNetwork,
342 iovPolicySettings: iovOffloadOn,
343 },
344 {
345 name: "ModifyNIC dual stack returns no error",
346 containerID: containerID,
347 networkCreateFunc: createTestDualStackNATNetwork,
348 iovPolicySettings: iovOffloadOn,
349 },
350 {
351 name: "ModifyNIC returns no error when turning off iov policy",
352 containerID: containerID,
353 networkCreateFunc: createTestIPv4NATNetwork,
354 iovPolicySettings: &ncproxygrpcv0.IovEndpointPolicySetting{
355 IovOffloadWeight: 0,
356 },
357 },
358 {
359 name: "ModifyNIC dual stack returns no error when turning off iov policy",
360 containerID: containerID,
361 networkCreateFunc: createTestDualStackNATNetwork,
362 iovPolicySettings: &ncproxygrpcv0.IovEndpointPolicySetting{
363 IovOffloadWeight: 0,
364 },
365 },
366 }
367
368 for _, test := range tests {
369 t.Run(test.name, func(subtest *testing.T) {
370
371 networkName := subtest.Name() + "-network"
372 network, err := test.networkCreateFunc(networkName)
373 if err != nil {
374 subtest.Fatalf("failed to create test network with %v", err)
375 }
376 defer func() {
377 _ = network.Delete()
378 }()
379
380
381 endpointName := subtest.Name() + "-endpoint"
382 endpoint, err := createTestEndpoint(endpointName, network.Id)
383 if err != nil {
384 subtest.Fatalf("failed to create test endpoint with %v", err)
385 }
386 defer func() {
387 _ = endpoint.Delete()
388 }()
389 testNICID := subtest.Name() + "-nicID"
390 req := &ncproxygrpcv0.ModifyNICRequest{
391 ContainerID: test.containerID,
392 NicID: testNICID,
393 EndpointName: endpointName,
394 IovPolicySettings: test.iovPolicySettings,
395 }
396
397 _, err = v0Service.ModifyNIC(ctx, req)
398 if err != nil {
399 subtest.Fatalf("expected ModifyNIC to return no error, instead got %v", err)
400 }
401 })
402 }
403 }
404
405 func TestModifyNIC_V0_HCN_Error_InvalidArgument(t *testing.T) {
406
407 if osversion.Build() < osversion.V21H1 {
408 t.Skip("Requires build +21H1")
409 }
410 ctx := context.Background()
411
412 networkingStore, closer, err := createTestNetworkingStore()
413 if err != nil {
414 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
415 }
416 defer closer()
417
418
419 agentCache := newComputeAgentCache()
420 gService := newGRPCService(agentCache, networkingStore)
421 v0Service := newV0ServiceWrapper(gService)
422
423 var (
424 containerID = t.Name() + "-containerID"
425 testNICID = t.Name() + "-nicID"
426 endpointName = t.Name() + "-endpoint"
427 )
428
429
430 computeAgentCtrl := gomock.NewController(t)
431 defer computeAgentCtrl.Finish()
432 mockedService := computeagentMock.NewMockComputeAgentService(computeAgentCtrl)
433 mockedAgentClient := &computeAgentClient{nil, mockedService}
434
435
436 if err := agentCache.put(containerID, mockedAgentClient); err != nil {
437 t.Fatal(err)
438 }
439
440
441 mockedService.EXPECT().ModifyNIC(gomock.Any(), gomock.Any()).Return(&computeagent.ModifyNICInternalResponse{}, nil).AnyTimes()
442
443 iovOffloadOn := &ncproxygrpcv0.IovEndpointPolicySetting{
444 IovOffloadWeight: 100,
445 }
446
447 type config struct {
448 name string
449 containerID string
450 nicID string
451 endpointName string
452 iovPolicySettings *ncproxygrpcv0.IovEndpointPolicySetting
453 }
454 tests := []config{
455 {
456 name: "ModifyNIC returns error with blank container ID",
457 containerID: "",
458 nicID: testNICID,
459 endpointName: endpointName,
460 iovPolicySettings: iovOffloadOn,
461 },
462 {
463 name: "ModifyNIC returns error with blank nic ID",
464 containerID: containerID,
465 nicID: "",
466 endpointName: endpointName,
467 iovPolicySettings: iovOffloadOn,
468 },
469 {
470 name: "ModifyNIC returns error with blank endpoint name",
471 containerID: containerID,
472 nicID: testNICID,
473 endpointName: "",
474 iovPolicySettings: iovOffloadOn,
475 },
476 {
477 name: "ModifyNIC returns error with blank iov policy settings",
478 containerID: containerID,
479 nicID: testNICID,
480 endpointName: endpointName,
481 iovPolicySettings: nil,
482 },
483 }
484
485 for _, test := range tests {
486 t.Run(test.name, func(subtest *testing.T) {
487 req := &ncproxygrpcv0.ModifyNICRequest{
488 ContainerID: test.containerID,
489 NicID: test.nicID,
490 EndpointName: test.endpointName,
491 IovPolicySettings: test.iovPolicySettings,
492 }
493
494 _, err := v0Service.ModifyNIC(ctx, req)
495 if err == nil {
496 subtest.Fatalf("expected ModifyNIC to return an error")
497 }
498 })
499 }
500 }
501
502 func TestCreateNetwork_V0_HCN(t *testing.T) {
503 ctx := context.Background()
504
505 networkingStore, closer, err := createTestNetworkingStore()
506 if err != nil {
507 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
508 }
509 defer closer()
510
511
512 agentCache := newComputeAgentCache()
513 gService := newGRPCService(agentCache, networkingStore)
514 v0Service := newV0ServiceWrapper(gService)
515
516 networkName := t.Name() + "-network"
517 ipv4Subnets := getTestIPv4Subnets()
518 req := &ncproxygrpcv0.CreateNetworkRequest{
519 Name: networkName,
520 Mode: ncproxygrpcv0.CreateNetworkRequest_NAT,
521 SubnetIpaddressPrefix: []string{ipv4Subnets[0].IpAddressPrefix},
522 DefaultGateway: ipv4Subnets[0].Routes[0].NextHop,
523 }
524 _, err = v0Service.CreateNetwork(ctx, req)
525 if err != nil {
526 t.Fatalf("expected CreateNetwork to return no error, instead got %v", err)
527 }
528
529 network, err := hcn.GetNetworkByName(networkName)
530 if err != nil {
531 t.Fatalf("failed to find created network with %v", err)
532 }
533
534 if err = network.Delete(); err != nil {
535 t.Fatalf("failed to cleanup network %v created by test with %v", networkName, err)
536 }
537 }
538
539 func TestCreateNetwork_V0_HCN_Error_EmptyNetworkName(t *testing.T) {
540 ctx := context.Background()
541
542 networkingStore, closer, err := createTestNetworkingStore()
543 if err != nil {
544 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
545 }
546 defer closer()
547
548
549 agentCache := newComputeAgentCache()
550 gService := newGRPCService(agentCache, networkingStore)
551 v0Service := newV0ServiceWrapper(gService)
552
553 req := &ncproxygrpcv0.CreateNetworkRequest{
554 Name: "",
555 Mode: ncproxygrpcv0.CreateNetworkRequest_Transparent,
556 }
557 _, err = v0Service.CreateNetwork(ctx, req)
558 if err == nil {
559 t.Fatalf("expected CreateNetwork to return an error")
560 }
561 }
562
563 func TestCreateEndpoint_V0_HCN(t *testing.T) {
564 ctx := context.Background()
565
566 networkingStore, closer, err := createTestNetworkingStore()
567 if err != nil {
568 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
569 }
570 defer closer()
571
572
573 agentCache := newComputeAgentCache()
574 gService := newGRPCService(agentCache, networkingStore)
575 v0Service := newV0ServiceWrapper(gService)
576
577
578 networkName := t.Name() + "-network"
579 network, err := createTestIPv4NATNetwork(networkName)
580 if err != nil {
581 t.Fatalf("failed to create test network with %v", err)
582 }
583 defer func() {
584 _ = network.Delete()
585 }()
586
587 endpointName := t.Name() + "-endpoint"
588 req := &ncproxygrpcv0.CreateEndpointRequest{
589 Name: endpointName,
590 Macaddress: "00-15-5D-52-C0-00",
591 Ipaddress: "192.168.100.4",
592 IpaddressPrefixlength: "24",
593 NetworkName: networkName,
594 }
595
596 _, err = v0Service.CreateEndpoint(ctx, req)
597 if err != nil {
598 t.Fatalf("expected CreateEndpoint to return no error, instead got %v", err)
599 }
600
601 ep, err := hcn.GetEndpointByName(endpointName)
602 if err != nil {
603 t.Fatalf("endpoint was not found: %v", err)
604 }
605
606 if err := ep.Delete(); err != nil {
607 t.Fatalf("failed to delete endpoint created for test %v", err)
608 }
609 }
610
611 func TestCreateEndpoint_V0_HCN_Error_InvalidArgument(t *testing.T) {
612 ctx := context.Background()
613
614 networkingStore, closer, err := createTestNetworkingStore()
615 if err != nil {
616 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
617 }
618 defer closer()
619
620
621 agentCache := newComputeAgentCache()
622 gService := newGRPCService(agentCache, networkingStore)
623 v0Service := newV0ServiceWrapper(gService)
624
625 type config struct {
626 name string
627 networkName string
628 ipaddress string
629 macaddress string
630 }
631 tests := []config{
632 {
633 name: "CreateEndpoint returns error when network name is empty",
634 networkName: "",
635 ipaddress: "192.168.100.4",
636 macaddress: "00-15-5D-52-C0-00",
637 },
638 {
639 name: "CreateEndpoint returns error when ip address is empty",
640 networkName: "testName",
641 ipaddress: "",
642 macaddress: "00-15-5D-52-C0-00",
643 },
644 {
645 name: "CreateEndpoint returns error when mac address is empty",
646 networkName: "testName",
647 ipaddress: "192.168.100.4",
648 macaddress: "",
649 },
650 }
651
652 for i, test := range tests {
653 t.Run(test.name, func(subtest *testing.T) {
654 endpointName := t.Name() + "-endpoint-" + strconv.Itoa(i)
655
656 req := &ncproxygrpcv0.CreateEndpointRequest{
657 Name: endpointName,
658 Macaddress: test.macaddress,
659 Ipaddress: test.ipaddress,
660 NetworkName: test.networkName,
661 }
662
663 _, err = v0Service.CreateEndpoint(ctx, req)
664 if err == nil {
665 subtest.Fatalf("expected CreateEndpoint to return an error")
666 }
667 })
668 }
669 }
670
671 func TestAddEndpoint_V0_NoError(t *testing.T) {
672 ctx := context.Background()
673
674 networkingStore, closer, err := createTestNetworkingStore()
675 if err != nil {
676 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
677 }
678 defer closer()
679
680
681 agentCache := newComputeAgentCache()
682 gService := newGRPCService(agentCache, networkingStore)
683 v0Service := newV0ServiceWrapper(gService)
684
685
686
687
688
689 namespace := hcn.NewNamespace(hcn.NamespaceTypeHost)
690 namespace, err = namespace.Create()
691 if err != nil {
692 t.Fatalf("failed to create test namespace with %v", err)
693 }
694 defer func() {
695 _ = namespace.Delete()
696 }()
697
698
699 networkName := t.Name() + "-network"
700 network, err := createTestIPv4NATNetwork(networkName)
701 if err != nil {
702 t.Fatalf("failed to create test network with %v", err)
703 }
704 defer func() {
705 _ = network.Delete()
706 }()
707
708 endpointName := t.Name() + "-endpoint"
709 endpoint, err := createTestEndpoint(endpointName, network.Id)
710 if err != nil {
711 t.Fatalf("failed to create test endpoint with %v", err)
712 }
713 defer func() {
714 _ = endpoint.Delete()
715 }()
716
717 req := &ncproxygrpcv0.AddEndpointRequest{
718 Name: endpointName,
719 NamespaceID: namespace.Id,
720 }
721
722 _, err = v0Service.AddEndpoint(ctx, req)
723 if err != nil {
724 t.Fatalf("expected AddEndpoint to return no error, instead got %v", err)
725 }
726
727 endpoints, err := hcn.GetNamespaceEndpointIds(namespace.Id)
728 if err != nil {
729 t.Fatalf("failed to get the namespace's endpoints with %v", err)
730 }
731 if !exists(strings.ToUpper(endpoint.Id), endpoints) {
732 t.Fatalf("endpoint %v was not added to namespace %v", endpoint.Id, namespace.Id)
733 }
734 }
735
736 func TestAddEndpoint_V0_Error_EmptyEndpointName(t *testing.T) {
737 ctx := context.Background()
738
739 networkingStore, closer, err := createTestNetworkingStore()
740 if err != nil {
741 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
742 }
743 defer closer()
744
745
746 agentCache := newComputeAgentCache()
747 gService := newGRPCService(agentCache, networkingStore)
748 v0Service := newV0ServiceWrapper(gService)
749
750
751 namespace := hcn.NewNamespace(hcn.NamespaceTypeHostDefault)
752 namespace, err = namespace.Create()
753 if err != nil {
754 t.Fatalf("failed to create test namespace with %v", err)
755 }
756 defer func() {
757 _ = namespace.Delete()
758 }()
759
760 req := &ncproxygrpcv0.AddEndpointRequest{
761 Name: "",
762 NamespaceID: namespace.Id,
763 }
764
765 _, err = v0Service.AddEndpoint(ctx, req)
766 if err == nil {
767 t.Fatal("expected AddEndpoint to return error when endpoint name is empty")
768 }
769 }
770
771 func TestAddEndpoint_V0_Error_NoEndpoint(t *testing.T) {
772 ctx := context.Background()
773
774 networkingStore, closer, err := createTestNetworkingStore()
775 if err != nil {
776 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
777 }
778 defer closer()
779
780
781 agentCache := newComputeAgentCache()
782 gService := newGRPCService(agentCache, networkingStore)
783 v0Service := newV0ServiceWrapper(gService)
784
785
786 namespace := hcn.NewNamespace(hcn.NamespaceTypeHostDefault)
787 namespace, err = namespace.Create()
788 if err != nil {
789 t.Fatalf("failed to create test namespace with %v", err)
790 }
791 defer func() {
792 _ = namespace.Delete()
793 }()
794
795 req := &ncproxygrpcv0.AddEndpointRequest{
796 Name: t.Name() + "-endpoint",
797 NamespaceID: namespace.Id,
798 }
799
800 _, err = v0Service.AddEndpoint(ctx, req)
801 if err == nil {
802 t.Fatal("expected AddEndpoint to return error when endpoint name is empty")
803 }
804 }
805
806 func TestAddEndpoint_V0_Error_EmptyNamespaceID(t *testing.T) {
807 ctx := context.Background()
808
809 networkingStore, closer, err := createTestNetworkingStore()
810 if err != nil {
811 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
812 }
813 defer closer()
814
815
816 agentCache := newComputeAgentCache()
817 gService := newGRPCService(agentCache, networkingStore)
818 v0Service := newV0ServiceWrapper(gService)
819
820
821 networkName := t.Name() + "-network"
822 network, err := createTestIPv4NATNetwork(networkName)
823 if err != nil {
824 t.Fatalf("failed to create test network with %v", err)
825 }
826 defer func() {
827 _ = network.Delete()
828 }()
829
830 endpointName := t.Name() + "-endpoint"
831 endpoint, err := createTestEndpoint(endpointName, network.Id)
832 if err != nil {
833 t.Fatalf("failed to create test endpoint with %v", err)
834 }
835 defer func() {
836 _ = endpoint.Delete()
837 }()
838
839 req := &ncproxygrpcv0.AddEndpointRequest{
840 Name: endpointName,
841 NamespaceID: "",
842 }
843
844 _, err = v0Service.AddEndpoint(ctx, req)
845 if err == nil {
846 t.Fatal("expected AddEndpoint to return error when namespace ID is empty")
847 }
848 }
849
850 func TestDeleteEndpoint_V0_NoError(t *testing.T) {
851 ctx := context.Background()
852
853 networkingStore, closer, err := createTestNetworkingStore()
854 if err != nil {
855 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
856 }
857 defer closer()
858
859
860 agentCache := newComputeAgentCache()
861 gService := newGRPCService(agentCache, networkingStore)
862 v0Service := newV0ServiceWrapper(gService)
863
864
865 networkName := t.Name() + "-network"
866 network, err := createTestIPv4NATNetwork(networkName)
867 if err != nil {
868 t.Fatalf("failed to create test network with %v", err)
869 }
870
871
872 defer func() {
873 _ = network.Delete()
874 }()
875
876 endpointName := t.Name() + "-endpoint"
877 endpoint, err := createTestEndpoint(endpointName, network.Id)
878 if err != nil {
879 t.Fatalf("failed to create test endpoint with %v", err)
880 }
881
882
883 defer func() {
884 _ = endpoint.Delete()
885 }()
886
887 req := &ncproxygrpcv0.DeleteEndpointRequest{
888 Name: endpointName,
889 }
890 _, err = v0Service.DeleteEndpoint(ctx, req)
891 if err != nil {
892 t.Fatalf("expected DeleteEndpoint to return no error, instead got %v", err)
893 }
894
895 ep, err := hcn.GetEndpointByName(endpointName)
896 if err == nil {
897 t.Fatalf("expected endpoint to be deleted, instead found %v", ep)
898 }
899 }
900
901 func TestDeleteEndpoint_V0_Error_NoEndpoint(t *testing.T) {
902 ctx := context.Background()
903
904 networkingStore, closer, err := createTestNetworkingStore()
905 if err != nil {
906 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
907 }
908 defer closer()
909
910
911 agentCache := newComputeAgentCache()
912 gService := newGRPCService(agentCache, networkingStore)
913 v0Service := newV0ServiceWrapper(gService)
914
915
916 networkName := t.Name() + "-network"
917 network, err := createTestIPv4NATNetwork(networkName)
918 if err != nil {
919 t.Fatalf("failed to create test network with %v", err)
920 }
921 defer func() {
922 _ = network.Delete()
923 }()
924
925 endpointName := t.Name() + "-endpoint"
926 req := &ncproxygrpcv0.DeleteEndpointRequest{
927 Name: endpointName,
928 }
929
930 _, err = v0Service.DeleteEndpoint(ctx, req)
931 if err == nil {
932 t.Fatalf("expected to return an error on deleting nonexistent endpoint")
933 }
934 }
935
936 func TestDeleteEndpoint_V0_Error_EmptyEndpoint_Name(t *testing.T) {
937 ctx := context.Background()
938
939 networkingStore, closer, err := createTestNetworkingStore()
940 if err != nil {
941 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
942 }
943 defer closer()
944
945
946 agentCache := newComputeAgentCache()
947 gService := newGRPCService(agentCache, networkingStore)
948 v0Service := newV0ServiceWrapper(gService)
949
950 endpointName := ""
951 req := &ncproxygrpcv0.DeleteEndpointRequest{
952 Name: endpointName,
953 }
954
955 _, err = v0Service.DeleteEndpoint(ctx, req)
956 if err == nil {
957 t.Fatalf("expected to return an error when endpoint name is empty")
958 }
959 }
960
961 func TestDeleteNetwork_V0_NoError(t *testing.T) {
962 ctx := context.Background()
963
964 networkingStore, closer, err := createTestNetworkingStore()
965 if err != nil {
966 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
967 }
968 defer closer()
969
970
971 agentCache := newComputeAgentCache()
972 gService := newGRPCService(agentCache, networkingStore)
973 v0Service := newV0ServiceWrapper(gService)
974
975
976 networkName := t.Name() + "-network"
977 network, err := createTestIPv4NATNetwork(networkName)
978 if err != nil {
979 t.Fatalf("failed to create test network with %v", err)
980 }
981
982
983 defer func() {
984 _ = network.Delete()
985 }()
986
987 req := &ncproxygrpcv0.DeleteNetworkRequest{
988 Name: networkName,
989 }
990 _, err = v0Service.DeleteNetwork(ctx, req)
991 if err != nil {
992 t.Fatalf("expected no error, instead got %v", err)
993 }
994 }
995
996 func TestDeleteNetwork_V0_Error_NoNetwork(t *testing.T) {
997 ctx := context.Background()
998
999 networkingStore, closer, err := createTestNetworkingStore()
1000 if err != nil {
1001 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1002 }
1003 defer closer()
1004
1005
1006 agentCache := newComputeAgentCache()
1007 gService := newGRPCService(agentCache, networkingStore)
1008 v0Service := newV0ServiceWrapper(gService)
1009
1010 fakeNetworkName := t.Name() + "-network"
1011
1012 req := &ncproxygrpcv0.DeleteNetworkRequest{
1013 Name: fakeNetworkName,
1014 }
1015 _, err = v0Service.DeleteNetwork(ctx, req)
1016 if err == nil {
1017 t.Fatal("expected to get an error when attempting to delete nonexistent network")
1018 }
1019 }
1020
1021 func TestDeleteNetwork_V0_Error_EmptyNetworkName(t *testing.T) {
1022 ctx := context.Background()
1023
1024 networkingStore, closer, err := createTestNetworkingStore()
1025 if err != nil {
1026 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1027 }
1028 defer closer()
1029
1030
1031 agentCache := newComputeAgentCache()
1032 gService := newGRPCService(agentCache, networkingStore)
1033 v0Service := newV0ServiceWrapper(gService)
1034
1035 req := &ncproxygrpcv0.DeleteNetworkRequest{
1036 Name: "",
1037 }
1038 _, err = v0Service.DeleteNetwork(ctx, req)
1039 if err == nil {
1040 t.Fatal("expected to get an error when attempting to delete nonexistent network")
1041 }
1042 }
1043
1044 func TestGetEndpoint_V0_NoError(t *testing.T) {
1045 ctx := context.Background()
1046
1047 networkingStore, closer, err := createTestNetworkingStore()
1048 if err != nil {
1049 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1050 }
1051 defer closer()
1052
1053
1054 agentCache := newComputeAgentCache()
1055 gService := newGRPCService(agentCache, networkingStore)
1056 v0Service := newV0ServiceWrapper(gService)
1057
1058
1059 networkName := t.Name() + "-network"
1060 network, err := createTestIPv4NATNetwork(networkName)
1061 if err != nil {
1062 t.Fatalf("failed to create test network with %v", err)
1063 }
1064 defer func() {
1065 _ = network.Delete()
1066 }()
1067
1068
1069 endpointName := t.Name() + "-endpoint"
1070 endpoint, err := createTestEndpoint(endpointName, network.Id)
1071 if err != nil {
1072 t.Fatalf("failed to create test endpoint with %v", err)
1073 }
1074 defer func() {
1075 _ = endpoint.Delete()
1076 }()
1077
1078 req := &ncproxygrpcv0.GetEndpointRequest{
1079 Name: endpointName,
1080 }
1081
1082 if _, err := v0Service.GetEndpoint(ctx, req); err != nil {
1083 t.Fatalf("expected to get no error, instead got %v", err)
1084 }
1085 }
1086
1087 func TestGetEndpoint_V0_Error_NoEndpoint(t *testing.T) {
1088 ctx := context.Background()
1089
1090 networkingStore, closer, err := createTestNetworkingStore()
1091 if err != nil {
1092 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1093 }
1094 defer closer()
1095
1096
1097 agentCache := newComputeAgentCache()
1098 gService := newGRPCService(agentCache, networkingStore)
1099 v0Service := newV0ServiceWrapper(gService)
1100
1101 endpointName := t.Name() + "-endpoint"
1102 req := &ncproxygrpcv0.GetEndpointRequest{
1103 Name: endpointName,
1104 }
1105
1106 if _, err := v0Service.GetEndpoint(ctx, req); err == nil {
1107 t.Fatal("expected to get an error trying to get a nonexistent endpoint")
1108 }
1109 }
1110
1111 func TestGetEndpoint_V0_Error_EmptyEndpointName(t *testing.T) {
1112 ctx := context.Background()
1113
1114 networkingStore, closer, err := createTestNetworkingStore()
1115 if err != nil {
1116 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1117 }
1118 defer closer()
1119
1120
1121 agentCache := newComputeAgentCache()
1122 gService := newGRPCService(agentCache, networkingStore)
1123 v0Service := newV0ServiceWrapper(gService)
1124
1125 req := &ncproxygrpcv0.GetEndpointRequest{
1126 Name: "",
1127 }
1128
1129 if _, err := v0Service.GetEndpoint(ctx, req); err == nil {
1130 t.Fatal("expected to get an error with empty endpoint name")
1131 }
1132 }
1133
1134 func TestGetEndpoints_V0_NoError(t *testing.T) {
1135 ctx := context.Background()
1136
1137 networkingStore, closer, err := createTestNetworkingStore()
1138 if err != nil {
1139 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1140 }
1141 defer closer()
1142
1143
1144 agentCache := newComputeAgentCache()
1145 gService := newGRPCService(agentCache, networkingStore)
1146 v0Service := newV0ServiceWrapper(gService)
1147
1148
1149 networkName := t.Name() + "-network"
1150 network, err := createTestIPv4NATNetwork(networkName)
1151 if err != nil {
1152 t.Fatalf("failed to create test network with %v", err)
1153 }
1154 defer func() {
1155 _ = network.Delete()
1156 }()
1157
1158
1159 endpointName := t.Name() + "-endpoint"
1160 endpoint, err := createTestEndpoint(endpointName, network.Id)
1161 if err != nil {
1162 t.Fatalf("failed to create test endpoint with %v", err)
1163 }
1164 defer func() {
1165 _ = endpoint.Delete()
1166 }()
1167
1168 req := &ncproxygrpcv0.GetEndpointsRequest{}
1169 resp, err := v0Service.GetEndpoints(ctx, req)
1170 if err != nil {
1171 t.Fatalf("expected to get no error, instead got %v", err)
1172 }
1173
1174 if !v0EndpointExists(endpointName, resp.Endpoints) {
1175 t.Fatalf("created endpoint was not found")
1176 }
1177 }
1178
1179 func TestGetNetwork_V0_NoError(t *testing.T) {
1180 ctx := context.Background()
1181
1182 networkingStore, closer, err := createTestNetworkingStore()
1183 if err != nil {
1184 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1185 }
1186 defer closer()
1187
1188
1189 agentCache := newComputeAgentCache()
1190 gService := newGRPCService(agentCache, networkingStore)
1191 v0Service := newV0ServiceWrapper(gService)
1192
1193
1194 networkName := t.Name() + "-network"
1195 network, err := createTestIPv4NATNetwork(networkName)
1196 if err != nil {
1197 t.Fatalf("failed to create test network with %v", err)
1198 }
1199
1200
1201 defer func() {
1202 _ = network.Delete()
1203 }()
1204
1205 req := &ncproxygrpcv0.GetNetworkRequest{
1206 Name: networkName,
1207 }
1208 _, err = v0Service.GetNetwork(ctx, req)
1209 if err != nil {
1210 t.Fatalf("expected no error, instead got %v", err)
1211 }
1212 }
1213
1214 func TestGetNetwork_V0_Error_NoNetwork(t *testing.T) {
1215 ctx := context.Background()
1216
1217 networkingStore, closer, err := createTestNetworkingStore()
1218 if err != nil {
1219 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1220 }
1221 defer closer()
1222
1223
1224 agentCache := newComputeAgentCache()
1225 gService := newGRPCService(agentCache, networkingStore)
1226 v0Service := newV0ServiceWrapper(gService)
1227
1228 fakeNetworkName := t.Name() + "-network"
1229
1230 req := &ncproxygrpcv0.GetNetworkRequest{
1231 Name: fakeNetworkName,
1232 }
1233 _, err = v0Service.GetNetwork(ctx, req)
1234 if err == nil {
1235 t.Fatal("expected to get an error when attempting to get nonexistent network")
1236 }
1237 }
1238
1239 func TestGetNetwork_V0_Error_EmptyNetworkName(t *testing.T) {
1240 ctx := context.Background()
1241
1242 networkingStore, closer, err := createTestNetworkingStore()
1243 if err != nil {
1244 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1245 }
1246 defer closer()
1247
1248
1249 agentCache := newComputeAgentCache()
1250 gService := newGRPCService(agentCache, networkingStore)
1251 v0Service := newV0ServiceWrapper(gService)
1252
1253 req := &ncproxygrpcv0.GetNetworkRequest{
1254 Name: "",
1255 }
1256 _, err = v0Service.GetNetwork(ctx, req)
1257 if err == nil {
1258 t.Fatal("expected to get an error when network name is empty")
1259 }
1260 }
1261
1262 func TestGetNetworks_V0_NoError(t *testing.T) {
1263 ctx := context.Background()
1264
1265 networkingStore, closer, err := createTestNetworkingStore()
1266 if err != nil {
1267 t.Fatalf("failed to create a test ncproxy networking store with %v", err)
1268 }
1269 defer closer()
1270
1271
1272 agentCache := newComputeAgentCache()
1273 gService := newGRPCService(agentCache, networkingStore)
1274 v0Service := newV0ServiceWrapper(gService)
1275
1276
1277 networkName := t.Name() + "-network"
1278 network, err := createTestIPv4NATNetwork(networkName)
1279 if err != nil {
1280 t.Fatalf("failed to create test network with %v", err)
1281 }
1282
1283
1284 defer func() {
1285 _ = network.Delete()
1286 }()
1287
1288 req := &ncproxygrpcv0.GetNetworksRequest{}
1289 resp, err := v0Service.GetNetworks(ctx, req)
1290 if err != nil {
1291 t.Fatalf("expected no error, instead got %v", err)
1292 }
1293 if !v0NetworkExists(networkName, resp.Networks) {
1294 t.Fatalf("failed to find created network")
1295 }
1296 }
1297
1298 func v0NetworkExists(targetName string, networks []*ncproxygrpcv0.GetNetworkResponse) bool {
1299 for _, resp := range networks {
1300 if resp.Name == targetName {
1301 return true
1302 }
1303 }
1304 return false
1305 }
1306
1307 func v0EndpointExists(targetName string, endpoints []*ncproxygrpcv0.GetEndpointResponse) bool {
1308 for _, resp := range endpoints {
1309 if resp.Name == targetName {
1310 return true
1311 }
1312 }
1313 return false
1314 }
1315
View as plain text