forked from TrueCloudLab/restic
131 lines
3.8 KiB
Go
131 lines
3.8 KiB
Go
package affinitygroup
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/xml"
|
|
"fmt"
|
|
|
|
"github.com/Azure/azure-sdk-for-go/management"
|
|
)
|
|
|
|
const (
|
|
azureCreateAffinityGroupURL = "/affinitygroups"
|
|
azureGetAffinityGroupURL = "/affinitygroups/%s"
|
|
azureListAffinityGroupsURL = "/affinitygroups"
|
|
azureUpdateAffinityGroupURL = "/affinitygroups/%s"
|
|
azureDeleteAffinityGroupURL = "/affinitygroups/%s"
|
|
|
|
errParameterNotSpecified = "Parameter %s not specified."
|
|
)
|
|
|
|
// AffinityGroupClient simply contains a management.Client and has
|
|
// methods for doing all affinity group-related API calls to Azure.
|
|
type AffinityGroupClient struct {
|
|
mgmtClient management.Client
|
|
}
|
|
|
|
// NewClient returns an AffinityGroupClient with the given management.Client.
|
|
func NewClient(mgmtClient management.Client) AffinityGroupClient {
|
|
return AffinityGroupClient{mgmtClient}
|
|
}
|
|
|
|
// CreateAffinityGroup creates a new affinity group.
|
|
//
|
|
// https://msdn.microsoft.com/en-us/library/azure/gg715317.aspx
|
|
func (c AffinityGroupClient) CreateAffinityGroup(params CreateAffinityGroupParams) error {
|
|
params.Label = encodeLabel(params.Label)
|
|
|
|
req, err := xml.Marshal(params)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = c.mgmtClient.SendAzurePostRequest(azureCreateAffinityGroupURL, req)
|
|
return err
|
|
}
|
|
|
|
// GetAffinityGroup returns the system properties that are associated with the
|
|
// specified affinity group.
|
|
//
|
|
// https://msdn.microsoft.com/en-us/library/azure/ee460789.aspx
|
|
func (c AffinityGroupClient) GetAffinityGroup(name string) (AffinityGroup, error) {
|
|
var affgroup AffinityGroup
|
|
if name == "" {
|
|
return affgroup, fmt.Errorf(errParameterNotSpecified, "name")
|
|
}
|
|
|
|
url := fmt.Sprintf(azureGetAffinityGroupURL, name)
|
|
resp, err := c.mgmtClient.SendAzureGetRequest(url)
|
|
if err != nil {
|
|
return affgroup, err
|
|
}
|
|
|
|
err = xml.Unmarshal(resp, &affgroup)
|
|
affgroup.Label = decodeLabel(affgroup.Label)
|
|
return affgroup, err
|
|
}
|
|
|
|
// ListAffinityGroups lists the affinity groups off Azure.
|
|
//
|
|
// https://msdn.microsoft.com/en-us/library/azure/ee460797.aspx
|
|
func (c AffinityGroupClient) ListAffinityGroups() (ListAffinityGroupsResponse, error) {
|
|
var affinitygroups ListAffinityGroupsResponse
|
|
|
|
resp, err := c.mgmtClient.SendAzureGetRequest(azureListAffinityGroupsURL)
|
|
if err != nil {
|
|
return affinitygroups, err
|
|
}
|
|
|
|
err = xml.Unmarshal(resp, &affinitygroups)
|
|
|
|
for i, grp := range affinitygroups.AffinityGroups {
|
|
affinitygroups.AffinityGroups[i].Label = decodeLabel(grp.Label)
|
|
}
|
|
|
|
return affinitygroups, err
|
|
}
|
|
|
|
// UpdateAffinityGroup updates the label or description for an the group.
|
|
//
|
|
// https://msdn.microsoft.com/en-us/library/azure/gg715316.aspx
|
|
func (c AffinityGroupClient) UpdateAffinityGroup(name string, params UpdateAffinityGroupParams) error {
|
|
if name == "" {
|
|
return fmt.Errorf(errParameterNotSpecified, "name")
|
|
}
|
|
|
|
params.Label = encodeLabel(params.Label)
|
|
req, err := xml.Marshal(params)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
url := fmt.Sprintf(azureUpdateAffinityGroupURL, name)
|
|
_, err = c.mgmtClient.SendAzurePutRequest(url, "text/xml", req)
|
|
return err
|
|
}
|
|
|
|
// DeleteAffinityGroup deletes the given affinity group.
|
|
//
|
|
// https://msdn.microsoft.com/en-us/library/azure/gg715314.aspx
|
|
func (c AffinityGroupClient) DeleteAffinityGroup(name string) error {
|
|
if name == "" {
|
|
return fmt.Errorf(errParameterNotSpecified, name)
|
|
}
|
|
|
|
url := fmt.Sprintf(azureDeleteAffinityGroupURL, name)
|
|
_, err := c.mgmtClient.SendAzureDeleteRequest(url)
|
|
return err
|
|
}
|
|
|
|
// encodeLabel is a helper function which encodes the given string
|
|
// to the base64 string which will be sent to Azure as a Label.
|
|
func encodeLabel(label string) string {
|
|
return base64.StdEncoding.EncodeToString([]byte(label))
|
|
}
|
|
|
|
// decodeLabel is a helper function which decodes the base64 encoded
|
|
// label received from Azure into standard encoding.
|
|
func decodeLabel(label string) string {
|
|
res, _ := base64.StdEncoding.DecodeString(label)
|
|
return string(res)
|
|
}
|