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 }