blob: 548b9f21b8067f5253bd8149e133ece6855f8474 [file] [log] [blame]
Jamie Hannaford548d3402014-09-18 15:50:08 +02001package ports
2
3import (
4 "strconv"
5
Jamie Hannaforda311f182014-09-19 11:19:10 +02006 "github.com/racker/perigee"
Jamie Hannaford548d3402014-09-18 15:50:08 +02007 "github.com/rackspace/gophercloud"
8 "github.com/rackspace/gophercloud/openstack/utils"
9 "github.com/rackspace/gophercloud/pagination"
10)
11
12type ListOpts struct {
13 Status string
14 Name string
15 AdminStateUp *bool
16 NetworkID string
17 TenantID string
18 DeviceOwner string
19 MACAddress string
20 ID string
21 SecurityGroups string
22 DeviceID string
23 BindingHostID string
24 BindingVIFType string
25 BindingVNICType string
26 Limit int
27 Page string
28 PerPage string
29}
30
31func List(c *gophercloud.ServiceClient, opts ListOpts) pagination.Pager {
32 // Build query parameters
33 q := make(map[string]string)
34 if opts.Status != "" {
35 q["status"] = opts.Status
36 }
37 if opts.Name != "" {
38 q["name"] = opts.Name
39 }
40 if opts.AdminStateUp != nil {
41 q["admin_state_up"] = strconv.FormatBool(*opts.AdminStateUp)
42 }
43 if opts.NetworkID != "" {
44 q["network_id"] = opts.NetworkID
45 }
46 if opts.TenantID != "" {
47 q["tenant_id"] = opts.TenantID
48 }
49 if opts.DeviceOwner != "" {
50 q["device_owner"] = opts.DeviceOwner
51 }
52 if opts.MACAddress != "" {
53 q["mac_address"] = opts.MACAddress
54 }
55 if opts.ID != "" {
56 q["id"] = opts.ID
57 }
58 if opts.SecurityGroups != "" {
59 q["security_groups"] = opts.SecurityGroups
60 }
61 if opts.DeviceID != "" {
62 q["device_id"] = opts.DeviceID
63 }
64 if opts.BindingHostID != "" {
65 q["binding:host_id"] = opts.BindingHostID
66 }
67 if opts.BindingVIFType != "" {
68 q["binding:vif_type"] = opts.BindingVIFType
69 }
70 if opts.BindingVNICType != "" {
71 q["binding:vnic_type"] = opts.BindingVNICType
72 }
73 if opts.NetworkID != "" {
74 q["network_id"] = opts.NetworkID
75 }
76 if opts.Limit != 0 {
77 q["limit"] = strconv.Itoa(opts.Limit)
78 }
79 if opts.Page != "" {
80 q["page"] = opts.Page
81 }
82 if opts.PerPage != "" {
83 q["per_page"] = opts.PerPage
84 }
85
86 u := ListURL(c) + utils.BuildQuery(q)
87 return pagination.NewPager(c, u, func(r pagination.LastHTTPResponse) pagination.Page {
88 return PortPage{pagination.LinkedPageBase(r)}
89 })
90}
Jamie Hannaforda311f182014-09-19 11:19:10 +020091
92func Get(c *gophercloud.ServiceClient, id string) (*Port, error) {
93 var p Port
94 _, err := perigee.Request("GET", GetURL(c, id), perigee.Options{
95 MoreHeaders: c.Provider.AuthenticatedHeaders(),
96 Results: &struct {
97 Port *Port `json:"port"`
98 }{&p},
99 OkCodes: []int{200},
100 })
101 if err != nil {
102 return nil, err
103 }
104 return &p, nil
105}
Jamie Hannaforda5fb7822014-09-19 15:07:02 +0200106
107type PortOpts struct {
108 NetworkID string
109 Status string
110 Name string
111 AdminStateUp *bool
112 TenantID string
113 MACAddress string
114 FixedIPs interface{}
115 SecurityGroups []string
116}
117
118func maybeString(original string) *string {
119 if original != "" {
120 return &original
121 }
122 return nil
123}
124
125func Create(c *gophercloud.ServiceClient, opts PortOpts) (*Port, error) {
126 type port struct {
127 NetworkID string `json:"network_id,omitempty"`
128 Status *string `json:"status,omitempty"`
129 Name *string `json:"name,omitempty"`
130 AdminStateUp *bool `json:"admin_state_up,omitempty"`
131 TenantID *string `json:"tenant_id,omitempty"`
132 MACAddress *string `json:"mac_address,omitempty"`
133 FixedIPs interface{} `json:"fixed_ips,omitempty"`
134 SecurityGroups []string `json:"security_groups,omitempty"`
135 }
136 type request struct {
137 Port port `json:"port"`
138 }
139
140 // Validate
141 if opts.NetworkID == "" {
142 return nil, ErrNetworkIDRequired
143 }
144
145 // Populate request body
146 reqBody := request{Port: port{
147 NetworkID: opts.NetworkID,
148 Status: maybeString(opts.Status),
149 Name: maybeString(opts.Name),
150 AdminStateUp: opts.AdminStateUp,
151 TenantID: maybeString(opts.TenantID),
152 MACAddress: maybeString(opts.MACAddress),
153 }}
154
155 if opts.FixedIPs != nil {
156 reqBody.Port.FixedIPs = opts.FixedIPs
157 }
158
159 if opts.SecurityGroups != nil {
160 reqBody.Port.SecurityGroups = opts.SecurityGroups
161 }
162
163 // Response
164 type response struct {
165 Port *Port `json:"port"`
166 }
167 var res response
168 _, err := perigee.Request("POST", CreateURL(c), perigee.Options{
169 MoreHeaders: c.Provider.AuthenticatedHeaders(),
170 ReqBody: &reqBody,
171 Results: &res,
172 OkCodes: []int{201},
Jamie Hannaford2a0492a2014-09-22 12:02:11 +0200173 DumpReqJson: true,
Jamie Hannaforda5fb7822014-09-19 15:07:02 +0200174 })
175 if err != nil {
176 return nil, err
177 }
178
179 return res.Port, nil
180}
181
182func Update(c *gophercloud.ServiceClient, id string, opts PortOpts) (*Port, error) {
183 type port struct {
184 NetworkID string `json:"network_id,omitempty"`
185 Status *string `json:"status,omitempty"`
186 Name *string `json:"name,omitempty"`
187 AdminStateUp *bool `json:"admin_state_up,omitempty"`
188 TenantID *string `json:"tenant_id,omitempty"`
189 MACAddress *string `json:"mac_address,omitempty"`
190 FixedIPs interface{} `json:"fixed_ips,omitempty"`
191 SecurityGroups []string `json:"security_groups,omitempty"`
192 }
193 type request struct {
194 Port port `json:"port"`
195 }
196
197 // Validate
198 if opts.NetworkID == "" {
199 return nil, ErrNetworkIDRequired
200 }
201
202 // Populate request body
203 reqBody := request{Port: port{
204 NetworkID: opts.NetworkID,
205 Status: maybeString(opts.Status),
206 Name: maybeString(opts.Name),
207 AdminStateUp: opts.AdminStateUp,
208 TenantID: maybeString(opts.TenantID),
209 MACAddress: maybeString(opts.MACAddress),
210 }}
211
212 if opts.FixedIPs != nil {
213 reqBody.Port.FixedIPs = opts.FixedIPs
214 }
215
216 if opts.SecurityGroups != nil {
217 reqBody.Port.SecurityGroups = opts.SecurityGroups
218 }
219
220 // Response
221 type response struct {
222 Port *Port `json:"port"`
223 }
224 var res response
225 _, err := perigee.Request("PUT", UpdateURL(c, id), perigee.Options{
226 MoreHeaders: c.Provider.AuthenticatedHeaders(),
227 ReqBody: &reqBody,
228 Results: &res,
229 OkCodes: []int{200, 201},
230 })
231 if err != nil {
232 return nil, err
233 }
234
235 return res.Port, nil
236}
Jamie Hannafordd444b7a2014-09-19 15:08:27 +0200237
238func Delete(c *gophercloud.ServiceClient, id string) error {
239 _, err := perigee.Request("DELETE", DeleteURL(c, id), perigee.Options{
240 MoreHeaders: c.Provider.AuthenticatedHeaders(),
241 OkCodes: []int{204},
242 })
243 return err
244}