github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_alb_service_engine_groups.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 // NsxtAlbServiceEngineGroup provides virtual service management capabilities for tenants. This entity can be created 16 // by referencing a backing importable service engine group - NsxtAlbImportableServiceEngineGroups. 17 // 18 // A service engine group is an isolation domain that also defines shared service engine properties, such as size, 19 // network access, and failover. Resources in a service engine group can be used for different virtual services, 20 // depending on your tenant needs. These resources cannot be shared between different service engine groups. 21 type NsxtAlbServiceEngineGroup struct { 22 NsxtAlbServiceEngineGroup *types.NsxtAlbServiceEngineGroup 23 vcdClient *VCDClient 24 } 25 26 // GetAllAlbServiceEngineGroups retrieves NSX-T ALB Service Engines with possible filters 27 // 28 // Context is not mandatory for this resource. Supported contexts are: 29 // * Gateway ID (_context==gatewayId) - returns all Load Balancer Service Engine Groups that are accessible to the 30 // gateway. 31 // * Assignable Gateway ID (_context=gatewayId;_context==assignable) returns all Load Balancer Service Engine Groups 32 // that are assignable to the gateway. This filters out any Load Balancer Service Engine groups that are already 33 // assigned to the gateway or assigned to another gateway if the reservation type is 'DEDICATED’. 34 func (vcdClient *VCDClient) GetAllAlbServiceEngineGroups(context string, queryParameters url.Values) ([]*NsxtAlbServiceEngineGroup, error) { 35 client := vcdClient.Client 36 37 if !client.IsSysAdmin { 38 return nil, errors.New("handling NSX-T ALB Service Engine Groups require System user") 39 } 40 41 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups 42 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 43 if err != nil { 44 return nil, err 45 } 46 47 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 48 if err != nil { 49 return nil, err 50 } 51 52 queryParams := copyOrNewUrlValues(queryParameters) 53 if context != "" { 54 queryParams = queryParameterFilterAnd(fmt.Sprintf("_context==%s", context), queryParams) 55 } 56 typeResponses := []*types.NsxtAlbServiceEngineGroup{{}} 57 58 err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParams, &typeResponses, nil) 59 if err != nil { 60 return nil, err 61 } 62 63 wrappedResponses := make([]*NsxtAlbServiceEngineGroup, len(typeResponses)) 64 for sliceIndex := range typeResponses { 65 wrappedResponses[sliceIndex] = &NsxtAlbServiceEngineGroup{ 66 NsxtAlbServiceEngineGroup: typeResponses[sliceIndex], 67 vcdClient: vcdClient, 68 } 69 } 70 71 return wrappedResponses, nil 72 } 73 74 // GetAlbServiceEngineGroupByName returns NSX-T ALB Service Engine by Name 75 // Context is not mandatory for this resource. Supported contexts are: 76 // * Gateway ID (_context==gatewayId) - returns all Load Balancer Service Engine Groups that are accessible to the 77 // gateway. 78 // * Assignable Gateway ID (_context=gatewayId;_context==assignable) returns all Load Balancer Service Engine Groups 79 // that are assignable to the gateway. This filters out any Load Balancer Service Engine groups that are already 80 // assigned to the gateway or assigned to another gateway if the reservation type is 'DEDICATED’. 81 func (vcdClient *VCDClient) GetAlbServiceEngineGroupByName(optionalContext, name string) (*NsxtAlbServiceEngineGroup, error) { 82 queryParams := copyOrNewUrlValues(nil) 83 if optionalContext != "" { 84 queryParams = queryParameterFilterAnd(fmt.Sprintf("_context==%s", optionalContext), queryParams) 85 } 86 queryParams.Add("filter", fmt.Sprintf("name==%s", name)) 87 88 albSeGroups, err := vcdClient.GetAllAlbServiceEngineGroups("", queryParams) 89 if err != nil { 90 return nil, fmt.Errorf("error retrieving NSX-T ALB Service Engine Group By Name '%s': %s", name, err) 91 } 92 93 if len(albSeGroups) == 0 { 94 return nil, fmt.Errorf("%s", ErrorEntityNotFound) 95 } 96 97 if len(albSeGroups) > 1 { 98 return nil, fmt.Errorf("more than 1 NSX-T ALB Service Engine Group with Name '%s' found", name) 99 } 100 101 return albSeGroups[0], nil 102 } 103 104 // GetAlbServiceEngineGroupById returns importable NSX-T ALB Cloud by ID 105 func (vcdClient *VCDClient) GetAlbServiceEngineGroupById(id string) (*NsxtAlbServiceEngineGroup, error) { 106 client := vcdClient.Client 107 108 if !client.IsSysAdmin { 109 return nil, errors.New("handling NSX-T ALB Service Engine Groups require System user") 110 } 111 112 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups 113 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 114 if err != nil { 115 return nil, err 116 } 117 118 urlRef, err := client.OpenApiBuildEndpoint(endpoint, id) 119 if err != nil { 120 return nil, err 121 } 122 123 typeResponse := &types.NsxtAlbServiceEngineGroup{} 124 125 err = client.OpenApiGetItem(apiVersion, urlRef, nil, &typeResponse, nil) 126 if err != nil { 127 return nil, err 128 } 129 130 wrappedResponse := &NsxtAlbServiceEngineGroup{ 131 NsxtAlbServiceEngineGroup: typeResponse, 132 vcdClient: vcdClient, 133 } 134 135 return wrappedResponse, nil 136 } 137 138 func (vcdClient *VCDClient) CreateNsxtAlbServiceEngineGroup(albServiceEngineGroup *types.NsxtAlbServiceEngineGroup) (*NsxtAlbServiceEngineGroup, error) { 139 client := vcdClient.Client 140 if !client.IsSysAdmin { 141 return nil, errors.New("handling NSX-T ALB Service Engine Groups require System user") 142 } 143 144 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups 145 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 146 if err != nil { 147 return nil, err 148 } 149 150 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 151 if err != nil { 152 return nil, err 153 } 154 155 returnObject := &NsxtAlbServiceEngineGroup{ 156 NsxtAlbServiceEngineGroup: &types.NsxtAlbServiceEngineGroup{}, 157 vcdClient: vcdClient, 158 } 159 160 err = client.OpenApiPostItem(apiVersion, urlRef, nil, albServiceEngineGroup, returnObject.NsxtAlbServiceEngineGroup, nil) 161 if err != nil { 162 return nil, fmt.Errorf("error creating NSX-T ALB Service Engine Group: %s", err) 163 } 164 165 return returnObject, nil 166 } 167 168 // Update updates existing ALB Controller with new supplied albControllerConfig configuration 169 func (nsxtAlbServiceEngineGroup *NsxtAlbServiceEngineGroup) Update(albSEGroupConfig *types.NsxtAlbServiceEngineGroup) (*NsxtAlbServiceEngineGroup, error) { 170 client := nsxtAlbServiceEngineGroup.vcdClient.Client 171 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups 172 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 173 if err != nil { 174 return nil, err 175 } 176 177 if albSEGroupConfig.ID == "" { 178 return nil, fmt.Errorf("cannot update NSX-T ALB Service Engine Group without ID") 179 } 180 181 urlRef, err := client.OpenApiBuildEndpoint(endpoint, albSEGroupConfig.ID) 182 if err != nil { 183 return nil, err 184 } 185 186 responseAlbController := &NsxtAlbServiceEngineGroup{ 187 NsxtAlbServiceEngineGroup: &types.NsxtAlbServiceEngineGroup{}, 188 vcdClient: nsxtAlbServiceEngineGroup.vcdClient, 189 } 190 191 err = client.OpenApiPutItem(apiVersion, urlRef, nil, albSEGroupConfig, responseAlbController.NsxtAlbServiceEngineGroup, nil) 192 if err != nil { 193 return nil, fmt.Errorf("error updating NSX-T ALB Service Engine Group: %s", err) 194 } 195 196 return responseAlbController, nil 197 } 198 199 // Delete deletes NSX-T ALB Service Engine Group configuration 200 func (nsxtAlbServiceEngineGroup *NsxtAlbServiceEngineGroup) Delete() error { 201 client := nsxtAlbServiceEngineGroup.vcdClient.Client 202 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups 203 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 204 if err != nil { 205 return err 206 } 207 208 if nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID == "" { 209 return fmt.Errorf("cannot delete NSX-T ALB Service Engine Group without ID") 210 } 211 212 urlRef, err := client.OpenApiBuildEndpoint(endpoint, nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID) 213 if err != nil { 214 return err 215 } 216 217 err = client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil) 218 if err != nil { 219 return fmt.Errorf("error deleting NSX-T ALB Service Engine Group: %s", err) 220 } 221 222 return nil 223 } 224 225 // Sync syncs a specified Load Balancer Service Engine Group. It requests the HA mode and the maximum number of 226 // supported Virtual Services for this Service Engine Group from the Load Balancer, and updates vCD's local record of 227 // these properties. 228 func (nsxtAlbServiceEngineGroup *NsxtAlbServiceEngineGroup) Sync() error { 229 client := nsxtAlbServiceEngineGroup.vcdClient.Client 230 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups 231 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 232 if err != nil { 233 return err 234 } 235 236 if nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID == "" { 237 return fmt.Errorf("cannot sync NSX-T ALB Service Engine Group without ID") 238 } 239 240 urlRef, err := client.OpenApiBuildEndpoint(endpoint, nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID, "/sync") 241 if err != nil { 242 return err 243 } 244 245 task, err := client.OpenApiPostItemAsync(apiVersion, urlRef, nil, nil) 246 if err != nil { 247 return fmt.Errorf("error syncing NSX-T ALB Service Engine Group: %s", err) 248 } 249 250 err = task.WaitTaskCompletion() 251 if err != nil { 252 return fmt.Errorf("sync task for NSX-T ALB Service Engine Group failed: %s", err) 253 } 254 255 return nil 256 }