github.com/gophercloud/gophercloud@v1.11.0/openstack/identity/v3/services/requests.go (about)

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