1 package endpoints_test
2
3 import (
4 "bytes"
5 "fmt"
6 "log"
7 "reflect"
8 "regexp"
9 "strconv"
10 "testing"
11
12 "github.com/aws/aws-sdk-go-v2/aws"
13 "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2"
14 "github.com/aws/smithy-go/logging"
15 )
16
17 type testCase struct {
18 Region string
19 Options endpoints.Options
20 Expected aws.Endpoint
21 WantErr bool
22 }
23
24 type serviceTest struct {
25 Partitions endpoints.Partitions
26 Cases []testCase
27 }
28
29 var partitionRegexp = struct {
30 Aws *regexp.Regexp
31 AwsIso *regexp.Regexp
32 }{
33
34 Aws: regexp.MustCompile("^(us|eu|ap|sa|ca|me|af)\\-\\w+\\-\\d+$"),
35 AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"),
36 }
37
38 var testCases = map[string]serviceTest{
39 "default-pattern-service": {
40 Partitions: endpoints.Partitions{
41 {
42 ID: "aws",
43 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
44 {
45 Variant: endpoints.DualStackVariant,
46 }: {
47 Hostname: "default-pattern-service.{region}.api.aws",
48 Protocols: []string{"https"},
49 SignatureVersions: []string{"v4"},
50 },
51 {
52 Variant: endpoints.FIPSVariant,
53 }: {
54 Hostname: "default-pattern-service-fips.{region}.amazonaws.com",
55 Protocols: []string{"https"},
56 SignatureVersions: []string{"v4"},
57 },
58 {
59 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
60 }: {
61 Hostname: "default-pattern-service-fips.{region}.api.aws",
62 Protocols: []string{"https"},
63 SignatureVersions: []string{"v4"},
64 },
65 {
66 Variant: 0,
67 }: {
68 Hostname: "default-pattern-service.{region}.amazonaws.com",
69 Protocols: []string{"https"},
70 SignatureVersions: []string{"v4"},
71 },
72 },
73 RegionRegex: partitionRegexp.Aws,
74 IsRegionalized: true,
75 Endpoints: endpoints.Endpoints{
76 endpoints.EndpointKey{
77 Region: "af-south-1",
78 }: endpoints.Endpoint{},
79 endpoints.EndpointKey{
80 Region: "us-west-2",
81 }: endpoints.Endpoint{},
82 endpoints.EndpointKey{
83 Region: "us-west-2",
84 Variant: endpoints.FIPSVariant,
85 }: {
86 Hostname: "default-pattern-service-fips.us-west-2.amazonaws.com",
87 },
88 endpoints.EndpointKey{
89 Region: "us-west-2",
90 Variant: endpoints.DualStackVariant,
91 }: {
92 Hostname: "default-pattern-service.us-west-2.api.aws",
93 },
94 },
95 },
96 {
97 ID: "aws-iso",
98 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
99 {
100 Variant: 0,
101 }: {
102 Hostname: "default-pattern-service.{region}.c2s.ic.gov",
103 Protocols: []string{"https"},
104 SignatureVersions: []string{"v4"},
105 },
106 },
107 RegionRegex: partitionRegexp.AwsIso,
108 IsRegionalized: true,
109 },
110 },
111 Cases: []testCase{
112 {
113 Region: "us-west-2",
114 Expected: aws.Endpoint{
115 URL: "https://default-pattern-service.us-west-2.amazonaws.com",
116 PartitionID: "aws",
117 SigningRegion: "us-west-2",
118 SigningMethod: "v4",
119 },
120 },
121 {
122 Region: "us-west-2",
123 Options: endpoints.Options{
124 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
125 },
126 Expected: aws.Endpoint{
127 URL: "https://default-pattern-service-fips.us-west-2.amazonaws.com",
128 PartitionID: "aws",
129 SigningRegion: "us-west-2",
130 SigningMethod: "v4",
131 },
132 },
133 {
134 Region: "af-south-1",
135 Expected: aws.Endpoint{
136 URL: "https://default-pattern-service.af-south-1.amazonaws.com",
137 PartitionID: "aws",
138 SigningRegion: "af-south-1",
139 SigningMethod: "v4",
140 },
141 },
142 {
143 Region: "af-south-1",
144 Options: endpoints.Options{
145 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
146 },
147 Expected: aws.Endpoint{
148 URL: "https://default-pattern-service-fips.af-south-1.amazonaws.com",
149 PartitionID: "aws",
150 SigningRegion: "af-south-1",
151 SigningMethod: "v4",
152 },
153 },
154 {
155 Region: "us-west-2",
156 Expected: aws.Endpoint{
157 URL: "https://default-pattern-service.us-west-2.amazonaws.com",
158 PartitionID: "aws",
159 SigningRegion: "us-west-2",
160 SigningMethod: "v4",
161 },
162 },
163 {
164 Region: "us-west-2",
165 Options: endpoints.Options{
166 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
167 },
168 Expected: aws.Endpoint{
169 URL: "https://default-pattern-service.us-west-2.api.aws",
170 PartitionID: "aws",
171 SigningRegion: "us-west-2",
172 SigningMethod: "v4",
173 },
174 },
175 {
176 Region: "af-south-1",
177 Expected: aws.Endpoint{
178 URL: "https://default-pattern-service.af-south-1.amazonaws.com",
179 PartitionID: "aws",
180 SigningRegion: "af-south-1",
181 SigningMethod: "v4",
182 },
183 },
184 {
185 Region: "af-south-1",
186 Options: endpoints.Options{
187 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
188 },
189 Expected: aws.Endpoint{
190 URL: "https://default-pattern-service.af-south-1.api.aws",
191 PartitionID: "aws",
192 SigningRegion: "af-south-1",
193 SigningMethod: "v4",
194 },
195 },
196 },
197 },
198 "global-service": {
199 Partitions: endpoints.Partitions{
200 {
201 ID: "aws",
202 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
203 {
204 Variant: endpoints.DualStackVariant,
205 }: {
206 Hostname: "global-service.{region}.api.aws",
207 Protocols: []string{"https"},
208 SignatureVersions: []string{"v4"},
209 },
210 {
211 Variant: endpoints.FIPSVariant,
212 }: {
213 Hostname: "global-service-fips.{region}.amazonaws.com",
214 Protocols: []string{"https"},
215 SignatureVersions: []string{"v4"},
216 },
217 {
218 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
219 }: {
220 Hostname: "global-service-fips.{region}.api.aws",
221 Protocols: []string{"https"},
222 SignatureVersions: []string{"v4"},
223 },
224 {
225 Variant: 0,
226 }: {
227 Hostname: "global-service.{region}.amazonaws.com",
228 Protocols: []string{"https"},
229 SignatureVersions: []string{"v4"},
230 },
231 },
232 RegionRegex: partitionRegexp.Aws,
233 IsRegionalized: false,
234 PartitionEndpoint: "aws-global",
235 Endpoints: endpoints.Endpoints{
236 endpoints.EndpointKey{
237 Region: "aws-global",
238 }: endpoints.Endpoint{
239 Hostname: "global-service.amazonaws.com",
240 CredentialScope: endpoints.CredentialScope{
241 Region: "us-east-1",
242 },
243 },
244 endpoints.EndpointKey{
245 Region: "aws-global",
246 Variant: endpoints.FIPSVariant,
247 }: {
248 Hostname: "global-service-fips.amazonaws.com",
249 CredentialScope: endpoints.CredentialScope{
250 Region: "us-east-1",
251 },
252 },
253 endpoints.EndpointKey{
254 Region: "aws-global",
255 Variant: endpoints.DualStackVariant,
256 }: {
257 Hostname: "global-service.api.aws",
258 CredentialScope: endpoints.CredentialScope{
259 Region: "us-east-1",
260 },
261 },
262 },
263 },
264 {
265 ID: "aws-iso",
266 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
267 {
268 Variant: 0,
269 }: {
270 Hostname: "global-service.{region}.c2s.ic.gov",
271 Protocols: []string{"https"},
272 SignatureVersions: []string{"v4"},
273 },
274 },
275 RegionRegex: partitionRegexp.AwsIso,
276 IsRegionalized: true,
277 },
278 },
279 Cases: []testCase{
280 {
281 Region: "aws-global",
282 Expected: aws.Endpoint{
283 URL: "https://global-service.amazonaws.com",
284 PartitionID: "aws",
285 SigningRegion: "us-east-1",
286 SigningMethod: "v4",
287 },
288 },
289 {
290 Region: "aws-global",
291 Options: endpoints.Options{
292 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
293 },
294 Expected: aws.Endpoint{
295 URL: "https://global-service-fips.amazonaws.com",
296 PartitionID: "aws",
297 SigningRegion: "us-east-1",
298 SigningMethod: "v4",
299 },
300 },
301 {
302 Region: "foo",
303 Expected: aws.Endpoint{
304 URL: "https://global-service.amazonaws.com",
305 PartitionID: "aws",
306 SigningRegion: "us-east-1",
307 SigningMethod: "v4",
308 },
309 },
310 {
311 Region: "foo",
312 Options: endpoints.Options{
313 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
314 },
315 Expected: aws.Endpoint{
316 URL: "https://global-service-fips.amazonaws.com",
317 PartitionID: "aws",
318 SigningRegion: "us-east-1",
319 SigningMethod: "v4",
320 },
321 },
322 {
323 Region: "aws-global",
324 Expected: aws.Endpoint{
325 URL: "https://global-service.amazonaws.com",
326 PartitionID: "aws",
327 SigningRegion: "us-east-1",
328 SigningMethod: "v4",
329 },
330 },
331 {
332 Region: "aws-global",
333 Options: endpoints.Options{
334 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
335 },
336 Expected: aws.Endpoint{
337 URL: "https://global-service.api.aws",
338 PartitionID: "aws",
339 SigningRegion: "us-east-1",
340 SigningMethod: "v4",
341 },
342 },
343 {
344 Region: "foo",
345 Expected: aws.Endpoint{
346 URL: "https://global-service.amazonaws.com",
347 PartitionID: "aws",
348 SigningRegion: "us-east-1",
349 SigningMethod: "v4",
350 },
351 },
352 {
353 Region: "foo",
354 Options: endpoints.Options{
355 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
356 },
357 Expected: aws.Endpoint{
358 URL: "https://global-service.api.aws",
359 PartitionID: "aws",
360 SigningRegion: "us-east-1",
361 SigningMethod: "v4",
362 },
363 },
364 },
365 },
366 "multi-variant-service": {
367 Partitions: endpoints.Partitions{
368 {
369 ID: "aws",
370 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
371 {
372 Variant: endpoints.DualStackVariant,
373 }: {
374 Hostname: "multi-variant-service.dualstack.{region}.api.aws",
375 Protocols: []string{"https"},
376 SignatureVersions: []string{"v4"},
377 },
378 {
379 Variant: endpoints.FIPSVariant,
380 }: {
381 Hostname: "fips.multi-variant-service.{region}.amazonaws.com",
382 Protocols: []string{"https"},
383 SignatureVersions: []string{"v4"},
384 },
385 {
386 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
387 }: {
388 Hostname: "fips.multi-variant-service.dualstack.{region}.new.dns.suffix",
389 Protocols: []string{"https"},
390 SignatureVersions: []string{"v4"},
391 },
392 {
393 Variant: 0,
394 }: {
395 Hostname: "multi-variant-service.{region}.amazonaws.com",
396 Protocols: []string{"https"},
397 SignatureVersions: []string{"v4"},
398 },
399 },
400 RegionRegex: partitionRegexp.Aws,
401 IsRegionalized: true,
402 Endpoints: endpoints.Endpoints{
403 endpoints.EndpointKey{
404 Region: "af-south-1",
405 }: endpoints.Endpoint{},
406 endpoints.EndpointKey{
407 Region: "us-west-2",
408 }: endpoints.Endpoint{},
409 endpoints.EndpointKey{
410 Region: "us-west-2",
411 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
412 }: {
413 Hostname: "fips.multi-variant-service.dualstack.us-west-2.new.dns.suffix",
414 },
415 },
416 },
417 {
418 ID: "aws-iso",
419 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
420 {
421 Variant: 0,
422 }: {
423 Hostname: "multi-variant-service.{region}.c2s.ic.gov",
424 Protocols: []string{"https"},
425 SignatureVersions: []string{"v4"},
426 },
427 },
428 RegionRegex: partitionRegexp.AwsIso,
429 IsRegionalized: true,
430 },
431 },
432 Cases: []testCase{
433 {
434 Region: "us-west-2",
435 Expected: aws.Endpoint{
436 URL: "https://multi-variant-service.us-west-2.amazonaws.com",
437 PartitionID: "aws",
438 SigningRegion: "us-west-2",
439 SigningMethod: "v4",
440 },
441 },
442 {
443 Region: "us-west-2",
444 Options: endpoints.Options{
445 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
446 },
447 Expected: aws.Endpoint{
448 URL: "https://multi-variant-service.dualstack.us-west-2.api.aws",
449 PartitionID: "aws",
450 SigningRegion: "us-west-2",
451 SigningMethod: "v4",
452 },
453 },
454 {
455 Region: "us-west-2",
456 Options: endpoints.Options{
457 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
458 },
459 Expected: aws.Endpoint{
460 URL: "https://fips.multi-variant-service.us-west-2.amazonaws.com",
461 PartitionID: "aws",
462 SigningRegion: "us-west-2",
463 SigningMethod: "v4",
464 },
465 },
466 {
467 Region: "us-west-2",
468 Options: endpoints.Options{
469 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
470 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
471 },
472 Expected: aws.Endpoint{
473 URL: "https://fips.multi-variant-service.dualstack.us-west-2.new.dns.suffix",
474 PartitionID: "aws",
475 SigningRegion: "us-west-2",
476 SigningMethod: "v4",
477 },
478 },
479 {
480 Region: "af-south-1",
481 Expected: aws.Endpoint{
482 URL: "https://multi-variant-service.af-south-1.amazonaws.com",
483 PartitionID: "aws",
484 SigningRegion: "af-south-1",
485 SigningMethod: "v4",
486 },
487 },
488 {
489 Region: "af-south-1",
490 Options: endpoints.Options{
491 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
492 },
493 Expected: aws.Endpoint{
494 URL: "https://multi-variant-service.dualstack.af-south-1.api.aws",
495 PartitionID: "aws",
496 SigningRegion: "af-south-1",
497 SigningMethod: "v4",
498 },
499 },
500 {
501 Region: "af-south-1",
502 Options: endpoints.Options{
503 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
504 },
505 Expected: aws.Endpoint{
506 URL: "https://fips.multi-variant-service.af-south-1.amazonaws.com",
507 PartitionID: "aws",
508 SigningRegion: "af-south-1",
509 SigningMethod: "v4",
510 },
511 },
512 {
513 Region: "af-south-1",
514 Options: endpoints.Options{
515 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
516 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
517 },
518 Expected: aws.Endpoint{
519 URL: "https://fips.multi-variant-service.dualstack.af-south-1.new.dns.suffix",
520 PartitionID: "aws",
521 SigningRegion: "af-south-1",
522 SigningMethod: "v4",
523 },
524 },
525 },
526 },
527 "override-endpoint-variant-service": {
528 Partitions: endpoints.Partitions{
529 {
530 ID: "aws",
531 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
532 {
533 Variant: endpoints.DualStackVariant,
534 }: {
535 Hostname: "override-endpoint-variant-service.{region}.api.aws",
536 Protocols: []string{"https"},
537 SignatureVersions: []string{"v4"},
538 },
539 {
540 Variant: endpoints.FIPSVariant,
541 }: {
542 Hostname: "override-endpoint-variant-service-fips.{region}.amazonaws.com",
543 Protocols: []string{"https"},
544 SignatureVersions: []string{"v4"},
545 },
546 {
547 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
548 }: {
549 Hostname: "override-endpoint-variant-service-fips.{region}.api.aws",
550 Protocols: []string{"https"},
551 SignatureVersions: []string{"v4"},
552 },
553 {
554 Variant: 0,
555 }: {
556 Hostname: "override-endpoint-variant-service.{region}.amazonaws.com",
557 Protocols: []string{"https"},
558 SignatureVersions: []string{"v4"},
559 },
560 },
561 RegionRegex: partitionRegexp.Aws,
562 IsRegionalized: true,
563 Endpoints: endpoints.Endpoints{
564 endpoints.EndpointKey{
565 Region: "af-south-1",
566 }: endpoints.Endpoint{},
567 endpoints.EndpointKey{
568 Region: "us-west-2",
569 }: endpoints.Endpoint{},
570 endpoints.EndpointKey{
571 Region: "us-west-2",
572 Variant: endpoints.FIPSVariant,
573 }: {
574 Hostname: "fips.override-endpoint-variant-service.us-west-2.amazonaws.com",
575 },
576 endpoints.EndpointKey{
577 Region: "us-west-2",
578 Variant: endpoints.DualStackVariant,
579 }: {
580 Hostname: "override-endpoint-variant-service.dualstack.us-west-2.amazonaws.com",
581 },
582 },
583 },
584 {
585 ID: "aws-iso",
586 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
587 {
588 Variant: 0,
589 }: {
590 Hostname: "override-endpoint-variant-service.{region}.c2s.ic.gov",
591 Protocols: []string{"https"},
592 SignatureVersions: []string{"v4"},
593 },
594 },
595 RegionRegex: partitionRegexp.AwsIso,
596 IsRegionalized: true,
597 },
598 },
599 Cases: []testCase{
600 {
601 Region: "us-west-2",
602 Expected: aws.Endpoint{
603 URL: "https://override-endpoint-variant-service.us-west-2.amazonaws.com",
604 PartitionID: "aws",
605 SigningRegion: "us-west-2",
606 SigningMethod: "v4",
607 },
608 },
609 {
610 Region: "us-west-2",
611 Options: endpoints.Options{
612 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
613 },
614 Expected: aws.Endpoint{
615 URL: "https://fips.override-endpoint-variant-service.us-west-2.amazonaws.com",
616 PartitionID: "aws",
617 SigningRegion: "us-west-2",
618 SigningMethod: "v4",
619 },
620 },
621 {
622 Region: "af-south-1",
623 Expected: aws.Endpoint{
624 URL: "https://override-endpoint-variant-service.af-south-1.amazonaws.com",
625 PartitionID: "aws",
626 SigningRegion: "af-south-1",
627 SigningMethod: "v4",
628 },
629 },
630 {
631 Region: "af-south-1",
632 Options: endpoints.Options{
633 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
634 },
635 Expected: aws.Endpoint{
636 URL: "https://override-endpoint-variant-service-fips.af-south-1.amazonaws.com",
637 PartitionID: "aws",
638 SigningRegion: "af-south-1",
639 SigningMethod: "v4",
640 },
641 },
642 {
643 Region: "us-west-2",
644 Expected: aws.Endpoint{
645 URL: "https://override-endpoint-variant-service.us-west-2.amazonaws.com",
646 PartitionID: "aws",
647 SigningRegion: "us-west-2",
648 SigningMethod: "v4",
649 },
650 },
651 {
652 Region: "us-west-2",
653 Options: endpoints.Options{
654 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
655 },
656 Expected: aws.Endpoint{
657 URL: "https://override-endpoint-variant-service.dualstack.us-west-2.amazonaws.com",
658 PartitionID: "aws",
659 SigningRegion: "us-west-2",
660 SigningMethod: "v4",
661 },
662 },
663 {
664 Region: "af-south-1",
665 Expected: aws.Endpoint{
666 URL: "https://override-endpoint-variant-service.af-south-1.amazonaws.com",
667 PartitionID: "aws",
668 SigningRegion: "af-south-1",
669 SigningMethod: "v4",
670 },
671 },
672 {
673 Region: "af-south-1",
674 Options: endpoints.Options{
675 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
676 },
677 Expected: aws.Endpoint{
678 URL: "https://override-endpoint-variant-service.af-south-1.api.aws",
679 PartitionID: "aws",
680 SigningRegion: "af-south-1",
681 SigningMethod: "v4",
682 },
683 },
684 },
685 },
686 "override-variant-dns-suffix-service": {
687 Partitions: endpoints.Partitions{
688 {
689 ID: "aws",
690 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
691 {
692 Variant: endpoints.DualStackVariant,
693 }: {
694 Hostname: "override-variant-dns-suffix-service.{region}.new.dns.suffix",
695 Protocols: []string{"https"},
696 SignatureVersions: []string{"v4"},
697 },
698 {
699 Variant: endpoints.FIPSVariant,
700 }: {
701 Hostname: "override-variant-dns-suffix-service-fips.{region}.new.dns.suffix",
702 Protocols: []string{"https"},
703 SignatureVersions: []string{"v4"},
704 },
705 {
706 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
707 }: {
708 Hostname: "override-variant-dns-suffix-service-fips.{region}.api.aws",
709 Protocols: []string{"https"},
710 SignatureVersions: []string{"v4"},
711 },
712 {
713 Variant: 0,
714 }: {
715 Hostname: "override-variant-dns-suffix-service.{region}.amazonaws.com",
716 Protocols: []string{"https"},
717 SignatureVersions: []string{"v4"},
718 },
719 },
720 RegionRegex: partitionRegexp.Aws,
721 IsRegionalized: true,
722 Endpoints: endpoints.Endpoints{
723 endpoints.EndpointKey{
724 Region: "af-south-1",
725 }: endpoints.Endpoint{},
726 endpoints.EndpointKey{
727 Region: "us-west-2",
728 }: endpoints.Endpoint{},
729 endpoints.EndpointKey{
730 Region: "us-west-2",
731 Variant: endpoints.FIPSVariant,
732 }: {
733 Hostname: "override-variant-dns-suffix-service-fips.us-west-2.new.dns.suffix",
734 },
735 endpoints.EndpointKey{
736 Region: "us-west-2",
737 Variant: endpoints.DualStackVariant,
738 }: {
739 Hostname: "override-variant-dns-suffix-service.us-west-2.new.dns.suffix",
740 },
741 },
742 },
743 {
744 ID: "aws-iso",
745 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
746 {
747 Variant: 0,
748 }: {
749 Hostname: "override-variant-dns-suffix-service.{region}.c2s.ic.gov",
750 Protocols: []string{"https"},
751 SignatureVersions: []string{"v4"},
752 },
753 },
754 RegionRegex: partitionRegexp.AwsIso,
755 IsRegionalized: true,
756 },
757 },
758 Cases: []testCase{
759 {
760 Region: "us-west-2",
761 Expected: aws.Endpoint{
762 URL: "https://override-variant-dns-suffix-service.us-west-2.amazonaws.com",
763 PartitionID: "aws",
764 SigningRegion: "us-west-2",
765 SigningMethod: "v4",
766 },
767 },
768 {
769 Region: "us-west-2",
770 Options: endpoints.Options{
771 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
772 },
773 Expected: aws.Endpoint{
774 URL: "https://override-variant-dns-suffix-service-fips.us-west-2.new.dns.suffix",
775 PartitionID: "aws",
776 SigningRegion: "us-west-2",
777 SigningMethod: "v4",
778 },
779 },
780 {
781 Region: "af-south-1",
782 Expected: aws.Endpoint{
783 URL: "https://override-variant-dns-suffix-service.af-south-1.amazonaws.com",
784 PartitionID: "aws",
785 SigningRegion: "af-south-1",
786 SigningMethod: "v4",
787 },
788 },
789 {
790 Region: "af-south-1",
791 Options: endpoints.Options{
792 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
793 },
794 Expected: aws.Endpoint{
795 URL: "https://override-variant-dns-suffix-service-fips.af-south-1.new.dns.suffix",
796 PartitionID: "aws",
797 SigningRegion: "af-south-1",
798 SigningMethod: "v4",
799 },
800 },
801 {
802 Region: "us-west-2",
803 Expected: aws.Endpoint{
804 URL: "https://override-variant-dns-suffix-service.us-west-2.amazonaws.com",
805 PartitionID: "aws",
806 SigningRegion: "us-west-2",
807 SigningMethod: "v4",
808 },
809 },
810 {
811 Region: "us-west-2",
812 Options: endpoints.Options{
813 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
814 },
815 Expected: aws.Endpoint{
816 URL: "https://override-variant-dns-suffix-service.us-west-2.new.dns.suffix",
817 PartitionID: "aws",
818 SigningRegion: "us-west-2",
819 SigningMethod: "v4",
820 },
821 },
822 {
823 Region: "af-south-1",
824 Expected: aws.Endpoint{
825 URL: "https://override-variant-dns-suffix-service.af-south-1.amazonaws.com",
826 PartitionID: "aws",
827 SigningRegion: "af-south-1",
828 SigningMethod: "v4",
829 },
830 },
831 {
832 Region: "af-south-1",
833 Options: endpoints.Options{
834 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
835 },
836 Expected: aws.Endpoint{
837 URL: "https://override-variant-dns-suffix-service.af-south-1.new.dns.suffix",
838 PartitionID: "aws",
839 SigningRegion: "af-south-1",
840 SigningMethod: "v4",
841 },
842 },
843 },
844 },
845 "override-variant-hostname-service": {
846 Partitions: endpoints.Partitions{
847 {
848 ID: "aws",
849 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
850 {
851 Variant: endpoints.DualStackVariant,
852 }: {
853 Hostname: "override-variant-hostname-service.dualstack.{region}.api.aws",
854 Protocols: []string{"https"},
855 SignatureVersions: []string{"v4"},
856 },
857 {
858 Variant: endpoints.FIPSVariant,
859 }: {
860 Hostname: "fips.override-variant-hostname-service.{region}.amazonaws.com",
861 Protocols: []string{"https"},
862 SignatureVersions: []string{"v4"},
863 },
864 {
865 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
866 }: {
867 Hostname: "override-variant-hostname-service-fips.{region}.api.aws",
868 Protocols: []string{"https"},
869 SignatureVersions: []string{"v4"},
870 },
871 {
872 Variant: 0,
873 }: {
874 Hostname: "override-variant-hostname-service.{region}.amazonaws.com",
875 Protocols: []string{"https"},
876 SignatureVersions: []string{"v4"},
877 },
878 },
879 RegionRegex: partitionRegexp.Aws,
880 IsRegionalized: true,
881 Endpoints: endpoints.Endpoints{
882 endpoints.EndpointKey{
883 Region: "af-south-1",
884 }: endpoints.Endpoint{},
885 endpoints.EndpointKey{
886 Region: "us-west-2",
887 }: endpoints.Endpoint{},
888 endpoints.EndpointKey{
889 Region: "us-west-2",
890 Variant: endpoints.FIPSVariant,
891 }: {
892 Hostname: "fips.override-variant-hostname-service.us-west-2.amazonaws.com",
893 },
894 endpoints.EndpointKey{
895 Region: "us-west-2",
896 Variant: endpoints.DualStackVariant,
897 }: {
898 Hostname: "override-variant-hostname-service.dualstack.us-west-2.api.aws",
899 },
900 },
901 },
902 {
903 ID: "aws-iso",
904 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
905 {
906 Variant: 0,
907 }: {
908 Hostname: "override-variant-hostname-service.{region}.c2s.ic.gov",
909 Protocols: []string{"https"},
910 SignatureVersions: []string{"v4"},
911 },
912 },
913 RegionRegex: partitionRegexp.AwsIso,
914 IsRegionalized: true,
915 },
916 },
917 Cases: []testCase{
918 {
919 Region: "us-west-2",
920 Expected: aws.Endpoint{
921 URL: "https://override-variant-hostname-service.us-west-2.amazonaws.com",
922 PartitionID: "aws",
923 SigningRegion: "us-west-2",
924 SigningMethod: "v4",
925 },
926 },
927 {
928 Region: "us-west-2",
929 Options: endpoints.Options{
930 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
931 },
932 Expected: aws.Endpoint{
933 URL: "https://fips.override-variant-hostname-service.us-west-2.amazonaws.com",
934 PartitionID: "aws",
935 SigningRegion: "us-west-2",
936 SigningMethod: "v4",
937 },
938 },
939 {
940 Region: "af-south-1",
941 Expected: aws.Endpoint{
942 URL: "https://override-variant-hostname-service.af-south-1.amazonaws.com",
943 PartitionID: "aws",
944 SigningRegion: "af-south-1",
945 SigningMethod: "v4",
946 },
947 },
948 {
949 Region: "af-south-1",
950 Options: endpoints.Options{
951 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
952 },
953 Expected: aws.Endpoint{
954 URL: "https://fips.override-variant-hostname-service.af-south-1.amazonaws.com",
955 PartitionID: "aws",
956 SigningRegion: "af-south-1",
957 SigningMethod: "v4",
958 },
959 },
960 {
961 Region: "us-west-2",
962 Expected: aws.Endpoint{
963 URL: "https://override-variant-hostname-service.us-west-2.amazonaws.com",
964 PartitionID: "aws",
965 SigningRegion: "us-west-2",
966 SigningMethod: "v4",
967 },
968 },
969 {
970 Region: "us-west-2",
971 Options: endpoints.Options{
972 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
973 },
974 Expected: aws.Endpoint{
975 URL: "https://override-variant-hostname-service.dualstack.us-west-2.api.aws",
976 PartitionID: "aws",
977 SigningRegion: "us-west-2",
978 SigningMethod: "v4",
979 },
980 },
981 {
982 Region: "af-south-1",
983 Expected: aws.Endpoint{
984 URL: "https://override-variant-hostname-service.af-south-1.amazonaws.com",
985 PartitionID: "aws",
986 SigningRegion: "af-south-1",
987 SigningMethod: "v4",
988 },
989 },
990 {
991 Region: "af-south-1",
992 Options: endpoints.Options{
993 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
994 },
995 Expected: aws.Endpoint{
996 URL: "https://override-variant-hostname-service.dualstack.af-south-1.api.aws",
997 PartitionID: "aws",
998 SigningRegion: "af-south-1",
999 SigningMethod: "v4",
1000 },
1001 },
1002 },
1003 },
1004 "override-variant-service": {
1005 Partitions: endpoints.Partitions{
1006 {
1007 ID: "aws",
1008 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
1009 {
1010 Variant: endpoints.DualStackVariant,
1011 }: {
1012 Hostname: "override-variant-service.dualstack.{region}.new.dns.suffix",
1013 Protocols: []string{"https"},
1014 SignatureVersions: []string{"v4"},
1015 },
1016 {
1017 Variant: endpoints.FIPSVariant,
1018 }: {
1019 Hostname: "fips.override-variant-service.{region}.new.dns.suffix",
1020 Protocols: []string{"https"},
1021 SignatureVersions: []string{"v4"},
1022 },
1023 {
1024 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
1025 }: {
1026 Hostname: "override-variant-service-fips.{region}.api.aws",
1027 Protocols: []string{"https"},
1028 SignatureVersions: []string{"v4"},
1029 },
1030 {
1031 Variant: 0,
1032 }: {
1033 Hostname: "override-variant-service.{region}.amazonaws.com",
1034 Protocols: []string{"https"},
1035 SignatureVersions: []string{"v4"},
1036 },
1037 },
1038 RegionRegex: partitionRegexp.Aws,
1039 IsRegionalized: true,
1040 Endpoints: endpoints.Endpoints{
1041 endpoints.EndpointKey{
1042 Region: "af-south-1",
1043 }: endpoints.Endpoint{},
1044 endpoints.EndpointKey{
1045 Region: "us-west-2",
1046 }: endpoints.Endpoint{},
1047 endpoints.EndpointKey{
1048 Region: "us-west-2",
1049 Variant: endpoints.FIPSVariant,
1050 }: {
1051 Hostname: "fips.override-variant-service.us-west-2.new.dns.suffix",
1052 },
1053 endpoints.EndpointKey{
1054 Region: "us-west-2",
1055 Variant: endpoints.DualStackVariant,
1056 }: {
1057 Hostname: "override-variant-service.dualstack.us-west-2.new.dns.suffix",
1058 },
1059 },
1060 },
1061 {
1062 ID: "aws-iso",
1063 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
1064 {
1065 Variant: 0,
1066 }: {
1067 Hostname: "override-variant-service.{region}.c2s.ic.gov",
1068 Protocols: []string{"https"},
1069 SignatureVersions: []string{"v4"},
1070 },
1071 },
1072 RegionRegex: partitionRegexp.AwsIso,
1073 IsRegionalized: true,
1074 },
1075 },
1076 Cases: []testCase{
1077 {
1078 Region: "us-west-2",
1079 Expected: aws.Endpoint{
1080 URL: "https://override-variant-service.us-west-2.amazonaws.com",
1081 PartitionID: "aws",
1082 SigningRegion: "us-west-2",
1083 SigningMethod: "v4",
1084 },
1085 },
1086 {
1087 Region: "us-west-2",
1088 Options: endpoints.Options{
1089 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
1090 },
1091 Expected: aws.Endpoint{
1092 URL: "https://fips.override-variant-service.us-west-2.new.dns.suffix",
1093 PartitionID: "aws",
1094 SigningRegion: "us-west-2",
1095 SigningMethod: "v4",
1096 },
1097 },
1098 {
1099 Region: "af-south-1",
1100 Expected: aws.Endpoint{
1101 URL: "https://override-variant-service.af-south-1.amazonaws.com",
1102 PartitionID: "aws",
1103 SigningRegion: "af-south-1",
1104 SigningMethod: "v4",
1105 },
1106 },
1107 {
1108 Region: "af-south-1",
1109 Options: endpoints.Options{
1110 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
1111 },
1112 Expected: aws.Endpoint{
1113 URL: "https://fips.override-variant-service.af-south-1.new.dns.suffix",
1114 PartitionID: "aws",
1115 SigningRegion: "af-south-1",
1116 SigningMethod: "v4",
1117 },
1118 },
1119 {
1120 Region: "us-west-2",
1121 Expected: aws.Endpoint{
1122 URL: "https://override-variant-service.us-west-2.amazonaws.com",
1123 PartitionID: "aws",
1124 SigningRegion: "us-west-2",
1125 SigningMethod: "v4",
1126 },
1127 },
1128 {
1129 Region: "us-west-2",
1130 Options: endpoints.Options{
1131 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
1132 },
1133 Expected: aws.Endpoint{
1134 URL: "https://override-variant-service.dualstack.us-west-2.new.dns.suffix",
1135 PartitionID: "aws",
1136 SigningRegion: "us-west-2",
1137 SigningMethod: "v4",
1138 },
1139 },
1140 {
1141 Region: "af-south-1",
1142 Expected: aws.Endpoint{
1143 URL: "https://override-variant-service.af-south-1.amazonaws.com",
1144 PartitionID: "aws",
1145 SigningRegion: "af-south-1",
1146 SigningMethod: "v4",
1147 },
1148 },
1149 {
1150 Region: "af-south-1",
1151 Options: endpoints.Options{
1152 UseDualStackEndpoint: aws.DualStackEndpointStateEnabled,
1153 },
1154 Expected: aws.Endpoint{
1155 URL: "https://override-variant-service.dualstack.af-south-1.new.dns.suffix",
1156 PartitionID: "aws",
1157 SigningRegion: "af-south-1",
1158 SigningMethod: "v4",
1159 },
1160 },
1161 },
1162 },
1163 }
1164
1165 func TestResolveEndpoint(t *testing.T) {
1166 for service := range testCases {
1167 t.Run(service, func(t *testing.T) {
1168 partitions := testCases[service].Partitions
1169 testCases := testCases[service].Cases
1170
1171 for i, tt := range testCases {
1172 t.Run(strconv.FormatInt(int64(i), 10), func(t *testing.T) {
1173 endpoint, err := partitions.ResolveEndpoint(tt.Region, tt.Options)
1174 if (err != nil) != (tt.WantErr) {
1175 t.Errorf("WantErr=%v, got error: %v", tt.WantErr, err)
1176 }
1177 if diff := cmpDiff(tt.Expected, endpoint); len(diff) > 0 {
1178 t.Error(diff)
1179 }
1180 })
1181 }
1182 })
1183 }
1184 }
1185
1186 func TestDisableHTTPS(t *testing.T) {
1187 partitions := endpoints.Partitions{
1188 endpoints.Partition{
1189 ID: "aws",
1190 RegionRegex: partitionRegexp.Aws,
1191 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
1192 {}: {
1193 Hostname: "foo.bar.tld",
1194 Protocols: []string{"https", "http"},
1195 },
1196 },
1197 },
1198 }
1199
1200 endpoint, err := partitions.ResolveEndpoint("us-west-2", endpoints.Options{})
1201 if err != nil {
1202 t.Errorf("expect no error, got %v", err)
1203 }
1204
1205 if e, a := "https://foo.bar.tld", endpoint.URL; e != a {
1206 t.Errorf("expect %v, got %v", e, a)
1207 }
1208
1209 endpoint, err = partitions.ResolveEndpoint("us-west-2", endpoints.Options{DisableHTTPS: true})
1210 if err != nil {
1211 t.Errorf("expect no error, got %v", err)
1212 }
1213
1214 if e, a := "http://foo.bar.tld", endpoint.URL; e != a {
1215 t.Errorf("expect %v, got %v", e, a)
1216 }
1217 }
1218
1219 func TestLogDeprecated(t *testing.T) {
1220 partitions := endpoints.Partitions{
1221 endpoints.Partition{
1222 ID: "aws",
1223 RegionRegex: partitionRegexp.Aws,
1224 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
1225 {}: {
1226 Hostname: "foo.{region}.bar.tld",
1227 Protocols: []string{"https", "http"},
1228 },
1229 {
1230 Variant: endpoints.FIPSVariant,
1231 }: {
1232 Hostname: "foo-fips.{region}.bar.tld",
1233 },
1234 },
1235 Endpoints: map[endpoints.EndpointKey]endpoints.Endpoint{
1236 {
1237 Region: "foo",
1238 }: {},
1239 {
1240 Region: "bar",
1241 }: {
1242 Deprecated: aws.TrueTernary,
1243 },
1244 {
1245 Region: "bar",
1246 Variant: endpoints.FIPSVariant,
1247 }: {
1248 Deprecated: aws.TrueTernary,
1249 },
1250 },
1251 },
1252 }
1253
1254 cases := []struct {
1255 Region string
1256 Options endpoints.Options
1257 Expected aws.Endpoint
1258 SetupLogger func() (logging.Logger, func(*testing.T))
1259 WantErr bool
1260 }{
1261 {
1262 Region: "foo",
1263 Expected: aws.Endpoint{
1264 URL: "https://foo.foo.bar.tld",
1265 PartitionID: "aws",
1266 SigningRegion: "foo",
1267 SigningMethod: "v4",
1268 },
1269 },
1270 {
1271 Region: "bar",
1272 Options: endpoints.Options{
1273 LogDeprecated: true,
1274 },
1275 Expected: aws.Endpoint{
1276 URL: "https://foo.bar.bar.tld",
1277 PartitionID: "aws",
1278 SigningRegion: "bar",
1279 SigningMethod: "v4",
1280 },
1281 },
1282 {
1283 Region: "bar",
1284 Options: endpoints.Options{
1285 LogDeprecated: true,
1286 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
1287 },
1288 Expected: aws.Endpoint{
1289 URL: "https://foo-fips.bar.bar.tld",
1290 PartitionID: "aws",
1291 SigningRegion: "bar",
1292 SigningMethod: "v4",
1293 },
1294 },
1295 {
1296 Region: "bar",
1297 Options: endpoints.Options{
1298 LogDeprecated: true,
1299 },
1300 SetupLogger: func() (logging.Logger, func(*testing.T)) {
1301 buffer := bytes.NewBuffer(nil)
1302 return &logging.StandardLogger{
1303 Logger: log.New(buffer, "", 0),
1304 }, func(t *testing.T) {
1305 if diff := cmpDiff("WARN endpoint identifier \"bar\", url \"https://foo.bar.bar.tld\" marked as deprecated\n", buffer.String()); len(diff) > 0 {
1306 t.Errorf(diff)
1307 }
1308 }
1309 },
1310 Expected: aws.Endpoint{
1311 URL: "https://foo.bar.bar.tld",
1312 PartitionID: "aws",
1313 SigningRegion: "bar",
1314 SigningMethod: "v4",
1315 },
1316 },
1317 {
1318 Region: "bar",
1319 Options: endpoints.Options{
1320 LogDeprecated: true,
1321 UseFIPSEndpoint: aws.FIPSEndpointStateEnabled,
1322 },
1323 SetupLogger: func() (logging.Logger, func(*testing.T)) {
1324 buffer := bytes.NewBuffer(nil)
1325 return &logging.StandardLogger{
1326 Logger: log.New(buffer, "", 0),
1327 }, func(t *testing.T) {
1328 if diff := cmpDiff("WARN endpoint identifier \"bar\", url \"https://foo-fips.bar.bar.tld\" marked as deprecated\n", buffer.String()); len(diff) > 0 {
1329 t.Errorf(diff)
1330 }
1331 }
1332 },
1333 Expected: aws.Endpoint{
1334 URL: "https://foo-fips.bar.bar.tld",
1335 PartitionID: "aws",
1336 SigningRegion: "bar",
1337 SigningMethod: "v4",
1338 },
1339 },
1340 }
1341
1342 for i, tt := range cases {
1343 t.Run(strconv.Itoa(i), func(t *testing.T) {
1344 var verifyLog func(*testing.T)
1345 if tt.SetupLogger != nil {
1346 tt.Options.Logger, verifyLog = tt.SetupLogger()
1347 }
1348
1349 endpoint, err := partitions.ResolveEndpoint(tt.Region, tt.Options)
1350 if (err != nil) != tt.WantErr {
1351 t.Errorf("WantErr(%v), got error %v", tt.WantErr, err)
1352 }
1353
1354 if diff := cmpDiff(tt.Expected, endpoint); len(diff) > 0 {
1355 t.Errorf(diff)
1356 }
1357
1358 if verifyLog != nil {
1359 verifyLog(t)
1360 }
1361 })
1362 }
1363 }
1364
1365 func cmpDiff(e, a interface{}) string {
1366 if !reflect.DeepEqual(e, a) {
1367 return fmt.Sprintf("%v != %v", e, a)
1368 }
1369 return ""
1370 }
1371
View as plain text