blob: 39a151a47dbbde29a6c9b4960646e555f3cd673d [file] [log] [blame]
Jamie Hannaforda7f671a2014-09-11 10:25:08 +02001package networks
2
Jamie Hannaford01e14922014-09-11 15:23:49 +02003import (
4 "github.com/racker/perigee"
5 "github.com/rackspace/gophercloud"
Jamie Hannafordf0c615b2014-09-17 10:56:52 +02006 "github.com/rackspace/gophercloud/pagination"
Jamie Hannaford01e14922014-09-11 15:23:49 +02007)
8
Jamie Hannaford32979b62014-10-09 10:32:39 +02009// AdminState gives users a solid type to work with for create and update
10// operations. It is recommended that users use the `Up` and `Down` enums.
11type AdminState *bool
12
13// Convenience vars for AdminStateUp values.
14var (
15 iTrue = true
16 iFalse = false
17
18 Up AdminState = &iTrue
19 Down AdminState = &iFalse
20)
21
Jamie Hannaford965ae702014-09-22 14:58:19 +020022type networkOpts struct {
Jamie Hannaford7db63f22014-09-29 11:18:45 +020023 AdminStateUp *bool
Jamie Hannaford1ce30f22014-09-16 11:23:34 +020024 Name string
25 Shared *bool
26 TenantID string
Jamie Hannaford12bc2472014-09-15 12:14:31 +020027}
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020028
Jamie Hannaford686c4962014-09-23 10:46:20 +020029// ListOpts allows the filtering and sorting of paginated collections through
30// the API. Filtering is achieved by passing in struct field values that map to
31// the network attributes you want to see returned. SortKey allows you to sort
32// by a particular network attribute. SortDir sets the direction, and is either
33// `asc' or `desc'. Marker and Limit are used for pagination.
34type ListOpts struct {
Jamie Hannaford92523e32014-10-02 11:08:36 +020035 Status string `q:"status"`
36 Name string `q:"name"`
37 AdminStateUp *bool `q:"admin_state_up"`
38 TenantID string `q:"tenant_id"`
39 Shared *bool `q:"shared"`
40 ID string `q:"id"`
41 Marker string `q:"marker"`
42 Limit int `q:"limit"`
43 SortKey string `q:"sort_key"`
44 SortDir string `q:"sort_dir"`
Jamie Hannaford686c4962014-09-23 10:46:20 +020045}
46
47// List returns a Pager which allows you to iterate over a collection of
48// networks. It accepts a ListOpts struct, which allows you to filter and sort
49// the returned collection for greater efficiency.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020050func List(c *gophercloud.ServiceClient, opts ListOpts) pagination.Pager {
Jamie Hannaford4721abc2014-09-16 16:29:04 +020051 // Build query parameters
Jamie Hannaford92523e32014-10-02 11:08:36 +020052 q, err := gophercloud.BuildQueryString(&opts)
53 if err != nil {
54 return pagination.Pager{Err: err}
Jamie Hannaford4721abc2014-09-16 16:29:04 +020055 }
Jamie Hannaford92523e32014-10-02 11:08:36 +020056 u := listURL(c) + q.String()
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020057 return pagination.NewPager(c, u, func(r pagination.LastHTTPResponse) pagination.Page {
Ash Wilsonfc55c822014-09-25 13:18:16 -040058 return NetworkPage{pagination.LinkedPageBase{LastHTTPResponse: r}}
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020059 })
Jamie Hannaford4721abc2014-09-16 16:29:04 +020060}
61
Jamie Hannaford686c4962014-09-23 10:46:20 +020062// Get retrieves a specific network based on its unique ID.
Jamie Hannafordd9036422014-09-23 17:50:24 +020063func Get(c *gophercloud.ServiceClient, id string) GetResult {
64 var res GetResult
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +020065 _, res.Err = perigee.Request("GET", getURL(c, id), perigee.Options{
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020066 MoreHeaders: c.Provider.AuthenticatedHeaders(),
Jamie Hannafordd9036422014-09-23 17:50:24 +020067 Results: &res.Resp,
68 OkCodes: []int{200},
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020069 })
Jamie Hannafordd9036422014-09-23 17:50:24 +020070 return res
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020071}
Jamie Hannafordd2d9f562014-09-15 15:35:07 +020072
Jamie Hannaford35c91a62014-10-06 15:50:08 +020073// CreateOptsBuilder is the interface options structs have to satisfy in order
74// to be used in the main Create operation in this package. Since many
75// extensions decorate or modify the common logic, it is useful for them to
76// satisfy a basic interface in order for them to be used.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +020077type CreateOptsBuilder interface {
78 ToNetworkCreateMap() map[string]map[string]interface{}
Jamie Hannaford9823bb62014-09-26 17:06:36 +020079}
80
Jamie Hannaford35c91a62014-10-06 15:50:08 +020081// CreateOpts is the common options struct used in this package's Create
82// operation.
Jamie Hannaford965ae702014-09-22 14:58:19 +020083type CreateOpts networkOpts
84
Jamie Hannaford35c91a62014-10-06 15:50:08 +020085// ToNetworkCreateMap casts a CreateOpts struct to a map.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +020086func (o CreateOpts) ToNetworkCreateMap() map[string]map[string]interface{} {
Jamie Hannaford7db63f22014-09-29 11:18:45 +020087 inner := make(map[string]interface{})
88
89 if o.AdminStateUp != nil {
90 inner["admin_state_up"] = &o.AdminStateUp
91 }
92 if o.Name != "" {
93 inner["name"] = o.Name
94 }
95 if o.Shared != nil {
96 inner["shared"] = &o.Shared
97 }
98 if o.TenantID != "" {
99 inner["tenant_id"] = o.TenantID
100 }
101
102 outer := make(map[string]map[string]interface{})
103 outer["network"] = inner
104
105 return outer
106}
107
Jamie Hannaford686c4962014-09-23 10:46:20 +0200108// Create accepts a CreateOpts struct and creates a new network using the values
109// provided. This operation does not actually require a request body, i.e. the
110// CreateOpts struct argument can be empty.
111//
112// The tenant ID that is contained in the URI is the tenant that creates the
113// network. An admin user, however, has the option of specifying another tenant
114// ID in the CreateOpts struct.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200115func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200116 var res CreateResult
117
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200118 reqBody := opts.ToNetworkCreateMap()
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200119
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200120 // Send request to API
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200121 _, res.Err = perigee.Request("POST", createURL(c), perigee.Options{
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200122 MoreHeaders: c.Provider.AuthenticatedHeaders(),
123 ReqBody: &reqBody,
Jamie Hannafordd9036422014-09-23 17:50:24 +0200124 Results: &res.Resp,
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200125 OkCodes: []int{201},
126 })
Jamie Hannafordd9036422014-09-23 17:50:24 +0200127 return res
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200128}
Jamie Hannaford79475052014-09-15 17:08:06 +0200129
Jamie Hannaford35c91a62014-10-06 15:50:08 +0200130// UpdateOptsBuilder is the interface options structs have to satisfy in order
131// to be used in the main Update operation in this package. Since many
132// extensions decorate or modify the common logic, it is useful for them to
133// satisfy a basic interface in order for them to be used.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200134type UpdateOptsBuilder interface {
135 ToNetworkUpdateMap() map[string]map[string]interface{}
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200136}
137
Jamie Hannaford35c91a62014-10-06 15:50:08 +0200138// UpdateOpts is the common options struct used in this package's Update
139// operation.
Jamie Hannaford965ae702014-09-22 14:58:19 +0200140type UpdateOpts networkOpts
141
Jamie Hannaford35c91a62014-10-06 15:50:08 +0200142// ToNetworkUpdateMap casts a UpdateOpts struct to a map.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200143func (o UpdateOpts) ToNetworkUpdateMap() map[string]map[string]interface{} {
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200144 inner := make(map[string]interface{})
145
146 if o.AdminStateUp != nil {
147 inner["admin_state_up"] = &o.AdminStateUp
148 }
149 if o.Name != "" {
150 inner["name"] = o.Name
151 }
152 if o.Shared != nil {
153 inner["shared"] = &o.Shared
154 }
155
156 outer := make(map[string]map[string]interface{})
157 outer["network"] = inner
158
159 return outer
160}
161
Jamie Hannaford686c4962014-09-23 10:46:20 +0200162// Update accepts a UpdateOpts struct and updates an existing network using the
163// values provided. For more information, see the Create function.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200164func Update(c *gophercloud.ServiceClient, networkID string, opts UpdateOptsBuilder) UpdateResult {
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200165 var res UpdateResult
166
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200167 reqBody := opts.ToNetworkUpdateMap()
Jamie Hannaford79475052014-09-15 17:08:06 +0200168
Jamie Hannaford79475052014-09-15 17:08:06 +0200169 // Send request to API
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200170 _, res.Err = perigee.Request("PUT", getURL(c, networkID), perigee.Options{
Jamie Hannaford79475052014-09-15 17:08:06 +0200171 MoreHeaders: c.Provider.AuthenticatedHeaders(),
172 ReqBody: &reqBody,
Jamie Hannafordd9036422014-09-23 17:50:24 +0200173 Results: &res.Resp,
Jamie Hannafordf84171d2014-09-18 14:00:01 +0200174 OkCodes: []int{200, 201},
Jamie Hannaford79475052014-09-15 17:08:06 +0200175 })
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200176
Jamie Hannafordd9036422014-09-23 17:50:24 +0200177 return res
Jamie Hannaford79475052014-09-15 17:08:06 +0200178}
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200179
Jamie Hannaford686c4962014-09-23 10:46:20 +0200180// Delete accepts a unique ID and deletes the network associated with it.
Jamie Hannafordd9036422014-09-23 17:50:24 +0200181func Delete(c *gophercloud.ServiceClient, networkID string) DeleteResult {
182 var res DeleteResult
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200183 _, res.Err = perigee.Request("DELETE", deleteURL(c, networkID), perigee.Options{
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200184 MoreHeaders: c.Provider.AuthenticatedHeaders(),
185 OkCodes: []int{204},
186 })
Jamie Hannafordd9036422014-09-23 17:50:24 +0200187 return res
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200188}