github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/rights.go (about)

     1  /*
     2   * Copyright 2021 VMware, Inc.  All rights reserved.  Licensed under the Apache v2 License.
     3   */
     4  package govcd
     5  
     6  import (
     7  	"fmt"
     8  	"net/url"
     9  	"strings"
    10  
    11  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    12  )
    13  
    14  // getAllRights retrieves all rights. Query parameters can be supplied to perform additional
    15  // filtering
    16  func getAllRights(client *Client, queryParameters url.Values, additionalHeader map[string]string) ([]*types.Right, error) {
    17  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRights
    18  	minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint)
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	urlRef, err := client.OpenApiBuildEndpoint(endpoint)
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	typeResponses := []*types.Right{{}}
    29  	err = client.OpenApiGetAllItems(minimumApiVersion, urlRef, queryParameters, &typeResponses, additionalHeader)
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	return typeResponses, nil
    35  }
    36  
    37  // GetAllRights retrieves all available rights.
    38  // Query parameters can be supplied to perform additional filtering
    39  func (client *Client) GetAllRights(queryParameters url.Values) ([]*types.Right, error) {
    40  	return getAllRights(client, queryParameters, nil)
    41  }
    42  
    43  // GetAllRights retrieves all available rights. Query parameters can be supplied to perform additional
    44  // filtering
    45  func (adminOrg *AdminOrg) GetAllRights(queryParameters url.Values) ([]*types.Right, error) {
    46  	tenantContext, err := adminOrg.getTenantContext()
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	return getAllRights(adminOrg.client, queryParameters, getTenantContextHeader(tenantContext))
    51  }
    52  
    53  // getRights retrieves rights belonging to a given Role or similar container (global role, rights bundle).
    54  // Query parameters can be supplied to perform additional filtering
    55  func getRights(client *Client, roleId, endpoint string, queryParameters url.Values, additionalHeader map[string]string) ([]*types.Right, error) {
    56  	minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	urlRef, err := client.OpenApiBuildEndpoint(endpoint + roleId + "/rights")
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  
    66  	typeResponses := []*types.Right{{}}
    67  	err = client.OpenApiGetAllItems(minimumApiVersion, urlRef, queryParameters, &typeResponses, additionalHeader)
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  
    72  	return typeResponses, nil
    73  }
    74  
    75  // GetRights retrieves all rights belonging to a given Role. Query parameters can be supplied to perform additional
    76  // filtering
    77  func (role *Role) GetRights(queryParameters url.Values) ([]*types.Right, error) {
    78  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRoles
    79  	return getRights(role.client, role.Role.ID, endpoint, queryParameters, getTenantContextHeader(role.TenantContext))
    80  }
    81  
    82  // getRightByName retrieves a right by given name
    83  func getRightByName(client *Client, name string, additionalHeader map[string]string) (*types.Right, error) {
    84  	var params = url.Values{}
    85  
    86  	slowSearch := false
    87  
    88  	// When the right name contains commas or semicolons, the encoding is rejected by the API.
    89  	// For this reason, when one or more commas or semicolons are present (6 occurrences in more than 300 right names)
    90  	// we run the search brute force, by fetching all the rights, and comparing the names.
    91  	// This problem should be fixed in 10.3
    92  	// TODO: revisit this function after 10.3 is released
    93  	if strings.Contains(name, ",") || strings.Contains(name, ";") {
    94  		slowSearch = true
    95  	} else {
    96  		params.Set("filter", "name=="+name)
    97  	}
    98  	rights, err := getAllRights(client, params, additionalHeader)
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  	if len(rights) == 0 {
   103  		return nil, ErrorEntityNotFound
   104  	}
   105  
   106  	if slowSearch {
   107  		for _, right := range rights {
   108  			if right.Name == name {
   109  				return right, nil
   110  			}
   111  		}
   112  		return nil, ErrorEntityNotFound
   113  	}
   114  
   115  	if len(rights) > 1 {
   116  		return nil, fmt.Errorf("more than one right found with name '%s'", name)
   117  	}
   118  	return rights[0], nil
   119  }
   120  
   121  // GetRightByName retrieves right by given name
   122  func (client *Client) GetRightByName(name string) (*types.Right, error) {
   123  	return getRightByName(client, name, nil)
   124  }
   125  
   126  // GetRightByName retrieves right by given name
   127  func (adminOrg *AdminOrg) GetRightByName(name string) (*types.Right, error) {
   128  	tenantContext, err := adminOrg.getTenantContext()
   129  	if err != nil {
   130  		return nil, err
   131  	}
   132  	return getRightByName(adminOrg.client, name, getTenantContextHeader(tenantContext))
   133  }
   134  
   135  func getRightById(client *Client, id string, additionalHeader map[string]string) (*types.Right, error) {
   136  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRights
   137  	minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint)
   138  	if err != nil {
   139  		return nil, err
   140  	}
   141  
   142  	if id == "" {
   143  		return nil, fmt.Errorf("empty role id")
   144  	}
   145  
   146  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, id)
   147  	if err != nil {
   148  		return nil, err
   149  	}
   150  
   151  	right := &types.Right{}
   152  
   153  	err = client.OpenApiGetItem(minimumApiVersion, urlRef, nil, right, additionalHeader)
   154  	if err != nil {
   155  		return nil, err
   156  	}
   157  
   158  	return right, nil
   159  }
   160  
   161  func (client *Client) GetRightById(id string) (*types.Right, error) {
   162  	return getRightById(client, id, nil)
   163  }
   164  
   165  func (adminOrg *AdminOrg) GetRightById(id string) (*types.Right, error) {
   166  	tenantContext, err := adminOrg.getTenantContext()
   167  	if err != nil {
   168  		return nil, err
   169  	}
   170  	return getRightById(adminOrg.client, id, getTenantContextHeader(tenantContext))
   171  }
   172  
   173  // getAllRightsCategories retrieves all rights categories. Query parameters can be supplied to perform additional
   174  // filtering
   175  func getAllRightsCategories(client *Client, queryParameters url.Values, additionalHeader map[string]string) ([]*types.RightsCategory, error) {
   176  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRightsCategories
   177  	minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint)
   178  	if err != nil {
   179  		return nil, err
   180  	}
   181  
   182  	urlRef, err := client.OpenApiBuildEndpoint(endpoint)
   183  	if err != nil {
   184  		return nil, err
   185  	}
   186  
   187  	typeResponses := []*types.RightsCategory{{}}
   188  	err = client.OpenApiGetAllItems(minimumApiVersion, urlRef, queryParameters, &typeResponses, additionalHeader)
   189  	if err != nil {
   190  		return nil, err
   191  	}
   192  
   193  	return typeResponses, nil
   194  }
   195  
   196  // GetAllRightsCategories retrieves all rights categories. Query parameters can be supplied to perform additional
   197  // filtering
   198  func (client *Client) GetAllRightsCategories(queryParameters url.Values) ([]*types.RightsCategory, error) {
   199  	return getAllRightsCategories(client, queryParameters, nil)
   200  }
   201  
   202  // GetAllRightsCategories retrieves all rights categories. Query parameters can be supplied to perform additional
   203  // filtering
   204  func (adminOrg *AdminOrg) GetAllRightsCategories(queryParameters url.Values) ([]*types.RightsCategory, error) {
   205  	tenantContext, err := adminOrg.getTenantContext()
   206  	if err != nil {
   207  		return nil, err
   208  	}
   209  	return getAllRightsCategories(adminOrg.client, queryParameters, getTenantContextHeader(tenantContext))
   210  }
   211  
   212  func getRightCategoryById(client *Client, id string, additionalHeader map[string]string) (*types.RightsCategory, error) {
   213  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRightsCategories
   214  	minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint)
   215  	if err != nil {
   216  		return nil, err
   217  	}
   218  
   219  	if id == "" {
   220  		return nil, fmt.Errorf("empty category id")
   221  	}
   222  
   223  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, id)
   224  	if err != nil {
   225  		return nil, err
   226  	}
   227  
   228  	rightsCategory := &types.RightsCategory{}
   229  
   230  	err = client.OpenApiGetItem(minimumApiVersion, urlRef, nil, rightsCategory, additionalHeader)
   231  	if err != nil {
   232  		return nil, err
   233  	}
   234  
   235  	return rightsCategory, nil
   236  }
   237  
   238  // GetRightsCategoryById retrieves a rights category from its ID
   239  func (adminOrg *AdminOrg) GetRightsCategoryById(id string) (*types.RightsCategory, error) {
   240  	tenantContext, err := adminOrg.getTenantContext()
   241  	if err != nil {
   242  		return nil, err
   243  	}
   244  	return getRightCategoryById(adminOrg.client, id, getTenantContextHeader(tenantContext))
   245  }
   246  
   247  // GetRightsCategoryById retrieves a rights category from its ID
   248  func (client *Client) GetRightsCategoryById(id string) (*types.RightsCategory, error) {
   249  	return getRightCategoryById(client, id, nil)
   250  }