github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_alb_controllers.go (about) 1 /* 2 * Copyright 2021 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 3 */ 4 5 package govcd 6 7 import ( 8 "errors" 9 "fmt" 10 "net/url" 11 12 "github.com/vmware/go-vcloud-director/v2/types/v56" 13 ) 14 15 // NsxtAlbController helps to integrate VMware Cloud Director with NSX-T Advanced Load Balancer deployment. 16 // Controller instances are registered with VMware Cloud Director instance. Controller instances serve as a central 17 // control plane for the load-balancing services provided by NSX-T Advanced Load Balancer. 18 // To configure an NSX-T ALB one needs to supply AVI Controller endpoint, credentials and license to be used. 19 type NsxtAlbController struct { 20 NsxtAlbController *types.NsxtAlbController 21 vcdClient *VCDClient 22 } 23 24 // GetAllAlbControllers returns all configured NSX-T ALB Controllers 25 func (vcdClient *VCDClient) GetAllAlbControllers(queryParameters url.Values) ([]*NsxtAlbController, error) { 26 client := vcdClient.Client 27 if !client.IsSysAdmin { 28 return nil, errors.New("reading NSX-T ALB Controllers require System user") 29 } 30 31 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController 32 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 33 if err != nil { 34 return nil, err 35 } 36 37 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 38 if err != nil { 39 return nil, err 40 } 41 42 typeResponses := []*types.NsxtAlbController{{}} 43 err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParameters, &typeResponses, nil) 44 if err != nil { 45 return nil, err 46 } 47 48 // Wrap all typeResponses into NsxtAlbController types with client 49 wrappedResponses := make([]*NsxtAlbController, len(typeResponses)) 50 for sliceIndex := range typeResponses { 51 wrappedResponses[sliceIndex] = &NsxtAlbController{ 52 NsxtAlbController: typeResponses[sliceIndex], 53 vcdClient: vcdClient, 54 } 55 } 56 57 return wrappedResponses, nil 58 } 59 60 // GetAlbControllerByName returns NSX-T ALB Controller by Name 61 func (vcdClient *VCDClient) GetAlbControllerByName(name string) (*NsxtAlbController, error) { 62 queryParameters := copyOrNewUrlValues(nil) 63 queryParameters.Add("filter", "name=="+name) 64 65 controllers, err := vcdClient.GetAllAlbControllers(queryParameters) 66 if err != nil { 67 return nil, fmt.Errorf("error reading ALB Controller with Name '%s': %s", name, err) 68 } 69 70 if len(controllers) == 0 { 71 return nil, fmt.Errorf("%s: could not find ALB Controller with Name '%s'", ErrorEntityNotFound, name) 72 } 73 74 if len(controllers) > 1 { 75 return nil, fmt.Errorf("found more than 1 ALB Controller with Name '%s'", name) 76 } 77 78 return controllers[0], nil 79 } 80 81 // GetAlbControllerById returns NSX-T ALB Controller by ID 82 func (vcdClient *VCDClient) GetAlbControllerById(id string) (*NsxtAlbController, error) { 83 client := vcdClient.Client 84 if !client.IsSysAdmin { 85 return nil, errors.New("reading NSX-T ALB Controllers require System user") 86 } 87 88 if id == "" { 89 return nil, fmt.Errorf("ID is required to lookup NSX-T ALB Controller by ID") 90 } 91 92 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController 93 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 94 if err != nil { 95 return nil, err 96 } 97 98 urlRef, err := client.OpenApiBuildEndpoint(endpoint, id) 99 if err != nil { 100 return nil, err 101 } 102 103 typeResponse := &types.NsxtAlbController{} 104 err = client.OpenApiGetItem(apiVersion, urlRef, nil, &typeResponse, nil) 105 if err != nil { 106 return nil, err 107 } 108 109 wrappedResponse := &NsxtAlbController{ 110 NsxtAlbController: typeResponse, 111 vcdClient: vcdClient, 112 } 113 114 return wrappedResponse, nil 115 } 116 117 // GetAlbControllerByUrl returns configured ALB Controller by URL 118 // 119 // Note. Filtering is performed on client side. 120 func (vcdClient *VCDClient) GetAlbControllerByUrl(url string) (*NsxtAlbController, error) { 121 // Ideally this function could filter on VCD side, but API does not support filtering on URL 122 controllers, err := vcdClient.GetAllAlbControllers(nil) 123 if err != nil { 124 return nil, fmt.Errorf("error reading ALB Controller with Url '%s': %s", url, err) 125 } 126 127 // Search for controllers 128 filteredControllers := make([]*NsxtAlbController, 0) 129 for _, controller := range controllers { 130 if controller.NsxtAlbController.Url == url { 131 filteredControllers = append(filteredControllers, controller) 132 } 133 } 134 135 return oneOrError("url", url, filteredControllers) 136 } 137 138 // CreateNsxtAlbController creates controller with supplied albControllerConfig configuration 139 func (vcdClient *VCDClient) CreateNsxtAlbController(albControllerConfig *types.NsxtAlbController) (*NsxtAlbController, error) { 140 client := vcdClient.Client 141 if !client.IsSysAdmin { 142 return nil, errors.New("handling NSX-T ALB Controllers require System user") 143 } 144 145 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController 146 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 147 if err != nil { 148 return nil, err 149 } 150 151 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 152 if err != nil { 153 return nil, err 154 } 155 156 returnObject := &NsxtAlbController{ 157 NsxtAlbController: &types.NsxtAlbController{}, 158 vcdClient: vcdClient, 159 } 160 161 err = client.OpenApiPostItem(apiVersion, urlRef, nil, albControllerConfig, returnObject.NsxtAlbController, nil) 162 if err != nil { 163 return nil, fmt.Errorf("error creating NSX-T ALB Controller: %s", err) 164 } 165 166 return returnObject, nil 167 } 168 169 // Update updates existing NSX-T ALB Controller with new supplied albControllerConfig configuration 170 func (nsxtAlbController *NsxtAlbController) Update(albControllerConfig *types.NsxtAlbController) (*NsxtAlbController, error) { 171 client := nsxtAlbController.vcdClient.Client 172 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController 173 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 174 if err != nil { 175 return nil, err 176 } 177 178 if albControllerConfig.ID == "" { 179 return nil, fmt.Errorf("cannot update NSX-T ALB Controller without ID") 180 } 181 182 urlRef, err := client.OpenApiBuildEndpoint(endpoint, albControllerConfig.ID) 183 if err != nil { 184 return nil, err 185 } 186 187 responseAlbController := &NsxtAlbController{ 188 NsxtAlbController: &types.NsxtAlbController{}, 189 vcdClient: nsxtAlbController.vcdClient, 190 } 191 192 err = client.OpenApiPutItem(apiVersion, urlRef, nil, albControllerConfig, responseAlbController.NsxtAlbController, nil) 193 if err != nil { 194 return nil, fmt.Errorf("error updating NSX-T ALB Controller: %s", err) 195 } 196 197 return responseAlbController, nil 198 } 199 200 // Delete deletes existing NSX-T ALB Controller 201 func (nsxtAlbController *NsxtAlbController) Delete() error { 202 client := nsxtAlbController.vcdClient.Client 203 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController 204 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 205 if err != nil { 206 return err 207 } 208 209 if nsxtAlbController.NsxtAlbController.ID == "" { 210 return fmt.Errorf("cannot delete NSX-T ALB Controller without ID") 211 } 212 213 urlRef, err := client.OpenApiBuildEndpoint(endpoint, nsxtAlbController.NsxtAlbController.ID) 214 if err != nil { 215 return err 216 } 217 218 err = client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil) 219 if err != nil { 220 return fmt.Errorf("error deleting NSX-T ALB Controller: %s", err) 221 } 222 223 return nil 224 }