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  }