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  }