Add baremetal API endpoints

- drivers
- nodes

Change-Id: I7a144f146ce4ee9c028d7450b98aadb12d6a597d
Related-PROD: PROD-32734
diff --git a/openstack/baremetal/v1/drivers/requests.go b/openstack/baremetal/v1/drivers/requests.go
new file mode 100644
index 0000000..8e338e4
--- /dev/null
+++ b/openstack/baremetal/v1/drivers/requests.go
@@ -0,0 +1,12 @@
+package drivers
+
+import (
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git"
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination"
+)
+
+func List(c *gophercloud.ServiceClient) pagination.Pager {
+	return pagination.NewPager(c, listURL(c), func(r pagination.PageResult) pagination.Page {
+		return DriverPage{pagination.SinglePageBase(r)}
+	})
+}
diff --git a/openstack/baremetal/v1/drivers/results.go b/openstack/baremetal/v1/drivers/results.go
new file mode 100644
index 0000000..b3efacd
--- /dev/null
+++ b/openstack/baremetal/v1/drivers/results.go
@@ -0,0 +1,63 @@
+package drivers
+
+import (
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git"
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination"
+)
+
+type commonResult struct {
+	gophercloud.Result
+}
+
+func (r commonResult) Extract() (*Driver, error) {
+	var d struct {
+		Driver *Driver `json:"driver"`
+	}
+	err := r.ExtractInto(&d)
+	return d.Driver, err
+}
+
+type GetResult struct {
+	commonResult
+}
+
+type Link struct {
+	Href string `json:"href"`
+	Rel  string `json:"rel"`
+}
+
+type Driver struct {
+	Name       string   `json:"name"`
+	Type       string   `json:"type"`
+	Hosts      []string `json:"hosts"`
+	Links      []Link   `json:"links"`
+	Properties []Link   `json:"properties"`
+}
+
+type DriverPage struct {
+	pagination.SinglePageBase
+}
+
+func (r DriverPage) NextPageURL() (string, error) {
+	var d struct {
+		Links []gophercloud.Link `json:"drivers_links"`
+	}
+	err := r.ExtractInto(&d)
+	if err != nil {
+		return "", err
+	}
+	return gophercloud.ExtractNextURL(d.Links)
+}
+
+func (r DriverPage) IsEmpty() (bool, error) {
+	is, err := ExtractDrivers(r)
+	return len(is) == 0, err
+}
+
+func ExtractDrivers(r pagination.Page) ([]Driver, error) {
+	var d struct {
+		Drivers []Driver `json:"drivers"`
+	}
+	err := (r.(DriverPage)).ExtractInto(&d)
+	return d.Drivers, err
+}
diff --git a/openstack/baremetal/v1/drivers/urls.go b/openstack/baremetal/v1/drivers/urls.go
new file mode 100644
index 0000000..0996543
--- /dev/null
+++ b/openstack/baremetal/v1/drivers/urls.go
@@ -0,0 +1,7 @@
+package drivers
+
+import "gerrit.mcp.mirantis.net/debian/gophercloud.git"
+
+func listURL(c *gophercloud.ServiceClient) string {
+	return c.ServiceURL("drivers")
+}
diff --git a/openstack/baremetal/v1/nodes/requests.go b/openstack/baremetal/v1/nodes/requests.go
new file mode 100644
index 0000000..32264a0
--- /dev/null
+++ b/openstack/baremetal/v1/nodes/requests.go
@@ -0,0 +1,12 @@
+package nodes
+
+import (
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git"
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination"
+)
+
+func List(c *gophercloud.ServiceClient) pagination.Pager {
+	return pagination.NewPager(c, listURL(c), func(r pagination.PageResult) pagination.Page {
+		return NodePage{pagination.SinglePageBase(r)}
+	})
+}
diff --git a/openstack/baremetal/v1/nodes/results.go b/openstack/baremetal/v1/nodes/results.go
new file mode 100644
index 0000000..459ed1b
--- /dev/null
+++ b/openstack/baremetal/v1/nodes/results.go
@@ -0,0 +1,64 @@
+package nodes
+
+import (
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git"
+	"gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination"
+)
+
+type commonResult struct {
+	gophercloud.Result
+}
+
+func (r commonResult) Extract() (*Node, error) {
+	var n struct {
+		Node *Node `json:"node"`
+	}
+	err := r.ExtractInto(&n)
+	return n.Node, err
+}
+
+type GetResult struct {
+	commonResult
+}
+
+type Link struct {
+	Href string `json:"href"`
+	Rel  string `json:"rel"`
+}
+
+type Node struct {
+	UUID           string `json:"uuid"`
+	InstanceUUID   string `json:"InstanceUUID"`
+	PowerState     string `json:"power_state"`
+	ProvisionState string `json:"provision_state"`
+	Maintenance    bool   `json:"maintenance"`
+	Links          []Link `json:"links"`
+}
+
+type NodePage struct {
+	pagination.SinglePageBase
+}
+
+func (r NodePage) NextPageURL() (string, error) {
+	var n struct {
+		Links []gophercloud.Link `json:"nodes_links"`
+	}
+	err := r.ExtractInto(&n)
+	if err != nil {
+		return "", err
+	}
+	return gophercloud.ExtractNextURL(n.Links)
+}
+
+func (r NodePage) IsEmpty() (bool, error) {
+	is, err := ExtractNodes(r)
+	return len(is) == 0, err
+}
+
+func ExtractNodes(r pagination.Page) ([]Node, error) {
+	var n struct {
+		Nodes []Node `json:"nodes"`
+	}
+	err := (r.(NodePage)).ExtractInto(&n)
+	return n.Nodes, err
+}
diff --git a/openstack/baremetal/v1/nodes/urls.go b/openstack/baremetal/v1/nodes/urls.go
new file mode 100644
index 0000000..02aedbf
--- /dev/null
+++ b/openstack/baremetal/v1/nodes/urls.go
@@ -0,0 +1,7 @@
+package nodes
+
+import "gerrit.mcp.mirantis.net/debian/gophercloud.git"
+
+func listURL(c *gophercloud.ServiceClient) string {
+	return c.ServiceURL("nodes")
+}
diff --git a/openstack/client.go b/openstack/client.go
index 84543da..a5948ae 100644
--- a/openstack/client.go
+++ b/openstack/client.go
@@ -365,3 +365,14 @@
 		Endpoint:     url,
 		ResourceBase: url + "v2.0/"}, nil
 }
+
+// NewBareMetalV1 creates a ServiceClient that may be used to access the v1
+// baremetal service.
+func NewBareMetalV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
+	eo.ApplyDefaults("baremetal")
+	url, err := client.EndpointLocator(eo)
+	if err != nil {
+		return nil, err
+	}
+	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
+}