github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/networking/v2/extensions/dns/dns_test.go (about) 1 //go:build acceptance || networking 2 // +build acceptance networking 3 4 package dns 5 6 import ( 7 "os" 8 "testing" 9 10 "github.com/gophercloud/gophercloud/internal/acceptance/clients" 11 networking "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2" 12 "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2/extensions/layer3" 13 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 14 "github.com/gophercloud/gophercloud/openstack/common/extensions" 15 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/dns" 16 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips" 17 "github.com/gophercloud/gophercloud/openstack/networking/v2/networks" 18 "github.com/gophercloud/gophercloud/openstack/networking/v2/ports" 19 "github.com/gophercloud/gophercloud/pagination" 20 th "github.com/gophercloud/gophercloud/testhelper" 21 ) 22 23 func TestDNSPortCRUDL(t *testing.T) { 24 clients.RequireAdmin(t) 25 26 client, err := clients.NewNetworkV2Client() 27 th.AssertNoErr(t, err) 28 29 extension, err := extensions.Get(client, "dns-integration").Extract() 30 if err != nil { 31 t.Skip("This test requires dns-integration Neutron extension") 32 } 33 tools.PrintResource(t, extension) 34 35 // Create Network 36 networkDNSDomain := "local." 37 network, err := CreateNetworkDNS(t, client, networkDNSDomain) 38 th.AssertNoErr(t, err) 39 defer networking.DeleteNetwork(t, client, network.ID) 40 41 // Create Subnet 42 subnet, err := networking.CreateSubnet(t, client, network.ID) 43 th.AssertNoErr(t, err) 44 defer networking.DeleteSubnet(t, client, subnet.ID) 45 46 // Create port 47 portDNSName := "port" 48 port, err := CreatePortDNS(t, client, network.ID, subnet.ID, portDNSName) 49 th.AssertNoErr(t, err) 50 defer networking.DeletePort(t, client, port.ID) 51 52 tools.PrintResource(t, port) 53 54 if os.Getenv("OS_BRANCH") == "stable/mitaka" { 55 // List port successfully 56 var listOpts ports.ListOptsBuilder 57 listOpts = dns.PortListOptsExt{ 58 ListOptsBuilder: ports.ListOpts{}, 59 DNSName: portDNSName, 60 } 61 var listedPorts []PortWithDNSExt 62 i := 0 63 err = ports.List(client, listOpts).EachPage(func(page pagination.Page) (bool, error) { 64 i++ 65 err := ports.ExtractPortsInto(page, &listedPorts) 66 if err != nil { 67 t.Errorf("Failed to extract ports: %v", err) 68 return false, err 69 } 70 71 tools.PrintResource(t, listedPorts) 72 73 th.AssertEquals(t, 1, len(listedPorts)) 74 th.CheckDeepEquals(t, *port, listedPorts[0]) 75 76 return true, nil 77 }) 78 th.AssertNoErr(t, err) 79 th.AssertEquals(t, 1, i) 80 81 // List port unsuccessfully 82 listOpts = dns.PortListOptsExt{ 83 ListOptsBuilder: ports.ListOpts{}, 84 DNSName: "foo", 85 } 86 i = 0 87 err = ports.List(client, listOpts).EachPage(func(page pagination.Page) (bool, error) { 88 i++ 89 err := ports.ExtractPortsInto(page, &listedPorts) 90 if err != nil { 91 t.Errorf("Failed to extract ports: %v", err) 92 return false, err 93 } 94 95 tools.PrintResource(t, listedPorts) 96 97 th.AssertEquals(t, 1, len(listedPorts)) 98 th.CheckDeepEquals(t, *port, listedPorts[0]) 99 100 return true, nil 101 }) 102 th.AssertNoErr(t, err) 103 th.AssertEquals(t, 0, i) 104 } 105 106 // Get port 107 var getPort PortWithDNSExt 108 err = ports.Get(client, port.ID).ExtractInto(&getPort) 109 th.AssertNoErr(t, err) 110 111 tools.PrintResource(t, getPort) 112 th.AssertDeepEquals(t, *port, getPort) 113 114 // Update port 115 newPortName := "" 116 newPortDescription := "" 117 newDNSName := "" 118 portUpdateOpts := ports.UpdateOpts{ 119 Name: &newPortName, 120 Description: &newPortDescription, 121 } 122 var updateOpts ports.UpdateOptsBuilder 123 updateOpts = dns.PortUpdateOptsExt{ 124 UpdateOptsBuilder: portUpdateOpts, 125 DNSName: &newDNSName, 126 } 127 128 var newPort PortWithDNSExt 129 err = ports.Update(client, port.ID, updateOpts).ExtractInto(&newPort) 130 th.AssertNoErr(t, err) 131 132 tools.PrintResource(t, newPort) 133 th.AssertEquals(t, newPort.Description, newPortName) 134 th.AssertEquals(t, newPort.Description, newPortDescription) 135 th.AssertEquals(t, newPort.DNSName, newDNSName) 136 137 // Get updated port 138 var getNewPort PortWithDNSExt 139 err = ports.Get(client, port.ID).ExtractInto(&getNewPort) 140 th.AssertNoErr(t, err) 141 142 tools.PrintResource(t, getNewPort) 143 // workaround for update race condition 144 newPort.DNSAssignment = nil 145 getNewPort.DNSAssignment = nil 146 th.AssertDeepEquals(t, newPort, getNewPort) 147 } 148 149 func TestDNSFloatingIPCRDL(t *testing.T) { 150 t.Skip("Skipping TestDNSFloatingIPCRDL for now, as it doesn't work with ML2/OVN.") 151 clients.RequireAdmin(t) 152 153 client, err := clients.NewNetworkV2Client() 154 th.AssertNoErr(t, err) 155 156 extension, err := extensions.Get(client, "dns-integration").Extract() 157 if err != nil { 158 t.Skip("This test requires dns-integration Neutron extension") 159 } 160 tools.PrintResource(t, extension) 161 162 choices, err := clients.AcceptanceTestChoicesFromEnv() 163 th.AssertNoErr(t, err) 164 165 // Create Network 166 networkDNSDomain := "local." 167 network, err := CreateNetworkDNS(t, client, networkDNSDomain) 168 th.AssertNoErr(t, err) 169 defer networking.DeleteNetwork(t, client, network.ID) 170 171 // Create Subnet 172 subnet, err := networking.CreateSubnet(t, client, network.ID) 173 th.AssertNoErr(t, err) 174 defer networking.DeleteSubnet(t, client, subnet.ID) 175 176 // Create Router 177 router, err := layer3.CreateExternalRouter(t, client) 178 th.AssertNoErr(t, err) 179 defer layer3.DeleteRouter(t, client, router.ID) 180 181 // Create router interface 182 routerPort, err := networking.CreatePort(t, client, network.ID, subnet.ID) 183 th.AssertNoErr(t, err) 184 _, err = layer3.CreateRouterInterface(t, client, routerPort.ID, router.ID) 185 th.AssertNoErr(t, err) 186 defer layer3.DeleteRouterInterface(t, client, routerPort.ID, router.ID) 187 188 // Create port 189 portDNSName := "port" 190 port, err := CreatePortDNS(t, client, network.ID, subnet.ID, portDNSName) 191 th.AssertNoErr(t, err) 192 defer networking.DeletePort(t, client, port.ID) 193 194 tools.PrintResource(t, port) 195 196 // Create floating IP 197 fipDNSName := "fip" 198 fipDNSDomain := "local." 199 fip, err := CreateFloatingIPDNS(t, client, choices.ExternalNetworkID, port.ID, fipDNSName, fipDNSDomain) 200 th.AssertNoErr(t, err) 201 defer layer3.DeleteFloatingIP(t, client, fip.ID) 202 203 // Get floating IP 204 var getFip FloatingIPWithDNSExt 205 err = floatingips.Get(client, fip.ID).ExtractInto(&getFip) 206 th.AssertNoErr(t, err) 207 208 tools.PrintResource(t, getFip) 209 th.AssertDeepEquals(t, *fip, getFip) 210 } 211 212 func TestDNSNetwork(t *testing.T) { 213 clients.RequireAdmin(t) 214 215 client, err := clients.NewNetworkV2Client() 216 th.AssertNoErr(t, err) 217 218 extension, err := extensions.Get(client, "dns-integration").Extract() 219 if err != nil { 220 t.Skip("This test requires dns-integration Neutron extension") 221 } 222 tools.PrintResource(t, extension) 223 224 // Create Network 225 networkDNSDomain := "local." 226 network, err := CreateNetworkDNS(t, client, networkDNSDomain) 227 th.AssertNoErr(t, err) 228 defer networking.DeleteNetwork(t, client, network.ID) 229 230 // Get network 231 var getNetwork NetworkWithDNSExt 232 err = networks.Get(client, network.ID).ExtractInto(&getNetwork) 233 th.AssertNoErr(t, err) 234 235 tools.PrintResource(t, getNetwork) 236 th.AssertDeepEquals(t, *network, getNetwork) 237 238 // Update network 239 newNetworkName := "" 240 newNetworkDescription := "" 241 newNetworkDNSDomain := "" 242 networkUpdateOpts := networks.UpdateOpts{ 243 Name: &newNetworkName, 244 Description: &newNetworkDescription, 245 } 246 var updateOpts networks.UpdateOptsBuilder 247 updateOpts = dns.NetworkUpdateOptsExt{ 248 UpdateOptsBuilder: networkUpdateOpts, 249 DNSDomain: &newNetworkDNSDomain, 250 } 251 252 var newNetwork NetworkWithDNSExt 253 err = networks.Update(client, network.ID, updateOpts).ExtractInto(&newNetwork) 254 th.AssertNoErr(t, err) 255 256 tools.PrintResource(t, newNetwork) 257 th.AssertEquals(t, newNetwork.Description, newNetworkName) 258 th.AssertEquals(t, newNetwork.Description, newNetworkDescription) 259 th.AssertEquals(t, newNetwork.DNSDomain, newNetworkDNSDomain) 260 261 // Get updated network 262 var getNewNetwork NetworkWithDNSExt 263 err = networks.Get(client, network.ID).ExtractInto(&getNewNetwork) 264 th.AssertNoErr(t, err) 265 266 tools.PrintResource(t, getNewNetwork) 267 th.AssertDeepEquals(t, newNetwork, getNewNetwork) 268 }