blob: 81b1545115622c4eb8d3c5ceef2bcfe5ef917534 [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 Hannaford965ae702014-09-22 14:58:19 +02009type networkOpts struct {
Jamie Hannaford7db63f22014-09-29 11:18:45 +020010 AdminStateUp *bool
Jamie Hannaford1ce30f22014-09-16 11:23:34 +020011 Name string
12 Shared *bool
13 TenantID string
Jamie Hannaford12bc2472014-09-15 12:14:31 +020014}
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020015
Jamie Hannaford686c4962014-09-23 10:46:20 +020016// ListOpts allows the filtering and sorting of paginated collections through
17// the API. Filtering is achieved by passing in struct field values that map to
18// the network attributes you want to see returned. SortKey allows you to sort
19// by a particular network attribute. SortDir sets the direction, and is either
20// `asc' or `desc'. Marker and Limit are used for pagination.
21type ListOpts struct {
Jamie Hannaford92523e32014-10-02 11:08:36 +020022 Status string `q:"status"`
23 Name string `q:"name"`
24 AdminStateUp *bool `q:"admin_state_up"`
25 TenantID string `q:"tenant_id"`
26 Shared *bool `q:"shared"`
27 ID string `q:"id"`
28 Marker string `q:"marker"`
29 Limit int `q:"limit"`
30 SortKey string `q:"sort_key"`
31 SortDir string `q:"sort_dir"`
Jamie Hannaford686c4962014-09-23 10:46:20 +020032}
33
34// List returns a Pager which allows you to iterate over a collection of
35// networks. It accepts a ListOpts struct, which allows you to filter and sort
36// the returned collection for greater efficiency.
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020037func List(c *gophercloud.ServiceClient, opts ListOpts) pagination.Pager {
Jamie Hannaford4721abc2014-09-16 16:29:04 +020038 // Build query parameters
Jamie Hannaford92523e32014-10-02 11:08:36 +020039 q, err := gophercloud.BuildQueryString(&opts)
40 if err != nil {
41 return pagination.Pager{Err: err}
Jamie Hannaford4721abc2014-09-16 16:29:04 +020042 }
Jamie Hannaford92523e32014-10-02 11:08:36 +020043 u := listURL(c) + q.String()
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020044 return pagination.NewPager(c, u, func(r pagination.LastHTTPResponse) pagination.Page {
Ash Wilsonfc55c822014-09-25 13:18:16 -040045 return NetworkPage{pagination.LinkedPageBase{LastHTTPResponse: r}}
Jamie Hannafordf0c615b2014-09-17 10:56:52 +020046 })
Jamie Hannaford4721abc2014-09-16 16:29:04 +020047}
48
Jamie Hannaford686c4962014-09-23 10:46:20 +020049// Get retrieves a specific network based on its unique ID.
Jamie Hannafordd9036422014-09-23 17:50:24 +020050func Get(c *gophercloud.ServiceClient, id string) GetResult {
51 var res GetResult
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +020052 _, res.Err = perigee.Request("GET", getURL(c, id), perigee.Options{
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020053 MoreHeaders: c.Provider.AuthenticatedHeaders(),
Jamie Hannafordd9036422014-09-23 17:50:24 +020054 Results: &res.Resp,
55 OkCodes: []int{200},
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020056 })
Jamie Hannafordd9036422014-09-23 17:50:24 +020057 return res
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020058}
Jamie Hannafordd2d9f562014-09-15 15:35:07 +020059
Jamie Hannaford35c91a62014-10-06 15:50:08 +020060// CreateOptsBuilder is the interface options structs have to satisfy in order
61// to be used in the main Create operation in this package. Since many
62// extensions decorate or modify the common logic, it is useful for them to
63// satisfy a basic interface in order for them to be used.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +020064type CreateOptsBuilder interface {
65 ToNetworkCreateMap() map[string]map[string]interface{}
Jamie Hannaford9823bb62014-09-26 17:06:36 +020066}
67
Jamie Hannaford35c91a62014-10-06 15:50:08 +020068// CreateOpts is the common options struct used in this package's Create
69// operation.
Jamie Hannaford965ae702014-09-22 14:58:19 +020070type CreateOpts networkOpts
71
Jamie Hannaford35c91a62014-10-06 15:50:08 +020072// ToNetworkCreateMap casts a CreateOpts struct to a map.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +020073func (o CreateOpts) ToNetworkCreateMap() map[string]map[string]interface{} {
Jamie Hannaford7db63f22014-09-29 11:18:45 +020074 inner := make(map[string]interface{})
75
76 if o.AdminStateUp != nil {
77 inner["admin_state_up"] = &o.AdminStateUp
78 }
79 if o.Name != "" {
80 inner["name"] = o.Name
81 }
82 if o.Shared != nil {
83 inner["shared"] = &o.Shared
84 }
85 if o.TenantID != "" {
86 inner["tenant_id"] = o.TenantID
87 }
88
89 outer := make(map[string]map[string]interface{})
90 outer["network"] = inner
91
92 return outer
93}
94
Jamie Hannaford686c4962014-09-23 10:46:20 +020095// Create accepts a CreateOpts struct and creates a new network using the values
96// provided. This operation does not actually require a request body, i.e. the
97// CreateOpts struct argument can be empty.
98//
99// The tenant ID that is contained in the URI is the tenant that creates the
100// network. An admin user, however, has the option of specifying another tenant
101// ID in the CreateOpts struct.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200102func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200103 var res CreateResult
104
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200105 reqBody := opts.ToNetworkCreateMap()
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200106
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200107 // Send request to API
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200108 _, res.Err = perigee.Request("POST", createURL(c), perigee.Options{
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200109 MoreHeaders: c.Provider.AuthenticatedHeaders(),
110 ReqBody: &reqBody,
Jamie Hannafordd9036422014-09-23 17:50:24 +0200111 Results: &res.Resp,
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200112 OkCodes: []int{201},
113 })
Jamie Hannafordd9036422014-09-23 17:50:24 +0200114 return res
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200115}
Jamie Hannaford79475052014-09-15 17:08:06 +0200116
Jamie Hannaford35c91a62014-10-06 15:50:08 +0200117// UpdateOptsBuilder is the interface options structs have to satisfy in order
118// to be used in the main Update operation in this package. Since many
119// extensions decorate or modify the common logic, it is useful for them to
120// satisfy a basic interface in order for them to be used.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200121type UpdateOptsBuilder interface {
122 ToNetworkUpdateMap() map[string]map[string]interface{}
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200123}
124
Jamie Hannaford35c91a62014-10-06 15:50:08 +0200125// UpdateOpts is the common options struct used in this package's Update
126// operation.
Jamie Hannaford965ae702014-09-22 14:58:19 +0200127type UpdateOpts networkOpts
128
Jamie Hannaford35c91a62014-10-06 15:50:08 +0200129// ToNetworkUpdateMap casts a UpdateOpts struct to a map.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200130func (o UpdateOpts) ToNetworkUpdateMap() map[string]map[string]interface{} {
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200131 inner := make(map[string]interface{})
132
133 if o.AdminStateUp != nil {
134 inner["admin_state_up"] = &o.AdminStateUp
135 }
136 if o.Name != "" {
137 inner["name"] = o.Name
138 }
139 if o.Shared != nil {
140 inner["shared"] = &o.Shared
141 }
142
143 outer := make(map[string]map[string]interface{})
144 outer["network"] = inner
145
146 return outer
147}
148
Jamie Hannaford686c4962014-09-23 10:46:20 +0200149// Update accepts a UpdateOpts struct and updates an existing network using the
150// values provided. For more information, see the Create function.
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200151func Update(c *gophercloud.ServiceClient, networkID string, opts UpdateOptsBuilder) UpdateResult {
Jamie Hannaford7db63f22014-09-29 11:18:45 +0200152 var res UpdateResult
153
Jamie Hannaforde3bb3f62014-10-06 09:40:27 +0200154 reqBody := opts.ToNetworkUpdateMap()
Jamie Hannaford79475052014-09-15 17:08:06 +0200155
Jamie Hannaford79475052014-09-15 17:08:06 +0200156 // Send request to API
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200157 _, res.Err = perigee.Request("PUT", getURL(c, networkID), perigee.Options{
Jamie Hannaford79475052014-09-15 17:08:06 +0200158 MoreHeaders: c.Provider.AuthenticatedHeaders(),
159 ReqBody: &reqBody,
Jamie Hannafordd9036422014-09-23 17:50:24 +0200160 Results: &res.Resp,
Jamie Hannafordf84171d2014-09-18 14:00:01 +0200161 OkCodes: []int{200, 201},
Jamie Hannaford79475052014-09-15 17:08:06 +0200162 })
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200163
Jamie Hannafordd9036422014-09-23 17:50:24 +0200164 return res
Jamie Hannaford79475052014-09-15 17:08:06 +0200165}
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200166
Jamie Hannaford686c4962014-09-23 10:46:20 +0200167// Delete accepts a unique ID and deletes the network associated with it.
Jamie Hannafordd9036422014-09-23 17:50:24 +0200168func Delete(c *gophercloud.ServiceClient, networkID string) DeleteResult {
169 var res DeleteResult
Jamie Hannaford6f57e9e2014-10-02 10:27:28 +0200170 _, res.Err = perigee.Request("DELETE", deleteURL(c, networkID), perigee.Options{
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200171 MoreHeaders: c.Provider.AuthenticatedHeaders(),
172 OkCodes: []int{204},
173 })
Jamie Hannafordd9036422014-09-23 17:50:24 +0200174 return res
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200175}