github.com/darmach/terratest@v0.34.8-0.20210517103231-80931f95e3ff/modules/azure/virtualnetwork.go (about)

     1  package azure
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  
     7  	"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-09-01/network"
     8  	"github.com/gruntwork-io/terratest/modules/testing"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  // VirtualNetworkExists indicates whether the specified Azure Virtual Network exists.
    13  // This function would fail the test if there is an error.
    14  func VirtualNetworkExists(t testing.TestingT, vnetName string, resGroupName string, subscriptionID string) bool {
    15  	exists, err := VirtualNetworkExistsE(vnetName, resGroupName, subscriptionID)
    16  	require.NoError(t, err)
    17  	return exists
    18  }
    19  
    20  // VirtualNetworkExistsE indicates whether the specified Azure Virtual Network exists.
    21  func VirtualNetworkExistsE(vnetName string, resGroupName string, subscriptionID string) (bool, error) {
    22  	// Get the Virtual Network
    23  	_, err := GetVirtualNetworkE(vnetName, resGroupName, subscriptionID)
    24  	if err != nil {
    25  		if ResourceNotFoundErrorExists(err) {
    26  			return false, nil
    27  		}
    28  		return false, err
    29  	}
    30  	return true, nil
    31  }
    32  
    33  // SubnetExists indicates whether the specified Azure Virtual Network Subnet exists.
    34  // This function would fail the test if there is an error.
    35  func SubnetExists(t testing.TestingT, subnetName string, vnetName string, resGroupName string, subscriptionID string) bool {
    36  	exists, err := SubnetExistsE(subnetName, vnetName, resGroupName, subscriptionID)
    37  	require.NoError(t, err)
    38  	return exists
    39  }
    40  
    41  // SubnetExistsE indicates whether the specified Azure Virtual Network Subnet exists.
    42  func SubnetExistsE(subnetName string, vnetName string, resGroupName string, subscriptionID string) (bool, error) {
    43  	// Get the Subnet
    44  	_, err := GetSubnetE(subnetName, vnetName, resGroupName, subscriptionID)
    45  	if err != nil {
    46  		if ResourceNotFoundErrorExists(err) {
    47  			return false, nil
    48  		}
    49  		return false, err
    50  	}
    51  	return true, nil
    52  }
    53  
    54  // CheckSubnetContainsIP checks if the Private IP is contined in the Subnet Address Range.
    55  // This function would fail the test if there is an error.
    56  func CheckSubnetContainsIP(t testing.TestingT, IP string, subnetName string, vnetName string, resGroupName string, subscriptionID string) bool {
    57  	inRange, err := CheckSubnetContainsIPE(IP, subnetName, vnetName, resGroupName, subscriptionID)
    58  	require.NoError(t, err)
    59  	return inRange
    60  }
    61  
    62  // CheckSubnetContainsIPE checks if the Private IP is contined in the Subnet Address Range.
    63  func CheckSubnetContainsIPE(ipAddress string, subnetName string, vnetName string, resGroupName string, subscriptionID string) (bool, error) {
    64  	// Convert the IP to a net IP address
    65  	ip := net.ParseIP(ipAddress)
    66  	if ip == nil {
    67  		return false, NewFailedToParseError("IP Address", ipAddress)
    68  	}
    69  
    70  	// Get Subnet
    71  	subnet, err := GetSubnetE(subnetName, vnetName, resGroupName, subscriptionID)
    72  	if err != nil {
    73  		return false, err
    74  	}
    75  
    76  	// Get Subnet IP range, this required field is never nil therefore no exception handling required.
    77  	subnetPrefix := *subnet.AddressPrefix
    78  
    79  	// Check if the IP is in the Subnet Range using the net package
    80  	_, ipNet, err := net.ParseCIDR(subnetPrefix)
    81  	if err != nil {
    82  		return false, NewFailedToParseError("Subnet Range", subnetPrefix)
    83  	}
    84  
    85  	return ipNet.Contains(ip), nil
    86  }
    87  
    88  // GetVirtualNetworkSubnets gets all Subnet names and their respective address prefixes in the
    89  // specified Virtual Network. This function would fail the test if there is an error.
    90  func GetVirtualNetworkSubnets(t testing.TestingT, vnetName string, resGroupName string, subscriptionID string) map[string]string {
    91  	subnets, err := GetVirtualNetworkSubnetsE(vnetName, resGroupName, subscriptionID)
    92  	require.NoError(t, err)
    93  	return subnets
    94  }
    95  
    96  // GetVirtualNetworkSubnetsE gets all Subnet names and their respective address prefixes in the specified Virtual Network.
    97  // Returning both the name and prefix together helps reduce calls for these frequently accessed properties.
    98  func GetVirtualNetworkSubnetsE(vnetName string, resGroupName string, subscriptionID string) (map[string]string, error) {
    99  	subNetDetails := map[string]string{}
   100  
   101  	client, err := GetSubnetClientE(subscriptionID)
   102  	if err != nil {
   103  		return subNetDetails, err
   104  	}
   105  
   106  	subnets, err := client.List(context.Background(), resGroupName, vnetName)
   107  	if err != nil {
   108  		return subNetDetails, err
   109  	}
   110  
   111  	for _, v := range subnets.Values() {
   112  		subnetName := v.Name
   113  		subNetAddressPrefix := v.AddressPrefix
   114  
   115  		subNetDetails[string(*subnetName)] = string(*subNetAddressPrefix)
   116  	}
   117  	return subNetDetails, nil
   118  }
   119  
   120  // GetVirtualNetworkDNSServerIPs gets a list of all Virtual Network DNS server IPs.
   121  // This function would fail the test if there is an error.
   122  func GetVirtualNetworkDNSServerIPs(t testing.TestingT, vnetName string, resGroupName string, subscriptionID string) []string {
   123  	vnetDNSIPs, err := GetVirtualNetworkDNSServerIPsE(vnetName, resGroupName, subscriptionID)
   124  	require.NoError(t, err)
   125  
   126  	return vnetDNSIPs
   127  }
   128  
   129  // GetVirtualNetworkDNSServerIPsE gets a list of all Virtual Network DNS server IPs with Error.
   130  func GetVirtualNetworkDNSServerIPsE(vnetName string, resGroupName string, subscriptionID string) ([]string, error) {
   131  	// Get Virtual Network
   132  	vnet, err := GetVirtualNetworkE(vnetName, resGroupName, subscriptionID)
   133  	if err != nil {
   134  		return nil, err
   135  	}
   136  
   137  	return *vnet.DhcpOptions.DNSServers, nil
   138  }
   139  
   140  // GetSubnetE gets a subnet.
   141  func GetSubnetE(subnetName string, vnetName string, resGroupName string, subscriptionID string) (*network.Subnet, error) {
   142  	// Validate Azure Resource Group
   143  	resGroupName, err := getTargetAzureResourceGroupName(resGroupName)
   144  	if err != nil {
   145  		return nil, err
   146  	}
   147  
   148  	// Get the client reference
   149  	client, err := GetSubnetClientE(subscriptionID)
   150  	if err != nil {
   151  		return nil, err
   152  	}
   153  
   154  	// Get the Subnet
   155  	subnet, err := client.Get(context.Background(), resGroupName, vnetName, subnetName, "")
   156  	if err != nil {
   157  		return nil, err
   158  	}
   159  
   160  	return &subnet, nil
   161  }
   162  
   163  // GetSubnetClientE creates a subnet client.
   164  func GetSubnetClientE(subscriptionID string) (*network.SubnetsClient, error) {
   165  	// Create a new Subnet client from client factory
   166  	client, err := CreateNewSubnetClientE(subscriptionID)
   167  	if err != nil {
   168  		return nil, err
   169  	}
   170  
   171  	// Create an authorizer
   172  	authorizer, err := NewAuthorizer()
   173  	if err != nil {
   174  		return nil, err
   175  	}
   176  	client.Authorizer = *authorizer
   177  
   178  	return client, nil
   179  }
   180  
   181  // GetVirtualNetworkE gets Virtual Network in the specified Azure Resource Group.
   182  func GetVirtualNetworkE(vnetName string, resGroupName string, subscriptionID string) (*network.VirtualNetwork, error) {
   183  	// Validate Azure Resource Group
   184  	resGroupName, err := getTargetAzureResourceGroupName(resGroupName)
   185  	if err != nil {
   186  		return nil, err
   187  	}
   188  
   189  	// Get the client reference
   190  	client, err := GetVirtualNetworksClientE(subscriptionID)
   191  	if err != nil {
   192  		return nil, err
   193  	}
   194  
   195  	// Get the Virtual Network
   196  	vnet, err := client.Get(context.Background(), resGroupName, vnetName, "")
   197  	if err != nil {
   198  		return nil, err
   199  	}
   200  	return &vnet, nil
   201  }
   202  
   203  // GetVirtualNetworksClientE creates a virtual network client in the specified Azure Subscription.
   204  func GetVirtualNetworksClientE(subscriptionID string) (*network.VirtualNetworksClient, error) {
   205  	// Create a new Virtual Network client from client factory
   206  	client, err := CreateNewVirtualNetworkClientE(subscriptionID)
   207  	if err != nil {
   208  		return nil, err
   209  	}
   210  
   211  	// Create an authorizer
   212  	authorizer, err := NewAuthorizer()
   213  	if err != nil {
   214  		return nil, err
   215  	}
   216  	client.Authorizer = *authorizer
   217  
   218  	return client, nil
   219  }