@@ -12,6 +12,7 @@ import (
1212 "github.com/aws/aws-sdk-go-v2/aws"
1313 "github.com/aws/aws-sdk-go-v2/aws/arn"
1414 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing"
15+ elbv1types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing/types"
1516 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
1617 elbtypes "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types"
1718 "github.com/rs/zerolog/log"
@@ -69,14 +70,16 @@ func (a *mqlAwsElb) getClassicLoadBalancers(conn *connection.AwsConnection) []*j
6970 }
7071 return nil , err
7172 }
73+
7274 for _ , lb := range lbs .LoadBalancerDescriptions {
7375 jsonListeners , err := convert .JsonToDictSlice (lb .ListenerDescriptions )
7476 if err != nil {
7577 return nil , err
7678 }
79+ lbName := convert .ToValue (lb .LoadBalancerName )
7780 mqlLb , err := CreateResource (a .MqlRuntime , ResourceAwsElbLoadbalancer ,
7881 map [string ]* llx.RawData {
79- "arn" : llx .StringData (fmt .Sprintf (elbv1LbArnPattern , region , conn .AccountId (), convert . ToValue ( lb . LoadBalancerName ) )),
82+ "arn" : llx .StringData (fmt .Sprintf (elbv1LbArnPattern , region , conn .AccountId (), lbName )),
8083 "createdTime" : llx .TimeDataPtr (lb .CreatedTime ),
8184 "createdAt" : llx .TimeDataPtr (lb .CreatedTime ),
8285 "dnsName" : llx .StringDataPtr (lb .DNSName ),
@@ -91,6 +94,18 @@ func (a *mqlAwsElb) getClassicLoadBalancers(conn *connection.AwsConnection) []*j
9194 return nil , err
9295 }
9396 res = append (res , mqlLb )
97+ // keeps the tags lazy unless the filters need to be evaluated
98+ if conn .Filters .General .HasTags () {
99+ tags , err := mqlLb .(* mqlAwsElbLoadbalancer ).tags ()
100+ if err != nil {
101+ return nil , err
102+ }
103+ if conn .Filters .General .IsFilteredOutByTags (mapStringInterfaceToStringString (tags )) {
104+ continue
105+ }
106+ }
107+
108+ res = append (res , mqlLb )
94109 }
95110 }
96111 return jobpool .JobResult (res ), nil
@@ -147,6 +162,7 @@ func (a *mqlAwsElb) getLoadBalancers(conn *connection.AwsConnection) []*jobpool.
147162 }
148163 return nil , err
149164 }
165+
150166 for _ , lb := range lbs .LoadBalancers {
151167 availabilityZones := []any {}
152168 for _ , zone := range lb .AvailabilityZones {
@@ -198,6 +214,18 @@ func (a *mqlAwsElb) getLoadBalancers(conn *connection.AwsConnection) []*jobpool.
198214 return nil , err
199215 }
200216 res = append (res , mqlLb )
217+ // keeps the tags lazy unless the filters need to be evaluated
218+ if conn .Filters .General .HasTags () {
219+ tags , err := mqlLb .(* mqlAwsElbLoadbalancer ).tags ()
220+ if err != nil {
221+ return nil , err
222+ }
223+ if conn .Filters .General .IsFilteredOutByTags (mapStringInterfaceToStringString (tags )) {
224+ continue
225+ }
226+ }
227+
228+ res = append (res , mqlLb )
201229 }
202230 }
203231 return jobpool .JobResult (res ), nil
@@ -229,18 +257,30 @@ func initAwsElbLoadbalancer(runtime *plugin.Runtime, args map[string]*llx.RawDat
229257 }
230258 elb := obj .(* mqlAwsElb )
231259
260+ arnVal := args ["arn" ].Value .(string )
261+
232262 rawResources := elb .GetLoadBalancers ()
233263 if rawResources .Error != nil {
234264 return nil , nil , rawResources .Error
235265 }
236-
237- arnVal := args ["arn" ].Value .(string )
238266 for _ , rawResource := range rawResources .Data {
239267 lb := rawResource .(* mqlAwsElbLoadbalancer )
240268 if lb .Arn .Data == arnVal {
241269 return args , lb , nil
242270 }
243271 }
272+
273+ classicResources := elb .GetClassicLoadBalancers ()
274+ if classicResources .Error != nil {
275+ return nil , nil , classicResources .Error
276+ }
277+ for _ , rawResource := range classicResources .Data {
278+ lb := rawResource .(* mqlAwsElbLoadbalancer )
279+ if lb .Arn .Data == arnVal {
280+ return args , lb , nil
281+ }
282+ }
283+
244284 return nil , nil , errors .New ("elb load balancer does not exist" )
245285}
246286
@@ -307,6 +347,60 @@ func isV1LoadBalancerArn(a string) bool {
307347 return false
308348}
309349
350+ func elbv2TagsToMap (tags []elbtypes.Tag ) map [string ]any {
351+ tagsMap := make (map [string ]any )
352+ for _ , tag := range tags {
353+ tagsMap [convert .ToValue (tag .Key )] = convert .ToValue (tag .Value )
354+ }
355+ return tagsMap
356+ }
357+
358+ func elbv1TagsToMap (tags []elbv1types.Tag ) map [string ]any {
359+ tagsMap := make (map [string ]any )
360+ for _ , tag := range tags {
361+ tagsMap [convert .ToValue (tag .Key )] = convert .ToValue (tag .Value )
362+ }
363+ return tagsMap
364+ }
365+
366+ func (a * mqlAwsElbLoadbalancer ) tags () (map [string ]any , error ) {
367+ conn := a .MqlRuntime .Connection .(* connection.AwsConnection )
368+ lbArn := a .Arn .Data
369+ name := a .Name .Data
370+
371+ region , err := GetRegionFromArn (lbArn )
372+ if err != nil {
373+ return nil , err
374+ }
375+ ctx := context .Background ()
376+
377+ if isV1LoadBalancerArn (lbArn ) {
378+ svc := conn .Elb (region )
379+ resp , err := svc .DescribeTags (ctx , & elasticloadbalancing.DescribeTagsInput {LoadBalancerNames : []string {name }})
380+ if err != nil {
381+ return nil , err
382+ }
383+ for _ , desc := range resp .TagDescriptions {
384+ if convert .ToValue (desc .LoadBalancerName ) == name {
385+ return elbv1TagsToMap (desc .Tags ), nil
386+ }
387+ }
388+ return map [string ]any {}, nil
389+ }
390+
391+ svc := conn .Elbv2 (region )
392+ resp , err := svc .DescribeTags (ctx , & elasticloadbalancingv2.DescribeTagsInput {ResourceArns : []string {lbArn }})
393+ if err != nil {
394+ return nil , err
395+ }
396+ for _ , desc := range resp .TagDescriptions {
397+ if convert .ToValue (desc .ResourceArn ) == lbArn {
398+ return elbv2TagsToMap (desc .Tags ), nil
399+ }
400+ }
401+ return map [string ]any {}, nil
402+ }
403+
310404func (a * mqlAwsElbTargetgroup ) id () (string , error ) {
311405 return a .Arn .Data , nil
312406}
0 commit comments