blob: 98e70d1cd7d0913bd8fa6155f715f9654a75cb0e [file] [log] [blame]
Jamie Hannaforda7f671a2014-09-11 10:25:08 +02001package networks
2
Jamie Hannaford01e14922014-09-11 15:23:49 +02003import (
Jamie Hannaford4721abc2014-09-16 16:29:04 +02004 "strconv"
5
Jamie Hannaford01e14922014-09-11 15:23:49 +02006 "github.com/racker/perigee"
7 "github.com/rackspace/gophercloud"
Jamie Hannaford4721abc2014-09-16 16:29:04 +02008 "github.com/rackspace/gophercloud/openstack/utils"
Jamie Hannaford01e14922014-09-11 15:23:49 +02009)
10
Jamie Hannaford4721abc2014-09-16 16:29:04 +020011type ListOpts struct {
12 Status string
13 Name string
14 AdminStateUp *bool
15 TenantID string
16 Shared *bool
17 ID string
18 Page int
19 PerPage int
20}
21
Jamie Hannaford1ce30f22014-09-16 11:23:34 +020022type NetworkOpts struct {
23 AdminStateUp bool
24 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 Hannaford4721abc2014-09-16 16:29:04 +020029func ptrToStr(val *bool) string {
30 if *val == true {
31 return "true"
32 } else if *val == false {
33 return "false"
34 } else {
35 return ""
36 }
37}
38
39func List(c *gophercloud.ServiceClient, opts ListOpts) gophercloud.Pager {
40 // Build query parameters
41 q := make(map[string]string)
42 if opts.Status != "" {
43 q["status"] = opts.Status
44 }
45 if opts.Name != "" {
46 q["name"] = opts.Name
47 }
48 if opts.AdminStateUp != nil {
49 q["admin_state_up"] = ptrToStr(opts.AdminStateUp)
50 }
51 if opts.TenantID != "" {
52 q["tenant_id"] = opts.TenantID
53 }
54 if opts.Shared != nil {
55 q["shared"] = ptrToStr(opts.Shared)
56 }
57 if opts.ID != "" {
58 q["id"] = opts.ID
59 }
60 if opts.Page != 0 {
61 q["page"] = strconv.Itoa(opts.Page)
62 }
63 if opts.PerPage != 0 {
64 q["per_page"] = strconv.Itoa(opts.PerPage)
65 }
66
67 u := ListURL(c) + utils.BuildQuery(q)
68 return gophercloud.NewLinkedPager(c, u)
69}
70
71func Get(c *gophercloud.ServiceClient, id string) (*Network, error) {
72 var n Network
73 _, err := perigee.Request("GET", GetURL(c, id), perigee.Options{
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020074 MoreHeaders: c.Provider.AuthenticatedHeaders(),
75 Results: &struct {
Jamie Hannaford4721abc2014-09-16 16:29:04 +020076 Network *Network `json:"network"`
Jamie Hannafordd01a3c72014-09-15 12:51:00 +020077 }{&n},
78 OkCodes: []int{200},
79 })
80 if err != nil {
81 return nil, err
82 }
83 return &n, nil
84}
Jamie Hannafordd2d9f562014-09-15 15:35:07 +020085
Jamie Hannaford79475052014-09-15 17:08:06 +020086func Create(c *gophercloud.ServiceClient, opts NetworkOpts) (*NetworkCreateResult, error) {
Jamie Hannafordd2d9f562014-09-15 15:35:07 +020087 // Define structures
88 type network struct {
89 AdminStateUp bool `json:"admin_state_up"`
90 Name string `json:"name"`
91 Shared *bool `json:"shared,omitempty"`
92 TenantID *string `json:"tenant_id,omitempty"`
93 }
94 type request struct {
95 Network network `json:"network"`
96 }
97 type response struct {
Jamie Hannaford79475052014-09-15 17:08:06 +020098 Network *NetworkCreateResult `json:"network"`
Jamie Hannafordd2d9f562014-09-15 15:35:07 +020099 }
100
101 // Validate
102 if opts.Name == "" {
103 return nil, ErrNameRequired
104 }
105
106 // Populate request body
107 reqBody := request{Network: network{
108 AdminStateUp: opts.AdminStateUp,
109 Name: opts.Name,
110 Shared: opts.Shared,
111 }}
112
113 if opts.TenantID != "" {
114 reqBody.Network.TenantID = &opts.TenantID
115 }
116
Jamie Hannafordd2d9f562014-09-15 15:35:07 +0200117 // Send request to API
118 var res response
119 _, err := perigee.Request("POST", CreateURL(c), perigee.Options{
120 MoreHeaders: c.Provider.AuthenticatedHeaders(),
121 ReqBody: &reqBody,
122 Results: &res,
123 OkCodes: []int{201},
124 })
125 if err != nil {
126 return nil, err
127 }
128
129 return res.Network, nil
130}
Jamie Hannaford79475052014-09-15 17:08:06 +0200131
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200132func Update(c *gophercloud.ServiceClient, networkID string, opts NetworkOpts) (*Network, error) {
Jamie Hannaford79475052014-09-15 17:08:06 +0200133 // Define structures
134 type network struct {
135 AdminStateUp bool `json:"admin_state_up"`
136 Name string `json:"name"`
137 Shared *bool `json:"shared,omitempty"`
138 TenantID *string `json:"tenant_id,omitempty"`
139 }
140
141 type request struct {
142 Network network `json:"network"`
143 }
144 type response struct {
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200145 Network *Network `json:"network"`
Jamie Hannaford79475052014-09-15 17:08:06 +0200146 }
147
148 // Populate request body
149 reqBody := request{Network: network{
150 AdminStateUp: opts.AdminStateUp,
151 Name: opts.Name,
152 Shared: opts.Shared,
153 }}
154
155 if opts.TenantID != "" {
156 reqBody.Network.TenantID = &opts.TenantID
157 }
158
159 // Send request to API
160 var res response
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200161 _, err := perigee.Request("PUT", GetURL(c, networkID), perigee.Options{
Jamie Hannaford79475052014-09-15 17:08:06 +0200162 MoreHeaders: c.Provider.AuthenticatedHeaders(),
163 ReqBody: &reqBody,
164 Results: &res,
165 OkCodes: []int{200},
166 })
167 if err != nil {
168 return nil, err
169 }
170
171 return res.Network, nil
172}
Jamie Hannaford4721abc2014-09-16 16:29:04 +0200173
174func Delete(c *gophercloud.ServiceClient, networkID string) error {
175 _, err := perigee.Request("DELETE", DeleteURL(c, networkID), perigee.Options{
176 MoreHeaders: c.Provider.AuthenticatedHeaders(),
177 OkCodes: []int{204},
178 })
179 return err
180}