github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/openstack/identity/v3/services/requests.go (about)

     1  package services
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/vnpaycloud-console/gophercloud/v2"
     7  	"github.com/vnpaycloud-console/gophercloud/v2/pagination"
     8  )
     9  
    10  // CreateOptsBuilder allows extensions to add additional parameters to
    11  // the Create request.
    12  type CreateOptsBuilder interface {
    13  	ToServiceCreateMap() (map[string]any, error)
    14  }
    15  
    16  // CreateOpts provides options used to create a service.
    17  type CreateOpts struct {
    18  	// Type is the type of the service.
    19  	Type string `json:"type"`
    20  
    21  	// Enabled is whether or not the service is enabled.
    22  	Enabled *bool `json:"enabled,omitempty"`
    23  
    24  	// Extra is free-form extra key/value pairs to describe the service.
    25  	Extra map[string]any `json:"-"`
    26  }
    27  
    28  // ToServiceCreateMap formats a CreateOpts into a create request.
    29  func (opts CreateOpts) ToServiceCreateMap() (map[string]any, error) {
    30  	b, err := gophercloud.BuildRequestBody(opts, "service")
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  
    35  	if opts.Extra != nil {
    36  		if v, ok := b["service"].(map[string]any); ok {
    37  			for key, value := range opts.Extra {
    38  				v[key] = value
    39  			}
    40  		}
    41  	}
    42  
    43  	return b, nil
    44  }
    45  
    46  // Create adds a new service of the requested type to the catalog.
    47  func Create(ctx context.Context, client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
    48  	b, err := opts.ToServiceCreateMap()
    49  	if err != nil {
    50  		r.Err = err
    51  		return
    52  	}
    53  	resp, err := client.Post(ctx, createURL(client), &b, &r.Body, &gophercloud.RequestOpts{
    54  		OkCodes: []int{201},
    55  	})
    56  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
    57  	return
    58  }
    59  
    60  // ListOptsBuilder enables extensions to add additional parameters to the List
    61  // request.
    62  type ListOptsBuilder interface {
    63  	ToServiceListMap() (string, error)
    64  }
    65  
    66  // ListOpts provides options for filtering the List results.
    67  type ListOpts struct {
    68  	// ServiceType filter the response by a type of service.
    69  	ServiceType string `q:"type"`
    70  
    71  	// Name filters the response by a service name.
    72  	Name string `q:"name"`
    73  }
    74  
    75  // ToServiceListMap builds a list query from the list options.
    76  func (opts ListOpts) ToServiceListMap() (string, error) {
    77  	q, err := gophercloud.BuildQueryString(opts)
    78  	return q.String(), err
    79  }
    80  
    81  // List enumerates the services available to a specific user.
    82  func List(client *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
    83  	url := listURL(client)
    84  	if opts != nil {
    85  		query, err := opts.ToServiceListMap()
    86  		if err != nil {
    87  			return pagination.Pager{Err: err}
    88  		}
    89  		url += query
    90  	}
    91  	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
    92  		return ServicePage{pagination.LinkedPageBase{PageResult: r}}
    93  	})
    94  }
    95  
    96  // Get returns additional information about a service, given its ID.
    97  func Get(ctx context.Context, client *gophercloud.ServiceClient, serviceID string) (r GetResult) {
    98  	resp, err := client.Get(ctx, serviceURL(client, serviceID), &r.Body, nil)
    99  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
   100  	return
   101  }
   102  
   103  // UpdateOptsBuilder allows extensions to add additional parameters to
   104  // the Update request.
   105  type UpdateOptsBuilder interface {
   106  	ToServiceUpdateMap() (map[string]any, error)
   107  }
   108  
   109  // UpdateOpts provides options for updating a service.
   110  type UpdateOpts struct {
   111  	// Type is the type of the service.
   112  	Type string `json:"type"`
   113  
   114  	// Enabled is whether or not the service is enabled.
   115  	Enabled *bool `json:"enabled,omitempty"`
   116  
   117  	// Extra is free-form extra key/value pairs to describe the service.
   118  	Extra map[string]any `json:"-"`
   119  }
   120  
   121  // ToServiceUpdateMap formats a UpdateOpts into an update request.
   122  func (opts UpdateOpts) ToServiceUpdateMap() (map[string]any, error) {
   123  	b, err := gophercloud.BuildRequestBody(opts, "service")
   124  	if err != nil {
   125  		return nil, err
   126  	}
   127  
   128  	if opts.Extra != nil {
   129  		if v, ok := b["service"].(map[string]any); ok {
   130  			for key, value := range opts.Extra {
   131  				v[key] = value
   132  			}
   133  		}
   134  	}
   135  
   136  	return b, nil
   137  }
   138  
   139  // Update updates an existing Service.
   140  func Update(ctx context.Context, client *gophercloud.ServiceClient, serviceID string, opts UpdateOptsBuilder) (r UpdateResult) {
   141  	b, err := opts.ToServiceUpdateMap()
   142  	if err != nil {
   143  		r.Err = err
   144  		return
   145  	}
   146  	resp, err := client.Patch(ctx, updateURL(client, serviceID), &b, &r.Body, &gophercloud.RequestOpts{
   147  		OkCodes: []int{200},
   148  	})
   149  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
   150  	return
   151  }
   152  
   153  // Delete removes an existing service.
   154  // It either deletes all associated endpoints, or fails until all endpoints
   155  // are deleted.
   156  func Delete(ctx context.Context, client *gophercloud.ServiceClient, serviceID string) (r DeleteResult) {
   157  	resp, err := client.Delete(ctx, serviceURL(client, serviceID), nil)
   158  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
   159  	return
   160  }