github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/networking/v2/networks_test.go (about) 1 //go:build acceptance || networking 2 // +build acceptance networking 3 4 package v2 5 6 import ( 7 "strings" 8 "testing" 9 10 "github.com/gophercloud/gophercloud/internal/acceptance/clients" 11 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 12 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external" 13 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/portsecurity" 14 "github.com/gophercloud/gophercloud/openstack/networking/v2/networks" 15 th "github.com/gophercloud/gophercloud/testhelper" 16 ) 17 18 func TestNetworksExternalList(t *testing.T) { 19 client, err := clients.NewNetworkV2Client() 20 th.AssertNoErr(t, err) 21 22 choices, err := clients.AcceptanceTestChoicesFromEnv() 23 th.AssertNoErr(t, err) 24 25 type networkWithExt struct { 26 networks.Network 27 external.NetworkExternalExt 28 } 29 30 var allNetworks []networkWithExt 31 32 iTrue := true 33 networkListOpts := networks.ListOpts{ 34 ID: choices.ExternalNetworkID, 35 } 36 listOpts := external.ListOptsExt{ 37 ListOptsBuilder: networkListOpts, 38 External: &iTrue, 39 } 40 41 allPages, err := networks.List(client, listOpts).AllPages() 42 th.AssertNoErr(t, err) 43 44 err = networks.ExtractNetworksInto(allPages, &allNetworks) 45 th.AssertNoErr(t, err) 46 47 var found bool 48 for _, network := range allNetworks { 49 if network.External == true && network.ID == choices.ExternalNetworkID { 50 found = true 51 } 52 } 53 54 th.AssertEquals(t, found, true) 55 56 iFalse := false 57 networkListOpts = networks.ListOpts{ 58 ID: choices.ExternalNetworkID, 59 } 60 listOpts = external.ListOptsExt{ 61 ListOptsBuilder: networkListOpts, 62 External: &iFalse, 63 } 64 65 allPages, err = networks.List(client, listOpts).AllPages() 66 th.AssertNoErr(t, err) 67 68 v, err := networks.ExtractNetworks(allPages) 69 th.AssertEquals(t, len(v), 0) 70 } 71 72 func TestNetworksCRUD(t *testing.T) { 73 client, err := clients.NewNetworkV2Client() 74 th.AssertNoErr(t, err) 75 76 // Create a network 77 network, err := CreateNetwork(t, client) 78 th.AssertNoErr(t, err) 79 defer DeleteNetwork(t, client, network.ID) 80 81 tools.PrintResource(t, network) 82 83 newName := tools.RandomString("TESTACC-", 8) 84 newDescription := "" 85 updateOpts := &networks.UpdateOpts{ 86 Name: &newName, 87 Description: &newDescription, 88 } 89 90 _, err = networks.Update(client, network.ID, updateOpts).Extract() 91 th.AssertNoErr(t, err) 92 93 newNetwork, err := networks.Get(client, network.ID).Extract() 94 th.AssertNoErr(t, err) 95 96 tools.PrintResource(t, newNetwork) 97 th.AssertEquals(t, newNetwork.Name, newName) 98 th.AssertEquals(t, newNetwork.Description, newDescription) 99 100 type networkWithExt struct { 101 networks.Network 102 portsecurity.PortSecurityExt 103 } 104 105 var allNetworks []networkWithExt 106 107 allPages, err := networks.List(client, nil).AllPages() 108 th.AssertNoErr(t, err) 109 110 err = networks.ExtractNetworksInto(allPages, &allNetworks) 111 th.AssertNoErr(t, err) 112 113 var found bool 114 for _, network := range allNetworks { 115 if network.ID == newNetwork.ID { 116 found = true 117 } 118 } 119 120 th.AssertEquals(t, found, true) 121 } 122 123 func TestNetworksPortSecurityCRUD(t *testing.T) { 124 client, err := clients.NewNetworkV2Client() 125 th.AssertNoErr(t, err) 126 127 // Create a network without port security 128 network, err := CreateNetworkWithoutPortSecurity(t, client) 129 if err != nil { 130 t.Fatalf("Unable to create network: %v", err) 131 } 132 defer DeleteNetwork(t, client, network.ID) 133 134 var networkWithExtensions struct { 135 networks.Network 136 portsecurity.PortSecurityExt 137 } 138 139 err = networks.Get(client, network.ID).ExtractInto(&networkWithExtensions) 140 th.AssertNoErr(t, err) 141 142 tools.PrintResource(t, networkWithExtensions) 143 144 iTrue := true 145 networkUpdateOpts := networks.UpdateOpts{} 146 updateOpts := portsecurity.NetworkUpdateOptsExt{ 147 UpdateOptsBuilder: networkUpdateOpts, 148 PortSecurityEnabled: &iTrue, 149 } 150 151 err = networks.Update(client, network.ID, updateOpts).ExtractInto(&networkWithExtensions) 152 th.AssertNoErr(t, err) 153 154 tools.PrintResource(t, networkWithExtensions) 155 } 156 157 func TestNetworksRevision(t *testing.T) { 158 client, err := clients.NewNetworkV2Client() 159 th.AssertNoErr(t, err) 160 161 // Create a network 162 network, err := CreateNetwork(t, client) 163 th.AssertNoErr(t, err) 164 defer DeleteNetwork(t, client, network.ID) 165 166 tools.PrintResource(t, network) 167 168 // Store the current revision number. 169 oldRevisionNumber := network.RevisionNumber 170 171 // Update the network without revision number. 172 // This should work. 173 newName := tools.RandomString("TESTACC-", 8) 174 newDescription := "" 175 updateOpts := &networks.UpdateOpts{ 176 Name: &newName, 177 Description: &newDescription, 178 } 179 network, err = networks.Update(client, network.ID, updateOpts).Extract() 180 th.AssertNoErr(t, err) 181 182 tools.PrintResource(t, network) 183 184 // This should fail due to an old revision number. 185 newDescription = "new description" 186 updateOpts = &networks.UpdateOpts{ 187 Name: &newName, 188 Description: &newDescription, 189 RevisionNumber: &oldRevisionNumber, 190 } 191 _, err = networks.Update(client, network.ID, updateOpts).Extract() 192 th.AssertErr(t, err) 193 if !strings.Contains(err.Error(), "RevisionNumberConstraintFailed") { 194 t.Fatalf("expected to see an error of type RevisionNumberConstraintFailed, but got the following error instead: %v", err) 195 } 196 197 // Reread the network to show that it did not change. 198 network, err = networks.Get(client, network.ID).Extract() 199 th.AssertNoErr(t, err) 200 201 tools.PrintResource(t, network) 202 203 // This should work because now we do provide a valid revision number. 204 newDescription = "new description" 205 updateOpts = &networks.UpdateOpts{ 206 Name: &newName, 207 Description: &newDescription, 208 RevisionNumber: &network.RevisionNumber, 209 } 210 network, err = networks.Update(client, network.ID, updateOpts).Extract() 211 th.AssertNoErr(t, err) 212 213 tools.PrintResource(t, network) 214 215 th.AssertEquals(t, network.Name, newName) 216 th.AssertEquals(t, network.Description, newDescription) 217 }