2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
4
using System ;
5
+ using System . Collections . Generic ;
5
6
using System . IO ;
6
7
using System . Linq ;
7
- using NewRelic . Agent . Core . AgentHealth ;
8
8
using NewRelic . Agent . Configuration ;
9
- using NewRelic . Agent . TestUtilities ;
9
+ using NewRelic . Agent . Core . AgentHealth ;
10
10
using NewRelic . SystemInterfaces ;
11
11
using NUnit . Framework ;
12
12
using Telerik . JustMock ;
@@ -27,6 +27,8 @@ public class VendorInfoTests
27
27
private const string PcfInstanceIp = @"CF_INSTANCE_IP" ;
28
28
private const string PcfMemoryLimit = @"MEMORY_LIMIT" ;
29
29
private const string KubernetesServiceHost = @"KUBERNETES_SERVICE_HOST" ;
30
+ private const string AwsEcsMetadataV3EnvVar = "ECS_CONTAINER_METADATA_URI" ;
31
+ private const string AwsEcsMetadataV4EnvVar = "ECS_CONTAINER_METADATA_URI_V4" ;
30
32
31
33
[ SetUp ]
32
34
public void Setup ( )
@@ -338,7 +340,7 @@ public void GetVendors_GetDockerVendorInfo_ParsesV2()
338
340
1342 1429 0:300 / /sys/firmware ro,relatime - tmpfs tmpfs ro
339
341
" ) ;
340
342
341
- var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper ) ;
343
+ var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper , true ) ;
342
344
Assert . That ( model , Is . Not . Null ) ;
343
345
Assert . That ( model . Id , Is . EqualTo ( "adf04870aa0a9f01fb712e283765ee5d7c7b1c1c0ad8ebfdea20a8bb3ae382fb" ) ) ;
344
346
}
@@ -367,7 +369,7 @@ public void GetVendors_GetDockerVendorInfo_ParsesV1_IfV2LookupFailsToParseFile()
367
369
1:cpuset:/docker/b9d734e13dc5f508571d975edade94a05dfc637e73a83e11077a39bc11681043
368
370
0::/docker/b9d734e13dc5f508571d975edade94a05dfc637e73a83e11077a39bc11681043" ) ;
369
371
370
- var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper ) ;
372
+ var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper , true ) ;
371
373
Assert . That ( model , Is . Not . Null ) ;
372
374
Assert . That ( model . Id , Is . EqualTo ( "b9d734e13dc5f508571d975edade94a05dfc637e73a83e11077a39bc11681043" ) ) ;
373
375
}
@@ -432,7 +434,7 @@ public void GetVendors_GetDockerVendorInfo_ParsesV1_ForCustomerIssue()
432
434
1:name=systemd:/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod04f9c4b4_5e71_4a0a_aa3a_f62f089e3f73.slice/cri-containerd-b10c13eeeea82c495c9e2fbb07ab448024715fdd55218e22cce6cd815c84bd58.scope
433
435
" ) ;
434
436
435
- var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper ) ;
437
+ var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper , true ) ;
436
438
Assert . That ( model , Is . Not . Null ) ;
437
439
Assert . That ( model . Id , Is . EqualTo ( "b10c13eeeea82c495c9e2fbb07ab448024715fdd55218e22cce6cd815c84bd58" ) ) ;
438
440
}
@@ -462,20 +464,143 @@ public void GetVendors_GetDockerVendorInfo_ParsesV1_IfMountinfoDoesNotExist()
462
464
1:cpuset:/docker/b9d734e13dc5f508571d975edade94a05dfc637e73a83e11077a39bc11681043
463
465
0::/docker/b9d734e13dc5f508571d975edade94a05dfc637e73a83e11077a39bc11681043" ) ;
464
466
465
- var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper ) ;
467
+ var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper , true ) ;
466
468
Assert . That ( model , Is . Not . Null ) ;
467
469
Assert . That ( model . Id , Is . EqualTo ( "b9d734e13dc5f508571d975edade94a05dfc637e73a83e11077a39bc11681043" ) ) ;
468
470
}
469
471
470
- [ Test ]
471
- public void GetVendors_GetDockerVendorInfo_ReturnsNull_IfUnableToParseV1OrV2 ( )
472
+ [ TestCase ( true ) ]
473
+ [ TestCase ( false ) ]
474
+ public void GetVendors_GetDockerVendorInfo_ParsesEcs_VarV4_IfUnableToParseV1OrV2 ( bool isLinux )
475
+ {
476
+ // This docker ID is in the Fargate format, but the test is still valid for non-Fargate ECS hosts.
477
+ var dockerId = "1e1698469422439ea356071e581e8545-2769485393" ;
478
+ SetEnvironmentVariable ( AwsEcsMetadataV4EnvVar , $ "http://169.254.170.2/v4/{ dockerId } ", EnvironmentVariableTarget . Process ) ;
479
+ Mock . Arrange ( ( ) => _vendorHttpApiRequestor . CallVendorApi ( Arg . IsAny < Uri > ( ) , Arg . AnyString , Arg . AnyString , Arg . IsNull < IEnumerable < string > > ( ) ) ) . Returns ( """
480
+ {
481
+ "DockerId": "1e1698469422439ea356071e581e8545-2769485393",
482
+ "Name": "fargateapp",
483
+ "DockerName": "fargateapp",
484
+ "Image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/fargatetest:latest",
485
+ "ImageID": "sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd",
486
+ "Labels": {
487
+ "com.amazonaws.ecs.cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/testcluster",
488
+ "com.amazonaws.ecs.container-name": "fargateapp",
489
+ "com.amazonaws.ecs.task-arn": "arn:aws:ecs:us-west-2:123456789012:task/testcluster/1e1698469422439ea356071e581e8545",
490
+ "com.amazonaws.ecs.task-definition-family": "fargatetestapp",
491
+ "com.amazonaws.ecs.task-definition-version": "7"
492
+ },
493
+ "DesiredStatus": "RUNNING",
494
+ "KnownStatus": "RUNNING",
495
+ "Limits": {
496
+ "CPU": 2
497
+ },
498
+ "CreatedAt": "2024-04-25T17:38:31.073208914Z",
499
+ "StartedAt": "2024-04-25T17:38:31.073208914Z",
500
+ "Type": "NORMAL",
501
+ "LogDriver": "awslogs",
502
+ "LogOptions": {
503
+ "awslogs-create-group": "true",
504
+ "awslogs-group": "/ecs/fargatetestapp",
505
+ "awslogs-region": "us-west-2",
506
+ "awslogs-stream": "ecs/fargateapp/1e1698469422439ea356071e581e8545"
507
+ },
508
+ "ContainerARN": "arn:aws:ecs:us-west-2:123456789012:container/testcluster/1e1698469422439ea356071e581e8545/050256a5-a7f3-461c-a16f-aca4eae37b01",
509
+ "Networks": [
510
+ {
511
+ "NetworkMode": "awsvpc",
512
+ "IPv4Addresses": [
513
+ "10.10.10.10"
514
+ ],
515
+ "AttachmentIndex": 0,
516
+ "MACAddress": "06:d7:3f:49:1d:a7",
517
+ "IPv4SubnetCIDRBlock": "10.10.10.0/20",
518
+ "DomainNameServers": [
519
+ "10.10.10.2"
520
+ ],
521
+ "DomainNameSearchList": [
522
+ "us-west-2.compute.internal"
523
+ ],
524
+ "PrivateDNSName": "ip-10-10-10-10.us-west-2.compute.internal",
525
+ "SubnetGatewayIpv4Address": "10.10.10.1/20"
526
+ }
527
+ ],
528
+ "Snapshotter": "overlayfs"
529
+ }
530
+ """ ) ;
531
+
532
+ var vendorInfo = new VendorInfo ( _configuration , _agentHealthReporter , _environment , _vendorHttpApiRequestor ) ;
533
+ var mockFileReaderWrapper = Mock . Create < IFileReaderWrapper > ( ) ;
534
+ Mock . Arrange ( ( ) => mockFileReaderWrapper . ReadAllText ( "/proc/self/mountinfo" ) ) . Returns ( "blah blah blah" ) ;
535
+ Mock . Arrange ( ( ) => mockFileReaderWrapper . ReadAllText ( "/proc/self/cgroup" ) ) . Returns ( "foo bar baz" ) ;
536
+
537
+ var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper , isLinux ) ;
538
+ Assert . That ( model , Is . Not . Null ) ;
539
+ Assert . That ( model . Id , Is . EqualTo ( dockerId ) ) ;
540
+ }
541
+
542
+ [ TestCase ( true ) ]
543
+ [ TestCase ( false ) ]
544
+ public void GetVendors_GetDockerVendorInfo_ParsesEcs_VarV3_IfUnableToParseV1OrV2 ( bool isLinux )
545
+ {
546
+ // This docker ID is in the Fargate format, but the test is still valid for non-Fargate ECS hosts.
547
+ var dockerId = "1e1698469422439ea356071e581e8545-2769485393" ;
548
+ SetEnvironmentVariable ( AwsEcsMetadataV3EnvVar , $ "http://169.254.170.2/v3/{ dockerId } ", EnvironmentVariableTarget . Process ) ;
549
+ Mock . Arrange ( ( ) => _vendorHttpApiRequestor . CallVendorApi ( Arg . IsAny < Uri > ( ) , Arg . AnyString , Arg . AnyString , Arg . IsNull < IEnumerable < string > > ( ) ) ) . Returns ( """
550
+ {
551
+ "DockerId": "1e1698469422439ea356071e581e8545-2769485393",
552
+ "Name": "fargateapp",
553
+ "DockerName": "fargateapp",
554
+ "Image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/fargatetest:latest",
555
+ "ImageID": "sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd",
556
+ "Labels": {
557
+ "com.amazonaws.ecs.cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/testcluster",
558
+ "com.amazonaws.ecs.container-name": "fargateapp",
559
+ "com.amazonaws.ecs.task-arn": "arn:aws:ecs:us-west-2:123456789012:task/testcluster/1e1698469422439ea356071e581e8545",
560
+ "com.amazonaws.ecs.task-definition-family": "fargatetestapp",
561
+ "com.amazonaws.ecs.task-definition-version": "7"
562
+ },
563
+ "DesiredStatus": "RUNNING",
564
+ "KnownStatus": "RUNNING",
565
+ "Limits": {
566
+ "CPU": 2
567
+ },
568
+ "CreatedAt": "2024-04-25T17:38:31.073208914Z",
569
+ "StartedAt": "2024-04-25T17:38:31.073208914Z",
570
+ "Type": "NORMAL",
571
+ "Networks": [
572
+ {
573
+ "NetworkMode": "awsvpc",
574
+ "IPv4Addresses": [
575
+ "10.10.10.10"
576
+ ]
577
+ }
578
+ ]
579
+ }
580
+ """ ) ;
581
+
582
+ var vendorInfo = new VendorInfo ( _configuration , _agentHealthReporter , _environment , _vendorHttpApiRequestor ) ;
583
+ var mockFileReaderWrapper = Mock . Create < IFileReaderWrapper > ( ) ;
584
+ Mock . Arrange ( ( ) => mockFileReaderWrapper . ReadAllText ( "/proc/self/mountinfo" ) ) . Returns ( "blah blah blah" ) ;
585
+ Mock . Arrange ( ( ) => mockFileReaderWrapper . ReadAllText ( "/proc/self/cgroup" ) ) . Returns ( "foo bar baz" ) ;
586
+
587
+ var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper , isLinux ) ;
588
+ Assert . That ( model , Is . Not . Null ) ;
589
+ Assert . That ( model . Id , Is . EqualTo ( dockerId ) ) ;
590
+ }
591
+
592
+ [ TestCase ( true ) ]
593
+ [ TestCase ( false ) ]
594
+ public void GetVendors_GetDockerVendorInfo_ReturnsNull_IfUnableToParseV1OrV2OrEcs ( bool isLinux )
472
595
{
596
+ // Not setting the ECS_CONTAINER_METADATA_URI_V4 env var will cause the fargate check to be skipped.
597
+
473
598
var vendorInfo = new VendorInfo ( _configuration , _agentHealthReporter , _environment , _vendorHttpApiRequestor ) ;
474
599
var mockFileReaderWrapper = Mock . Create < IFileReaderWrapper > ( ) ;
475
600
Mock . Arrange ( ( ) => mockFileReaderWrapper . ReadAllText ( "/proc/self/mountinfo" ) ) . Returns ( "blah blah blah" ) ;
476
601
Mock . Arrange ( ( ) => mockFileReaderWrapper . ReadAllText ( "/proc/self/cgroup" ) ) . Returns ( "foo bar baz" ) ;
477
602
478
- var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper ) ;
603
+ var model = ( DockerVendorModel ) vendorInfo . GetDockerVendorInfo ( mockFileReaderWrapper , isLinux ) ;
479
604
Assert . That ( model , Is . Null ) ;
480
605
}
481
606
#endif
0 commit comments