github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/importable_dvpg.go (about) 1 /* 2 * Copyright 2023 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 // VcenterImportableDvpg is a read only structure that allows to get information about a Distributed 15 // Virtual Port Group (DVPG) network backing that is available for import. 16 // 17 // Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned. 18 type VcenterImportableDvpg struct { 19 VcenterImportableDvpg *types.VcenterImportableDvpg 20 client *Client 21 } 22 23 // GetVcenterImportableDvpgByName retrieves a DVPG by name 24 // 25 // Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned. 26 func (vcdClient *VCDClient) GetVcenterImportableDvpgByName(name string) (*VcenterImportableDvpg, error) { 27 if name == "" { 28 return nil, fmt.Errorf("empty importable Distributed Virtual Port Group Name specified") 29 } 30 31 vcImportableDvpgs, err := vcdClient.GetAllVcenterImportableDvpgs(nil) 32 if err != nil { 33 return nil, fmt.Errorf("could not find Distributed Virtual Port Group with Name '%s' for vCenter with ID '%s': %s", 34 name, "", err) 35 } 36 37 filteredVcImportableDvpgs := filterVcImportableDvpgsByName(name, vcImportableDvpgs) 38 39 return oneOrError("name", name, filteredVcImportableDvpgs) 40 } 41 42 // GetAllVcenterImportableDvpgs retrieves all DVPGs that are available for import. 43 // 44 // Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned. 45 func (vcdClient *VCDClient) GetAllVcenterImportableDvpgs(queryParameters url.Values) ([]*VcenterImportableDvpg, error) { 46 return getAllVcenterImportableDvpgs(&vcdClient.Client, queryParameters) 47 } 48 49 // GetVcenterImportableDvpgByName retrieves a DVPG that is available for import within the Org VDC. 50 func (vdc *Vdc) GetVcenterImportableDvpgByName(name string) (*VcenterImportableDvpg, error) { 51 if name == "" { 52 return nil, fmt.Errorf("empty importable Distributed Virtual Port Group Name specified") 53 } 54 55 vcImportableDvpgs, err := vdc.GetAllVcenterImportableDvpgs(nil) 56 if err != nil { 57 return nil, fmt.Errorf("could not find Distributed Virtual Port Group with name '%s': %s", name, err) 58 } 59 60 filteredVcImportableDvpgs := filterVcImportableDvpgsByName(name, vcImportableDvpgs) 61 62 return oneOrError("name", name, filteredVcImportableDvpgs) 63 } 64 65 // GetAllVcenterImportableDvpgs retrieves all DVPGs that are available for import within the Org VDC. 66 // 67 // Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned. 68 func (vdc *Vdc) GetAllVcenterImportableDvpgs(queryParameters url.Values) ([]*VcenterImportableDvpg, error) { 69 if vdc == nil || vdc.Vdc == nil || vdc.Vdc.ID == "" { 70 return nil, fmt.Errorf("cannot get Importable DVPGs without VDC ID") 71 } 72 73 queryParams := copyOrNewUrlValues(queryParameters) 74 queryParams = queryParameterFilterAnd("orgVdcId=="+vdc.Vdc.ID, queryParams) 75 76 return getAllVcenterImportableDvpgs(vdc.client, queryParams) 77 78 } 79 80 func getAllVcenterImportableDvpgs(client *Client, queryParameters url.Values) ([]*VcenterImportableDvpg, error) { 81 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointImportableDvpgs 82 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 83 if err != nil { 84 return nil, err 85 } 86 87 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 88 if err != nil { 89 return nil, err 90 } 91 92 queryParams := copyOrNewUrlValues(queryParameters) 93 94 typeResponses := []*types.VcenterImportableDvpg{{}} 95 err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParams, &typeResponses, nil) 96 if err != nil { 97 return nil, err 98 } 99 100 returnObjects := make([]*VcenterImportableDvpg, len(typeResponses)) 101 for sliceIndex := range typeResponses { 102 returnObjects[sliceIndex] = &VcenterImportableDvpg{ 103 VcenterImportableDvpg: typeResponses[sliceIndex], 104 client: client, 105 } 106 } 107 108 return returnObjects, nil 109 } 110 111 // filterVcImportableDvpgsByName is created as a fix for local filtering instead of using 112 // FIQL filter (because it does not support it). 113 func filterVcImportableDvpgsByName(name string, allNVcImportableDvpgs []*VcenterImportableDvpg) []*VcenterImportableDvpg { 114 filteredVcImportableDvpgs := make([]*VcenterImportableDvpg, 0) 115 for _, VcImportableDvpg := range allNVcImportableDvpgs { 116 if VcImportableDvpg.VcenterImportableDvpg.BackingRef.Name == name { 117 filteredVcImportableDvpgs = append(filteredVcImportableDvpgs, VcImportableDvpg) 118 } 119 } 120 121 return filteredVcImportableDvpgs 122 } 123 124 // Parent returns the port group parent switch 125 func (dvpg *VcenterImportableDvpg) Parent() *types.OpenApiReference { 126 return dvpg.VcenterImportableDvpg.DvSwitch.BackingRef 127 } 128 129 // UsableWith tells whether a given port group can be used with others to create a network pool 130 func (dvpg *VcenterImportableDvpg) UsableWith(others ...*VcenterImportableDvpg) bool { 131 // No items provided: assume false 132 if len(others) == 0 { 133 return false 134 } 135 // Only one item provided, and it is the same as the current port group: assume false 136 if len(others) == 1 && dvpg.VcenterImportableDvpg.BackingRef.ID == others[0].VcenterImportableDvpg.BackingRef.ID { 137 return false 138 } 139 for _, other := range others { 140 if dvpg.VcenterImportableDvpg.BackingRef.ID == others[0].VcenterImportableDvpg.BackingRef.ID { 141 continue 142 } 143 if dvpg.Parent().ID != other.Parent().ID { 144 return false 145 } 146 } 147 return true 148 }