github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/acceptance/openstack/networking/v1/routetables_test.go (about) 1 package v1 2 3 import ( 4 "log" 5 "os" 6 "testing" 7 8 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/clients" 9 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/openstack" 10 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/tools" 11 "github.com/opentelekomcloud/gophertelekomcloud/openstack/common/pointerto" 12 "github.com/opentelekomcloud/gophertelekomcloud/openstack/ecs/v1/cloudservers" 13 "github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/routetables" 14 "github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/subnets" 15 "github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/vpcs" 16 "github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v2/peerings" 17 th "github.com/opentelekomcloud/gophertelekomcloud/testhelper" 18 ) 19 20 func TestRouteTablesList(t *testing.T) { 21 client, err := clients.NewNetworkV1Client() 22 th.AssertNoErr(t, err) 23 24 listOpts := routetables.ListOpts{} 25 routeTablesList, err := routetables.List(client, listOpts) 26 th.AssertNoErr(t, err) 27 28 for _, rtb := range routeTablesList { 29 tools.PrintResource(t, rtb) 30 } 31 } 32 33 func TestRouteTablesLifecycle(t *testing.T) { 34 client, err := clients.NewNetworkV1Client() 35 th.AssertNoErr(t, err) 36 37 clientV2, err := clients.NewNetworkV2Client() 38 th.AssertNoErr(t, err) 39 40 // Create first vpc 41 createOpts1 := vpcs.CreateOpts{ 42 Name: tools.RandomString("acc-vpc-1-", 3), 43 CIDR: "192.168.0.0/16", 44 } 45 46 t.Logf("Attempting to create first vpc: %s", createOpts1.Name) 47 48 vpc1, err := vpcs.Create(client, createOpts1).Extract() 49 th.AssertNoErr(t, err) 50 t.Logf("Created first vpc: %s", vpc1.ID) 51 52 createSubnetOpts1 := subnets.CreateOpts{ 53 Name: tools.RandomString("acc-subnet-1-1-", 3), 54 Description: "some description 1", 55 CIDR: "192.168.0.0/24", 56 GatewayIP: "192.168.0.1", 57 VpcID: vpc1.ID, 58 } 59 t.Logf("Attempting to create first subnet: %s", createSubnetOpts1.Name) 60 61 subnet1, err := subnets.Create(client, createSubnetOpts1).Extract() 62 th.AssertNoErr(t, err) 63 64 createSubnetOpts2 := subnets.CreateOpts{ 65 Name: tools.RandomString("acc-subnet-2-1-", 3), 66 Description: "some description 2", 67 CIDR: "192.168.10.0/24", 68 GatewayIP: "192.168.10.1", 69 VpcID: vpc1.ID, 70 } 71 t.Logf("Attempting to create second subnet: %s", createSubnetOpts2.Name) 72 73 subnet2, err := subnets.Create(client, createSubnetOpts2).Extract() 74 th.AssertNoErr(t, err) 75 76 t.Cleanup(func() { 77 deleteSubnet(t, client, subnet1.VpcID, subnet1.ID) 78 deleteSubnet(t, client, subnet2.VpcID, subnet2.ID) 79 deleteVpc(t, client, vpc1.ID) 80 }) 81 82 // Create second vpc 83 createOpts2 := vpcs.CreateOpts{ 84 Name: tools.RandomString("acc-vpc-2-", 3), 85 CIDR: "172.16.0.0/16", 86 } 87 88 t.Logf("Attempting to create second vpc: %s", createOpts2.Name) 89 90 vpc2, err := vpcs.Create(client, createOpts2).Extract() 91 th.AssertNoErr(t, err) 92 t.Logf("Created second vpc: %s", vpc2.ID) 93 94 createSubnetOpts3 := subnets.CreateOpts{ 95 Name: tools.RandomString("acc-subnet-1-2-", 3), 96 Description: "some description 3", 97 CIDR: "172.16.10.0/24", 98 GatewayIP: "172.16.10.1", 99 VpcID: vpc2.ID, 100 } 101 t.Logf("Attempting to create subnet for second vpc: %s", createSubnetOpts3.Name) 102 103 subnet3, err := subnets.Create(client, createSubnetOpts3).Extract() 104 th.AssertNoErr(t, err) 105 106 t.Cleanup(func() { 107 deleteSubnet(t, client, subnet3.VpcID, subnet3.ID) 108 deleteVpc(t, client, vpc2.ID) 109 }) 110 t.Logf("Attempting to create peering connection between first and second vpc") 111 createOpts := peerings.CreateOpts{ 112 Name: tools.RandomString("acc-peering-", 3), 113 RequestVpcInfo: peerings.VpcInfo{ 114 VpcId: vpc1.ID, 115 }, 116 AcceptVpcInfo: peerings.VpcInfo{ 117 VpcId: vpc2.ID, 118 }, 119 } 120 peering, err := peerings.Create(clientV2, createOpts).Extract() 121 th.AssertNoErr(t, err) 122 123 t.Cleanup(func() { 124 t.Logf("Attempting to delete vpc peering connection: %s", peering.ID) 125 err := peerings.Delete(clientV2, peering.ID).ExtractErr() 126 if err != nil { 127 t.Fatalf("Error deleting vpc peering connection: %v", err) 128 } 129 }) 130 131 t.Logf("Attempting to create route table") 132 createRtbOpts := routetables.CreateOpts{ 133 Name: tools.RandomString("acc-rtb-", 3), 134 Description: "route table", 135 VpcID: vpc1.ID, 136 } 137 rtb, err := routetables.Create(client, createRtbOpts) 138 th.AssertNoErr(t, err) 139 140 t.Cleanup(func() { 141 err = routetables.Delete(client, rtb.ID) 142 th.AssertNoErr(t, err) 143 }) 144 145 t.Logf("Attempting to get route table: %s", rtb.ID) 146 getRtb, err := routetables.Get(client, rtb.ID) 147 th.AssertNoErr(t, err) 148 th.AssertEquals(t, getRtb.Description, "route table") 149 150 t.Logf("Attempting to associate subnets to vpc route table: %s", rtb.ID) 151 actionOpts := routetables.ActionOpts{ 152 Subnets: routetables.ActionSubnetsOpts{ 153 Associate: []string{subnet1.ID, subnet2.ID}, 154 }, 155 } 156 associate, err := routetables.Action(client, rtb.ID, actionOpts) 157 th.AssertNoErr(t, err) 158 if len(associate.Subnets) < 1 { 159 t.Fatalf("Number of associated subnet lower than expected") 160 } 161 162 log.Printf("Attempting to update VPC route table with peering route: %#v", rtb.ID) 163 routesOpts := map[string][]routetables.RouteOpts{} 164 updateOpts := routetables.UpdateOpts{ 165 Name: "First", 166 Description: pointerto.String("description"), 167 } 168 addRouteOpts := []routetables.RouteOpts{ 169 { 170 Destination: "172.16.0.0/16", 171 Type: "peering", 172 NextHop: peering.ID, 173 Description: pointerto.String("route 1"), 174 }, 175 } 176 routesOpts["add"] = addRouteOpts 177 updateOpts.Routes = routesOpts 178 err = routetables.Update(client, rtb.ID, updateOpts) 179 th.AssertNoErr(t, err) 180 181 // ECS 182 imageId := os.Getenv("OS_IMAGE_ID") 183 flavorId := os.Getenv("OS_FLAVOR_ID") 184 az := os.Getenv("OS_AVAILABILITY_ZONE") 185 if imageId != "" && flavorId != "" && az != "" { 186 sererName := tools.RandomString("acc-ecs-", 3) 187 clientCompute, err := clients.NewComputeV1Client() 188 th.AssertNoErr(t, err) 189 createEcsOpts := cloudservers.CreateOpts{ 190 ImageRef: imageId, 191 FlavorRef: flavorId, 192 Name: sererName, 193 VpcId: vpc1.ID, 194 Nics: []cloudservers.Nic{ 195 { 196 SubnetId: subnet1.NetworkID, 197 }, 198 }, 199 RootVolume: cloudservers.RootVolume{ 200 VolumeType: "SSD", 201 }, 202 DataVolumes: []cloudservers.DataVolume{ 203 { 204 VolumeType: "SSD", 205 Size: 40, 206 }, 207 }, 208 AvailabilityZone: az, 209 } 210 t.Logf("Attempting to create cloud server: %s", sererName) 211 ecs := openstack.CreateCloudServer(t, clientCompute, createEcsOpts) 212 t.Cleanup(func() { 213 openstack.DeleteCloudServer(t, clientCompute, ecs.ID) 214 }) 215 216 log.Printf("Attempting to update VPC route table with ecs route: %#v", rtb.ID) 217 routesEcsOpts := map[string][]routetables.RouteOpts{} 218 updateEcsOpts := routetables.UpdateOpts{ 219 Name: "First", 220 Description: pointerto.String("description"), 221 } 222 addRouteEcsOpts := []routetables.RouteOpts{ 223 { 224 Destination: "172.16.0.0/24", 225 Type: "ecs", 226 NextHop: ecs.ID, 227 Description: pointerto.String("route 2"), 228 }, 229 } 230 routesEcsOpts["add"] = addRouteEcsOpts 231 updateEcsOpts.Routes = routesEcsOpts 232 err = routetables.Update(client, rtb.ID, updateEcsOpts) 233 th.AssertNoErr(t, err) 234 } 235 getChRtb, err := routetables.Get(client, rtb.ID) 236 th.AssertNoErr(t, err) 237 th.AssertEquals(t, getChRtb.Description, "description") 238 239 t.Logf("Attempting to disassociate subnets to vpc route table: %s", rtb.ID) 240 actionDisOpts := routetables.ActionOpts{ 241 Subnets: routetables.ActionSubnetsOpts{ 242 Disassociate: []string{subnet1.ID, subnet2.ID}, 243 }, 244 } 245 disassociate, err := routetables.Action(client, rtb.ID, actionDisOpts) 246 th.AssertNoErr(t, err) 247 if len(disassociate.Subnets) > 1 { 248 t.Fatalf("Number of associated subnet higher than expected") 249 } 250 }