5
5
"github.com/hortonworks/cloud-haunter/types"
6
6
"github.com/hortonworks/cloud-haunter/utils"
7
7
log "github.com/sirupsen/logrus"
8
+ "reflect"
8
9
)
9
10
10
11
func filter (filterName string , items []types.CloudItem , filterType types.FilterConfigType , isNeeded func (types.CloudItem ) bool ) []types.CloudItem {
@@ -28,138 +29,74 @@ func filter(filterName string, items []types.CloudItem, filterType types.FilterC
28
29
return filtered
29
30
}
30
31
31
- func isFilterMatch (filterName string , item types.CloudItem , filterType types.FilterConfigType , filterConfig * types.FilterConfig ) bool {
32
- switch item .GetItem ().(type ) {
33
- case types.Instance :
34
- inst := item .GetItem ().(types.Instance )
35
- name := item .GetName ()
36
- ignoreLabelFound := utils .IsAnyMatch (inst .Tags , ctx .IgnoreLabel )
37
- if ignoreLabelFound {
38
- log .Debugf ("[%s] Found ignore label on item: %s, label: %s" , filterName , name , ctx .IgnoreLabel )
39
- if ctx .IgnoreLabelDisabled {
40
- log .Debugf ("[%s] Ignore label usage is disabled, continuing to apply filter on item: %s" , filterName , name )
41
- } else {
42
- if filterType .IsInclusive () {
43
- log .Debugf ("[%s] inclusive filter applied on item: %s" , filterName , name )
44
- return false
45
- }
46
- log .Debugf ("[%s] exclusive filter applied on item: %s" , filterName , name )
47
- return true
48
- }
49
- }
50
- filtered , applied := applyFilterConfig (filterConfig , filterType , item , filterName , inst .Tags )
51
- if applied {
52
- return filtered
53
- }
54
- case types.Stack :
55
- stack := item .GetItem ().(types.Stack )
56
- name := item .GetName ()
57
- ignoreLabelFound := utils .IsAnyMatch (stack .Tags , ctx .IgnoreLabel )
58
- if ignoreLabelFound {
59
- log .Debugf ("[%s] Found ignore label on item: %s, label: %s" , filterName , name , ctx .IgnoreLabel )
60
- if ctx .IgnoreLabelDisabled {
61
- log .Debugf ("[%s] Ignore label usage is disabled, continuing to apply filter on item: %s" , filterName , name )
62
- } else {
63
- if filterType .IsInclusive () {
64
- log .Debugf ("[%s] inclusive filter applied on item: %s" , filterName , name )
65
- return false
66
- }
67
- log .Debugf ("[%s] exclusive filter applied on item: %s" , filterName , name )
68
- return true
32
+ func isFilterMatch (filterName string , item types.CloudItem , filterType types.FilterConfigType , filterConfig types.IFilterConfig ) bool {
33
+ name := item .GetName ()
34
+ ignoreLabelFound := utils .IsAnyMatch (item .GetTags (), ctx .IgnoreLabel )
35
+ if ignoreLabelFound {
36
+ log .Debugf ("[%s] Found ignore label on item: %s, label: %s" , filterName , name , ctx .IgnoreLabel )
37
+ if ctx .IgnoreLabelDisabled {
38
+ log .Debugf ("[%s] Ignore label usage is disabled, continuing to apply filter on item: %s" , filterName , name )
39
+ } else {
40
+ if filterType .IsInclusive () {
41
+ log .Debugf ("[%s] inclusive filter applied on item: %s" , filterName , name )
42
+ return false
69
43
}
44
+ log .Debugf ("[%s] exclusive filter applied on item: %s" , filterName , name )
45
+ return true
70
46
}
71
- filtered , applied := applyFilterConfig (filterConfig , filterType , item , filterName , stack .Tags )
72
- if applied {
73
- return filtered
74
- }
47
+ }
48
+
49
+ if filterConfig == nil {
50
+ return false
51
+ }
52
+
53
+ var filterEntityType types.FilterEntityType
54
+
55
+ switch item .GetItem ().(type ) {
75
56
case types.Access :
76
- accessFilter , _ := getFilterConfigs (filterConfig , filterType )
77
- if accessFilter != nil {
78
- switch item .GetCloudType () {
79
- case types .AWS :
80
- return isNameOrOwnerMatch (filterName , item , accessFilter .Aws .Names , accessFilter .Aws .Owners )
81
- case types .AZURE :
82
- return isNameOrOwnerMatch (filterName , item , accessFilter .Azure .Names , accessFilter .Azure .Owners )
83
- case types .GCP :
84
- return isNameOrOwnerMatch (filterName , item , accessFilter .Gcp .Names , accessFilter .Gcp .Owners )
85
- default :
86
- log .Warnf ("[%s] Cloud type not supported: %s" , filterName , item .GetCloudType ())
87
- }
88
- }
89
- case types.Database :
90
- database := item .GetItem ().(types.Database )
91
- name := item .GetName ()
92
- ignoreLabelFound := utils .IsAnyMatch (database .Tags , ctx .IgnoreLabel )
93
- if ignoreLabelFound {
94
- log .Debugf ("[%s] Found ignore label on item: %s, label: %s" , filterName , name , ctx .IgnoreLabel )
95
- if ctx .IgnoreLabelDisabled {
96
- log .Debugf ("[%s] Ignore label usage is disabled, continuing to apply filter on item: %s" , filterName , name )
97
- } else {
98
- if filterType .IsInclusive () {
99
- log .Debugf ("[%s] inclusive filter applied on item: %s" , filterName , name )
100
- return false
101
- }
102
- log .Debugf ("[%s] exclusive filter applied on item: %s" , filterName , name )
103
- return true
104
- }
105
- }
106
- filtered , applied := applyFilterConfig (filterConfig , filterType , item , filterName , database .Tags )
107
- if applied {
108
- return filtered
57
+ if filterType .IsInclusive () {
58
+ filterEntityType = types .IncludeAccess
59
+ } else {
60
+ filterEntityType = types .ExcludeAccess
109
61
}
110
- case types.Disk :
111
- filtered , applied := applyFilterConfig (filterConfig , filterType , item , filterName , types.Tags {})
112
- if applied {
113
- return filtered
62
+ case types.Instance , types.Stack , types.Database , types.Disk :
63
+ if filterType .IsInclusive () {
64
+ filterEntityType = types .IncludeInstance
65
+ } else {
66
+ filterEntityType = types .ExcludeInstance
114
67
}
68
+ default :
69
+ log .Warnf ("Filtering is not implemented for type %s" , reflect .TypeOf (item ))
70
+ return false
115
71
}
116
- return false
117
- }
118
72
119
- func applyFilterConfig (filterConfig * types.FilterConfig , filterType types.FilterConfigType , item types.CloudItem , filterName string , tags types.Tags ) (applied , filtered bool ) {
120
- _ , instanceFilter := getFilterConfigs (filterConfig , filterType )
121
- if instanceFilter != nil {
122
- switch item .GetCloudType () {
123
- case types .AWS :
124
- return isMatchWithIgnores (filterName , item , tags ,
125
- instanceFilter .Aws .Names , instanceFilter .Aws .Owners , instanceFilter .Aws .Labels ), true
126
- case types .AZURE :
127
- return isMatchWithIgnores (filterName , item , tags ,
128
- instanceFilter .Azure .Names , instanceFilter .Azure .Owners , instanceFilter .Azure .Labels ), true
129
- case types .GCP :
130
- return isMatchWithIgnores (filterName , item , tags ,
131
- instanceFilter .Gcp .Names , instanceFilter .Gcp .Owners , instanceFilter .Gcp .Labels ), true
132
- default :
133
- log .Warnf ("[%s] Cloud type not supported: %s" , filterName , item .GetCloudType ())
134
- }
73
+ filtered , applied := false , false
74
+
75
+ if names := filterConfig .GetFilterValues (filterEntityType , item .GetCloudType (), types .Name ); names != nil {
76
+ log .Debugf ("[%s] filtering item %s to names [%s]" , filterName , item .GetName (), names )
77
+ filtered , applied = filtered || utils .IsStartsWith (item .GetName (), names ... ), true
135
78
}
136
- return false , false
137
- }
138
79
139
- func getFilterConfigs (filterConfig * types.FilterConfig , filterType types.FilterConfigType ) (accessConfig * types.FilterAccessConfig , instanceConfig * types.FilterInstanceConfig ) {
140
- if filterConfig != nil {
141
- if filterType .IsInclusive () {
142
- return filterConfig .IncludeAccess , filterConfig .IncludeInstance
143
- }
144
- return filterConfig .ExcludeAccess , filterConfig .ExcludeInstance
80
+ if owners := filterConfig .GetFilterValues (filterEntityType , item .GetCloudType (), types .Owner ); owners != nil {
81
+ log .Debugf ("[%s] filtering item %s to owners [%s]" , filterName , item .GetName (), owners )
82
+ filtered , applied = filtered || utils .IsStartsWith (item .GetOwner (), owners ... ), true
145
83
}
146
- return nil , nil
147
- }
148
84
149
- func isMatchWithIgnores (filterName string , item types.CloudItem , tags map [string ]string , names , owners []string , labels []string ) bool {
150
- if isNameOrOwnerMatch (filterName , item , names , owners ) || utils .IsAnyStartsWith (tags , labels ... ) {
151
- log .Debugf ("[%s] item %s match with name/owner or tag %s" , filterName , item .GetName (), labels )
152
- return true
85
+ if labels := filterConfig .GetFilterValues (filterEntityType , item .GetCloudType (), types .Label ); labels != nil {
86
+ log .Debugf ("[%s] filtering item %s to labels [%s]" , filterName , item .GetName (), labels )
87
+ filtered , applied = filtered || utils .IsAnyStartsWith (item .GetTags (), labels ... ), true
153
88
}
154
- log .Debugf ("[%s] item %s does not match with name/owner or tag %s" , filterName , item .GetName (), labels )
155
- return false
156
- }
157
89
158
- func isNameOrOwnerMatch (filterName string , item types.CloudItem , names , owners []string ) bool {
159
- if utils .IsStartsWith (item .GetName (), names ... ) || utils .IsStartsWith (item .GetOwner (), owners ... ) {
160
- log .Debugf ("[%s] item %s match with filter config name %s or owner %s" , filterName , item .GetName (), names , owners )
161
- return true
90
+ if applied {
91
+ if filtered {
92
+ log .Debugf ("[%s] item %s matches filter" , filterName , item .GetName ())
93
+ } else {
94
+ log .Debugf ("[%s] item %s does not match filter" , filterName , item .GetName ())
95
+ }
96
+ return filtered
97
+ } else {
98
+ log .Debugf ("[%s] item %s could not be filtered" , filterName , item .GetName ())
162
99
}
163
- log . Debugf ( "[%s] item %s does not match with filter config name %s or owner %s" , filterName , item . GetName (), names , owners )
100
+
164
101
return false
165
102
}
0 commit comments