Adding list ports operation
diff --git a/openstack/networking/v2/ports/results.go b/openstack/networking/v2/ports/results.go
new file mode 100644
index 0000000..54390dc
--- /dev/null
+++ b/openstack/networking/v2/ports/results.go
@@ -0,0 +1,84 @@
+package ports
+
+import (
+ "github.com/mitchellh/mapstructure"
+ "github.com/rackspace/gophercloud/pagination"
+)
+
+type IP struct {
+ SubnetID string `mapstructure:"subnet_id" json:"subnet_id"`
+ IPAddress string `mapstructure:"ip_address" json:"ip_address"`
+}
+
+type Port struct {
+ Status string `mapstructure:"status" json:"status"`
+ Name string `mapstructure:"name" json:"name"`
+ AllowedAddressPairs []interface{} `mapstructure:"allowed" json:"allowed"`
+ AdminStateUp bool `mapstructure:"admin_state_up" json:"admin_state_up"`
+ NetworkID string `mapstructure:"network_id" json:"network_id"`
+ TenantID string `mapstructure:"tenant_id" json:"tenant_id"`
+ ExtraDHCPOpts interface{} `mapstructure:"extra_dhcp_opts" json:"extra_dhcp_opts"`
+ DeviceOwner string `mapstructure:"device_owner" json:"device_owner"`
+ MACAddress string `mapstructure:"mac_address" json:"mac_address"`
+ FixedIPs []IP `mapstructure:"fixed_ips" json:"fixed_ips"`
+ ID string `mapstructure:"id" json:"id"`
+ SecurityGroups []string `mapstructure:"security_groups" json:"security_groups"`
+ DeviceID string `mapstructure:"device_id" json:"device_id"`
+ BindingHostID string `mapstructure:"binding:host_id" json:"binding:host_id"`
+ BindingVIFDetails interface{} `mapstructure:"binding:vif_details" json:"binding:vif_details"`
+ BindingVIFType string `mapstructure:"binding:vif_type" json:"binding:vif_type"`
+ BindingProfile interface{} `mapstructure:"binding:profile" json:"binding:profile"`
+ BindingVNICType string `mapstructure:"binding:vnic_type" json:"binding:vnic_type"`
+}
+
+type PortPage struct {
+ pagination.LinkedPageBase
+}
+
+func (current PortPage) NextPageURL() (string, error) {
+ type resp struct {
+ Links []struct {
+ Href string `mapstructure:"href"`
+ Rel string `mapstructure:"rel"`
+ } `mapstructure:"ports_links"`
+ }
+
+ var r resp
+ err := mapstructure.Decode(current.Body, &r)
+ if err != nil {
+ return "", err
+ }
+
+ var url string
+ for _, l := range r.Links {
+ if l.Rel == "next" {
+ url = l.Href
+ }
+ }
+ if url == "" {
+ return "", nil
+ }
+
+ return url, nil
+}
+
+func (r PortPage) IsEmpty() (bool, error) {
+ is, err := ExtractPorts(r)
+ if err != nil {
+ return true, nil
+ }
+ return len(is) == 0, nil
+}
+
+func ExtractPorts(page pagination.Page) ([]Port, error) {
+ var resp struct {
+ Ports []Port `mapstructure:"ports" json:"ports"`
+ }
+
+ err := mapstructure.Decode(page.(PortPage).Body, &resp)
+ if err != nil {
+ return nil, err
+ }
+
+ return resp.Ports, nil
+}