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 }