magellan/pkg/client/smd.go

79 lines
2.2 KiB
Go

package client
// See ref for API docs:
// https://github.com/OpenCHAMI/hms-smd/blob/master/docs/examples.adoc
// https://github.com/OpenCHAMI/hms-smd
import (
"fmt"
"net/http"
"github.com/rs/zerolog/log"
)
type SmdClient struct {
*http.Client
URI string
Xname string
}
func (c *SmdClient) Init() {
c.Client = &http.Client{}
}
func (c *SmdClient) Name() string {
return "smd"
}
func (c *SmdClient) RootEndpoint(endpoint string) string {
return fmt.Sprintf("%s/hsm/v2%s", c.URI, endpoint)
}
func (c *SmdClient) GetInternalClient() *http.Client {
return c.Client
}
// Add() has a similar function definition to that of the default implementation,
// but also allows further customization and data/header manipulation that would
// be specific and/or unique to SMD's API.
func (c *SmdClient) Add(data HTTPBody, headers HTTPHeader) error {
if data == nil {
return fmt.Errorf("failed to add redfish endpoint: no data found")
}
// Add redfish endpoint via POST `/hsm/v2/Inventory/RedfishEndpoints` endpoint
url := c.RootEndpoint("/Inventory/RedfishEndpoints")
res, body, err := MakeRequest(c.Client, url, http.MethodPost, data, headers)
if res != nil {
statusOk := res.StatusCode >= 200 && res.StatusCode < 300
if !statusOk {
if len(body) > 0 {
return fmt.Errorf("%d: %s", res.StatusCode, string(body))
} else {
return fmt.Errorf("returned status code %d when adding endpoint", res.StatusCode)
}
}
log.Debug().Msgf("%v (%v)\n%s\n", url, res.Status, string(body))
}
return err
}
func (c *SmdClient) Update(data HTTPBody, headers HTTPHeader) error {
if data == nil {
return fmt.Errorf("failed to add redfish endpoint: no data found")
}
// Update redfish endpoint via PUT `/hsm/v2/Inventory/RedfishEndpoints` endpoint
url := c.RootEndpoint("/Inventory/RedfishEndpoints/" + c.Xname)
res, body, err := MakeRequest(c.Client, url, http.MethodPut, data, headers)
if res != nil {
statusOk := res.StatusCode >= 200 && res.StatusCode < 300
if !statusOk {
if len(body) > 0 {
return fmt.Errorf("%d: %s", res.StatusCode, string(body))
} else {
return fmt.Errorf("failed to update redfish endpoint (returned %s)", res.Status)
}
}
log.Debug().Msgf("%v (%v)\n%s\n", url, res.Status, string(body))
}
return err
}