From 56711aeb16b89576c39ce8d277c0eb27e79c95d7 Mon Sep 17 00:00:00 2001 From: Xabier Arbulu Insausti Date: Mon, 20 Nov 2023 14:12:09 +0100 Subject: [PATCH] Refactor cloud package tests (#291) * Refactor cloud package tests * Remove not needed nolint marks * Pipe mock usage calls and move mocks to test setup * Add brackets to case to improve readability --- internal/core/cloud/aws.go | 18 +- internal/core/cloud/aws_dto_test.go | 15 +- internal/core/cloud/aws_test.go | 9 +- internal/core/cloud/azure.go | 2 +- internal/core/cloud/azure_test.go | 64 ++-- internal/core/cloud/client.go | 2 - internal/core/cloud/gcp.go | 2 +- internal/core/cloud/gcp_dto_test.go | 17 +- internal/core/cloud/gcp_test.go | 19 +- internal/core/cloud/metadata.go | 30 +- internal/core/cloud/metadata_test.go | 439 ++++++++++----------------- internal/discovery/cloud.go | 4 +- 12 files changed, 261 insertions(+), 360 deletions(-) diff --git a/internal/core/cloud/aws.go b/internal/core/cloud/aws.go index cd72a399..d1984b3a 100644 --- a/internal/core/cloud/aws.go +++ b/internal/core/cloud/aws.go @@ -20,11 +20,11 @@ const ( ) type AWSMetadata struct { - AmiID string `json:"ami-id"` // nolint + AmiID string `json:"ami-id"` BlockDeviceMapping map[string]string `json:"block-device-mapping"` IdentityCredentials IdentityCredentials `json:"identity-credentials"` - InstanceID string `json:"instance-id"` //nolint - InstanceType string `json:"instance-type,omitempty"` //nolint + InstanceID string `json:"instance-id"` + InstanceType string `json:"instance-type,omitempty"` Network AWSNetwork `json:"network"` Placement Placement `json:"placement"` } @@ -52,7 +52,7 @@ type Placement struct { Region string `json:"region"` } -func NewAWSMetadata() (*AWSMetadata, error) { +func NewAWSMetadata(client HTTPClient) (*AWSMetadata, error) { var err error awsMetadata := &AWSMetadata{ AmiID: "", @@ -86,7 +86,7 @@ func NewAWSMetadata() (*AWSMetadata, error) { } firstElementsList := []string{fmt.Sprintf("%s/", awsMetadataResource)} - metadata, err := buildAWSMetadata(awsMetadataURL, firstElementsList) + metadata, err := buildAWSMetadata(client, awsMetadataURL, firstElementsList) if err != nil { return nil, err } @@ -104,13 +104,13 @@ func NewAWSMetadata() (*AWSMetadata, error) { return awsMetadata, err } -func buildAWSMetadata(url string, elements []string) (map[string]interface{}, error) { +func buildAWSMetadata(client HTTPClient, url string, elements []string) (map[string]interface{}, error) { metadata := make(map[string]interface{}) for _, element := range elements { newURL := url + element - response, err := requestMetadata(newURL) + response, err := requestMetadata(client, newURL) if err != nil { return metadata, err } @@ -119,7 +119,7 @@ func buildAWSMetadata(url string, elements []string) (map[string]interface{}, er currentElement := strings.Trim(element, "/") newElements := strings.Split(fmt.Sprintf("%v", response), "\n") - metadata[currentElement], err = buildAWSMetadata(newURL, newElements) + metadata[currentElement], err = buildAWSMetadata(client, newURL, newElements) if err != nil { return nil, err } @@ -131,7 +131,7 @@ func buildAWSMetadata(url string, elements []string) (map[string]interface{}, er return metadata, nil } -func requestMetadata(url string) (interface{}, error) { +func requestMetadata(client HTTPClient, url string) (interface{}, error) { req, _ := http.NewRequest(http.MethodGet, url, nil) resp, err := client.Do(req) diff --git a/internal/core/cloud/aws_dto_test.go b/internal/core/cloud/aws_dto_test.go index f9e07125..139f02e1 100644 --- a/internal/core/cloud/aws_dto_test.go +++ b/internal/core/cloud/aws_dto_test.go @@ -1,9 +1,10 @@ -package cloud +package cloud_test import ( "testing" "github.com/stretchr/testify/suite" + "github.com/trento-project/agent/internal/core/cloud" ) type AWSMetadataDtoTestSuite struct { @@ -16,7 +17,7 @@ func TestAWSMetadataDtoTestSuite(t *testing.T) { func (suite *AWSMetadataDtoTestSuite) TestNewAWSMetadataDto() { - awsMetadata := &AWSMetadata{ //nolint + awsMetadata := &cloud.AWSMetadata{ AmiID: "some-ami", BlockDeviceMapping: map[string]string{ "ami": "sda", @@ -26,20 +27,20 @@ func (suite *AWSMetadataDtoTestSuite) TestNewAWSMetadataDto() { }, InstanceID: "some-instance", InstanceType: "some-instance-type", - Placement: Placement{ + Placement: cloud.Placement{ AvailabilityZone: "some-availability-zone", Region: "some-region", }, } awsMetadata.IdentityCredentials.EC2.Info.AccountID = "some-account" - awsMetadata.Network.Interfaces.Macs = make(map[string]MacEntry) - macEntry := MacEntry{VpcID: "some-vpc-id"} + awsMetadata.Network.Interfaces.Macs = make(map[string]cloud.MacEntry) + macEntry := cloud.MacEntry{VpcID: "some-vpc-id"} awsMetadata.Network.Interfaces.Macs["eth1"] = macEntry - awsMetadataDto := NewAWSMetadataDto(awsMetadata) + awsMetadataDto := cloud.NewAWSMetadataDto(awsMetadata) - expectedDto := &AWSMetadataDto{ + expectedDto := &cloud.AWSMetadataDto{ AccountID: "some-account", AmiID: "some-ami", AvailabilityZone: "some-availability-zone", diff --git a/internal/core/cloud/aws_test.go b/internal/core/cloud/aws_test.go index ae8d31af..42b4aa15 100644 --- a/internal/core/cloud/aws_test.go +++ b/internal/core/cloud/aws_test.go @@ -1,4 +1,4 @@ -package cloud +package cloud_test import ( "bytes" @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" + "github.com/trento-project/agent/internal/core/cloud" "github.com/trento-project/agent/internal/core/cloud/mocks" "github.com/trento-project/agent/test/helpers" ) @@ -54,7 +55,7 @@ func (suite *AWSMetadataTestSuite) TestNewAWSMetadata() { bodyText, _ := io.ReadAll(aFile) body := io.NopCloser(bytes.NewReader(bodyText)) - response := &http.Response{ //nolint + response := &http.Response{ StatusCode: 200, Body: body, } @@ -64,9 +65,7 @@ func (suite *AWSMetadataTestSuite) TestNewAWSMetadata() { ).Once() } - client = clientMock - - m, err := NewAWSMetadata() + m, err := cloud.NewAWSMetadata(clientMock) suite.NoError(err) diff --git a/internal/core/cloud/azure.go b/internal/core/cloud/azure.go index c13bc265..dd4c8c1e 100644 --- a/internal/core/cloud/azure.go +++ b/internal/core/cloud/azure.go @@ -142,7 +142,7 @@ type Subnet struct { Prefix string `json:"prefix,omitempty"` } -func NewAzureMetadata() (*AzureMetadata, error) { +func NewAzureMetadata(client HTTPClient) (*AzureMetadata, error) { var err error m := &AzureMetadata{ Compute: Compute{ diff --git a/internal/core/cloud/azure_test.go b/internal/core/cloud/azure_test.go index bcc94757..732719b8 100644 --- a/internal/core/cloud/azure_test.go +++ b/internal/core/cloud/azure_test.go @@ -1,5 +1,4 @@ -//nolint:lll -package cloud +package cloud_test import ( "bytes" @@ -10,6 +9,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" + "github.com/trento-project/agent/internal/core/cloud" "github.com/trento-project/agent/internal/core/cloud/mocks" "github.com/trento-project/agent/test/helpers" ) @@ -29,7 +29,7 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { bodyText, _ := io.ReadAll(aFile) body := io.NopCloser(bytes.NewReader(bodyText)) - response := &http.Response{ //nolint + response := &http.Response{ StatusCode: 200, Body: body, } @@ -38,12 +38,10 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { response, nil, ) - client = clientMock + m, err := cloud.NewAzureMetadata(clientMock) - m, err := NewAzureMetadata() - - expectedMeta := &AzureMetadata{ - Compute: Compute{ + expectedMeta := &cloud.AzureMetadata{ + Compute: cloud.Compute{ AzEnvironment: "AzurePublicCloud", EvictionPolicy: "", IsHostCompatibilityLayerVM: "false", @@ -51,14 +49,14 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { Location: "westeurope", Name: "vmhana01", Offer: "sles-sap-15-sp2-byos", - OsProfile: OsProfile{ + OsProfile: cloud.OsProfile{ AdminUserName: "cloudadmin", ComputerName: "vmhana01", DisablePasswordAuthentication: "true", }, OsType: "Linux", PlacementGroupID: "", - Plan: Plan{ + Plan: cloud.Plan{ Name: "", Product: "", Publisher: "", @@ -68,7 +66,7 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { Priority: "", Provider: "Microsoft.Compute", - PublicKeys: []*PublicKey{ + PublicKeys: []*cloud.PublicKey{ { KeyData: "ssh-rsa content\n", Path: "/home/cloudadmin/.ssh/authorized_keys", @@ -77,13 +75,13 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { Publisher: "SUSE", ResourceGroupName: "test", ResourceID: "/subscriptions/xxxxx/resourceGroups/test/providers/Microsoft.Compute/virtualMachines/vmhana01", - SecurityProfile: SecurityProfile{ + SecurityProfile: cloud.SecurityProfile{ SecureBootEnabled: "false", VirtualTpmEnabled: "false", }, Sku: "gen2", - StorageProfile: StorageProfile{ - DataDisks: []*Disk{ + StorageProfile: cloud.StorageProfile{ + DataDisks: []*cloud.Disk{ { Caching: "None", CreateOption: "Empty", @@ -92,8 +90,8 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { "uri": "", }, Lun: "0", - ManagedDisk: ManagedDisk{ - ID: "/subscriptions/xxxxx/resourceGroups/test/providers/Microsoft.Compute/disks/disk-hana01-Data01", //nolint:lll + ManagedDisk: cloud.ManagedDisk{ + ID: "/subscriptions/xxxxx/resourceGroups/test/providers/Microsoft.Compute/disks/disk-hana01-Data01", StorageAccountType: "Premium_LRS", }, Name: "disk-hana01-Data01", @@ -110,8 +108,8 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { "uri": "", }, Lun: "1", - ManagedDisk: ManagedDisk{ - ID: "/subscriptions/xxxxx/resourceGroups/test/providers/Microsoft.Compute/disks/disk-hana01-Data02", //nolint:lll + ManagedDisk: cloud.ManagedDisk{ + ID: "/subscriptions/xxxxx/resourceGroups/test/providers/Microsoft.Compute/disks/disk-hana01-Data02", StorageAccountType: "Premium_LRS", }, Name: "disk-hana01-Data02", @@ -121,14 +119,14 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { WriteAcceleratorEnabled: "false", }, }, - ImageReference: ImageReference{ + ImageReference: cloud.ImageReference{ ID: "", Offer: "sles-sap-15-sp2-byos", Publisher: "SUSE", Sku: "gen2", Version: "latest", }, - OsDisk: Disk{ + OsDisk: cloud.Disk{ Caching: "ReadWrite", CreateOption: "FromImage", DiffDiskSettings: map[string]string{ @@ -142,7 +140,7 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { "uri": "", }, Lun: "", - ManagedDisk: ManagedDisk{ + ManagedDisk: cloud.ManagedDisk{ ID: "/subscriptions/xxxxx/resourceGroups/test/providers/Microsoft.Compute/disks/disk-hana01-Os", StorageAccountType: "Premium_LRS", }, @@ -169,26 +167,26 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { VMSize: "Standard_E4s_v3", Zone: "", }, - Network: Network{ - Interfaces: []*Interface{ + Network: cloud.Network{ + Interfaces: []*cloud.Interface{ { - Ipv4: IP{ - Addresses: []*Address{ + Ipv4: cloud.IP{ + Addresses: []*cloud.Address{ { PrivateIP: "10.74.1.10", PublicIP: "1.2.3.4", }, }, - Subnets: []*Subnet{ + Subnets: []*cloud.Subnet{ { Address: "10.74.1.0", Prefix: "24", }, }, }, - Ipv6: IP{ - Addresses: []*Address{}, - Subnets: []*Subnet(nil), + Ipv6: cloud.IP{ + Addresses: []*cloud.Address{}, + Subnets: []*cloud.Subnet(nil), }, MacAddress: "000D3A2267C3", }, @@ -201,8 +199,8 @@ func (suite *AzureMetadataTestSuite) TestNewAzureMetadata() { } func (suite *AzureMetadataTestSuite) TestGetVmUrl() { - meta := &AzureMetadata{ //nolint - Compute: Compute{ //nolint + meta := &cloud.AzureMetadata{ + Compute: cloud.Compute{ ResourceID: "myresourceid", }, } @@ -211,8 +209,8 @@ func (suite *AzureMetadataTestSuite) TestGetVmUrl() { } func (suite *AzureMetadataTestSuite) TestGetResourceGroupUrl() { - meta := &AzureMetadata{ //nolint - Compute: Compute{ //nolint + meta := &cloud.AzureMetadata{ + Compute: cloud.Compute{ SubscriptionID: "xxx", ResourceGroupName: "myresourcegroupname", }, diff --git a/internal/core/cloud/client.go b/internal/core/cloud/client.go index 394b22b9..4091a0b3 100644 --- a/internal/core/cloud/client.go +++ b/internal/core/cloud/client.go @@ -8,5 +8,3 @@ import "net/http" type HTTPClient interface { Do(req *http.Request) (*http.Response, error) } - -var client HTTPClient = &http.Client{Transport: &http.Transport{Proxy: nil}} //nolint diff --git a/internal/core/cloud/gcp.go b/internal/core/cloud/gcp.go index 7fdf54f2..04feb998 100644 --- a/internal/core/cloud/gcp.go +++ b/internal/core/cloud/gcp.go @@ -47,7 +47,7 @@ type GCPProject struct { ProjectID string `json:"projectId,omitempty"` } -func NewGCPMetadata() (*GCPMetadata, error) { +func NewGCPMetadata(client HTTPClient) (*GCPMetadata, error) { var err error m := &GCPMetadata{ Instance: GCPInstance{ diff --git a/internal/core/cloud/gcp_dto_test.go b/internal/core/cloud/gcp_dto_test.go index ec76032e..f6aef7c1 100644 --- a/internal/core/cloud/gcp_dto_test.go +++ b/internal/core/cloud/gcp_dto_test.go @@ -1,9 +1,10 @@ -package cloud +package cloud_test import ( "testing" "github.com/stretchr/testify/suite" + "github.com/trento-project/agent/internal/core/cloud" ) type GCPMetadataDtoTestSuite struct { @@ -16,9 +17,9 @@ func TestGCPMetadataDtoTestSuite(t *testing.T) { func (suite *GCPMetadataDtoTestSuite) TestNewGCPMetadataDto() { - gcpMetadata := &GCPMetadata{ - Instance: GCPInstance{ - Disks: []GCPDisk{ + gcpMetadata := &cloud.GCPMetadata{ + Instance: cloud.GCPInstance{ + Disks: []cloud.GCPDisk{ { DeviceName: "persistent-disk-0", Index: 0, @@ -39,21 +40,21 @@ func (suite *GCPMetadataDtoTestSuite) TestNewGCPMetadataDto() { Image: "projects/suse-byos-cloud/global/images/sles-15-sp1-sap-byos-v20220126", MachineType: "projects/123456/machineTypes/n1-highmem-8", Name: "vmhana01", - NetworkInterfaces: []GCPNetworkInterface{ + NetworkInterfaces: []cloud.GCPNetworkInterface{ { Network: "projects/123456/networks/network", }, }, Zone: "projects/123456/zones/europe-west1-b", }, - Project: GCPProject{ + Project: cloud.GCPProject{ ProjectID: "some-project-id", }, } - gcpMetadataDto := NewGCPMetadataDto(gcpMetadata) + gcpMetadataDto := cloud.NewGCPMetadataDto(gcpMetadata) - expectedDto := &GCPMetadataDto{ + expectedDto := &cloud.GCPMetadataDto{ DiskNumber: 4, Image: "sles-15-sp1-sap-byos-v20220126", InstanceName: "vmhana01", diff --git a/internal/core/cloud/gcp_test.go b/internal/core/cloud/gcp_test.go index 0986e702..4bd3c6e8 100644 --- a/internal/core/cloud/gcp_test.go +++ b/internal/core/cloud/gcp_test.go @@ -1,4 +1,4 @@ -package cloud +package cloud_test import ( "bytes" @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" + "github.com/trento-project/agent/internal/core/cloud" "github.com/trento-project/agent/internal/core/cloud/mocks" "github.com/trento-project/agent/test/helpers" ) @@ -28,7 +29,7 @@ func (suite *GcpMetadataTestSuite) TestNewGCPMetadata() { bodyText, _ := io.ReadAll(aFile) body := io.NopCloser(bytes.NewReader(bodyText)) - response := &http.Response{ //nolint + response := &http.Response{ StatusCode: 200, Body: body, } @@ -37,13 +38,11 @@ func (suite *GcpMetadataTestSuite) TestNewGCPMetadata() { response, nil, ) - client = clientMock + m, err := cloud.NewGCPMetadata(clientMock) - m, err := NewGCPMetadata() - - expectedMeta := &GCPMetadata{ - Instance: GCPInstance{ - Disks: []GCPDisk{ + expectedMeta := &cloud.GCPMetadata{ + Instance: cloud.GCPInstance{ + Disks: []cloud.GCPDisk{ { DeviceName: "persistent-disk-0", Index: 0, @@ -64,14 +63,14 @@ func (suite *GcpMetadataTestSuite) TestNewGCPMetadata() { Image: "projects/suse-byos-cloud/global/images/sles-15-sp1-sap-byos-v20220126", MachineType: "projects/123456/machineTypes/n1-highmem-8", Name: "vmhana01", - NetworkInterfaces: []GCPNetworkInterface{ + NetworkInterfaces: []cloud.GCPNetworkInterface{ { Network: "projects/123456/networks/network", }, }, Zone: "projects/123456/zones/europe-west1-b", }, - Project: GCPProject{ + Project: cloud.GCPProject{ ProjectID: "some-project-id", }, } diff --git a/internal/core/cloud/metadata.go b/internal/core/cloud/metadata.go index 5bc06f1f..36a368e5 100644 --- a/internal/core/cloud/metadata.go +++ b/internal/core/cloud/metadata.go @@ -181,7 +181,7 @@ func (i *Identifier) IdentifyCloudProvider() (string, error) { return "", nil } -func NewCloudInstance(commandExecutor utils.CommandExecutor) (*Instance, error) { +func NewCloudInstance(commandExecutor utils.CommandExecutor, client HTTPClient) (*Instance, error) { var err error var cloudMetadata interface{} @@ -199,22 +199,28 @@ func NewCloudInstance(commandExecutor utils.CommandExecutor) (*Instance, error) switch provider { case Azure: - cloudMetadata, err = NewAzureMetadata() - if err != nil { - return nil, err + { + cloudMetadata, err = NewAzureMetadata(client) + if err != nil { + return nil, err + } } case AWS: - awsMetadata, err := NewAWSMetadata() - if err != nil { - return nil, err + { + awsMetadata, err := NewAWSMetadata(client) + if err != nil { + return nil, err + } + cloudMetadata = NewAWSMetadataDto(awsMetadata) } - cloudMetadata = NewAWSMetadataDto(awsMetadata) case GCP: - gcpMetadata, err := NewGCPMetadata() - if err != nil { - return nil, err + { + gcpMetadata, err := NewGCPMetadata(client) + if err != nil { + return nil, err + } + cloudMetadata = NewGCPMetadataDto(gcpMetadata) } - cloudMetadata = NewGCPMetadataDto(gcpMetadata) } cInst.Metadata = cloudMetadata diff --git a/internal/core/cloud/metadata_test.go b/internal/core/cloud/metadata_test.go index 268001a9..481c8d06 100644 --- a/internal/core/cloud/metadata_test.go +++ b/internal/core/cloud/metadata_test.go @@ -1,4 +1,4 @@ -package cloud +package cloud_test import ( "bytes" @@ -9,18 +9,26 @@ import ( "github.com/pkg/errors" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" + "github.com/trento-project/agent/internal/core/cloud" "github.com/trento-project/agent/internal/core/cloud/mocks" utilsMocks "github.com/trento-project/agent/pkg/utils/mocks" ) type CloudMetadataTestSuite struct { suite.Suite + mockExecutor *utilsMocks.CommandExecutor + mockHTTPClient *mocks.HTTPClient } func TestCloudMetadataTestSuite(t *testing.T) { suite.Run(t, new(CloudMetadataTestSuite)) } +func (suite *CloudMetadataTestSuite) SetupTest() { + suite.mockExecutor = new(utilsMocks.CommandExecutor) + suite.mockHTTPClient = new(mocks.HTTPClient) +} + func dmidecodeAzure() []byte { return []byte("7783-7084-3265-9085-8269-3286-77") } @@ -63,12 +71,11 @@ func dmidecodeEmpty() []byte { } func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderErr() { - mockCommand := new(utilsMocks.CommandExecutor) - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - nil, errors.New("error"), - ) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(nil, errors.New("error")) - cIdentifier := NewIdentifier(mockCommand) + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -77,12 +84,11 @@ func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderErr() { } func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderAzure() { - mockCommand := new(utilsMocks.CommandExecutor) - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeAzure(), nil, - ) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeAzure(), nil) - cIdentifier := NewIdentifier(mockCommand) + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -91,16 +97,13 @@ func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderAzure() { } func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderAWSUsingSystemVersion() { - mockCommand := new(utilsMocks.CommandExecutor) - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeAWSSystem(), nil, - ) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeAWSSystem(), nil) - cIdentifier := NewIdentifier(mockCommand) + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -109,21 +112,15 @@ func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderAWSUsingSystemVers } func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderAWSUsingManufacturer() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeAWSManufacturer(), nil, - ) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeAWSManufacturer(), nil) - cIdentifier := NewIdentifier(mockCommand) + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -132,25 +129,17 @@ func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderAWSUsingManufactur } func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderGCP() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeGCP(), nil, - ) - - cIdentifier := NewIdentifier(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeGCP(), nil) + + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -159,29 +148,19 @@ func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderGCP() { } func (suite *CloudMetadataTestSuite) TestIdentifyProviderNutanix() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode").Return( - dmidecodeNutanix(), nil, - ) - - cIdentifier := NewIdentifier(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode"). + Return(dmidecodeNutanix(), nil) + + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -190,33 +169,21 @@ func (suite *CloudMetadataTestSuite) TestIdentifyProviderNutanix() { } func (suite *CloudMetadataTestSuite) TestIdentifyProviderKVM() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "systemd-detect-virt").Return( - systemdDetectVirtKVM(), nil, - ) - - cIdentifier := NewIdentifier(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode"). + Return(dmidecodeEmpty(), nil). + On("Exec", "systemd-detect-virt"). + Return(systemdDetectVirtKVM(), nil) + + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -225,33 +192,21 @@ func (suite *CloudMetadataTestSuite) TestIdentifyProviderKVM() { } func (suite *CloudMetadataTestSuite) TestIdentifyProviderVmware() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "systemd-detect-virt").Return( - systemdDetectVirtVmware(), nil, - ) - - cIdentifier := NewIdentifier(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode"). + Return(dmidecodeEmpty(), nil). + On("Exec", "systemd-detect-virt"). + Return(systemdDetectVirtVmware(), nil) + + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -260,33 +215,21 @@ func (suite *CloudMetadataTestSuite) TestIdentifyProviderVmware() { } func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderNoCloud() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "systemd-detect-virt").Return( - systemdDetectVirtEmpty(), nil, - ) - - cIdentifier := NewIdentifier(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode"). + Return(dmidecodeEmpty(), nil). + On("Exec", "systemd-detect-virt"). + Return(systemdDetectVirtEmpty(), nil) + + cIdentifier := cloud.NewIdentifier(suite.mockExecutor) provider, err := cIdentifier.IdentifyCloudProvider() @@ -295,175 +238,129 @@ func (suite *CloudMetadataTestSuite) TestIdentifyCloudProviderNoCloud() { } func (suite *CloudMetadataTestSuite) TestNewCloudInstanceAzure() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeAzure(), nil, - ) - - clientMock := new(mocks.HTTPClient) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeAzure(), nil) body := io.NopCloser(bytes.NewReader([]byte(`{"compute":{"name":"test"}}`))) - response := &http.Response{ //nolint + response := &http.Response{ StatusCode: 200, Body: body, } - clientMock.On("Do", mock.AnythingOfType("*http.Request")).Return( + suite.mockHTTPClient.On("Do", mock.AnythingOfType("*http.Request")).Return( response, nil, ) - client = clientMock - - c, err := NewCloudInstance(mockCommand) + c, err := cloud.NewCloudInstance(suite.mockExecutor, suite.mockHTTPClient) suite.NoError(err) suite.Equal("azure", c.Provider) - meta, ok := c.Metadata.(*AzureMetadata) + meta, ok := c.Metadata.(*cloud.AzureMetadata) suite.True(ok) suite.Equal("test", meta.Compute.Name) } func (suite *CloudMetadataTestSuite) TestNewCloudInstanceAWS() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeAWSSystem(), nil, - ) - - clientMock := new(mocks.HTTPClient) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeAWSSystem(), nil) request1 := io.NopCloser(bytes.NewReader([]byte(`instance-id`))) request2 := io.NopCloser(bytes.NewReader([]byte(`some-id`))) - response1 := &http.Response{ //nolint + response1 := &http.Response{ StatusCode: 200, Body: request1, } - response2 := &http.Response{ //nolint + response2 := &http.Response{ StatusCode: 200, Body: request2, } - clientMock.On("Do", mock.AnythingOfType("*http.Request")).Return( - response1, nil, - ).Once() - - clientMock.On("Do", mock.AnythingOfType("*http.Request")).Return( - response2, nil, - ) - - client = clientMock + suite.mockHTTPClient. + On("Do", mock.AnythingOfType("*http.Request")). + Return(response1, nil). + Once(). + On("Do", mock.AnythingOfType("*http.Request")). + Return(response2, nil) - c, err := NewCloudInstance(mockCommand) + c, err := cloud.NewCloudInstance(suite.mockExecutor, suite.mockHTTPClient) suite.NoError(err) suite.Equal("aws", c.Provider) - meta, ok := c.Metadata.(*AWSMetadataDto) + meta, ok := c.Metadata.(*cloud.AWSMetadataDto) suite.True(ok) suite.Equal("some-id", meta.InstanceID) } func (suite *CloudMetadataTestSuite) TestNewInstanceNutanix() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode").Return( - dmidecodeNutanix(), nil, - ) - - c, err := NewCloudInstance(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode"). + Return(dmidecodeNutanix(), nil) + + c, err := cloud.NewCloudInstance(suite.mockExecutor, suite.mockHTTPClient) suite.NoError(err) suite.Equal("nutanix", c.Provider) suite.Equal(interface{}(nil), c.Metadata) + suite.mockHTTPClient.AssertNotCalled(suite.T(), "Do") } func (suite *CloudMetadataTestSuite) TestNewInstanceKVM() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "systemd-detect-virt").Return( - systemdDetectVirtKVM(), nil, - ) - - c, err := NewCloudInstance(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode"). + Return(dmidecodeEmpty(), nil). + On("Exec", "systemd-detect-virt"). + Return(systemdDetectVirtKVM(), nil) + + c, err := cloud.NewCloudInstance(suite.mockExecutor, suite.mockHTTPClient) suite.NoError(err) suite.Equal("kvm", c.Provider) suite.Equal(interface{}(nil), c.Metadata) + suite.mockHTTPClient.AssertNotCalled(suite.T(), "Do") } func (suite *CloudMetadataTestSuite) TestNewCloudInstanceNoCloud() { - mockCommand := new(utilsMocks.CommandExecutor) - - mockCommand.On("Exec", "dmidecode", "-s", "chassis-asset-tag").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-version").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "system-manufacturer").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode", "-s", "bios-vendor").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "dmidecode").Return( - dmidecodeEmpty(), nil, - ) - - mockCommand.On("Exec", "systemd-detect-virt").Return( - systemdDetectVirtEmpty(), nil, - ) - - c, err := NewCloudInstance(mockCommand) + suite.mockExecutor. + On("Exec", "dmidecode", "-s", "chassis-asset-tag"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-version"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "system-manufacturer"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode", "-s", "bios-vendor"). + Return(dmidecodeEmpty(), nil). + On("Exec", "dmidecode"). + Return(dmidecodeEmpty(), nil). + On("Exec", "systemd-detect-virt"). + Return(systemdDetectVirtEmpty(), nil) + + c, err := cloud.NewCloudInstance(suite.mockExecutor, suite.mockHTTPClient) suite.NoError(err) suite.Equal("", c.Provider) suite.Equal(interface{}(nil), c.Metadata) + suite.mockHTTPClient.AssertNotCalled(suite.T(), "Do") } diff --git a/internal/discovery/cloud.go b/internal/discovery/cloud.go index 05d8bcb5..9f1f3778 100644 --- a/internal/discovery/cloud.go +++ b/internal/discovery/cloud.go @@ -2,6 +2,7 @@ package discovery import ( "fmt" + "net/http" "time" log "github.com/sirupsen/logrus" @@ -36,7 +37,8 @@ func (d CloudDiscovery) GetInterval() time.Duration { } func (d CloudDiscovery) Discover() (string, error) { - cloudData, err := cloud.NewCloudInstance(utils.Executor{}) + client := &http.Client{Transport: &http.Transport{Proxy: nil}} + cloudData, err := cloud.NewCloudInstance(utils.Executor{}, client) if err != nil { return "", err }