github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/external_network_v2.go (about) 1 /* 2 * Copyright 2020 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 // ExternalNetworkV2 is a type for version 2 of external network which uses OpenAPI endpoint to 15 // manage external networks of both types (NSX-V and NSX-T) 16 type ExternalNetworkV2 struct { 17 ExternalNetwork *types.ExternalNetworkV2 18 client *Client 19 } 20 21 // CreateExternalNetworkV2 creates a new external network using OpenAPI endpoint. It can create 22 // NSX-V and NSX-T backed networks based on what ExternalNetworkV2.NetworkBackings is 23 // provided. types.ExternalNetworkV2 has documented fields. 24 func CreateExternalNetworkV2(vcdClient *VCDClient, newExtNet *types.ExternalNetworkV2) (*ExternalNetworkV2, error) { 25 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointExternalNetworks 26 apiVersion, err := vcdClient.Client.getOpenApiHighestElevatedVersion(endpoint) 27 if err != nil { 28 return nil, err 29 } 30 31 urlRef, err := vcdClient.Client.OpenApiBuildEndpoint(endpoint) 32 if err != nil { 33 return nil, err 34 } 35 36 returnExtNet := &ExternalNetworkV2{ 37 ExternalNetwork: &types.ExternalNetworkV2{}, 38 client: &vcdClient.Client, 39 } 40 41 err = vcdClient.Client.OpenApiPostItem(apiVersion, urlRef, nil, newExtNet, returnExtNet.ExternalNetwork, nil) 42 if err != nil { 43 return nil, fmt.Errorf("error creating external network: %s", err) 44 } 45 46 return returnExtNet, nil 47 } 48 49 // GetExternalNetworkV2ById retrieves external network by given ID using OpenAPI endpoint 50 func GetExternalNetworkV2ById(vcdClient *VCDClient, id string) (*ExternalNetworkV2, error) { 51 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointExternalNetworks 52 apiVersion, err := vcdClient.Client.getOpenApiHighestElevatedVersion(endpoint) 53 if err != nil { 54 return nil, err 55 } 56 57 if id == "" { 58 return nil, fmt.Errorf("empty external network id") 59 } 60 61 urlRef, err := vcdClient.Client.OpenApiBuildEndpoint(endpoint, id) 62 if err != nil { 63 return nil, err 64 } 65 66 extNet := &ExternalNetworkV2{ 67 ExternalNetwork: &types.ExternalNetworkV2{}, 68 client: &vcdClient.Client, 69 } 70 71 err = vcdClient.Client.OpenApiGetItem(apiVersion, urlRef, nil, extNet.ExternalNetwork, nil) 72 if err != nil { 73 return nil, err 74 } 75 76 return extNet, nil 77 } 78 79 // GetExternalNetworkV2ByName retrieves external network by given name using OpenAPI endpoint. 80 // Returns an error if not exactly one network is found. 81 func GetExternalNetworkV2ByName(vcdClient *VCDClient, name string) (*ExternalNetworkV2, error) { 82 83 if name == "" { 84 return nil, fmt.Errorf("name cannot be empty") 85 } 86 87 queryParams := url.Values{} 88 queryParams.Add("filter", "name=="+name) 89 90 res, err := GetAllExternalNetworksV2(vcdClient, queryParams) 91 if err != nil { 92 return nil, fmt.Errorf("could not find external network by name: %s", err) 93 } 94 95 if len(res) == 0 { 96 return nil, fmt.Errorf("%s: expected exactly one external network with name '%s'. Got %d", ErrorEntityNotFound, name, len(res)) 97 } 98 99 if len(res) > 1 { 100 return nil, fmt.Errorf("expected exactly one external network with name '%s'. Got %d", name, len(res)) 101 } 102 103 return res[0], nil 104 } 105 106 // GetAllExternalNetworksV2 retrieves all external networks using OpenAPI endpoint. Query parameters can be supplied to 107 // perform additional filtering 108 func GetAllExternalNetworksV2(vcdClient *VCDClient, queryParameters url.Values) ([]*ExternalNetworkV2, error) { 109 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointExternalNetworks 110 apiVersion, err := vcdClient.Client.getOpenApiHighestElevatedVersion(endpoint) 111 if err != nil { 112 return nil, err 113 } 114 115 urlRef, err := vcdClient.Client.OpenApiBuildEndpoint(endpoint) 116 if err != nil { 117 return nil, err 118 } 119 120 typeResponses := []*types.ExternalNetworkV2{{}} 121 err = vcdClient.Client.OpenApiGetAllItems(apiVersion, urlRef, queryParameters, &typeResponses, nil) 122 if err != nil { 123 return nil, err 124 } 125 126 // Wrap all typeResponses into external network types with client 127 returnExtNetworks := make([]*ExternalNetworkV2, len(typeResponses)) 128 for sliceIndex := range typeResponses { 129 returnExtNetworks[sliceIndex] = &ExternalNetworkV2{ 130 ExternalNetwork: typeResponses[sliceIndex], 131 client: &vcdClient.Client, 132 } 133 } 134 135 return returnExtNetworks, nil 136 } 137 138 // Update updates existing external network using OpenAPI endpoint 139 func (extNet *ExternalNetworkV2) Update() (*ExternalNetworkV2, error) { 140 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointExternalNetworks 141 apiVersion, err := extNet.client.getOpenApiHighestElevatedVersion(endpoint) 142 if err != nil { 143 return nil, err 144 } 145 146 if extNet.ExternalNetwork.ID == "" { 147 return nil, fmt.Errorf("cannot update external network without id") 148 } 149 150 urlRef, err := extNet.client.OpenApiBuildEndpoint(endpoint, extNet.ExternalNetwork.ID) 151 if err != nil { 152 return nil, err 153 } 154 155 returnExtNet := &ExternalNetworkV2{ 156 ExternalNetwork: &types.ExternalNetworkV2{}, 157 client: extNet.client, 158 } 159 160 err = extNet.client.OpenApiPutItem(apiVersion, urlRef, nil, extNet.ExternalNetwork, returnExtNet.ExternalNetwork, nil) 161 if err != nil { 162 return nil, fmt.Errorf("error updating external network: %s", err) 163 } 164 165 return returnExtNet, nil 166 } 167 168 // Delete deletes external network using OpenAPI endpoint 169 func (extNet *ExternalNetworkV2) Delete() error { 170 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointExternalNetworks 171 apiVersion, err := extNet.client.getOpenApiHighestElevatedVersion(endpoint) 172 if err != nil { 173 return err 174 } 175 176 if extNet.ExternalNetwork.ID == "" { 177 return fmt.Errorf("cannot delete external network without id") 178 } 179 180 urlRef, err := extNet.client.OpenApiBuildEndpoint(endpoint, extNet.ExternalNetwork.ID) 181 if err != nil { 182 return err 183 } 184 185 err = extNet.client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil) 186 187 if err != nil { 188 return fmt.Errorf("error deleting extNet: %s", err) 189 } 190 191 return nil 192 }