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