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 }