|
1 | 1 | package ingress |
2 | 2 |
|
3 | 3 | import ( |
| 4 | +"context" |
| 5 | +"testing" |
| 6 | + |
4 | 7 | awssdk "github.com/aws/aws-sdk-go-v2/aws" |
5 | 8 | "github.com/pkg/errors" |
6 | 9 | "github.com/stretchr/testify/assert" |
7 | 10 | networking "k8s.io/api/networking/v1" |
8 | | -"testing" |
| 11 | +metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| 12 | +"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations" |
| 13 | +"sigs.k8s.io/aws-load-balancer-controller/pkg/config" |
9 | 14 | ) |
10 | 15 |
|
11 | 16 | func Test_defaultModelBuildTask_sortIngressPath(t *testing.T) { |
@@ -675,3 +680,213 @@ func Test_defaultModelBuildTask_buildPathPatternsForPrefixPathType(t *testing.T) |
675 | 680 | }) |
676 | 681 | } |
677 | 682 | } |
| 683 | + |
| 684 | +func Test_defaultModelBuildTask_buildListenerRuleTags(t *testing.T) { |
| 685 | +type fields struct { |
| 686 | +ing ClassifiedIngress |
| 687 | +defaultTags map[string]string |
| 688 | +} |
| 689 | +tests := []struct { |
| 690 | +name string |
| 691 | +fields fields |
| 692 | +want map[string]string |
| 693 | +wantErr error |
| 694 | +}{ |
| 695 | +{ |
| 696 | +name: "empty default tags, no tags annotation", |
| 697 | +fields: fields{ |
| 698 | +ing: ClassifiedIngress{ |
| 699 | +Ing: &networking.Ingress{ |
| 700 | +ObjectMeta: metav1.ObjectMeta{ |
| 701 | +Namespace: "awesome-ns", |
| 702 | +Name: "ing-1", |
| 703 | +Annotations: map[string]string{}, |
| 704 | +}, |
| 705 | +}, |
| 706 | +}, |
| 707 | +defaultTags: nil, |
| 708 | +}, |
| 709 | +want: map[string]string{}, |
| 710 | +}, |
| 711 | +{ |
| 712 | +name: "empty default tags, non-empty tags annotation", |
| 713 | +fields: fields{ |
| 714 | +ing: ClassifiedIngress{ |
| 715 | +Ing: &networking.Ingress{ |
| 716 | +ObjectMeta: metav1.ObjectMeta{ |
| 717 | +Namespace: "awesome-ns", |
| 718 | +Name: "ing-1", |
| 719 | +Annotations: map[string]string{ |
| 720 | +"alb.ingress.kubernetes.io/tags": "k1=v1,k2=v2", |
| 721 | +}, |
| 722 | +}, |
| 723 | +}, |
| 724 | +}, |
| 725 | +defaultTags: nil, |
| 726 | +}, |
| 727 | +want: map[string]string{ |
| 728 | +"k1": "v1", |
| 729 | +"k2": "v2", |
| 730 | +}, |
| 731 | +}, |
| 732 | +{ |
| 733 | +name: "non-empty default tags, empty tags annotation", |
| 734 | +fields: fields{ |
| 735 | +ing: ClassifiedIngress{ |
| 736 | +Ing: &networking.Ingress{ |
| 737 | +ObjectMeta: metav1.ObjectMeta{ |
| 738 | +Namespace: "awesome-ns", |
| 739 | +Name: "ing-1", |
| 740 | +Annotations: map[string]string{}, |
| 741 | +}, |
| 742 | +}, |
| 743 | +}, |
| 744 | +defaultTags: map[string]string{ |
| 745 | +"k3": "v3", |
| 746 | +"k4": "v4", |
| 747 | +}, |
| 748 | +}, |
| 749 | +want: map[string]string{ |
| 750 | +"k3": "v3", |
| 751 | +"k4": "v4", |
| 752 | +}, |
| 753 | +}, |
| 754 | +{ |
| 755 | +name: "non-empty default tags, non-empty tags annotation", |
| 756 | +fields: fields{ |
| 757 | +ing: ClassifiedIngress{ |
| 758 | +Ing: &networking.Ingress{ |
| 759 | +ObjectMeta: metav1.ObjectMeta{ |
| 760 | +Namespace: "awesome-ns", |
| 761 | +Name: "ing-1", |
| 762 | +Annotations: map[string]string{ |
| 763 | +"alb.ingress.kubernetes.io/tags": "k1=v1,k2=v2,k3=v3a", |
| 764 | +}, |
| 765 | +}, |
| 766 | +}, |
| 767 | +}, |
| 768 | +defaultTags: map[string]string{ |
| 769 | +"k3": "v3", |
| 770 | +"k4": "v4", |
| 771 | +}, |
| 772 | +}, |
| 773 | +want: map[string]string{ |
| 774 | +"k1": "v1", |
| 775 | +"k2": "v2", |
| 776 | +"k3": "v3", |
| 777 | +"k4": "v4", |
| 778 | +}, |
| 779 | +}, |
| 780 | +} |
| 781 | +for _, tt := range tests { |
| 782 | +t.Run(tt.name, func(t *testing.T) { |
| 783 | +task := &defaultModelBuildTask{ |
| 784 | +defaultTags: tt.fields.defaultTags, |
| 785 | +annotationParser: annotations.NewSuffixAnnotationParser("alb.ingress.kubernetes.io"), |
| 786 | +featureGates: config.NewFeatureGates(), |
| 787 | +} |
| 788 | +got, err := task.buildListenerRuleTags(context.Background(), tt.fields.ing) |
| 789 | +if tt.wantErr != nil { |
| 790 | +assert.EqualError(t, err, tt.wantErr.Error()) |
| 791 | +} else { |
| 792 | +assert.NoError(t, err) |
| 793 | +assert.Equal(t, tt.want, got) |
| 794 | +} |
| 795 | +}) |
| 796 | +} |
| 797 | +} |
| 798 | + |
| 799 | +func Test_defaultModelBuildTask_buildListenerRuleTags_FeatureGate(t *testing.T) { |
| 800 | +type fields struct { |
| 801 | +ing ClassifiedIngress |
| 802 | +defaultTags map[string]string |
| 803 | +enabledFeatureGates func() config.FeatureGates |
| 804 | +} |
| 805 | +tests := []struct { |
| 806 | +name string |
| 807 | +fields fields |
| 808 | +want map[string]string |
| 809 | +wantErr error |
| 810 | +}{ |
| 811 | +{ |
| 812 | +name: "default tags take priority when feature gate disabled", |
| 813 | +fields: fields{ |
| 814 | +ing: ClassifiedIngress{ |
| 815 | +Ing: &networking.Ingress{ |
| 816 | +ObjectMeta: metav1.ObjectMeta{ |
| 817 | +Namespace: "awesome-ns", |
| 818 | +Name: "ing-1", |
| 819 | +Annotations: map[string]string{ |
| 820 | +"alb.ingress.kubernetes.io/tags": "k1=v1,k2=v2,k3=v3", |
| 821 | +}, |
| 822 | +}, |
| 823 | +}, |
| 824 | +}, |
| 825 | +defaultTags: map[string]string{ |
| 826 | +"k1": "v10", |
| 827 | +"k2": "v20", |
| 828 | +}, |
| 829 | +enabledFeatureGates: func() config.FeatureGates { |
| 830 | +featureGates := config.NewFeatureGates() |
| 831 | +featureGates.Disable(config.EnableDefaultTagsLowPriority) |
| 832 | +return featureGates |
| 833 | +}, |
| 834 | +}, |
| 835 | +want: map[string]string{ |
| 836 | +"k1": "v10", |
| 837 | +"k2": "v20", |
| 838 | +"k3": "v3", |
| 839 | +}, |
| 840 | +}, |
| 841 | +{ |
| 842 | +name: "annotation tags take priority when feature gate enabled", |
| 843 | +fields: fields{ |
| 844 | +ing: ClassifiedIngress{ |
| 845 | +Ing: &networking.Ingress{ |
| 846 | +ObjectMeta: metav1.ObjectMeta{ |
| 847 | +Namespace: "awesome-ns", |
| 848 | +Name: "ing-1", |
| 849 | +Annotations: map[string]string{ |
| 850 | +"alb.ingress.kubernetes.io/tags": "k1=v1,k2=v2,k3=v3", |
| 851 | +}, |
| 852 | +}, |
| 853 | +}, |
| 854 | +}, |
| 855 | +defaultTags: map[string]string{ |
| 856 | +"k1": "v10", |
| 857 | +"k2": "v20", |
| 858 | +}, |
| 859 | +enabledFeatureGates: func() config.FeatureGates { |
| 860 | +featureGates := config.NewFeatureGates() |
| 861 | +featureGates.Enable(config.EnableDefaultTagsLowPriority) |
| 862 | +return featureGates |
| 863 | +}, |
| 864 | +}, |
| 865 | +want: map[string]string{ |
| 866 | +"k1": "v1", |
| 867 | +"k2": "v2", |
| 868 | +"k3": "v3", |
| 869 | +}, |
| 870 | +}, |
| 871 | +} |
| 872 | +for _, tt := range tests { |
| 873 | +t.Run(tt.name, func(t *testing.T) { |
| 874 | +task := &defaultModelBuildTask{ |
| 875 | +defaultTags: tt.fields.defaultTags, |
| 876 | +annotationParser: annotations.NewSuffixAnnotationParser("alb.ingress.kubernetes.io"), |
| 877 | +featureGates: tt.fields.enabledFeatureGates(), |
| 878 | +} |
| 879 | +got, err := task.buildListenerRuleTags(context.Background(), tt.fields.ing) |
| 880 | +if tt.wantErr != nil { |
| 881 | +assert.EqualError(t, err, tt.wantErr.Error()) |
| 882 | +} else { |
| 883 | +assert.NoError(t, err) |
| 884 | +assert.Equal(t, tt.want, got) |
| 885 | +} |
| 886 | +for key, value := range tt.want { |
| 887 | +assert.Contains(t, got, key) |
| 888 | +assert.Equal(t, value, got[key]) |
| 889 | +} |
| 890 | +}) |
| 891 | +} |
| 892 | +} |
0 commit comments