github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/networking/v2/extensions/trunks/trunks_test.go (about) 1 //go:build acceptance || trunks 2 // +build acceptance trunks 3 4 package trunks 5 6 import ( 7 "sort" 8 "testing" 9 10 "github.com/gophercloud/gophercloud/internal/acceptance/clients" 11 v2 "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2" 12 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 13 "github.com/gophercloud/gophercloud/openstack/common/extensions" 14 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/attributestags" 15 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/trunks" 16 th "github.com/gophercloud/gophercloud/testhelper" 17 ) 18 19 func TestTrunkCRUD(t *testing.T) { 20 client, err := clients.NewNetworkV2Client() 21 if err != nil { 22 t.Fatalf("Unable to create a network client: %v", err) 23 } 24 25 extension, err := extensions.Get(client, "trunk").Extract() 26 if err != nil { 27 t.Skip("This test requires trunk Neutron extension") 28 } 29 tools.PrintResource(t, extension) 30 31 // Create Network 32 network, err := v2.CreateNetwork(t, client) 33 if err != nil { 34 t.Fatalf("Unable to create network: %v", err) 35 } 36 defer v2.DeleteNetwork(t, client, network.ID) 37 38 // Create Subnet 39 subnet, err := v2.CreateSubnet(t, client, network.ID) 40 if err != nil { 41 t.Fatalf("Unable to create subnet: %v", err) 42 } 43 defer v2.DeleteSubnet(t, client, subnet.ID) 44 45 // Create port 46 parentPort, err := v2.CreatePort(t, client, network.ID, subnet.ID) 47 if err != nil { 48 t.Fatalf("Unable to create port: %v", err) 49 } 50 defer v2.DeletePort(t, client, parentPort.ID) 51 52 subport1, err := v2.CreatePort(t, client, network.ID, subnet.ID) 53 if err != nil { 54 t.Fatalf("Unable to create port: %v", err) 55 } 56 defer v2.DeletePort(t, client, subport1.ID) 57 58 subport2, err := v2.CreatePort(t, client, network.ID, subnet.ID) 59 if err != nil { 60 t.Fatalf("Unable to create port: %v", err) 61 } 62 defer v2.DeletePort(t, client, subport2.ID) 63 64 trunk, err := CreateTrunk(t, client, parentPort.ID, subport1.ID, subport2.ID) 65 if err != nil { 66 t.Fatalf("Unable to create trunk: %v", err) 67 } 68 defer DeleteTrunk(t, client, trunk.ID) 69 70 _, err = trunks.Get(client, trunk.ID).Extract() 71 if err != nil { 72 t.Fatalf("Unable to get trunk: %v", err) 73 } 74 75 // Update Trunk 76 name := "" 77 description := "" 78 updateOpts := trunks.UpdateOpts{ 79 Name: &name, 80 Description: &description, 81 } 82 updatedTrunk, err := trunks.Update(client, trunk.ID, updateOpts).Extract() 83 if err != nil { 84 t.Fatalf("Unable to update trunk: %v", err) 85 } 86 87 if trunk.Name == updatedTrunk.Name { 88 t.Fatalf("Trunk name was not updated correctly") 89 } 90 91 if trunk.Description == updatedTrunk.Description { 92 t.Fatalf("Trunk description was not updated correctly") 93 } 94 95 th.AssertDeepEquals(t, updatedTrunk.Name, name) 96 th.AssertDeepEquals(t, updatedTrunk.Description, description) 97 98 // Get subports 99 subports, err := trunks.GetSubports(client, trunk.ID).Extract() 100 if err != nil { 101 t.Fatalf("Unable to get subports from the Trunk: %v", err) 102 } 103 th.AssertDeepEquals(t, trunk.Subports[0], subports[0]) 104 th.AssertDeepEquals(t, trunk.Subports[1], subports[1]) 105 106 tools.PrintResource(t, trunk) 107 } 108 109 func TestTrunkList(t *testing.T) { 110 client, err := clients.NewNetworkV2Client() 111 if err != nil { 112 t.Fatalf("Unable to create a network client: %v", err) 113 } 114 115 extension, err := extensions.Get(client, "trunk").Extract() 116 if err != nil { 117 t.Skip("This test requires trunk Neutron extension") 118 } 119 tools.PrintResource(t, extension) 120 121 allPages, err := trunks.List(client, nil).AllPages() 122 if err != nil { 123 t.Fatalf("Unable to list trunks: %v", err) 124 } 125 126 allTrunks, err := trunks.ExtractTrunks(allPages) 127 if err != nil { 128 t.Fatalf("Unable to extract trunks: %v", err) 129 } 130 131 for _, trunk := range allTrunks { 132 tools.PrintResource(t, trunk) 133 } 134 } 135 136 func TestTrunkSubportOperation(t *testing.T) { 137 client, err := clients.NewNetworkV2Client() 138 if err != nil { 139 t.Fatalf("Unable to create a network client: %v", err) 140 } 141 142 extension, err := extensions.Get(client, "trunk").Extract() 143 if err != nil { 144 t.Skip("This test requires trunk Neutron extension") 145 } 146 tools.PrintResource(t, extension) 147 148 // Create Network 149 network, err := v2.CreateNetwork(t, client) 150 if err != nil { 151 t.Fatalf("Unable to create network: %v", err) 152 } 153 defer v2.DeleteNetwork(t, client, network.ID) 154 155 // Create Subnet 156 subnet, err := v2.CreateSubnet(t, client, network.ID) 157 if err != nil { 158 t.Fatalf("Unable to create subnet: %v", err) 159 } 160 defer v2.DeleteSubnet(t, client, subnet.ID) 161 162 // Create port 163 parentPort, err := v2.CreatePort(t, client, network.ID, subnet.ID) 164 if err != nil { 165 t.Fatalf("Unable to create port: %v", err) 166 } 167 defer v2.DeletePort(t, client, parentPort.ID) 168 169 subport1, err := v2.CreatePort(t, client, network.ID, subnet.ID) 170 if err != nil { 171 t.Fatalf("Unable to create port: %v", err) 172 } 173 defer v2.DeletePort(t, client, subport1.ID) 174 175 subport2, err := v2.CreatePort(t, client, network.ID, subnet.ID) 176 if err != nil { 177 t.Fatalf("Unable to create port: %v", err) 178 } 179 defer v2.DeletePort(t, client, subport2.ID) 180 181 trunk, err := CreateTrunk(t, client, parentPort.ID) 182 if err != nil { 183 t.Fatalf("Unable to create trunk: %v", err) 184 } 185 defer DeleteTrunk(t, client, trunk.ID) 186 187 // Add subports to the trunk 188 addSubportsOpts := trunks.AddSubportsOpts{ 189 Subports: []trunks.Subport{ 190 { 191 SegmentationID: 1, 192 SegmentationType: "vlan", 193 PortID: subport1.ID, 194 }, 195 { 196 SegmentationID: 11, 197 SegmentationType: "vlan", 198 PortID: subport2.ID, 199 }, 200 }, 201 } 202 updatedTrunk, err := trunks.AddSubports(client, trunk.ID, addSubportsOpts).Extract() 203 if err != nil { 204 t.Fatalf("Unable to add subports to the Trunk: %v", err) 205 } 206 th.AssertEquals(t, 2, len(updatedTrunk.Subports)) 207 th.AssertDeepEquals(t, addSubportsOpts.Subports[0], updatedTrunk.Subports[0]) 208 th.AssertDeepEquals(t, addSubportsOpts.Subports[1], updatedTrunk.Subports[1]) 209 210 // Remove the Subports from the trunk 211 subRemoveOpts := trunks.RemoveSubportsOpts{ 212 Subports: []trunks.RemoveSubport{ 213 {PortID: subport1.ID}, 214 {PortID: subport2.ID}, 215 }, 216 } 217 updatedAgainTrunk, err := trunks.RemoveSubports(client, trunk.ID, subRemoveOpts).Extract() 218 if err != nil { 219 t.Fatalf("Unable to remove subports from the Trunk: %v", err) 220 } 221 th.AssertDeepEquals(t, trunk.Subports, updatedAgainTrunk.Subports) 222 } 223 224 func TestTrunkTags(t *testing.T) { 225 client, err := clients.NewNetworkV2Client() 226 if err != nil { 227 t.Fatalf("Unable to create a network client: %v", err) 228 } 229 230 extension, err := extensions.Get(client, "trunk").Extract() 231 if err != nil { 232 t.Skip("This test requires trunk Neutron extension") 233 } 234 tools.PrintResource(t, extension) 235 236 // Create Network 237 network, err := v2.CreateNetwork(t, client) 238 if err != nil { 239 t.Fatalf("Unable to create network: %v", err) 240 } 241 defer v2.DeleteNetwork(t, client, network.ID) 242 243 // Create Subnet 244 subnet, err := v2.CreateSubnet(t, client, network.ID) 245 if err != nil { 246 t.Fatalf("Unable to create subnet: %v", err) 247 } 248 defer v2.DeleteSubnet(t, client, subnet.ID) 249 250 // Create port 251 parentPort, err := v2.CreatePort(t, client, network.ID, subnet.ID) 252 if err != nil { 253 t.Fatalf("Unable to create port: %v", err) 254 } 255 defer v2.DeletePort(t, client, parentPort.ID) 256 257 subport1, err := v2.CreatePort(t, client, network.ID, subnet.ID) 258 if err != nil { 259 t.Fatalf("Unable to create port: %v", err) 260 } 261 defer v2.DeletePort(t, client, subport1.ID) 262 263 subport2, err := v2.CreatePort(t, client, network.ID, subnet.ID) 264 if err != nil { 265 t.Fatalf("Unable to create port: %v", err) 266 } 267 defer v2.DeletePort(t, client, subport2.ID) 268 269 trunk, err := CreateTrunk(t, client, parentPort.ID, subport1.ID, subport2.ID) 270 if err != nil { 271 t.Fatalf("Unable to create trunk: %v", err) 272 } 273 defer DeleteTrunk(t, client, trunk.ID) 274 275 tagReplaceAllOpts := attributestags.ReplaceAllOpts{ 276 // docs say list of tags, but it's a set e.g no duplicates 277 Tags: []string{"a", "b", "c"}, 278 } 279 tags, err := attributestags.ReplaceAll(client, "trunks", trunk.ID, tagReplaceAllOpts).Extract() 280 if err != nil { 281 t.Fatalf("Unable to set trunk tags: %v", err) 282 } 283 284 gtrunk, err := trunks.Get(client, trunk.ID).Extract() 285 if err != nil { 286 t.Fatalf("Unable to get trunk: %v", err) 287 } 288 tags = gtrunk.Tags 289 sort.Strings(tags) // Ensure ordering, older OpenStack versions aren't sorted... 290 th.AssertDeepEquals(t, []string{"a", "b", "c"}, tags) 291 292 // Add a tag 293 err = attributestags.Add(client, "trunks", trunk.ID, "d").ExtractErr() 294 th.AssertNoErr(t, err) 295 296 // Delete a tag 297 err = attributestags.Delete(client, "trunks", trunk.ID, "a").ExtractErr() 298 th.AssertNoErr(t, err) 299 300 // Verify expected tags are set in the List response 301 tags, err = attributestags.List(client, "trunks", trunk.ID).Extract() 302 th.AssertNoErr(t, err) 303 sort.Strings(tags) 304 th.AssertDeepEquals(t, []string{"b", "c", "d"}, tags) 305 306 // Delete all tags 307 err = attributestags.DeleteAll(client, "trunks", trunk.ID).ExtractErr() 308 th.AssertNoErr(t, err) 309 tags, err = attributestags.List(client, "trunks", trunk.ID).Extract() 310 th.AssertNoErr(t, err) 311 th.AssertEquals(t, 0, len(tags)) 312 }