/
importable_dvpg.go
148 lines (121 loc) · 5.28 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
* 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
}
// Parent returns the port group parent switch
func (dvpg *VcenterImportableDvpg) Parent() *types.OpenApiReference {
return dvpg.VcenterImportableDvpg.DvSwitch.BackingRef
}
// UsableWith tells whether a given port group can be used with others to create a network pool
func (dvpg *VcenterImportableDvpg) UsableWith(others ...*VcenterImportableDvpg) bool {
// No items provided: assume false
if len(others) == 0 {
return false
}
// Only one item provided, and it is the same as the current port group: assume false
if len(others) == 1 && dvpg.VcenterImportableDvpg.BackingRef.ID == others[0].VcenterImportableDvpg.BackingRef.ID {
return false
}
for _, other := range others {
if dvpg.VcenterImportableDvpg.BackingRef.ID == others[0].VcenterImportableDvpg.BackingRef.ID {
continue
}
if dvpg.Parent().ID != other.Parent().ID {
return false
}
}
return true
}