|
| 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 | + "github.com/vmware/go-vcloud-director/v2/types/v56" |
| 10 | +) |
| 11 | + |
| 12 | +// GetNsxtRouteAdvertisementWithContext retrieves the list of subnets that will be advertised so that the Edge Gateway can route |
| 13 | +// out to the connected external network. |
| 14 | +func (egw *NsxtEdgeGateway) GetNsxtRouteAdvertisementWithContext(useTenantContext bool) (*types.RouteAdvertisement, error) { |
| 15 | + err := checkSanityNsxtEdgeGatewayRouteAdvertisement(egw) |
| 16 | + if err != nil { |
| 17 | + return nil, err |
| 18 | + } |
| 19 | + |
| 20 | + endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtRouteAdvertisement |
| 21 | + |
| 22 | + highestApiVersion, err := egw.client.getOpenApiHighestElevatedVersion(endpoint) |
| 23 | + if err != nil { |
| 24 | + return nil, err |
| 25 | + } |
| 26 | + |
| 27 | + urlRef, err := egw.client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID)) |
| 28 | + if err != nil { |
| 29 | + return nil, err |
| 30 | + } |
| 31 | + |
| 32 | + var tenantContextHeaders map[string]string |
| 33 | + if useTenantContext { |
| 34 | + tenantContext, err := egw.getTenantContext() |
| 35 | + if err != nil { |
| 36 | + return nil, err |
| 37 | + } |
| 38 | + |
| 39 | + tenantContextHeaders = getTenantContextHeader(tenantContext) |
| 40 | + } |
| 41 | + |
| 42 | + routeAdvertisement := &types.RouteAdvertisement{} |
| 43 | + err = egw.client.OpenApiGetItem(highestApiVersion, urlRef, nil, routeAdvertisement, tenantContextHeaders) |
| 44 | + if err != nil { |
| 45 | + return nil, err |
| 46 | + } |
| 47 | + |
| 48 | + return routeAdvertisement, nil |
| 49 | +} |
| 50 | + |
| 51 | +// GetNsxtRouteAdvertisement method is the same as GetNsxtRouteAdvertisementWithContext but sending TenantContext by default |
| 52 | +func (egw *NsxtEdgeGateway) GetNsxtRouteAdvertisement() (*types.RouteAdvertisement, error) { |
| 53 | + return egw.GetNsxtRouteAdvertisementWithContext(true) |
| 54 | +} |
| 55 | + |
| 56 | +// UpdateNsxtRouteAdvertisementWithContext updates the list of subnets that will be advertised so that the Edge Gateway can route |
| 57 | +// out to the connected external network. |
| 58 | +func (egw *NsxtEdgeGateway) UpdateNsxtRouteAdvertisementWithContext(enable bool, subnets []string, useTenantContext bool) (*types.RouteAdvertisement, error) { |
| 59 | + err := checkSanityNsxtEdgeGatewayRouteAdvertisement(egw) |
| 60 | + if err != nil { |
| 61 | + return nil, err |
| 62 | + } |
| 63 | + |
| 64 | + endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointNsxtRouteAdvertisement |
| 65 | + |
| 66 | + highestApiVersion, err := egw.client.getOpenApiHighestElevatedVersion(endpoint) |
| 67 | + if err != nil { |
| 68 | + return nil, err |
| 69 | + } |
| 70 | + |
| 71 | + urlRef, err := egw.client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID)) |
| 72 | + if err != nil { |
| 73 | + return nil, err |
| 74 | + } |
| 75 | + |
| 76 | + var tenantContextHeaders map[string]string |
| 77 | + if useTenantContext { |
| 78 | + tenantContext, err := egw.getTenantContext() |
| 79 | + if err != nil { |
| 80 | + return nil, err |
| 81 | + } |
| 82 | + |
| 83 | + tenantContextHeaders = getTenantContextHeader(tenantContext) |
| 84 | + } |
| 85 | + |
| 86 | + routeAdvertisement := &types.RouteAdvertisement{ |
| 87 | + Enable: enable, |
| 88 | + Subnets: subnets, |
| 89 | + } |
| 90 | + |
| 91 | + err = egw.client.OpenApiPutItem(highestApiVersion, urlRef, nil, routeAdvertisement, nil, tenantContextHeaders) |
| 92 | + if err != nil { |
| 93 | + return nil, err |
| 94 | + } |
| 95 | + |
| 96 | + return egw.GetNsxtRouteAdvertisementWithContext(useTenantContext) |
| 97 | +} |
| 98 | + |
| 99 | +// UpdateNsxtRouteAdvertisement method is the same as UpdateNsxtRouteAdvertisementWithContext but sending TenantContext by default |
| 100 | +func (egw *NsxtEdgeGateway) UpdateNsxtRouteAdvertisement(enable bool, subnets []string) (*types.RouteAdvertisement, error) { |
| 101 | + return egw.UpdateNsxtRouteAdvertisementWithContext(enable, subnets, true) |
| 102 | +} |
| 103 | + |
| 104 | +// DeleteNsxtRouteAdvertisementWithContext deletes the list of subnets that will be advertised. |
| 105 | +func (egw *NsxtEdgeGateway) DeleteNsxtRouteAdvertisementWithContext(useTenantContext bool) error { |
| 106 | + _, err := egw.UpdateNsxtRouteAdvertisementWithContext(false, []string{}, useTenantContext) |
| 107 | + return err |
| 108 | +} |
| 109 | + |
| 110 | +// DeleteNsxtRouteAdvertisement method is the same as DeleteNsxtRouteAdvertisementWithContext but sending TenantContext by default |
| 111 | +func (egw *NsxtEdgeGateway) DeleteNsxtRouteAdvertisement() error { |
| 112 | + return egw.DeleteNsxtRouteAdvertisementWithContext(true) |
| 113 | +} |
| 114 | + |
| 115 | +// checkSanityNsxtEdgeGatewayRouteAdvertisement function performs some checks to *NsxtEdgeGateway parameter and returns error |
| 116 | +// if something is wrong. It is useful with methods NsxtEdgeGateway.[Get/Update/Delete]NsxtRouteAdvertisement |
| 117 | +func checkSanityNsxtEdgeGatewayRouteAdvertisement(egw *NsxtEdgeGateway) error { |
| 118 | + if egw.EdgeGateway == nil { |
| 119 | + return fmt.Errorf("the EdgeGateway pointer is nil. Please initialize it first before using this method") |
| 120 | + } |
| 121 | + |
| 122 | + if egw.EdgeGateway.ID == "" { |
| 123 | + return fmt.Errorf("the EdgeGateway ID is empty. Please initialize it first before using this method") |
| 124 | + } |
| 125 | + |
| 126 | + return nil |
| 127 | +} |
0 commit comments