blob: 919e6de16e6ee29d85188ca05a9daa0a2dae1187 [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},
173 })
174 if err != nil {
175 return nil, err
176 }
177
178 return res.Port, nil
179}
180
181func Update(c *gophercloud.ServiceClient, id string, opts PortOpts) (*Port, error) {
182 type port struct {
183 NetworkID string `json:"network_id,omitempty"`
184 Status *string `json:"status,omitempty"`
185 Name *string `json:"name,omitempty"`
186 AdminStateUp *bool `json:"admin_state_up,omitempty"`
187 TenantID *string `json:"tenant_id,omitempty"`
188 MACAddress *string `json:"mac_address,omitempty"`
189 FixedIPs interface{} `json:"fixed_ips,omitempty"`
190 SecurityGroups []string `json:"security_groups,omitempty"`
191 }
192 type request struct {
193 Port port `json:"port"`
194 }
195
196 // Validate
197 if opts.NetworkID == "" {
198 return nil, ErrNetworkIDRequired
199 }
200
201 // Populate request body
202 reqBody := request{Port: port{
203 NetworkID: opts.NetworkID,
204 Status: maybeString(opts.Status),
205 Name: maybeString(opts.Name),
206 AdminStateUp: opts.AdminStateUp,
207 TenantID: maybeString(opts.TenantID),
208 MACAddress: maybeString(opts.MACAddress),
209 }}
210
211 if opts.FixedIPs != nil {
212 reqBody.Port.FixedIPs = opts.FixedIPs
213 }
214
215 if opts.SecurityGroups != nil {
216 reqBody.Port.SecurityGroups = opts.SecurityGroups
217 }
218
219 // Response
220 type response struct {
221 Port *Port `json:"port"`
222 }
223 var res response
224 _, err := perigee.Request("PUT", UpdateURL(c, id), perigee.Options{
225 MoreHeaders: c.Provider.AuthenticatedHeaders(),
226 ReqBody: &reqBody,
227 Results: &res,
228 OkCodes: []int{200, 201},
229 })
230 if err != nil {
231 return nil, err
232 }
233
234 return res.Port, nil
235}