github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_edgegateway_static_route.go (about) 1 /* 2 * Copyright 2022 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 3 */ 4 5 package govcd 6 7 import ( 8 "fmt" 9 "net/url" 10 11 "github.com/vmware/go-vcloud-director/v2/types/v56" 12 ) 13 14 // NsxtEdgeGatewayStaticRoute represents NSX-T Edge Gateway Static Route 15 type NsxtEdgeGatewayStaticRoute struct { 16 NsxtEdgeGatewayStaticRoute *types.NsxtEdgeGatewayStaticRoute 17 client *Client 18 // edgeGatewayId is stored for usage in NsxtEdgeGatewayStaticRoute receiver functions 19 edgeGatewayId string 20 } 21 22 // CreateStaticRoute based on type definition 23 func (egw *NsxtEdgeGateway) CreateStaticRoute(staticRouteConfig *types.NsxtEdgeGatewayStaticRoute) (*NsxtEdgeGatewayStaticRoute, error) { 24 client := egw.client 25 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes 26 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 27 if err != nil { 28 return nil, err 29 } 30 31 // Insert Edge Gateway ID into endpoint path 32 urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID)) 33 if err != nil { 34 return nil, err 35 } 36 37 returnObject := &NsxtEdgeGatewayStaticRoute{ 38 client: egw.client, 39 edgeGatewayId: egw.EdgeGateway.ID, 40 NsxtEdgeGatewayStaticRoute: &types.NsxtEdgeGatewayStaticRoute{}, 41 } 42 43 // Non standard behavior of entity - `Details` field in task contains ID of newly created object while the Owner is Edge Gateway 44 task, err := client.OpenApiPostItemAsync(apiVersion, urlRef, nil, staticRouteConfig) 45 if err != nil { 46 return nil, fmt.Errorf("error creating NSX-T Edge Gateway Static Route: %s", err) 47 } 48 49 err = task.WaitTaskCompletion() 50 if err != nil { 51 return nil, fmt.Errorf("error creating NSX-T Edge Gateway Static Route: %s", err) 52 } 53 54 // API does not return an ID for created object - we know that it is expected to be in 55 // task.Task.Details therefore attempt to find it, but if it is empty - look for an entity by a 56 // set of requested parameters 57 staticRouteId := task.Task.Details 58 if staticRouteId != "" { 59 getUrlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID), staticRouteId) 60 if err != nil { 61 return nil, err 62 } 63 err = client.OpenApiGetItem(apiVersion, getUrlRef, nil, returnObject.NsxtEdgeGatewayStaticRoute, nil) 64 if err != nil { 65 return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route after creation: %s", err) 66 } 67 } else { 68 // ID was not present in response, therefore Static Route needs to be found manually. Using 69 // 'Name', 'Description' and 'NetworkCidr' for finding the entity. Duplicate entries can 70 // exist, but but it should be a good enough combination for finding unique entry until VCD API is fixed 71 allStaticRoutes, err := egw.GetAllStaticRoutes(nil) 72 if err != nil { 73 return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route after creation: %s", err) 74 } 75 76 var foundStaticRoute bool 77 for _, singleStaticRoute := range allStaticRoutes { 78 if singleStaticRoute.NsxtEdgeGatewayStaticRoute.Name == staticRouteConfig.Name && 79 singleStaticRoute.NsxtEdgeGatewayStaticRoute.NetworkCidr == staticRouteConfig.NetworkCidr && 80 singleStaticRoute.NsxtEdgeGatewayStaticRoute.Description == staticRouteConfig.Description { 81 foundStaticRoute = true 82 returnObject = singleStaticRoute 83 break 84 } 85 } 86 87 if !foundStaticRoute { 88 return nil, fmt.Errorf("error finding Static Route after creation by Name '%s', NetworkCidr '%s', Description '%s'", 89 staticRouteConfig.Name, staticRouteConfig.NetworkCidr, staticRouteConfig.Description) 90 } 91 92 } 93 94 return returnObject, nil 95 } 96 97 // GetAllStaticRoutes retrieves all Static Routes for a particular NSX-T Edge Gateway 98 func (egw *NsxtEdgeGateway) GetAllStaticRoutes(queryParameters url.Values) ([]*NsxtEdgeGatewayStaticRoute, error) { 99 client := egw.client 100 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes 101 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 102 if err != nil { 103 return nil, err 104 } 105 106 // Insert Edge Gateway ID into endpoint path 107 urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID)) 108 if err != nil { 109 return nil, err 110 } 111 112 typeResponses := []*types.NsxtEdgeGatewayStaticRoute{{}} 113 err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParameters, &typeResponses, nil) 114 if err != nil { 115 return nil, err 116 } 117 118 wrappedResponses := make([]*NsxtEdgeGatewayStaticRoute, len(typeResponses)) 119 for sliceIndex := range typeResponses { 120 wrappedResponses[sliceIndex] = &NsxtEdgeGatewayStaticRoute{ 121 NsxtEdgeGatewayStaticRoute: typeResponses[sliceIndex], 122 client: client, 123 edgeGatewayId: egw.EdgeGateway.ID, 124 } 125 } 126 127 return wrappedResponses, nil 128 } 129 130 // GetStaticRouteByNetworkCidr retrieves Static Route by network CIDR 131 // 132 // Note. It will return an error if more than one items is found 133 func (egw *NsxtEdgeGateway) GetStaticRouteByNetworkCidr(networkCidr string) (*NsxtEdgeGatewayStaticRoute, error) { 134 if networkCidr == "" { 135 return nil, fmt.Errorf("cidr cannot be empty") 136 } 137 138 allStaticRoutes, err := egw.GetAllStaticRoutes(nil) 139 if err != nil { 140 return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route: %s", err) 141 } 142 143 filteredByNetworkCidr := make([]*NsxtEdgeGatewayStaticRoute, 0) 144 for _, sr := range allStaticRoutes { 145 if sr.NsxtEdgeGatewayStaticRoute.NetworkCidr == networkCidr { 146 filteredByNetworkCidr = append(filteredByNetworkCidr, sr) 147 } 148 } 149 150 singleResult, err := oneOrError("networkCidr", networkCidr, filteredByNetworkCidr) 151 if err != nil { 152 return nil, err 153 } 154 155 return singleResult, nil 156 } 157 158 // GetStaticRouteByName retrieves Static Route by name 159 // 160 // Note. It will return an error if more than one items is found 161 func (egw *NsxtEdgeGateway) GetStaticRouteByName(name string) (*NsxtEdgeGatewayStaticRoute, error) { 162 if name == "" { 163 return nil, fmt.Errorf("cidr cannot be empty") 164 } 165 166 allStaticRoutes, err := egw.GetAllStaticRoutes(nil) 167 if err != nil { 168 return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route: %s", err) 169 } 170 171 filteredByNetworkName := make([]*NsxtEdgeGatewayStaticRoute, 0) 172 // First - filter by name 173 for _, sr := range allStaticRoutes { 174 if sr.NsxtEdgeGatewayStaticRoute.Name == name { 175 filteredByNetworkName = append(filteredByNetworkName, sr) 176 } 177 } 178 179 singleResult, err := oneOrError("name", name, filteredByNetworkName) 180 if err != nil { 181 return nil, err 182 } 183 184 return singleResult, nil 185 } 186 187 // GetStaticRouteById retrieves Static Route by given ID 188 func (egw *NsxtEdgeGateway) GetStaticRouteById(id string) (*NsxtEdgeGatewayStaticRoute, error) { 189 if id == "" { 190 return nil, fmt.Errorf("ID is required") 191 } 192 193 client := egw.client 194 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes 195 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 196 if err != nil { 197 return nil, err 198 } 199 200 // Insert Edge Gateway ID into endpoint path 201 urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID), id) 202 if err != nil { 203 return nil, err 204 } 205 206 returnObject := &NsxtEdgeGatewayStaticRoute{ 207 client: egw.client, 208 edgeGatewayId: egw.EdgeGateway.ID, 209 NsxtEdgeGatewayStaticRoute: &types.NsxtEdgeGatewayStaticRoute{}, 210 } 211 212 err = client.OpenApiGetItem(apiVersion, urlRef, nil, returnObject.NsxtEdgeGatewayStaticRoute, nil) 213 if err != nil { 214 return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route: %s", err) 215 } 216 217 return returnObject, nil 218 } 219 220 // Update Static Route 221 func (staticRoute *NsxtEdgeGatewayStaticRoute) Update(StaticRouteConfig *types.NsxtEdgeGatewayStaticRoute) (*NsxtEdgeGatewayStaticRoute, error) { 222 client := staticRoute.client 223 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes 224 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 225 if err != nil { 226 return nil, err 227 } 228 229 // Insert Edge Gateway ID into endpoint path 230 urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, staticRoute.edgeGatewayId), StaticRouteConfig.ID) 231 if err != nil { 232 return nil, err 233 } 234 235 returnObject := &NsxtEdgeGatewayStaticRoute{ 236 client: staticRoute.client, 237 edgeGatewayId: staticRoute.edgeGatewayId, 238 NsxtEdgeGatewayStaticRoute: &types.NsxtEdgeGatewayStaticRoute{}, 239 } 240 241 err = client.OpenApiPutItem(apiVersion, urlRef, nil, StaticRouteConfig, returnObject.NsxtEdgeGatewayStaticRoute, nil) 242 if err != nil { 243 return nil, fmt.Errorf("error setting NSX-T Edge Gateway Static Route: %s", err) 244 } 245 246 return returnObject, nil 247 } 248 249 // Delete Static Route 250 func (staticRoute *NsxtEdgeGatewayStaticRoute) Delete() error { 251 client := staticRoute.client 252 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes 253 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 254 if err != nil { 255 return err 256 } 257 258 // Insert Edge Gateway ID into endpoint path 259 urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, staticRoute.edgeGatewayId), staticRoute.NsxtEdgeGatewayStaticRoute.ID) 260 if err != nil { 261 return err 262 } 263 264 err = client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil) 265 if err != nil { 266 return fmt.Errorf("error deleting NSX-T Edge Gateway Static Route: %s", err) 267 } 268 269 return nil 270 }