1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
// +build go1.7
package affinitygroup
// Copyright 2017 Microsoft Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import (
"encoding/base64"
"encoding/xml"
"fmt"
"github.com/Azure/azure-sdk-for-go/services/classic/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)
}
|