forked from vmware/go-vcloud-director
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimportable_dvpg.go
122 lines (97 loc) · 4.42 KB
/
importable_dvpg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
* Copyright 2023 VMware, Inc. All rights reserved. Licensed under the Apache v2 License.
*/
package govcd
import (
"fmt"
"net/url"
"github.com/vmware/go-vcloud-director/v2/types/v56"
)
// VcenterImportableDvpg is a read only structure that allows to get information about a Distributed
// Virtual Port Group (DVPG) network backing that is available for import.
//
// Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned.
type VcenterImportableDvpg struct {
VcenterImportableDvpg *types.VcenterImportableDvpg
client *Client
}
// GetVcenterImportableDvpgByName retrieves a DVPG by name
//
// Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned.
func (vcdClient *VCDClient) GetVcenterImportableDvpgByName(name string) (*VcenterImportableDvpg, error) {
if name == "" {
return nil, fmt.Errorf("empty importable Distributed Virtual Port Group Name specified")
}
vcImportableDvpgs, err := vcdClient.GetAllVcenterImportableDvpgs(nil)
if err != nil {
return nil, fmt.Errorf("could not find Distributed Virtual Port Group with Name '%s' for vCenter with ID '%s': %s",
name, "", err)
}
filteredVcImportableDvpgs := filterVcImportableDvpgsByName(name, vcImportableDvpgs)
return oneOrError("name", name, filteredVcImportableDvpgs)
}
// GetAllVcenterImportableDvpgs retrieves all DVPGs that are available for import.
//
// Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned.
func (vcdClient *VCDClient) GetAllVcenterImportableDvpgs(queryParameters url.Values) ([]*VcenterImportableDvpg, error) {
return getAllVcenterImportableDvpgs(&vcdClient.Client, queryParameters)
}
// GetVcenterImportableDvpgByName retrieves a DVPG that is available for import within the Org VDC.
func (vdc *Vdc) GetVcenterImportableDvpgByName(name string) (*VcenterImportableDvpg, error) {
if name == "" {
return nil, fmt.Errorf("empty importable Distributed Virtual Port Group Name specified")
}
vcImportableDvpgs, err := vdc.GetAllVcenterImportableDvpgs(nil)
if err != nil {
return nil, fmt.Errorf("could not find Distributed Virtual Port Group with name '%s': %s", name, err)
}
filteredVcImportableDvpgs := filterVcImportableDvpgsByName(name, vcImportableDvpgs)
return oneOrError("name", name, filteredVcImportableDvpgs)
}
// GetAllVcenterImportableDvpgs retrieves all DVPGs that are available for import within the Org VDC.
//
// Note. API returns only unused DVPGs. If the DVPG is already consumed - it will not be returned.
func (vdc *Vdc) GetAllVcenterImportableDvpgs(queryParameters url.Values) ([]*VcenterImportableDvpg, error) {
if vdc == nil || vdc.Vdc == nil || vdc.Vdc.ID == "" {
return nil, fmt.Errorf("cannot get Importable DVPGs without VDC ID")
}
queryParams := copyOrNewUrlValues(queryParameters)
queryParams = queryParameterFilterAnd("orgVdcId=="+vdc.Vdc.ID, queryParams)
return getAllVcenterImportableDvpgs(vdc.client, queryParams)
}
func getAllVcenterImportableDvpgs(client *Client, queryParameters url.Values) ([]*VcenterImportableDvpg, error) {
endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointImportableDvpgs
apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
if err != nil {
return nil, err
}
urlRef, err := client.OpenApiBuildEndpoint(endpoint)
if err != nil {
return nil, err
}
queryParams := copyOrNewUrlValues(queryParameters)
typeResponses := []*types.VcenterImportableDvpg{{}}
err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParams, &typeResponses, nil)
if err != nil {
return nil, err
}
returnObjects := make([]*VcenterImportableDvpg, len(typeResponses))
for sliceIndex := range typeResponses {
returnObjects[sliceIndex] = &VcenterImportableDvpg{
VcenterImportableDvpg: typeResponses[sliceIndex],
client: client,
}
}
return returnObjects, nil
}
// filterVcImportableDvpgsByName is created as a fix for local filtering instead of using
// FIQL filter (because it does not support it).
func filterVcImportableDvpgsByName(name string, allNVcImportableDvpgs []*VcenterImportableDvpg) []*VcenterImportableDvpg {
filteredVcImportableDvpgs := make([]*VcenterImportableDvpg, 0)
for _, VcImportableDvpg := range allNVcImportableDvpgs {
if VcImportableDvpg.VcenterImportableDvpg.BackingRef.Name == name {
filteredVcImportableDvpgs = append(filteredVcImportableDvpgs, VcImportableDvpg)
}
}
return filteredVcImportableDvpgs
}