forked from Ivasoft/traefik
Update lego
This commit is contained in:
committed by
Traefiker Bot
parent
0a89cccdc0
commit
73e0561610
340
vendor/github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2017-09-01/dns/models.go
generated
vendored
340
vendor/github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2017-09-01/dns/models.go
generated
vendored
@@ -18,13 +18,18 @@ package dns
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/to"
|
||||
"github.com/Azure/go-autorest/tracing"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// The package's fully qualified name.
|
||||
const fqdn = "github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2017-09-01/dns"
|
||||
|
||||
// RecordType enumerates the values for record type.
|
||||
type RecordType string
|
||||
|
||||
@@ -68,6 +73,18 @@ type ARecord struct {
|
||||
Ipv4Address *string `json:"ipv4Address,omitempty"`
|
||||
}
|
||||
|
||||
// AzureEntityResource the resource model definition for a Azure Resource Manager resource with an etag.
|
||||
type AzureEntityResource struct {
|
||||
// Etag - READ-ONLY; Resource Etag.
|
||||
Etag *string `json:"etag,omitempty"`
|
||||
// ID - READ-ONLY; Fully qualified resource Id for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; The name of the resource
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; The type of the resource. Ex- Microsoft.Compute/virtualMachines or Microsoft.Storage/storageAccounts.
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// CaaRecord a CAA record.
|
||||
type CaaRecord struct {
|
||||
// Flags - The flags for this CAA record as an integer between 0 and 255.
|
||||
@@ -116,6 +133,17 @@ type NsRecord struct {
|
||||
Nsdname *string `json:"nsdname,omitempty"`
|
||||
}
|
||||
|
||||
// ProxyResource the resource model definition for a ARM proxy resource. It will have everything other than
|
||||
// required location and tags
|
||||
type ProxyResource struct {
|
||||
// ID - READ-ONLY; Fully qualified resource Id for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; The name of the resource
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; The type of the resource. Ex- Microsoft.Compute/virtualMachines or Microsoft.Storage/storageAccounts.
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// PtrRecord a PTR record.
|
||||
type PtrRecord struct {
|
||||
// Ptrdname - The PTR target domain name for this PTR record.
|
||||
@@ -125,11 +153,11 @@ type PtrRecord struct {
|
||||
// RecordSet describes a DNS record set (a collection of DNS records with the same name and type).
|
||||
type RecordSet struct {
|
||||
autorest.Response `json:"-"`
|
||||
// ID - The ID of the record set.
|
||||
// ID - READ-ONLY; The ID of the record set.
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - The name of the record set.
|
||||
// Name - READ-ONLY; The name of the record set.
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - The type of the record set.
|
||||
// Type - READ-ONLY; The type of the record set.
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Etag - The etag of the record set.
|
||||
Etag *string `json:"etag,omitempty"`
|
||||
@@ -140,15 +168,6 @@ type RecordSet struct {
|
||||
// MarshalJSON is the custom marshaler for RecordSet.
|
||||
func (rs RecordSet) MarshalJSON() ([]byte, error) {
|
||||
objectMap := make(map[string]interface{})
|
||||
if rs.ID != nil {
|
||||
objectMap["id"] = rs.ID
|
||||
}
|
||||
if rs.Name != nil {
|
||||
objectMap["name"] = rs.Name
|
||||
}
|
||||
if rs.Type != nil {
|
||||
objectMap["type"] = rs.Type
|
||||
}
|
||||
if rs.Etag != nil {
|
||||
objectMap["etag"] = rs.Etag
|
||||
}
|
||||
@@ -223,7 +242,7 @@ type RecordSetListResult struct {
|
||||
autorest.Response `json:"-"`
|
||||
// Value - Information about the record sets in the response.
|
||||
Value *[]RecordSet `json:"value,omitempty"`
|
||||
// NextLink - The continuation token for the next page of results.
|
||||
// NextLink - READ-ONLY; The continuation token for the next page of results.
|
||||
NextLink *string `json:"nextLink,omitempty"`
|
||||
}
|
||||
|
||||
@@ -233,14 +252,24 @@ type RecordSetListResultIterator struct {
|
||||
page RecordSetListResultPage
|
||||
}
|
||||
|
||||
// Next advances to the next value. If there was an error making
|
||||
// NextWithContext advances to the next value. If there was an error making
|
||||
// the request the iterator does not advance and the error is returned.
|
||||
func (iter *RecordSetListResultIterator) Next() error {
|
||||
func (iter *RecordSetListResultIterator) NextWithContext(ctx context.Context) (err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetListResultIterator.NextWithContext")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if iter.Response().Response.Response != nil {
|
||||
sc = iter.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
iter.i++
|
||||
if iter.i < len(iter.page.Values()) {
|
||||
return nil
|
||||
}
|
||||
err := iter.page.Next()
|
||||
err = iter.page.NextWithContext(ctx)
|
||||
if err != nil {
|
||||
iter.i--
|
||||
return err
|
||||
@@ -249,6 +278,13 @@ func (iter *RecordSetListResultIterator) Next() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Next advances to the next value. If there was an error making
|
||||
// the request the iterator does not advance and the error is returned.
|
||||
// Deprecated: Use NextWithContext() instead.
|
||||
func (iter *RecordSetListResultIterator) Next() error {
|
||||
return iter.NextWithContext(context.Background())
|
||||
}
|
||||
|
||||
// NotDone returns true if the enumeration should be started or is not yet complete.
|
||||
func (iter RecordSetListResultIterator) NotDone() bool {
|
||||
return iter.page.NotDone() && iter.i < len(iter.page.Values())
|
||||
@@ -268,6 +304,11 @@ func (iter RecordSetListResultIterator) Value() RecordSet {
|
||||
return iter.page.Values()[iter.i]
|
||||
}
|
||||
|
||||
// Creates a new instance of the RecordSetListResultIterator type.
|
||||
func NewRecordSetListResultIterator(page RecordSetListResultPage) RecordSetListResultIterator {
|
||||
return RecordSetListResultIterator{page: page}
|
||||
}
|
||||
|
||||
// IsEmpty returns true if the ListResult contains no values.
|
||||
func (rslr RecordSetListResult) IsEmpty() bool {
|
||||
return rslr.Value == nil || len(*rslr.Value) == 0
|
||||
@@ -275,11 +316,11 @@ func (rslr RecordSetListResult) IsEmpty() bool {
|
||||
|
||||
// recordSetListResultPreparer prepares a request to retrieve the next set of results.
|
||||
// It returns nil if no more results exist.
|
||||
func (rslr RecordSetListResult) recordSetListResultPreparer() (*http.Request, error) {
|
||||
func (rslr RecordSetListResult) recordSetListResultPreparer(ctx context.Context) (*http.Request, error) {
|
||||
if rslr.NextLink == nil || len(to.String(rslr.NextLink)) < 1 {
|
||||
return nil, nil
|
||||
}
|
||||
return autorest.Prepare(&http.Request{},
|
||||
return autorest.Prepare((&http.Request{}).WithContext(ctx),
|
||||
autorest.AsJSON(),
|
||||
autorest.AsGet(),
|
||||
autorest.WithBaseURL(to.String(rslr.NextLink)))
|
||||
@@ -287,14 +328,24 @@ func (rslr RecordSetListResult) recordSetListResultPreparer() (*http.Request, er
|
||||
|
||||
// RecordSetListResultPage contains a page of RecordSet values.
|
||||
type RecordSetListResultPage struct {
|
||||
fn func(RecordSetListResult) (RecordSetListResult, error)
|
||||
fn func(context.Context, RecordSetListResult) (RecordSetListResult, error)
|
||||
rslr RecordSetListResult
|
||||
}
|
||||
|
||||
// Next advances to the next page of values. If there was an error making
|
||||
// NextWithContext advances to the next page of values. If there was an error making
|
||||
// the request the page does not advance and the error is returned.
|
||||
func (page *RecordSetListResultPage) Next() error {
|
||||
next, err := page.fn(page.rslr)
|
||||
func (page *RecordSetListResultPage) NextWithContext(ctx context.Context) (err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetListResultPage.NextWithContext")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if page.Response().Response.Response != nil {
|
||||
sc = page.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
next, err := page.fn(ctx, page.rslr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -302,6 +353,13 @@ func (page *RecordSetListResultPage) Next() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Next advances to the next page of values. If there was an error making
|
||||
// the request the page does not advance and the error is returned.
|
||||
// Deprecated: Use NextWithContext() instead.
|
||||
func (page *RecordSetListResultPage) Next() error {
|
||||
return page.NextWithContext(context.Background())
|
||||
}
|
||||
|
||||
// NotDone returns true if the page enumeration should be started or is not yet complete.
|
||||
func (page RecordSetListResultPage) NotDone() bool {
|
||||
return !page.rslr.IsEmpty()
|
||||
@@ -320,13 +378,18 @@ func (page RecordSetListResultPage) Values() []RecordSet {
|
||||
return *page.rslr.Value
|
||||
}
|
||||
|
||||
// Creates a new instance of the RecordSetListResultPage type.
|
||||
func NewRecordSetListResultPage(getNextPage func(context.Context, RecordSetListResult) (RecordSetListResult, error)) RecordSetListResultPage {
|
||||
return RecordSetListResultPage{fn: getNextPage}
|
||||
}
|
||||
|
||||
// RecordSetProperties represents the properties of the records in the record set.
|
||||
type RecordSetProperties struct {
|
||||
// Metadata - The metadata attached to the record set.
|
||||
Metadata map[string]*string `json:"metadata"`
|
||||
// TTL - The TTL (time-to-live) of the records in the record set.
|
||||
TTL *int64 `json:"TTL,omitempty"`
|
||||
// Fqdn - Fully qualified domain name of the record set.
|
||||
// Fqdn - READ-ONLY; Fully qualified domain name of the record set.
|
||||
Fqdn *string `json:"fqdn,omitempty"`
|
||||
// ARecords - The list of A records in the record set.
|
||||
ARecords *[]ARecord `json:"ARecords,omitempty"`
|
||||
@@ -359,9 +422,6 @@ func (rsp RecordSetProperties) MarshalJSON() ([]byte, error) {
|
||||
if rsp.TTL != nil {
|
||||
objectMap["TTL"] = rsp.TTL
|
||||
}
|
||||
if rsp.Fqdn != nil {
|
||||
objectMap["fqdn"] = rsp.Fqdn
|
||||
}
|
||||
if rsp.ARecords != nil {
|
||||
objectMap["ARecords"] = rsp.ARecords
|
||||
}
|
||||
@@ -401,39 +461,14 @@ type RecordSetUpdateParameters struct {
|
||||
RecordSet *RecordSet `json:"RecordSet,omitempty"`
|
||||
}
|
||||
|
||||
// Resource common properties of an Azure Resource Manager resource
|
||||
// Resource ...
|
||||
type Resource struct {
|
||||
// ID - Resource ID.
|
||||
// ID - READ-ONLY; Fully qualified resource Id for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - Resource name.
|
||||
// Name - READ-ONLY; The name of the resource
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - Resource type.
|
||||
// Type - READ-ONLY; The type of the resource. Ex- Microsoft.Compute/virtualMachines or Microsoft.Storage/storageAccounts.
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Location - Resource location.
|
||||
Location *string `json:"location,omitempty"`
|
||||
// Tags - Resource tags.
|
||||
Tags map[string]*string `json:"tags"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for Resource.
|
||||
func (r Resource) MarshalJSON() ([]byte, error) {
|
||||
objectMap := make(map[string]interface{})
|
||||
if r.ID != nil {
|
||||
objectMap["id"] = r.ID
|
||||
}
|
||||
if r.Name != nil {
|
||||
objectMap["name"] = r.Name
|
||||
}
|
||||
if r.Type != nil {
|
||||
objectMap["type"] = r.Type
|
||||
}
|
||||
if r.Location != nil {
|
||||
objectMap["location"] = r.Location
|
||||
}
|
||||
if r.Tags != nil {
|
||||
objectMap["tags"] = r.Tags
|
||||
}
|
||||
return json.Marshal(objectMap)
|
||||
}
|
||||
|
||||
// SoaRecord an SOA record.
|
||||
@@ -472,6 +507,32 @@ type SubResource struct {
|
||||
ID *string `json:"id,omitempty"`
|
||||
}
|
||||
|
||||
// TrackedResource the resource model definition for a ARM tracked top level resource
|
||||
type TrackedResource struct {
|
||||
// Tags - Resource tags.
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// Location - The geo-location where the resource lives
|
||||
Location *string `json:"location,omitempty"`
|
||||
// ID - READ-ONLY; Fully qualified resource Id for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; The name of the resource
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; The type of the resource. Ex- Microsoft.Compute/virtualMachines or Microsoft.Storage/storageAccounts.
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for TrackedResource.
|
||||
func (tr TrackedResource) MarshalJSON() ([]byte, error) {
|
||||
objectMap := make(map[string]interface{})
|
||||
if tr.Tags != nil {
|
||||
objectMap["tags"] = tr.Tags
|
||||
}
|
||||
if tr.Location != nil {
|
||||
objectMap["location"] = tr.Location
|
||||
}
|
||||
return json.Marshal(objectMap)
|
||||
}
|
||||
|
||||
// TxtRecord a TXT record.
|
||||
type TxtRecord struct {
|
||||
// Value - The text value of this TXT record.
|
||||
@@ -485,16 +546,16 @@ type Zone struct {
|
||||
Etag *string `json:"etag,omitempty"`
|
||||
// ZoneProperties - The properties of the zone.
|
||||
*ZoneProperties `json:"properties,omitempty"`
|
||||
// ID - Resource ID.
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - Resource name.
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - Resource type.
|
||||
Type *string `json:"type,omitempty"`
|
||||
// Location - Resource location.
|
||||
Location *string `json:"location,omitempty"`
|
||||
// Tags - Resource tags.
|
||||
Tags map[string]*string `json:"tags"`
|
||||
// Location - The geo-location where the resource lives
|
||||
Location *string `json:"location,omitempty"`
|
||||
// ID - READ-ONLY; Fully qualified resource Id for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
|
||||
ID *string `json:"id,omitempty"`
|
||||
// Name - READ-ONLY; The name of the resource
|
||||
Name *string `json:"name,omitempty"`
|
||||
// Type - READ-ONLY; The type of the resource. Ex- Microsoft.Compute/virtualMachines or Microsoft.Storage/storageAccounts.
|
||||
Type *string `json:"type,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is the custom marshaler for Zone.
|
||||
@@ -506,21 +567,12 @@ func (z Zone) MarshalJSON() ([]byte, error) {
|
||||
if z.ZoneProperties != nil {
|
||||
objectMap["properties"] = z.ZoneProperties
|
||||
}
|
||||
if z.ID != nil {
|
||||
objectMap["id"] = z.ID
|
||||
}
|
||||
if z.Name != nil {
|
||||
objectMap["name"] = z.Name
|
||||
}
|
||||
if z.Type != nil {
|
||||
objectMap["type"] = z.Type
|
||||
if z.Tags != nil {
|
||||
objectMap["tags"] = z.Tags
|
||||
}
|
||||
if z.Location != nil {
|
||||
objectMap["location"] = z.Location
|
||||
}
|
||||
if z.Tags != nil {
|
||||
objectMap["tags"] = z.Tags
|
||||
}
|
||||
return json.Marshal(objectMap)
|
||||
}
|
||||
|
||||
@@ -551,6 +603,24 @@ func (z *Zone) UnmarshalJSON(body []byte) error {
|
||||
}
|
||||
z.ZoneProperties = &zoneProperties
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
z.Tags = tags
|
||||
}
|
||||
case "location":
|
||||
if v != nil {
|
||||
var location string
|
||||
err = json.Unmarshal(*v, &location)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
z.Location = &location
|
||||
}
|
||||
case "id":
|
||||
if v != nil {
|
||||
var ID string
|
||||
@@ -578,24 +648,6 @@ func (z *Zone) UnmarshalJSON(body []byte) error {
|
||||
}
|
||||
z.Type = &typeVar
|
||||
}
|
||||
case "location":
|
||||
if v != nil {
|
||||
var location string
|
||||
err = json.Unmarshal(*v, &location)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
z.Location = &location
|
||||
}
|
||||
case "tags":
|
||||
if v != nil {
|
||||
var tags map[string]*string
|
||||
err = json.Unmarshal(*v, &tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
z.Tags = tags
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -607,7 +659,7 @@ type ZoneListResult struct {
|
||||
autorest.Response `json:"-"`
|
||||
// Value - Information about the DNS zones.
|
||||
Value *[]Zone `json:"value,omitempty"`
|
||||
// NextLink - The continuation token for the next page of results.
|
||||
// NextLink - READ-ONLY; The continuation token for the next page of results.
|
||||
NextLink *string `json:"nextLink,omitempty"`
|
||||
}
|
||||
|
||||
@@ -617,14 +669,24 @@ type ZoneListResultIterator struct {
|
||||
page ZoneListResultPage
|
||||
}
|
||||
|
||||
// Next advances to the next value. If there was an error making
|
||||
// NextWithContext advances to the next value. If there was an error making
|
||||
// the request the iterator does not advance and the error is returned.
|
||||
func (iter *ZoneListResultIterator) Next() error {
|
||||
func (iter *ZoneListResultIterator) NextWithContext(ctx context.Context) (err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZoneListResultIterator.NextWithContext")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if iter.Response().Response.Response != nil {
|
||||
sc = iter.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
iter.i++
|
||||
if iter.i < len(iter.page.Values()) {
|
||||
return nil
|
||||
}
|
||||
err := iter.page.Next()
|
||||
err = iter.page.NextWithContext(ctx)
|
||||
if err != nil {
|
||||
iter.i--
|
||||
return err
|
||||
@@ -633,6 +695,13 @@ func (iter *ZoneListResultIterator) Next() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Next advances to the next value. If there was an error making
|
||||
// the request the iterator does not advance and the error is returned.
|
||||
// Deprecated: Use NextWithContext() instead.
|
||||
func (iter *ZoneListResultIterator) Next() error {
|
||||
return iter.NextWithContext(context.Background())
|
||||
}
|
||||
|
||||
// NotDone returns true if the enumeration should be started or is not yet complete.
|
||||
func (iter ZoneListResultIterator) NotDone() bool {
|
||||
return iter.page.NotDone() && iter.i < len(iter.page.Values())
|
||||
@@ -652,6 +721,11 @@ func (iter ZoneListResultIterator) Value() Zone {
|
||||
return iter.page.Values()[iter.i]
|
||||
}
|
||||
|
||||
// Creates a new instance of the ZoneListResultIterator type.
|
||||
func NewZoneListResultIterator(page ZoneListResultPage) ZoneListResultIterator {
|
||||
return ZoneListResultIterator{page: page}
|
||||
}
|
||||
|
||||
// IsEmpty returns true if the ListResult contains no values.
|
||||
func (zlr ZoneListResult) IsEmpty() bool {
|
||||
return zlr.Value == nil || len(*zlr.Value) == 0
|
||||
@@ -659,11 +733,11 @@ func (zlr ZoneListResult) IsEmpty() bool {
|
||||
|
||||
// zoneListResultPreparer prepares a request to retrieve the next set of results.
|
||||
// It returns nil if no more results exist.
|
||||
func (zlr ZoneListResult) zoneListResultPreparer() (*http.Request, error) {
|
||||
func (zlr ZoneListResult) zoneListResultPreparer(ctx context.Context) (*http.Request, error) {
|
||||
if zlr.NextLink == nil || len(to.String(zlr.NextLink)) < 1 {
|
||||
return nil, nil
|
||||
}
|
||||
return autorest.Prepare(&http.Request{},
|
||||
return autorest.Prepare((&http.Request{}).WithContext(ctx),
|
||||
autorest.AsJSON(),
|
||||
autorest.AsGet(),
|
||||
autorest.WithBaseURL(to.String(zlr.NextLink)))
|
||||
@@ -671,14 +745,24 @@ func (zlr ZoneListResult) zoneListResultPreparer() (*http.Request, error) {
|
||||
|
||||
// ZoneListResultPage contains a page of Zone values.
|
||||
type ZoneListResultPage struct {
|
||||
fn func(ZoneListResult) (ZoneListResult, error)
|
||||
fn func(context.Context, ZoneListResult) (ZoneListResult, error)
|
||||
zlr ZoneListResult
|
||||
}
|
||||
|
||||
// Next advances to the next page of values. If there was an error making
|
||||
// NextWithContext advances to the next page of values. If there was an error making
|
||||
// the request the page does not advance and the error is returned.
|
||||
func (page *ZoneListResultPage) Next() error {
|
||||
next, err := page.fn(page.zlr)
|
||||
func (page *ZoneListResultPage) NextWithContext(ctx context.Context) (err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZoneListResultPage.NextWithContext")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if page.Response().Response.Response != nil {
|
||||
sc = page.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
next, err := page.fn(ctx, page.zlr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -686,6 +770,13 @@ func (page *ZoneListResultPage) Next() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Next advances to the next page of values. If there was an error making
|
||||
// the request the page does not advance and the error is returned.
|
||||
// Deprecated: Use NextWithContext() instead.
|
||||
func (page *ZoneListResultPage) Next() error {
|
||||
return page.NextWithContext(context.Background())
|
||||
}
|
||||
|
||||
// NotDone returns true if the page enumeration should be started or is not yet complete.
|
||||
func (page ZoneListResultPage) NotDone() bool {
|
||||
return !page.zlr.IsEmpty()
|
||||
@@ -704,60 +795,39 @@ func (page ZoneListResultPage) Values() []Zone {
|
||||
return *page.zlr.Value
|
||||
}
|
||||
|
||||
// Creates a new instance of the ZoneListResultPage type.
|
||||
func NewZoneListResultPage(getNextPage func(context.Context, ZoneListResult) (ZoneListResult, error)) ZoneListResultPage {
|
||||
return ZoneListResultPage{fn: getNextPage}
|
||||
}
|
||||
|
||||
// ZoneProperties represents the properties of the zone.
|
||||
type ZoneProperties struct {
|
||||
// MaxNumberOfRecordSets - The maximum number of record sets that can be created in this DNS zone. This is a read-only property and any attempt to set this value will be ignored.
|
||||
// MaxNumberOfRecordSets - READ-ONLY; The maximum number of record sets that can be created in this DNS zone. This is a read-only property and any attempt to set this value will be ignored.
|
||||
MaxNumberOfRecordSets *int64 `json:"maxNumberOfRecordSets,omitempty"`
|
||||
// NumberOfRecordSets - The current number of record sets in this DNS zone. This is a read-only property and any attempt to set this value will be ignored.
|
||||
// NumberOfRecordSets - READ-ONLY; The current number of record sets in this DNS zone. This is a read-only property and any attempt to set this value will be ignored.
|
||||
NumberOfRecordSets *int64 `json:"numberOfRecordSets,omitempty"`
|
||||
// NameServers - The name servers for this DNS zone. This is a read-only property and any attempt to set this value will be ignored.
|
||||
// NameServers - READ-ONLY; The name servers for this DNS zone. This is a read-only property and any attempt to set this value will be ignored.
|
||||
NameServers *[]string `json:"nameServers,omitempty"`
|
||||
}
|
||||
|
||||
// ZonesDeleteFuture an abstraction for monitoring and retrieving the results of a long-running operation.
|
||||
type ZonesDeleteFuture struct {
|
||||
azure.Future
|
||||
req *http.Request
|
||||
}
|
||||
|
||||
// Result returns the result of the asynchronous operation.
|
||||
// If the operation has not completed it will return an error.
|
||||
func (future ZonesDeleteFuture) Result(client ZonesClient) (ar autorest.Response, err error) {
|
||||
func (future *ZonesDeleteFuture) Result(client ZonesClient) (ar autorest.Response, err error) {
|
||||
var done bool
|
||||
done, err = future.Done(client)
|
||||
done, err = future.DoneWithContext(context.Background(), client)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.ZonesDeleteFuture", "Result", future.Response(), "Polling failure")
|
||||
return
|
||||
}
|
||||
if !done {
|
||||
return ar, azure.NewAsyncOpIncompleteError("dns.ZonesDeleteFuture")
|
||||
}
|
||||
if future.PollingMethod() == azure.PollingLocation {
|
||||
ar, err = client.DeleteResponder(future.Response())
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.ZonesDeleteFuture", "Result", future.Response(), "Failure responding to request")
|
||||
}
|
||||
err = azure.NewAsyncOpIncompleteError("dns.ZonesDeleteFuture")
|
||||
return
|
||||
}
|
||||
var req *http.Request
|
||||
var resp *http.Response
|
||||
if future.PollingURL() != "" {
|
||||
req, err = http.NewRequest(http.MethodGet, future.PollingURL(), nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
req = autorest.ChangeToGet(future.req)
|
||||
}
|
||||
resp, err = autorest.SendWithSender(client, req,
|
||||
autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.ZonesDeleteFuture", "Result", resp, "Failure sending request")
|
||||
return
|
||||
}
|
||||
ar, err = client.DeleteResponder(resp)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.ZonesDeleteFuture", "Result", resp, "Failure responding to request")
|
||||
}
|
||||
ar.Response = future.Response()
|
||||
return
|
||||
}
|
||||
|
||||
235
vendor/github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2017-09-01/dns/recordsets.go
generated
vendored
235
vendor/github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2017-09-01/dns/recordsets.go
generated
vendored
@@ -21,6 +21,8 @@ import (
|
||||
"context"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/validation"
|
||||
"github.com/Azure/go-autorest/tracing"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
@@ -40,15 +42,38 @@ func NewRecordSetsClientWithBaseURI(baseURI string, subscriptionID string) Recor
|
||||
}
|
||||
|
||||
// CreateOrUpdate creates or updates a record set within a DNS zone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). relativeRecordSetName is the name of the record set, relative to the name of the zone. recordType is the
|
||||
// type of DNS record in this record set. Record sets of type SOA can be updated but not created (they are created
|
||||
// when the DNS zone is created). parameters is parameters supplied to the CreateOrUpdate operation. ifMatch is the
|
||||
// etag of the record set. Omit this value to always overwrite the current record set. Specify the last-seen etag
|
||||
// value to prevent accidentally overwritting any concurrent changes. ifNoneMatch is set to '*' to allow a new
|
||||
// record set to be created, but to prevent updating an existing record set. Other values will be ignored.
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// relativeRecordSetName - the name of the record set, relative to the name of the zone.
|
||||
// recordType - the type of DNS record in this record set. Record sets of type SOA can be updated but not
|
||||
// created (they are created when the DNS zone is created).
|
||||
// parameters - parameters supplied to the CreateOrUpdate operation.
|
||||
// ifMatch - the etag of the record set. Omit this value to always overwrite the current record set. Specify
|
||||
// the last-seen etag value to prevent accidentally overwriting any concurrent changes.
|
||||
// ifNoneMatch - set to '*' to allow a new record set to be created, but to prevent updating an existing record
|
||||
// set. Other values will be ignored.
|
||||
func (client RecordSetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, zoneName string, relativeRecordSetName string, recordType RecordType, parameters RecordSet, ifMatch string, ifNoneMatch string) (result RecordSet, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.CreateOrUpdate")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response.Response != nil {
|
||||
sc = result.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.RecordSetsClient", "CreateOrUpdate", err.Error())
|
||||
}
|
||||
|
||||
req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, zoneName, relativeRecordSetName, recordType, parameters, ifMatch, ifNoneMatch)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.RecordSetsClient", "CreateOrUpdate", nil, "Failure preparing request")
|
||||
@@ -85,6 +110,9 @@ func (client RecordSetsClient) CreateOrUpdatePreparer(ctx context.Context, resou
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
||||
parameters.ID = nil
|
||||
parameters.Name = nil
|
||||
parameters.Type = nil
|
||||
preparer := autorest.CreatePreparer(
|
||||
autorest.AsContentType("application/json; charset=utf-8"),
|
||||
autorest.AsPut(),
|
||||
@@ -124,13 +152,35 @@ func (client RecordSetsClient) CreateOrUpdateResponder(resp *http.Response) (res
|
||||
}
|
||||
|
||||
// Delete deletes a record set from a DNS zone. This operation cannot be undone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). relativeRecordSetName is the name of the record set, relative to the name of the zone. recordType is the
|
||||
// type of DNS record in this record set. Record sets of type SOA cannot be deleted (they are deleted when the DNS
|
||||
// zone is deleted). ifMatch is the etag of the record set. Omit this value to always delete the current record
|
||||
// set. Specify the last-seen etag value to prevent accidentally deleting any concurrent changes.
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// relativeRecordSetName - the name of the record set, relative to the name of the zone.
|
||||
// recordType - the type of DNS record in this record set. Record sets of type SOA cannot be deleted (they are
|
||||
// deleted when the DNS zone is deleted).
|
||||
// ifMatch - the etag of the record set. Omit this value to always delete the current record set. Specify the
|
||||
// last-seen etag value to prevent accidentally deleting any concurrent changes.
|
||||
func (client RecordSetsClient) Delete(ctx context.Context, resourceGroupName string, zoneName string, relativeRecordSetName string, recordType RecordType, ifMatch string) (result autorest.Response, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.Delete")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response != nil {
|
||||
sc = result.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.RecordSetsClient", "Delete", err.Error())
|
||||
}
|
||||
|
||||
req, err := client.DeletePreparer(ctx, resourceGroupName, zoneName, relativeRecordSetName, recordType, ifMatch)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.RecordSetsClient", "Delete", nil, "Failure preparing request")
|
||||
@@ -199,11 +249,32 @@ func (client RecordSetsClient) DeleteResponder(resp *http.Response) (result auto
|
||||
}
|
||||
|
||||
// Get gets a record set.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). relativeRecordSetName is the name of the record set, relative to the name of the zone. recordType is the
|
||||
// type of DNS record in this record set.
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// relativeRecordSetName - the name of the record set, relative to the name of the zone.
|
||||
// recordType - the type of DNS record in this record set.
|
||||
func (client RecordSetsClient) Get(ctx context.Context, resourceGroupName string, zoneName string, relativeRecordSetName string, recordType RecordType) (result RecordSet, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.Get")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response.Response != nil {
|
||||
sc = result.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.RecordSetsClient", "Get", err.Error())
|
||||
}
|
||||
|
||||
req, err := client.GetPreparer(ctx, resourceGroupName, zoneName, relativeRecordSetName, recordType)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.RecordSetsClient", "Get", nil, "Failure preparing request")
|
||||
@@ -269,13 +340,34 @@ func (client RecordSetsClient) GetResponder(resp *http.Response) (result RecordS
|
||||
}
|
||||
|
||||
// ListByDNSZone lists all record sets in a DNS zone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). top is the maximum number of record sets to return. If not specified, returns up to 100 record sets.
|
||||
// recordsetnamesuffix is the suffix label of the record set name that has to be used to filter the record set
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// top - the maximum number of record sets to return. If not specified, returns up to 100 record sets.
|
||||
// recordsetnamesuffix - the suffix label of the record set name that has to be used to filter the record set
|
||||
// enumerations. If this parameter is specified, Enumeration will return only records that end with
|
||||
// .<recordSetNameSuffix>
|
||||
func (client RecordSetsClient) ListByDNSZone(ctx context.Context, resourceGroupName string, zoneName string, top *int32, recordsetnamesuffix string) (result RecordSetListResultPage, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.ListByDNSZone")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.rslr.Response.Response != nil {
|
||||
sc = result.rslr.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.RecordSetsClient", "ListByDNSZone", err.Error())
|
||||
}
|
||||
|
||||
result.fn = client.listByDNSZoneNextResults
|
||||
req, err := client.ListByDNSZonePreparer(ctx, resourceGroupName, zoneName, top, recordsetnamesuffix)
|
||||
if err != nil {
|
||||
@@ -346,8 +438,8 @@ func (client RecordSetsClient) ListByDNSZoneResponder(resp *http.Response) (resu
|
||||
}
|
||||
|
||||
// listByDNSZoneNextResults retrieves the next set of results, if any.
|
||||
func (client RecordSetsClient) listByDNSZoneNextResults(lastResults RecordSetListResult) (result RecordSetListResult, err error) {
|
||||
req, err := lastResults.recordSetListResultPreparer()
|
||||
func (client RecordSetsClient) listByDNSZoneNextResults(ctx context.Context, lastResults RecordSetListResult) (result RecordSetListResult, err error) {
|
||||
req, err := lastResults.recordSetListResultPreparer(ctx)
|
||||
if err != nil {
|
||||
return result, autorest.NewErrorWithError(err, "dns.RecordSetsClient", "listByDNSZoneNextResults", nil, "Failure preparing next results request")
|
||||
}
|
||||
@@ -368,18 +460,50 @@ func (client RecordSetsClient) listByDNSZoneNextResults(lastResults RecordSetLis
|
||||
|
||||
// ListByDNSZoneComplete enumerates all values, automatically crossing page boundaries as required.
|
||||
func (client RecordSetsClient) ListByDNSZoneComplete(ctx context.Context, resourceGroupName string, zoneName string, top *int32, recordsetnamesuffix string) (result RecordSetListResultIterator, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.ListByDNSZone")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response().Response.Response != nil {
|
||||
sc = result.page.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
result.page, err = client.ListByDNSZone(ctx, resourceGroupName, zoneName, top, recordsetnamesuffix)
|
||||
return
|
||||
}
|
||||
|
||||
// ListByType lists the record sets of a specified type in a DNS zone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). recordType is the type of record sets to enumerate. top is the maximum number of record sets to return. If
|
||||
// not specified, returns up to 100 record sets. recordsetnamesuffix is the suffix label of the record set name
|
||||
// that has to be used to filter the record set enumerations. If this parameter is specified, Enumeration will
|
||||
// return only records that end with .<recordSetNameSuffix>
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// recordType - the type of record sets to enumerate.
|
||||
// top - the maximum number of record sets to return. If not specified, returns up to 100 record sets.
|
||||
// recordsetnamesuffix - the suffix label of the record set name that has to be used to filter the record set
|
||||
// enumerations. If this parameter is specified, Enumeration will return only records that end with
|
||||
// .<recordSetNameSuffix>
|
||||
func (client RecordSetsClient) ListByType(ctx context.Context, resourceGroupName string, zoneName string, recordType RecordType, top *int32, recordsetnamesuffix string) (result RecordSetListResultPage, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.ListByType")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.rslr.Response.Response != nil {
|
||||
sc = result.rslr.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.RecordSetsClient", "ListByType", err.Error())
|
||||
}
|
||||
|
||||
result.fn = client.listByTypeNextResults
|
||||
req, err := client.ListByTypePreparer(ctx, resourceGroupName, zoneName, recordType, top, recordsetnamesuffix)
|
||||
if err != nil {
|
||||
@@ -451,8 +575,8 @@ func (client RecordSetsClient) ListByTypeResponder(resp *http.Response) (result
|
||||
}
|
||||
|
||||
// listByTypeNextResults retrieves the next set of results, if any.
|
||||
func (client RecordSetsClient) listByTypeNextResults(lastResults RecordSetListResult) (result RecordSetListResult, err error) {
|
||||
req, err := lastResults.recordSetListResultPreparer()
|
||||
func (client RecordSetsClient) listByTypeNextResults(ctx context.Context, lastResults RecordSetListResult) (result RecordSetListResult, err error) {
|
||||
req, err := lastResults.recordSetListResultPreparer(ctx)
|
||||
if err != nil {
|
||||
return result, autorest.NewErrorWithError(err, "dns.RecordSetsClient", "listByTypeNextResults", nil, "Failure preparing next results request")
|
||||
}
|
||||
@@ -473,18 +597,50 @@ func (client RecordSetsClient) listByTypeNextResults(lastResults RecordSetListRe
|
||||
|
||||
// ListByTypeComplete enumerates all values, automatically crossing page boundaries as required.
|
||||
func (client RecordSetsClient) ListByTypeComplete(ctx context.Context, resourceGroupName string, zoneName string, recordType RecordType, top *int32, recordsetnamesuffix string) (result RecordSetListResultIterator, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.ListByType")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response().Response.Response != nil {
|
||||
sc = result.page.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
result.page, err = client.ListByType(ctx, resourceGroupName, zoneName, recordType, top, recordsetnamesuffix)
|
||||
return
|
||||
}
|
||||
|
||||
// Update updates a record set within a DNS zone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). relativeRecordSetName is the name of the record set, relative to the name of the zone. recordType is the
|
||||
// type of DNS record in this record set. parameters is parameters supplied to the Update operation. ifMatch is the
|
||||
// etag of the record set. Omit this value to always overwrite the current record set. Specify the last-seen etag
|
||||
// value to prevent accidentally overwritting concurrent changes.
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// relativeRecordSetName - the name of the record set, relative to the name of the zone.
|
||||
// recordType - the type of DNS record in this record set.
|
||||
// parameters - parameters supplied to the Update operation.
|
||||
// ifMatch - the etag of the record set. Omit this value to always overwrite the current record set. Specify
|
||||
// the last-seen etag value to prevent accidentally overwriting concurrent changes.
|
||||
func (client RecordSetsClient) Update(ctx context.Context, resourceGroupName string, zoneName string, relativeRecordSetName string, recordType RecordType, parameters RecordSet, ifMatch string) (result RecordSet, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/RecordSetsClient.Update")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response.Response != nil {
|
||||
sc = result.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.RecordSetsClient", "Update", err.Error())
|
||||
}
|
||||
|
||||
req, err := client.UpdatePreparer(ctx, resourceGroupName, zoneName, relativeRecordSetName, recordType, parameters, ifMatch)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.RecordSetsClient", "Update", nil, "Failure preparing request")
|
||||
@@ -521,6 +677,9 @@ func (client RecordSetsClient) UpdatePreparer(ctx context.Context, resourceGroup
|
||||
"api-version": APIVersion,
|
||||
}
|
||||
|
||||
parameters.ID = nil
|
||||
parameters.Name = nil
|
||||
parameters.Type = nil
|
||||
preparer := autorest.CreatePreparer(
|
||||
autorest.AsContentType("application/json; charset=utf-8"),
|
||||
autorest.AsPatch(),
|
||||
|
||||
175
vendor/github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2017-09-01/dns/zones.go
generated
vendored
175
vendor/github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2017-09-01/dns/zones.go
generated
vendored
@@ -21,6 +21,8 @@ import (
|
||||
"context"
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/validation"
|
||||
"github.com/Azure/go-autorest/tracing"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
@@ -40,13 +42,35 @@ func NewZonesClientWithBaseURI(baseURI string, subscriptionID string) ZonesClien
|
||||
}
|
||||
|
||||
// CreateOrUpdate creates or updates a DNS zone. Does not modify DNS records within the zone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). parameters is parameters supplied to the CreateOrUpdate operation. ifMatch is the etag of the DNS zone.
|
||||
// Omit this value to always overwrite the current zone. Specify the last-seen etag value to prevent accidentally
|
||||
// overwritting any concurrent changes. ifNoneMatch is set to '*' to allow a new DNS zone to be created, but to
|
||||
// prevent updating an existing zone. Other values will be ignored.
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// parameters - parameters supplied to the CreateOrUpdate operation.
|
||||
// ifMatch - the etag of the DNS zone. Omit this value to always overwrite the current zone. Specify the
|
||||
// last-seen etag value to prevent accidentally overwriting any concurrent changes.
|
||||
// ifNoneMatch - set to '*' to allow a new DNS zone to be created, but to prevent updating an existing zone.
|
||||
// Other values will be ignored.
|
||||
func (client ZonesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, zoneName string, parameters Zone, ifMatch string, ifNoneMatch string) (result Zone, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZonesClient.CreateOrUpdate")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response.Response != nil {
|
||||
sc = result.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.ZonesClient", "CreateOrUpdate", err.Error())
|
||||
}
|
||||
|
||||
req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, zoneName, parameters, ifMatch, ifNoneMatch)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.ZonesClient", "CreateOrUpdate", nil, "Failure preparing request")
|
||||
@@ -121,11 +145,32 @@ func (client ZonesClient) CreateOrUpdateResponder(resp *http.Response) (result Z
|
||||
|
||||
// Delete deletes a DNS zone. WARNING: All DNS records in the zone will also be deleted. This operation cannot be
|
||||
// undone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot). ifMatch is the etag of the DNS zone. Omit this value to always delete the current zone. Specify the
|
||||
// last-seen etag value to prevent accidentally deleting any concurrent changes.
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
// ifMatch - the etag of the DNS zone. Omit this value to always delete the current zone. Specify the last-seen
|
||||
// etag value to prevent accidentally deleting any concurrent changes.
|
||||
func (client ZonesClient) Delete(ctx context.Context, resourceGroupName string, zoneName string, ifMatch string) (result ZonesDeleteFuture, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZonesClient.Delete")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response() != nil {
|
||||
sc = result.Response().StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.ZonesClient", "Delete", err.Error())
|
||||
}
|
||||
|
||||
req, err := client.DeletePreparer(ctx, resourceGroupName, zoneName, ifMatch)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.ZonesClient", "Delete", nil, "Failure preparing request")
|
||||
@@ -169,15 +214,13 @@ func (client ZonesClient) DeletePreparer(ctx context.Context, resourceGroupName
|
||||
// DeleteSender sends the Delete request. The method will close the
|
||||
// http.Response Body if it receives an error.
|
||||
func (client ZonesClient) DeleteSender(req *http.Request) (future ZonesDeleteFuture, err error) {
|
||||
sender := autorest.DecorateSender(client, azure.DoRetryWithRegistration(client.Client))
|
||||
future.Future = azure.NewFuture(req)
|
||||
future.req = req
|
||||
_, err = future.Done(sender)
|
||||
var resp *http.Response
|
||||
resp, err = autorest.SendWithSender(client, req,
|
||||
azure.DoRetryWithRegistration(client.Client))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = autorest.Respond(future.Response(),
|
||||
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted, http.StatusNoContent))
|
||||
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -194,10 +237,30 @@ func (client ZonesClient) DeleteResponder(resp *http.Response) (result autorest.
|
||||
}
|
||||
|
||||
// Get gets a DNS zone. Retrieves the zone properties, but not the record sets within the zone.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. zoneName is the name of the DNS zone (without a terminating
|
||||
// dot).
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// zoneName - the name of the DNS zone (without a terminating dot).
|
||||
func (client ZonesClient) Get(ctx context.Context, resourceGroupName string, zoneName string) (result Zone, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZonesClient.Get")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response.Response != nil {
|
||||
sc = result.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.ZonesClient", "Get", err.Error())
|
||||
}
|
||||
|
||||
req, err := client.GetPreparer(ctx, resourceGroupName, zoneName)
|
||||
if err != nil {
|
||||
err = autorest.NewErrorWithError(err, "dns.ZonesClient", "Get", nil, "Failure preparing request")
|
||||
@@ -261,9 +324,25 @@ func (client ZonesClient) GetResponder(resp *http.Response) (result Zone, err er
|
||||
}
|
||||
|
||||
// List lists the DNS zones in all resource groups in a subscription.
|
||||
//
|
||||
// top is the maximum number of DNS zones to return. If not specified, returns up to 100 zones.
|
||||
// Parameters:
|
||||
// top - the maximum number of DNS zones to return. If not specified, returns up to 100 zones.
|
||||
func (client ZonesClient) List(ctx context.Context, top *int32) (result ZoneListResultPage, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZonesClient.List")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.zlr.Response.Response != nil {
|
||||
sc = result.zlr.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.ZonesClient", "List", err.Error())
|
||||
}
|
||||
|
||||
result.fn = client.listNextResults
|
||||
req, err := client.ListPreparer(ctx, top)
|
||||
if err != nil {
|
||||
@@ -329,8 +408,8 @@ func (client ZonesClient) ListResponder(resp *http.Response) (result ZoneListRes
|
||||
}
|
||||
|
||||
// listNextResults retrieves the next set of results, if any.
|
||||
func (client ZonesClient) listNextResults(lastResults ZoneListResult) (result ZoneListResult, err error) {
|
||||
req, err := lastResults.zoneListResultPreparer()
|
||||
func (client ZonesClient) listNextResults(ctx context.Context, lastResults ZoneListResult) (result ZoneListResult, err error) {
|
||||
req, err := lastResults.zoneListResultPreparer(ctx)
|
||||
if err != nil {
|
||||
return result, autorest.NewErrorWithError(err, "dns.ZonesClient", "listNextResults", nil, "Failure preparing next results request")
|
||||
}
|
||||
@@ -351,15 +430,45 @@ func (client ZonesClient) listNextResults(lastResults ZoneListResult) (result Zo
|
||||
|
||||
// ListComplete enumerates all values, automatically crossing page boundaries as required.
|
||||
func (client ZonesClient) ListComplete(ctx context.Context, top *int32) (result ZoneListResultIterator, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZonesClient.List")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response().Response.Response != nil {
|
||||
sc = result.page.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
result.page, err = client.List(ctx, top)
|
||||
return
|
||||
}
|
||||
|
||||
// ListByResourceGroup lists the DNS zones within a resource group.
|
||||
//
|
||||
// resourceGroupName is the name of the resource group. top is the maximum number of record sets to return. If not
|
||||
// specified, returns up to 100 record sets.
|
||||
// Parameters:
|
||||
// resourceGroupName - the name of the resource group. The name is case insensitive.
|
||||
// top - the maximum number of record sets to return. If not specified, returns up to 100 record sets.
|
||||
func (client ZonesClient) ListByResourceGroup(ctx context.Context, resourceGroupName string, top *int32) (result ZoneListResultPage, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZonesClient.ListByResourceGroup")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.zlr.Response.Response != nil {
|
||||
sc = result.zlr.Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
if err := validation.Validate([]validation.Validation{
|
||||
{TargetValue: resourceGroupName,
|
||||
Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil},
|
||||
{Target: "resourceGroupName", Name: validation.Pattern, Rule: `^[-\w\._\(\)]+$`, Chain: nil}}},
|
||||
{TargetValue: client.SubscriptionID,
|
||||
Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
|
||||
return result, validation.NewError("dns.ZonesClient", "ListByResourceGroup", err.Error())
|
||||
}
|
||||
|
||||
result.fn = client.listByResourceGroupNextResults
|
||||
req, err := client.ListByResourceGroupPreparer(ctx, resourceGroupName, top)
|
||||
if err != nil {
|
||||
@@ -426,8 +535,8 @@ func (client ZonesClient) ListByResourceGroupResponder(resp *http.Response) (res
|
||||
}
|
||||
|
||||
// listByResourceGroupNextResults retrieves the next set of results, if any.
|
||||
func (client ZonesClient) listByResourceGroupNextResults(lastResults ZoneListResult) (result ZoneListResult, err error) {
|
||||
req, err := lastResults.zoneListResultPreparer()
|
||||
func (client ZonesClient) listByResourceGroupNextResults(ctx context.Context, lastResults ZoneListResult) (result ZoneListResult, err error) {
|
||||
req, err := lastResults.zoneListResultPreparer(ctx)
|
||||
if err != nil {
|
||||
return result, autorest.NewErrorWithError(err, "dns.ZonesClient", "listByResourceGroupNextResults", nil, "Failure preparing next results request")
|
||||
}
|
||||
@@ -448,6 +557,16 @@ func (client ZonesClient) listByResourceGroupNextResults(lastResults ZoneListRes
|
||||
|
||||
// ListByResourceGroupComplete enumerates all values, automatically crossing page boundaries as required.
|
||||
func (client ZonesClient) ListByResourceGroupComplete(ctx context.Context, resourceGroupName string, top *int32) (result ZoneListResultIterator, err error) {
|
||||
if tracing.IsEnabled() {
|
||||
ctx = tracing.StartSpan(ctx, fqdn+"/ZonesClient.ListByResourceGroup")
|
||||
defer func() {
|
||||
sc := -1
|
||||
if result.Response().Response.Response != nil {
|
||||
sc = result.page.Response().Response.Response.StatusCode
|
||||
}
|
||||
tracing.EndSpan(ctx, sc, err)
|
||||
}()
|
||||
}
|
||||
result.page, err = client.ListByResourceGroup(ctx, resourceGroupName, top)
|
||||
return
|
||||
}
|
||||
|
||||
2
vendor/github.com/Azure/azure-sdk-for-go/version/version.go
generated
vendored
2
vendor/github.com/Azure/azure-sdk-for-go/version/version.go
generated
vendored
@@ -18,4 +18,4 @@ package version
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
// Number contains the semantic version of this SDK.
|
||||
const Number = "v15.0.1"
|
||||
const Number = "v31.2.0"
|
||||
|
||||
88
vendor/github.com/Azure/go-autorest/autorest/adal/config.go
generated
vendored
88
vendor/github.com/Azure/go-autorest/autorest/adal/config.go
generated
vendored
@@ -15,21 +15,22 @@ package adal
|
||||
// limitations under the License.
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
const (
|
||||
activeDirectoryAPIVersion = "1.0"
|
||||
activeDirectoryEndpointTemplate = "%s/oauth2/%s%s"
|
||||
)
|
||||
|
||||
// OAuthConfig represents the endpoints needed
|
||||
// in OAuth operations
|
||||
type OAuthConfig struct {
|
||||
AuthorityEndpoint url.URL
|
||||
AuthorizeEndpoint url.URL
|
||||
TokenEndpoint url.URL
|
||||
DeviceCodeEndpoint url.URL
|
||||
AuthorityEndpoint url.URL `json:"authorityEndpoint"`
|
||||
AuthorizeEndpoint url.URL `json:"authorizeEndpoint"`
|
||||
TokenEndpoint url.URL `json:"tokenEndpoint"`
|
||||
DeviceCodeEndpoint url.URL `json:"deviceCodeEndpoint"`
|
||||
}
|
||||
|
||||
// IsZero returns true if the OAuthConfig object is zero-initialized.
|
||||
@@ -46,11 +47,24 @@ func validateStringParam(param, name string) error {
|
||||
|
||||
// NewOAuthConfig returns an OAuthConfig with tenant specific urls
|
||||
func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, error) {
|
||||
apiVer := "1.0"
|
||||
return NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID, &apiVer)
|
||||
}
|
||||
|
||||
// NewOAuthConfigWithAPIVersion returns an OAuthConfig with tenant specific urls.
|
||||
// If apiVersion is not nil the "api-version" query parameter will be appended to the endpoint URLs with the specified value.
|
||||
func NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID string, apiVersion *string) (*OAuthConfig, error) {
|
||||
if err := validateStringParam(activeDirectoryEndpoint, "activeDirectoryEndpoint"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
api := ""
|
||||
// it's legal for tenantID to be empty so don't validate it
|
||||
const activeDirectoryEndpointTemplate = "%s/oauth2/%s?api-version=%s"
|
||||
if apiVersion != nil {
|
||||
if err := validateStringParam(*apiVersion, "apiVersion"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
api = fmt.Sprintf("?api-version=%s", *apiVersion)
|
||||
}
|
||||
u, err := url.Parse(activeDirectoryEndpoint)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -59,15 +73,15 @@ func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, err
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
authorizeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "authorize", activeDirectoryAPIVersion))
|
||||
authorizeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "authorize", api))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tokenURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "token", activeDirectoryAPIVersion))
|
||||
tokenURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "token", api))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
deviceCodeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "devicecode", activeDirectoryAPIVersion))
|
||||
deviceCodeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "devicecode", api))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -79,3 +93,59 @@ func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, err
|
||||
DeviceCodeEndpoint: *deviceCodeURL,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// MultiTenantOAuthConfig provides endpoints for primary and aulixiary tenant IDs.
|
||||
type MultiTenantOAuthConfig interface {
|
||||
PrimaryTenant() *OAuthConfig
|
||||
AuxiliaryTenants() []*OAuthConfig
|
||||
}
|
||||
|
||||
// OAuthOptions contains optional OAuthConfig creation arguments.
|
||||
type OAuthOptions struct {
|
||||
APIVersion string
|
||||
}
|
||||
|
||||
func (c OAuthOptions) apiVersion() string {
|
||||
if c.APIVersion != "" {
|
||||
return fmt.Sprintf("?api-version=%s", c.APIVersion)
|
||||
}
|
||||
return "1.0"
|
||||
}
|
||||
|
||||
// NewMultiTenantOAuthConfig creates an object that support multitenant OAuth configuration.
|
||||
// See https://docs.microsoft.com/en-us/azure/azure-resource-manager/authenticate-multi-tenant for more information.
|
||||
func NewMultiTenantOAuthConfig(activeDirectoryEndpoint, primaryTenantID string, auxiliaryTenantIDs []string, options OAuthOptions) (MultiTenantOAuthConfig, error) {
|
||||
if len(auxiliaryTenantIDs) == 0 || len(auxiliaryTenantIDs) > 3 {
|
||||
return nil, errors.New("must specify one to three auxiliary tenants")
|
||||
}
|
||||
mtCfg := multiTenantOAuthConfig{
|
||||
cfgs: make([]*OAuthConfig, len(auxiliaryTenantIDs)+1),
|
||||
}
|
||||
apiVer := options.apiVersion()
|
||||
pri, err := NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, primaryTenantID, &apiVer)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create OAuthConfig for primary tenant: %v", err)
|
||||
}
|
||||
mtCfg.cfgs[0] = pri
|
||||
for i := range auxiliaryTenantIDs {
|
||||
aux, err := NewOAuthConfig(activeDirectoryEndpoint, auxiliaryTenantIDs[i])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create OAuthConfig for tenant '%s': %v", auxiliaryTenantIDs[i], err)
|
||||
}
|
||||
mtCfg.cfgs[i+1] = aux
|
||||
}
|
||||
return mtCfg, nil
|
||||
}
|
||||
|
||||
type multiTenantOAuthConfig struct {
|
||||
// first config in the slice is the primary tenant
|
||||
cfgs []*OAuthConfig
|
||||
}
|
||||
|
||||
func (m multiTenantOAuthConfig) PrimaryTenant() *OAuthConfig {
|
||||
return m.cfgs[0]
|
||||
}
|
||||
|
||||
func (m multiTenantOAuthConfig) AuxiliaryTenants() []*OAuthConfig {
|
||||
return m.cfgs[1:]
|
||||
}
|
||||
|
||||
2
vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
generated
vendored
2
vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
generated
vendored
@@ -38,7 +38,7 @@ func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) {
|
||||
return sf(r)
|
||||
}
|
||||
|
||||
// SendDecorator takes and possibily decorates, by wrapping, a Sender. Decorators may affect the
|
||||
// SendDecorator takes and possibly decorates, by wrapping, a Sender. Decorators may affect the
|
||||
// http.Request and pass it along or, first, pass the http.Request along then react to the
|
||||
// http.Response result.
|
||||
type SendDecorator func(Sender) Sender
|
||||
|
||||
577
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
577
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
@@ -15,22 +15,26 @@ package adal
|
||||
// limitations under the License.
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha1"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/go-autorest/autorest/date"
|
||||
"github.com/Azure/go-autorest/tracing"
|
||||
"github.com/dgrijalva/jwt-go"
|
||||
)
|
||||
|
||||
@@ -57,6 +61,9 @@ const (
|
||||
|
||||
// msiEndpoint is the well known endpoint for getting MSI authentications tokens
|
||||
msiEndpoint = "http://169.254.169.254/metadata/identity/oauth2/token"
|
||||
|
||||
// the default number of attempts to refresh an MSI authentication token
|
||||
defaultMaxMSIRefreshAttempts = 5
|
||||
)
|
||||
|
||||
// OAuthTokenProvider is an interface which should be implemented by an access token retriever
|
||||
@@ -64,6 +71,12 @@ type OAuthTokenProvider interface {
|
||||
OAuthToken() string
|
||||
}
|
||||
|
||||
// MultitenantOAuthTokenProvider provides tokens used for multi-tenant authorization.
|
||||
type MultitenantOAuthTokenProvider interface {
|
||||
PrimaryOAuthToken() string
|
||||
AuxiliaryOAuthTokens() []string
|
||||
}
|
||||
|
||||
// TokenRefreshError is an interface used by errors returned during token refresh.
|
||||
type TokenRefreshError interface {
|
||||
error
|
||||
@@ -77,23 +90,39 @@ type Refresher interface {
|
||||
EnsureFresh() error
|
||||
}
|
||||
|
||||
// RefresherWithContext is an interface for token refresh functionality
|
||||
type RefresherWithContext interface {
|
||||
RefreshWithContext(ctx context.Context) error
|
||||
RefreshExchangeWithContext(ctx context.Context, resource string) error
|
||||
EnsureFreshWithContext(ctx context.Context) error
|
||||
}
|
||||
|
||||
// TokenRefreshCallback is the type representing callbacks that will be called after
|
||||
// a successful token refresh
|
||||
type TokenRefreshCallback func(Token) error
|
||||
|
||||
// Token encapsulates the access token used to authorize Azure requests.
|
||||
// https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow#service-to-service-access-token-response
|
||||
type Token struct {
|
||||
AccessToken string `json:"access_token"`
|
||||
RefreshToken string `json:"refresh_token"`
|
||||
|
||||
ExpiresIn string `json:"expires_in"`
|
||||
ExpiresOn string `json:"expires_on"`
|
||||
NotBefore string `json:"not_before"`
|
||||
ExpiresIn json.Number `json:"expires_in"`
|
||||
ExpiresOn json.Number `json:"expires_on"`
|
||||
NotBefore json.Number `json:"not_before"`
|
||||
|
||||
Resource string `json:"resource"`
|
||||
Type string `json:"token_type"`
|
||||
}
|
||||
|
||||
func newToken() Token {
|
||||
return Token{
|
||||
ExpiresIn: "0",
|
||||
ExpiresOn: "0",
|
||||
NotBefore: "0",
|
||||
}
|
||||
}
|
||||
|
||||
// IsZero returns true if the token object is zero-initialized.
|
||||
func (t Token) IsZero() bool {
|
||||
return t == Token{}
|
||||
@@ -101,12 +130,12 @@ func (t Token) IsZero() bool {
|
||||
|
||||
// Expires returns the time.Time when the Token expires.
|
||||
func (t Token) Expires() time.Time {
|
||||
s, err := strconv.Atoi(t.ExpiresOn)
|
||||
s, err := t.ExpiresOn.Float64()
|
||||
if err != nil {
|
||||
s = -3600
|
||||
}
|
||||
|
||||
expiration := date.NewUnixTimeFromSeconds(float64(s))
|
||||
expiration := date.NewUnixTimeFromSeconds(s)
|
||||
|
||||
return time.Time(expiration).UTC()
|
||||
}
|
||||
@@ -127,6 +156,12 @@ func (t *Token) OAuthToken() string {
|
||||
return t.AccessToken
|
||||
}
|
||||
|
||||
// ServicePrincipalSecret is an interface that allows various secret mechanism to fill the form
|
||||
// that is submitted when acquiring an oAuth token.
|
||||
type ServicePrincipalSecret interface {
|
||||
SetAuthenticationValues(spt *ServicePrincipalToken, values *url.Values) error
|
||||
}
|
||||
|
||||
// ServicePrincipalNoSecret represents a secret type that contains no secret
|
||||
// meaning it is not valid for fetching a fresh token. This is used by Manual
|
||||
type ServicePrincipalNoSecret struct {
|
||||
@@ -138,15 +173,19 @@ func (noSecret *ServicePrincipalNoSecret) SetAuthenticationValues(spt *ServicePr
|
||||
return fmt.Errorf("Manually created ServicePrincipalToken does not contain secret material to retrieve a new access token")
|
||||
}
|
||||
|
||||
// ServicePrincipalSecret is an interface that allows various secret mechanism to fill the form
|
||||
// that is submitted when acquiring an oAuth token.
|
||||
type ServicePrincipalSecret interface {
|
||||
SetAuthenticationValues(spt *ServicePrincipalToken, values *url.Values) error
|
||||
// MarshalJSON implements the json.Marshaler interface.
|
||||
func (noSecret ServicePrincipalNoSecret) MarshalJSON() ([]byte, error) {
|
||||
type tokenType struct {
|
||||
Type string `json:"type"`
|
||||
}
|
||||
return json.Marshal(tokenType{
|
||||
Type: "ServicePrincipalNoSecret",
|
||||
})
|
||||
}
|
||||
|
||||
// ServicePrincipalTokenSecret implements ServicePrincipalSecret for client_secret type authorization.
|
||||
type ServicePrincipalTokenSecret struct {
|
||||
ClientSecret string
|
||||
ClientSecret string `json:"value"`
|
||||
}
|
||||
|
||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||
@@ -156,49 +195,24 @@ func (tokenSecret *ServicePrincipalTokenSecret) SetAuthenticationValues(spt *Ser
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface.
|
||||
func (tokenSecret ServicePrincipalTokenSecret) MarshalJSON() ([]byte, error) {
|
||||
type tokenType struct {
|
||||
Type string `json:"type"`
|
||||
Value string `json:"value"`
|
||||
}
|
||||
return json.Marshal(tokenType{
|
||||
Type: "ServicePrincipalTokenSecret",
|
||||
Value: tokenSecret.ClientSecret,
|
||||
})
|
||||
}
|
||||
|
||||
// ServicePrincipalCertificateSecret implements ServicePrincipalSecret for generic RSA cert auth with signed JWTs.
|
||||
type ServicePrincipalCertificateSecret struct {
|
||||
Certificate *x509.Certificate
|
||||
PrivateKey *rsa.PrivateKey
|
||||
}
|
||||
|
||||
// ServicePrincipalMSISecret implements ServicePrincipalSecret for machines running the MSI Extension.
|
||||
type ServicePrincipalMSISecret struct {
|
||||
}
|
||||
|
||||
// ServicePrincipalUsernamePasswordSecret implements ServicePrincipalSecret for username and password auth.
|
||||
type ServicePrincipalUsernamePasswordSecret struct {
|
||||
Username string
|
||||
Password string
|
||||
}
|
||||
|
||||
// ServicePrincipalAuthorizationCodeSecret implements ServicePrincipalSecret for authorization code auth.
|
||||
type ServicePrincipalAuthorizationCodeSecret struct {
|
||||
ClientSecret string
|
||||
AuthorizationCode string
|
||||
RedirectURI string
|
||||
}
|
||||
|
||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||
func (secret *ServicePrincipalAuthorizationCodeSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||
v.Set("code", secret.AuthorizationCode)
|
||||
v.Set("client_secret", secret.ClientSecret)
|
||||
v.Set("redirect_uri", secret.RedirectURI)
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||
func (secret *ServicePrincipalUsernamePasswordSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||
v.Set("username", secret.Username)
|
||||
v.Set("password", secret.Password)
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||
func (msiSecret *ServicePrincipalMSISecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// SignJwt returns the JWT signed with the certificate's private key.
|
||||
func (secret *ServicePrincipalCertificateSecret) SignJwt(spt *ServicePrincipalToken) (string, error) {
|
||||
hasher := sha1.New()
|
||||
@@ -218,10 +232,12 @@ func (secret *ServicePrincipalCertificateSecret) SignJwt(spt *ServicePrincipalTo
|
||||
|
||||
token := jwt.New(jwt.SigningMethodRS256)
|
||||
token.Header["x5t"] = thumbprint
|
||||
x5c := []string{base64.StdEncoding.EncodeToString(secret.Certificate.Raw)}
|
||||
token.Header["x5c"] = x5c
|
||||
token.Claims = jwt.MapClaims{
|
||||
"aud": spt.oauthConfig.TokenEndpoint.String(),
|
||||
"iss": spt.clientID,
|
||||
"sub": spt.clientID,
|
||||
"aud": spt.inner.OauthConfig.TokenEndpoint.String(),
|
||||
"iss": spt.inner.ClientID,
|
||||
"sub": spt.inner.ClientID,
|
||||
"jti": base64.URLEncoding.EncodeToString(jti),
|
||||
"nbf": time.Now().Unix(),
|
||||
"exp": time.Now().Add(time.Hour * 24).Unix(),
|
||||
@@ -244,19 +260,156 @@ func (secret *ServicePrincipalCertificateSecret) SetAuthenticationValues(spt *Se
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface.
|
||||
func (secret ServicePrincipalCertificateSecret) MarshalJSON() ([]byte, error) {
|
||||
return nil, errors.New("marshalling ServicePrincipalCertificateSecret is not supported")
|
||||
}
|
||||
|
||||
// ServicePrincipalMSISecret implements ServicePrincipalSecret for machines running the MSI Extension.
|
||||
type ServicePrincipalMSISecret struct {
|
||||
}
|
||||
|
||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||
func (msiSecret *ServicePrincipalMSISecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface.
|
||||
func (msiSecret ServicePrincipalMSISecret) MarshalJSON() ([]byte, error) {
|
||||
return nil, errors.New("marshalling ServicePrincipalMSISecret is not supported")
|
||||
}
|
||||
|
||||
// ServicePrincipalUsernamePasswordSecret implements ServicePrincipalSecret for username and password auth.
|
||||
type ServicePrincipalUsernamePasswordSecret struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
|
||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||
func (secret *ServicePrincipalUsernamePasswordSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||
v.Set("username", secret.Username)
|
||||
v.Set("password", secret.Password)
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface.
|
||||
func (secret ServicePrincipalUsernamePasswordSecret) MarshalJSON() ([]byte, error) {
|
||||
type tokenType struct {
|
||||
Type string `json:"type"`
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
return json.Marshal(tokenType{
|
||||
Type: "ServicePrincipalUsernamePasswordSecret",
|
||||
Username: secret.Username,
|
||||
Password: secret.Password,
|
||||
})
|
||||
}
|
||||
|
||||
// ServicePrincipalAuthorizationCodeSecret implements ServicePrincipalSecret for authorization code auth.
|
||||
type ServicePrincipalAuthorizationCodeSecret struct {
|
||||
ClientSecret string `json:"value"`
|
||||
AuthorizationCode string `json:"authCode"`
|
||||
RedirectURI string `json:"redirect"`
|
||||
}
|
||||
|
||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||
func (secret *ServicePrincipalAuthorizationCodeSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||
v.Set("code", secret.AuthorizationCode)
|
||||
v.Set("client_secret", secret.ClientSecret)
|
||||
v.Set("redirect_uri", secret.RedirectURI)
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface.
|
||||
func (secret ServicePrincipalAuthorizationCodeSecret) MarshalJSON() ([]byte, error) {
|
||||
type tokenType struct {
|
||||
Type string `json:"type"`
|
||||
Value string `json:"value"`
|
||||
AuthCode string `json:"authCode"`
|
||||
Redirect string `json:"redirect"`
|
||||
}
|
||||
return json.Marshal(tokenType{
|
||||
Type: "ServicePrincipalAuthorizationCodeSecret",
|
||||
Value: secret.ClientSecret,
|
||||
AuthCode: secret.AuthorizationCode,
|
||||
Redirect: secret.RedirectURI,
|
||||
})
|
||||
}
|
||||
|
||||
// ServicePrincipalToken encapsulates a Token created for a Service Principal.
|
||||
type ServicePrincipalToken struct {
|
||||
token Token
|
||||
secret ServicePrincipalSecret
|
||||
oauthConfig OAuthConfig
|
||||
clientID string
|
||||
resource string
|
||||
autoRefresh bool
|
||||
refreshLock *sync.RWMutex
|
||||
refreshWithin time.Duration
|
||||
sender Sender
|
||||
|
||||
inner servicePrincipalToken
|
||||
refreshLock *sync.RWMutex
|
||||
sender Sender
|
||||
refreshCallbacks []TokenRefreshCallback
|
||||
// MaxMSIRefreshAttempts is the maximum number of attempts to refresh an MSI token.
|
||||
MaxMSIRefreshAttempts int
|
||||
}
|
||||
|
||||
// MarshalTokenJSON returns the marshalled inner token.
|
||||
func (spt ServicePrincipalToken) MarshalTokenJSON() ([]byte, error) {
|
||||
return json.Marshal(spt.inner.Token)
|
||||
}
|
||||
|
||||
// SetRefreshCallbacks replaces any existing refresh callbacks with the specified callbacks.
|
||||
func (spt *ServicePrincipalToken) SetRefreshCallbacks(callbacks []TokenRefreshCallback) {
|
||||
spt.refreshCallbacks = callbacks
|
||||
}
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface.
|
||||
func (spt ServicePrincipalToken) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(spt.inner)
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements the json.Unmarshaler interface.
|
||||
func (spt *ServicePrincipalToken) UnmarshalJSON(data []byte) error {
|
||||
// need to determine the token type
|
||||
raw := map[string]interface{}{}
|
||||
err := json.Unmarshal(data, &raw)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
secret := raw["secret"].(map[string]interface{})
|
||||
switch secret["type"] {
|
||||
case "ServicePrincipalNoSecret":
|
||||
spt.inner.Secret = &ServicePrincipalNoSecret{}
|
||||
case "ServicePrincipalTokenSecret":
|
||||
spt.inner.Secret = &ServicePrincipalTokenSecret{}
|
||||
case "ServicePrincipalCertificateSecret":
|
||||
return errors.New("unmarshalling ServicePrincipalCertificateSecret is not supported")
|
||||
case "ServicePrincipalMSISecret":
|
||||
return errors.New("unmarshalling ServicePrincipalMSISecret is not supported")
|
||||
case "ServicePrincipalUsernamePasswordSecret":
|
||||
spt.inner.Secret = &ServicePrincipalUsernamePasswordSecret{}
|
||||
case "ServicePrincipalAuthorizationCodeSecret":
|
||||
spt.inner.Secret = &ServicePrincipalAuthorizationCodeSecret{}
|
||||
default:
|
||||
return fmt.Errorf("unrecognized token type '%s'", secret["type"])
|
||||
}
|
||||
err = json.Unmarshal(data, &spt.inner)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Don't override the refreshLock or the sender if those have been already set.
|
||||
if spt.refreshLock == nil {
|
||||
spt.refreshLock = &sync.RWMutex{}
|
||||
}
|
||||
if spt.sender == nil {
|
||||
spt.sender = &http.Client{Transport: tracing.Transport}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// internal type used for marshalling/unmarshalling
|
||||
type servicePrincipalToken struct {
|
||||
Token Token `json:"token"`
|
||||
Secret ServicePrincipalSecret `json:"secret"`
|
||||
OauthConfig OAuthConfig `json:"oauth"`
|
||||
ClientID string `json:"clientID"`
|
||||
Resource string `json:"resource"`
|
||||
AutoRefresh bool `json:"autoRefresh"`
|
||||
RefreshWithin time.Duration `json:"refreshWithin"`
|
||||
}
|
||||
|
||||
func validateOAuthConfig(oac OAuthConfig) error {
|
||||
@@ -281,14 +434,17 @@ func NewServicePrincipalTokenWithSecret(oauthConfig OAuthConfig, id string, reso
|
||||
return nil, fmt.Errorf("parameter 'secret' cannot be nil")
|
||||
}
|
||||
spt := &ServicePrincipalToken{
|
||||
oauthConfig: oauthConfig,
|
||||
secret: secret,
|
||||
clientID: id,
|
||||
resource: resource,
|
||||
autoRefresh: true,
|
||||
inner: servicePrincipalToken{
|
||||
Token: newToken(),
|
||||
OauthConfig: oauthConfig,
|
||||
Secret: secret,
|
||||
ClientID: id,
|
||||
Resource: resource,
|
||||
AutoRefresh: true,
|
||||
RefreshWithin: defaultRefresh,
|
||||
},
|
||||
refreshLock: &sync.RWMutex{},
|
||||
refreshWithin: defaultRefresh,
|
||||
sender: &http.Client{},
|
||||
sender: &http.Client{Transport: tracing.Transport},
|
||||
refreshCallbacks: callbacks,
|
||||
}
|
||||
return spt, nil
|
||||
@@ -318,7 +474,39 @@ func NewServicePrincipalTokenFromManualToken(oauthConfig OAuthConfig, clientID s
|
||||
return nil, err
|
||||
}
|
||||
|
||||
spt.token = token
|
||||
spt.inner.Token = token
|
||||
|
||||
return spt, nil
|
||||
}
|
||||
|
||||
// NewServicePrincipalTokenFromManualTokenSecret creates a ServicePrincipalToken using the supplied token and secret
|
||||
func NewServicePrincipalTokenFromManualTokenSecret(oauthConfig OAuthConfig, clientID string, resource string, token Token, secret ServicePrincipalSecret, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateStringParam(resource, "resource"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if secret == nil {
|
||||
return nil, fmt.Errorf("parameter 'secret' cannot be nil")
|
||||
}
|
||||
if token.IsZero() {
|
||||
return nil, fmt.Errorf("parameter 'token' cannot be zero-initialized")
|
||||
}
|
||||
spt, err := NewServicePrincipalTokenWithSecret(
|
||||
oauthConfig,
|
||||
clientID,
|
||||
resource,
|
||||
secret,
|
||||
callbacks...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
spt.inner.Token = token
|
||||
|
||||
return spt, nil
|
||||
}
|
||||
@@ -486,20 +674,24 @@ func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedI
|
||||
msiEndpointURL.RawQuery = v.Encode()
|
||||
|
||||
spt := &ServicePrincipalToken{
|
||||
oauthConfig: OAuthConfig{
|
||||
TokenEndpoint: *msiEndpointURL,
|
||||
inner: servicePrincipalToken{
|
||||
Token: newToken(),
|
||||
OauthConfig: OAuthConfig{
|
||||
TokenEndpoint: *msiEndpointURL,
|
||||
},
|
||||
Secret: &ServicePrincipalMSISecret{},
|
||||
Resource: resource,
|
||||
AutoRefresh: true,
|
||||
RefreshWithin: defaultRefresh,
|
||||
},
|
||||
secret: &ServicePrincipalMSISecret{},
|
||||
resource: resource,
|
||||
autoRefresh: true,
|
||||
refreshLock: &sync.RWMutex{},
|
||||
refreshWithin: defaultRefresh,
|
||||
sender: &http.Client{},
|
||||
refreshCallbacks: callbacks,
|
||||
refreshLock: &sync.RWMutex{},
|
||||
sender: &http.Client{Transport: tracing.Transport},
|
||||
refreshCallbacks: callbacks,
|
||||
MaxMSIRefreshAttempts: defaultMaxMSIRefreshAttempts,
|
||||
}
|
||||
|
||||
if userAssignedID != nil {
|
||||
spt.clientID = *userAssignedID
|
||||
spt.inner.ClientID = *userAssignedID
|
||||
}
|
||||
|
||||
return spt, nil
|
||||
@@ -528,12 +720,18 @@ func newTokenRefreshError(message string, resp *http.Response) TokenRefreshError
|
||||
// EnsureFresh will refresh the token if it will expire within the refresh window (as set by
|
||||
// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
|
||||
func (spt *ServicePrincipalToken) EnsureFresh() error {
|
||||
if spt.autoRefresh && spt.token.WillExpireIn(spt.refreshWithin) {
|
||||
return spt.EnsureFreshWithContext(context.Background())
|
||||
}
|
||||
|
||||
// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
|
||||
// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
|
||||
func (spt *ServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
|
||||
if spt.inner.AutoRefresh && spt.inner.Token.WillExpireIn(spt.inner.RefreshWithin) {
|
||||
// take the write lock then check to see if the token was already refreshed
|
||||
spt.refreshLock.Lock()
|
||||
defer spt.refreshLock.Unlock()
|
||||
if spt.token.WillExpireIn(spt.refreshWithin) {
|
||||
return spt.refreshInternal(spt.resource)
|
||||
if spt.inner.Token.WillExpireIn(spt.inner.RefreshWithin) {
|
||||
return spt.refreshInternal(ctx, spt.inner.Resource)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@@ -543,7 +741,7 @@ func (spt *ServicePrincipalToken) EnsureFresh() error {
|
||||
func (spt *ServicePrincipalToken) InvokeRefreshCallbacks(token Token) error {
|
||||
if spt.refreshCallbacks != nil {
|
||||
for _, callback := range spt.refreshCallbacks {
|
||||
err := callback(spt.token)
|
||||
err := callback(spt.inner.Token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("adal: TokenRefreshCallback handler failed. Error = '%v'", err)
|
||||
}
|
||||
@@ -555,21 +753,33 @@ func (spt *ServicePrincipalToken) InvokeRefreshCallbacks(token Token) error {
|
||||
// Refresh obtains a fresh token for the Service Principal.
|
||||
// This method is not safe for concurrent use and should be syncrhonized.
|
||||
func (spt *ServicePrincipalToken) Refresh() error {
|
||||
return spt.RefreshWithContext(context.Background())
|
||||
}
|
||||
|
||||
// RefreshWithContext obtains a fresh token for the Service Principal.
|
||||
// This method is not safe for concurrent use and should be syncrhonized.
|
||||
func (spt *ServicePrincipalToken) RefreshWithContext(ctx context.Context) error {
|
||||
spt.refreshLock.Lock()
|
||||
defer spt.refreshLock.Unlock()
|
||||
return spt.refreshInternal(spt.resource)
|
||||
return spt.refreshInternal(ctx, spt.inner.Resource)
|
||||
}
|
||||
|
||||
// RefreshExchange refreshes the token, but for a different resource.
|
||||
// This method is not safe for concurrent use and should be syncrhonized.
|
||||
func (spt *ServicePrincipalToken) RefreshExchange(resource string) error {
|
||||
return spt.RefreshExchangeWithContext(context.Background(), resource)
|
||||
}
|
||||
|
||||
// RefreshExchangeWithContext refreshes the token, but for a different resource.
|
||||
// This method is not safe for concurrent use and should be syncrhonized.
|
||||
func (spt *ServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error {
|
||||
spt.refreshLock.Lock()
|
||||
defer spt.refreshLock.Unlock()
|
||||
return spt.refreshInternal(resource)
|
||||
return spt.refreshInternal(ctx, resource)
|
||||
}
|
||||
|
||||
func (spt *ServicePrincipalToken) getGrantType() string {
|
||||
switch spt.secret.(type) {
|
||||
switch spt.inner.Secret.(type) {
|
||||
case *ServicePrincipalUsernamePasswordSecret:
|
||||
return OAuthGrantTypeUserPass
|
||||
case *ServicePrincipalAuthorizationCodeSecret:
|
||||
@@ -587,23 +797,32 @@ func isIMDS(u url.URL) bool {
|
||||
return u.Host == imds.Host && u.Path == imds.Path
|
||||
}
|
||||
|
||||
func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
||||
req, err := http.NewRequest(http.MethodPost, spt.oauthConfig.TokenEndpoint.String(), nil)
|
||||
func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource string) error {
|
||||
req, err := http.NewRequest(http.MethodPost, spt.inner.OauthConfig.TokenEndpoint.String(), nil)
|
||||
if err != nil {
|
||||
return fmt.Errorf("adal: Failed to build the refresh request. Error = '%v'", err)
|
||||
}
|
||||
|
||||
if !isIMDS(spt.oauthConfig.TokenEndpoint) {
|
||||
req.Header.Add("User-Agent", UserAgent())
|
||||
req = req.WithContext(ctx)
|
||||
if !isIMDS(spt.inner.OauthConfig.TokenEndpoint) {
|
||||
v := url.Values{}
|
||||
v.Set("client_id", spt.clientID)
|
||||
v.Set("client_id", spt.inner.ClientID)
|
||||
v.Set("resource", resource)
|
||||
|
||||
if spt.token.RefreshToken != "" {
|
||||
if spt.inner.Token.RefreshToken != "" {
|
||||
v.Set("grant_type", OAuthGrantTypeRefreshToken)
|
||||
v.Set("refresh_token", spt.token.RefreshToken)
|
||||
v.Set("refresh_token", spt.inner.Token.RefreshToken)
|
||||
// web apps must specify client_secret when refreshing tokens
|
||||
// see https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code#refreshing-the-access-tokens
|
||||
if spt.getGrantType() == OAuthGrantTypeAuthorizationCode {
|
||||
err := spt.inner.Secret.SetAuthenticationValues(spt, &v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
v.Set("grant_type", spt.getGrantType())
|
||||
err := spt.secret.SetAuthenticationValues(spt, &v)
|
||||
err := spt.inner.Secret.SetAuthenticationValues(spt, &v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -616,14 +835,19 @@ func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
||||
req.Body = body
|
||||
}
|
||||
|
||||
if _, ok := spt.secret.(*ServicePrincipalMSISecret); ok {
|
||||
if _, ok := spt.inner.Secret.(*ServicePrincipalMSISecret); ok {
|
||||
req.Method = http.MethodGet
|
||||
req.Header.Set(metadataHeader, "true")
|
||||
}
|
||||
|
||||
resp, err := spt.sender.Do(req)
|
||||
var resp *http.Response
|
||||
if isIMDS(spt.inner.OauthConfig.TokenEndpoint) {
|
||||
resp, err = retryForIMDS(spt.sender, req, spt.MaxMSIRefreshAttempts)
|
||||
} else {
|
||||
resp, err = spt.sender.Do(req)
|
||||
}
|
||||
if err != nil {
|
||||
return fmt.Errorf("adal: Failed to execute the refresh request. Error = '%v'", err)
|
||||
return newTokenRefreshError(fmt.Sprintf("adal: Failed to execute the refresh request. Error = '%v'", err), nil)
|
||||
}
|
||||
|
||||
defer resp.Body.Close()
|
||||
@@ -631,11 +855,15 @@ func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
if err != nil {
|
||||
return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Failed reading response body", resp.StatusCode), resp)
|
||||
return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Failed reading response body: %v", resp.StatusCode, err), resp)
|
||||
}
|
||||
return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Response body: %s", resp.StatusCode, string(rb)), resp)
|
||||
}
|
||||
|
||||
// for the following error cases don't return a TokenRefreshError. the operation succeeded
|
||||
// but some transient failure happened during deserialization. by returning a generic error
|
||||
// the retry logic will kick in (we don't retry on TokenRefreshError).
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("adal: Failed to read a new service principal token during refresh. Error = '%v'", err)
|
||||
}
|
||||
@@ -648,20 +876,99 @@ func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
||||
return fmt.Errorf("adal: Failed to unmarshal the service principal token during refresh. Error = '%v' JSON = '%s'", err, string(rb))
|
||||
}
|
||||
|
||||
spt.token = token
|
||||
spt.inner.Token = token
|
||||
|
||||
return spt.InvokeRefreshCallbacks(token)
|
||||
}
|
||||
|
||||
// retry logic specific to retrieving a token from the IMDS endpoint
|
||||
func retryForIMDS(sender Sender, req *http.Request, maxAttempts int) (resp *http.Response, err error) {
|
||||
// copied from client.go due to circular dependency
|
||||
retries := []int{
|
||||
http.StatusRequestTimeout, // 408
|
||||
http.StatusTooManyRequests, // 429
|
||||
http.StatusInternalServerError, // 500
|
||||
http.StatusBadGateway, // 502
|
||||
http.StatusServiceUnavailable, // 503
|
||||
http.StatusGatewayTimeout, // 504
|
||||
}
|
||||
// extra retry status codes specific to IMDS
|
||||
retries = append(retries,
|
||||
http.StatusNotFound,
|
||||
http.StatusGone,
|
||||
// all remaining 5xx
|
||||
http.StatusNotImplemented,
|
||||
http.StatusHTTPVersionNotSupported,
|
||||
http.StatusVariantAlsoNegotiates,
|
||||
http.StatusInsufficientStorage,
|
||||
http.StatusLoopDetected,
|
||||
http.StatusNotExtended,
|
||||
http.StatusNetworkAuthenticationRequired)
|
||||
|
||||
// see https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/how-to-use-vm-token#retry-guidance
|
||||
|
||||
const maxDelay time.Duration = 60 * time.Second
|
||||
|
||||
attempt := 0
|
||||
delay := time.Duration(0)
|
||||
|
||||
for attempt < maxAttempts {
|
||||
resp, err = sender.Do(req)
|
||||
// retry on temporary network errors, e.g. transient network failures.
|
||||
// if we don't receive a response then assume we can't connect to the
|
||||
// endpoint so we're likely not running on an Azure VM so don't retry.
|
||||
if (err != nil && !isTemporaryNetworkError(err)) || resp == nil || resp.StatusCode == http.StatusOK || !containsInt(retries, resp.StatusCode) {
|
||||
return
|
||||
}
|
||||
|
||||
// perform exponential backoff with a cap.
|
||||
// must increment attempt before calculating delay.
|
||||
attempt++
|
||||
// the base value of 2 is the "delta backoff" as specified in the guidance doc
|
||||
delay += (time.Duration(math.Pow(2, float64(attempt))) * time.Second)
|
||||
if delay > maxDelay {
|
||||
delay = maxDelay
|
||||
}
|
||||
|
||||
select {
|
||||
case <-time.After(delay):
|
||||
// intentionally left blank
|
||||
case <-req.Context().Done():
|
||||
err = req.Context().Err()
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// returns true if the specified error is a temporary network error or false if it's not.
|
||||
// if the error doesn't implement the net.Error interface the return value is true.
|
||||
func isTemporaryNetworkError(err error) bool {
|
||||
if netErr, ok := err.(net.Error); !ok || (ok && netErr.Temporary()) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// returns true if slice ints contains the value n
|
||||
func containsInt(ints []int, n int) bool {
|
||||
for _, i := range ints {
|
||||
if i == n {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// SetAutoRefresh enables or disables automatic refreshing of stale tokens.
|
||||
func (spt *ServicePrincipalToken) SetAutoRefresh(autoRefresh bool) {
|
||||
spt.autoRefresh = autoRefresh
|
||||
spt.inner.AutoRefresh = autoRefresh
|
||||
}
|
||||
|
||||
// SetRefreshWithin sets the interval within which if the token will expire, EnsureFresh will
|
||||
// refresh the token.
|
||||
func (spt *ServicePrincipalToken) SetRefreshWithin(d time.Duration) {
|
||||
spt.refreshWithin = d
|
||||
spt.inner.RefreshWithin = d
|
||||
return
|
||||
}
|
||||
|
||||
@@ -673,12 +980,76 @@ func (spt *ServicePrincipalToken) SetSender(s Sender) { spt.sender = s }
|
||||
func (spt *ServicePrincipalToken) OAuthToken() string {
|
||||
spt.refreshLock.RLock()
|
||||
defer spt.refreshLock.RUnlock()
|
||||
return spt.token.OAuthToken()
|
||||
return spt.inner.Token.OAuthToken()
|
||||
}
|
||||
|
||||
// Token returns a copy of the current token.
|
||||
func (spt *ServicePrincipalToken) Token() Token {
|
||||
spt.refreshLock.RLock()
|
||||
defer spt.refreshLock.RUnlock()
|
||||
return spt.token
|
||||
return spt.inner.Token
|
||||
}
|
||||
|
||||
// MultiTenantServicePrincipalToken contains tokens for multi-tenant authorization.
|
||||
type MultiTenantServicePrincipalToken struct {
|
||||
PrimaryToken *ServicePrincipalToken
|
||||
AuxiliaryTokens []*ServicePrincipalToken
|
||||
}
|
||||
|
||||
// PrimaryOAuthToken returns the primary authorization token.
|
||||
func (mt *MultiTenantServicePrincipalToken) PrimaryOAuthToken() string {
|
||||
return mt.PrimaryToken.OAuthToken()
|
||||
}
|
||||
|
||||
// AuxiliaryOAuthTokens returns one to three auxiliary authorization tokens.
|
||||
func (mt *MultiTenantServicePrincipalToken) AuxiliaryOAuthTokens() []string {
|
||||
tokens := make([]string, len(mt.AuxiliaryTokens))
|
||||
for i := range mt.AuxiliaryTokens {
|
||||
tokens[i] = mt.AuxiliaryTokens[i].OAuthToken()
|
||||
}
|
||||
return tokens
|
||||
}
|
||||
|
||||
// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
|
||||
// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
|
||||
func (mt *MultiTenantServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
|
||||
if err := mt.PrimaryToken.EnsureFreshWithContext(ctx); err != nil {
|
||||
return fmt.Errorf("failed to refresh primary token: %v", err)
|
||||
}
|
||||
for _, aux := range mt.AuxiliaryTokens {
|
||||
if err := aux.EnsureFreshWithContext(ctx); err != nil {
|
||||
return fmt.Errorf("failed to refresh auxiliary token: %v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// NewMultiTenantServicePrincipalToken creates a new MultiTenantServicePrincipalToken with the specified credentials and resource.
|
||||
func NewMultiTenantServicePrincipalToken(multiTenantCfg MultiTenantOAuthConfig, clientID string, secret string, resource string) (*MultiTenantServicePrincipalToken, error) {
|
||||
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateStringParam(secret, "secret"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateStringParam(resource, "resource"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
auxTenants := multiTenantCfg.AuxiliaryTenants()
|
||||
m := MultiTenantServicePrincipalToken{
|
||||
AuxiliaryTokens: make([]*ServicePrincipalToken, len(auxTenants)),
|
||||
}
|
||||
primary, err := NewServicePrincipalToken(*multiTenantCfg.PrimaryTenant(), clientID, secret, resource)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create SPT for primary tenant: %v", err)
|
||||
}
|
||||
m.PrimaryToken = primary
|
||||
for i := range auxTenants {
|
||||
aux, err := NewServicePrincipalToken(*auxTenants[i], clientID, secret, resource)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create SPT for auxiliary tenant: %v", err)
|
||||
}
|
||||
m.AuxiliaryTokens[i] = aux
|
||||
}
|
||||
return &m, nil
|
||||
}
|
||||
|
||||
45
vendor/github.com/Azure/go-autorest/autorest/adal/version.go
generated
vendored
Normal file
45
vendor/github.com/Azure/go-autorest/autorest/adal/version.go
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
package adal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
// 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.
|
||||
|
||||
const number = "v1.0.0"
|
||||
|
||||
var (
|
||||
ua = fmt.Sprintf("Go/%s (%s-%s) go-autorest/adal/%s",
|
||||
runtime.Version(),
|
||||
runtime.GOARCH,
|
||||
runtime.GOOS,
|
||||
number,
|
||||
)
|
||||
)
|
||||
|
||||
// UserAgent returns a string containing the Go version, system architecture and OS, and the adal version.
|
||||
func UserAgent() string {
|
||||
return ua
|
||||
}
|
||||
|
||||
// AddToUserAgent adds an extension to the current user agent
|
||||
func AddToUserAgent(extension string) error {
|
||||
if extension != "" {
|
||||
ua = fmt.Sprintf("%s %s", ua, extension)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("Extension was empty, User Agent remained as '%s'", ua)
|
||||
}
|
||||
103
vendor/github.com/Azure/go-autorest/autorest/authorization.go
generated
vendored
103
vendor/github.com/Azure/go-autorest/autorest/authorization.go
generated
vendored
@@ -15,12 +15,14 @@ package autorest
|
||||
// limitations under the License.
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/Azure/go-autorest/autorest/adal"
|
||||
"github.com/Azure/go-autorest/tracing"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -30,6 +32,8 @@ const (
|
||||
apiKeyAuthorizerHeader = "Ocp-Apim-Subscription-Key"
|
||||
bingAPISdkHeader = "X-BingApis-SDK-Client"
|
||||
golangBingAPISdkHeaderValue = "Go-SDK"
|
||||
authorization = "Authorization"
|
||||
basic = "Basic"
|
||||
)
|
||||
|
||||
// Authorizer is the interface that provides a PrepareDecorator used to supply request
|
||||
@@ -68,7 +72,7 @@ func NewAPIKeyAuthorizer(headers map[string]interface{}, queryParameters map[str
|
||||
return &APIKeyAuthorizer{headers: headers, queryParameters: queryParameters}
|
||||
}
|
||||
|
||||
// WithAuthorization returns a PrepareDecorator that adds an HTTP headers and Query Paramaters
|
||||
// WithAuthorization returns a PrepareDecorator that adds an HTTP headers and Query Parameters.
|
||||
func (aka *APIKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
||||
return func(p Preparer) Preparer {
|
||||
return DecoratePreparer(p, WithHeaders(aka.headers), WithQueryParameters(aka.queryParameters))
|
||||
@@ -113,17 +117,19 @@ func (ba *BearerAuthorizer) WithAuthorization() PrepareDecorator {
|
||||
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||
r, err := p.Prepare(r)
|
||||
if err == nil {
|
||||
refresher, ok := ba.tokenProvider.(adal.Refresher)
|
||||
if ok {
|
||||
err := refresher.EnsureFresh()
|
||||
if err != nil {
|
||||
var resp *http.Response
|
||||
if tokError, ok := err.(adal.TokenRefreshError); ok {
|
||||
resp = tokError.Response()
|
||||
}
|
||||
return r, NewErrorWithError(err, "azure.BearerAuthorizer", "WithAuthorization", resp,
|
||||
"Failed to refresh the Token for request to %s", r.URL)
|
||||
// the ordering is important here, prefer RefresherWithContext if available
|
||||
if refresher, ok := ba.tokenProvider.(adal.RefresherWithContext); ok {
|
||||
err = refresher.EnsureFreshWithContext(r.Context())
|
||||
} else if refresher, ok := ba.tokenProvider.(adal.Refresher); ok {
|
||||
err = refresher.EnsureFresh()
|
||||
}
|
||||
if err != nil {
|
||||
var resp *http.Response
|
||||
if tokError, ok := err.(adal.TokenRefreshError); ok {
|
||||
resp = tokError.Response()
|
||||
}
|
||||
return r, NewErrorWithError(err, "azure.BearerAuthorizer", "WithAuthorization", resp,
|
||||
"Failed to refresh the Token for request to %s", r.URL)
|
||||
}
|
||||
return Prepare(r, WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", ba.tokenProvider.OAuthToken())))
|
||||
}
|
||||
@@ -145,7 +151,7 @@ type BearerAuthorizerCallback struct {
|
||||
// is invoked when the HTTP request is submitted.
|
||||
func NewBearerAuthorizerCallback(sender Sender, callback BearerAuthorizerCallbackFunc) *BearerAuthorizerCallback {
|
||||
if sender == nil {
|
||||
sender = &http.Client{}
|
||||
sender = &http.Client{Transport: tracing.Transport}
|
||||
}
|
||||
return &BearerAuthorizerCallback{sender: sender, callback: callback}
|
||||
}
|
||||
@@ -255,3 +261,76 @@ func (egta EventGridKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
||||
}
|
||||
return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
|
||||
}
|
||||
|
||||
// BasicAuthorizer implements basic HTTP authorization by adding the Authorization HTTP header
|
||||
// with the value "Basic <TOKEN>" where <TOKEN> is a base64-encoded username:password tuple.
|
||||
type BasicAuthorizer struct {
|
||||
userName string
|
||||
password string
|
||||
}
|
||||
|
||||
// NewBasicAuthorizer creates a new BasicAuthorizer with the specified username and password.
|
||||
func NewBasicAuthorizer(userName, password string) *BasicAuthorizer {
|
||||
return &BasicAuthorizer{
|
||||
userName: userName,
|
||||
password: password,
|
||||
}
|
||||
}
|
||||
|
||||
// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
|
||||
// value is "Basic " followed by the base64-encoded username:password tuple.
|
||||
func (ba *BasicAuthorizer) WithAuthorization() PrepareDecorator {
|
||||
headers := make(map[string]interface{})
|
||||
headers[authorization] = basic + " " + base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", ba.userName, ba.password)))
|
||||
|
||||
return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
|
||||
}
|
||||
|
||||
// MultiTenantServicePrincipalTokenAuthorizer provides authentication across tenants.
|
||||
type MultiTenantServicePrincipalTokenAuthorizer interface {
|
||||
WithAuthorization() PrepareDecorator
|
||||
}
|
||||
|
||||
// NewMultiTenantServicePrincipalTokenAuthorizer crates a BearerAuthorizer using the given token provider
|
||||
func NewMultiTenantServicePrincipalTokenAuthorizer(tp adal.MultitenantOAuthTokenProvider) MultiTenantServicePrincipalTokenAuthorizer {
|
||||
return &multiTenantSPTAuthorizer{tp: tp}
|
||||
}
|
||||
|
||||
type multiTenantSPTAuthorizer struct {
|
||||
tp adal.MultitenantOAuthTokenProvider
|
||||
}
|
||||
|
||||
// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header using the
|
||||
// primary token along with the auxiliary authorization header using the auxiliary tokens.
|
||||
//
|
||||
// By default, the token will be automatically refreshed through the Refresher interface.
|
||||
func (mt multiTenantSPTAuthorizer) WithAuthorization() PrepareDecorator {
|
||||
return func(p Preparer) Preparer {
|
||||
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||
r, err := p.Prepare(r)
|
||||
if err != nil {
|
||||
return r, err
|
||||
}
|
||||
if refresher, ok := mt.tp.(adal.RefresherWithContext); ok {
|
||||
err = refresher.EnsureFreshWithContext(r.Context())
|
||||
if err != nil {
|
||||
var resp *http.Response
|
||||
if tokError, ok := err.(adal.TokenRefreshError); ok {
|
||||
resp = tokError.Response()
|
||||
}
|
||||
return r, NewErrorWithError(err, "azure.multiTenantSPTAuthorizer", "WithAuthorization", resp,
|
||||
"Failed to refresh one or more Tokens for request to %s", r.URL)
|
||||
}
|
||||
}
|
||||
r, err = Prepare(r, WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", mt.tp.PrimaryOAuthToken())))
|
||||
if err != nil {
|
||||
return r, err
|
||||
}
|
||||
auxTokens := mt.tp.AuxiliaryOAuthTokens()
|
||||
for i := range auxTokens {
|
||||
auxTokens[i] = fmt.Sprintf("Bearer %s", auxTokens[i])
|
||||
}
|
||||
return Prepare(r, WithHeader(headerAuxAuthorization, strings.Join(auxTokens, "; ")))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
1043
vendor/github.com/Azure/go-autorest/autorest/azure/async.go
generated
vendored
1043
vendor/github.com/Azure/go-autorest/autorest/azure/async.go
generated
vendored
File diff suppressed because it is too large
Load Diff
523
vendor/github.com/Azure/go-autorest/autorest/azure/auth/auth.go
generated
vendored
523
vendor/github.com/Azure/go-autorest/autorest/azure/auth/auth.go
generated
vendored
@@ -31,126 +31,416 @@ import (
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
"github.com/Azure/go-autorest/autorest/adal"
|
||||
"github.com/Azure/go-autorest/autorest/azure"
|
||||
"github.com/Azure/go-autorest/autorest/azure/cli"
|
||||
"github.com/dimchansky/utfbom"
|
||||
"golang.org/x/crypto/pkcs12"
|
||||
)
|
||||
|
||||
// The possible keys in the Values map.
|
||||
const (
|
||||
SubscriptionID = "AZURE_SUBSCRIPTION_ID"
|
||||
TenantID = "AZURE_TENANT_ID"
|
||||
AuxiliaryTenantIDs = "AZURE_AUXILIARY_TENANT_IDS"
|
||||
ClientID = "AZURE_CLIENT_ID"
|
||||
ClientSecret = "AZURE_CLIENT_SECRET"
|
||||
CertificatePath = "AZURE_CERTIFICATE_PATH"
|
||||
CertificatePassword = "AZURE_CERTIFICATE_PASSWORD"
|
||||
Username = "AZURE_USERNAME"
|
||||
Password = "AZURE_PASSWORD"
|
||||
EnvironmentName = "AZURE_ENVIRONMENT"
|
||||
Resource = "AZURE_AD_RESOURCE"
|
||||
ActiveDirectoryEndpoint = "ActiveDirectoryEndpoint"
|
||||
ResourceManagerEndpoint = "ResourceManagerEndpoint"
|
||||
GraphResourceID = "GraphResourceID"
|
||||
SQLManagementEndpoint = "SQLManagementEndpoint"
|
||||
GalleryEndpoint = "GalleryEndpoint"
|
||||
ManagementEndpoint = "ManagementEndpoint"
|
||||
)
|
||||
|
||||
// NewAuthorizerFromEnvironment creates an Authorizer configured from environment variables in the order:
|
||||
// 1. Client credentials
|
||||
// 2. Client certificate
|
||||
// 3. Username password
|
||||
// 4. MSI
|
||||
func NewAuthorizerFromEnvironment() (autorest.Authorizer, error) {
|
||||
tenantID := os.Getenv("AZURE_TENANT_ID")
|
||||
clientID := os.Getenv("AZURE_CLIENT_ID")
|
||||
clientSecret := os.Getenv("AZURE_CLIENT_SECRET")
|
||||
certificatePath := os.Getenv("AZURE_CERTIFICATE_PATH")
|
||||
certificatePassword := os.Getenv("AZURE_CERTIFICATE_PASSWORD")
|
||||
username := os.Getenv("AZURE_USERNAME")
|
||||
password := os.Getenv("AZURE_PASSWORD")
|
||||
envName := os.Getenv("AZURE_ENVIRONMENT")
|
||||
resource := os.Getenv("AZURE_AD_RESOURCE")
|
||||
settings, err := GetSettingsFromEnvironment()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return settings.GetAuthorizer()
|
||||
}
|
||||
|
||||
var env azure.Environment
|
||||
if envName == "" {
|
||||
env = azure.PublicCloud
|
||||
// NewAuthorizerFromEnvironmentWithResource creates an Authorizer configured from environment variables in the order:
|
||||
// 1. Client credentials
|
||||
// 2. Client certificate
|
||||
// 3. Username password
|
||||
// 4. MSI
|
||||
func NewAuthorizerFromEnvironmentWithResource(resource string) (autorest.Authorizer, error) {
|
||||
settings, err := GetSettingsFromEnvironment()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
settings.Values[Resource] = resource
|
||||
return settings.GetAuthorizer()
|
||||
}
|
||||
|
||||
// EnvironmentSettings contains the available authentication settings.
|
||||
type EnvironmentSettings struct {
|
||||
Values map[string]string
|
||||
Environment azure.Environment
|
||||
}
|
||||
|
||||
// GetSettingsFromEnvironment returns the available authentication settings from the environment.
|
||||
func GetSettingsFromEnvironment() (s EnvironmentSettings, err error) {
|
||||
s = EnvironmentSettings{
|
||||
Values: map[string]string{},
|
||||
}
|
||||
s.setValue(SubscriptionID)
|
||||
s.setValue(TenantID)
|
||||
s.setValue(AuxiliaryTenantIDs)
|
||||
s.setValue(ClientID)
|
||||
s.setValue(ClientSecret)
|
||||
s.setValue(CertificatePath)
|
||||
s.setValue(CertificatePassword)
|
||||
s.setValue(Username)
|
||||
s.setValue(Password)
|
||||
s.setValue(EnvironmentName)
|
||||
s.setValue(Resource)
|
||||
if v := s.Values[EnvironmentName]; v == "" {
|
||||
s.Environment = azure.PublicCloud
|
||||
} else {
|
||||
var err error
|
||||
env, err = azure.EnvironmentFromName(envName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
s.Environment, err = azure.EnvironmentFromName(v)
|
||||
}
|
||||
if s.Values[Resource] == "" {
|
||||
s.Values[Resource] = s.Environment.ResourceManagerEndpoint
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// GetSubscriptionID returns the available subscription ID or an empty string.
|
||||
func (settings EnvironmentSettings) GetSubscriptionID() string {
|
||||
return settings.Values[SubscriptionID]
|
||||
}
|
||||
|
||||
// adds the specified environment variable value to the Values map if it exists
|
||||
func (settings EnvironmentSettings) setValue(key string) {
|
||||
if v := os.Getenv(key); v != "" {
|
||||
settings.Values[key] = v
|
||||
}
|
||||
}
|
||||
|
||||
// helper to return client and tenant IDs
|
||||
func (settings EnvironmentSettings) getClientAndTenant() (string, string) {
|
||||
clientID := settings.Values[ClientID]
|
||||
tenantID := settings.Values[TenantID]
|
||||
return clientID, tenantID
|
||||
}
|
||||
|
||||
// GetClientCredentials creates a config object from the available client credentials.
|
||||
// An error is returned if no client credentials are available.
|
||||
func (settings EnvironmentSettings) GetClientCredentials() (ClientCredentialsConfig, error) {
|
||||
secret := settings.Values[ClientSecret]
|
||||
if secret == "" {
|
||||
return ClientCredentialsConfig{}, errors.New("missing client secret")
|
||||
}
|
||||
clientID, tenantID := settings.getClientAndTenant()
|
||||
config := NewClientCredentialsConfig(clientID, secret, tenantID)
|
||||
config.AADEndpoint = settings.Environment.ActiveDirectoryEndpoint
|
||||
config.Resource = settings.Values[Resource]
|
||||
if auxTenants, ok := settings.Values[AuxiliaryTenantIDs]; ok {
|
||||
config.AuxTenants = strings.Split(auxTenants, ";")
|
||||
for i := range config.AuxTenants {
|
||||
config.AuxTenants[i] = strings.TrimSpace(config.AuxTenants[i])
|
||||
}
|
||||
}
|
||||
return config, nil
|
||||
}
|
||||
|
||||
if resource == "" {
|
||||
resource = env.ResourceManagerEndpoint
|
||||
// GetClientCertificate creates a config object from the available certificate credentials.
|
||||
// An error is returned if no certificate credentials are available.
|
||||
func (settings EnvironmentSettings) GetClientCertificate() (ClientCertificateConfig, error) {
|
||||
certPath := settings.Values[CertificatePath]
|
||||
if certPath == "" {
|
||||
return ClientCertificateConfig{}, errors.New("missing certificate path")
|
||||
}
|
||||
certPwd := settings.Values[CertificatePassword]
|
||||
clientID, tenantID := settings.getClientAndTenant()
|
||||
config := NewClientCertificateConfig(certPath, certPwd, clientID, tenantID)
|
||||
config.AADEndpoint = settings.Environment.ActiveDirectoryEndpoint
|
||||
config.Resource = settings.Values[Resource]
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// GetUsernamePassword creates a config object from the available username/password credentials.
|
||||
// An error is returned if no username/password credentials are available.
|
||||
func (settings EnvironmentSettings) GetUsernamePassword() (UsernamePasswordConfig, error) {
|
||||
username := settings.Values[Username]
|
||||
password := settings.Values[Password]
|
||||
if username == "" || password == "" {
|
||||
return UsernamePasswordConfig{}, errors.New("missing username/password")
|
||||
}
|
||||
clientID, tenantID := settings.getClientAndTenant()
|
||||
config := NewUsernamePasswordConfig(username, password, clientID, tenantID)
|
||||
config.AADEndpoint = settings.Environment.ActiveDirectoryEndpoint
|
||||
config.Resource = settings.Values[Resource]
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// GetMSI creates a MSI config object from the available client ID.
|
||||
func (settings EnvironmentSettings) GetMSI() MSIConfig {
|
||||
config := NewMSIConfig()
|
||||
config.Resource = settings.Values[Resource]
|
||||
config.ClientID = settings.Values[ClientID]
|
||||
return config
|
||||
}
|
||||
|
||||
// GetDeviceFlow creates a device-flow config object from the available client and tenant IDs.
|
||||
func (settings EnvironmentSettings) GetDeviceFlow() DeviceFlowConfig {
|
||||
clientID, tenantID := settings.getClientAndTenant()
|
||||
config := NewDeviceFlowConfig(clientID, tenantID)
|
||||
config.AADEndpoint = settings.Environment.ActiveDirectoryEndpoint
|
||||
config.Resource = settings.Values[Resource]
|
||||
return config
|
||||
}
|
||||
|
||||
// GetAuthorizer creates an Authorizer configured from environment variables in the order:
|
||||
// 1. Client credentials
|
||||
// 2. Client certificate
|
||||
// 3. Username password
|
||||
// 4. MSI
|
||||
func (settings EnvironmentSettings) GetAuthorizer() (autorest.Authorizer, error) {
|
||||
//1.Client Credentials
|
||||
if clientSecret != "" {
|
||||
config := NewClientCredentialsConfig(clientID, clientSecret, tenantID)
|
||||
config.AADEndpoint = env.ActiveDirectoryEndpoint
|
||||
config.Resource = resource
|
||||
return config.Authorizer()
|
||||
if c, e := settings.GetClientCredentials(); e == nil {
|
||||
return c.Authorizer()
|
||||
}
|
||||
|
||||
//2. Client Certificate
|
||||
if certificatePath != "" {
|
||||
config := NewClientCertificateConfig(certificatePath, certificatePassword, clientID, tenantID)
|
||||
config.AADEndpoint = env.ActiveDirectoryEndpoint
|
||||
config.Resource = resource
|
||||
return config.Authorizer()
|
||||
if c, e := settings.GetClientCertificate(); e == nil {
|
||||
return c.Authorizer()
|
||||
}
|
||||
|
||||
//3. Username Password
|
||||
if username != "" && password != "" {
|
||||
config := NewUsernamePasswordConfig(username, password, clientID, tenantID)
|
||||
config.AADEndpoint = env.ActiveDirectoryEndpoint
|
||||
config.Resource = resource
|
||||
return config.Authorizer()
|
||||
if c, e := settings.GetUsernamePassword(); e == nil {
|
||||
return c.Authorizer()
|
||||
}
|
||||
|
||||
// 4. MSI
|
||||
config := NewMSIConfig()
|
||||
config.Resource = resource
|
||||
config.ClientID = clientID
|
||||
return config.Authorizer()
|
||||
return settings.GetMSI().Authorizer()
|
||||
}
|
||||
|
||||
// NewAuthorizerFromFile creates an Authorizer configured from a configuration file.
|
||||
// NewAuthorizerFromFile creates an Authorizer configured from a configuration file in the following order.
|
||||
// 1. Client credentials
|
||||
// 2. Client certificate
|
||||
func NewAuthorizerFromFile(baseURI string) (autorest.Authorizer, error) {
|
||||
settings, err := GetSettingsFromFile()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if a, err := settings.ClientCredentialsAuthorizer(baseURI); err == nil {
|
||||
return a, err
|
||||
}
|
||||
if a, err := settings.ClientCertificateAuthorizer(baseURI); err == nil {
|
||||
return a, err
|
||||
}
|
||||
return nil, errors.New("auth file missing client and certificate credentials")
|
||||
}
|
||||
|
||||
// NewAuthorizerFromFileWithResource creates an Authorizer configured from a configuration file in the following order.
|
||||
// 1. Client credentials
|
||||
// 2. Client certificate
|
||||
func NewAuthorizerFromFileWithResource(resource string) (autorest.Authorizer, error) {
|
||||
s, err := GetSettingsFromFile()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if a, err := s.ClientCredentialsAuthorizerWithResource(resource); err == nil {
|
||||
return a, err
|
||||
}
|
||||
if a, err := s.ClientCertificateAuthorizerWithResource(resource); err == nil {
|
||||
return a, err
|
||||
}
|
||||
return nil, errors.New("auth file missing client and certificate credentials")
|
||||
}
|
||||
|
||||
// NewAuthorizerFromCLI creates an Authorizer configured from Azure CLI 2.0 for local development scenarios.
|
||||
func NewAuthorizerFromCLI() (autorest.Authorizer, error) {
|
||||
settings, err := GetSettingsFromEnvironment()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if settings.Values[Resource] == "" {
|
||||
settings.Values[Resource] = settings.Environment.ResourceManagerEndpoint
|
||||
}
|
||||
|
||||
return NewAuthorizerFromCLIWithResource(settings.Values[Resource])
|
||||
}
|
||||
|
||||
// NewAuthorizerFromCLIWithResource creates an Authorizer configured from Azure CLI 2.0 for local development scenarios.
|
||||
func NewAuthorizerFromCLIWithResource(resource string) (autorest.Authorizer, error) {
|
||||
token, err := cli.GetTokenFromCLI(resource)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
adalToken, err := token.ToADALToken()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return autorest.NewBearerAuthorizer(&adalToken), nil
|
||||
}
|
||||
|
||||
// GetSettingsFromFile returns the available authentication settings from an Azure CLI authentication file.
|
||||
func GetSettingsFromFile() (FileSettings, error) {
|
||||
s := FileSettings{}
|
||||
fileLocation := os.Getenv("AZURE_AUTH_LOCATION")
|
||||
if fileLocation == "" {
|
||||
return nil, errors.New("auth file not found. Environment variable AZURE_AUTH_LOCATION is not set")
|
||||
return s, errors.New("environment variable AZURE_AUTH_LOCATION is not set")
|
||||
}
|
||||
|
||||
contents, err := ioutil.ReadFile(fileLocation)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return s, err
|
||||
}
|
||||
|
||||
// Auth file might be encoded
|
||||
decoded, err := decode(contents)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return s, err
|
||||
}
|
||||
|
||||
file := file{}
|
||||
err = json.Unmarshal(decoded, &file)
|
||||
authFile := map[string]interface{}{}
|
||||
err = json.Unmarshal(decoded, &authFile)
|
||||
if err != nil {
|
||||
return s, err
|
||||
}
|
||||
|
||||
s.Values = map[string]string{}
|
||||
s.setKeyValue(ClientID, authFile["clientId"])
|
||||
s.setKeyValue(ClientSecret, authFile["clientSecret"])
|
||||
s.setKeyValue(CertificatePath, authFile["clientCertificate"])
|
||||
s.setKeyValue(CertificatePassword, authFile["clientCertificatePassword"])
|
||||
s.setKeyValue(SubscriptionID, authFile["subscriptionId"])
|
||||
s.setKeyValue(TenantID, authFile["tenantId"])
|
||||
s.setKeyValue(ActiveDirectoryEndpoint, authFile["activeDirectoryEndpointUrl"])
|
||||
s.setKeyValue(ResourceManagerEndpoint, authFile["resourceManagerEndpointUrl"])
|
||||
s.setKeyValue(GraphResourceID, authFile["activeDirectoryGraphResourceId"])
|
||||
s.setKeyValue(SQLManagementEndpoint, authFile["sqlManagementEndpointUrl"])
|
||||
s.setKeyValue(GalleryEndpoint, authFile["galleryEndpointUrl"])
|
||||
s.setKeyValue(ManagementEndpoint, authFile["managementEndpointUrl"])
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// FileSettings contains the available authentication settings.
|
||||
type FileSettings struct {
|
||||
Values map[string]string
|
||||
}
|
||||
|
||||
// GetSubscriptionID returns the available subscription ID or an empty string.
|
||||
func (settings FileSettings) GetSubscriptionID() string {
|
||||
return settings.Values[SubscriptionID]
|
||||
}
|
||||
|
||||
// adds the specified value to the Values map if it isn't nil
|
||||
func (settings FileSettings) setKeyValue(key string, val interface{}) {
|
||||
if val != nil {
|
||||
settings.Values[key] = val.(string)
|
||||
}
|
||||
}
|
||||
|
||||
// returns the specified AAD endpoint or the public cloud endpoint if unspecified
|
||||
func (settings FileSettings) getAADEndpoint() string {
|
||||
if v, ok := settings.Values[ActiveDirectoryEndpoint]; ok {
|
||||
return v
|
||||
}
|
||||
return azure.PublicCloud.ActiveDirectoryEndpoint
|
||||
}
|
||||
|
||||
// ServicePrincipalTokenFromClientCredentials creates a ServicePrincipalToken from the available client credentials.
|
||||
func (settings FileSettings) ServicePrincipalTokenFromClientCredentials(baseURI string) (*adal.ServicePrincipalToken, error) {
|
||||
resource, err := settings.getResourceForToken(baseURI)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return settings.ServicePrincipalTokenFromClientCredentialsWithResource(resource)
|
||||
}
|
||||
|
||||
resource, err := getResourceForToken(file, baseURI)
|
||||
// ClientCredentialsAuthorizer creates an authorizer from the available client credentials.
|
||||
func (settings FileSettings) ClientCredentialsAuthorizer(baseURI string) (autorest.Authorizer, error) {
|
||||
resource, err := settings.getResourceForToken(baseURI)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return settings.ClientCredentialsAuthorizerWithResource(resource)
|
||||
}
|
||||
|
||||
config, err := adal.NewOAuthConfig(file.ActiveDirectoryEndpoint, file.TenantID)
|
||||
// ServicePrincipalTokenFromClientCredentialsWithResource creates a ServicePrincipalToken
|
||||
// from the available client credentials and the specified resource.
|
||||
func (settings FileSettings) ServicePrincipalTokenFromClientCredentialsWithResource(resource string) (*adal.ServicePrincipalToken, error) {
|
||||
if _, ok := settings.Values[ClientSecret]; !ok {
|
||||
return nil, errors.New("missing client secret")
|
||||
}
|
||||
config, err := adal.NewOAuthConfig(settings.getAADEndpoint(), settings.Values[TenantID])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return adal.NewServicePrincipalToken(*config, settings.Values[ClientID], settings.Values[ClientSecret], resource)
|
||||
}
|
||||
|
||||
spToken, err := adal.NewServicePrincipalToken(*config, file.ClientID, file.ClientSecret, resource)
|
||||
func (settings FileSettings) clientCertificateConfigWithResource(resource string) (ClientCertificateConfig, error) {
|
||||
if _, ok := settings.Values[CertificatePath]; !ok {
|
||||
return ClientCertificateConfig{}, errors.New("missing certificate path")
|
||||
}
|
||||
cfg := NewClientCertificateConfig(settings.Values[CertificatePath], settings.Values[CertificatePassword], settings.Values[ClientID], settings.Values[TenantID])
|
||||
cfg.AADEndpoint = settings.getAADEndpoint()
|
||||
cfg.Resource = resource
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
// ClientCredentialsAuthorizerWithResource creates an authorizer from the available client credentials and the specified resource.
|
||||
func (settings FileSettings) ClientCredentialsAuthorizerWithResource(resource string) (autorest.Authorizer, error) {
|
||||
spToken, err := settings.ServicePrincipalTokenFromClientCredentialsWithResource(resource)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
}
|
||||
|
||||
// File represents the authentication file
|
||||
type file struct {
|
||||
ClientID string `json:"clientId,omitempty"`
|
||||
ClientSecret string `json:"clientSecret,omitempty"`
|
||||
SubscriptionID string `json:"subscriptionId,omitempty"`
|
||||
TenantID string `json:"tenantId,omitempty"`
|
||||
ActiveDirectoryEndpoint string `json:"activeDirectoryEndpointUrl,omitempty"`
|
||||
ResourceManagerEndpoint string `json:"resourceManagerEndpointUrl,omitempty"`
|
||||
GraphResourceID string `json:"activeDirectoryGraphResourceId,omitempty"`
|
||||
SQLManagementEndpoint string `json:"sqlManagementEndpointUrl,omitempty"`
|
||||
GalleryEndpoint string `json:"galleryEndpointUrl,omitempty"`
|
||||
ManagementEndpoint string `json:"managementEndpointUrl,omitempty"`
|
||||
// ServicePrincipalTokenFromClientCertificate creates a ServicePrincipalToken from the available certificate credentials.
|
||||
func (settings FileSettings) ServicePrincipalTokenFromClientCertificate(baseURI string) (*adal.ServicePrincipalToken, error) {
|
||||
resource, err := settings.getResourceForToken(baseURI)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return settings.ServicePrincipalTokenFromClientCertificateWithResource(resource)
|
||||
}
|
||||
|
||||
// ClientCertificateAuthorizer creates an authorizer from the available certificate credentials.
|
||||
func (settings FileSettings) ClientCertificateAuthorizer(baseURI string) (autorest.Authorizer, error) {
|
||||
resource, err := settings.getResourceForToken(baseURI)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return settings.ClientCertificateAuthorizerWithResource(resource)
|
||||
}
|
||||
|
||||
// ServicePrincipalTokenFromClientCertificateWithResource creates a ServicePrincipalToken from the available certificate credentials.
|
||||
func (settings FileSettings) ServicePrincipalTokenFromClientCertificateWithResource(resource string) (*adal.ServicePrincipalToken, error) {
|
||||
cfg, err := settings.clientCertificateConfigWithResource(resource)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cfg.ServicePrincipalToken()
|
||||
}
|
||||
|
||||
// ClientCertificateAuthorizerWithResource creates an authorizer from the available certificate credentials and the specified resource.
|
||||
func (settings FileSettings) ClientCertificateAuthorizerWithResource(resource string) (autorest.Authorizer, error) {
|
||||
cfg, err := settings.clientCertificateConfigWithResource(resource)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cfg.Authorizer()
|
||||
}
|
||||
|
||||
func decode(b []byte) ([]byte, error) {
|
||||
@@ -175,7 +465,7 @@ func decode(b []byte) ([]byte, error) {
|
||||
return ioutil.ReadAll(reader)
|
||||
}
|
||||
|
||||
func getResourceForToken(f file, baseURI string) (string, error) {
|
||||
func (settings FileSettings) getResourceForToken(baseURI string) (string, error) {
|
||||
// Compare dafault base URI from the SDK to the endpoints from the public cloud
|
||||
// Base URI and token resource are the same string. This func finds the authentication
|
||||
// file field that matches the SDK base URI. The SDK defines the public cloud
|
||||
@@ -185,15 +475,15 @@ func getResourceForToken(f file, baseURI string) (string, error) {
|
||||
}
|
||||
switch baseURI {
|
||||
case azure.PublicCloud.ServiceManagementEndpoint:
|
||||
return f.ManagementEndpoint, nil
|
||||
return settings.Values[ManagementEndpoint], nil
|
||||
case azure.PublicCloud.ResourceManagerEndpoint:
|
||||
return f.ResourceManagerEndpoint, nil
|
||||
return settings.Values[ResourceManagerEndpoint], nil
|
||||
case azure.PublicCloud.ActiveDirectoryEndpoint:
|
||||
return f.ActiveDirectoryEndpoint, nil
|
||||
return settings.Values[ActiveDirectoryEndpoint], nil
|
||||
case azure.PublicCloud.GalleryEndpoint:
|
||||
return f.GalleryEndpoint, nil
|
||||
return settings.Values[GalleryEndpoint], nil
|
||||
case azure.PublicCloud.GraphEndpoint:
|
||||
return f.GraphResourceID, nil
|
||||
return settings.Values[GraphResourceID], nil
|
||||
}
|
||||
return "", fmt.Errorf("auth: base URI not found in endpoints")
|
||||
}
|
||||
@@ -264,23 +554,43 @@ type ClientCredentialsConfig struct {
|
||||
ClientID string
|
||||
ClientSecret string
|
||||
TenantID string
|
||||
AuxTenants []string
|
||||
AADEndpoint string
|
||||
Resource string
|
||||
}
|
||||
|
||||
// Authorizer gets the authorizer from client credentials.
|
||||
func (ccc ClientCredentialsConfig) Authorizer() (autorest.Authorizer, error) {
|
||||
// ServicePrincipalToken creates a ServicePrincipalToken from client credentials.
|
||||
func (ccc ClientCredentialsConfig) ServicePrincipalToken() (*adal.ServicePrincipalToken, error) {
|
||||
oauthConfig, err := adal.NewOAuthConfig(ccc.AADEndpoint, ccc.TenantID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return adal.NewServicePrincipalToken(*oauthConfig, ccc.ClientID, ccc.ClientSecret, ccc.Resource)
|
||||
}
|
||||
|
||||
spToken, err := adal.NewServicePrincipalToken(*oauthConfig, ccc.ClientID, ccc.ClientSecret, ccc.Resource)
|
||||
// MultiTenantServicePrincipalToken creates a MultiTenantServicePrincipalToken from client credentials.
|
||||
func (ccc ClientCredentialsConfig) MultiTenantServicePrincipalToken() (*adal.MultiTenantServicePrincipalToken, error) {
|
||||
oauthConfig, err := adal.NewMultiTenantOAuthConfig(ccc.AADEndpoint, ccc.TenantID, ccc.AuxTenants, adal.OAuthOptions{})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from client credentials: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
return adal.NewMultiTenantServicePrincipalToken(oauthConfig, ccc.ClientID, ccc.ClientSecret, ccc.Resource)
|
||||
}
|
||||
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
// Authorizer gets the authorizer from client credentials.
|
||||
func (ccc ClientCredentialsConfig) Authorizer() (autorest.Authorizer, error) {
|
||||
if len(ccc.AuxTenants) == 0 {
|
||||
spToken, err := ccc.ServicePrincipalToken()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get SPT from client credentials: %v", err)
|
||||
}
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
}
|
||||
mtSPT, err := ccc.MultiTenantServicePrincipalToken()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get multitenant SPT from client credentials: %v", err)
|
||||
}
|
||||
return autorest.NewMultiTenantServicePrincipalTokenAuthorizer(mtSPT), nil
|
||||
}
|
||||
|
||||
// ClientCertificateConfig provides the options to get a bearer authorizer from a client certificate.
|
||||
@@ -293,26 +603,29 @@ type ClientCertificateConfig struct {
|
||||
Resource string
|
||||
}
|
||||
|
||||
// Authorizer gets an authorizer object from client certificate.
|
||||
func (ccc ClientCertificateConfig) Authorizer() (autorest.Authorizer, error) {
|
||||
// ServicePrincipalToken creates a ServicePrincipalToken from client certificate.
|
||||
func (ccc ClientCertificateConfig) ServicePrincipalToken() (*adal.ServicePrincipalToken, error) {
|
||||
oauthConfig, err := adal.NewOAuthConfig(ccc.AADEndpoint, ccc.TenantID)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
certData, err := ioutil.ReadFile(ccc.CertificatePath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to read the certificate file (%s): %v", ccc.CertificatePath, err)
|
||||
}
|
||||
|
||||
certificate, rsaPrivateKey, err := decodePkcs12(certData, ccc.CertificatePassword)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to decode pkcs12 certificate while creating spt: %v", err)
|
||||
}
|
||||
return adal.NewServicePrincipalTokenFromCertificate(*oauthConfig, ccc.ClientID, certificate, rsaPrivateKey, ccc.Resource)
|
||||
}
|
||||
|
||||
spToken, err := adal.NewServicePrincipalTokenFromCertificate(*oauthConfig, ccc.ClientID, certificate, rsaPrivateKey, ccc.Resource)
|
||||
|
||||
// Authorizer gets an authorizer object from client certificate.
|
||||
func (ccc ClientCertificateConfig) Authorizer() (autorest.Authorizer, error) {
|
||||
spToken, err := ccc.ServicePrincipalToken()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from certificate auth: %v", err)
|
||||
}
|
||||
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
}
|
||||
|
||||
@@ -326,26 +639,30 @@ type DeviceFlowConfig struct {
|
||||
|
||||
// Authorizer gets the authorizer from device flow.
|
||||
func (dfc DeviceFlowConfig) Authorizer() (autorest.Authorizer, error) {
|
||||
oauthClient := &autorest.Client{}
|
||||
spToken, err := dfc.ServicePrincipalToken()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from device flow: %v", err)
|
||||
}
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
}
|
||||
|
||||
// ServicePrincipalToken gets the service principal token from device flow.
|
||||
func (dfc DeviceFlowConfig) ServicePrincipalToken() (*adal.ServicePrincipalToken, error) {
|
||||
oauthConfig, err := adal.NewOAuthConfig(dfc.AADEndpoint, dfc.TenantID)
|
||||
deviceCode, err := adal.InitiateDeviceAuth(oauthClient, *oauthConfig, dfc.ClientID, dfc.AADEndpoint)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
oauthClient := &autorest.Client{}
|
||||
deviceCode, err := adal.InitiateDeviceAuth(oauthClient, *oauthConfig, dfc.ClientID, dfc.Resource)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to start device auth flow: %s", err)
|
||||
}
|
||||
|
||||
log.Println(*deviceCode.Message)
|
||||
|
||||
token, err := adal.WaitForUserCompletion(oauthClient, deviceCode)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to finish device auth flow: %s", err)
|
||||
}
|
||||
|
||||
spToken, err := adal.NewServicePrincipalTokenFromManualToken(*oauthConfig, dfc.ClientID, dfc.Resource, *token)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from device flow: %v", err)
|
||||
}
|
||||
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
return adal.NewServicePrincipalTokenFromManualToken(*oauthConfig, dfc.ClientID, dfc.Resource, *token)
|
||||
}
|
||||
|
||||
func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) {
|
||||
@@ -372,17 +689,21 @@ type UsernamePasswordConfig struct {
|
||||
Resource string
|
||||
}
|
||||
|
||||
// ServicePrincipalToken creates a ServicePrincipalToken from username and password.
|
||||
func (ups UsernamePasswordConfig) ServicePrincipalToken() (*adal.ServicePrincipalToken, error) {
|
||||
oauthConfig, err := adal.NewOAuthConfig(ups.AADEndpoint, ups.TenantID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return adal.NewServicePrincipalTokenFromUsernamePassword(*oauthConfig, ups.ClientID, ups.Username, ups.Password, ups.Resource)
|
||||
}
|
||||
|
||||
// Authorizer gets the authorizer from a username and a password.
|
||||
func (ups UsernamePasswordConfig) Authorizer() (autorest.Authorizer, error) {
|
||||
|
||||
oauthConfig, err := adal.NewOAuthConfig(ups.AADEndpoint, ups.TenantID)
|
||||
|
||||
spToken, err := adal.NewServicePrincipalTokenFromUsernamePassword(*oauthConfig, ups.ClientID, ups.Username, ups.Password, ups.Resource)
|
||||
|
||||
spToken, err := ups.ServicePrincipalToken()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from username and password auth: %v", err)
|
||||
}
|
||||
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
}
|
||||
|
||||
@@ -399,9 +720,17 @@ func (mc MSIConfig) Authorizer() (autorest.Authorizer, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
spToken, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, mc.Resource)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from MSI: %v", err)
|
||||
var spToken *adal.ServicePrincipalToken
|
||||
if mc.ClientID == "" {
|
||||
spToken, err = adal.NewServicePrincipalTokenFromMSI(msiEndpoint, mc.Resource)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from MSI: %v", err)
|
||||
}
|
||||
} else {
|
||||
spToken, err = adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, mc.Resource, mc.ClientID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get oauth token from MSI for user assigned identity: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return autorest.NewBearerAuthorizer(spToken), nil
|
||||
|
||||
75
vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
generated
vendored
75
vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
generated
vendored
@@ -44,11 +44,12 @@ const (
|
||||
// ServiceError encapsulates the error response from an Azure service.
|
||||
// It adhears to the OData v4 specification for error responses.
|
||||
type ServiceError struct {
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Target *string `json:"target"`
|
||||
Details []map[string]interface{} `json:"details"`
|
||||
InnerError map[string]interface{} `json:"innererror"`
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Target *string `json:"target"`
|
||||
Details []map[string]interface{} `json:"details"`
|
||||
InnerError map[string]interface{} `json:"innererror"`
|
||||
AdditionalInfo []map[string]interface{} `json:"additionalInfo"`
|
||||
}
|
||||
|
||||
func (se ServiceError) Error() string {
|
||||
@@ -74,6 +75,14 @@ func (se ServiceError) Error() string {
|
||||
result += fmt.Sprintf(" InnerError=%v", string(d))
|
||||
}
|
||||
|
||||
if se.AdditionalInfo != nil {
|
||||
d, err := json.Marshal(se.AdditionalInfo)
|
||||
if err != nil {
|
||||
result += fmt.Sprintf(" AdditionalInfo=%v", se.AdditionalInfo)
|
||||
}
|
||||
result += fmt.Sprintf(" AdditionalInfo=%v", string(d))
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -86,44 +95,47 @@ func (se *ServiceError) UnmarshalJSON(b []byte) error {
|
||||
// http://docs.oasis-open.org/odata/odata-json-format/v4.0/os/odata-json-format-v4.0-os.html#_Toc372793091
|
||||
|
||||
type serviceError1 struct {
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Target *string `json:"target"`
|
||||
Details []map[string]interface{} `json:"details"`
|
||||
InnerError map[string]interface{} `json:"innererror"`
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Target *string `json:"target"`
|
||||
Details []map[string]interface{} `json:"details"`
|
||||
InnerError map[string]interface{} `json:"innererror"`
|
||||
AdditionalInfo []map[string]interface{} `json:"additionalInfo"`
|
||||
}
|
||||
|
||||
type serviceError2 struct {
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Target *string `json:"target"`
|
||||
Details map[string]interface{} `json:"details"`
|
||||
InnerError map[string]interface{} `json:"innererror"`
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Target *string `json:"target"`
|
||||
Details map[string]interface{} `json:"details"`
|
||||
InnerError map[string]interface{} `json:"innererror"`
|
||||
AdditionalInfo []map[string]interface{} `json:"additionalInfo"`
|
||||
}
|
||||
|
||||
se1 := serviceError1{}
|
||||
err := json.Unmarshal(b, &se1)
|
||||
if err == nil {
|
||||
se.populate(se1.Code, se1.Message, se1.Target, se1.Details, se1.InnerError)
|
||||
se.populate(se1.Code, se1.Message, se1.Target, se1.Details, se1.InnerError, se1.AdditionalInfo)
|
||||
return nil
|
||||
}
|
||||
|
||||
se2 := serviceError2{}
|
||||
err = json.Unmarshal(b, &se2)
|
||||
if err == nil {
|
||||
se.populate(se2.Code, se2.Message, se2.Target, nil, se2.InnerError)
|
||||
se.populate(se2.Code, se2.Message, se2.Target, nil, se2.InnerError, se2.AdditionalInfo)
|
||||
se.Details = append(se.Details, se2.Details)
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (se *ServiceError) populate(code, message string, target *string, details []map[string]interface{}, inner map[string]interface{}) {
|
||||
func (se *ServiceError) populate(code, message string, target *string, details []map[string]interface{}, inner map[string]interface{}, additional []map[string]interface{}) {
|
||||
se.Code = code
|
||||
se.Message = message
|
||||
se.Target = target
|
||||
se.Details = details
|
||||
se.InnerError = inner
|
||||
se.AdditionalInfo = additional
|
||||
}
|
||||
|
||||
// RequestError describes an error response returned by Azure service.
|
||||
@@ -279,16 +291,29 @@ func WithErrorUnlessStatusCode(codes ...int) autorest.RespondDecorator {
|
||||
resp.Body = ioutil.NopCloser(&b)
|
||||
if decodeErr != nil {
|
||||
return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), decodeErr)
|
||||
} else if e.ServiceError == nil {
|
||||
}
|
||||
if e.ServiceError == nil {
|
||||
// Check if error is unwrapped ServiceError
|
||||
if err := json.Unmarshal(b.Bytes(), &e.ServiceError); err != nil || e.ServiceError.Message == "" {
|
||||
e.ServiceError = &ServiceError{
|
||||
Code: "Unknown",
|
||||
Message: "Unknown service error",
|
||||
}
|
||||
if err := json.Unmarshal(b.Bytes(), &e.ServiceError); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if e.ServiceError.Message == "" {
|
||||
// if we're here it means the returned error wasn't OData v4 compliant.
|
||||
// try to unmarshal the body as raw JSON in hopes of getting something.
|
||||
rawBody := map[string]interface{}{}
|
||||
if err := json.Unmarshal(b.Bytes(), &rawBody); err != nil {
|
||||
return err
|
||||
}
|
||||
e.ServiceError = &ServiceError{
|
||||
Code: "Unknown",
|
||||
Message: "Unknown service error",
|
||||
}
|
||||
if len(rawBody) > 0 {
|
||||
e.ServiceError.Details = []map[string]interface{}{rawBody}
|
||||
}
|
||||
}
|
||||
e.Response = resp
|
||||
e.RequestID = ExtractRequestID(resp)
|
||||
if e.StatusCode == nil {
|
||||
e.StatusCode = resp.StatusCode
|
||||
|
||||
79
vendor/github.com/Azure/go-autorest/autorest/azure/cli/profile.go
generated
vendored
Normal file
79
vendor/github.com/Azure/go-autorest/autorest/azure/cli/profile.go
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
package cli
|
||||
|
||||
// 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 (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/dimchansky/utfbom"
|
||||
"github.com/mitchellh/go-homedir"
|
||||
)
|
||||
|
||||
// Profile represents a Profile from the Azure CLI
|
||||
type Profile struct {
|
||||
InstallationID string `json:"installationId"`
|
||||
Subscriptions []Subscription `json:"subscriptions"`
|
||||
}
|
||||
|
||||
// Subscription represents a Subscription from the Azure CLI
|
||||
type Subscription struct {
|
||||
EnvironmentName string `json:"environmentName"`
|
||||
ID string `json:"id"`
|
||||
IsDefault bool `json:"isDefault"`
|
||||
Name string `json:"name"`
|
||||
State string `json:"state"`
|
||||
TenantID string `json:"tenantId"`
|
||||
User *User `json:"user"`
|
||||
}
|
||||
|
||||
// User represents a User from the Azure CLI
|
||||
type User struct {
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
}
|
||||
|
||||
const azureProfileJSON = "azureProfile.json"
|
||||
|
||||
// ProfilePath returns the path where the Azure Profile is stored from the Azure CLI
|
||||
func ProfilePath() (string, error) {
|
||||
if cfgDir := os.Getenv("AZURE_CONFIG_DIR"); cfgDir != "" {
|
||||
return filepath.Join(cfgDir, azureProfileJSON), nil
|
||||
}
|
||||
return homedir.Expand("~/.azure/" + azureProfileJSON)
|
||||
}
|
||||
|
||||
// LoadProfile restores a Profile object from a file located at 'path'.
|
||||
func LoadProfile(path string) (result Profile, err error) {
|
||||
var contents []byte
|
||||
contents, err = ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("failed to open file (%s) while loading token: %v", path, err)
|
||||
return
|
||||
}
|
||||
reader := utfbom.SkipOnly(bytes.NewReader(contents))
|
||||
|
||||
dec := json.NewDecoder(reader)
|
||||
if err = dec.Decode(&result); err != nil {
|
||||
err = fmt.Errorf("failed to decode contents of file (%s) into a Profile representation: %v", path, err)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
170
vendor/github.com/Azure/go-autorest/autorest/azure/cli/token.go
generated
vendored
Normal file
170
vendor/github.com/Azure/go-autorest/autorest/azure/cli/token.go
generated
vendored
Normal file
@@ -0,0 +1,170 @@
|
||||
package cli
|
||||
|
||||
// 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 (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/go-autorest/autorest/adal"
|
||||
"github.com/Azure/go-autorest/autorest/date"
|
||||
"github.com/mitchellh/go-homedir"
|
||||
)
|
||||
|
||||
// Token represents an AccessToken from the Azure CLI
|
||||
type Token struct {
|
||||
AccessToken string `json:"accessToken"`
|
||||
Authority string `json:"_authority"`
|
||||
ClientID string `json:"_clientId"`
|
||||
ExpiresOn string `json:"expiresOn"`
|
||||
IdentityProvider string `json:"identityProvider"`
|
||||
IsMRRT bool `json:"isMRRT"`
|
||||
RefreshToken string `json:"refreshToken"`
|
||||
Resource string `json:"resource"`
|
||||
TokenType string `json:"tokenType"`
|
||||
UserID string `json:"userId"`
|
||||
}
|
||||
|
||||
// ToADALToken converts an Azure CLI `Token`` to an `adal.Token``
|
||||
func (t Token) ToADALToken() (converted adal.Token, err error) {
|
||||
tokenExpirationDate, err := ParseExpirationDate(t.ExpiresOn)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error parsing Token Expiration Date %q: %+v", t.ExpiresOn, err)
|
||||
return
|
||||
}
|
||||
|
||||
difference := tokenExpirationDate.Sub(date.UnixEpoch())
|
||||
|
||||
converted = adal.Token{
|
||||
AccessToken: t.AccessToken,
|
||||
Type: t.TokenType,
|
||||
ExpiresIn: "3600",
|
||||
ExpiresOn: json.Number(strconv.Itoa(int(difference.Seconds()))),
|
||||
RefreshToken: t.RefreshToken,
|
||||
Resource: t.Resource,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// AccessTokensPath returns the path where access tokens are stored from the Azure CLI
|
||||
// TODO(#199): add unit test.
|
||||
func AccessTokensPath() (string, error) {
|
||||
// Azure-CLI allows user to customize the path of access tokens thorugh environment variable.
|
||||
var accessTokenPath = os.Getenv("AZURE_ACCESS_TOKEN_FILE")
|
||||
var err error
|
||||
|
||||
// Fallback logic to default path on non-cloud-shell environment.
|
||||
// TODO(#200): remove the dependency on hard-coding path.
|
||||
if accessTokenPath == "" {
|
||||
accessTokenPath, err = homedir.Expand("~/.azure/accessTokens.json")
|
||||
}
|
||||
|
||||
return accessTokenPath, err
|
||||
}
|
||||
|
||||
// ParseExpirationDate parses either a Azure CLI or CloudShell date into a time object
|
||||
func ParseExpirationDate(input string) (*time.Time, error) {
|
||||
// CloudShell (and potentially the Azure CLI in future)
|
||||
expirationDate, cloudShellErr := time.Parse(time.RFC3339, input)
|
||||
if cloudShellErr != nil {
|
||||
// Azure CLI (Python) e.g. 2017-08-31 19:48:57.998857 (plus the local timezone)
|
||||
const cliFormat = "2006-01-02 15:04:05.999999"
|
||||
expirationDate, cliErr := time.ParseInLocation(cliFormat, input, time.Local)
|
||||
if cliErr == nil {
|
||||
return &expirationDate, nil
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("Error parsing expiration date %q.\n\nCloudShell Error: \n%+v\n\nCLI Error:\n%+v", input, cloudShellErr, cliErr)
|
||||
}
|
||||
|
||||
return &expirationDate, nil
|
||||
}
|
||||
|
||||
// LoadTokens restores a set of Token objects from a file located at 'path'.
|
||||
func LoadTokens(path string) ([]Token, error) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to open file (%s) while loading token: %v", path, err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
var tokens []Token
|
||||
|
||||
dec := json.NewDecoder(file)
|
||||
if err = dec.Decode(&tokens); err != nil {
|
||||
return nil, fmt.Errorf("failed to decode contents of file (%s) into a `cli.Token` representation: %v", path, err)
|
||||
}
|
||||
|
||||
return tokens, nil
|
||||
}
|
||||
|
||||
// GetTokenFromCLI gets a token using Azure CLI 2.0 for local development scenarios.
|
||||
func GetTokenFromCLI(resource string) (*Token, error) {
|
||||
// This is the path that a developer can set to tell this class what the install path for Azure CLI is.
|
||||
const azureCLIPath = "AzureCLIPath"
|
||||
|
||||
// The default install paths are used to find Azure CLI. This is for security, so that any path in the calling program's Path environment is not used to execute Azure CLI.
|
||||
azureCLIDefaultPathWindows := fmt.Sprintf("%s\\Microsoft SDKs\\Azure\\CLI2\\wbin; %s\\Microsoft SDKs\\Azure\\CLI2\\wbin", os.Getenv("ProgramFiles(x86)"), os.Getenv("ProgramFiles"))
|
||||
|
||||
// Default path for non-Windows.
|
||||
const azureCLIDefaultPath = "/bin:/sbin:/usr/bin:/usr/local/bin"
|
||||
|
||||
// Validate resource, since it gets sent as a command line argument to Azure CLI
|
||||
const invalidResourceErrorTemplate = "Resource %s is not in expected format. Only alphanumeric characters, [dot], [colon], [hyphen], and [forward slash] are allowed."
|
||||
match, err := regexp.MatchString("^[0-9a-zA-Z-.:/]+$", resource)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !match {
|
||||
return nil, fmt.Errorf(invalidResourceErrorTemplate, resource)
|
||||
}
|
||||
|
||||
// Execute Azure CLI to get token
|
||||
var cliCmd *exec.Cmd
|
||||
if runtime.GOOS == "windows" {
|
||||
cliCmd = exec.Command(fmt.Sprintf("%s\\system32\\cmd.exe", os.Getenv("windir")))
|
||||
cliCmd.Env = os.Environ()
|
||||
cliCmd.Env = append(cliCmd.Env, fmt.Sprintf("PATH=%s;%s", os.Getenv(azureCLIPath), azureCLIDefaultPathWindows))
|
||||
cliCmd.Args = append(cliCmd.Args, "/c", "az")
|
||||
} else {
|
||||
cliCmd = exec.Command("az")
|
||||
cliCmd.Env = os.Environ()
|
||||
cliCmd.Env = append(cliCmd.Env, fmt.Sprintf("PATH=%s:%s", os.Getenv(azureCLIPath), azureCLIDefaultPath))
|
||||
}
|
||||
cliCmd.Args = append(cliCmd.Args, "account", "get-access-token", "-o", "json", "--resource", resource)
|
||||
|
||||
var stderr bytes.Buffer
|
||||
cliCmd.Stderr = &stderr
|
||||
|
||||
output, err := cliCmd.Output()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Invoking Azure CLI failed with the following error: %s", stderr.String())
|
||||
}
|
||||
|
||||
tokenResponse := Token{}
|
||||
err = json.Unmarshal(output, &tokenResponse)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &tokenResponse, err
|
||||
}
|
||||
105
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
105
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
@@ -22,9 +22,14 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// EnvironmentFilepathName captures the name of the environment variable containing the path to the file
|
||||
// to be used while populating the Azure Environment.
|
||||
const EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH"
|
||||
const (
|
||||
// EnvironmentFilepathName captures the name of the environment variable containing the path to the file
|
||||
// to be used while populating the Azure Environment.
|
||||
EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH"
|
||||
|
||||
// NotAvailable is used for endpoints and resource IDs that are not available for a given cloud.
|
||||
NotAvailable = "N/A"
|
||||
)
|
||||
|
||||
var environments = map[string]Environment{
|
||||
"AZURECHINACLOUD": ChinaCloud,
|
||||
@@ -33,28 +38,40 @@ var environments = map[string]Environment{
|
||||
"AZUREUSGOVERNMENTCLOUD": USGovernmentCloud,
|
||||
}
|
||||
|
||||
// ResourceIdentifier contains a set of Azure resource IDs.
|
||||
type ResourceIdentifier struct {
|
||||
Graph string `json:"graph"`
|
||||
KeyVault string `json:"keyVault"`
|
||||
Datalake string `json:"datalake"`
|
||||
Batch string `json:"batch"`
|
||||
OperationalInsights string `json:"operationalInsights"`
|
||||
Storage string `json:"storage"`
|
||||
}
|
||||
|
||||
// Environment represents a set of endpoints for each of Azure's Clouds.
|
||||
type Environment struct {
|
||||
Name string `json:"name"`
|
||||
ManagementPortalURL string `json:"managementPortalURL"`
|
||||
PublishSettingsURL string `json:"publishSettingsURL"`
|
||||
ServiceManagementEndpoint string `json:"serviceManagementEndpoint"`
|
||||
ResourceManagerEndpoint string `json:"resourceManagerEndpoint"`
|
||||
ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"`
|
||||
GalleryEndpoint string `json:"galleryEndpoint"`
|
||||
KeyVaultEndpoint string `json:"keyVaultEndpoint"`
|
||||
GraphEndpoint string `json:"graphEndpoint"`
|
||||
ServiceBusEndpoint string `json:"serviceBusEndpoint"`
|
||||
BatchManagementEndpoint string `json:"batchManagementEndpoint"`
|
||||
StorageEndpointSuffix string `json:"storageEndpointSuffix"`
|
||||
SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
|
||||
TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
|
||||
KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
|
||||
ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"`
|
||||
ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"`
|
||||
ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
|
||||
ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"`
|
||||
TokenAudience string `json:"tokenAudience"`
|
||||
Name string `json:"name"`
|
||||
ManagementPortalURL string `json:"managementPortalURL"`
|
||||
PublishSettingsURL string `json:"publishSettingsURL"`
|
||||
ServiceManagementEndpoint string `json:"serviceManagementEndpoint"`
|
||||
ResourceManagerEndpoint string `json:"resourceManagerEndpoint"`
|
||||
ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"`
|
||||
GalleryEndpoint string `json:"galleryEndpoint"`
|
||||
KeyVaultEndpoint string `json:"keyVaultEndpoint"`
|
||||
GraphEndpoint string `json:"graphEndpoint"`
|
||||
ServiceBusEndpoint string `json:"serviceBusEndpoint"`
|
||||
BatchManagementEndpoint string `json:"batchManagementEndpoint"`
|
||||
StorageEndpointSuffix string `json:"storageEndpointSuffix"`
|
||||
SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
|
||||
TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
|
||||
KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
|
||||
ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"`
|
||||
ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"`
|
||||
ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
|
||||
ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"`
|
||||
CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"`
|
||||
TokenAudience string `json:"tokenAudience"`
|
||||
ResourceIdentifiers ResourceIdentifier `json:"resourceIdentifiers"`
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -79,7 +96,16 @@ var (
|
||||
ServiceManagementVMDNSSuffix: "cloudapp.net",
|
||||
ResourceManagerVMDNSSuffix: "cloudapp.azure.com",
|
||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
||||
CosmosDBDNSSuffix: "documents.azure.com",
|
||||
TokenAudience: "https://management.azure.com/",
|
||||
ResourceIdentifiers: ResourceIdentifier{
|
||||
Graph: "https://graph.windows.net/",
|
||||
KeyVault: "https://vault.azure.net",
|
||||
Datalake: "https://datalake.azure.net/",
|
||||
Batch: "https://batch.core.windows.net/",
|
||||
OperationalInsights: "https://api.loganalytics.io",
|
||||
Storage: "https://storage.azure.com/",
|
||||
},
|
||||
}
|
||||
|
||||
// USGovernmentCloud is the cloud environment for the US Government
|
||||
@@ -102,8 +128,17 @@ var (
|
||||
ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net",
|
||||
ServiceManagementVMDNSSuffix: "usgovcloudapp.net",
|
||||
ResourceManagerVMDNSSuffix: "cloudapp.windowsazure.us",
|
||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
||||
ContainerRegistryDNSSuffix: "azurecr.us",
|
||||
CosmosDBDNSSuffix: "documents.azure.us",
|
||||
TokenAudience: "https://management.usgovcloudapi.net/",
|
||||
ResourceIdentifiers: ResourceIdentifier{
|
||||
Graph: "https://graph.windows.net/",
|
||||
KeyVault: "https://vault.usgovcloudapi.net",
|
||||
Datalake: NotAvailable,
|
||||
Batch: "https://batch.core.usgovcloudapi.net/",
|
||||
OperationalInsights: "https://api.loganalytics.us",
|
||||
Storage: "https://storage.azure.com/",
|
||||
},
|
||||
}
|
||||
|
||||
// ChinaCloud is the cloud environment operated in China
|
||||
@@ -126,8 +161,17 @@ var (
|
||||
ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn",
|
||||
ServiceManagementVMDNSSuffix: "chinacloudapp.cn",
|
||||
ResourceManagerVMDNSSuffix: "cloudapp.azure.cn",
|
||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
||||
ContainerRegistryDNSSuffix: "azurecr.cn",
|
||||
CosmosDBDNSSuffix: "documents.azure.cn",
|
||||
TokenAudience: "https://management.chinacloudapi.cn/",
|
||||
ResourceIdentifiers: ResourceIdentifier{
|
||||
Graph: "https://graph.chinacloudapi.cn/",
|
||||
KeyVault: "https://vault.azure.cn",
|
||||
Datalake: NotAvailable,
|
||||
Batch: "https://batch.chinacloudapi.cn/",
|
||||
OperationalInsights: NotAvailable,
|
||||
Storage: "https://storage.azure.com/",
|
||||
},
|
||||
}
|
||||
|
||||
// GermanCloud is the cloud environment operated in Germany
|
||||
@@ -150,8 +194,17 @@ var (
|
||||
ServiceBusEndpointSuffix: "servicebus.cloudapi.de",
|
||||
ServiceManagementVMDNSSuffix: "azurecloudapp.de",
|
||||
ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de",
|
||||
ContainerRegistryDNSSuffix: "azurecr.io",
|
||||
ContainerRegistryDNSSuffix: NotAvailable,
|
||||
CosmosDBDNSSuffix: "documents.microsoftazure.de",
|
||||
TokenAudience: "https://management.microsoftazure.de/",
|
||||
ResourceIdentifiers: ResourceIdentifier{
|
||||
Graph: "https://graph.cloudapi.de/",
|
||||
KeyVault: "https://vault.microsoftazure.de",
|
||||
Datalake: NotAvailable,
|
||||
Batch: "https://batch.cloudapi.de/",
|
||||
OperationalInsights: NotAvailable,
|
||||
Storage: "https://storage.azure.com/",
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
8
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
8
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
@@ -64,7 +64,7 @@ func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator {
|
||||
}
|
||||
}
|
||||
}
|
||||
return resp, fmt.Errorf("failed request: %s", err)
|
||||
return resp, err
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -140,8 +140,8 @@ func register(client autorest.Client, originalReq *http.Request, re RequestError
|
||||
}
|
||||
|
||||
// poll for registered provisioning state
|
||||
now := time.Now()
|
||||
for err == nil && time.Since(now) < client.PollingDuration {
|
||||
registrationStartTime := time.Now()
|
||||
for err == nil && (client.PollingDuration == 0 || (client.PollingDuration != 0 && time.Since(registrationStartTime) < client.PollingDuration)) {
|
||||
// taken from the resources SDK
|
||||
// https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L45
|
||||
preparer := autorest.CreatePreparer(
|
||||
@@ -183,7 +183,7 @@ func register(client autorest.Client, originalReq *http.Request, re RequestError
|
||||
return originalReq.Context().Err()
|
||||
}
|
||||
}
|
||||
if !(time.Since(now) < client.PollingDuration) {
|
||||
if client.PollingDuration != 0 && !(time.Since(registrationStartTime) < client.PollingDuration) {
|
||||
return errors.New("polling for resource provider registration has exceeded the polling duration")
|
||||
}
|
||||
return err
|
||||
|
||||
92
vendor/github.com/Azure/go-autorest/autorest/client.go
generated
vendored
92
vendor/github.com/Azure/go-autorest/autorest/client.go
generated
vendored
@@ -16,14 +16,18 @@ package autorest
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/http/cookiejar"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/go-autorest/logger"
|
||||
"github.com/Azure/go-autorest/tracing"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -41,15 +45,6 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
// defaultUserAgent builds a string containing the Go version, system archityecture and OS,
|
||||
// and the go-autorest version.
|
||||
defaultUserAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s",
|
||||
runtime.Version(),
|
||||
runtime.GOARCH,
|
||||
runtime.GOOS,
|
||||
Version(),
|
||||
)
|
||||
|
||||
// StatusCodesForRetry are a defined group of status code for which the client will retry
|
||||
StatusCodesForRetry = []int{
|
||||
http.StatusRequestTimeout, // 408
|
||||
@@ -78,6 +73,22 @@ type Response struct {
|
||||
*http.Response `json:"-"`
|
||||
}
|
||||
|
||||
// IsHTTPStatus returns true if the returned HTTP status code matches the provided status code.
|
||||
// If there was no response (i.e. the underlying http.Response is nil) the return value is false.
|
||||
func (r Response) IsHTTPStatus(statusCode int) bool {
|
||||
if r.Response == nil {
|
||||
return false
|
||||
}
|
||||
return r.Response.StatusCode == statusCode
|
||||
}
|
||||
|
||||
// HasHTTPStatus returns true if the returned HTTP status code matches one of the provided status codes.
|
||||
// If there was no response (i.e. the underlying http.Response is nil) or not status codes are provided
|
||||
// the return value is false.
|
||||
func (r Response) HasHTTPStatus(statusCodes ...int) bool {
|
||||
return ResponseHasStatusCode(r.Response, statusCodes...)
|
||||
}
|
||||
|
||||
// LoggingInspector implements request and response inspectors that log the full request and
|
||||
// response to a supplied log.
|
||||
type LoggingInspector struct {
|
||||
@@ -153,6 +164,7 @@ type Client struct {
|
||||
PollingDelay time.Duration
|
||||
|
||||
// PollingDuration sets the maximum polling time after which an error is returned.
|
||||
// Setting this to zero will use the provided context to control the duration.
|
||||
PollingDuration time.Duration
|
||||
|
||||
// RetryAttempts sets the default number of retry attempts for client.
|
||||
@@ -174,14 +186,32 @@ type Client struct {
|
||||
// NewClientWithUserAgent returns an instance of a Client with the UserAgent set to the passed
|
||||
// string.
|
||||
func NewClientWithUserAgent(ua string) Client {
|
||||
return newClient(ua, tls.RenegotiateNever)
|
||||
}
|
||||
|
||||
// ClientOptions contains various Client configuration options.
|
||||
type ClientOptions struct {
|
||||
// UserAgent is an optional user-agent string to append to the default user agent.
|
||||
UserAgent string
|
||||
|
||||
// Renegotiation is an optional setting to control client-side TLS renegotiation.
|
||||
Renegotiation tls.RenegotiationSupport
|
||||
}
|
||||
|
||||
// NewClientWithOptions returns an instance of a Client with the specified values.
|
||||
func NewClientWithOptions(options ClientOptions) Client {
|
||||
return newClient(options.UserAgent, options.Renegotiation)
|
||||
}
|
||||
|
||||
func newClient(ua string, renegotiation tls.RenegotiationSupport) Client {
|
||||
c := Client{
|
||||
PollingDelay: DefaultPollingDelay,
|
||||
PollingDuration: DefaultPollingDuration,
|
||||
RetryAttempts: DefaultRetryAttempts,
|
||||
RetryDuration: DefaultRetryDuration,
|
||||
UserAgent: defaultUserAgent,
|
||||
UserAgent: UserAgent(),
|
||||
}
|
||||
c.Sender = c.sender()
|
||||
c.Sender = c.sender(renegotiation)
|
||||
c.AddToUserAgent(ua)
|
||||
return c
|
||||
}
|
||||
@@ -216,18 +246,48 @@ func (c Client) Do(r *http.Request) (*http.Response, error) {
|
||||
}
|
||||
return resp, NewErrorWithError(err, "autorest/Client", "Do", nil, "Preparing request failed")
|
||||
}
|
||||
|
||||
resp, err := SendWithSender(c.sender(), r)
|
||||
logger.Instance.WriteRequest(r, logger.Filter{
|
||||
Header: func(k string, v []string) (bool, []string) {
|
||||
// remove the auth token from the log
|
||||
if strings.EqualFold(k, "Authorization") || strings.EqualFold(k, "Ocp-Apim-Subscription-Key") {
|
||||
v = []string{"**REDACTED**"}
|
||||
}
|
||||
return true, v
|
||||
},
|
||||
})
|
||||
resp, err := SendWithSender(c.sender(tls.RenegotiateNever), r)
|
||||
logger.Instance.WriteResponse(resp, logger.Filter{})
|
||||
Respond(resp, c.ByInspecting())
|
||||
return resp, err
|
||||
}
|
||||
|
||||
// sender returns the Sender to which to send requests.
|
||||
func (c Client) sender() Sender {
|
||||
func (c Client) sender(renengotiation tls.RenegotiationSupport) Sender {
|
||||
if c.Sender == nil {
|
||||
// Use behaviour compatible with DefaultTransport, but require TLS minimum version.
|
||||
var defaultTransport = http.DefaultTransport.(*http.Transport)
|
||||
transport := tracing.Transport
|
||||
// for non-default values of TLS renegotiation create a new tracing transport.
|
||||
// updating tracing.Transport affects all clients which is not what we want.
|
||||
if renengotiation != tls.RenegotiateNever {
|
||||
transport = tracing.NewTransport()
|
||||
}
|
||||
transport.Base = &http.Transport{
|
||||
Proxy: defaultTransport.Proxy,
|
||||
DialContext: defaultTransport.DialContext,
|
||||
MaxIdleConns: defaultTransport.MaxIdleConns,
|
||||
IdleConnTimeout: defaultTransport.IdleConnTimeout,
|
||||
TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout,
|
||||
ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout,
|
||||
TLSClientConfig: &tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
Renegotiation: renengotiation,
|
||||
},
|
||||
}
|
||||
j, _ := cookiejar.New(nil)
|
||||
return &http.Client{Jar: j}
|
||||
return &http.Client{Jar: j, Transport: transport}
|
||||
}
|
||||
|
||||
return c.Sender
|
||||
}
|
||||
|
||||
|
||||
74
vendor/github.com/Azure/go-autorest/autorest/preparer.go
generated
vendored
74
vendor/github.com/Azure/go-autorest/autorest/preparer.go
generated
vendored
@@ -16,7 +16,9 @@ package autorest
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@@ -31,11 +33,33 @@ const (
|
||||
mimeTypeOctetStream = "application/octet-stream"
|
||||
mimeTypeFormPost = "application/x-www-form-urlencoded"
|
||||
|
||||
headerAuthorization = "Authorization"
|
||||
headerContentType = "Content-Type"
|
||||
headerUserAgent = "User-Agent"
|
||||
headerAuthorization = "Authorization"
|
||||
headerAuxAuthorization = "x-ms-authorization-auxiliary"
|
||||
headerContentType = "Content-Type"
|
||||
headerUserAgent = "User-Agent"
|
||||
)
|
||||
|
||||
// used as a key type in context.WithValue()
|
||||
type ctxPrepareDecorators struct{}
|
||||
|
||||
// WithPrepareDecorators adds the specified PrepareDecorators to the provided context.
|
||||
// If no PrepareDecorators are provided the context is unchanged.
|
||||
func WithPrepareDecorators(ctx context.Context, prepareDecorator []PrepareDecorator) context.Context {
|
||||
if len(prepareDecorator) == 0 {
|
||||
return ctx
|
||||
}
|
||||
return context.WithValue(ctx, ctxPrepareDecorators{}, prepareDecorator)
|
||||
}
|
||||
|
||||
// GetPrepareDecorators returns the PrepareDecorators in the provided context or the provided default PrepareDecorators.
|
||||
func GetPrepareDecorators(ctx context.Context, defaultPrepareDecorators ...PrepareDecorator) []PrepareDecorator {
|
||||
inCtx := ctx.Value(ctxPrepareDecorators{})
|
||||
if pd, ok := inCtx.([]PrepareDecorator); ok {
|
||||
return pd
|
||||
}
|
||||
return defaultPrepareDecorators
|
||||
}
|
||||
|
||||
// Preparer is the interface that wraps the Prepare method.
|
||||
//
|
||||
// Prepare accepts and possibly modifies an http.Request (e.g., adding Headers). Implementations
|
||||
@@ -190,6 +214,9 @@ func AsGet() PrepareDecorator { return WithMethod("GET") }
|
||||
// AsHead returns a PrepareDecorator that sets the HTTP method to HEAD.
|
||||
func AsHead() PrepareDecorator { return WithMethod("HEAD") }
|
||||
|
||||
// AsMerge returns a PrepareDecorator that sets the HTTP method to MERGE.
|
||||
func AsMerge() PrepareDecorator { return WithMethod("MERGE") }
|
||||
|
||||
// AsOptions returns a PrepareDecorator that sets the HTTP method to OPTIONS.
|
||||
func AsOptions() PrepareDecorator { return WithMethod("OPTIONS") }
|
||||
|
||||
@@ -225,6 +252,25 @@ func WithBaseURL(baseURL string) PrepareDecorator {
|
||||
}
|
||||
}
|
||||
|
||||
// WithBytes returns a PrepareDecorator that takes a list of bytes
|
||||
// which passes the bytes directly to the body
|
||||
func WithBytes(input *[]byte) PrepareDecorator {
|
||||
return func(p Preparer) Preparer {
|
||||
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||
r, err := p.Prepare(r)
|
||||
if err == nil {
|
||||
if input == nil {
|
||||
return r, fmt.Errorf("Input Bytes was nil")
|
||||
}
|
||||
|
||||
r.ContentLength = int64(len(*input))
|
||||
r.Body = ioutil.NopCloser(bytes.NewReader(*input))
|
||||
}
|
||||
return r, err
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// WithCustomBaseURL returns a PrepareDecorator that replaces brace-enclosed keys within the
|
||||
// request base URL (i.e., http.Request.URL) with the corresponding values from the passed map.
|
||||
func WithCustomBaseURL(baseURL string, urlParameters map[string]interface{}) PrepareDecorator {
|
||||
@@ -377,6 +423,28 @@ func WithJSON(v interface{}) PrepareDecorator {
|
||||
}
|
||||
}
|
||||
|
||||
// WithXML returns a PrepareDecorator that encodes the data passed as XML into the body of the
|
||||
// request and sets the Content-Length header.
|
||||
func WithXML(v interface{}) PrepareDecorator {
|
||||
return func(p Preparer) Preparer {
|
||||
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||
r, err := p.Prepare(r)
|
||||
if err == nil {
|
||||
b, err := xml.Marshal(v)
|
||||
if err == nil {
|
||||
// we have to tack on an XML header
|
||||
withHeader := xml.Header + string(b)
|
||||
bytesWithHeader := []byte(withHeader)
|
||||
|
||||
r.ContentLength = int64(len(bytesWithHeader))
|
||||
r.Body = ioutil.NopCloser(bytes.NewReader(bytesWithHeader))
|
||||
}
|
||||
}
|
||||
return r, err
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// WithPath returns a PrepareDecorator that adds the supplied path to the request URL. If the path
|
||||
// is absolute (that is, it begins with a "/"), it replaces the existing path.
|
||||
func WithPath(path string) PrepareDecorator {
|
||||
|
||||
19
vendor/github.com/Azure/go-autorest/autorest/responder.go
generated
vendored
19
vendor/github.com/Azure/go-autorest/autorest/responder.go
generated
vendored
@@ -153,6 +153,25 @@ func ByClosingIfError() RespondDecorator {
|
||||
}
|
||||
}
|
||||
|
||||
// ByUnmarshallingBytes returns a RespondDecorator that copies the Bytes returned in the
|
||||
// response Body into the value pointed to by v.
|
||||
func ByUnmarshallingBytes(v *[]byte) RespondDecorator {
|
||||
return func(r Responder) Responder {
|
||||
return ResponderFunc(func(resp *http.Response) error {
|
||||
err := r.Respond(resp)
|
||||
if err == nil {
|
||||
bytes, errInner := ioutil.ReadAll(resp.Body)
|
||||
if errInner != nil {
|
||||
err = fmt.Errorf("Error occurred reading http.Response#Body - Error = '%v'", errInner)
|
||||
} else {
|
||||
*v = bytes
|
||||
}
|
||||
}
|
||||
return err
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// ByUnmarshallingJSON returns a RespondDecorator that decodes a JSON document returned in the
|
||||
// response Body into the value pointed to by v.
|
||||
func ByUnmarshallingJSON(v interface{}) RespondDecorator {
|
||||
|
||||
137
vendor/github.com/Azure/go-autorest/autorest/sender.go
generated
vendored
137
vendor/github.com/Azure/go-autorest/autorest/sender.go
generated
vendored
@@ -15,14 +15,38 @@ package autorest
|
||||
// limitations under the License.
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/go-autorest/tracing"
|
||||
)
|
||||
|
||||
// used as a key type in context.WithValue()
|
||||
type ctxSendDecorators struct{}
|
||||
|
||||
// WithSendDecorators adds the specified SendDecorators to the provided context.
|
||||
// If no SendDecorators are provided the context is unchanged.
|
||||
func WithSendDecorators(ctx context.Context, sendDecorator []SendDecorator) context.Context {
|
||||
if len(sendDecorator) == 0 {
|
||||
return ctx
|
||||
}
|
||||
return context.WithValue(ctx, ctxSendDecorators{}, sendDecorator)
|
||||
}
|
||||
|
||||
// GetSendDecorators returns the SendDecorators in the provided context or the provided default SendDecorators.
|
||||
func GetSendDecorators(ctx context.Context, defaultSendDecorators ...SendDecorator) []SendDecorator {
|
||||
inCtx := ctx.Value(ctxSendDecorators{})
|
||||
if sd, ok := inCtx.([]SendDecorator); ok {
|
||||
return sd
|
||||
}
|
||||
return defaultSendDecorators
|
||||
}
|
||||
|
||||
// Sender is the interface that wraps the Do method to send HTTP requests.
|
||||
//
|
||||
// The standard http.Client conforms to this interface.
|
||||
@@ -38,7 +62,7 @@ func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) {
|
||||
return sf(r)
|
||||
}
|
||||
|
||||
// SendDecorator takes and possibily decorates, by wrapping, a Sender. Decorators may affect the
|
||||
// SendDecorator takes and possibly decorates, by wrapping, a Sender. Decorators may affect the
|
||||
// http.Request and pass it along or, first, pass the http.Request along then react to the
|
||||
// http.Response result.
|
||||
type SendDecorator func(Sender) Sender
|
||||
@@ -68,7 +92,7 @@ func DecorateSender(s Sender, decorators ...SendDecorator) Sender {
|
||||
//
|
||||
// Send will not poll or retry requests.
|
||||
func Send(r *http.Request, decorators ...SendDecorator) (*http.Response, error) {
|
||||
return SendWithSender(&http.Client{}, r, decorators...)
|
||||
return SendWithSender(&http.Client{Transport: tracing.Transport}, r, decorators...)
|
||||
}
|
||||
|
||||
// SendWithSender sends the passed http.Request, through the provided Sender, returning the
|
||||
@@ -209,50 +233,77 @@ func DoRetryForAttempts(attempts int, backoff time.Duration) SendDecorator {
|
||||
|
||||
// DoRetryForStatusCodes returns a SendDecorator that retries for specified statusCodes for up to the specified
|
||||
// number of attempts, exponentially backing off between requests using the supplied backoff
|
||||
// time.Duration (which may be zero). Retrying may be canceled by closing the optional channel on
|
||||
// the http.Request.
|
||||
// time.Duration (which may be zero). Retrying may be canceled by cancelling the context on the http.Request.
|
||||
// NOTE: Code http.StatusTooManyRequests (429) will *not* be counted against the number of attempts.
|
||||
func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) SendDecorator {
|
||||
return func(s Sender) Sender {
|
||||
return SenderFunc(func(r *http.Request) (resp *http.Response, err error) {
|
||||
rr := NewRetriableRequest(r)
|
||||
// Increment to add the first call (attempts denotes number of retries)
|
||||
attempts++
|
||||
for attempt := 0; attempt < attempts; {
|
||||
err = rr.Prepare()
|
||||
if err != nil {
|
||||
return resp, err
|
||||
}
|
||||
resp, err = s.Do(rr.Request())
|
||||
// we want to retry if err is not nil (e.g. transient network failure). note that for failed authentication
|
||||
// resp and err will both have a value, so in this case we don't want to retry as it will never succeed.
|
||||
if err == nil && !ResponseHasStatusCode(resp, codes...) || IsTokenRefreshError(err) {
|
||||
return resp, err
|
||||
}
|
||||
delayed := DelayWithRetryAfter(resp, r.Context().Done())
|
||||
if !delayed && !DelayForBackoff(backoff, attempt, r.Context().Done()) {
|
||||
return nil, r.Context().Err()
|
||||
}
|
||||
// don't count a 429 against the number of attempts
|
||||
// so that we continue to retry until it succeeds
|
||||
if resp == nil || resp.StatusCode != http.StatusTooManyRequests {
|
||||
attempt++
|
||||
}
|
||||
}
|
||||
return resp, err
|
||||
return SenderFunc(func(r *http.Request) (*http.Response, error) {
|
||||
return doRetryForStatusCodesImpl(s, r, false, attempts, backoff, 0, codes...)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header in
|
||||
// responses with status code 429
|
||||
// DoRetryForStatusCodesWithCap returns a SendDecorator that retries for specified statusCodes for up to the
|
||||
// specified number of attempts, exponentially backing off between requests using the supplied backoff
|
||||
// time.Duration (which may be zero). To cap the maximum possible delay between iterations specify a value greater
|
||||
// than zero for cap. Retrying may be canceled by cancelling the context on the http.Request.
|
||||
func DoRetryForStatusCodesWithCap(attempts int, backoff, cap time.Duration, codes ...int) SendDecorator {
|
||||
return func(s Sender) Sender {
|
||||
return SenderFunc(func(r *http.Request) (*http.Response, error) {
|
||||
return doRetryForStatusCodesImpl(s, r, true, attempts, backoff, cap, codes...)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func doRetryForStatusCodesImpl(s Sender, r *http.Request, count429 bool, attempts int, backoff, cap time.Duration, codes ...int) (resp *http.Response, err error) {
|
||||
rr := NewRetriableRequest(r)
|
||||
// Increment to add the first call (attempts denotes number of retries)
|
||||
for attempt := 0; attempt < attempts+1; {
|
||||
err = rr.Prepare()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
resp, err = s.Do(rr.Request())
|
||||
// if the error isn't temporary don't bother retrying
|
||||
if err != nil && !IsTemporaryNetworkError(err) {
|
||||
return
|
||||
}
|
||||
// we want to retry if err is not nil (e.g. transient network failure). note that for failed authentication
|
||||
// resp and err will both have a value, so in this case we don't want to retry as it will never succeed.
|
||||
if err == nil && !ResponseHasStatusCode(resp, codes...) || IsTokenRefreshError(err) {
|
||||
return resp, err
|
||||
}
|
||||
delayed := DelayWithRetryAfter(resp, r.Context().Done())
|
||||
if !delayed && !DelayForBackoffWithCap(backoff, cap, attempt, r.Context().Done()) {
|
||||
return resp, r.Context().Err()
|
||||
}
|
||||
// when count429 == false don't count a 429 against the number
|
||||
// of attempts so that we continue to retry until it succeeds
|
||||
if count429 || (resp == nil || resp.StatusCode != http.StatusTooManyRequests) {
|
||||
attempt++
|
||||
}
|
||||
}
|
||||
return resp, err
|
||||
}
|
||||
|
||||
// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header.
|
||||
// The value of Retry-After can be either the number of seconds or a date in RFC1123 format.
|
||||
// The function returns true after successfully waiting for the specified duration. If there is
|
||||
// no Retry-After header or the wait is cancelled the return value is false.
|
||||
func DelayWithRetryAfter(resp *http.Response, cancel <-chan struct{}) bool {
|
||||
if resp == nil {
|
||||
return false
|
||||
}
|
||||
retryAfter, _ := strconv.Atoi(resp.Header.Get("Retry-After"))
|
||||
if resp.StatusCode == http.StatusTooManyRequests && retryAfter > 0 {
|
||||
var dur time.Duration
|
||||
ra := resp.Header.Get("Retry-After")
|
||||
if retryAfter, _ := strconv.Atoi(ra); retryAfter > 0 {
|
||||
dur = time.Duration(retryAfter) * time.Second
|
||||
} else if t, err := time.Parse(time.RFC1123, ra); err == nil {
|
||||
dur = t.Sub(time.Now())
|
||||
}
|
||||
if dur > 0 {
|
||||
select {
|
||||
case <-time.After(time.Duration(retryAfter) * time.Second):
|
||||
case <-time.After(dur):
|
||||
return true
|
||||
case <-cancel:
|
||||
return false
|
||||
@@ -312,8 +363,22 @@ func WithLogging(logger *log.Logger) SendDecorator {
|
||||
// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt
|
||||
// count.
|
||||
func DelayForBackoff(backoff time.Duration, attempt int, cancel <-chan struct{}) bool {
|
||||
return DelayForBackoffWithCap(backoff, 0, attempt, cancel)
|
||||
}
|
||||
|
||||
// DelayForBackoffWithCap invokes time.After for the supplied backoff duration raised to the power of
|
||||
// passed attempt (i.e., an exponential backoff delay). Backoff duration is in seconds and can set
|
||||
// to zero for no delay. To cap the maximum possible delay specify a value greater than zero for cap.
|
||||
// The delay may be canceled by closing the passed channel. If terminated early, returns false.
|
||||
// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt
|
||||
// count.
|
||||
func DelayForBackoffWithCap(backoff, cap time.Duration, attempt int, cancel <-chan struct{}) bool {
|
||||
d := time.Duration(backoff.Seconds()*math.Pow(2, float64(attempt))) * time.Second
|
||||
if cap > 0 && d > cap {
|
||||
d = cap
|
||||
}
|
||||
select {
|
||||
case <-time.After(time.Duration(backoff.Seconds()*math.Pow(2, float64(attempt))) * time.Second):
|
||||
case <-time.After(d):
|
||||
return true
|
||||
case <-cancel:
|
||||
return false
|
||||
|
||||
5
vendor/github.com/Azure/go-autorest/autorest/to/convert.go
generated
vendored
5
vendor/github.com/Azure/go-autorest/autorest/to/convert.go
generated
vendored
@@ -145,3 +145,8 @@ func Float64(i *float64) float64 {
|
||||
func Float64Ptr(i float64) *float64 {
|
||||
return &i
|
||||
}
|
||||
|
||||
// ByteSlicePtr returns a pointer to the passed byte slice.
|
||||
func ByteSlicePtr(b []byte) *[]byte {
|
||||
return &b
|
||||
}
|
||||
|
||||
12
vendor/github.com/Azure/go-autorest/autorest/utility.go
generated
vendored
12
vendor/github.com/Azure/go-autorest/autorest/utility.go
generated
vendored
@@ -20,6 +20,7 @@ import (
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"reflect"
|
||||
@@ -156,7 +157,7 @@ func AsStringSlice(s interface{}) ([]string, error) {
|
||||
}
|
||||
|
||||
// String method converts interface v to string. If interface is a list, it
|
||||
// joins list elements using the seperator. Note that only sep[0] will be used for
|
||||
// joins list elements using the separator. Note that only sep[0] will be used for
|
||||
// joining if any separator is specified.
|
||||
func String(v interface{}, sep ...string) string {
|
||||
if len(sep) == 0 {
|
||||
@@ -216,3 +217,12 @@ func IsTokenRefreshError(err error) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsTemporaryNetworkError returns true if the specified error is a temporary network error or false
|
||||
// if it's not. If the error doesn't implement the net.Error interface the return value is true.
|
||||
func IsTemporaryNetworkError(err error) bool {
|
||||
if netErr, ok := err.(net.Error); !ok || (ok && netErr.Temporary()) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
48
vendor/github.com/Azure/go-autorest/autorest/validation/error.go
generated
vendored
Normal file
48
vendor/github.com/Azure/go-autorest/autorest/validation/error.go
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
package validation
|
||||
|
||||
// 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 (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Error is the type that's returned when the validation of an APIs arguments constraints fails.
|
||||
type Error struct {
|
||||
// PackageType is the package type of the object emitting the error. For types, the value
|
||||
// matches that produced the the '%T' format specifier of the fmt package. For other elements,
|
||||
// such as functions, it is just the package name (e.g., "autorest").
|
||||
PackageType string
|
||||
|
||||
// Method is the name of the method raising the error.
|
||||
Method string
|
||||
|
||||
// Message is the error message.
|
||||
Message string
|
||||
}
|
||||
|
||||
// Error returns a string containing the details of the validation failure.
|
||||
func (e Error) Error() string {
|
||||
return fmt.Sprintf("%s#%s: Invalid input: %s", e.PackageType, e.Method, e.Message)
|
||||
}
|
||||
|
||||
// NewError creates a new Error object with the specified parameters.
|
||||
// message is treated as a format string to which the optional args apply.
|
||||
func NewError(packageType string, method string, message string, args ...interface{}) Error {
|
||||
return Error{
|
||||
PackageType: packageType,
|
||||
Method: method,
|
||||
Message: fmt.Sprintf(message, args...),
|
||||
}
|
||||
}
|
||||
400
vendor/github.com/Azure/go-autorest/autorest/validation/validation.go
generated
vendored
Normal file
400
vendor/github.com/Azure/go-autorest/autorest/validation/validation.go
generated
vendored
Normal file
@@ -0,0 +1,400 @@
|
||||
/*
|
||||
Package validation provides methods for validating parameter value using reflection.
|
||||
*/
|
||||
package validation
|
||||
|
||||
// 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 (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Constraint stores constraint name, target field name
|
||||
// Rule and chain validations.
|
||||
type Constraint struct {
|
||||
|
||||
// Target field name for validation.
|
||||
Target string
|
||||
|
||||
// Constraint name e.g. minLength, MaxLength, Pattern, etc.
|
||||
Name string
|
||||
|
||||
// Rule for constraint e.g. greater than 10, less than 5 etc.
|
||||
Rule interface{}
|
||||
|
||||
// Chain Validations for struct type
|
||||
Chain []Constraint
|
||||
}
|
||||
|
||||
// Validation stores parameter-wise validation.
|
||||
type Validation struct {
|
||||
TargetValue interface{}
|
||||
Constraints []Constraint
|
||||
}
|
||||
|
||||
// Constraint list
|
||||
const (
|
||||
Empty = "Empty"
|
||||
Null = "Null"
|
||||
ReadOnly = "ReadOnly"
|
||||
Pattern = "Pattern"
|
||||
MaxLength = "MaxLength"
|
||||
MinLength = "MinLength"
|
||||
MaxItems = "MaxItems"
|
||||
MinItems = "MinItems"
|
||||
MultipleOf = "MultipleOf"
|
||||
UniqueItems = "UniqueItems"
|
||||
InclusiveMaximum = "InclusiveMaximum"
|
||||
ExclusiveMaximum = "ExclusiveMaximum"
|
||||
ExclusiveMinimum = "ExclusiveMinimum"
|
||||
InclusiveMinimum = "InclusiveMinimum"
|
||||
)
|
||||
|
||||
// Validate method validates constraints on parameter
|
||||
// passed in validation array.
|
||||
func Validate(m []Validation) error {
|
||||
for _, item := range m {
|
||||
v := reflect.ValueOf(item.TargetValue)
|
||||
for _, constraint := range item.Constraints {
|
||||
var err error
|
||||
switch v.Kind() {
|
||||
case reflect.Ptr:
|
||||
err = validatePtr(v, constraint)
|
||||
case reflect.String:
|
||||
err = validateString(v, constraint)
|
||||
case reflect.Struct:
|
||||
err = validateStruct(v, constraint)
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
err = validateInt(v, constraint)
|
||||
case reflect.Float32, reflect.Float64:
|
||||
err = validateFloat(v, constraint)
|
||||
case reflect.Array, reflect.Slice, reflect.Map:
|
||||
err = validateArrayMap(v, constraint)
|
||||
default:
|
||||
err = createError(v, constraint, fmt.Sprintf("unknown type %v", v.Kind()))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateStruct(x reflect.Value, v Constraint, name ...string) error {
|
||||
//Get field name from target name which is in format a.b.c
|
||||
s := strings.Split(v.Target, ".")
|
||||
f := x.FieldByName(s[len(s)-1])
|
||||
if isZero(f) {
|
||||
return createError(x, v, fmt.Sprintf("field %q doesn't exist", v.Target))
|
||||
}
|
||||
|
||||
return Validate([]Validation{
|
||||
{
|
||||
TargetValue: getInterfaceValue(f),
|
||||
Constraints: []Constraint{v},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func validatePtr(x reflect.Value, v Constraint) error {
|
||||
if v.Name == ReadOnly {
|
||||
if !x.IsNil() {
|
||||
return createError(x.Elem(), v, "readonly parameter; must send as nil or empty in request")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if x.IsNil() {
|
||||
return checkNil(x, v)
|
||||
}
|
||||
if v.Chain != nil {
|
||||
return Validate([]Validation{
|
||||
{
|
||||
TargetValue: getInterfaceValue(x.Elem()),
|
||||
Constraints: v.Chain,
|
||||
},
|
||||
})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateInt(x reflect.Value, v Constraint) error {
|
||||
i := x.Int()
|
||||
r, ok := toInt64(v.Rule)
|
||||
if !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be integer value for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
switch v.Name {
|
||||
case MultipleOf:
|
||||
if i%r != 0 {
|
||||
return createError(x, v, fmt.Sprintf("value must be a multiple of %v", r))
|
||||
}
|
||||
case ExclusiveMinimum:
|
||||
if i <= r {
|
||||
return createError(x, v, fmt.Sprintf("value must be greater than %v", r))
|
||||
}
|
||||
case ExclusiveMaximum:
|
||||
if i >= r {
|
||||
return createError(x, v, fmt.Sprintf("value must be less than %v", r))
|
||||
}
|
||||
case InclusiveMinimum:
|
||||
if i < r {
|
||||
return createError(x, v, fmt.Sprintf("value must be greater than or equal to %v", r))
|
||||
}
|
||||
case InclusiveMaximum:
|
||||
if i > r {
|
||||
return createError(x, v, fmt.Sprintf("value must be less than or equal to %v", r))
|
||||
}
|
||||
default:
|
||||
return createError(x, v, fmt.Sprintf("constraint %v is not applicable for type integer", v.Name))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateFloat(x reflect.Value, v Constraint) error {
|
||||
f := x.Float()
|
||||
r, ok := v.Rule.(float64)
|
||||
if !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be float value for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
switch v.Name {
|
||||
case ExclusiveMinimum:
|
||||
if f <= r {
|
||||
return createError(x, v, fmt.Sprintf("value must be greater than %v", r))
|
||||
}
|
||||
case ExclusiveMaximum:
|
||||
if f >= r {
|
||||
return createError(x, v, fmt.Sprintf("value must be less than %v", r))
|
||||
}
|
||||
case InclusiveMinimum:
|
||||
if f < r {
|
||||
return createError(x, v, fmt.Sprintf("value must be greater than or equal to %v", r))
|
||||
}
|
||||
case InclusiveMaximum:
|
||||
if f > r {
|
||||
return createError(x, v, fmt.Sprintf("value must be less than or equal to %v", r))
|
||||
}
|
||||
default:
|
||||
return createError(x, v, fmt.Sprintf("constraint %s is not applicable for type float", v.Name))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateString(x reflect.Value, v Constraint) error {
|
||||
s := x.String()
|
||||
switch v.Name {
|
||||
case Empty:
|
||||
if len(s) == 0 {
|
||||
return checkEmpty(x, v)
|
||||
}
|
||||
case Pattern:
|
||||
reg, err := regexp.Compile(v.Rule.(string))
|
||||
if err != nil {
|
||||
return createError(x, v, err.Error())
|
||||
}
|
||||
if !reg.MatchString(s) {
|
||||
return createError(x, v, fmt.Sprintf("value doesn't match pattern %v", v.Rule))
|
||||
}
|
||||
case MaxLength:
|
||||
if _, ok := v.Rule.(int); !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be integer value for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
if len(s) > v.Rule.(int) {
|
||||
return createError(x, v, fmt.Sprintf("value length must be less than or equal to %v", v.Rule))
|
||||
}
|
||||
case MinLength:
|
||||
if _, ok := v.Rule.(int); !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be integer value for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
if len(s) < v.Rule.(int) {
|
||||
return createError(x, v, fmt.Sprintf("value length must be greater than or equal to %v", v.Rule))
|
||||
}
|
||||
case ReadOnly:
|
||||
if len(s) > 0 {
|
||||
return createError(reflect.ValueOf(s), v, "readonly parameter; must send as nil or empty in request")
|
||||
}
|
||||
default:
|
||||
return createError(x, v, fmt.Sprintf("constraint %s is not applicable to string type", v.Name))
|
||||
}
|
||||
|
||||
if v.Chain != nil {
|
||||
return Validate([]Validation{
|
||||
{
|
||||
TargetValue: getInterfaceValue(x),
|
||||
Constraints: v.Chain,
|
||||
},
|
||||
})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateArrayMap(x reflect.Value, v Constraint) error {
|
||||
switch v.Name {
|
||||
case Null:
|
||||
if x.IsNil() {
|
||||
return checkNil(x, v)
|
||||
}
|
||||
case Empty:
|
||||
if x.IsNil() || x.Len() == 0 {
|
||||
return checkEmpty(x, v)
|
||||
}
|
||||
case MaxItems:
|
||||
if _, ok := v.Rule.(int); !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be integer for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
if x.Len() > v.Rule.(int) {
|
||||
return createError(x, v, fmt.Sprintf("maximum item limit is %v; got: %v", v.Rule, x.Len()))
|
||||
}
|
||||
case MinItems:
|
||||
if _, ok := v.Rule.(int); !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be integer for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
if x.Len() < v.Rule.(int) {
|
||||
return createError(x, v, fmt.Sprintf("minimum item limit is %v; got: %v", v.Rule, x.Len()))
|
||||
}
|
||||
case UniqueItems:
|
||||
if x.Kind() == reflect.Array || x.Kind() == reflect.Slice {
|
||||
if !checkForUniqueInArray(x) {
|
||||
return createError(x, v, fmt.Sprintf("all items in parameter %q must be unique; got:%v", v.Target, x))
|
||||
}
|
||||
} else if x.Kind() == reflect.Map {
|
||||
if !checkForUniqueInMap(x) {
|
||||
return createError(x, v, fmt.Sprintf("all items in parameter %q must be unique; got:%v", v.Target, x))
|
||||
}
|
||||
} else {
|
||||
return createError(x, v, fmt.Sprintf("type must be array, slice or map for constraint %v; got: %v", v.Name, x.Kind()))
|
||||
}
|
||||
case ReadOnly:
|
||||
if x.Len() != 0 {
|
||||
return createError(x, v, "readonly parameter; must send as nil or empty in request")
|
||||
}
|
||||
case Pattern:
|
||||
reg, err := regexp.Compile(v.Rule.(string))
|
||||
if err != nil {
|
||||
return createError(x, v, err.Error())
|
||||
}
|
||||
keys := x.MapKeys()
|
||||
for _, k := range keys {
|
||||
if !reg.MatchString(k.String()) {
|
||||
return createError(k, v, fmt.Sprintf("map key doesn't match pattern %v", v.Rule))
|
||||
}
|
||||
}
|
||||
default:
|
||||
return createError(x, v, fmt.Sprintf("constraint %v is not applicable to array, slice and map type", v.Name))
|
||||
}
|
||||
|
||||
if v.Chain != nil {
|
||||
return Validate([]Validation{
|
||||
{
|
||||
TargetValue: getInterfaceValue(x),
|
||||
Constraints: v.Chain,
|
||||
},
|
||||
})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkNil(x reflect.Value, v Constraint) error {
|
||||
if _, ok := v.Rule.(bool); !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be bool value for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
if v.Rule.(bool) {
|
||||
return createError(x, v, "value can not be null; required parameter")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkEmpty(x reflect.Value, v Constraint) error {
|
||||
if _, ok := v.Rule.(bool); !ok {
|
||||
return createError(x, v, fmt.Sprintf("rule must be bool value for %v constraint; got: %v", v.Name, v.Rule))
|
||||
}
|
||||
|
||||
if v.Rule.(bool) {
|
||||
return createError(x, v, "value can not be null or empty; required parameter")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkForUniqueInArray(x reflect.Value) bool {
|
||||
if x == reflect.Zero(reflect.TypeOf(x)) || x.Len() == 0 {
|
||||
return false
|
||||
}
|
||||
arrOfInterface := make([]interface{}, x.Len())
|
||||
|
||||
for i := 0; i < x.Len(); i++ {
|
||||
arrOfInterface[i] = x.Index(i).Interface()
|
||||
}
|
||||
|
||||
m := make(map[interface{}]bool)
|
||||
for _, val := range arrOfInterface {
|
||||
if m[val] {
|
||||
return false
|
||||
}
|
||||
m[val] = true
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func checkForUniqueInMap(x reflect.Value) bool {
|
||||
if x == reflect.Zero(reflect.TypeOf(x)) || x.Len() == 0 {
|
||||
return false
|
||||
}
|
||||
mapOfInterface := make(map[interface{}]interface{}, x.Len())
|
||||
|
||||
keys := x.MapKeys()
|
||||
for _, k := range keys {
|
||||
mapOfInterface[k.Interface()] = x.MapIndex(k).Interface()
|
||||
}
|
||||
|
||||
m := make(map[interface{}]bool)
|
||||
for _, val := range mapOfInterface {
|
||||
if m[val] {
|
||||
return false
|
||||
}
|
||||
m[val] = true
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func getInterfaceValue(x reflect.Value) interface{} {
|
||||
if x.Kind() == reflect.Invalid {
|
||||
return nil
|
||||
}
|
||||
return x.Interface()
|
||||
}
|
||||
|
||||
func isZero(x interface{}) bool {
|
||||
return x == reflect.Zero(reflect.TypeOf(x)).Interface()
|
||||
}
|
||||
|
||||
func createError(x reflect.Value, v Constraint, err string) error {
|
||||
return fmt.Errorf("autorest/validation: validation failed: parameter=%s constraint=%s value=%#v details: %s",
|
||||
v.Target, v.Name, getInterfaceValue(x), err)
|
||||
}
|
||||
|
||||
func toInt64(v interface{}) (int64, bool) {
|
||||
if i64, ok := v.(int64); ok {
|
||||
return i64, true
|
||||
}
|
||||
// older generators emit max constants as int, so if int64 fails fall back to int
|
||||
if i32, ok := v.(int); ok {
|
||||
return int64(i32), true
|
||||
}
|
||||
return 0, false
|
||||
}
|
||||
23
vendor/github.com/Azure/go-autorest/autorest/version.go
generated
vendored
23
vendor/github.com/Azure/go-autorest/autorest/version.go
generated
vendored
@@ -14,7 +14,28 @@ package autorest
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
const number = "v12.4.1"
|
||||
|
||||
var (
|
||||
userAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s",
|
||||
runtime.Version(),
|
||||
runtime.GOARCH,
|
||||
runtime.GOOS,
|
||||
number,
|
||||
)
|
||||
)
|
||||
|
||||
// UserAgent returns a string containing the Go version, system architecture and OS, and the go-autorest version.
|
||||
func UserAgent() string {
|
||||
return userAgent
|
||||
}
|
||||
|
||||
// Version returns the semantic version (see http://semver.org).
|
||||
func Version() string {
|
||||
return "v10.5.0"
|
||||
return number
|
||||
}
|
||||
|
||||
328
vendor/github.com/Azure/go-autorest/logger/logger.go
generated
vendored
Normal file
328
vendor/github.com/Azure/go-autorest/logger/logger.go
generated
vendored
Normal file
@@ -0,0 +1,328 @@
|
||||
package logger
|
||||
|
||||
// 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 (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// LevelType tells a logger the minimum level to log. When code reports a log entry,
|
||||
// the LogLevel indicates the level of the log entry. The logger only records entries
|
||||
// whose level is at least the level it was told to log. See the Log* constants.
|
||||
// For example, if a logger is configured with LogError, then LogError, LogPanic,
|
||||
// and LogFatal entries will be logged; lower level entries are ignored.
|
||||
type LevelType uint32
|
||||
|
||||
const (
|
||||
// LogNone tells a logger not to log any entries passed to it.
|
||||
LogNone LevelType = iota
|
||||
|
||||
// LogFatal tells a logger to log all LogFatal entries passed to it.
|
||||
LogFatal
|
||||
|
||||
// LogPanic tells a logger to log all LogPanic and LogFatal entries passed to it.
|
||||
LogPanic
|
||||
|
||||
// LogError tells a logger to log all LogError, LogPanic and LogFatal entries passed to it.
|
||||
LogError
|
||||
|
||||
// LogWarning tells a logger to log all LogWarning, LogError, LogPanic and LogFatal entries passed to it.
|
||||
LogWarning
|
||||
|
||||
// LogInfo tells a logger to log all LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.
|
||||
LogInfo
|
||||
|
||||
// LogDebug tells a logger to log all LogDebug, LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.
|
||||
LogDebug
|
||||
)
|
||||
|
||||
const (
|
||||
logNone = "NONE"
|
||||
logFatal = "FATAL"
|
||||
logPanic = "PANIC"
|
||||
logError = "ERROR"
|
||||
logWarning = "WARNING"
|
||||
logInfo = "INFO"
|
||||
logDebug = "DEBUG"
|
||||
logUnknown = "UNKNOWN"
|
||||
)
|
||||
|
||||
// ParseLevel converts the specified string into the corresponding LevelType.
|
||||
func ParseLevel(s string) (lt LevelType, err error) {
|
||||
switch strings.ToUpper(s) {
|
||||
case logFatal:
|
||||
lt = LogFatal
|
||||
case logPanic:
|
||||
lt = LogPanic
|
||||
case logError:
|
||||
lt = LogError
|
||||
case logWarning:
|
||||
lt = LogWarning
|
||||
case logInfo:
|
||||
lt = LogInfo
|
||||
case logDebug:
|
||||
lt = LogDebug
|
||||
default:
|
||||
err = fmt.Errorf("bad log level '%s'", s)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// String implements the stringer interface for LevelType.
|
||||
func (lt LevelType) String() string {
|
||||
switch lt {
|
||||
case LogNone:
|
||||
return logNone
|
||||
case LogFatal:
|
||||
return logFatal
|
||||
case LogPanic:
|
||||
return logPanic
|
||||
case LogError:
|
||||
return logError
|
||||
case LogWarning:
|
||||
return logWarning
|
||||
case LogInfo:
|
||||
return logInfo
|
||||
case LogDebug:
|
||||
return logDebug
|
||||
default:
|
||||
return logUnknown
|
||||
}
|
||||
}
|
||||
|
||||
// Filter defines functions for filtering HTTP request/response content.
|
||||
type Filter struct {
|
||||
// URL returns a potentially modified string representation of a request URL.
|
||||
URL func(u *url.URL) string
|
||||
|
||||
// Header returns a potentially modified set of values for the specified key.
|
||||
// To completely exclude the header key/values return false.
|
||||
Header func(key string, val []string) (bool, []string)
|
||||
|
||||
// Body returns a potentially modified request/response body.
|
||||
Body func(b []byte) []byte
|
||||
}
|
||||
|
||||
func (f Filter) processURL(u *url.URL) string {
|
||||
if f.URL == nil {
|
||||
return u.String()
|
||||
}
|
||||
return f.URL(u)
|
||||
}
|
||||
|
||||
func (f Filter) processHeader(k string, val []string) (bool, []string) {
|
||||
if f.Header == nil {
|
||||
return true, val
|
||||
}
|
||||
return f.Header(k, val)
|
||||
}
|
||||
|
||||
func (f Filter) processBody(b []byte) []byte {
|
||||
if f.Body == nil {
|
||||
return b
|
||||
}
|
||||
return f.Body(b)
|
||||
}
|
||||
|
||||
// Writer defines methods for writing to a logging facility.
|
||||
type Writer interface {
|
||||
// Writeln writes the specified message with the standard log entry header and new-line character.
|
||||
Writeln(level LevelType, message string)
|
||||
|
||||
// Writef writes the specified format specifier with the standard log entry header and no new-line character.
|
||||
Writef(level LevelType, format string, a ...interface{})
|
||||
|
||||
// WriteRequest writes the specified HTTP request to the logger if the log level is greater than
|
||||
// or equal to LogInfo. The request body, if set, is logged at level LogDebug or higher.
|
||||
// Custom filters can be specified to exclude URL, header, and/or body content from the log.
|
||||
// By default no request content is excluded.
|
||||
WriteRequest(req *http.Request, filter Filter)
|
||||
|
||||
// WriteResponse writes the specified HTTP response to the logger if the log level is greater than
|
||||
// or equal to LogInfo. The response body, if set, is logged at level LogDebug or higher.
|
||||
// Custom filters can be specified to exclude URL, header, and/or body content from the log.
|
||||
// By default no response content is excluded.
|
||||
WriteResponse(resp *http.Response, filter Filter)
|
||||
}
|
||||
|
||||
// Instance is the default log writer initialized during package init.
|
||||
// This can be replaced with a custom implementation as required.
|
||||
var Instance Writer
|
||||
|
||||
// default log level
|
||||
var logLevel = LogNone
|
||||
|
||||
// Level returns the value specified in AZURE_GO_AUTOREST_LOG_LEVEL.
|
||||
// If no value was specified the default value is LogNone.
|
||||
// Custom loggers can call this to retrieve the configured log level.
|
||||
func Level() LevelType {
|
||||
return logLevel
|
||||
}
|
||||
|
||||
func init() {
|
||||
// separated for testing purposes
|
||||
initDefaultLogger()
|
||||
}
|
||||
|
||||
func initDefaultLogger() {
|
||||
// init with nilLogger so callers don't have to do a nil check on Default
|
||||
Instance = nilLogger{}
|
||||
llStr := strings.ToLower(os.Getenv("AZURE_GO_SDK_LOG_LEVEL"))
|
||||
if llStr == "" {
|
||||
return
|
||||
}
|
||||
var err error
|
||||
logLevel, err = ParseLevel(llStr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "go-autorest: failed to parse log level: %s\n", err.Error())
|
||||
return
|
||||
}
|
||||
if logLevel == LogNone {
|
||||
return
|
||||
}
|
||||
// default to stderr
|
||||
dest := os.Stderr
|
||||
lfStr := os.Getenv("AZURE_GO_SDK_LOG_FILE")
|
||||
if strings.EqualFold(lfStr, "stdout") {
|
||||
dest = os.Stdout
|
||||
} else if lfStr != "" {
|
||||
lf, err := os.Create(lfStr)
|
||||
if err == nil {
|
||||
dest = lf
|
||||
} else {
|
||||
fmt.Fprintf(os.Stderr, "go-autorest: failed to create log file, using stderr: %s\n", err.Error())
|
||||
}
|
||||
}
|
||||
Instance = fileLogger{
|
||||
logLevel: logLevel,
|
||||
mu: &sync.Mutex{},
|
||||
logFile: dest,
|
||||
}
|
||||
}
|
||||
|
||||
// the nil logger does nothing
|
||||
type nilLogger struct{}
|
||||
|
||||
func (nilLogger) Writeln(LevelType, string) {}
|
||||
|
||||
func (nilLogger) Writef(LevelType, string, ...interface{}) {}
|
||||
|
||||
func (nilLogger) WriteRequest(*http.Request, Filter) {}
|
||||
|
||||
func (nilLogger) WriteResponse(*http.Response, Filter) {}
|
||||
|
||||
// A File is used instead of a Logger so the stream can be flushed after every write.
|
||||
type fileLogger struct {
|
||||
logLevel LevelType
|
||||
mu *sync.Mutex // for synchronizing writes to logFile
|
||||
logFile *os.File
|
||||
}
|
||||
|
||||
func (fl fileLogger) Writeln(level LevelType, message string) {
|
||||
fl.Writef(level, "%s\n", message)
|
||||
}
|
||||
|
||||
func (fl fileLogger) Writef(level LevelType, format string, a ...interface{}) {
|
||||
if fl.logLevel >= level {
|
||||
fl.mu.Lock()
|
||||
defer fl.mu.Unlock()
|
||||
fmt.Fprintf(fl.logFile, "%s %s", entryHeader(level), fmt.Sprintf(format, a...))
|
||||
fl.logFile.Sync()
|
||||
}
|
||||
}
|
||||
|
||||
func (fl fileLogger) WriteRequest(req *http.Request, filter Filter) {
|
||||
if req == nil || fl.logLevel < LogInfo {
|
||||
return
|
||||
}
|
||||
b := &bytes.Buffer{}
|
||||
fmt.Fprintf(b, "%s REQUEST: %s %s\n", entryHeader(LogInfo), req.Method, filter.processURL(req.URL))
|
||||
// dump headers
|
||||
for k, v := range req.Header {
|
||||
if ok, mv := filter.processHeader(k, v); ok {
|
||||
fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ","))
|
||||
}
|
||||
}
|
||||
if fl.shouldLogBody(req.Header, req.Body) {
|
||||
// dump body
|
||||
body, err := ioutil.ReadAll(req.Body)
|
||||
if err == nil {
|
||||
fmt.Fprintln(b, string(filter.processBody(body)))
|
||||
if nc, ok := req.Body.(io.Seeker); ok {
|
||||
// rewind to the beginning
|
||||
nc.Seek(0, io.SeekStart)
|
||||
} else {
|
||||
// recreate the body
|
||||
req.Body = ioutil.NopCloser(bytes.NewReader(body))
|
||||
}
|
||||
} else {
|
||||
fmt.Fprintf(b, "failed to read body: %v\n", err)
|
||||
}
|
||||
}
|
||||
fl.mu.Lock()
|
||||
defer fl.mu.Unlock()
|
||||
fmt.Fprint(fl.logFile, b.String())
|
||||
fl.logFile.Sync()
|
||||
}
|
||||
|
||||
func (fl fileLogger) WriteResponse(resp *http.Response, filter Filter) {
|
||||
if resp == nil || fl.logLevel < LogInfo {
|
||||
return
|
||||
}
|
||||
b := &bytes.Buffer{}
|
||||
fmt.Fprintf(b, "%s RESPONSE: %d %s\n", entryHeader(LogInfo), resp.StatusCode, filter.processURL(resp.Request.URL))
|
||||
// dump headers
|
||||
for k, v := range resp.Header {
|
||||
if ok, mv := filter.processHeader(k, v); ok {
|
||||
fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ","))
|
||||
}
|
||||
}
|
||||
if fl.shouldLogBody(resp.Header, resp.Body) {
|
||||
// dump body
|
||||
defer resp.Body.Close()
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err == nil {
|
||||
fmt.Fprintln(b, string(filter.processBody(body)))
|
||||
resp.Body = ioutil.NopCloser(bytes.NewReader(body))
|
||||
} else {
|
||||
fmt.Fprintf(b, "failed to read body: %v\n", err)
|
||||
}
|
||||
}
|
||||
fl.mu.Lock()
|
||||
defer fl.mu.Unlock()
|
||||
fmt.Fprint(fl.logFile, b.String())
|
||||
fl.logFile.Sync()
|
||||
}
|
||||
|
||||
// returns true if the provided body should be included in the log
|
||||
func (fl fileLogger) shouldLogBody(header http.Header, body io.ReadCloser) bool {
|
||||
ct := header.Get("Content-Type")
|
||||
return fl.logLevel >= LogDebug && body != nil && !strings.Contains(ct, "application/octet-stream")
|
||||
}
|
||||
|
||||
// creates standard header for log entries, it contains a timestamp and the log level
|
||||
func entryHeader(level LevelType) string {
|
||||
// this format provides a fixed number of digits so the size of the timestamp is constant
|
||||
return fmt.Sprintf("(%s) %s:", time.Now().Format("2006-01-02T15:04:05.0000000Z07:00"), level.String())
|
||||
}
|
||||
195
vendor/github.com/Azure/go-autorest/tracing/tracing.go
generated
vendored
Normal file
195
vendor/github.com/Azure/go-autorest/tracing/tracing.go
generated
vendored
Normal file
@@ -0,0 +1,195 @@
|
||||
package tracing
|
||||
|
||||
// Copyright 2018 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 (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"contrib.go.opencensus.io/exporter/ocagent"
|
||||
"go.opencensus.io/plugin/ochttp"
|
||||
"go.opencensus.io/plugin/ochttp/propagation/tracecontext"
|
||||
"go.opencensus.io/stats/view"
|
||||
"go.opencensus.io/trace"
|
||||
)
|
||||
|
||||
var (
|
||||
// Transport is the default tracing RoundTripper. The custom options setter will control
|
||||
// if traces are being emitted or not.
|
||||
Transport = NewTransport()
|
||||
|
||||
// enabled is the flag for marking if tracing is enabled.
|
||||
enabled = false
|
||||
|
||||
// Sampler is the tracing sampler. If tracing is disabled it will never sample. Otherwise
|
||||
// it will be using the parent sampler or the default.
|
||||
sampler = trace.NeverSample()
|
||||
|
||||
// Views for metric instrumentation.
|
||||
views = map[string]*view.View{}
|
||||
|
||||
// the trace exporter
|
||||
traceExporter trace.Exporter
|
||||
)
|
||||
|
||||
func init() {
|
||||
enableFromEnv()
|
||||
}
|
||||
|
||||
func enableFromEnv() {
|
||||
_, ok := os.LookupEnv("AZURE_SDK_TRACING_ENABLED")
|
||||
_, legacyOk := os.LookupEnv("AZURE_SDK_TRACING_ENABELD")
|
||||
if ok || legacyOk {
|
||||
agentEndpoint, ok := os.LookupEnv("OCAGENT_TRACE_EXPORTER_ENDPOINT")
|
||||
|
||||
if ok {
|
||||
EnableWithAIForwarding(agentEndpoint)
|
||||
} else {
|
||||
Enable()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NewTransport returns a new instance of a tracing-aware RoundTripper.
|
||||
func NewTransport() *ochttp.Transport {
|
||||
return &ochttp.Transport{
|
||||
Propagation: &tracecontext.HTTPFormat{},
|
||||
GetStartOptions: getStartOptions,
|
||||
}
|
||||
}
|
||||
|
||||
// IsEnabled returns true if monitoring is enabled for the sdk.
|
||||
func IsEnabled() bool {
|
||||
return enabled
|
||||
}
|
||||
|
||||
// Enable will start instrumentation for metrics and traces.
|
||||
func Enable() error {
|
||||
enabled = true
|
||||
sampler = nil
|
||||
|
||||
err := initStats()
|
||||
return err
|
||||
}
|
||||
|
||||
// Disable will disable instrumentation for metrics and traces.
|
||||
func Disable() {
|
||||
disableStats()
|
||||
sampler = trace.NeverSample()
|
||||
if traceExporter != nil {
|
||||
trace.UnregisterExporter(traceExporter)
|
||||
}
|
||||
enabled = false
|
||||
}
|
||||
|
||||
// EnableWithAIForwarding will start instrumentation and will connect to app insights forwarder
|
||||
// exporter making the metrics and traces available in app insights.
|
||||
func EnableWithAIForwarding(agentEndpoint string) (err error) {
|
||||
err = Enable()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
traceExporter, err := ocagent.NewExporter(ocagent.WithInsecure(), ocagent.WithAddress(agentEndpoint))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
trace.RegisterExporter(traceExporter)
|
||||
return
|
||||
}
|
||||
|
||||
// getStartOptions is the custom options setter for the ochttp package.
|
||||
func getStartOptions(*http.Request) trace.StartOptions {
|
||||
return trace.StartOptions{
|
||||
Sampler: sampler,
|
||||
}
|
||||
}
|
||||
|
||||
// initStats registers the views for the http metrics
|
||||
func initStats() (err error) {
|
||||
clientViews := []*view.View{
|
||||
ochttp.ClientCompletedCount,
|
||||
ochttp.ClientRoundtripLatencyDistribution,
|
||||
ochttp.ClientReceivedBytesDistribution,
|
||||
ochttp.ClientSentBytesDistribution,
|
||||
}
|
||||
for _, cv := range clientViews {
|
||||
vn := fmt.Sprintf("Azure/go-autorest/tracing-%s", cv.Name)
|
||||
views[vn] = cv.WithName(vn)
|
||||
err = view.Register(views[vn])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// disableStats will unregister the previously registered metrics
|
||||
func disableStats() {
|
||||
for _, v := range views {
|
||||
view.Unregister(v)
|
||||
}
|
||||
}
|
||||
|
||||
// StartSpan starts a trace span
|
||||
func StartSpan(ctx context.Context, name string) context.Context {
|
||||
ctx, _ = trace.StartSpan(ctx, name, trace.WithSampler(sampler))
|
||||
return ctx
|
||||
}
|
||||
|
||||
// EndSpan ends a previously started span stored in the context
|
||||
func EndSpan(ctx context.Context, httpStatusCode int, err error) {
|
||||
span := trace.FromContext(ctx)
|
||||
|
||||
if span == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
span.SetStatus(trace.Status{Message: err.Error(), Code: toTraceStatusCode(httpStatusCode)})
|
||||
}
|
||||
span.End()
|
||||
}
|
||||
|
||||
// toTraceStatusCode converts HTTP Codes to OpenCensus codes as defined
|
||||
// at https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/HTTP.md#status
|
||||
func toTraceStatusCode(httpStatusCode int) int32 {
|
||||
switch {
|
||||
case http.StatusOK <= httpStatusCode && httpStatusCode < http.StatusBadRequest:
|
||||
return trace.StatusCodeOK
|
||||
case httpStatusCode == http.StatusBadRequest:
|
||||
return trace.StatusCodeInvalidArgument
|
||||
case httpStatusCode == http.StatusUnauthorized: // 401 is actually unauthenticated.
|
||||
return trace.StatusCodeUnauthenticated
|
||||
case httpStatusCode == http.StatusForbidden:
|
||||
return trace.StatusCodePermissionDenied
|
||||
case httpStatusCode == http.StatusNotFound:
|
||||
return trace.StatusCodeNotFound
|
||||
case httpStatusCode == http.StatusTooManyRequests:
|
||||
return trace.StatusCodeResourceExhausted
|
||||
case httpStatusCode == 499:
|
||||
return trace.StatusCodeCancelled
|
||||
case httpStatusCode == http.StatusNotImplemented:
|
||||
return trace.StatusCodeUnimplemented
|
||||
case httpStatusCode == http.StatusServiceUnavailable:
|
||||
return trace.StatusCodeUnavailable
|
||||
case httpStatusCode == http.StatusGatewayTimeout:
|
||||
return trace.StatusCodeDeadlineExceeded
|
||||
default:
|
||||
return trace.StatusCodeUnknown
|
||||
}
|
||||
}
|
||||
71
vendor/github.com/JamesClonk/vultr/lib/account_info.go
generated
vendored
71
vendor/github.com/JamesClonk/vultr/lib/account_info.go
generated
vendored
@@ -1,71 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// AccountInfo of Vultr account
|
||||
type AccountInfo struct {
|
||||
Balance float64 `json:"balance"`
|
||||
PendingCharges float64 `json:"pending_charges"`
|
||||
LastPaymentDate string `json:"last_payment_date"`
|
||||
LastPaymentAmount float64 `json:"last_payment_amount"`
|
||||
}
|
||||
|
||||
// GetAccountInfo retrieves the Vultr account information about current balance, pending charges, etc..
|
||||
func (c *Client) GetAccountInfo() (info AccountInfo, err error) {
|
||||
if err := c.get(`account/info`, &info); err != nil {
|
||||
return AccountInfo{}, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaller on AccountInfo.
|
||||
// This is needed because the Vultr API is inconsistent in it's JSON responses for account info.
|
||||
// Some fields can change type, from JSON number to JSON string and vice-versa.
|
||||
func (a *AccountInfo) UnmarshalJSON(data []byte) (err error) {
|
||||
if a == nil {
|
||||
*a = AccountInfo{}
|
||||
}
|
||||
|
||||
var fields map[string]interface{}
|
||||
if err := json.Unmarshal(data, &fields); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value := fmt.Sprintf("%v", fields["balance"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
b, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.Balance = b
|
||||
|
||||
value = fmt.Sprintf("%v", fields["pending_charges"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
pc, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.PendingCharges = pc
|
||||
|
||||
value = fmt.Sprintf("%v", fields["last_payment_amount"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
lpa, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.LastPaymentAmount = lpa
|
||||
|
||||
a.LastPaymentDate = fmt.Sprintf("%v", fields["last_payment_date"])
|
||||
|
||||
return
|
||||
}
|
||||
38
vendor/github.com/JamesClonk/vultr/lib/applications.go
generated
vendored
38
vendor/github.com/JamesClonk/vultr/lib/applications.go
generated
vendored
@@ -1,38 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Application on Vultr
|
||||
type Application struct {
|
||||
ID string `json:"APPID"`
|
||||
Name string `json:"name"`
|
||||
ShortName string `json:"short_name"`
|
||||
DeployName string `json:"deploy_name"`
|
||||
Surcharge float64 `json:"surcharge"`
|
||||
}
|
||||
|
||||
type applications []Application
|
||||
|
||||
func (s applications) Len() int { return len(s) }
|
||||
func (s applications) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s applications) Less(i, j int) bool {
|
||||
return strings.ToLower(s[i].Name) < strings.ToLower(s[j].Name)
|
||||
}
|
||||
|
||||
// GetApplications returns a list of all available applications on Vultr
|
||||
func (c *Client) GetApplications() ([]Application, error) {
|
||||
var appMap map[string]Application
|
||||
if err := c.get(`app/list`, &appMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var appList []Application
|
||||
for _, app := range appMap {
|
||||
appList = append(appList, app)
|
||||
}
|
||||
sort.Sort(applications(appList))
|
||||
return appList, nil
|
||||
}
|
||||
210
vendor/github.com/JamesClonk/vultr/lib/block_storage.go
generated
vendored
210
vendor/github.com/JamesClonk/vultr/lib/block_storage.go
generated
vendored
@@ -1,210 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// BlockStorage on Vultr account
|
||||
type BlockStorage struct {
|
||||
ID string `json:"SUBID,string"`
|
||||
Name string `json:"label"`
|
||||
RegionID int `json:"DCID,string"`
|
||||
SizeGB int `json:"size_gb,string"`
|
||||
Created string `json:"date_created"`
|
||||
Cost string `json:"cost_per_month"`
|
||||
Status string `json:"status"`
|
||||
AttachedTo string `json:"attached_to_SUBID"`
|
||||
}
|
||||
|
||||
type blockstorages []BlockStorage
|
||||
|
||||
func (b blockstorages) Len() int { return len(b) }
|
||||
func (b blockstorages) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
||||
func (b blockstorages) Less(i, j int) bool {
|
||||
// sort order: name, size, status
|
||||
if strings.ToLower(b[i].Name) < strings.ToLower(b[j].Name) {
|
||||
return true
|
||||
} else if strings.ToLower(b[i].Name) > strings.ToLower(b[j].Name) {
|
||||
return false
|
||||
}
|
||||
if b[i].SizeGB < b[j].SizeGB {
|
||||
return true
|
||||
} else if b[i].SizeGB > b[j].SizeGB {
|
||||
return false
|
||||
}
|
||||
return b[i].Status < b[j].Status
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaller on BlockStorage.
|
||||
// This is needed because the Vultr API is inconsistent in it's JSON responses.
|
||||
// Some fields can change type, from JSON number to JSON string and vice-versa.
|
||||
func (b *BlockStorage) UnmarshalJSON(data []byte) (err error) {
|
||||
if b == nil {
|
||||
*b = BlockStorage{}
|
||||
}
|
||||
|
||||
var fields map[string]interface{}
|
||||
if err := json.Unmarshal(data, &fields); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value := fmt.Sprintf("%v", fields["SUBID"])
|
||||
if len(value) == 0 || value == "<nil>" || value == "0" {
|
||||
b.ID = ""
|
||||
} else {
|
||||
id, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.ID = strconv.FormatFloat(id, 'f', -1, 64)
|
||||
}
|
||||
|
||||
value = fmt.Sprintf("%v", fields["DCID"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
region, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.RegionID = int(region)
|
||||
|
||||
value = fmt.Sprintf("%v", fields["size_gb"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
size, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.SizeGB = int(size)
|
||||
|
||||
value = fmt.Sprintf("%v", fields["attached_to_SUBID"])
|
||||
if len(value) == 0 || value == "<nil>" || value == "0" {
|
||||
b.AttachedTo = ""
|
||||
} else {
|
||||
attached, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.AttachedTo = strconv.FormatFloat(attached, 'f', -1, 64)
|
||||
}
|
||||
|
||||
b.Name = fmt.Sprintf("%v", fields["label"])
|
||||
b.Created = fmt.Sprintf("%v", fields["date_created"])
|
||||
b.Status = fmt.Sprintf("%v", fields["status"])
|
||||
b.Cost = fmt.Sprintf("%v", fields["cost_per_month"])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// GetBlockStorages returns a list of all active block storages on Vultr account
|
||||
func (c *Client) GetBlockStorages() (storages []BlockStorage, err error) {
|
||||
if err := c.get(`block/list`, &storages); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sort.Sort(blockstorages(storages))
|
||||
return storages, nil
|
||||
}
|
||||
|
||||
// GetBlockStorage returns block storage with given ID
|
||||
func (c *Client) GetBlockStorage(id string) (BlockStorage, error) {
|
||||
storages, err := c.GetBlockStorages()
|
||||
if err != nil {
|
||||
return BlockStorage{}, err
|
||||
}
|
||||
|
||||
for _, s := range storages {
|
||||
if s.ID == id {
|
||||
return s, nil
|
||||
}
|
||||
}
|
||||
return BlockStorage{}, fmt.Errorf("BlockStorage with ID %v not found", id)
|
||||
}
|
||||
|
||||
// CreateBlockStorage creates a new block storage on Vultr account
|
||||
func (c *Client) CreateBlockStorage(name string, regionID, size int) (BlockStorage, error) {
|
||||
values := url.Values{
|
||||
"label": {name},
|
||||
"DCID": {fmt.Sprintf("%v", regionID)},
|
||||
"size_gb": {fmt.Sprintf("%v", size)},
|
||||
}
|
||||
|
||||
var storage BlockStorage
|
||||
if err := c.post(`block/create`, values, &storage); err != nil {
|
||||
return BlockStorage{}, err
|
||||
}
|
||||
storage.RegionID = regionID
|
||||
storage.Name = name
|
||||
storage.SizeGB = size
|
||||
|
||||
return storage, nil
|
||||
}
|
||||
|
||||
// ResizeBlockStorage resizes an existing block storage
|
||||
func (c *Client) ResizeBlockStorage(id string, size int) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"size_gb": {fmt.Sprintf("%v", size)},
|
||||
}
|
||||
|
||||
if err := c.post(`block/resize`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// LabelBlockStorage changes the label on an existing block storage
|
||||
func (c *Client) LabelBlockStorage(id, name string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"label": {name},
|
||||
}
|
||||
|
||||
if err := c.post(`block/label_set`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// AttachBlockStorage attaches block storage to an existing virtual machine
|
||||
func (c *Client) AttachBlockStorage(id, serverID string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"attach_to_SUBID": {serverID},
|
||||
}
|
||||
|
||||
if err := c.post(`block/attach`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DetachBlockStorage detaches block storage from virtual machine
|
||||
func (c *Client) DetachBlockStorage(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`block/detach`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteBlockStorage deletes an existing block storage
|
||||
func (c *Client) DeleteBlockStorage(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`block/delete`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
249
vendor/github.com/JamesClonk/vultr/lib/client.go
generated
vendored
249
vendor/github.com/JamesClonk/vultr/lib/client.go
generated
vendored
@@ -1,249 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/juju/ratelimit"
|
||||
)
|
||||
|
||||
const (
|
||||
// Version of this libary
|
||||
Version = "1.13.0"
|
||||
|
||||
// APIVersion of Vultr
|
||||
APIVersion = "v1"
|
||||
|
||||
// DefaultEndpoint to be used
|
||||
DefaultEndpoint = "https://api.vultr.com/"
|
||||
|
||||
mediaType = "application/json"
|
||||
)
|
||||
|
||||
// retryableStatusCodes are API response status codes that indicate that
|
||||
// the failed request can be retried without further actions.
|
||||
var retryableStatusCodes = map[int]struct{}{
|
||||
503: {}, // Rate limit hit
|
||||
500: {}, // Internal server error. Try again at a later time.
|
||||
}
|
||||
|
||||
// Client represents the Vultr API client
|
||||
type Client struct {
|
||||
// HTTP client for communication with the Vultr API
|
||||
client *http.Client
|
||||
|
||||
// User agent for HTTP client
|
||||
UserAgent string
|
||||
|
||||
// Endpoint URL for API requests
|
||||
Endpoint *url.URL
|
||||
|
||||
// API key for accessing the Vultr API
|
||||
APIKey string
|
||||
|
||||
// Max. number of request attempts
|
||||
MaxAttempts int
|
||||
|
||||
// Throttling struct
|
||||
bucket *ratelimit.Bucket
|
||||
}
|
||||
|
||||
// Options represents optional settings and flags that can be passed to NewClient
|
||||
type Options struct {
|
||||
// HTTP client for communication with the Vultr API
|
||||
HTTPClient *http.Client
|
||||
|
||||
// User agent for HTTP client
|
||||
UserAgent string
|
||||
|
||||
// Endpoint URL for API requests
|
||||
Endpoint string
|
||||
|
||||
// API rate limitation, calls per duration
|
||||
RateLimitation time.Duration
|
||||
|
||||
// Max. number of times to retry API calls
|
||||
MaxRetries int
|
||||
}
|
||||
|
||||
// NewClient creates new Vultr API client. Options are optional and can be nil.
|
||||
func NewClient(apiKey string, options *Options) *Client {
|
||||
userAgent := "vultr-go/" + Version
|
||||
transport := &http.Transport{
|
||||
TLSNextProto: make(map[string]func(string, *tls.Conn) http.RoundTripper),
|
||||
}
|
||||
client := http.DefaultClient
|
||||
client.Transport = transport
|
||||
endpoint, _ := url.Parse(DefaultEndpoint)
|
||||
rate := 505 * time.Millisecond
|
||||
attempts := 1
|
||||
|
||||
if options != nil {
|
||||
if options.HTTPClient != nil {
|
||||
client = options.HTTPClient
|
||||
}
|
||||
if options.UserAgent != "" {
|
||||
userAgent = options.UserAgent
|
||||
}
|
||||
if options.Endpoint != "" {
|
||||
endpoint, _ = url.Parse(options.Endpoint)
|
||||
}
|
||||
if options.RateLimitation != 0 {
|
||||
rate = options.RateLimitation
|
||||
}
|
||||
if options.MaxRetries != 0 {
|
||||
attempts = options.MaxRetries + 1
|
||||
}
|
||||
}
|
||||
|
||||
return &Client{
|
||||
UserAgent: userAgent,
|
||||
client: client,
|
||||
Endpoint: endpoint,
|
||||
APIKey: apiKey,
|
||||
MaxAttempts: attempts,
|
||||
bucket: ratelimit.NewBucket(rate, 1),
|
||||
}
|
||||
}
|
||||
|
||||
func apiPath(path string) string {
|
||||
return fmt.Sprintf("/%s/%s", APIVersion, path)
|
||||
}
|
||||
|
||||
func apiKeyPath(path, apiKey string) string {
|
||||
if strings.Contains(path, "?") {
|
||||
return path + "&api_key=" + apiKey
|
||||
}
|
||||
return path + "?api_key=" + apiKey
|
||||
}
|
||||
|
||||
func (c *Client) get(path string, data interface{}) error {
|
||||
req, err := c.newRequest("GET", apiPath(path), nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.do(req, data)
|
||||
}
|
||||
|
||||
func (c *Client) post(path string, values url.Values, data interface{}) error {
|
||||
req, err := c.newRequest("POST", apiPath(path), strings.NewReader(values.Encode()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.do(req, data)
|
||||
}
|
||||
|
||||
func (c *Client) newRequest(method string, path string, body io.Reader) (*http.Request, error) {
|
||||
relPath, err := url.Parse(apiKeyPath(path, c.APIKey))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
url := c.Endpoint.ResolveReference(relPath)
|
||||
|
||||
req, err := http.NewRequest(method, url.String(), body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req.Header.Add("User-Agent", c.UserAgent)
|
||||
req.Header.Add("Accept", mediaType)
|
||||
|
||||
if req.Method == "POST" {
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
}
|
||||
return req, nil
|
||||
}
|
||||
|
||||
func (c *Client) do(req *http.Request, data interface{}) error {
|
||||
// Throttle http requests to avoid hitting Vultr's API rate-limit
|
||||
c.bucket.Wait(1)
|
||||
|
||||
// Request body gets drained on each read so we
|
||||
// need to save it's content for retrying requests
|
||||
var err error
|
||||
var requestBody []byte
|
||||
if req.Body != nil {
|
||||
requestBody, err = ioutil.ReadAll(req.Body)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error reading request body: %v", err)
|
||||
}
|
||||
req.Body.Close()
|
||||
}
|
||||
|
||||
var apiError error
|
||||
for tryCount := 1; tryCount <= c.MaxAttempts; tryCount++ {
|
||||
// Restore request body to the original state
|
||||
if requestBody != nil {
|
||||
req.Body = ioutil.NopCloser(bytes.NewBuffer(requestBody))
|
||||
}
|
||||
|
||||
resp, err := c.client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
resp.Body.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if resp.StatusCode == http.StatusOK {
|
||||
if data != nil {
|
||||
// avoid unmarshalling problem because Vultr API returns
|
||||
// empty array instead of empty map when it shouldn't!
|
||||
if string(body) == `[]` {
|
||||
data = nil
|
||||
} else {
|
||||
if err := json.Unmarshal(body, data); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
apiError = errors.New(string(body))
|
||||
if !isCodeRetryable(resp.StatusCode) {
|
||||
break
|
||||
}
|
||||
|
||||
delay := backoffDuration(tryCount)
|
||||
time.Sleep(delay)
|
||||
}
|
||||
|
||||
return apiError
|
||||
}
|
||||
|
||||
// backoffDuration returns the duration to wait before retrying the request.
|
||||
// Duration is an exponential function of the retry count with a jitter of ~0-30%.
|
||||
func backoffDuration(retryCount int) time.Duration {
|
||||
// Upper limit of delay at ~1 minute
|
||||
if retryCount > 7 {
|
||||
retryCount = 7
|
||||
}
|
||||
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
delay := (1 << uint(retryCount)) * (rand.Intn(150) + 500)
|
||||
return time.Duration(delay) * time.Millisecond
|
||||
}
|
||||
|
||||
// isCodeRetryable returns true if the given status code means that we should retry.
|
||||
func isCodeRetryable(statusCode int) bool {
|
||||
if _, ok := retryableStatusCodes[statusCode]; ok {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
150
vendor/github.com/JamesClonk/vultr/lib/dns.go
generated
vendored
150
vendor/github.com/JamesClonk/vultr/lib/dns.go
generated
vendored
@@ -1,150 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// DNSDomain represents a DNS domain on Vultr
|
||||
type DNSDomain struct {
|
||||
Domain string `json:"domain"`
|
||||
Created string `json:"date_created"`
|
||||
}
|
||||
|
||||
type dnsdomains []DNSDomain
|
||||
|
||||
func (d dnsdomains) Len() int { return len(d) }
|
||||
func (d dnsdomains) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
|
||||
func (d dnsdomains) Less(i, j int) bool {
|
||||
return strings.ToLower(d[i].Domain) < strings.ToLower(d[j].Domain)
|
||||
}
|
||||
|
||||
// DNSRecord represents a DNS record on Vultr
|
||||
type DNSRecord struct {
|
||||
RecordID int `json:"RECORDID"`
|
||||
Type string `json:"type"`
|
||||
Name string `json:"name"`
|
||||
Data string `json:"data"`
|
||||
Priority int `json:"priority"`
|
||||
TTL int `json:"ttl"`
|
||||
}
|
||||
|
||||
type dnsrecords []DNSRecord
|
||||
|
||||
func (d dnsrecords) Len() int { return len(d) }
|
||||
func (d dnsrecords) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
|
||||
func (d dnsrecords) Less(i, j int) bool {
|
||||
// sort order: type, data, name
|
||||
if d[i].Type < d[j].Type {
|
||||
return true
|
||||
} else if d[i].Type > d[j].Type {
|
||||
return false
|
||||
}
|
||||
if d[i].Data < d[j].Data {
|
||||
return true
|
||||
} else if d[i].Data > d[j].Data {
|
||||
return false
|
||||
}
|
||||
return strings.ToLower(d[i].Name) < strings.ToLower(d[j].Name)
|
||||
}
|
||||
|
||||
// GetDNSDomains returns a list of available domains on Vultr account
|
||||
func (c *Client) GetDNSDomains() (domains []DNSDomain, err error) {
|
||||
if err := c.get(`dns/list`, &domains); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sort.Sort(dnsdomains(domains))
|
||||
return domains, nil
|
||||
}
|
||||
|
||||
// GetDNSRecords returns a list of all DNS records of a particular domain
|
||||
func (c *Client) GetDNSRecords(domain string) (records []DNSRecord, err error) {
|
||||
if err := c.get(`dns/records?domain=`+domain, &records); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sort.Sort(dnsrecords(records))
|
||||
return records, nil
|
||||
}
|
||||
|
||||
// CreateDNSDomain creates a new DNS domain name on Vultr
|
||||
func (c *Client) CreateDNSDomain(domain, serverIP string) error {
|
||||
values := url.Values{
|
||||
"domain": {domain},
|
||||
"serverip": {serverIP},
|
||||
}
|
||||
|
||||
if err := c.post(`dns/create_domain`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteDNSDomain deletes an existing DNS domain name
|
||||
func (c *Client) DeleteDNSDomain(domain string) error {
|
||||
values := url.Values{
|
||||
"domain": {domain},
|
||||
}
|
||||
|
||||
if err := c.post(`dns/delete_domain`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CreateDNSRecord creates a new DNS record
|
||||
func (c *Client) CreateDNSRecord(domain, name, rtype, data string, priority, ttl int) error {
|
||||
values := url.Values{
|
||||
"domain": {domain},
|
||||
"name": {name},
|
||||
"type": {rtype},
|
||||
"data": {data},
|
||||
"priority": {fmt.Sprintf("%v", priority)},
|
||||
"ttl": {fmt.Sprintf("%v", ttl)},
|
||||
}
|
||||
|
||||
if err := c.post(`dns/create_record`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateDNSRecord updates an existing DNS record
|
||||
func (c *Client) UpdateDNSRecord(domain string, dnsrecord DNSRecord) error {
|
||||
values := url.Values{
|
||||
"domain": {domain},
|
||||
"RECORDID": {fmt.Sprintf("%v", dnsrecord.RecordID)},
|
||||
}
|
||||
|
||||
if dnsrecord.Name != "" {
|
||||
values.Add("name", dnsrecord.Name)
|
||||
}
|
||||
if dnsrecord.Data != "" {
|
||||
values.Add("data", dnsrecord.Data)
|
||||
}
|
||||
if dnsrecord.Priority != 0 {
|
||||
values.Add("priority", fmt.Sprintf("%v", dnsrecord.Priority))
|
||||
}
|
||||
if dnsrecord.TTL != 0 {
|
||||
values.Add("ttl", fmt.Sprintf("%v", dnsrecord.TTL))
|
||||
}
|
||||
|
||||
if err := c.post(`dns/update_record`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteDNSRecord deletes an existing DNS record
|
||||
func (c *Client) DeleteDNSRecord(domain string, recordID int) error {
|
||||
values := url.Values{
|
||||
"domain": {domain},
|
||||
"RECORDID": {fmt.Sprintf("%v", recordID)},
|
||||
}
|
||||
|
||||
if err := c.post(`dns/delete_record`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
248
vendor/github.com/JamesClonk/vultr/lib/firewall.go
generated
vendored
248
vendor/github.com/JamesClonk/vultr/lib/firewall.go
generated
vendored
@@ -1,248 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// FirewallGroup represents a firewall group on Vultr
|
||||
type FirewallGroup struct {
|
||||
ID string `json:"FIREWALLGROUPID"`
|
||||
Description string `json:"description"`
|
||||
Created string `json:"date_created"`
|
||||
Modified string `json:"date_modified"`
|
||||
InstanceCount int `json:"instance_count"`
|
||||
RuleCount int `json:"rule_count"`
|
||||
MaxRuleCount int `json:"max_rule_count"`
|
||||
}
|
||||
|
||||
// FirewallRule represents a firewall rule on Vultr
|
||||
type FirewallRule struct {
|
||||
RuleNumber int `json:"rulenumber"`
|
||||
Action string `json:"action"`
|
||||
Protocol string `json:"protocol"`
|
||||
Port string `json:"port"`
|
||||
Network *net.IPNet
|
||||
}
|
||||
|
||||
type firewallGroups []FirewallGroup
|
||||
|
||||
func (f firewallGroups) Len() int { return len(f) }
|
||||
func (f firewallGroups) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
|
||||
func (f firewallGroups) Less(i, j int) bool {
|
||||
// sort order: description
|
||||
return strings.ToLower(f[i].Description) < strings.ToLower(f[j].Description)
|
||||
}
|
||||
|
||||
type firewallRules []FirewallRule
|
||||
|
||||
func (r firewallRules) Len() int { return len(r) }
|
||||
func (r firewallRules) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
|
||||
func (r firewallRules) Less(i, j int) bool {
|
||||
// sort order: rule number
|
||||
return r[i].RuleNumber < r[j].RuleNumber
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaller on FirewallRule.
|
||||
// This is needed because the Vultr API is inconsistent in it's JSON responses.
|
||||
// Some fields can change type, from JSON number to JSON string and vice-versa.
|
||||
func (r *FirewallRule) UnmarshalJSON(data []byte) (err error) {
|
||||
if r == nil {
|
||||
*r = FirewallRule{}
|
||||
}
|
||||
|
||||
var fields map[string]interface{}
|
||||
if err := json.Unmarshal(data, &fields); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value := fmt.Sprintf("%v", fields["rulenumber"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
number, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
r.RuleNumber = int(number)
|
||||
|
||||
value = fmt.Sprintf("%v", fields["subnet_size"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
subnetSize, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
r.Action = fmt.Sprintf("%v", fields["action"])
|
||||
r.Protocol = fmt.Sprintf("%v", fields["protocol"])
|
||||
r.Port = fmt.Sprintf("%v", fields["port"])
|
||||
subnet := fmt.Sprintf("%v", fields["subnet"])
|
||||
|
||||
if subnetSize > 0 && len(subnet) > 0 {
|
||||
_, r.Network, err = net.ParseCIDR(fmt.Sprintf("%s/%d", subnet, subnetSize))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to parse subnet from Vultr API")
|
||||
}
|
||||
} else {
|
||||
_, r.Network, _ = net.ParseCIDR("0.0.0.0/0")
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// GetFirewallGroups returns a list of all available firewall groups on Vultr
|
||||
func (c *Client) GetFirewallGroups() ([]FirewallGroup, error) {
|
||||
var groupMap map[string]FirewallGroup
|
||||
if err := c.get(`firewall/group_list`, &groupMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var groupList []FirewallGroup
|
||||
for _, g := range groupMap {
|
||||
groupList = append(groupList, g)
|
||||
}
|
||||
sort.Sort(firewallGroups(groupList))
|
||||
return groupList, nil
|
||||
}
|
||||
|
||||
// GetFirewallGroup returns the firewall group with given ID
|
||||
func (c *Client) GetFirewallGroup(id string) (FirewallGroup, error) {
|
||||
groups, err := c.GetFirewallGroups()
|
||||
if err != nil {
|
||||
return FirewallGroup{}, err
|
||||
}
|
||||
|
||||
for _, g := range groups {
|
||||
if g.ID == id {
|
||||
return g, nil
|
||||
}
|
||||
}
|
||||
return FirewallGroup{}, fmt.Errorf("Firewall group with ID %v not found", id)
|
||||
}
|
||||
|
||||
// CreateFirewallGroup creates a new firewall group in Vultr account
|
||||
func (c *Client) CreateFirewallGroup(description string) (string, error) {
|
||||
values := url.Values{}
|
||||
|
||||
// Optional description
|
||||
if len(description) > 0 {
|
||||
values.Add("description", description)
|
||||
}
|
||||
|
||||
var result FirewallGroup
|
||||
err := c.post(`firewall/group_create`, values, &result)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return result.ID, nil
|
||||
}
|
||||
|
||||
// DeleteFirewallGroup deletes an existing firewall group
|
||||
func (c *Client) DeleteFirewallGroup(groupID string) error {
|
||||
values := url.Values{
|
||||
"FIREWALLGROUPID": {groupID},
|
||||
}
|
||||
|
||||
if err := c.post(`firewall/group_delete`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetFirewallGroupDescription sets the description of an existing firewall group
|
||||
func (c *Client) SetFirewallGroupDescription(groupID, description string) error {
|
||||
values := url.Values{
|
||||
"FIREWALLGROUPID": {groupID},
|
||||
"description": {description},
|
||||
}
|
||||
|
||||
if err := c.post(`firewall/group_set_description`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetFirewallRules returns a list of rules for the given firewall group
|
||||
func (c *Client) GetFirewallRules(groupID string) ([]FirewallRule, error) {
|
||||
var ruleMap map[string]FirewallRule
|
||||
ipTypes := []string{"v4", "v6"}
|
||||
for _, ipType := range ipTypes {
|
||||
args := fmt.Sprintf("direction=in&FIREWALLGROUPID=%s&ip_type=%s",
|
||||
groupID, ipType)
|
||||
if err := c.get(`firewall/rule_list?`+args, &ruleMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
var ruleList []FirewallRule
|
||||
for _, r := range ruleMap {
|
||||
ruleList = append(ruleList, r)
|
||||
}
|
||||
sort.Sort(firewallRules(ruleList))
|
||||
return ruleList, nil
|
||||
}
|
||||
|
||||
// CreateFirewallRule creates a new firewall rule in Vultr account.
|
||||
// groupID is the ID of the firewall group to create the rule in
|
||||
// protocol must be one of: "icmp", "tcp", "udp", "gre"
|
||||
// port can be a port number or colon separated port range (TCP/UDP only)
|
||||
func (c *Client) CreateFirewallRule(groupID, protocol, port string,
|
||||
network *net.IPNet) (int, error) {
|
||||
ip := network.IP.String()
|
||||
maskBits, _ := network.Mask.Size()
|
||||
if ip == "<nil>" {
|
||||
return 0, fmt.Errorf("Invalid network")
|
||||
}
|
||||
|
||||
var ipType string
|
||||
if network.IP.To4() != nil {
|
||||
ipType = "v4"
|
||||
} else {
|
||||
ipType = "v6"
|
||||
}
|
||||
|
||||
values := url.Values{
|
||||
"FIREWALLGROUPID": {groupID},
|
||||
// possible values: "in"
|
||||
"direction": {"in"},
|
||||
// possible values: "icmp", "tcp", "udp", "gre"
|
||||
"protocol": {protocol},
|
||||
// possible values: "v4", "v6"
|
||||
"ip_type": {ipType},
|
||||
// IP address representing a subnet
|
||||
"subnet": {ip},
|
||||
// IP prefix size in bits
|
||||
"subnet_size": {fmt.Sprintf("%v", maskBits)},
|
||||
}
|
||||
|
||||
if len(port) > 0 {
|
||||
values.Add("port", port)
|
||||
}
|
||||
|
||||
var result FirewallRule
|
||||
err := c.post(`firewall/rule_create`, values, &result)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return result.RuleNumber, nil
|
||||
}
|
||||
|
||||
// DeleteFirewallRule deletes an existing firewall rule
|
||||
func (c *Client) DeleteFirewallRule(ruleNumber int, groupID string) error {
|
||||
values := url.Values{
|
||||
"FIREWALLGROUPID": {groupID},
|
||||
"rulenumber": {fmt.Sprintf("%v", ruleNumber)},
|
||||
}
|
||||
|
||||
if err := c.post(`firewall/rule_delete`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
192
vendor/github.com/JamesClonk/vultr/lib/ip.go
generated
vendored
192
vendor/github.com/JamesClonk/vultr/lib/ip.go
generated
vendored
@@ -1,192 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
"sort"
|
||||
)
|
||||
|
||||
// IPv4 information of a virtual machine
|
||||
type IPv4 struct {
|
||||
IP string `json:"ip"`
|
||||
Netmask string `json:"netmask"`
|
||||
Gateway string `json:"gateway"`
|
||||
Type string `json:"type"`
|
||||
ReverseDNS string `json:"reverse"`
|
||||
}
|
||||
|
||||
type ipv4s []IPv4
|
||||
|
||||
func (s ipv4s) Len() int { return len(s) }
|
||||
func (s ipv4s) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s ipv4s) Less(i, j int) bool {
|
||||
// sort order: type, ip
|
||||
if s[i].Type < s[j].Type {
|
||||
return true
|
||||
} else if s[i].Type > s[j].Type {
|
||||
return false
|
||||
}
|
||||
return s[i].IP < s[j].IP
|
||||
}
|
||||
|
||||
// IPv6 information of a virtual machine
|
||||
type IPv6 struct {
|
||||
IP string `json:"ip"`
|
||||
Network string `json:"network"`
|
||||
NetworkSize string `json:"network_size"`
|
||||
Type string `json:"type"`
|
||||
}
|
||||
|
||||
type ipv6s []IPv6
|
||||
|
||||
func (s ipv6s) Len() int { return len(s) }
|
||||
func (s ipv6s) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s ipv6s) Less(i, j int) bool {
|
||||
// sort order: type, ip
|
||||
if s[i].Type < s[j].Type {
|
||||
return true
|
||||
} else if s[i].Type > s[j].Type {
|
||||
return false
|
||||
}
|
||||
return s[i].IP < s[j].IP
|
||||
}
|
||||
|
||||
// ReverseDNSIPv6 information of a virtual machine
|
||||
type ReverseDNSIPv6 struct {
|
||||
IP string `json:"ip"`
|
||||
ReverseDNS string `json:"reverse"`
|
||||
}
|
||||
|
||||
type reverseDNSIPv6s []ReverseDNSIPv6
|
||||
|
||||
func (s reverseDNSIPv6s) Len() int { return len(s) }
|
||||
func (s reverseDNSIPv6s) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s reverseDNSIPv6s) Less(i, j int) bool { return s[i].IP < s[j].IP }
|
||||
|
||||
// ListIPv4 lists the IPv4 information of a virtual machine
|
||||
func (c *Client) ListIPv4(id string) (list []IPv4, err error) {
|
||||
var ipMap map[string][]IPv4
|
||||
if err := c.get(`server/list_ipv4?SUBID=`+id, &ipMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, iplist := range ipMap {
|
||||
for _, ip := range iplist {
|
||||
list = append(list, ip)
|
||||
}
|
||||
}
|
||||
sort.Sort(ipv4s(list))
|
||||
return list, nil
|
||||
}
|
||||
|
||||
// CreateIPv4 creates an IPv4 address and attaches it to a virtual machine
|
||||
func (c *Client) CreateIPv4(id string, reboot bool) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"reboot": {fmt.Sprintf("%t", reboot)},
|
||||
}
|
||||
|
||||
if err := c.post(`server/create_ipv4`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteIPv4 deletes an IPv4 address and detaches it from a virtual machine
|
||||
func (c *Client) DeleteIPv4(id, ip string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"ip": {ip},
|
||||
}
|
||||
|
||||
if err := c.post(`server/destroy_ipv4`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ListIPv6 lists the IPv4 information of a virtual machine
|
||||
func (c *Client) ListIPv6(id string) (list []IPv6, err error) {
|
||||
var ipMap map[string][]IPv6
|
||||
if err := c.get(`server/list_ipv6?SUBID=`+id, &ipMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, iplist := range ipMap {
|
||||
for _, ip := range iplist {
|
||||
list = append(list, ip)
|
||||
}
|
||||
}
|
||||
sort.Sort(ipv6s(list))
|
||||
return list, nil
|
||||
}
|
||||
|
||||
// ListIPv6ReverseDNS lists the IPv6 reverse DNS entries of a virtual machine
|
||||
func (c *Client) ListIPv6ReverseDNS(id string) (list []ReverseDNSIPv6, err error) {
|
||||
var ipMap map[string][]ReverseDNSIPv6
|
||||
if err := c.get(`server/reverse_list_ipv6?SUBID=`+id, &ipMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, iplist := range ipMap {
|
||||
for _, ip := range iplist {
|
||||
list = append(list, ip)
|
||||
}
|
||||
}
|
||||
sort.Sort(reverseDNSIPv6s(list))
|
||||
return list, nil
|
||||
}
|
||||
|
||||
// DeleteIPv6ReverseDNS removes a reverse DNS entry for an IPv6 address of a virtual machine
|
||||
func (c *Client) DeleteIPv6ReverseDNS(id string, ip string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"ip": {ip},
|
||||
}
|
||||
|
||||
if err := c.post(`server/reverse_delete_ipv6`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetIPv6ReverseDNS sets a reverse DNS entry for an IPv6 address of a virtual machine
|
||||
func (c *Client) SetIPv6ReverseDNS(id, ip, entry string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"ip": {ip},
|
||||
"entry": {entry},
|
||||
}
|
||||
|
||||
if err := c.post(`server/reverse_set_ipv6`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DefaultIPv4ReverseDNS sets a reverse DNS entry for an IPv4 address of a virtual machine to the original setting
|
||||
func (c *Client) DefaultIPv4ReverseDNS(id, ip string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"ip": {ip},
|
||||
}
|
||||
|
||||
if err := c.post(`server/reverse_default_ipv4`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetIPv4ReverseDNS sets a reverse DNS entry for an IPv4 address of a virtual machine
|
||||
func (c *Client) SetIPv4ReverseDNS(id, ip, entry string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"ip": {ip},
|
||||
"entry": {entry},
|
||||
}
|
||||
|
||||
if err := c.post(`server/reverse_set_ipv4`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
44
vendor/github.com/JamesClonk/vultr/lib/iso.go
generated
vendored
44
vendor/github.com/JamesClonk/vultr/lib/iso.go
generated
vendored
@@ -1,44 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ISO image on Vultr
|
||||
type ISO struct {
|
||||
ID int `json:"ISOID"`
|
||||
Created string `json:"date_created"`
|
||||
Filename string `json:"filename"`
|
||||
Size int `json:"size"`
|
||||
MD5sum string `json:"md5sum"`
|
||||
}
|
||||
|
||||
type isos []ISO
|
||||
|
||||
func (s isos) Len() int { return len(s) }
|
||||
func (s isos) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s isos) Less(i, j int) bool {
|
||||
// sort order: filename, created
|
||||
if strings.ToLower(s[i].Filename) < strings.ToLower(s[j].Filename) {
|
||||
return true
|
||||
} else if strings.ToLower(s[i].Filename) > strings.ToLower(s[j].Filename) {
|
||||
return false
|
||||
}
|
||||
return s[i].Created < s[j].Created
|
||||
}
|
||||
|
||||
// GetISO returns a list of all ISO images on Vultr account
|
||||
func (c *Client) GetISO() ([]ISO, error) {
|
||||
var isoMap map[string]ISO
|
||||
if err := c.get(`iso/list`, &isoMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var isoList []ISO
|
||||
for _, iso := range isoMap {
|
||||
isoList = append(isoList, iso)
|
||||
}
|
||||
sort.Sort(isos(isoList))
|
||||
return isoList, nil
|
||||
}
|
||||
37
vendor/github.com/JamesClonk/vultr/lib/os.go
generated
vendored
37
vendor/github.com/JamesClonk/vultr/lib/os.go
generated
vendored
@@ -1,37 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// OS image on Vultr
|
||||
type OS struct {
|
||||
ID int `json:"OSID"`
|
||||
Name string `json:"name"`
|
||||
Arch string `json:"arch"`
|
||||
Family string `json:"family"`
|
||||
Windows bool `json:"windows"`
|
||||
Surcharge string `json:"surcharge"`
|
||||
}
|
||||
|
||||
type oses []OS
|
||||
|
||||
func (s oses) Len() int { return len(s) }
|
||||
func (s oses) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s oses) Less(i, j int) bool { return strings.ToLower(s[i].Name) < strings.ToLower(s[j].Name) }
|
||||
|
||||
// GetOS returns a list of all available operating systems on Vultr
|
||||
func (c *Client) GetOS() ([]OS, error) {
|
||||
var osMap map[string]OS
|
||||
if err := c.get(`os/list`, &osMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var osList []OS
|
||||
for _, os := range osMap {
|
||||
osList = append(osList, os)
|
||||
}
|
||||
sort.Sort(oses(osList))
|
||||
return osList, nil
|
||||
}
|
||||
78
vendor/github.com/JamesClonk/vultr/lib/plans.go
generated
vendored
78
vendor/github.com/JamesClonk/vultr/lib/plans.go
generated
vendored
@@ -1,78 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Plan on Vultr
|
||||
type Plan struct {
|
||||
ID int `json:"VPSPLANID,string"`
|
||||
Name string `json:"name"`
|
||||
VCpus int `json:"vcpu_count,string"`
|
||||
RAM string `json:"ram"`
|
||||
Disk string `json:"disk"`
|
||||
Bandwidth string `json:"bandwidth"`
|
||||
Price string `json:"price_per_month"`
|
||||
Regions []int `json:"available_locations"`
|
||||
}
|
||||
|
||||
type plans []Plan
|
||||
|
||||
func (p plans) Len() int { return len(p) }
|
||||
func (p plans) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
||||
func (p plans) Less(i, j int) bool {
|
||||
pa, _ := strconv.ParseFloat(strings.TrimSpace(p[i].Price), 64)
|
||||
pb, _ := strconv.ParseFloat(strings.TrimSpace(p[j].Price), 64)
|
||||
ra, _ := strconv.ParseInt(strings.TrimSpace(p[i].RAM), 10, 64)
|
||||
rb, _ := strconv.ParseInt(strings.TrimSpace(p[j].RAM), 10, 64)
|
||||
da, _ := strconv.ParseInt(strings.TrimSpace(p[i].Disk), 10, 64)
|
||||
db, _ := strconv.ParseInt(strings.TrimSpace(p[j].Disk), 10, 64)
|
||||
|
||||
// sort order: price, vcpu, ram, disk
|
||||
if pa < pb {
|
||||
return true
|
||||
} else if pa > pb {
|
||||
return false
|
||||
}
|
||||
|
||||
if p[i].VCpus < p[j].VCpus {
|
||||
return true
|
||||
} else if p[i].VCpus > p[j].VCpus {
|
||||
return false
|
||||
}
|
||||
|
||||
if ra < rb {
|
||||
return true
|
||||
} else if ra > rb {
|
||||
return false
|
||||
}
|
||||
|
||||
return da < db
|
||||
}
|
||||
|
||||
// GetPlans returns a list of all available plans on Vultr account
|
||||
func (c *Client) GetPlans() ([]Plan, error) {
|
||||
var planMap map[string]Plan
|
||||
if err := c.get(`plans/list`, &planMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var p plans
|
||||
for _, plan := range planMap {
|
||||
p = append(p, plan)
|
||||
}
|
||||
|
||||
sort.Sort(plans(p))
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// GetAvailablePlansForRegion returns available plans for specified region
|
||||
func (c *Client) GetAvailablePlansForRegion(id int) (planIDs []int, err error) {
|
||||
if err := c.get(fmt.Sprintf(`regions/availability?DCID=%v`, id), &planIDs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
44
vendor/github.com/JamesClonk/vultr/lib/regions.go
generated
vendored
44
vendor/github.com/JamesClonk/vultr/lib/regions.go
generated
vendored
@@ -1,44 +0,0 @@
|
||||
package lib
|
||||
|
||||
import "sort"
|
||||
|
||||
// Region on Vultr
|
||||
type Region struct {
|
||||
ID int `json:"DCID,string"`
|
||||
Name string `json:"name"`
|
||||
Country string `json:"country"`
|
||||
Continent string `json:"continent"`
|
||||
State string `json:"state"`
|
||||
Ddos bool `json:"ddos_protection"`
|
||||
BlockStorage bool `json:"block_storage"`
|
||||
Code string `json:"regioncode"`
|
||||
}
|
||||
|
||||
type regions []Region
|
||||
|
||||
func (s regions) Len() int { return len(s) }
|
||||
func (s regions) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s regions) Less(i, j int) bool {
|
||||
// sort order: continent, name
|
||||
if s[i].Continent < s[j].Continent {
|
||||
return true
|
||||
} else if s[i].Continent > s[j].Continent {
|
||||
return false
|
||||
}
|
||||
return s[i].Name < s[j].Name
|
||||
}
|
||||
|
||||
// GetRegions returns a list of all available Vultr regions
|
||||
func (c *Client) GetRegions() ([]Region, error) {
|
||||
var regionMap map[string]Region
|
||||
if err := c.get(`regions/list`, ®ionMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var regionList []Region
|
||||
for _, os := range regionMap {
|
||||
regionList = append(regionList, os)
|
||||
}
|
||||
sort.Sort(regions(regionList))
|
||||
return regionList, nil
|
||||
}
|
||||
192
vendor/github.com/JamesClonk/vultr/lib/reservedip.go
generated
vendored
192
vendor/github.com/JamesClonk/vultr/lib/reservedip.go
generated
vendored
@@ -1,192 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// IP on Vultr
|
||||
type IP struct {
|
||||
ID string `json:"SUBID,string"`
|
||||
RegionID int `json:"DCID,string"`
|
||||
IPType string `json:"ip_type"`
|
||||
Subnet string `json:"subnet"`
|
||||
SubnetSize int `json:"subnet_size"`
|
||||
Label string `json:"label"`
|
||||
AttachedTo string `json:"attached_SUBID,string"`
|
||||
}
|
||||
|
||||
type ips []IP
|
||||
|
||||
func (s ips) Len() int { return len(s) }
|
||||
func (s ips) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s ips) Less(i, j int) bool {
|
||||
// sort order: label, iptype, subnet
|
||||
if strings.ToLower(s[i].Label) < strings.ToLower(s[j].Label) {
|
||||
return true
|
||||
} else if strings.ToLower(s[i].Label) > strings.ToLower(s[j].Label) {
|
||||
return false
|
||||
}
|
||||
if s[i].IPType < s[j].IPType {
|
||||
return true
|
||||
} else if s[i].IPType > s[j].IPType {
|
||||
return false
|
||||
}
|
||||
return s[i].Subnet < s[j].Subnet
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaller on IP.
|
||||
// This is needed because the Vultr API is inconsistent in it's JSON responses.
|
||||
// Some fields can change type, from JSON number to JSON string and vice-versa.
|
||||
func (i *IP) UnmarshalJSON(data []byte) (err error) {
|
||||
if i == nil {
|
||||
*i = IP{}
|
||||
}
|
||||
|
||||
var fields map[string]interface{}
|
||||
if err := json.Unmarshal(data, &fields); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value := fmt.Sprintf("%v", fields["SUBID"])
|
||||
if len(value) == 0 || value == "<nil>" || value == "0" {
|
||||
i.ID = ""
|
||||
} else {
|
||||
id, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
i.ID = strconv.FormatFloat(id, 'f', -1, 64)
|
||||
}
|
||||
|
||||
value = fmt.Sprintf("%v", fields["DCID"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
region, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
i.RegionID = int(region)
|
||||
|
||||
value = fmt.Sprintf("%v", fields["attached_SUBID"])
|
||||
if len(value) == 0 || value == "<nil>" || value == "0" || value == "false" {
|
||||
i.AttachedTo = ""
|
||||
} else {
|
||||
attached, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
i.AttachedTo = strconv.FormatFloat(attached, 'f', -1, 64)
|
||||
}
|
||||
|
||||
value = fmt.Sprintf("%v", fields["subnet_size"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
size, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
i.SubnetSize = int(size)
|
||||
|
||||
i.IPType = fmt.Sprintf("%v", fields["ip_type"])
|
||||
i.Subnet = fmt.Sprintf("%v", fields["subnet"])
|
||||
i.Label = fmt.Sprintf("%v", fields["label"])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// ListReservedIP returns a list of all available reserved IPs on Vultr account
|
||||
func (c *Client) ListReservedIP() ([]IP, error) {
|
||||
var ipMap map[string]IP
|
||||
|
||||
err := c.get(`reservedip/list`, &ipMap)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ipList := make([]IP, 0)
|
||||
for _, ip := range ipMap {
|
||||
ipList = append(ipList, ip)
|
||||
}
|
||||
sort.Sort(ips(ipList))
|
||||
return ipList, nil
|
||||
}
|
||||
|
||||
// GetReservedIP returns reserved IP with given ID
|
||||
func (c *Client) GetReservedIP(id string) (IP, error) {
|
||||
var ipMap map[string]IP
|
||||
|
||||
err := c.get(`reservedip/list`, &ipMap)
|
||||
if err != nil {
|
||||
return IP{}, err
|
||||
}
|
||||
if ip, ok := ipMap[id]; ok {
|
||||
return ip, nil
|
||||
}
|
||||
return IP{}, fmt.Errorf("IP with ID %v not found", id)
|
||||
}
|
||||
|
||||
// CreateReservedIP creates a new reserved IP on Vultr account
|
||||
func (c *Client) CreateReservedIP(regionID int, ipType string, label string) (string, error) {
|
||||
values := url.Values{
|
||||
"DCID": {fmt.Sprintf("%v", regionID)},
|
||||
"ip_type": {ipType},
|
||||
}
|
||||
if len(label) > 0 {
|
||||
values.Add("label", label)
|
||||
}
|
||||
|
||||
result := IP{}
|
||||
err := c.post(`reservedip/create`, values, &result)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return result.ID, nil
|
||||
}
|
||||
|
||||
// DestroyReservedIP deletes an existing reserved IP
|
||||
func (c *Client) DestroyReservedIP(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
return c.post(`reservedip/destroy`, values, nil)
|
||||
}
|
||||
|
||||
// AttachReservedIP attaches a reserved IP to a virtual machine
|
||||
func (c *Client) AttachReservedIP(ip string, serverID string) error {
|
||||
values := url.Values{
|
||||
"ip_address": {ip},
|
||||
"attach_SUBID": {serverID},
|
||||
}
|
||||
return c.post(`reservedip/attach`, values, nil)
|
||||
}
|
||||
|
||||
// DetachReservedIP detaches a reserved IP from an existing virtual machine
|
||||
func (c *Client) DetachReservedIP(serverID string, ip string) error {
|
||||
values := url.Values{
|
||||
"ip_address": {ip},
|
||||
"detach_SUBID": {serverID},
|
||||
}
|
||||
return c.post(`reservedip/detach`, values, nil)
|
||||
}
|
||||
|
||||
// ConvertReservedIP converts an existing virtual machines IP to a reserved IP
|
||||
func (c *Client) ConvertReservedIP(serverID string, ip string) (string, error) {
|
||||
values := url.Values{
|
||||
"SUBID": {serverID},
|
||||
"ip_address": {ip},
|
||||
}
|
||||
|
||||
result := IP{}
|
||||
err := c.post(`reservedip/convert`, values, &result)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return result.ID, err
|
||||
}
|
||||
126
vendor/github.com/JamesClonk/vultr/lib/scripts.go
generated
vendored
126
vendor/github.com/JamesClonk/vultr/lib/scripts.go
generated
vendored
@@ -1,126 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// StartupScript on Vultr account
|
||||
type StartupScript struct {
|
||||
ID string `json:"SCRIPTID"`
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
Content string `json:"script"`
|
||||
}
|
||||
|
||||
type startupscripts []StartupScript
|
||||
|
||||
func (s startupscripts) Len() int { return len(s) }
|
||||
func (s startupscripts) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s startupscripts) Less(i, j int) bool {
|
||||
return strings.ToLower(s[i].Name) < strings.ToLower(s[j].Name)
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaller on StartupScript.
|
||||
// Necessary because the SCRIPTID field has inconsistent types.
|
||||
func (s *StartupScript) UnmarshalJSON(data []byte) (err error) {
|
||||
if s == nil {
|
||||
*s = StartupScript{}
|
||||
}
|
||||
|
||||
var fields map[string]interface{}
|
||||
if err := json.Unmarshal(data, &fields); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s.ID = fmt.Sprintf("%v", fields["SCRIPTID"])
|
||||
s.Name = fmt.Sprintf("%v", fields["name"])
|
||||
s.Type = fmt.Sprintf("%v", fields["type"])
|
||||
s.Content = fmt.Sprintf("%v", fields["script"])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// GetStartupScripts returns a list of all startup scripts on the current Vultr account
|
||||
func (c *Client) GetStartupScripts() (scripts []StartupScript, err error) {
|
||||
var scriptMap map[string]StartupScript
|
||||
if err := c.get(`startupscript/list`, &scriptMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, script := range scriptMap {
|
||||
if script.Type == "" {
|
||||
script.Type = "boot" // set default script type
|
||||
}
|
||||
scripts = append(scripts, script)
|
||||
}
|
||||
sort.Sort(startupscripts(scripts))
|
||||
return scripts, nil
|
||||
}
|
||||
|
||||
// GetStartupScript returns the startup script with the given ID
|
||||
func (c *Client) GetStartupScript(id string) (StartupScript, error) {
|
||||
scripts, err := c.GetStartupScripts()
|
||||
if err != nil {
|
||||
return StartupScript{}, err
|
||||
}
|
||||
|
||||
for _, s := range scripts {
|
||||
if s.ID == id {
|
||||
return s, nil
|
||||
}
|
||||
}
|
||||
return StartupScript{}, nil
|
||||
}
|
||||
|
||||
// CreateStartupScript creates a new startup script
|
||||
func (c *Client) CreateStartupScript(name, content, scriptType string) (StartupScript, error) {
|
||||
values := url.Values{
|
||||
"name": {name},
|
||||
"script": {content},
|
||||
"type": {scriptType},
|
||||
}
|
||||
|
||||
var script StartupScript
|
||||
if err := c.post(`startupscript/create`, values, &script); err != nil {
|
||||
return StartupScript{}, err
|
||||
}
|
||||
script.Name = name
|
||||
script.Content = content
|
||||
script.Type = scriptType
|
||||
|
||||
return script, nil
|
||||
}
|
||||
|
||||
// UpdateStartupScript updates an existing startup script
|
||||
func (c *Client) UpdateStartupScript(script StartupScript) error {
|
||||
values := url.Values{
|
||||
"SCRIPTID": {script.ID},
|
||||
}
|
||||
if script.Name != "" {
|
||||
values.Add("name", script.Name)
|
||||
}
|
||||
if script.Content != "" {
|
||||
values.Add("script", script.Content)
|
||||
}
|
||||
|
||||
if err := c.post(`startupscript/update`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteStartupScript deletes an existing startup script from Vultr account
|
||||
func (c *Client) DeleteStartupScript(id string) error {
|
||||
values := url.Values{
|
||||
"SCRIPTID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`startupscript/destroy`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
561
vendor/github.com/JamesClonk/vultr/lib/servers.go
generated
vendored
561
vendor/github.com/JamesClonk/vultr/lib/servers.go
generated
vendored
@@ -1,561 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Server (virtual machine) on Vultr account
|
||||
type Server struct {
|
||||
ID string `json:"SUBID"`
|
||||
Name string `json:"label"`
|
||||
OS string `json:"os"`
|
||||
RAM string `json:"ram"`
|
||||
Disk string `json:"disk"`
|
||||
MainIP string `json:"main_ip"`
|
||||
VCpus int `json:"vcpu_count,string"`
|
||||
Location string `json:"location"`
|
||||
RegionID int `json:"DCID,string"`
|
||||
DefaultPassword string `json:"default_password"`
|
||||
Created string `json:"date_created"`
|
||||
PendingCharges float64 `json:"pending_charges"`
|
||||
Status string `json:"status"`
|
||||
Cost string `json:"cost_per_month"`
|
||||
CurrentBandwidth float64 `json:"current_bandwidth_gb"`
|
||||
AllowedBandwidth float64 `json:"allowed_bandwidth_gb,string"`
|
||||
NetmaskV4 string `json:"netmask_v4"`
|
||||
GatewayV4 string `json:"gateway_v4"`
|
||||
PowerStatus string `json:"power_status"`
|
||||
ServerState string `json:"server_state"`
|
||||
PlanID int `json:"VPSPLANID,string"`
|
||||
V6Networks []V6Network `json:"v6_networks"`
|
||||
InternalIP string `json:"internal_ip"`
|
||||
KVMUrl string `json:"kvm_url"`
|
||||
AutoBackups string `json:"auto_backups"`
|
||||
Tag string `json:"tag"`
|
||||
OSID string `json:"OSID"`
|
||||
AppID string `json:"APPID"`
|
||||
FirewallGroupID string `json:"FIREWALLGROUPID"`
|
||||
}
|
||||
|
||||
// ServerOptions are optional parameters to be used during server creation
|
||||
type ServerOptions struct {
|
||||
IPXEChainURL string
|
||||
ISO int
|
||||
Script int
|
||||
UserData string
|
||||
Snapshot string
|
||||
SSHKey string
|
||||
ReservedIP string
|
||||
IPV6 bool
|
||||
PrivateNetworking bool
|
||||
AutoBackups bool
|
||||
DontNotifyOnActivate bool
|
||||
Hostname string
|
||||
Tag string
|
||||
AppID string
|
||||
FirewallGroupID string
|
||||
}
|
||||
|
||||
type servers []Server
|
||||
|
||||
func (s servers) Len() int { return len(s) }
|
||||
func (s servers) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s servers) Less(i, j int) bool {
|
||||
// sort order: name, ip
|
||||
if strings.ToLower(s[i].Name) < strings.ToLower(s[j].Name) {
|
||||
return true
|
||||
} else if strings.ToLower(s[i].Name) > strings.ToLower(s[j].Name) {
|
||||
return false
|
||||
}
|
||||
return s[i].MainIP < s[j].MainIP
|
||||
}
|
||||
|
||||
// V6Network represents a IPv6 network of a Vultr server
|
||||
type V6Network struct {
|
||||
Network string `json:"v6_network"`
|
||||
MainIP string `json:"v6_main_ip"`
|
||||
NetworkSize string `json:"v6_network_size"`
|
||||
}
|
||||
|
||||
// ISOStatus represents an ISO image attached to a Vultr server
|
||||
type ISOStatus struct {
|
||||
State string `json:"state"`
|
||||
ISOID string `json:"ISOID"`
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaller on Server.
|
||||
// This is needed because the Vultr API is inconsistent in it's JSON responses for servers.
|
||||
// Some fields can change type, from JSON number to JSON string and vice-versa.
|
||||
func (s *Server) UnmarshalJSON(data []byte) (err error) {
|
||||
if s == nil {
|
||||
*s = Server{}
|
||||
}
|
||||
|
||||
var fields map[string]interface{}
|
||||
if err := json.Unmarshal(data, &fields); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value := fmt.Sprintf("%v", fields["vcpu_count"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
vcpu, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.VCpus = int(vcpu)
|
||||
|
||||
value = fmt.Sprintf("%v", fields["DCID"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
region, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.RegionID = int(region)
|
||||
|
||||
value = fmt.Sprintf("%v", fields["VPSPLANID"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
plan, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.PlanID = int(plan)
|
||||
|
||||
value = fmt.Sprintf("%v", fields["pending_charges"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
pc, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.PendingCharges = pc
|
||||
|
||||
value = fmt.Sprintf("%v", fields["current_bandwidth_gb"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
cb, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.CurrentBandwidth = cb
|
||||
|
||||
value = fmt.Sprintf("%v", fields["allowed_bandwidth_gb"])
|
||||
if len(value) == 0 || value == "<nil>" {
|
||||
value = "0"
|
||||
}
|
||||
ab, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.AllowedBandwidth = ab
|
||||
|
||||
value = fmt.Sprintf("%v", fields["OSID"])
|
||||
if value == "<nil>" {
|
||||
value = ""
|
||||
}
|
||||
s.OSID = value
|
||||
|
||||
value = fmt.Sprintf("%v", fields["APPID"])
|
||||
if value == "<nil>" || value == "0" {
|
||||
value = ""
|
||||
}
|
||||
s.AppID = value
|
||||
|
||||
value = fmt.Sprintf("%v", fields["FIREWALLGROUPID"])
|
||||
if value == "<nil>" || value == "0" {
|
||||
value = ""
|
||||
}
|
||||
s.FirewallGroupID = value
|
||||
|
||||
s.ID = fmt.Sprintf("%v", fields["SUBID"])
|
||||
s.Name = fmt.Sprintf("%v", fields["label"])
|
||||
s.OS = fmt.Sprintf("%v", fields["os"])
|
||||
s.RAM = fmt.Sprintf("%v", fields["ram"])
|
||||
s.Disk = fmt.Sprintf("%v", fields["disk"])
|
||||
s.MainIP = fmt.Sprintf("%v", fields["main_ip"])
|
||||
s.Location = fmt.Sprintf("%v", fields["location"])
|
||||
s.DefaultPassword = fmt.Sprintf("%v", fields["default_password"])
|
||||
s.Created = fmt.Sprintf("%v", fields["date_created"])
|
||||
s.Status = fmt.Sprintf("%v", fields["status"])
|
||||
s.Cost = fmt.Sprintf("%v", fields["cost_per_month"])
|
||||
s.NetmaskV4 = fmt.Sprintf("%v", fields["netmask_v4"])
|
||||
s.GatewayV4 = fmt.Sprintf("%v", fields["gateway_v4"])
|
||||
s.PowerStatus = fmt.Sprintf("%v", fields["power_status"])
|
||||
s.ServerState = fmt.Sprintf("%v", fields["server_state"])
|
||||
|
||||
v6networks := make([]V6Network, 0)
|
||||
if networks, ok := fields["v6_networks"].([]interface{}); ok {
|
||||
for _, network := range networks {
|
||||
if network, ok := network.(map[string]interface{}); ok {
|
||||
v6network := V6Network{
|
||||
Network: fmt.Sprintf("%v", network["v6_network"]),
|
||||
MainIP: fmt.Sprintf("%v", network["v6_main_ip"]),
|
||||
NetworkSize: fmt.Sprintf("%v", network["v6_network_size"]),
|
||||
}
|
||||
v6networks = append(v6networks, v6network)
|
||||
}
|
||||
}
|
||||
s.V6Networks = v6networks
|
||||
}
|
||||
|
||||
s.InternalIP = fmt.Sprintf("%v", fields["internal_ip"])
|
||||
s.KVMUrl = fmt.Sprintf("%v", fields["kvm_url"])
|
||||
s.AutoBackups = fmt.Sprintf("%v", fields["auto_backups"])
|
||||
s.Tag = fmt.Sprintf("%v", fields["tag"])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// GetServers returns a list of current virtual machines on Vultr account
|
||||
func (c *Client) GetServers() (serverList []Server, err error) {
|
||||
var serverMap map[string]Server
|
||||
if err := c.get(`server/list`, &serverMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, server := range serverMap {
|
||||
serverList = append(serverList, server)
|
||||
}
|
||||
sort.Sort(servers(serverList))
|
||||
return serverList, nil
|
||||
}
|
||||
|
||||
// GetServersByTag returns a list of all virtual machines matching by tag
|
||||
func (c *Client) GetServersByTag(tag string) (serverList []Server, err error) {
|
||||
var serverMap map[string]Server
|
||||
if err := c.get(`server/list?tag=`+tag, &serverMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, server := range serverMap {
|
||||
serverList = append(serverList, server)
|
||||
}
|
||||
sort.Sort(servers(serverList))
|
||||
return serverList, nil
|
||||
}
|
||||
|
||||
// GetServer returns the virtual machine with the given ID
|
||||
func (c *Client) GetServer(id string) (server Server, err error) {
|
||||
if err := c.get(`server/list?SUBID=`+id, &server); err != nil {
|
||||
return Server{}, err
|
||||
}
|
||||
return server, nil
|
||||
}
|
||||
|
||||
// CreateServer creates a new virtual machine on Vultr. ServerOptions are optional settings.
|
||||
func (c *Client) CreateServer(name string, regionID, planID, osID int, options *ServerOptions) (Server, error) {
|
||||
values := url.Values{
|
||||
"label": {name},
|
||||
"DCID": {fmt.Sprintf("%v", regionID)},
|
||||
"VPSPLANID": {fmt.Sprintf("%v", planID)},
|
||||
"OSID": {fmt.Sprintf("%v", osID)},
|
||||
}
|
||||
|
||||
if options != nil {
|
||||
if options.IPXEChainURL != "" {
|
||||
values.Add("ipxe_chain_url", options.IPXEChainURL)
|
||||
}
|
||||
|
||||
if options.ISO != 0 {
|
||||
values.Add("ISOID", fmt.Sprintf("%v", options.ISO))
|
||||
}
|
||||
|
||||
if options.Script != 0 {
|
||||
values.Add("SCRIPTID", fmt.Sprintf("%v", options.Script))
|
||||
}
|
||||
|
||||
if options.UserData != "" {
|
||||
values.Add("userdata", base64.StdEncoding.EncodeToString([]byte(options.UserData)))
|
||||
}
|
||||
|
||||
if options.Snapshot != "" {
|
||||
values.Add("SNAPSHOTID", options.Snapshot)
|
||||
}
|
||||
|
||||
if options.SSHKey != "" {
|
||||
values.Add("SSHKEYID", options.SSHKey)
|
||||
}
|
||||
|
||||
if options.ReservedIP != "" {
|
||||
values.Add("reserved_ip_v4", options.ReservedIP)
|
||||
}
|
||||
|
||||
values.Add("enable_ipv6", "no")
|
||||
if options.IPV6 {
|
||||
values.Set("enable_ipv6", "yes")
|
||||
}
|
||||
|
||||
values.Add("enable_private_network", "no")
|
||||
if options.PrivateNetworking {
|
||||
values.Set("enable_private_network", "yes")
|
||||
}
|
||||
|
||||
values.Add("auto_backups", "no")
|
||||
if options.AutoBackups {
|
||||
values.Set("auto_backups", "yes")
|
||||
}
|
||||
|
||||
values.Add("notify_activate", "yes")
|
||||
if options.DontNotifyOnActivate {
|
||||
values.Set("notify_activate", "no")
|
||||
}
|
||||
|
||||
if options.Hostname != "" {
|
||||
values.Add("hostname", options.Hostname)
|
||||
}
|
||||
|
||||
if options.Tag != "" {
|
||||
values.Add("tag", options.Tag)
|
||||
}
|
||||
|
||||
if options.AppID != "" {
|
||||
values.Add("APPID", options.AppID)
|
||||
}
|
||||
|
||||
if options.FirewallGroupID != "" {
|
||||
values.Add("FIREWALLGROUPID", options.FirewallGroupID)
|
||||
}
|
||||
}
|
||||
|
||||
var server Server
|
||||
if err := c.post(`server/create`, values, &server); err != nil {
|
||||
return Server{}, err
|
||||
}
|
||||
server.Name = name
|
||||
server.RegionID = regionID
|
||||
server.PlanID = planID
|
||||
|
||||
return server, nil
|
||||
}
|
||||
|
||||
// RenameServer renames an existing virtual machine
|
||||
func (c *Client) RenameServer(id, name string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"label": {name},
|
||||
}
|
||||
|
||||
if err := c.post(`server/label_set`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// TagServer replaces the tag on an existing virtual machine
|
||||
func (c *Client) TagServer(id, tag string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"tag": {tag},
|
||||
}
|
||||
|
||||
if err := c.post(`server/tag_set`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// StartServer starts an existing virtual machine
|
||||
func (c *Client) StartServer(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`server/start`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// HaltServer stops an existing virtual machine
|
||||
func (c *Client) HaltServer(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`server/halt`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RebootServer reboots an existing virtual machine
|
||||
func (c *Client) RebootServer(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`server/reboot`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReinstallServer reinstalls the operating system on an existing virtual machine
|
||||
func (c *Client) ReinstallServer(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`server/reinstall`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ChangeOSofServer changes the virtual machine to a different operating system
|
||||
func (c *Client) ChangeOSofServer(id string, osID int) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"OSID": {fmt.Sprintf("%v", osID)},
|
||||
}
|
||||
|
||||
if err := c.post(`server/os_change`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ListOSforServer lists all available operating systems to which an existing virtual machine can be changed
|
||||
func (c *Client) ListOSforServer(id string) (os []OS, err error) {
|
||||
var osMap map[string]OS
|
||||
if err := c.get(`server/os_change_list?SUBID=`+id, &osMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, o := range osMap {
|
||||
os = append(os, o)
|
||||
}
|
||||
sort.Sort(oses(os))
|
||||
return os, nil
|
||||
}
|
||||
|
||||
// AttachISOtoServer attaches an ISO image to an existing virtual machine and reboots it
|
||||
func (c *Client) AttachISOtoServer(id string, isoID int) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"ISOID": {fmt.Sprintf("%v", isoID)},
|
||||
}
|
||||
|
||||
if err := c.post(`server/iso_attach`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DetachISOfromServer detaches the currently mounted ISO image from the virtual machine and reboots it
|
||||
func (c *Client) DetachISOfromServer(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`server/iso_detach`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetISOStatusofServer retrieves the current ISO image state of an existing virtual machine
|
||||
func (c *Client) GetISOStatusofServer(id string) (isoStatus ISOStatus, err error) {
|
||||
if err := c.get(`server/iso_status?SUBID=`+id, &isoStatus); err != nil {
|
||||
return ISOStatus{}, err
|
||||
}
|
||||
return isoStatus, nil
|
||||
}
|
||||
|
||||
// DeleteServer deletes an existing virtual machine
|
||||
func (c *Client) DeleteServer(id string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`server/destroy`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetFirewallGroup adds a virtual machine to a firewall group
|
||||
func (c *Client) SetFirewallGroup(id, firewallgroup string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"FIREWALLGROUPID": {firewallgroup},
|
||||
}
|
||||
|
||||
if err := c.post(`server/firewall_group_set`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnsetFirewallGroup removes a virtual machine from a firewall group
|
||||
func (c *Client) UnsetFirewallGroup(id string) error {
|
||||
return c.SetFirewallGroup(id, "0")
|
||||
}
|
||||
|
||||
// BandwidthOfServer retrieves the bandwidth used by a virtual machine
|
||||
func (c *Client) BandwidthOfServer(id string) (bandwidth []map[string]string, err error) {
|
||||
var bandwidthMap map[string][][]string
|
||||
if err := c.get(`server/bandwidth?SUBID=`+id, &bandwidthMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// parse incoming bytes
|
||||
for _, b := range bandwidthMap["incoming_bytes"] {
|
||||
bMap := make(map[string]string)
|
||||
bMap["date"] = b[0]
|
||||
bMap["incoming"] = b[1]
|
||||
bandwidth = append(bandwidth, bMap)
|
||||
}
|
||||
|
||||
// parse outgoing bytes (we'll assume that incoming and outgoing dates are always a match)
|
||||
for _, b := range bandwidthMap["outgoing_bytes"] {
|
||||
for i := range bandwidth {
|
||||
if bandwidth[i]["date"] == b[0] {
|
||||
bandwidth[i]["outgoing"] = b[1]
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bandwidth, nil
|
||||
}
|
||||
|
||||
// ChangeApplicationofServer changes the virtual machine to a different application
|
||||
func (c *Client) ChangeApplicationofServer(id string, appID string) error {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"APPID": {appID},
|
||||
}
|
||||
|
||||
if err := c.post(`server/app_change`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ListApplicationsforServer lists all available operating systems to which an existing virtual machine can be changed
|
||||
func (c *Client) ListApplicationsforServer(id string) (apps []Application, err error) {
|
||||
var appMap map[string]Application
|
||||
if err := c.get(`server/app_change_list?SUBID=`+id, &appMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, app := range appMap {
|
||||
apps = append(apps, app)
|
||||
}
|
||||
sort.Sort(applications(apps))
|
||||
return apps, nil
|
||||
}
|
||||
72
vendor/github.com/JamesClonk/vultr/lib/snapshots.go
generated
vendored
72
vendor/github.com/JamesClonk/vultr/lib/snapshots.go
generated
vendored
@@ -1,72 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Snapshot of a virtual machine on Vultr account
|
||||
type Snapshot struct {
|
||||
ID string `json:"SNAPSHOTID"`
|
||||
Description string `json:"description"`
|
||||
Size string `json:"size"`
|
||||
Status string `json:"status"`
|
||||
Created string `json:"date_created"`
|
||||
}
|
||||
|
||||
type snapshots []Snapshot
|
||||
|
||||
func (s snapshots) Len() int { return len(s) }
|
||||
func (s snapshots) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s snapshots) Less(i, j int) bool {
|
||||
// sort order: description, created
|
||||
if strings.ToLower(s[i].Description) < strings.ToLower(s[j].Description) {
|
||||
return true
|
||||
} else if strings.ToLower(s[i].Description) > strings.ToLower(s[j].Description) {
|
||||
return false
|
||||
}
|
||||
return s[i].Created < s[j].Created
|
||||
}
|
||||
|
||||
// GetSnapshots retrieves a list of all snapshots on Vultr account
|
||||
func (c *Client) GetSnapshots() (snapshotList []Snapshot, err error) {
|
||||
var snapshotMap map[string]Snapshot
|
||||
if err := c.get(`snapshot/list`, &snapshotMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, snapshot := range snapshotMap {
|
||||
snapshotList = append(snapshotList, snapshot)
|
||||
}
|
||||
sort.Sort(snapshots(snapshotList))
|
||||
return snapshotList, nil
|
||||
}
|
||||
|
||||
// CreateSnapshot creates a new virtual machine snapshot
|
||||
func (c *Client) CreateSnapshot(id, description string) (Snapshot, error) {
|
||||
values := url.Values{
|
||||
"SUBID": {id},
|
||||
"description": {description},
|
||||
}
|
||||
|
||||
var snapshot Snapshot
|
||||
if err := c.post(`snapshot/create`, values, &snapshot); err != nil {
|
||||
return Snapshot{}, err
|
||||
}
|
||||
snapshot.Description = description
|
||||
|
||||
return snapshot, nil
|
||||
}
|
||||
|
||||
// DeleteSnapshot deletes an existing virtual machine snapshot
|
||||
func (c *Client) DeleteSnapshot(id string) error {
|
||||
values := url.Values{
|
||||
"SNAPSHOTID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`snapshot/destroy`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
82
vendor/github.com/JamesClonk/vultr/lib/sshkeys.go
generated
vendored
82
vendor/github.com/JamesClonk/vultr/lib/sshkeys.go
generated
vendored
@@ -1,82 +0,0 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// SSHKey on Vultr account
|
||||
type SSHKey struct {
|
||||
ID string `json:"SSHKEYID"`
|
||||
Name string `json:"name"`
|
||||
Key string `json:"ssh_key"`
|
||||
Created string `json:"date_created"`
|
||||
}
|
||||
|
||||
type sshkeys []SSHKey
|
||||
|
||||
func (s sshkeys) Len() int { return len(s) }
|
||||
func (s sshkeys) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||
func (s sshkeys) Less(i, j int) bool { return strings.ToLower(s[i].Name) < strings.ToLower(s[j].Name) }
|
||||
|
||||
// GetSSHKeys returns a list of SSHKeys from Vultr account
|
||||
func (c *Client) GetSSHKeys() (keys []SSHKey, err error) {
|
||||
var keyMap map[string]SSHKey
|
||||
if err := c.get(`sshkey/list`, &keyMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, key := range keyMap {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
sort.Sort(sshkeys(keys))
|
||||
return keys, nil
|
||||
}
|
||||
|
||||
// CreateSSHKey creates new SSHKey on Vultr
|
||||
func (c *Client) CreateSSHKey(name, key string) (SSHKey, error) {
|
||||
values := url.Values{
|
||||
"name": {name},
|
||||
"ssh_key": {key},
|
||||
}
|
||||
|
||||
var sshKey SSHKey
|
||||
if err := c.post(`sshkey/create`, values, &sshKey); err != nil {
|
||||
return SSHKey{}, err
|
||||
}
|
||||
sshKey.Name = name
|
||||
sshKey.Key = key
|
||||
|
||||
return sshKey, nil
|
||||
}
|
||||
|
||||
// UpdateSSHKey updates an existing SSHKey entry
|
||||
func (c *Client) UpdateSSHKey(key SSHKey) error {
|
||||
values := url.Values{
|
||||
"SSHKEYID": {key.ID},
|
||||
}
|
||||
if key.Name != "" {
|
||||
values.Add("name", key.Name)
|
||||
}
|
||||
if key.Key != "" {
|
||||
values.Add("ssh_key", key.Key)
|
||||
}
|
||||
|
||||
if err := c.post(`sshkey/update`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteSSHKey deletes an existing SSHKey from Vultr account
|
||||
func (c *Client) DeleteSSHKey(id string) error {
|
||||
values := url.Values{
|
||||
"SSHKEYID": {id},
|
||||
}
|
||||
|
||||
if err := c.post(`sshkey/destroy`, values, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
21
vendor/github.com/akamai/AkamaiOPEN-edgegrid-golang/edgegrid/signer.go
generated
vendored
21
vendor/github.com/akamai/AkamaiOPEN-edgegrid-golang/edgegrid/signer.go
generated
vendored
@@ -9,6 +9,7 @@ import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -32,6 +33,26 @@ func AddRequestHeader(config Config, req *http.Request) *http.Request {
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
}
|
||||
|
||||
_, AkamaiCliEnvOK := os.LookupEnv("AKAMAI_CLI")
|
||||
AkamaiCliVersionEnv, AkamaiCliVersionEnvOK := os.LookupEnv("AKAMAI_CLI_VERSION")
|
||||
AkamaiCliCommandEnv, AkamaiCliCommandEnvOK := os.LookupEnv("AKAMAI_CLI_COMMAND")
|
||||
AkamaiCliCommandVersionEnv, AkamaiCliCommandVersionEnvOK := os.LookupEnv("AKAMAI_CLI_COMMAND_VERSION")
|
||||
|
||||
if AkamaiCliEnvOK && AkamaiCliVersionEnvOK {
|
||||
if req.Header.Get("User-Agent") != "" {
|
||||
req.Header.Set("User-Agent", req.Header.Get("User-Agent")+" AkamaiCLI/"+AkamaiCliVersionEnv)
|
||||
} else {
|
||||
req.Header.Set("User-Agent", "AkamaiCLI/"+AkamaiCliVersionEnv)
|
||||
}
|
||||
}
|
||||
if AkamaiCliCommandEnvOK && AkamaiCliCommandVersionEnvOK {
|
||||
if req.Header.Get("User-Agent") != "" {
|
||||
req.Header.Set("User-Agent", req.Header.Get("User-Agent")+" AkamaiCLI-"+AkamaiCliCommandEnv+"/"+AkamaiCliCommandVersionEnv)
|
||||
} else {
|
||||
req.Header.Set("User-Agent", "AkamaiCLI-"+AkamaiCliCommandEnv+"/"+AkamaiCliCommandVersionEnv)
|
||||
}
|
||||
}
|
||||
|
||||
req.Header.Set("Authorization", createAuthHeader(config, req, timestamp, nonce))
|
||||
return req
|
||||
}
|
||||
|
||||
249
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/api_timeout.go
generated
vendored
Normal file
249
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/api_timeout.go
generated
vendored
Normal file
@@ -0,0 +1,249 @@
|
||||
package sdk
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var apiTimeouts = `{
|
||||
"ecs": {
|
||||
"ActivateRouterInterface": 10,
|
||||
"AddTags": 61,
|
||||
"AllocateDedicatedHosts": 10,
|
||||
"AllocateEipAddress": 17,
|
||||
"AllocatePublicIpAddress": 36,
|
||||
"ApplyAutoSnapshotPolicy": 10,
|
||||
"AssignIpv6Addresses": 10,
|
||||
"AssignPrivateIpAddresses": 10,
|
||||
"AssociateEipAddress": 17,
|
||||
"AttachClassicLinkVpc": 14,
|
||||
"AttachDisk": 36,
|
||||
"AttachInstanceRamRole": 11,
|
||||
"AttachKeyPair": 16,
|
||||
"AttachNetworkInterface": 16,
|
||||
"AuthorizeSecurityGroupEgress": 16,
|
||||
"AuthorizeSecurityGroup": 16,
|
||||
"CancelAutoSnapshotPolicy": 10,
|
||||
"CancelCopyImage": 10,
|
||||
"CancelPhysicalConnection": 10,
|
||||
"CancelSimulatedSystemEvents": 10,
|
||||
"CancelTask": 10,
|
||||
"ConnectRouterInterface": 10,
|
||||
"ConvertNatPublicIpToEip": 12,
|
||||
"CopyImage": 10,
|
||||
"CreateAutoSnapshotPolicy": 10,
|
||||
"CreateCommand": 16,
|
||||
"CreateDeploymentSet": 16,
|
||||
"CreateDisk": 36,
|
||||
"CreateHpcCluster": 10,
|
||||
"CreateImage": 36,
|
||||
"CreateInstance": 86,
|
||||
"CreateKeyPair": 10,
|
||||
"CreateLaunchTemplate": 10,
|
||||
"CreateLaunchTemplateVersion": 10,
|
||||
"CreateNatGateway": 36,
|
||||
"CreateNetworkInterfacePermission": 13,
|
||||
"CreateNetworkInterface": 16,
|
||||
"CreatePhysicalConnection": 10,
|
||||
"CreateRouteEntry": 17,
|
||||
"CreateRouterInterface": 10,
|
||||
"CreateSecurityGroup": 86,
|
||||
"CreateSimulatedSystemEvents": 10,
|
||||
"CreateSnapshot": 86,
|
||||
"CreateVirtualBorderRouter": 10,
|
||||
"CreateVpc": 16,
|
||||
"CreateVSwitch": 17,
|
||||
"DeactivateRouterInterface": 10,
|
||||
"DeleteAutoSnapshotPolicy": 10,
|
||||
"DeleteBandwidthPackage": 10,
|
||||
"DeleteCommand": 16,
|
||||
"DeleteDeploymentSet": 12,
|
||||
"DeleteDisk": 16,
|
||||
"DeleteHpcCluster": 10,
|
||||
"DeleteImage": 36,
|
||||
"DeleteInstance": 66,
|
||||
"DeleteKeyPairs": 10,
|
||||
"DeleteLaunchTemplate": 10,
|
||||
"DeleteLaunchTemplateVersion": 10,
|
||||
"DeleteNatGateway": 10,
|
||||
"DeleteNetworkInterfacePermission": 10,
|
||||
"DeleteNetworkInterface": 16,
|
||||
"DeletePhysicalConnection": 10,
|
||||
"DeleteRouteEntry": 16,
|
||||
"DeleteRouterInterface": 10,
|
||||
"DeleteSecurityGroup": 87,
|
||||
"DeleteSnapshot": 17,
|
||||
"DeleteVirtualBorderRouter": 10,
|
||||
"DeleteVpc": 17,
|
||||
"DeleteVSwitch": 17,
|
||||
"DescribeAccessPoints": 10,
|
||||
"DescribeAccountAttributes": 10,
|
||||
"DescribeAutoSnapshotPolicyEx": 16,
|
||||
"DescribeAvailableResource": 10,
|
||||
"DescribeBandwidthLimitation": 16,
|
||||
"DescribeBandwidthPackages": 10,
|
||||
"DescribeClassicLinkInstances": 15,
|
||||
"DescribeCloudAssistantStatus": 16,
|
||||
"DescribeClusters": 10,
|
||||
"DescribeCommands": 16,
|
||||
"DescribeDedicatedHosts": 10,
|
||||
"DescribeDedicatedHostTypes": 10,
|
||||
"DescribeDeploymentSets": 26,
|
||||
"DescribeDiskMonitorData": 16,
|
||||
"DescribeDisksFullStatus": 14,
|
||||
"DescribeDisks": 19,
|
||||
"DescribeEipAddresses": 16,
|
||||
"DescribeEipMonitorData": 16,
|
||||
"DescribeEniMonitorData": 10,
|
||||
"DescribeHaVips": 10,
|
||||
"DescribeHpcClusters": 16,
|
||||
"DescribeImageSharePermission": 10,
|
||||
"DescribeImages": 38,
|
||||
"DescribeImageSupportInstanceTypes": 16,
|
||||
"DescribeInstanceAttribute": 36,
|
||||
"DescribeInstanceAutoRenewAttribute": 17,
|
||||
"DescribeInstanceHistoryEvents": 19,
|
||||
"DescribeInstanceMonitorData": 19,
|
||||
"DescribeInstancePhysicalAttribute": 10,
|
||||
"DescribeInstanceRamRole": 11,
|
||||
"DescribeInstancesFullStatus": 14,
|
||||
"DescribeInstances": 10,
|
||||
"DescribeInstanceStatus": 26,
|
||||
"DescribeInstanceTopology": 12,
|
||||
"DescribeInstanceTypeFamilies": 17,
|
||||
"DescribeInstanceTypes": 17,
|
||||
"DescribeInstanceVncPasswd": 10,
|
||||
"DescribeInstanceVncUrl": 36,
|
||||
"DescribeInvocationResults": 16,
|
||||
"DescribeInvocations": 16,
|
||||
"DescribeKeyPairs": 12,
|
||||
"DescribeLaunchTemplates": 16,
|
||||
"DescribeLaunchTemplateVersions": 16,
|
||||
"DescribeLimitation": 36,
|
||||
"DescribeNatGateways": 10,
|
||||
"DescribeNetworkInterfacePermissions": 13,
|
||||
"DescribeNetworkInterfaces": 16,
|
||||
"DescribeNewProjectEipMonitorData": 16,
|
||||
"DescribePhysicalConnections": 10,
|
||||
"DescribePrice": 16,
|
||||
"DescribeRecommendInstanceType": 10,
|
||||
"DescribeRegions": 19,
|
||||
"DescribeRenewalPrice": 16,
|
||||
"DescribeResourceByTags": 10,
|
||||
"DescribeResourcesModification": 17,
|
||||
"DescribeRouterInterfaces": 10,
|
||||
"DescribeRouteTables": 17,
|
||||
"DescribeSecurityGroupAttribute": 133,
|
||||
"DescribeSecurityGroupReferences": 16,
|
||||
"DescribeSecurityGroups": 25,
|
||||
"DescribeSnapshotLinks": 17,
|
||||
"DescribeSnapshotMonitorData": 12,
|
||||
"DescribeSnapshotPackage": 10,
|
||||
"DescribeSnapshots": 26,
|
||||
"DescribeSnapshotsUsage": 26,
|
||||
"DescribeSpotPriceHistory": 22,
|
||||
"DescribeTags": 17,
|
||||
"DescribeTaskAttribute": 10,
|
||||
"DescribeTasks": 11,
|
||||
"DescribeUserBusinessBehavior": 13,
|
||||
"DescribeUserData": 10,
|
||||
"DescribeVirtualBorderRoutersForPhysicalConnection": 10,
|
||||
"DescribeVirtualBorderRouters": 10,
|
||||
"DescribeVpcs": 41,
|
||||
"DescribeVRouters": 17,
|
||||
"DescribeVSwitches": 17,
|
||||
"DescribeZones": 103,
|
||||
"DetachClassicLinkVpc": 14,
|
||||
"DetachDisk": 17,
|
||||
"DetachInstanceRamRole": 10,
|
||||
"DetachKeyPair": 10,
|
||||
"DetachNetworkInterface": 16,
|
||||
"EipFillParams": 19,
|
||||
"EipFillProduct": 13,
|
||||
"EipNotifyPaid": 10,
|
||||
"EnablePhysicalConnection": 10,
|
||||
"ExportImage": 10,
|
||||
"GetInstanceConsoleOutput": 14,
|
||||
"GetInstanceScreenshot": 14,
|
||||
"ImportImage": 29,
|
||||
"ImportKeyPair": 10,
|
||||
"InstallCloudAssistant": 10,
|
||||
"InvokeCommand": 16,
|
||||
"JoinResourceGroup": 10,
|
||||
"JoinSecurityGroup": 66,
|
||||
"LeaveSecurityGroup": 66,
|
||||
"ModifyAutoSnapshotPolicyEx": 10,
|
||||
"ModifyBandwidthPackageSpec": 11,
|
||||
"ModifyCommand": 10,
|
||||
"ModifyDeploymentSetAttribute": 10,
|
||||
"ModifyDiskAttribute": 16,
|
||||
"ModifyDiskChargeType": 13,
|
||||
"ModifyEipAddressAttribute": 14,
|
||||
"ModifyImageAttribute": 10,
|
||||
"ModifyImageSharePermission": 16,
|
||||
"ModifyInstanceAttribute": 22,
|
||||
"ModifyInstanceAutoReleaseTime": 15,
|
||||
"ModifyInstanceAutoRenewAttribute": 16,
|
||||
"ModifyInstanceChargeType": 22,
|
||||
"ModifyInstanceDeployment": 10,
|
||||
"ModifyInstanceNetworkSpec": 36,
|
||||
"ModifyInstanceSpec": 62,
|
||||
"ModifyInstanceVncPasswd": 35,
|
||||
"ModifyInstanceVpcAttribute": 15,
|
||||
"ModifyLaunchTemplateDefaultVersion": 10,
|
||||
"ModifyNetworkInterfaceAttribute": 10,
|
||||
"ModifyPhysicalConnectionAttribute": 10,
|
||||
"ModifyPrepayInstanceSpec": 13,
|
||||
"ModifyRouterInterfaceAttribute": 10,
|
||||
"ModifySecurityGroupAttribute": 10,
|
||||
"ModifySecurityGroupEgressRule": 10,
|
||||
"ModifySecurityGroupPolicy": 10,
|
||||
"ModifySecurityGroupRule": 16,
|
||||
"ModifySnapshotAttribute": 10,
|
||||
"ModifyUserBusinessBehavior": 10,
|
||||
"ModifyVirtualBorderRouterAttribute": 10,
|
||||
"ModifyVpcAttribute": 10,
|
||||
"ModifyVRouterAttribute": 10,
|
||||
"ModifyVSwitchAttribute": 10,
|
||||
"ReActivateInstances": 10,
|
||||
"RebootInstance": 27,
|
||||
"RedeployInstance": 14,
|
||||
"ReInitDisk": 16,
|
||||
"ReleaseDedicatedHost": 10,
|
||||
"ReleaseEipAddress": 16,
|
||||
"ReleasePublicIpAddress": 10,
|
||||
"RemoveTags": 10,
|
||||
"RenewInstance": 19,
|
||||
"ReplaceSystemDisk": 36,
|
||||
"ResetDisk": 36,
|
||||
"ResizeDisk": 11,
|
||||
"RevokeSecurityGroupEgress": 13,
|
||||
"RevokeSecurityGroup": 16,
|
||||
"RunInstances": 86,
|
||||
"StartInstance": 46,
|
||||
"StopInstance": 27,
|
||||
"StopInvocation": 10,
|
||||
"TerminatePhysicalConnection": 10,
|
||||
"TerminateVirtualBorderRouter": 10,
|
||||
"UnassignIpv6Addresses": 10,
|
||||
"UnassignPrivateIpAddresses": 10,
|
||||
"UnassociateEipAddress": 16
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
func getAPIMaxTimeout(product, actionName string) (time.Duration, bool) {
|
||||
timeout := make(map[string]map[string]int)
|
||||
err := json.Unmarshal([]byte(apiTimeouts), &timeout)
|
||||
if err != nil {
|
||||
return 0 * time.Millisecond, false
|
||||
}
|
||||
|
||||
obj := timeout[strings.ToLower(product)]
|
||||
if obj != nil && obj[actionName] != 0 {
|
||||
return time.Duration(obj[actionName]) * time.Second, true
|
||||
}
|
||||
|
||||
return 0 * time.Millisecond, false
|
||||
}
|
||||
12
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/bearer_token_credential.go
generated
vendored
Normal file
12
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/bearer_token_credential.go
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
package credentials
|
||||
|
||||
type BearerTokenCredential struct {
|
||||
BearerToken string
|
||||
}
|
||||
|
||||
// NewBearerTokenCredential return a BearerTokenCredential object
|
||||
func NewBearerTokenCredential(token string) *BearerTokenCredential {
|
||||
return &BearerTokenCredential{
|
||||
BearerToken: token,
|
||||
}
|
||||
}
|
||||
24
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/ecs_ram_role.go
generated
vendored
24
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/ecs_ram_role.go
generated
vendored
@@ -1,17 +1,5 @@
|
||||
package credentials
|
||||
|
||||
// Deprecated: Use EcsRamRoleCredential in this package instead.
|
||||
type StsRoleNameOnEcsCredential struct {
|
||||
RoleName string
|
||||
}
|
||||
|
||||
// Deprecated: Use NewEcsRamRoleCredential in this package instead.
|
||||
func NewStsRoleNameOnEcsCredential(roleName string) *StsRoleNameOnEcsCredential {
|
||||
return &StsRoleNameOnEcsCredential{
|
||||
RoleName: roleName,
|
||||
}
|
||||
}
|
||||
|
||||
func (oldCred *StsRoleNameOnEcsCredential) ToEcsRamRoleCredential() *EcsRamRoleCredential {
|
||||
return &EcsRamRoleCredential{
|
||||
RoleName: oldCred.RoleName,
|
||||
@@ -27,3 +15,15 @@ func NewEcsRamRoleCredential(roleName string) *EcsRamRoleCredential {
|
||||
RoleName: roleName,
|
||||
}
|
||||
}
|
||||
|
||||
// Deprecated: Use EcsRamRoleCredential in this package instead.
|
||||
type StsRoleNameOnEcsCredential struct {
|
||||
RoleName string
|
||||
}
|
||||
|
||||
// Deprecated: Use NewEcsRamRoleCredential in this package instead.
|
||||
func NewStsRoleNameOnEcsCredential(roleName string) *StsRoleNameOnEcsCredential {
|
||||
return &StsRoleNameOnEcsCredential{
|
||||
RoleName: roleName,
|
||||
}
|
||||
}
|
||||
|
||||
30
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/env.go
generated
vendored
Normal file
30
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/env.go
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
|
||||
)
|
||||
|
||||
type EnvProvider struct{}
|
||||
|
||||
var ProviderEnv = new(EnvProvider)
|
||||
|
||||
func NewEnvProvider() Provider {
|
||||
return &EnvProvider{}
|
||||
}
|
||||
|
||||
func (p *EnvProvider) Resolve() (auth.Credential, error) {
|
||||
accessKeyID, ok1 := os.LookupEnv(ENVAccessKeyID)
|
||||
accessKeySecret, ok2 := os.LookupEnv(ENVAccessKeySecret)
|
||||
if !ok1 || !ok2 {
|
||||
return nil, nil
|
||||
}
|
||||
if accessKeyID == "" || accessKeySecret == "" {
|
||||
return nil, errors.New("Environmental variable (ALIBABACLOUD_ACCESS_KEY_ID or ALIBABACLOUD_ACCESS_KEY_SECRET) is empty")
|
||||
}
|
||||
return credentials.NewAccessKeyCredential(accessKeyID, accessKeySecret), nil
|
||||
}
|
||||
92
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/instance_credentials.go
generated
vendored
Normal file
92
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/instance_credentials.go
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
)
|
||||
|
||||
var securityCredURL = "http://100.100.100.200/latest/meta-data/ram/security-credentials/"
|
||||
|
||||
type InstanceCredentialsProvider struct{}
|
||||
|
||||
var ProviderInstance = new(InstanceCredentialsProvider)
|
||||
|
||||
var HookGet = func(fn func(string) (int, []byte, error)) func(string) (int, []byte, error) {
|
||||
return fn
|
||||
}
|
||||
|
||||
func NewInstanceCredentialsProvider() Provider {
|
||||
return &InstanceCredentialsProvider{}
|
||||
}
|
||||
|
||||
func (p *InstanceCredentialsProvider) Resolve() (auth.Credential, error) {
|
||||
roleName, ok := os.LookupEnv(ENVEcsMetadata)
|
||||
if !ok {
|
||||
return nil, nil
|
||||
}
|
||||
if roleName == "" {
|
||||
return nil, errors.New("Environmental variable 'ALIBABA_CLOUD_ECS_METADATA' are empty")
|
||||
}
|
||||
status, content, err := HookGet(get)(securityCredURL + roleName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if status != 200 {
|
||||
if status == 404 {
|
||||
return nil, fmt.Errorf("The role was not found in the instance")
|
||||
}
|
||||
return nil, fmt.Errorf("Received %d when getting security credentials for %s", status, roleName)
|
||||
}
|
||||
body := make(map[string]interface{})
|
||||
|
||||
if err := json.Unmarshal(content, &body); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
accessKeyID, err := extractString(body, "AccessKeyId")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
accessKeySecret, err := extractString(body, "AccessKeySecret")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
securityToken, err := extractString(body, "SecurityToken")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return credentials.NewStsTokenCredential(accessKeyID, accessKeySecret, securityToken), nil
|
||||
}
|
||||
|
||||
func get(url string) (status int, content []byte, err error) {
|
||||
httpClient := http.DefaultClient
|
||||
httpClient.Timeout = time.Second * 1
|
||||
resp, err := httpClient.Get(url)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
content, err = ioutil.ReadAll(resp.Body)
|
||||
return resp.StatusCode, content, err
|
||||
}
|
||||
|
||||
func extractString(m map[string]interface{}, key string) (string, error) {
|
||||
raw, ok := m[key]
|
||||
if !ok {
|
||||
return "", fmt.Errorf("%s not in map", key)
|
||||
}
|
||||
str, ok := raw.(string)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("%s is not a string in map", key)
|
||||
}
|
||||
return str, nil
|
||||
}
|
||||
158
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/profile_credentials.go
generated
vendored
Normal file
158
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/profile_credentials.go
generated
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
|
||||
ini "gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
type ProfileProvider struct {
|
||||
Profile string
|
||||
}
|
||||
|
||||
var ProviderProfile = NewProfileProvider()
|
||||
|
||||
// NewProfileProvider receive zero or more parameters,
|
||||
// when length of name is 0, the value of field Profile will be "default",
|
||||
// and when there are multiple inputs, the function will take the
|
||||
// first one and discard the other values.
|
||||
func NewProfileProvider(name ...string) Provider {
|
||||
p := new(ProfileProvider)
|
||||
if len(name) == 0 {
|
||||
p.Profile = "default"
|
||||
} else {
|
||||
p.Profile = name[0]
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
// Resolve implements the Provider interface
|
||||
// when credential type is rsa_key_pair, the content of private_key file
|
||||
// must be able to be parsed directly into the required string
|
||||
// that NewRsaKeyPairCredential function needed
|
||||
func (p *ProfileProvider) Resolve() (auth.Credential, error) {
|
||||
path, ok := os.LookupEnv(ENVCredentialFile)
|
||||
if !ok {
|
||||
path, err := checkDefaultPath()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if path == "" {
|
||||
return nil, nil
|
||||
}
|
||||
} else if path == "" {
|
||||
return nil, errors.New("Environment variable '" + ENVCredentialFile + "' cannot be empty")
|
||||
}
|
||||
|
||||
ini, err := ini.Load(path)
|
||||
if err != nil {
|
||||
return nil, errors.New("ERROR: Can not open file" + err.Error())
|
||||
}
|
||||
|
||||
section, err := ini.GetSection(p.Profile)
|
||||
if err != nil {
|
||||
return nil, errors.New("ERROR: Can not load section" + err.Error())
|
||||
}
|
||||
|
||||
value, err := section.GetKey("type")
|
||||
if err != nil {
|
||||
return nil, errors.New("ERROR: Can not find credential type" + err.Error())
|
||||
}
|
||||
|
||||
switch value.String() {
|
||||
case "access_key":
|
||||
value1, err1 := section.GetKey("access_key_id")
|
||||
value2, err2 := section.GetKey("access_key_secret")
|
||||
if err1 != nil || err2 != nil {
|
||||
return nil, errors.New("ERROR: Failed to get value")
|
||||
}
|
||||
if value1.String() == "" || value2.String() == "" {
|
||||
return nil, errors.New("ERROR: Value can't be empty")
|
||||
}
|
||||
return credentials.NewAccessKeyCredential(value1.String(), value2.String()), nil
|
||||
case "ecs_ram_role":
|
||||
value1, err1 := section.GetKey("role_name")
|
||||
if err1 != nil {
|
||||
return nil, errors.New("ERROR: Failed to get value")
|
||||
}
|
||||
if value1.String() == "" {
|
||||
return nil, errors.New("ERROR: Value can't be empty")
|
||||
}
|
||||
return credentials.NewEcsRamRoleCredential(value1.String()), nil
|
||||
case "ram_role_arn":
|
||||
value1, err1 := section.GetKey("access_key_id")
|
||||
value2, err2 := section.GetKey("access_key_secret")
|
||||
value3, err3 := section.GetKey("role_arn")
|
||||
value4, err4 := section.GetKey("role_session_name")
|
||||
if err1 != nil || err2 != nil || err3 != nil || err4 != nil {
|
||||
return nil, errors.New("ERROR: Failed to get value")
|
||||
}
|
||||
if value1.String() == "" || value2.String() == "" || value3.String() == "" || value4.String() == "" {
|
||||
return nil, errors.New("ERROR: Value can't be empty")
|
||||
}
|
||||
return credentials.NewRamRoleArnCredential(value1.String(), value2.String(), value3.String(), value4.String(), 3600), nil
|
||||
case "rsa_key_pair":
|
||||
value1, err1 := section.GetKey("public_key_id")
|
||||
value2, err2 := section.GetKey("private_key_file")
|
||||
if err1 != nil || err2 != nil {
|
||||
return nil, errors.New("ERROR: Failed to get value")
|
||||
}
|
||||
if value1.String() == "" || value2.String() == "" {
|
||||
return nil, errors.New("ERROR: Value can't be empty")
|
||||
}
|
||||
file, err := os.Open(value2.String())
|
||||
if err != nil {
|
||||
return nil, errors.New("ERROR: Can not get private_key")
|
||||
}
|
||||
defer file.Close()
|
||||
var privateKey string
|
||||
scan := bufio.NewScanner(file)
|
||||
var data string
|
||||
for scan.Scan() {
|
||||
if strings.HasPrefix(scan.Text(), "----") {
|
||||
continue
|
||||
}
|
||||
data += scan.Text() + "\n"
|
||||
}
|
||||
return credentials.NewRsaKeyPairCredential(privateKey, value1.String(), 3600), nil
|
||||
default:
|
||||
return nil, errors.New("ERROR: Failed to get credential")
|
||||
}
|
||||
}
|
||||
|
||||
// GetHomePath return home directory according to the system.
|
||||
// if the environmental virables does not exist, will return empty
|
||||
func GetHomePath() string {
|
||||
if runtime.GOOS == "windows" {
|
||||
path, ok := os.LookupEnv("USERPROFILE")
|
||||
if !ok {
|
||||
return ""
|
||||
}
|
||||
return path
|
||||
}
|
||||
path, ok := os.LookupEnv("HOME")
|
||||
if !ok {
|
||||
return ""
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
func checkDefaultPath() (path string, err error) {
|
||||
path = GetHomePath()
|
||||
if path == "" {
|
||||
return "", errors.New("The default credential file path is invalid")
|
||||
}
|
||||
path = strings.Replace("~/.alibabacloud/credentials", "~", path, 1)
|
||||
_, err = os.Stat(path)
|
||||
if err != nil {
|
||||
return "", nil
|
||||
}
|
||||
return path, nil
|
||||
}
|
||||
19
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/provider.go
generated
vendored
Normal file
19
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/provider.go
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
|
||||
)
|
||||
|
||||
//Environmental virables that may be used by the provider
|
||||
const (
|
||||
ENVAccessKeyID = "ALIBABA_CLOUD_ACCESS_KEY_ID"
|
||||
ENVAccessKeySecret = "ALIBABA_CLOUD_ACCESS_KEY_SECRET"
|
||||
ENVCredentialFile = "ALIBABA_CLOUD_CREDENTIALS_FILE"
|
||||
ENVEcsMetadata = "ALIBABA_CLOUD_ECS_METADATA"
|
||||
PATHCredentialFile = "~/.alibabacloud/credentials"
|
||||
)
|
||||
|
||||
// When you want to customize the provider, you only need to implement the method of the interface.
|
||||
type Provider interface {
|
||||
Resolve() (auth.Credential, error)
|
||||
}
|
||||
34
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/provider_chain.go
generated
vendored
Normal file
34
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider/provider_chain.go
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
|
||||
)
|
||||
|
||||
type ProviderChain struct {
|
||||
Providers []Provider
|
||||
}
|
||||
|
||||
var defaultproviders = []Provider{ProviderEnv, ProviderProfile, ProviderInstance}
|
||||
var DefaultChain = NewProviderChain(defaultproviders)
|
||||
|
||||
func NewProviderChain(providers []Provider) Provider {
|
||||
return &ProviderChain{
|
||||
Providers: providers,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ProviderChain) Resolve() (auth.Credential, error) {
|
||||
for _, provider := range p.Providers {
|
||||
creds, err := provider.Resolve()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if err == nil && creds == nil {
|
||||
continue
|
||||
}
|
||||
return creds, err
|
||||
}
|
||||
return nil, errors.New("No credential found")
|
||||
|
||||
}
|
||||
@@ -15,6 +15,7 @@ type RamRoleArnCredential struct {
|
||||
RoleArn string
|
||||
RoleSessionName string
|
||||
RoleSessionExpiration int
|
||||
Policy string
|
||||
}
|
||||
|
||||
// Deprecated: Use RamRoleArnCredential in this package instead.
|
||||
@@ -47,3 +48,14 @@ func NewRamRoleArnCredential(accessKeyId, accessKeySecret, roleArn, roleSessionN
|
||||
RoleSessionExpiration: roleSessionExpiration,
|
||||
}
|
||||
}
|
||||
|
||||
func NewRamRoleArnWithPolicyCredential(accessKeyId, accessKeySecret, roleArn, roleSessionName, policy string, roleSessionExpiration int) *RamRoleArnCredential {
|
||||
return &RamRoleArnCredential{
|
||||
AccessKeyId: accessKeyId,
|
||||
AccessKeySecret: accessKeySecret,
|
||||
RoleArn: roleArn,
|
||||
RoleSessionName: roleSessionName,
|
||||
RoleSessionExpiration: roleSessionExpiration,
|
||||
Policy: policy,
|
||||
}
|
||||
}
|
||||
|
||||
27
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/roa_signature_composer.go
generated
vendored
27
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/roa_signature_composer.go
generated
vendored
@@ -16,22 +16,33 @@ package auth
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
)
|
||||
|
||||
var debug utils.Debug
|
||||
|
||||
var hookGetDate = func(fn func() string) string {
|
||||
return fn()
|
||||
}
|
||||
|
||||
func init() {
|
||||
debug = utils.Init("sdk")
|
||||
}
|
||||
|
||||
func signRoaRequest(request requests.AcsRequest, signer Signer, regionId string) (err error) {
|
||||
completeROASignParams(request, signer, regionId)
|
||||
stringToSign := buildRoaStringToSign(request)
|
||||
request.SetStringToSign(stringToSign)
|
||||
signature := signer.Sign(stringToSign, "")
|
||||
accessKeyId, err := signer.GetAccessKeyId()
|
||||
if err != nil {
|
||||
return nil
|
||||
return err
|
||||
}
|
||||
|
||||
signature := signer.Sign(stringToSign, "")
|
||||
request.GetHeaders()["Authorization"] = "acs " + accessKeyId + ":" + signature
|
||||
|
||||
return
|
||||
@@ -51,13 +62,16 @@ func completeROASignParams(request requests.AcsRequest, signer Signer, regionId
|
||||
headerParams["x-acs-security-token"] = value
|
||||
continue
|
||||
}
|
||||
|
||||
if key == "BearerToken" {
|
||||
headerParams["x-acs-bearer-token"] = value
|
||||
continue
|
||||
}
|
||||
queryParams[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
// complete header params
|
||||
headerParams["Date"] = utils.GetTimeInFormatRFC2616()
|
||||
headerParams["Date"] = hookGetDate(utils.GetTimeInFormatRFC2616)
|
||||
headerParams["x-acs-signature-method"] = signer.GetName()
|
||||
headerParams["x-acs-signature-version"] = signer.GetVersion()
|
||||
if request.GetFormParams() != nil && len(request.GetFormParams()) > 0 {
|
||||
@@ -110,6 +124,7 @@ func buildRoaStringToSign(request requests.AcsRequest) (stringToSign string) {
|
||||
// append query params
|
||||
stringToSignBuilder.WriteString(request.BuildQueries())
|
||||
stringToSign = stringToSignBuilder.String()
|
||||
debug("stringToSign: %s", stringToSign)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
20
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/rpc_signature_composer.go
generated
vendored
20
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/rpc_signature_composer.go
generated
vendored
@@ -15,13 +15,17 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var hookGetNonce = func(fn func() string) string {
|
||||
return fn()
|
||||
}
|
||||
|
||||
func signRpcRequest(request requests.AcsRequest, signer Signer, regionId string) (err error) {
|
||||
err = completeRpcSignParams(request, signer, regionId)
|
||||
if err != nil {
|
||||
@@ -44,11 +48,11 @@ func completeRpcSignParams(request requests.AcsRequest, signer Signer, regionId
|
||||
queryParams["Version"] = request.GetVersion()
|
||||
queryParams["Action"] = request.GetActionName()
|
||||
queryParams["Format"] = request.GetAcceptFormat()
|
||||
queryParams["Timestamp"] = utils.GetTimeInFormatISO8601()
|
||||
queryParams["Timestamp"] = hookGetDate(utils.GetTimeInFormatISO8601)
|
||||
queryParams["SignatureMethod"] = signer.GetName()
|
||||
queryParams["SignatureType"] = signer.GetType()
|
||||
queryParams["SignatureVersion"] = signer.GetVersion()
|
||||
queryParams["SignatureNonce"] = utils.GetUUIDV4()
|
||||
queryParams["SignatureNonce"] = hookGetNonce(utils.GetUUID)
|
||||
queryParams["AccessKeyId"], err = signer.GetAccessKeyId()
|
||||
|
||||
if err != nil {
|
||||
@@ -80,12 +84,6 @@ func buildRpcStringToSign(request requests.AcsRequest) (stringToSign string) {
|
||||
signParams[key] = value
|
||||
}
|
||||
|
||||
// sort params by key
|
||||
var paramKeySlice []string
|
||||
for key := range signParams {
|
||||
paramKeySlice = append(paramKeySlice, key)
|
||||
}
|
||||
sort.Strings(paramKeySlice)
|
||||
stringToSign = utils.GetUrlFormedMap(signParams)
|
||||
stringToSign = strings.Replace(stringToSign, "+", "%20", -1)
|
||||
stringToSign = strings.Replace(stringToSign, "*", "%2A", -1)
|
||||
|
||||
21
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signer.go
generated
vendored
21
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signer.go
generated
vendored
@@ -16,12 +16,13 @@ package auth
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
type Signer interface {
|
||||
@@ -31,20 +32,22 @@ type Signer interface {
|
||||
GetAccessKeyId() (string, error)
|
||||
GetExtraParam() map[string]string
|
||||
Sign(stringToSign, secretSuffix string) string
|
||||
Shutdown()
|
||||
}
|
||||
|
||||
func NewSignerWithCredential(credential Credential, commonApi func(request *requests.CommonRequest, signer interface{}) (response *responses.CommonResponse, err error)) (signer Signer, err error) {
|
||||
switch instance := credential.(type) {
|
||||
case *credentials.AccessKeyCredential:
|
||||
{
|
||||
signer, err = signers.NewAccessKeySigner(instance)
|
||||
signer = signers.NewAccessKeySigner(instance)
|
||||
}
|
||||
case *credentials.StsTokenCredential:
|
||||
{
|
||||
signer, err = signers.NewStsTokenSigner(instance)
|
||||
signer = signers.NewStsTokenSigner(instance)
|
||||
}
|
||||
case *credentials.BearerTokenCredential:
|
||||
{
|
||||
signer = signers.NewBearerTokenSigner(instance)
|
||||
}
|
||||
|
||||
case *credentials.RamRoleArnCredential:
|
||||
{
|
||||
signer, err = signers.NewRamRoleArnSigner(instance, commonApi)
|
||||
@@ -55,11 +58,11 @@ func NewSignerWithCredential(credential Credential, commonApi func(request *requ
|
||||
}
|
||||
case *credentials.EcsRamRoleCredential:
|
||||
{
|
||||
signer, err = signers.NewEcsRamRoleSigner(instance, commonApi)
|
||||
signer = signers.NewEcsRamRoleSigner(instance, commonApi)
|
||||
}
|
||||
case *credentials.BaseCredential: // deprecated user interface
|
||||
{
|
||||
signer, err = signers.NewAccessKeySigner(instance.ToAccessKeyCredential())
|
||||
signer = signers.NewAccessKeySigner(instance.ToAccessKeyCredential())
|
||||
}
|
||||
case *credentials.StsRoleArnCredential: // deprecated user interface
|
||||
{
|
||||
@@ -67,7 +70,7 @@ func NewSignerWithCredential(credential Credential, commonApi func(request *requ
|
||||
}
|
||||
case *credentials.StsRoleNameOnEcsCredential: // deprecated user interface
|
||||
{
|
||||
signer, err = signers.NewEcsRamRoleSigner(instance.ToEcsRamRoleCredential(), commonApi)
|
||||
signer = signers.NewEcsRamRoleSigner(instance.ToEcsRamRoleCredential(), commonApi)
|
||||
}
|
||||
default:
|
||||
message := fmt.Sprintf(errors.UnsupportedCredentialErrorMessage, reflect.TypeOf(credential))
|
||||
@@ -80,7 +83,7 @@ func Sign(request requests.AcsRequest, signer Signer, regionId string) (err erro
|
||||
switch request.GetStyle() {
|
||||
case requests.ROA:
|
||||
{
|
||||
signRoaRequest(request, signer, regionId)
|
||||
err = signRoaRequest(request, signer, regionId)
|
||||
}
|
||||
case requests.RPC:
|
||||
{
|
||||
|
||||
18
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/algorithms.go
generated
vendored
18
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/algorithms.go
generated
vendored
@@ -22,11 +22,7 @@ import (
|
||||
"crypto/sha1"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
/*"encoding/pem"
|
||||
"io/ioutil"
|
||||
"os/user"
|
||||
"crypto/sha256"*/)
|
||||
)
|
||||
|
||||
func ShaHmac1(source, secret string) string {
|
||||
key := []byte(secret)
|
||||
@@ -38,13 +34,14 @@ func ShaHmac1(source, secret string) string {
|
||||
}
|
||||
|
||||
func Sha256WithRsa(source, secret string) string {
|
||||
// block, _ := pem.Decode([]byte(secret))
|
||||
decodeString, err := base64.StdEncoding.DecodeString(secret)
|
||||
if err != nil {
|
||||
fmt.Println("DecodeString err", err)
|
||||
panic(err)
|
||||
}
|
||||
private, err := x509.ParsePKCS8PrivateKey(decodeString)
|
||||
if err != nil {
|
||||
fmt.Println("ParsePKCS8PrivateKey err", err)
|
||||
panic(err)
|
||||
}
|
||||
|
||||
h := crypto.Hash.New(crypto.SHA256)
|
||||
@@ -53,11 +50,8 @@ func Sha256WithRsa(source, secret string) string {
|
||||
signature, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey),
|
||||
crypto.SHA256, hashed)
|
||||
if err != nil {
|
||||
fmt.Println("Error from signing:", err)
|
||||
return ""
|
||||
panic(err)
|
||||
}
|
||||
|
||||
signedString := base64.StdEncoding.EncodeToString(signature)
|
||||
//fmt.Printf("Encoded: %v\n", signedString)
|
||||
return signedString
|
||||
return base64.StdEncoding.EncodeToString(signature)
|
||||
}
|
||||
|
||||
5
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/credential_updater.go
generated
vendored
5
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/credential_updater.go
generated
vendored
@@ -15,12 +15,13 @@
|
||||
package signers
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
"time"
|
||||
)
|
||||
|
||||
const defaultInAdvanceScale = 0.8
|
||||
const defaultInAdvanceScale = 0.95
|
||||
|
||||
type credentialUpdater struct {
|
||||
credentialExpiration int
|
||||
|
||||
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_access_key.go
generated
vendored
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_access_key.go
generated
vendored
@@ -26,10 +26,10 @@ func (signer *AccessKeySigner) GetExtraParam() map[string]string {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewAccessKeySigner(credential *credentials.AccessKeyCredential) (*AccessKeySigner, error) {
|
||||
func NewAccessKeySigner(credential *credentials.AccessKeyCredential) *AccessKeySigner {
|
||||
return &AccessKeySigner{
|
||||
credential: credential,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (*AccessKeySigner) GetName() string {
|
||||
@@ -52,7 +52,3 @@ func (signer *AccessKeySigner) Sign(stringToSign, secretSuffix string) string {
|
||||
secret := signer.credential.AccessKeySecret + secretSuffix
|
||||
return ShaHmac1(stringToSign, secret)
|
||||
}
|
||||
|
||||
func (signer *AccessKeySigner) Shutdown() {
|
||||
|
||||
}
|
||||
|
||||
35
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_bearer_token.go
generated
vendored
Normal file
35
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_bearer_token.go
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
package signers
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
)
|
||||
|
||||
type BearerTokenSigner struct {
|
||||
credential *credentials.BearerTokenCredential
|
||||
}
|
||||
|
||||
func NewBearerTokenSigner(credential *credentials.BearerTokenCredential) *BearerTokenSigner {
|
||||
return &BearerTokenSigner{
|
||||
credential: credential,
|
||||
}
|
||||
}
|
||||
|
||||
func (signer *BearerTokenSigner) GetExtraParam() map[string]string {
|
||||
return map[string]string{"BearerToken": signer.credential.BearerToken}
|
||||
}
|
||||
|
||||
func (*BearerTokenSigner) GetName() string {
|
||||
return ""
|
||||
}
|
||||
func (*BearerTokenSigner) GetType() string {
|
||||
return "BEARERTOKEN"
|
||||
}
|
||||
func (*BearerTokenSigner) GetVersion() string {
|
||||
return "1.0"
|
||||
}
|
||||
func (signer *BearerTokenSigner) GetAccessKeyId() (accessKeyId string, err error) {
|
||||
return "", nil
|
||||
}
|
||||
func (signer *BearerTokenSigner) Sign(stringToSign, secretSuffix string) string {
|
||||
return ""
|
||||
}
|
||||
62
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_ecs_ram_role.go
generated
vendored
62
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_ecs_ram_role.go
generated
vendored
@@ -17,15 +17,18 @@ package signers
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
"github.com/jmespath/go-jmespath"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
jmespath "github.com/jmespath/go-jmespath"
|
||||
)
|
||||
|
||||
var securityCredURL = "http://100.100.100.200/latest/meta-data/ram/security-credentials/"
|
||||
|
||||
type EcsRamRoleSigner struct {
|
||||
*credentialUpdater
|
||||
sessionCredential *SessionCredential
|
||||
@@ -33,7 +36,7 @@ type EcsRamRoleSigner struct {
|
||||
commonApi func(request *requests.CommonRequest, signer interface{}) (response *responses.CommonResponse, err error)
|
||||
}
|
||||
|
||||
func NewEcsRamRoleSigner(credential *credentials.EcsRamRoleCredential, commonApi func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error)) (signer *EcsRamRoleSigner, err error) {
|
||||
func NewEcsRamRoleSigner(credential *credentials.EcsRamRoleCredential, commonApi func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error)) (signer *EcsRamRoleSigner) {
|
||||
signer = &EcsRamRoleSigner{
|
||||
credential: credential,
|
||||
commonApi: commonApi,
|
||||
@@ -46,7 +49,7 @@ func NewEcsRamRoleSigner(credential *credentials.EcsRamRoleCredential, commonApi
|
||||
refreshApi: signer.refreshApi,
|
||||
}
|
||||
|
||||
return
|
||||
return signer
|
||||
}
|
||||
|
||||
func (*EcsRamRoleSigner) GetName() string {
|
||||
@@ -64,9 +67,12 @@ func (*EcsRamRoleSigner) GetVersion() string {
|
||||
func (signer *EcsRamRoleSigner) GetAccessKeyId() (accessKeyId string, err error) {
|
||||
if signer.sessionCredential == nil || signer.needUpdateCredential() {
|
||||
err = signer.updateCredential()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if err != nil && (signer.sessionCredential == nil || len(signer.sessionCredential.AccessKeyId) <= 0) {
|
||||
return "", err
|
||||
if signer.sessionCredential == nil || len(signer.sessionCredential.AccessKeyId) <= 0 {
|
||||
return "", nil
|
||||
}
|
||||
return signer.sessionCredential.AccessKeyId, nil
|
||||
}
|
||||
@@ -82,76 +88,66 @@ func (signer *EcsRamRoleSigner) GetExtraParam() map[string]string {
|
||||
}
|
||||
|
||||
func (signer *EcsRamRoleSigner) Sign(stringToSign, secretSuffix string) string {
|
||||
secret := signer.sessionCredential.AccessKeyId + secretSuffix
|
||||
secret := signer.sessionCredential.AccessKeySecret + secretSuffix
|
||||
return ShaHmac1(stringToSign, secret)
|
||||
}
|
||||
|
||||
func (signer *EcsRamRoleSigner) buildCommonRequest() (request *requests.CommonRequest, err error) {
|
||||
request = requests.NewCommonRequest()
|
||||
return
|
||||
}
|
||||
|
||||
func (signer *EcsRamRoleSigner) refreshApi(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
|
||||
requestUrl := "http://100.100.100.200/latest/meta-data/ram/security-credentials/" + signer.credential.RoleName
|
||||
requestUrl := securityCredURL + signer.credential.RoleName
|
||||
httpRequest, err := http.NewRequest(requests.GET, requestUrl, strings.NewReader(""))
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err", err)
|
||||
err = fmt.Errorf("refresh Ecs sts token err: %s", err.Error())
|
||||
return
|
||||
}
|
||||
httpClient := &http.Client{}
|
||||
httpResponse, err := httpClient.Do(httpRequest)
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err", err)
|
||||
err = fmt.Errorf("refresh Ecs sts token err: %s", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response = responses.NewCommonResponse()
|
||||
err = responses.Unmarshal(response, httpResponse, "")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (signer *EcsRamRoleSigner) refreshCredential(response *responses.CommonResponse) (err error) {
|
||||
if response.GetHttpStatus() != http.StatusOK {
|
||||
fmt.Println("refresh Ecs sts token err, httpStatus: " + string(response.GetHttpStatus()) + ", message = " + response.GetHttpContentString())
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, httpStatus: %d, message = %s", response.GetHttpStatus(), response.GetHttpContentString())
|
||||
}
|
||||
var data interface{}
|
||||
err = json.Unmarshal(response.GetHttpContentBytes(), &data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err, json.Unmarshal fail", err)
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, json.Unmarshal fail: %s", err.Error())
|
||||
}
|
||||
code, err := jmespath.Search("Code", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err, fail to get Code", err)
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, fail to get Code: %s", err.Error())
|
||||
}
|
||||
if code.(string) != "Success" {
|
||||
fmt.Println("refresh Ecs sts token err, Code is not Success", err)
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, Code is not Success")
|
||||
}
|
||||
accessKeyId, err := jmespath.Search("AccessKeyId", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err, fail to get AccessKeyId", err)
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, fail to get AccessKeyId: %s", err.Error())
|
||||
}
|
||||
accessKeySecret, err := jmespath.Search("AccessKeySecret", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err, fail to get AccessKeySecret", err)
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, fail to get AccessKeySecret: %s", err.Error())
|
||||
}
|
||||
securityToken, err := jmespath.Search("SecurityToken", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err, fail to get SecurityToken", err)
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, fail to get SecurityToken: %s", err.Error())
|
||||
}
|
||||
expiration, err := jmespath.Search("Expiration", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh Ecs sts token err, fail to get Expiration", err)
|
||||
return
|
||||
return fmt.Errorf("refresh Ecs sts token err, fail to get Expiration: %s", err.Error())
|
||||
}
|
||||
if accessKeyId == nil || accessKeySecret == nil || securityToken == nil {
|
||||
if accessKeyId == nil || accessKeySecret == nil || securityToken == nil || expiration == nil {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -169,7 +165,3 @@ func (signer *EcsRamRoleSigner) refreshCredential(response *responses.CommonResp
|
||||
func (signer *EcsRamRoleSigner) GetSessionCredential() *SessionCredential {
|
||||
return signer.sessionCredential
|
||||
}
|
||||
|
||||
func (signer *EcsRamRoleSigner) Shutdown() {
|
||||
|
||||
}
|
||||
|
||||
56
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_key_pair.go
generated
vendored
56
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_key_pair.go
generated
vendored
@@ -17,13 +17,14 @@ package signers
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
"github.com/jmespath/go-jmespath"
|
||||
"net/http"
|
||||
"strconv"
|
||||
jmespath "github.com/jmespath/go-jmespath"
|
||||
)
|
||||
|
||||
type SignerKeyPair struct {
|
||||
@@ -70,28 +71,33 @@ func (*SignerKeyPair) GetVersion() string {
|
||||
return "1.0"
|
||||
}
|
||||
|
||||
func (signer *SignerKeyPair) GetAccessKeyId() (accessKeyId string, err error) {
|
||||
func (signer *SignerKeyPair) ensureCredential() error {
|
||||
if signer.sessionCredential == nil || signer.needUpdateCredential() {
|
||||
err = signer.updateCredential()
|
||||
return signer.updateCredential()
|
||||
}
|
||||
if err != nil && (signer.sessionCredential == nil || len(signer.sessionCredential.AccessKeyId) <= 0) {
|
||||
return "", err
|
||||
return nil
|
||||
}
|
||||
|
||||
func (signer *SignerKeyPair) GetAccessKeyId() (accessKeyId string, err error) {
|
||||
err = signer.ensureCredential()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return signer.sessionCredential.AccessKeyId, err
|
||||
if signer.sessionCredential == nil || len(signer.sessionCredential.AccessKeyId) <= 0 {
|
||||
accessKeyId = ""
|
||||
return
|
||||
}
|
||||
|
||||
accessKeyId = signer.sessionCredential.AccessKeyId
|
||||
return
|
||||
}
|
||||
|
||||
func (signer *SignerKeyPair) GetExtraParam() map[string]string {
|
||||
if signer.sessionCredential == nil || signer.needUpdateCredential() {
|
||||
signer.updateCredential()
|
||||
}
|
||||
if signer.sessionCredential == nil || len(signer.sessionCredential.AccessKeyId) <= 0 {
|
||||
return make(map[string]string)
|
||||
}
|
||||
return make(map[string]string)
|
||||
}
|
||||
|
||||
func (signer *SignerKeyPair) Sign(stringToSign, secretSuffix string) string {
|
||||
secret := signer.sessionCredential.AccessKeyId + secretSuffix
|
||||
secret := signer.sessionCredential.AccessKeySecret + secretSuffix
|
||||
return ShaHmac1(stringToSign, secret)
|
||||
}
|
||||
|
||||
@@ -101,14 +107,15 @@ func (signer *SignerKeyPair) buildCommonRequest() (request *requests.CommonReque
|
||||
request.Version = "2015-04-01"
|
||||
request.ApiName = "GenerateSessionAccessKey"
|
||||
request.Scheme = requests.HTTPS
|
||||
request.SetDomain("sts.ap-northeast-1.aliyuncs.com")
|
||||
request.QueryParams["PublicKeyId"] = signer.credential.PublicKeyId
|
||||
request.QueryParams["DurationSeconds"] = strconv.Itoa(signer.credentialExpiration)
|
||||
return
|
||||
}
|
||||
|
||||
func (signerKeyPair *SignerKeyPair) refreshApi(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
|
||||
signerV2, err := NewSignerV2(signerKeyPair.credential)
|
||||
return signerKeyPair.commonApi(request, signerV2)
|
||||
func (signer *SignerKeyPair) refreshApi(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
|
||||
signerV2 := NewSignerV2(signer.credential)
|
||||
return signer.commonApi(request, signerV2)
|
||||
}
|
||||
|
||||
func (signer *SignerKeyPair) refreshCredential(response *responses.CommonResponse) (err error) {
|
||||
@@ -120,18 +127,15 @@ func (signer *SignerKeyPair) refreshCredential(response *responses.CommonRespons
|
||||
var data interface{}
|
||||
err = json.Unmarshal(response.GetHttpContentBytes(), &data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh KeyPair err, json.Unmarshal fail", err)
|
||||
return
|
||||
return fmt.Errorf("refresh KeyPair err, json.Unmarshal fail: %s", err.Error())
|
||||
}
|
||||
accessKeyId, err := jmespath.Search("SessionAccessKey.SessionAccessKeyId", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh KeyPair err, fail to get SessionAccessKeyId", err)
|
||||
return
|
||||
return fmt.Errorf("refresh KeyPair err, fail to get SessionAccessKeyId: %s", err.Error())
|
||||
}
|
||||
accessKeySecret, err := jmespath.Search("SessionAccessKey.SessionAccessKeySecret", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh KeyPair err, fail to get SessionAccessKeySecret", err)
|
||||
return
|
||||
return fmt.Errorf("refresh KeyPair err, fail to get SessionAccessKeySecret: %s", err.Error())
|
||||
}
|
||||
if accessKeyId == nil || accessKeySecret == nil {
|
||||
return
|
||||
@@ -142,7 +146,3 @@ func (signer *SignerKeyPair) refreshCredential(response *responses.CommonRespons
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (signer *SignerKeyPair) Shutdown() {
|
||||
|
||||
}
|
||||
|
||||
37
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_ram_role_arn.go
generated
vendored
37
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_ram_role_arn.go
generated
vendored
@@ -17,14 +17,15 @@ package signers
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
"github.com/jmespath/go-jmespath"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
jmespath "github.com/jmespath/go-jmespath"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -84,10 +85,15 @@ func (*RamRoleArnSigner) GetVersion() string {
|
||||
func (signer *RamRoleArnSigner) GetAccessKeyId() (accessKeyId string, err error) {
|
||||
if signer.sessionCredential == nil || signer.needUpdateCredential() {
|
||||
err = signer.updateCredential()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if err != nil && (signer.sessionCredential == nil || len(signer.sessionCredential.AccessKeyId) <= 0) {
|
||||
|
||||
if signer.sessionCredential == nil || len(signer.sessionCredential.AccessKeyId) <= 0 {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return signer.sessionCredential.AccessKeyId, nil
|
||||
}
|
||||
|
||||
@@ -113,6 +119,9 @@ func (signer *RamRoleArnSigner) buildCommonRequest() (request *requests.CommonRe
|
||||
request.ApiName = "AssumeRole"
|
||||
request.Scheme = requests.HTTPS
|
||||
request.QueryParams["RoleArn"] = signer.credential.RoleArn
|
||||
if signer.credential.Policy != "" {
|
||||
request.QueryParams["Policy"] = signer.credential.Policy
|
||||
}
|
||||
request.QueryParams["RoleSessionName"] = signer.credential.RoleSessionName
|
||||
request.QueryParams["DurationSeconds"] = strconv.Itoa(signer.credentialExpiration)
|
||||
return
|
||||
@@ -123,7 +132,7 @@ func (signer *RamRoleArnSigner) refreshApi(request *requests.CommonRequest) (res
|
||||
AccessKeyId: signer.credential.AccessKeyId,
|
||||
AccessKeySecret: signer.credential.AccessKeySecret,
|
||||
}
|
||||
signerV1, err := NewAccessKeySigner(credential)
|
||||
signerV1 := NewAccessKeySigner(credential)
|
||||
return signer.commonApi(request, signerV1)
|
||||
}
|
||||
|
||||
@@ -136,23 +145,19 @@ func (signer *RamRoleArnSigner) refreshCredential(response *responses.CommonResp
|
||||
var data interface{}
|
||||
err = json.Unmarshal(response.GetHttpContentBytes(), &data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh RoleArn sts token err, json.Unmarshal fail", err)
|
||||
return
|
||||
return fmt.Errorf("refresh RoleArn sts token err, json.Unmarshal fail: %s", err.Error())
|
||||
}
|
||||
accessKeyId, err := jmespath.Search("Credentials.AccessKeyId", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh RoleArn sts token err, fail to get AccessKeyId", err)
|
||||
return
|
||||
return fmt.Errorf("refresh RoleArn sts token err, fail to get AccessKeyId: %s", err.Error())
|
||||
}
|
||||
accessKeySecret, err := jmespath.Search("Credentials.AccessKeySecret", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh RoleArn sts token err, fail to get AccessKeySecret", err)
|
||||
return
|
||||
return fmt.Errorf("refresh RoleArn sts token err, fail to get AccessKeySecret: %s", err.Error())
|
||||
}
|
||||
securityToken, err := jmespath.Search("Credentials.SecurityToken", data)
|
||||
if err != nil {
|
||||
fmt.Println("refresh RoleArn sts token err, fail to get SecurityToken", err)
|
||||
return
|
||||
return fmt.Errorf("refresh RoleArn sts token err, fail to get SecurityToken: %s", err.Error())
|
||||
}
|
||||
if accessKeyId == nil || accessKeySecret == nil || securityToken == nil {
|
||||
return
|
||||
@@ -168,7 +173,3 @@ func (signer *RamRoleArnSigner) refreshCredential(response *responses.CommonResp
|
||||
func (signer *RamRoleArnSigner) GetSessionCredential() *SessionCredential {
|
||||
return signer.sessionCredential
|
||||
}
|
||||
|
||||
func (signer *RamRoleArnSigner) Shutdown() {
|
||||
|
||||
}
|
||||
|
||||
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_sts_token.go
generated
vendored
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_sts_token.go
generated
vendored
@@ -22,10 +22,10 @@ type StsTokenSigner struct {
|
||||
credential *credentials.StsTokenCredential
|
||||
}
|
||||
|
||||
func NewStsTokenSigner(credential *credentials.StsTokenCredential) (*StsTokenSigner, error) {
|
||||
func NewStsTokenSigner(credential *credentials.StsTokenCredential) *StsTokenSigner {
|
||||
return &StsTokenSigner{
|
||||
credential: credential,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (*StsTokenSigner) GetName() string {
|
||||
@@ -52,7 +52,3 @@ func (signer *StsTokenSigner) Sign(stringToSign, secretSuffix string) string {
|
||||
secret := signer.credential.AccessKeySecret + secretSuffix
|
||||
return ShaHmac1(stringToSign, secret)
|
||||
}
|
||||
|
||||
func (signer *StsTokenSigner) Shutdown() {
|
||||
|
||||
}
|
||||
|
||||
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_v2.go
generated
vendored
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers/signer_v2.go
generated
vendored
@@ -26,10 +26,10 @@ func (signer *SignerV2) GetExtraParam() map[string]string {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewSignerV2(credential *credentials.RsaKeyPairCredential) (*SignerV2, error) {
|
||||
func NewSignerV2(credential *credentials.RsaKeyPairCredential) *SignerV2 {
|
||||
return &SignerV2{
|
||||
credential: credential,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (*SignerV2) GetName() string {
|
||||
@@ -52,7 +52,3 @@ func (signer *SignerV2) Sign(stringToSign, secretSuffix string) string {
|
||||
secret := signer.credential.PrivateKey
|
||||
return Sha256WithRsa(stringToSign, secret)
|
||||
}
|
||||
|
||||
func (signer *SignerV2) Shutdown() {
|
||||
|
||||
}
|
||||
|
||||
535
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/client.go
generated
vendored
535
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/client.go
generated
vendored
@@ -15,28 +15,64 @@
|
||||
package sdk
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
"net"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"sync"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
)
|
||||
|
||||
// this value will be replaced while build: -ldflags="-X sdk.version=x.x.x"
|
||||
var Version = "0.0.1"
|
||||
var debug utils.Debug
|
||||
|
||||
func init() {
|
||||
debug = utils.Init("sdk")
|
||||
}
|
||||
|
||||
// Version this value will be replaced while build: -ldflags="-X sdk.version=x.x.x"
|
||||
var Version = "0.0.1"
|
||||
var defaultConnectTimeout = 5 * time.Second
|
||||
var defaultReadTimeout = 10 * time.Second
|
||||
|
||||
var DefaultUserAgent = fmt.Sprintf("AlibabaCloud (%s; %s) Golang/%s Core/%s", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), Version)
|
||||
|
||||
var hookDo = func(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) {
|
||||
return fn
|
||||
}
|
||||
|
||||
// Client the type Client
|
||||
type Client struct {
|
||||
isInsecure bool
|
||||
regionId string
|
||||
config *Config
|
||||
httpProxy string
|
||||
httpsProxy string
|
||||
noProxy string
|
||||
logger *Logger
|
||||
userAgent map[string]string
|
||||
signer auth.Signer
|
||||
httpClient *http.Client
|
||||
asyncTaskQueue chan func()
|
||||
readTimeout time.Duration
|
||||
connectTimeout time.Duration
|
||||
EndpointMap map[string]string
|
||||
EndpointType string
|
||||
Network string
|
||||
|
||||
debug bool
|
||||
isRunning bool
|
||||
@@ -48,14 +84,62 @@ func (client *Client) Init() (err error) {
|
||||
panic("not support yet")
|
||||
}
|
||||
|
||||
func (client *Client) SetEndpointRules(endpointMap map[string]string, endpointType string, netWork string) {
|
||||
client.EndpointMap = endpointMap
|
||||
client.Network = netWork
|
||||
client.EndpointType = endpointType
|
||||
}
|
||||
|
||||
func (client *Client) SetHTTPSInsecure(isInsecure bool) {
|
||||
client.isInsecure = isInsecure
|
||||
}
|
||||
|
||||
func (client *Client) GetHTTPSInsecure() bool {
|
||||
return client.isInsecure
|
||||
}
|
||||
|
||||
func (client *Client) SetHttpsProxy(httpsProxy string) {
|
||||
client.httpsProxy = httpsProxy
|
||||
}
|
||||
|
||||
func (client *Client) GetHttpsProxy() string {
|
||||
return client.httpsProxy
|
||||
}
|
||||
|
||||
func (client *Client) SetHttpProxy(httpProxy string) {
|
||||
client.httpProxy = httpProxy
|
||||
}
|
||||
|
||||
func (client *Client) GetHttpProxy() string {
|
||||
return client.httpProxy
|
||||
}
|
||||
|
||||
func (client *Client) SetNoProxy(noProxy string) {
|
||||
client.noProxy = noProxy
|
||||
}
|
||||
|
||||
func (client *Client) GetNoProxy() string {
|
||||
return client.noProxy
|
||||
}
|
||||
|
||||
// InitWithProviderChain will get credential from the providerChain,
|
||||
// the RsaKeyPairCredential Only applicable to regionID `ap-northeast-1`,
|
||||
// if your providerChain may return a credential type with RsaKeyPairCredential,
|
||||
// please ensure your regionID is `ap-northeast-1`.
|
||||
func (client *Client) InitWithProviderChain(regionId string, provider provider.Provider) (err error) {
|
||||
config := client.InitClientConfig()
|
||||
credential, err := provider.Resolve()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return client.InitWithOptions(regionId, config, credential)
|
||||
}
|
||||
|
||||
func (client *Client) InitWithOptions(regionId string, config *Config, credential auth.Credential) (err error) {
|
||||
client.isRunning = true
|
||||
client.asyncChanLock = new(sync.RWMutex)
|
||||
client.regionId = regionId
|
||||
client.config = config
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
client.httpClient = &http.Client{}
|
||||
|
||||
if config.HttpTransport != nil {
|
||||
@@ -75,6 +159,58 @@ func (client *Client) InitWithOptions(regionId string, config *Config, credentia
|
||||
return
|
||||
}
|
||||
|
||||
func (client *Client) SetReadTimeout(readTimeout time.Duration) {
|
||||
client.readTimeout = readTimeout
|
||||
}
|
||||
|
||||
func (client *Client) SetConnectTimeout(connectTimeout time.Duration) {
|
||||
client.connectTimeout = connectTimeout
|
||||
}
|
||||
|
||||
func (client *Client) GetReadTimeout() time.Duration {
|
||||
return client.readTimeout
|
||||
}
|
||||
|
||||
func (client *Client) GetConnectTimeout() time.Duration {
|
||||
return client.connectTimeout
|
||||
}
|
||||
|
||||
func (client *Client) getHttpProxy(scheme string) (proxy *url.URL, err error) {
|
||||
if scheme == "https" {
|
||||
if client.GetHttpsProxy() != "" {
|
||||
proxy, err = url.Parse(client.httpsProxy)
|
||||
} else if rawurl := os.Getenv("HTTPS_PROXY"); rawurl != "" {
|
||||
proxy, err = url.Parse(rawurl)
|
||||
} else if rawurl := os.Getenv("https_proxy"); rawurl != "" {
|
||||
proxy, err = url.Parse(rawurl)
|
||||
}
|
||||
} else {
|
||||
if client.GetHttpProxy() != "" {
|
||||
proxy, err = url.Parse(client.httpProxy)
|
||||
} else if rawurl := os.Getenv("HTTP_PROXY"); rawurl != "" {
|
||||
proxy, err = url.Parse(rawurl)
|
||||
} else if rawurl := os.Getenv("http_proxy"); rawurl != "" {
|
||||
proxy, err = url.Parse(rawurl)
|
||||
}
|
||||
}
|
||||
|
||||
return proxy, err
|
||||
}
|
||||
|
||||
func (client *Client) getNoProxy(scheme string) []string {
|
||||
var urls []string
|
||||
if client.GetNoProxy() != "" {
|
||||
urls = strings.Split(client.noProxy, ",")
|
||||
} else if rawurl := os.Getenv("NO_PROXY"); rawurl != "" {
|
||||
urls = strings.Split(rawurl, ",")
|
||||
} else if rawurl := os.Getenv("no_proxy"); rawurl != "" {
|
||||
urls = strings.Split(rawurl, ",")
|
||||
}
|
||||
|
||||
return urls
|
||||
}
|
||||
|
||||
// EnableAsync enable the async task queue
|
||||
func (client *Client) EnableAsync(routinePoolSize, maxTaskQueueSize int) {
|
||||
client.asyncTaskQueue = make(chan func(), maxTaskQueueSize)
|
||||
for i := 0; i < routinePoolSize; i++ {
|
||||
@@ -121,6 +257,18 @@ func (client *Client) InitWithRamRoleArn(regionId, accessKeyId, accessKeySecret,
|
||||
return client.InitWithOptions(regionId, config, credential)
|
||||
}
|
||||
|
||||
func (client *Client) InitWithRamRoleArnAndPolicy(regionId, accessKeyId, accessKeySecret, roleArn, roleSessionName, policy string) (err error) {
|
||||
config := client.InitClientConfig()
|
||||
credential := &credentials.RamRoleArnCredential{
|
||||
AccessKeyId: accessKeyId,
|
||||
AccessKeySecret: accessKeySecret,
|
||||
RoleArn: roleArn,
|
||||
RoleSessionName: roleSessionName,
|
||||
Policy: policy,
|
||||
}
|
||||
return client.InitWithOptions(regionId, config, credential)
|
||||
}
|
||||
|
||||
func (client *Client) InitWithRsaKeyPair(regionId, publicKeyId, privateKey string, sessionExpiration int) (err error) {
|
||||
config := client.InitClientConfig()
|
||||
credential := &credentials.RsaKeyPairCredential{
|
||||
@@ -139,6 +287,14 @@ func (client *Client) InitWithEcsRamRole(regionId, roleName string) (err error)
|
||||
return client.InitWithOptions(regionId, config, credential)
|
||||
}
|
||||
|
||||
func (client *Client) InitWithBearerToken(regionId, bearerToken string) (err error) {
|
||||
config := client.InitClientConfig()
|
||||
credential := &credentials.BearerTokenCredential{
|
||||
BearerToken: bearerToken,
|
||||
}
|
||||
return client.InitWithOptions(regionId, config, credential)
|
||||
}
|
||||
|
||||
func (client *Client) InitClientConfig() (config *Config) {
|
||||
if client.config != nil {
|
||||
return client.config
|
||||
@@ -151,52 +307,22 @@ func (client *Client) DoAction(request requests.AcsRequest, response responses.A
|
||||
return client.DoActionWithSigner(request, response, nil)
|
||||
}
|
||||
|
||||
func (client *Client) BuildRequestWithSigner(request requests.AcsRequest, signer auth.Signer) (err error) {
|
||||
// add clientVersion
|
||||
request.GetHeaders()["x-sdk-core-version"] = Version
|
||||
|
||||
regionId := client.regionId
|
||||
if len(request.GetRegionId()) > 0 {
|
||||
regionId = request.GetRegionId()
|
||||
}
|
||||
|
||||
// resolve endpoint
|
||||
resolveParam := &endpoints.ResolveParam{
|
||||
Domain: request.GetDomain(),
|
||||
Product: request.GetProduct(),
|
||||
RegionId: regionId,
|
||||
LocationProduct: request.GetLocationServiceCode(),
|
||||
LocationEndpointType: request.GetLocationEndpointType(),
|
||||
CommonApi: client.ProcessCommonRequest,
|
||||
}
|
||||
endpoint, err := endpoints.Resolve(resolveParam)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
request.SetDomain(endpoint)
|
||||
|
||||
// init request params
|
||||
err = requests.InitParams(request)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// signature
|
||||
var finalSigner auth.Signer
|
||||
if signer != nil {
|
||||
finalSigner = signer
|
||||
func (client *Client) GetEndpointRules(regionId string, product string) (endpointRaw string) {
|
||||
if client.EndpointType == "regional" {
|
||||
endpointRaw = strings.Replace("<product><network>.<region_id>.aliyuncs.com", "<region_id>", regionId, 1)
|
||||
} else {
|
||||
finalSigner = client.signer
|
||||
endpointRaw = "<product><network>.aliyuncs.com"
|
||||
}
|
||||
httpRequest, err := buildHttpRequest(request, finalSigner, regionId)
|
||||
if client.config.UserAgent != "" {
|
||||
httpRequest.Header.Set("User-Agent", client.config.UserAgent)
|
||||
endpointRaw = strings.Replace(endpointRaw, "<product>", strings.ToLower(product), 1)
|
||||
if client.Network == "" || client.Network == "public" {
|
||||
endpointRaw = strings.Replace(endpointRaw, "<network>", "", 1)
|
||||
} else {
|
||||
endpointRaw = strings.Replace(endpointRaw, "<network>", "-"+client.Network, 1)
|
||||
}
|
||||
return err
|
||||
return endpointRaw
|
||||
}
|
||||
|
||||
func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) {
|
||||
|
||||
func (client *Client) buildRequestWithSigner(request requests.AcsRequest, signer auth.Signer) (httpRequest *http.Request, err error) {
|
||||
// add clientVersion
|
||||
request.GetHeaders()["x-sdk-core-version"] = Version
|
||||
|
||||
@@ -206,20 +332,33 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
|
||||
}
|
||||
|
||||
// resolve endpoint
|
||||
resolveParam := &endpoints.ResolveParam{
|
||||
Domain: request.GetDomain(),
|
||||
Product: request.GetProduct(),
|
||||
RegionId: regionId,
|
||||
LocationProduct: request.GetLocationServiceCode(),
|
||||
LocationEndpointType: request.GetLocationEndpointType(),
|
||||
CommonApi: client.ProcessCommonRequest,
|
||||
}
|
||||
endpoint, err := endpoints.Resolve(resolveParam)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
request.SetDomain(endpoint)
|
||||
endpoint := request.GetDomain()
|
||||
if endpoint == "" && client.EndpointType != "" {
|
||||
if client.EndpointMap != nil && client.Network == "" || client.Network == "public" {
|
||||
endpoint = client.EndpointMap[regionId]
|
||||
}
|
||||
|
||||
if endpoint == "" {
|
||||
endpoint = client.GetEndpointRules(regionId, request.GetProduct())
|
||||
}
|
||||
}
|
||||
|
||||
if endpoint == "" {
|
||||
resolveParam := &endpoints.ResolveParam{
|
||||
Domain: request.GetDomain(),
|
||||
Product: request.GetProduct(),
|
||||
RegionId: regionId,
|
||||
LocationProduct: request.GetLocationServiceCode(),
|
||||
LocationEndpointType: request.GetLocationEndpointType(),
|
||||
CommonApi: client.ProcessCommonRequest,
|
||||
}
|
||||
endpoint, err = endpoints.Resolve(resolveParam)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
request.SetDomain(endpoint)
|
||||
if request.GetScheme() == "" {
|
||||
request.SetScheme(client.config.Scheme)
|
||||
}
|
||||
@@ -236,36 +375,213 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
|
||||
} else {
|
||||
finalSigner = client.signer
|
||||
}
|
||||
httpRequest, err := buildHttpRequest(request, finalSigner, regionId)
|
||||
if client.config.UserAgent != "" {
|
||||
httpRequest.Header.Set("User-Agent", client.config.UserAgent)
|
||||
httpRequest, err = buildHttpRequest(request, finalSigner, regionId)
|
||||
if err == nil {
|
||||
userAgent := DefaultUserAgent + getSendUserAgent(client.config.UserAgent, client.userAgent, request.GetUserAgent())
|
||||
httpRequest.Header.Set("User-Agent", userAgent)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func getSendUserAgent(configUserAgent string, clientUserAgent, requestUserAgent map[string]string) string {
|
||||
realUserAgent := ""
|
||||
for key1, value1 := range clientUserAgent {
|
||||
for key2, _ := range requestUserAgent {
|
||||
if key1 == key2 {
|
||||
key1 = ""
|
||||
}
|
||||
}
|
||||
if key1 != "" {
|
||||
realUserAgent += fmt.Sprintf(" %s/%s", key1, value1)
|
||||
|
||||
}
|
||||
}
|
||||
for key, value := range requestUserAgent {
|
||||
realUserAgent += fmt.Sprintf(" %s/%s", key, value)
|
||||
}
|
||||
if configUserAgent != "" {
|
||||
return realUserAgent + fmt.Sprintf(" Extra/%s", configUserAgent)
|
||||
}
|
||||
return realUserAgent
|
||||
}
|
||||
|
||||
func (client *Client) AppendUserAgent(key, value string) {
|
||||
newkey := true
|
||||
|
||||
if client.userAgent == nil {
|
||||
client.userAgent = make(map[string]string)
|
||||
}
|
||||
if strings.ToLower(key) != "core" && strings.ToLower(key) != "go" {
|
||||
for tag, _ := range client.userAgent {
|
||||
if tag == key {
|
||||
client.userAgent[tag] = value
|
||||
newkey = false
|
||||
}
|
||||
}
|
||||
if newkey {
|
||||
client.userAgent[key] = value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (client *Client) BuildRequestWithSigner(request requests.AcsRequest, signer auth.Signer) (err error) {
|
||||
_, err = client.buildRequestWithSigner(request, signer)
|
||||
return
|
||||
}
|
||||
|
||||
func (client *Client) getTimeout(request requests.AcsRequest) (time.Duration, time.Duration) {
|
||||
readTimeout := defaultReadTimeout
|
||||
connectTimeout := defaultConnectTimeout
|
||||
|
||||
reqReadTimeout := request.GetReadTimeout()
|
||||
reqConnectTimeout := request.GetConnectTimeout()
|
||||
if reqReadTimeout != 0*time.Millisecond {
|
||||
readTimeout = reqReadTimeout
|
||||
} else if client.readTimeout != 0*time.Millisecond {
|
||||
readTimeout = client.readTimeout
|
||||
} else if client.httpClient.Timeout != 0 {
|
||||
readTimeout = client.httpClient.Timeout
|
||||
} else if timeout, ok := getAPIMaxTimeout(request.GetProduct(), request.GetActionName()); ok {
|
||||
readTimeout = timeout
|
||||
}
|
||||
|
||||
if reqConnectTimeout != 0*time.Millisecond {
|
||||
connectTimeout = reqConnectTimeout
|
||||
} else if client.connectTimeout != 0*time.Millisecond {
|
||||
connectTimeout = client.connectTimeout
|
||||
}
|
||||
return readTimeout, connectTimeout
|
||||
}
|
||||
|
||||
func Timeout(connectTimeout time.Duration) func(cxt context.Context, net, addr string) (c net.Conn, err error) {
|
||||
return func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
return (&net.Dialer{
|
||||
Timeout: connectTimeout,
|
||||
DualStack: true,
|
||||
}).DialContext(ctx, network, address)
|
||||
}
|
||||
}
|
||||
|
||||
func (client *Client) setTimeout(request requests.AcsRequest) {
|
||||
readTimeout, connectTimeout := client.getTimeout(request)
|
||||
client.httpClient.Timeout = readTimeout
|
||||
if trans, ok := client.httpClient.Transport.(*http.Transport); ok && trans != nil {
|
||||
trans.DialContext = Timeout(connectTimeout)
|
||||
client.httpClient.Transport = trans
|
||||
} else {
|
||||
client.httpClient.Transport = &http.Transport{
|
||||
DialContext: Timeout(connectTimeout),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (client *Client) getHTTPSInsecure(request requests.AcsRequest) (insecure bool) {
|
||||
if request.GetHTTPSInsecure() != nil {
|
||||
insecure = *request.GetHTTPSInsecure()
|
||||
} else {
|
||||
insecure = client.GetHTTPSInsecure()
|
||||
}
|
||||
return insecure
|
||||
}
|
||||
|
||||
func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) {
|
||||
|
||||
fieldMap := make(map[string]string)
|
||||
initLogMsg(fieldMap)
|
||||
defer func() {
|
||||
client.printLog(fieldMap, err)
|
||||
}()
|
||||
httpRequest, err := client.buildRequestWithSigner(request, signer)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
client.setTimeout(request)
|
||||
proxy, err := client.getHttpProxy(httpRequest.URL.Scheme)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
noProxy := client.getNoProxy(httpRequest.URL.Scheme)
|
||||
|
||||
var flag bool
|
||||
for _, value := range noProxy {
|
||||
if value == httpRequest.Host {
|
||||
flag = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Set whether to ignore certificate validation.
|
||||
// Default InsecureSkipVerify is false.
|
||||
if trans, ok := client.httpClient.Transport.(*http.Transport); ok && trans != nil {
|
||||
trans.TLSClientConfig = &tls.Config{
|
||||
InsecureSkipVerify: client.getHTTPSInsecure(request),
|
||||
}
|
||||
if proxy != nil && !flag {
|
||||
trans.Proxy = http.ProxyURL(proxy)
|
||||
}
|
||||
client.httpClient.Transport = trans
|
||||
}
|
||||
|
||||
var httpResponse *http.Response
|
||||
for retryTimes := 0; retryTimes <= client.config.MaxRetryTime; retryTimes++ {
|
||||
httpResponse, err = client.httpClient.Do(httpRequest)
|
||||
if proxy != nil && proxy.User != nil {
|
||||
if password, passwordSet := proxy.User.Password(); passwordSet {
|
||||
httpRequest.SetBasicAuth(proxy.User.Username(), password)
|
||||
}
|
||||
}
|
||||
if retryTimes > 0 {
|
||||
client.printLog(fieldMap, err)
|
||||
initLogMsg(fieldMap)
|
||||
}
|
||||
putMsgToMap(fieldMap, httpRequest)
|
||||
debug("> %s %s %s", httpRequest.Method, httpRequest.URL.RequestURI(), httpRequest.Proto)
|
||||
debug("> Host: %s", httpRequest.Host)
|
||||
for key, value := range httpRequest.Header {
|
||||
debug("> %s: %v", key, strings.Join(value, ""))
|
||||
}
|
||||
debug(">")
|
||||
debug(" Retry Times: %d.", retryTimes)
|
||||
|
||||
var timeout bool
|
||||
startTime := time.Now()
|
||||
fieldMap["{start_time}"] = startTime.Format("2006-01-02 15:04:05")
|
||||
httpResponse, err = hookDo(client.httpClient.Do)(httpRequest)
|
||||
fieldMap["{cost}"] = time.Now().Sub(startTime).String()
|
||||
if err == nil {
|
||||
fieldMap["{code}"] = strconv.Itoa(httpResponse.StatusCode)
|
||||
fieldMap["{res_headers}"] = TransToString(httpResponse.Header)
|
||||
debug("< %s %s", httpResponse.Proto, httpResponse.Status)
|
||||
for key, value := range httpResponse.Header {
|
||||
debug("< %s: %v", key, strings.Join(value, ""))
|
||||
}
|
||||
}
|
||||
debug("<")
|
||||
// receive error
|
||||
if err != nil {
|
||||
debug(" Error: %s.", err.Error())
|
||||
if !client.config.AutoRetry {
|
||||
return
|
||||
} else if timeout = isTimeout(err); !timeout {
|
||||
// if not timeout error, return
|
||||
return
|
||||
} else if retryTimes >= client.config.MaxRetryTime {
|
||||
// timeout but reached the max retry times, return
|
||||
timeoutErrorMsg := fmt.Sprintf(errors.TimeoutErrorMessage, strconv.Itoa(retryTimes+1), strconv.Itoa(retryTimes+1))
|
||||
times := strconv.Itoa(retryTimes + 1)
|
||||
timeoutErrorMsg := fmt.Sprintf(errors.TimeoutErrorMessage, times, times)
|
||||
if strings.Contains(err.Error(), "Client.Timeout") {
|
||||
timeoutErrorMsg += " Read timeout. Please set a valid ReadTimeout."
|
||||
} else {
|
||||
timeoutErrorMsg += " Connect timeout. Please set a valid ConnectTimeout."
|
||||
}
|
||||
err = errors.NewClientError(errors.TimeoutErrorCode, timeoutErrorMsg, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
// if status code >= 500 or timeout, will trigger retry
|
||||
if client.config.AutoRetry && (timeout || isServerError(httpResponse)) {
|
||||
if client.config.AutoRetry && (err != nil || isServerError(httpResponse)) {
|
||||
client.setTimeout(request)
|
||||
// rewrite signatureNonce and signature
|
||||
httpRequest, err = buildHttpRequest(request, finalSigner, regionId)
|
||||
httpRequest, err = client.buildRequestWithSigner(request, signer)
|
||||
// buildHttpRequest(request, finalSigner, regionId)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -273,7 +589,10 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
err = responses.Unmarshal(response, httpResponse, request.GetAcceptFormat())
|
||||
fieldMap["{res_body}"] = response.GetHttpContentString()
|
||||
debug("%s", response.GetHttpContentString())
|
||||
// wrap server errors
|
||||
if serverErr, ok := err.(*errors.ServerError); ok {
|
||||
var wrapInfo = map[string]string{}
|
||||
@@ -283,6 +602,18 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
|
||||
return
|
||||
}
|
||||
|
||||
func putMsgToMap(fieldMap map[string]string, request *http.Request) {
|
||||
fieldMap["{host}"] = request.Host
|
||||
fieldMap["{method}"] = request.Method
|
||||
fieldMap["{uri}"] = request.URL.RequestURI()
|
||||
fieldMap["{pid}"] = strconv.Itoa(os.Getpid())
|
||||
fieldMap["{version}"] = strings.Split(request.Proto, "/")[1]
|
||||
hostname, _ := os.Hostname()
|
||||
fieldMap["{hostname}"] = hostname
|
||||
fieldMap["{req_headers}"] = TransToString(request.Header)
|
||||
fieldMap["{target}"] = request.URL.Path + request.URL.RawQuery
|
||||
}
|
||||
|
||||
func buildHttpRequest(request requests.AcsRequest, singer auth.Signer, regionId string) (httpRequest *http.Request, err error) {
|
||||
err = auth.Sign(request, singer, regionId)
|
||||
if err != nil {
|
||||
@@ -305,14 +636,6 @@ func buildHttpRequest(request requests.AcsRequest, singer auth.Signer, regionId
|
||||
return
|
||||
}
|
||||
|
||||
func isTimeout(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
netErr, isNetError := err.(net.Error)
|
||||
return isNetError && netErr.Timeout()
|
||||
}
|
||||
|
||||
func isServerError(httpResponse *http.Response) bool {
|
||||
return httpResponse.StatusCode >= http.StatusInternalServerError
|
||||
}
|
||||
@@ -345,6 +668,18 @@ func NewClient() (client *Client, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func NewClientWithProvider(regionId string, providers ...provider.Provider) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
var pc provider.Provider
|
||||
if len(providers) == 0 {
|
||||
pc = provider.DefaultChain
|
||||
} else {
|
||||
pc = provider.NewProviderChain(providers)
|
||||
}
|
||||
err = client.InitWithProviderChain(regionId, pc)
|
||||
return
|
||||
}
|
||||
|
||||
func NewClientWithOptions(regionId string, config *Config, credential auth.Credential) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithOptions(regionId, config, credential)
|
||||
@@ -369,6 +704,12 @@ func NewClientWithRamRoleArn(regionId string, accessKeyId, accessKeySecret, role
|
||||
return
|
||||
}
|
||||
|
||||
func NewClientWithRamRoleArnAndPolicy(regionId string, accessKeyId, accessKeySecret, roleArn, roleSessionName, policy string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithRamRoleArnAndPolicy(regionId, accessKeyId, accessKeySecret, roleArn, roleSessionName, policy)
|
||||
return
|
||||
}
|
||||
|
||||
func NewClientWithEcsRamRole(regionId string, roleName string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithEcsRamRole(regionId, roleName)
|
||||
@@ -381,14 +722,10 @@ func NewClientWithRsaKeyPair(regionId string, publicKeyId, privateKey string, se
|
||||
return
|
||||
}
|
||||
|
||||
// Deprecated: Use NewClientWithRamRoleArn in this package instead.
|
||||
func NewClientWithStsRoleArn(regionId string, accessKeyId, accessKeySecret, roleArn, roleSessionName string) (client *Client, err error) {
|
||||
return NewClientWithRamRoleArn(regionId, accessKeyId, accessKeySecret, roleArn, roleSessionName)
|
||||
}
|
||||
|
||||
// Deprecated: Use NewClientWithEcsRamRole in this package instead.
|
||||
func NewClientWithStsRoleNameOnEcs(regionId string, roleName string) (client *Client, err error) {
|
||||
return NewClientWithEcsRamRole(regionId, roleName)
|
||||
func NewClientWithBearerToken(regionId, bearerToken string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithBearerToken(regionId, bearerToken)
|
||||
return
|
||||
}
|
||||
|
||||
func (client *Client) ProcessCommonRequest(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
|
||||
@@ -404,16 +741,26 @@ func (client *Client) ProcessCommonRequestWithSigner(request *requests.CommonReq
|
||||
response = responses.NewCommonResponse()
|
||||
err = client.DoActionWithSigner(request, response, signer)
|
||||
return
|
||||
} else {
|
||||
panic("should not be here")
|
||||
}
|
||||
panic("should not be here")
|
||||
}
|
||||
|
||||
func (client *Client) Shutdown() {
|
||||
client.signer.Shutdown()
|
||||
// lock the addAsync()
|
||||
client.asyncChanLock.Lock()
|
||||
defer client.asyncChanLock.Unlock()
|
||||
if client.asyncTaskQueue != nil {
|
||||
close(client.asyncTaskQueue)
|
||||
}
|
||||
client.isRunning = false
|
||||
close(client.asyncTaskQueue)
|
||||
}
|
||||
|
||||
// Deprecated: Use NewClientWithRamRoleArn in this package instead.
|
||||
func NewClientWithStsRoleArn(regionId string, accessKeyId, accessKeySecret, roleArn, roleSessionName string) (client *Client, err error) {
|
||||
return NewClientWithRamRoleArn(regionId, accessKeyId, accessKeySecret, roleArn, roleSessionName)
|
||||
}
|
||||
|
||||
// Deprecated: Use NewClientWithEcsRamRole in this package instead.
|
||||
func NewClientWithStsRoleNameOnEcs(regionId string, roleName string) (client *Client, err error) {
|
||||
return NewClientWithEcsRamRole(regionId, roleName)
|
||||
}
|
||||
|
||||
24
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/config.go
generated
vendored
24
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/config.go
generated
vendored
@@ -15,9 +15,10 @@
|
||||
package sdk
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
@@ -25,12 +26,12 @@ type Config struct {
|
||||
MaxRetryTime int `default:"3"`
|
||||
UserAgent string `default:""`
|
||||
Debug bool `default:"false"`
|
||||
Timeout time.Duration `default:"10000000000"`
|
||||
HttpTransport *http.Transport `default:""`
|
||||
EnableAsync bool `default:"false"`
|
||||
MaxTaskQueueSize int `default:"1000"`
|
||||
GoRoutinePoolSize int `default:"5"`
|
||||
Scheme string `default:"HTTP"`
|
||||
Timeout time.Duration
|
||||
}
|
||||
|
||||
func NewConfig() (config *Config) {
|
||||
@@ -39,11 +40,6 @@ func NewConfig() (config *Config) {
|
||||
return
|
||||
}
|
||||
|
||||
func (c *Config) WithTimeout(timeout time.Duration) *Config {
|
||||
c.Timeout = timeout
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *Config) WithAutoRetry(isAutoRetry bool) *Config {
|
||||
c.AutoRetry = isAutoRetry
|
||||
return c
|
||||
@@ -59,6 +55,16 @@ func (c *Config) WithUserAgent(userAgent string) *Config {
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *Config) WithDebug(isDebug bool) *Config {
|
||||
c.Debug = isDebug
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *Config) WithTimeout(timeout time.Duration) *Config {
|
||||
c.Timeout = timeout
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *Config) WithHttpTransport(httpTransport *http.Transport) *Config {
|
||||
c.HttpTransport = httpTransport
|
||||
return c
|
||||
@@ -79,7 +85,7 @@ func (c *Config) WithGoRoutinePoolSize(goRoutinePoolSize int) *Config {
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *Config) WithDebug(isDebug bool) *Config {
|
||||
c.Debug = isDebug
|
||||
func (c *Config) WithScheme(scheme string) *Config {
|
||||
c.Scheme = scheme
|
||||
return c
|
||||
}
|
||||
|
||||
4593
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/endpoints_config.go
generated
vendored
4593
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/endpoints_config.go
generated
vendored
File diff suppressed because it is too large
Load Diff
10
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/local_global_resolver.go
generated
vendored
10
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/local_global_resolver.go
generated
vendored
@@ -16,13 +16,19 @@ package endpoints
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/jmespath/go-jmespath"
|
||||
"strings"
|
||||
|
||||
"github.com/jmespath/go-jmespath"
|
||||
)
|
||||
|
||||
type LocalGlobalResolver struct {
|
||||
}
|
||||
|
||||
func (resolver *LocalGlobalResolver) GetName() (name string) {
|
||||
name = "local global resolver"
|
||||
return
|
||||
}
|
||||
|
||||
func (resolver *LocalGlobalResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
|
||||
// get the global endpoints configs
|
||||
endpointExpression := fmt.Sprintf("products[?code=='%s'].global_endpoint", strings.ToLower(param.Product))
|
||||
@@ -30,7 +36,7 @@ func (resolver *LocalGlobalResolver) TryResolve(param *ResolveParam) (endpoint s
|
||||
if err == nil && endpointData != nil && len(endpointData.([]interface{})) > 0 {
|
||||
endpoint = endpointData.([]interface{})[0].(string)
|
||||
support = len(endpoint) > 0
|
||||
return endpoint, support, nil
|
||||
return
|
||||
}
|
||||
support = false
|
||||
return
|
||||
|
||||
13
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/local_regional_resolver.go
generated
vendored
13
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/local_regional_resolver.go
generated
vendored
@@ -16,24 +16,31 @@ package endpoints
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/jmespath/go-jmespath"
|
||||
"strings"
|
||||
|
||||
"github.com/jmespath/go-jmespath"
|
||||
)
|
||||
|
||||
type LocalRegionalResolver struct {
|
||||
}
|
||||
|
||||
func (resolver *LocalRegionalResolver) GetName() (name string) {
|
||||
name = "local regional resolver"
|
||||
return
|
||||
}
|
||||
|
||||
func (resolver *LocalRegionalResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
|
||||
// get the regional endpoints configs
|
||||
regionalExpression := fmt.Sprintf("products[?code=='%s'].regional_endpoints", strings.ToLower(param.Product))
|
||||
regionalData, err := jmespath.Search(regionalExpression, getEndpointConfigData())
|
||||
if err == nil && regionalData != nil && len(regionalData.([]interface{})) > 0 {
|
||||
endpointExpression := fmt.Sprintf("[0][?region=='%s'].endpoint", strings.ToLower(param.RegionId))
|
||||
endpointData, err := jmespath.Search(endpointExpression, regionalData)
|
||||
var endpointData interface{}
|
||||
endpointData, err = jmespath.Search(endpointExpression, regionalData)
|
||||
if err == nil && endpointData != nil && len(endpointData.([]interface{})) > 0 {
|
||||
endpoint = endpointData.([]interface{})[0].(string)
|
||||
support = len(endpoint) > 0
|
||||
return endpoint, support, nil
|
||||
return
|
||||
}
|
||||
}
|
||||
support = false
|
||||
|
||||
85
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/location_resolver.go
generated
vendored
85
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/location_resolver.go
generated
vendored
@@ -15,28 +15,51 @@ package endpoints
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
)
|
||||
|
||||
const (
|
||||
// EndpointCacheExpireTime ...
|
||||
EndpointCacheExpireTime = 3600 //Seconds
|
||||
)
|
||||
|
||||
var lastClearTimePerProduct = struct {
|
||||
// Cache caches endpoint for specific product and region
|
||||
type Cache struct {
|
||||
sync.RWMutex
|
||||
cache map[string]int64
|
||||
}{cache: make(map[string]int64)}
|
||||
cache map[string]interface{}
|
||||
}
|
||||
|
||||
var endpointCache = struct {
|
||||
sync.RWMutex
|
||||
cache map[string]string
|
||||
}{cache: make(map[string]string)}
|
||||
// Get ...
|
||||
func (c *Cache) Get(k string) (v interface{}) {
|
||||
c.RLock()
|
||||
v = c.cache[k]
|
||||
c.RUnlock()
|
||||
return
|
||||
}
|
||||
|
||||
// Set ...
|
||||
func (c *Cache) Set(k string, v interface{}) {
|
||||
c.Lock()
|
||||
c.cache[k] = v
|
||||
c.Unlock()
|
||||
}
|
||||
|
||||
var lastClearTimePerProduct = &Cache{cache: make(map[string]interface{})}
|
||||
var endpointCache = &Cache{cache: make(map[string]interface{})}
|
||||
|
||||
// LocationResolver ...
|
||||
type LocationResolver struct {
|
||||
}
|
||||
|
||||
func (resolver *LocationResolver) GetName() (name string) {
|
||||
name = "location resolver"
|
||||
return
|
||||
}
|
||||
|
||||
// TryResolve resolves endpoint giving product and region
|
||||
func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
|
||||
if len(param.LocationProduct) <= 0 {
|
||||
support = false
|
||||
@@ -45,8 +68,10 @@ func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint stri
|
||||
|
||||
//get from cache
|
||||
cacheKey := param.Product + "#" + param.RegionId
|
||||
if endpointCache.cache != nil && len(endpointCache.cache[cacheKey]) > 0 && !CheckCacheIsExpire(cacheKey) {
|
||||
endpoint = endpointCache.cache[cacheKey]
|
||||
var ok bool
|
||||
endpoint, ok = endpointCache.Get(cacheKey).(string)
|
||||
|
||||
if ok && len(endpoint) > 0 && !CheckCacheIsExpire(cacheKey) {
|
||||
support = true
|
||||
return
|
||||
}
|
||||
@@ -57,7 +82,7 @@ func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint stri
|
||||
getEndpointRequest.Product = "Location"
|
||||
getEndpointRequest.Version = "2015-06-12"
|
||||
getEndpointRequest.ApiName = "DescribeEndpoints"
|
||||
getEndpointRequest.Domain = "location.aliyuncs.com"
|
||||
getEndpointRequest.Domain = "location-readonly.aliyuncs.com"
|
||||
getEndpointRequest.Method = "GET"
|
||||
getEndpointRequest.Scheme = requests.HTTPS
|
||||
|
||||
@@ -70,13 +95,23 @@ func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint stri
|
||||
}
|
||||
|
||||
response, err := param.CommonApi(getEndpointRequest)
|
||||
var getEndpointResponse GetEndpointResponse
|
||||
if err != nil {
|
||||
support = false
|
||||
return
|
||||
}
|
||||
|
||||
if !response.IsSuccess() {
|
||||
support = false
|
||||
return
|
||||
}
|
||||
|
||||
json.Unmarshal([]byte(response.GetHttpContentString()), &getEndpointResponse)
|
||||
var getEndpointResponse GetEndpointResponse
|
||||
err = json.Unmarshal([]byte(response.GetHttpContentString()), &getEndpointResponse)
|
||||
if err != nil {
|
||||
support = false
|
||||
return
|
||||
}
|
||||
|
||||
if !getEndpointResponse.Success || getEndpointResponse.Endpoints == nil {
|
||||
support = false
|
||||
return
|
||||
@@ -87,12 +122,8 @@ func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint stri
|
||||
}
|
||||
if len(getEndpointResponse.Endpoints.Endpoint[0].Endpoint) > 0 {
|
||||
endpoint = getEndpointResponse.Endpoints.Endpoint[0].Endpoint
|
||||
endpointCache.Lock()
|
||||
endpointCache.cache[cacheKey] = endpoint
|
||||
endpointCache.Unlock()
|
||||
lastClearTimePerProduct.Lock()
|
||||
lastClearTimePerProduct.cache[cacheKey] = time.Now().Unix()
|
||||
lastClearTimePerProduct.Unlock()
|
||||
endpointCache.Set(cacheKey, endpoint)
|
||||
lastClearTimePerProduct.Set(cacheKey, time.Now().Unix())
|
||||
support = true
|
||||
return
|
||||
}
|
||||
@@ -101,13 +132,16 @@ func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint stri
|
||||
return
|
||||
}
|
||||
|
||||
// CheckCacheIsExpire ...
|
||||
func CheckCacheIsExpire(cacheKey string) bool {
|
||||
lastClearTime := lastClearTimePerProduct.cache[cacheKey]
|
||||
lastClearTime, ok := lastClearTimePerProduct.Get(cacheKey).(int64)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
|
||||
if lastClearTime <= 0 {
|
||||
lastClearTime = time.Now().Unix()
|
||||
lastClearTimePerProduct.Lock()
|
||||
lastClearTimePerProduct.cache[cacheKey] = lastClearTime
|
||||
lastClearTimePerProduct.Unlock()
|
||||
lastClearTimePerProduct.Set(cacheKey, lastClearTime)
|
||||
}
|
||||
|
||||
now := time.Now().Unix()
|
||||
@@ -119,18 +153,21 @@ func CheckCacheIsExpire(cacheKey string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// GetEndpointResponse ...
|
||||
type GetEndpointResponse struct {
|
||||
Endpoints *EndpointsObj
|
||||
RequestId string
|
||||
Success bool
|
||||
}
|
||||
|
||||
// EndpointsObj ...
|
||||
type EndpointsObj struct {
|
||||
Endpoint []EndpointObj
|
||||
}
|
||||
|
||||
// EndpointObj ...
|
||||
type EndpointObj struct {
|
||||
Protocols map[string]string
|
||||
// Protocols map[string]string
|
||||
Type string
|
||||
Namespace string
|
||||
Id string
|
||||
|
||||
9
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/mapping_resolver.go
generated
vendored
9
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/mapping_resolver.go
generated
vendored
@@ -23,15 +23,24 @@ const keyFormatter = "%s::%s"
|
||||
|
||||
var endpointMapping = make(map[string]string)
|
||||
|
||||
// AddEndpointMapping Use product id and region id as key to store the endpoint into inner map
|
||||
func AddEndpointMapping(regionId, productId, endpoint string) (err error) {
|
||||
key := fmt.Sprintf(keyFormatter, strings.ToLower(regionId), strings.ToLower(productId))
|
||||
endpointMapping[key] = endpoint
|
||||
return nil
|
||||
}
|
||||
|
||||
// MappingResolver the mapping resolver type
|
||||
type MappingResolver struct {
|
||||
}
|
||||
|
||||
// GetName get the resolver name: "mapping resolver"
|
||||
func (resolver *MappingResolver) GetName() (name string) {
|
||||
name = "mapping resolver"
|
||||
return
|
||||
}
|
||||
|
||||
// TryResolve use Product and RegionId as key to find endpoint from inner map
|
||||
func (resolver *MappingResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
|
||||
key := fmt.Sprintf(keyFormatter, strings.ToLower(param.RegionId), strings.ToLower(param.Product))
|
||||
endpoint, contains := endpointMapping[key]
|
||||
|
||||
26
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/resolver.go
generated
vendored
26
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/resolver.go
generated
vendored
@@ -17,12 +17,20 @@ package endpoints
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
"sync"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
)
|
||||
|
||||
var debug utils.Debug
|
||||
|
||||
func init() {
|
||||
debug = utils.Init("sdk")
|
||||
}
|
||||
|
||||
const (
|
||||
ResolveEndpointUserGuideLink = ""
|
||||
)
|
||||
@@ -32,20 +40,30 @@ var resolvers []Resolver
|
||||
|
||||
type Resolver interface {
|
||||
TryResolve(param *ResolveParam) (endpoint string, support bool, err error)
|
||||
GetName() (name string)
|
||||
}
|
||||
|
||||
// Resolve resolve endpoint with params
|
||||
// It will resolve with each supported resolver until anyone resolved
|
||||
func Resolve(param *ResolveParam) (endpoint string, err error) {
|
||||
supportedResolvers := getAllResolvers()
|
||||
var lastErr error
|
||||
for _, resolver := range supportedResolvers {
|
||||
endpoint, supported, err := resolver.TryResolve(param)
|
||||
endpoint, supported, resolveErr := resolver.TryResolve(param)
|
||||
if resolveErr != nil {
|
||||
lastErr = resolveErr
|
||||
}
|
||||
|
||||
if supported {
|
||||
return endpoint, err
|
||||
debug("resolve endpoint with %s\n", param)
|
||||
debug("\t%s by resolver(%s)\n", endpoint, resolver.GetName())
|
||||
return endpoint, nil
|
||||
}
|
||||
}
|
||||
|
||||
// not support
|
||||
errorMsg := fmt.Sprintf(errors.CanNotResolveEndpointErrorMessage, param, ResolveEndpointUserGuideLink)
|
||||
err = errors.NewClientError(errors.CanNotResolveEndpointErrorCode, errorMsg, nil)
|
||||
err = errors.NewClientError(errors.CanNotResolveEndpointErrorCode, errorMsg, lastErr)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/simple_host_resolver.go
generated
vendored
8
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints/simple_host_resolver.go
generated
vendored
@@ -14,9 +14,17 @@
|
||||
|
||||
package endpoints
|
||||
|
||||
// SimpleHostResolver the simple host resolver type
|
||||
type SimpleHostResolver struct {
|
||||
}
|
||||
|
||||
// GetName get the resolver name: "simple host resolver"
|
||||
func (resolver *SimpleHostResolver) GetName() (name string) {
|
||||
name = "simple host resolver"
|
||||
return
|
||||
}
|
||||
|
||||
// TryResolve if the Domain exist in param, use it as endpoint
|
||||
func (resolver *SimpleHostResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
|
||||
if support = len(param.Domain) > 0; support {
|
||||
endpoint = param.Domain
|
||||
|
||||
2
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors/client_error.go
generated
vendored
2
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors/client_error.go
generated
vendored
@@ -60,7 +60,7 @@ func NewClientError(errorCode, message string, originErr error) Error {
|
||||
}
|
||||
|
||||
func (err *ClientError) Error() string {
|
||||
clientErrMsg := fmt.Sprintf("[%s] %s", err.errorCode, err.message)
|
||||
clientErrMsg := fmt.Sprintf("[%s] %s", err.ErrorCode(), err.message)
|
||||
if err.originError != nil {
|
||||
return clientErrMsg + "\ncaused by:\n" + err.originError.Error()
|
||||
}
|
||||
|
||||
7
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors/server_error.go
generated
vendored
7
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors/server_error.go
generated
vendored
@@ -17,6 +17,7 @@ package errors
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/jmespath/go-jmespath"
|
||||
)
|
||||
|
||||
@@ -35,7 +36,7 @@ type ServerError struct {
|
||||
}
|
||||
|
||||
type ServerErrorWrapper interface {
|
||||
tryWrap(error *ServerError, wrapInfo map[string]string) (bool, *ServerError)
|
||||
tryWrap(error *ServerError, wrapInfo map[string]string) bool
|
||||
}
|
||||
|
||||
func (err *ServerError) Error() string {
|
||||
@@ -81,9 +82,9 @@ func NewServerError(httpStatus int, responseContent, comment string) Error {
|
||||
|
||||
func WrapServerError(originError *ServerError, wrapInfo map[string]string) *ServerError {
|
||||
for _, wrapper := range wrapperList {
|
||||
ok, newError := wrapper.tryWrap(originError, wrapInfo)
|
||||
ok := wrapper.tryWrap(originError, wrapInfo)
|
||||
if ok {
|
||||
return newError
|
||||
return originError
|
||||
}
|
||||
}
|
||||
return originError
|
||||
|
||||
@@ -1,29 +1,45 @@
|
||||
package errors
|
||||
|
||||
import "strings"
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
)
|
||||
|
||||
const SignatureDostNotMatchErrorCode = "SignatureDoesNotMatch"
|
||||
const MessagePrefix = "Specified signature is not matched with our calculation. server string to sign is:"
|
||||
const IncompleteSignatureErrorCode = "IncompleteSignature"
|
||||
const MessageContain = "server string to sign is:"
|
||||
|
||||
var debug utils.Debug
|
||||
|
||||
func init() {
|
||||
debug = utils.Init("sdk")
|
||||
}
|
||||
|
||||
type SignatureDostNotMatchWrapper struct {
|
||||
}
|
||||
|
||||
func (*SignatureDostNotMatchWrapper) tryWrap(error *ServerError, wrapInfo map[string]string) (bool, *ServerError) {
|
||||
func (*SignatureDostNotMatchWrapper) tryWrap(error *ServerError, wrapInfo map[string]string) (ok bool) {
|
||||
clientStringToSign := wrapInfo["StringToSign"]
|
||||
if error.errorCode == SignatureDostNotMatchErrorCode && clientStringToSign != "" {
|
||||
if (error.errorCode == SignatureDostNotMatchErrorCode || error.errorCode == IncompleteSignatureErrorCode) && clientStringToSign != "" {
|
||||
message := error.message
|
||||
if strings.HasPrefix(message, MessagePrefix) {
|
||||
serverStringToSign := message[len(MessagePrefix):]
|
||||
if strings.Contains(message, MessageContain) {
|
||||
str := strings.Split(message, MessageContain)
|
||||
serverStringToSign := str[1]
|
||||
|
||||
if clientStringToSign == serverStringToSign {
|
||||
// user secret is error
|
||||
error.recommend = "Please check you AccessKeySecret"
|
||||
error.recommend = "InvalidAccessKeySecret: Please check you AccessKeySecret"
|
||||
} else {
|
||||
debug("Client StringToSign: %s", clientStringToSign)
|
||||
debug("Server StringToSign: %s", serverStringToSign)
|
||||
error.recommend = "This may be a bug with the SDK and we hope you can submit this question in the " +
|
||||
"github issue(https://github.com/aliyun/alibaba-cloud-sdk-go/issues), thanks very much"
|
||||
}
|
||||
}
|
||||
return true, error
|
||||
} else {
|
||||
return false, nil
|
||||
ok = true
|
||||
return
|
||||
}
|
||||
ok = false
|
||||
return
|
||||
}
|
||||
|
||||
116
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/logger.go
generated
vendored
Normal file
116
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/logger.go
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
package sdk
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var logChannel string
|
||||
var defaultChannel = "AlibabaCloud"
|
||||
|
||||
type Logger struct {
|
||||
*log.Logger
|
||||
formatTemplate string
|
||||
isOpen bool
|
||||
lastLogMsg string
|
||||
}
|
||||
|
||||
var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
|
||||
var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_body}", "{res_headers}", "{cost}"}
|
||||
|
||||
func initLogMsg(fieldMap map[string]string) {
|
||||
for _, value := range loggerParam {
|
||||
fieldMap[value] = ""
|
||||
}
|
||||
}
|
||||
|
||||
func (client *Client) GetLogger() *Logger {
|
||||
return client.logger
|
||||
}
|
||||
|
||||
func (client *Client) GetLoggerMsg() string {
|
||||
if client.logger == nil {
|
||||
client.SetLogger("", "", os.Stdout, "")
|
||||
}
|
||||
return client.logger.lastLogMsg
|
||||
}
|
||||
|
||||
func (client *Client) SetLogger(level string, channel string, out io.Writer, template string) {
|
||||
if level == "" {
|
||||
level = "info"
|
||||
}
|
||||
|
||||
logChannel = "AlibabaCloud"
|
||||
if channel != "" {
|
||||
logChannel = channel
|
||||
}
|
||||
log := log.New(out, "["+strings.ToUpper(level)+"]", log.Lshortfile)
|
||||
if template == "" {
|
||||
template = defaultLoggerTemplate
|
||||
}
|
||||
|
||||
client.logger = &Logger{
|
||||
Logger: log,
|
||||
formatTemplate: template,
|
||||
isOpen: true,
|
||||
}
|
||||
}
|
||||
|
||||
func (client *Client) OpenLogger() {
|
||||
if client.logger == nil {
|
||||
client.SetLogger("", "", os.Stdout, "")
|
||||
}
|
||||
client.logger.isOpen = true
|
||||
}
|
||||
|
||||
func (client *Client) CloseLogger() {
|
||||
if client.logger != nil {
|
||||
client.logger.isOpen = false
|
||||
}
|
||||
}
|
||||
|
||||
func (client *Client) SetTemplate(template string) {
|
||||
if client.logger == nil {
|
||||
client.SetLogger("", "", os.Stdout, "")
|
||||
}
|
||||
client.logger.formatTemplate = template
|
||||
}
|
||||
|
||||
func (client *Client) GetTemplate() string {
|
||||
if client.logger == nil {
|
||||
client.SetLogger("", "", os.Stdout, "")
|
||||
}
|
||||
return client.logger.formatTemplate
|
||||
}
|
||||
|
||||
func TransToString(object interface{}) string {
|
||||
byt, err := json.Marshal(object)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return string(byt)
|
||||
}
|
||||
|
||||
func (client *Client) printLog(fieldMap map[string]string, err error) {
|
||||
if err != nil {
|
||||
fieldMap["{error}"] = err.Error()
|
||||
}
|
||||
fieldMap["{time}"] = time.Now().Format("2006-01-02 15:04:05")
|
||||
fieldMap["{ts}"] = utils.GetTimeInFormatISO8601()
|
||||
fieldMap["{channel}"] = logChannel
|
||||
if client.logger != nil {
|
||||
logMsg := client.logger.formatTemplate
|
||||
for key, value := range fieldMap {
|
||||
logMsg = strings.Replace(logMsg, key, value, -1)
|
||||
}
|
||||
client.logger.lastLogMsg = logMsg
|
||||
if client.logger.isOpen == true {
|
||||
client.logger.Output(2, logMsg)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,11 +15,15 @@
|
||||
package requests
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"io"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -58,8 +62,6 @@ type AcsRequest interface {
|
||||
GetDomain() string
|
||||
GetPort() string
|
||||
GetRegionId() string
|
||||
GetUrl() string
|
||||
GetQueries() string
|
||||
GetHeaders() map[string]string
|
||||
GetQueryParams() map[string]string
|
||||
GetFormParams() map[string]string
|
||||
@@ -68,10 +70,19 @@ type AcsRequest interface {
|
||||
GetStyle() string
|
||||
GetProduct() string
|
||||
GetVersion() string
|
||||
SetVersion(version string)
|
||||
GetActionName() string
|
||||
GetAcceptFormat() string
|
||||
GetLocationServiceCode() string
|
||||
GetLocationEndpointType() string
|
||||
GetReadTimeout() time.Duration
|
||||
GetConnectTimeout() time.Duration
|
||||
SetReadTimeout(readTimeout time.Duration)
|
||||
SetConnectTimeout(connectTimeout time.Duration)
|
||||
SetHTTPSInsecure(isInsecure bool)
|
||||
GetHTTPSInsecure() *bool
|
||||
|
||||
GetUserAgent() map[string]string
|
||||
|
||||
SetStringToSign(stringToSign string)
|
||||
GetStringToSign() string
|
||||
@@ -90,14 +101,18 @@ type AcsRequest interface {
|
||||
|
||||
// base class
|
||||
type baseRequest struct {
|
||||
Scheme string
|
||||
Method string
|
||||
Domain string
|
||||
Port string
|
||||
RegionId string
|
||||
Scheme string
|
||||
Method string
|
||||
Domain string
|
||||
Port string
|
||||
RegionId string
|
||||
ReadTimeout time.Duration
|
||||
ConnectTimeout time.Duration
|
||||
isInsecure *bool
|
||||
|
||||
product string
|
||||
version string
|
||||
userAgent map[string]string
|
||||
product string
|
||||
version string
|
||||
|
||||
actionName string
|
||||
|
||||
@@ -124,10 +139,38 @@ func (request *baseRequest) GetFormParams() map[string]string {
|
||||
return request.FormParams
|
||||
}
|
||||
|
||||
func (request *baseRequest) GetReadTimeout() time.Duration {
|
||||
return request.ReadTimeout
|
||||
}
|
||||
|
||||
func (request *baseRequest) GetConnectTimeout() time.Duration {
|
||||
return request.ConnectTimeout
|
||||
}
|
||||
|
||||
func (request *baseRequest) SetReadTimeout(readTimeout time.Duration) {
|
||||
request.ReadTimeout = readTimeout
|
||||
}
|
||||
|
||||
func (request *baseRequest) SetConnectTimeout(connectTimeout time.Duration) {
|
||||
request.ConnectTimeout = connectTimeout
|
||||
}
|
||||
|
||||
func (request *baseRequest) GetHTTPSInsecure() *bool {
|
||||
return request.isInsecure
|
||||
}
|
||||
|
||||
func (request *baseRequest) SetHTTPSInsecure(isInsecure bool) {
|
||||
request.isInsecure = &isInsecure
|
||||
}
|
||||
|
||||
func (request *baseRequest) GetContent() []byte {
|
||||
return request.Content
|
||||
}
|
||||
|
||||
func (request *baseRequest) SetVersion(version string) {
|
||||
request.version = version
|
||||
}
|
||||
|
||||
func (request *baseRequest) GetVersion() string {
|
||||
return request.version
|
||||
}
|
||||
@@ -140,6 +183,28 @@ func (request *baseRequest) SetContent(content []byte) {
|
||||
request.Content = content
|
||||
}
|
||||
|
||||
func (request *baseRequest) GetUserAgent() map[string]string {
|
||||
return request.userAgent
|
||||
}
|
||||
|
||||
func (request *baseRequest) AppendUserAgent(key, value string) {
|
||||
newkey := true
|
||||
if request.userAgent == nil {
|
||||
request.userAgent = make(map[string]string)
|
||||
}
|
||||
if strings.ToLower(key) != "core" && strings.ToLower(key) != "go" {
|
||||
for tag, _ := range request.userAgent {
|
||||
if tag == key {
|
||||
request.userAgent[tag] = value
|
||||
newkey = false
|
||||
}
|
||||
}
|
||||
if newkey {
|
||||
request.userAgent[key] = value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (request *baseRequest) addHeaderParam(key, value string) {
|
||||
request.Headers[key] = value
|
||||
}
|
||||
@@ -201,7 +266,7 @@ func (request *baseRequest) GetHeaders() map[string]string {
|
||||
}
|
||||
|
||||
func (request *baseRequest) SetContentType(contentType string) {
|
||||
request.Headers["Content-Type"] = contentType
|
||||
request.addHeaderParam("Content-Type", contentType)
|
||||
}
|
||||
|
||||
func (request *baseRequest) GetContentType() (contentType string, contains bool) {
|
||||
@@ -226,7 +291,7 @@ func defaultBaseRequest() (request *baseRequest) {
|
||||
Headers: map[string]string{
|
||||
"x-sdk-client": "golang/1.0.0",
|
||||
"x-sdk-invoke-type": "normal",
|
||||
"Accept-Encoding": "identity",
|
||||
"Accept-Encoding": "identity",
|
||||
},
|
||||
FormParams: make(map[string]string),
|
||||
}
|
||||
@@ -254,6 +319,10 @@ func flatRepeatedList(dataValue reflect.Value, request AcsRequest, position, pre
|
||||
// simple param
|
||||
key := prefix + name
|
||||
value := dataValue.Field(i).String()
|
||||
if dataValue.Field(i).Kind().String() == "map" {
|
||||
byt, _ := json.Marshal(dataValue.Field(i).Interface())
|
||||
value = string(byt)
|
||||
}
|
||||
err = addParam(request, fieldPosition, key, value)
|
||||
if err != nil {
|
||||
return
|
||||
@@ -269,7 +338,7 @@ func flatRepeatedList(dataValue reflect.Value, request AcsRequest, position, pre
|
||||
for m := 0; m < repeatedFieldValue.Len(); m++ {
|
||||
elementValue := repeatedFieldValue.Index(m)
|
||||
key := prefix + name + "." + strconv.Itoa(m+1)
|
||||
if elementValue.Type().String() == "string" {
|
||||
if elementValue.Type().Kind().String() == "string" {
|
||||
value := elementValue.String()
|
||||
err = addParam(request, fieldPosition, key, value)
|
||||
if err != nil {
|
||||
@@ -283,6 +352,38 @@ func flatRepeatedList(dataValue reflect.Value, request AcsRequest, position, pre
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if typeTag == "Struct" {
|
||||
valueField := dataValue.Field(i)
|
||||
if valueField.Kind() == reflect.Struct {
|
||||
if valueField.IsValid() && valueField.String() != "" {
|
||||
valueFieldType := valueField.Type()
|
||||
for m := 0; m < valueFieldType.NumField(); m++ {
|
||||
fieldName := valueFieldType.Field(m).Name
|
||||
elementValue := valueField.FieldByName(fieldName)
|
||||
key := prefix + name + "." + fieldName
|
||||
if elementValue.Type().String() == "[]string" {
|
||||
for j := 0; j < elementValue.Len(); j++ {
|
||||
err = addParam(request, fieldPosition, key+"."+strconv.Itoa(j+1), elementValue.Index(j).String())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// value := elementValue.String()
|
||||
// err = addParam(request, fieldPosition, key, value)
|
||||
// if err != nil {
|
||||
// return
|
||||
// }
|
||||
// } else {
|
||||
// err = flatRepeatedList(elementValue, request, fieldPosition, key+".")
|
||||
// if err != nil {
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
56
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests/common_request.go
generated
vendored
56
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests/common_request.go
generated
vendored
@@ -3,17 +3,18 @@ package requests
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"io"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type CommonRequest struct {
|
||||
*baseRequest
|
||||
|
||||
Version string
|
||||
ApiName string
|
||||
Product string
|
||||
Version string
|
||||
ApiName string
|
||||
Product string
|
||||
ServiceCode string
|
||||
|
||||
// roa params
|
||||
PathPattern string
|
||||
@@ -33,22 +34,27 @@ func NewCommonRequest() (request *CommonRequest) {
|
||||
|
||||
func (request *CommonRequest) String() string {
|
||||
request.TransToAcsRequest()
|
||||
request.BuildQueries()
|
||||
request.BuildUrl()
|
||||
|
||||
resultBuilder := bytes.Buffer{}
|
||||
|
||||
mapOutput := func(m map[string]string) {
|
||||
if len(m) > 0 {
|
||||
for key, value := range m {
|
||||
resultBuilder.WriteString(key + ": " + value + "\n")
|
||||
sortedKeys := make([]string, 0)
|
||||
for k := range m {
|
||||
sortedKeys = append(sortedKeys, k)
|
||||
}
|
||||
|
||||
// sort 'string' key in increasing order
|
||||
sort.Strings(sortedKeys)
|
||||
|
||||
for _, key := range sortedKeys {
|
||||
resultBuilder.WriteString(key + ": " + m[key] + "\n")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Request Line
|
||||
resultBuilder.WriteString("\n")
|
||||
resultBuilder.WriteString(fmt.Sprintf("%s %s %s/1.1\n", request.Method, request.GetQueries(), strings.ToUpper(request.Scheme)))
|
||||
resultBuilder.WriteString(fmt.Sprintf("%s %s %s/1.1\n", request.Method, request.BuildQueries(), strings.ToUpper(request.Scheme)))
|
||||
|
||||
// Headers
|
||||
resultBuilder.WriteString("Host" + ": " + request.Domain + "\n")
|
||||
@@ -66,16 +72,6 @@ func (request *CommonRequest) String() string {
|
||||
}
|
||||
|
||||
func (request *CommonRequest) TransToAcsRequest() {
|
||||
if len(request.Version) == 0 {
|
||||
errors.NewClientError(errors.MissingParamErrorCode, "Common request [version] is required", nil)
|
||||
}
|
||||
if len(request.ApiName) == 0 && len(request.PathPattern) == 0 {
|
||||
errors.NewClientError(errors.MissingParamErrorCode, "At least one of [ApiName] and [PathPattern] should has a value", nil)
|
||||
}
|
||||
if len(request.Domain) == 0 && len(request.Product) == 0 {
|
||||
errors.NewClientError(errors.MissingParamErrorCode, "At least one of [Domain] and [Product] should has a value", nil)
|
||||
}
|
||||
|
||||
if len(request.PathPattern) > 0 {
|
||||
roaRequest := &RoaRequest{}
|
||||
roaRequest.initWithCommonRequest(request)
|
||||
@@ -85,36 +81,20 @@ func (request *CommonRequest) TransToAcsRequest() {
|
||||
rpcRequest.baseRequest = request.baseRequest
|
||||
rpcRequest.product = request.Product
|
||||
rpcRequest.version = request.Version
|
||||
rpcRequest.locationServiceCode = request.ServiceCode
|
||||
rpcRequest.actionName = request.ApiName
|
||||
request.Ontology = rpcRequest
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (request *CommonRequest) BuildUrl() string {
|
||||
if len(request.Port) > 0 {
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + ":" + request.Port + request.BuildQueries()
|
||||
}
|
||||
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + request.BuildQueries()
|
||||
return request.Ontology.BuildUrl()
|
||||
}
|
||||
|
||||
func (request *CommonRequest) BuildQueries() string {
|
||||
return request.Ontology.BuildQueries()
|
||||
}
|
||||
|
||||
func (request *CommonRequest) GetUrl() string {
|
||||
if len(request.Port) > 0 {
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + ":" + request.Port + request.GetQueries()
|
||||
}
|
||||
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + request.GetQueries()
|
||||
}
|
||||
|
||||
func (request *CommonRequest) GetQueries() string {
|
||||
return request.Ontology.GetQueries()
|
||||
}
|
||||
|
||||
func (request *CommonRequest) GetBodyReader() io.Reader {
|
||||
return request.Ontology.GetBodyReader()
|
||||
}
|
||||
|
||||
68
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests/roa_request.go
generated
vendored
68
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests/roa_request.go
generated
vendored
@@ -16,11 +16,13 @@ package requests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
)
|
||||
|
||||
type RoaRequest struct {
|
||||
@@ -44,29 +46,23 @@ func (request *RoaRequest) GetBodyReader() io.Reader {
|
||||
}
|
||||
}
|
||||
|
||||
func (request *RoaRequest) GetQueries() string {
|
||||
return request.queries
|
||||
}
|
||||
|
||||
// for sign method, need not url encoded
|
||||
func (request *RoaRequest) BuildQueries() string {
|
||||
return request.buildQueries(false)
|
||||
return request.buildQueries()
|
||||
}
|
||||
|
||||
func (request *RoaRequest) buildQueries(needParamEncode bool) string {
|
||||
// replace path params with value
|
||||
func (request *RoaRequest) buildPath() string {
|
||||
path := request.pathPattern
|
||||
for key, value := range request.PathParams {
|
||||
path = strings.Replace(path, "["+key+"]", value, 1)
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
func (request *RoaRequest) buildQueries() string {
|
||||
// replace path params with value
|
||||
path := request.buildPath()
|
||||
queryParams := request.QueryParams
|
||||
// check if path contains params
|
||||
splitArray := strings.Split(path, "?")
|
||||
path = splitArray[0]
|
||||
if len(splitArray) > 1 && len(splitArray[1]) > 0 {
|
||||
queryParams[splitArray[1]] = ""
|
||||
}
|
||||
// sort QueryParams by key
|
||||
var queryKeys []string
|
||||
for key := range queryParams {
|
||||
@@ -85,11 +81,7 @@ func (request *RoaRequest) buildQueries(needParamEncode bool) string {
|
||||
urlBuilder.WriteString(queryKey)
|
||||
if value := queryParams[queryKey]; len(value) > 0 {
|
||||
urlBuilder.WriteString("=")
|
||||
if needParamEncode {
|
||||
urlBuilder.WriteString(url.QueryEscape(value))
|
||||
} else {
|
||||
urlBuilder.WriteString(value)
|
||||
}
|
||||
urlBuilder.WriteString(value)
|
||||
}
|
||||
if i < len(queryKeys)-1 {
|
||||
urlBuilder.WriteString("&")
|
||||
@@ -97,8 +89,17 @@ func (request *RoaRequest) buildQueries(needParamEncode bool) string {
|
||||
}
|
||||
result := urlBuilder.String()
|
||||
result = popStandardUrlencode(result)
|
||||
request.queries = result
|
||||
return request.queries
|
||||
return result
|
||||
}
|
||||
|
||||
func (request *RoaRequest) buildQueryString() string {
|
||||
queryParams := request.QueryParams
|
||||
// sort QueryParams by key
|
||||
q := url.Values{}
|
||||
for key, value := range queryParams {
|
||||
q.Add(key, value)
|
||||
}
|
||||
return q.Encode()
|
||||
}
|
||||
|
||||
func popStandardUrlencode(stringToSign string) (result string) {
|
||||
@@ -108,13 +109,18 @@ func popStandardUrlencode(stringToSign string) (result string) {
|
||||
return
|
||||
}
|
||||
|
||||
func (request *RoaRequest) GetUrl() string {
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + ":" + request.Port + request.GetQueries()
|
||||
}
|
||||
|
||||
func (request *RoaRequest) BuildUrl() string {
|
||||
// for network trans, need url encoded
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + ":" + request.Port + request.buildQueries(true)
|
||||
scheme := strings.ToLower(request.Scheme)
|
||||
domain := request.Domain
|
||||
port := request.Port
|
||||
path := request.buildPath()
|
||||
url := fmt.Sprintf("%s://%s:%s%s", scheme, domain, port, path)
|
||||
querystring := request.buildQueryString()
|
||||
if len(querystring) > 0 {
|
||||
url = fmt.Sprintf("%s?%s", url, querystring)
|
||||
}
|
||||
return url
|
||||
}
|
||||
|
||||
func (request *RoaRequest) addPathParam(key, value string) {
|
||||
@@ -128,19 +134,19 @@ func (request *RoaRequest) InitWithApiInfo(product, version, action, uriPattern,
|
||||
request.pathPattern = uriPattern
|
||||
request.locationServiceCode = serviceCode
|
||||
request.locationEndpointType = endpointType
|
||||
//request.product = product
|
||||
request.product = product
|
||||
//request.version = version
|
||||
//request.actionName = action
|
||||
request.actionName = action
|
||||
}
|
||||
|
||||
func (request *RoaRequest) initWithCommonRequest(commonRequest *CommonRequest) {
|
||||
request.baseRequest = commonRequest.baseRequest
|
||||
request.PathParams = commonRequest.PathParams
|
||||
//request.product = commonRequest.Product
|
||||
request.product = commonRequest.Product
|
||||
//request.version = commonRequest.Version
|
||||
request.Headers["x-acs-version"] = commonRequest.Version
|
||||
//request.actionName = commonRequest.ApiName
|
||||
request.actionName = commonRequest.ApiName
|
||||
request.pathPattern = commonRequest.PathPattern
|
||||
request.locationServiceCode = ""
|
||||
request.locationServiceCode = commonRequest.ServiceCode
|
||||
request.locationEndpointType = ""
|
||||
}
|
||||
|
||||
18
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests/rpc_request.go
generated
vendored
18
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests/rpc_request.go
generated
vendored
@@ -15,9 +15,11 @@
|
||||
package requests
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
||||
)
|
||||
|
||||
type RpcRequest struct {
|
||||
@@ -47,16 +49,12 @@ func (request *RpcRequest) BuildQueries() string {
|
||||
return request.queries
|
||||
}
|
||||
|
||||
func (request *RpcRequest) GetQueries() string {
|
||||
return request.queries
|
||||
}
|
||||
|
||||
func (request *RpcRequest) BuildUrl() string {
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + ":" + request.Port + request.BuildQueries()
|
||||
}
|
||||
|
||||
func (request *RpcRequest) GetUrl() string {
|
||||
return strings.ToLower(request.Scheme) + "://" + request.Domain + request.GetQueries()
|
||||
url := fmt.Sprintf("%s://%s", strings.ToLower(request.Scheme), request.Domain)
|
||||
if len(request.Port) > 0 {
|
||||
url = fmt.Sprintf("%s:%s", url, request.Port)
|
||||
}
|
||||
return url + request.BuildQueries()
|
||||
}
|
||||
|
||||
func (request *RpcRequest) GetVersion() string {
|
||||
|
||||
35
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses/json_parser.go
generated
vendored
35
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses/json_parser.go
generated
vendored
@@ -2,13 +2,13 @@ package responses
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/json-iterator/go"
|
||||
"io"
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"unsafe"
|
||||
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
)
|
||||
|
||||
const maxUint = ^uint(0)
|
||||
@@ -16,13 +16,15 @@ const maxInt = int(maxUint >> 1)
|
||||
const minInt = -maxInt - 1
|
||||
|
||||
var jsonParser jsoniter.API
|
||||
var initJson = &sync.Once{}
|
||||
|
||||
func initJsonParserOnce() {
|
||||
initJson.Do(func() {
|
||||
registerBetterFuzzyDecoder()
|
||||
jsonParser = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||
})
|
||||
func init() {
|
||||
registerBetterFuzzyDecoder()
|
||||
jsonParser = jsoniter.Config{
|
||||
EscapeHTML: true,
|
||||
SortMapKeys: true,
|
||||
ValidateJsonRawMessage: true,
|
||||
CaseSensitive: true,
|
||||
}.Froze()
|
||||
}
|
||||
|
||||
func registerBetterFuzzyDecoder() {
|
||||
@@ -211,21 +213,6 @@ func (decoder *fuzzyBoolDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Itera
|
||||
}
|
||||
}
|
||||
|
||||
type tolerateEmptyArrayDecoder struct {
|
||||
valDecoder jsoniter.ValDecoder
|
||||
}
|
||||
|
||||
func (decoder *tolerateEmptyArrayDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
|
||||
if iter.WhatIsNext() == jsoniter.ArrayValue {
|
||||
iter.Skip()
|
||||
newIter := iter.Pool().BorrowIterator([]byte("{}"))
|
||||
defer iter.Pool().ReturnIterator(newIter)
|
||||
decoder.valDecoder.Decode(ptr, newIter)
|
||||
} else {
|
||||
decoder.valDecoder.Decode(ptr, iter)
|
||||
}
|
||||
}
|
||||
|
||||
type nullableFuzzyIntegerDecoder struct {
|
||||
fun func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator)
|
||||
}
|
||||
@@ -336,6 +323,6 @@ func (decoder *nullableFuzzyFloat64Decoder) Decode(ptr unsafe.Pointer, iter *jso
|
||||
iter.ReadNil()
|
||||
*((*float64)(ptr)) = 0
|
||||
default:
|
||||
iter.ReportError("nullableFuzzyFloat32Decoder", "not number or string")
|
||||
iter.ReportError("nullableFuzzyFloat64Decoder", "not number or string")
|
||||
}
|
||||
}
|
||||
|
||||
10
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses/response.go
generated
vendored
10
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses/response.go
generated
vendored
@@ -18,10 +18,11 @@ import (
|
||||
"bytes"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
|
||||
)
|
||||
|
||||
type AcsResponse interface {
|
||||
@@ -34,6 +35,7 @@ type AcsResponse interface {
|
||||
parseFromHttpResponse(httpResponse *http.Response) error
|
||||
}
|
||||
|
||||
// Unmarshal object from http response body to target Response
|
||||
func Unmarshal(response AcsResponse, httpResponse *http.Response, format string) (err error) {
|
||||
err = response.parseFromHttpResponse(httpResponse)
|
||||
if err != nil {
|
||||
@@ -43,7 +45,8 @@ func Unmarshal(response AcsResponse, httpResponse *http.Response, format string)
|
||||
err = errors.NewServerError(response.GetHttpStatus(), response.GetHttpContentString(), "")
|
||||
return
|
||||
}
|
||||
if _, isCommonResponse := response.(CommonResponse); isCommonResponse {
|
||||
|
||||
if _, isCommonResponse := response.(*CommonResponse); isCommonResponse {
|
||||
// common response need not unmarshal
|
||||
return
|
||||
}
|
||||
@@ -53,7 +56,6 @@ func Unmarshal(response AcsResponse, httpResponse *http.Response, format string)
|
||||
}
|
||||
|
||||
if strings.ToUpper(format) == "JSON" {
|
||||
initJsonParserOnce()
|
||||
err = jsonParser.Unmarshal(response.GetHttpContentBytes(), response)
|
||||
if err != nil {
|
||||
err = errors.NewClientError(errors.JsonUnmarshalErrorCode, errors.JsonUnmarshalErrorMessage, err)
|
||||
@@ -117,7 +119,7 @@ func (baseResponse *BaseResponse) parseFromHttpResponse(httpResponse *http.Respo
|
||||
func (baseResponse *BaseResponse) String() string {
|
||||
resultBuilder := bytes.Buffer{}
|
||||
// statusCode
|
||||
resultBuilder.WriteString("\n")
|
||||
// resultBuilder.WriteString("\n")
|
||||
resultBuilder.WriteString(fmt.Sprintf("%s %s\n", baseResponse.originHttpResponse.Proto, baseResponse.originHttpResponse.Status))
|
||||
// httpHeaders
|
||||
//resultBuilder.WriteString("Headers:\n")
|
||||
|
||||
36
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils/debug.go
generated
vendored
Normal file
36
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils/debug.go
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Debug func(format string, v ...interface{})
|
||||
|
||||
var hookGetEnv = func() string {
|
||||
return os.Getenv("DEBUG")
|
||||
}
|
||||
|
||||
var hookPrint = func(input string) {
|
||||
fmt.Println(input)
|
||||
}
|
||||
|
||||
func Init(flag string) Debug {
|
||||
enable := false
|
||||
|
||||
env := hookGetEnv()
|
||||
parts := strings.Split(env, ",")
|
||||
for _, part := range parts {
|
||||
if part == flag {
|
||||
enable = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return func(format string, v ...interface{}) {
|
||||
if enable {
|
||||
hookPrint(fmt.Sprintf(format, v...))
|
||||
}
|
||||
}
|
||||
}
|
||||
96
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils/utils.go
generated
vendored
96
vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils/utils.go
generated
vendored
@@ -16,27 +16,35 @@ package utils
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/satori/go.uuid"
|
||||
"hash"
|
||||
rand2 "math/rand"
|
||||
"net/url"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
// if you use go 1.10 or higher, you can hack this util by these to avoid "TimeZone.zip not found" on Windows
|
||||
var LoadLocationFromTZData func(name string, data []byte) (*time.Location, error) = nil
|
||||
var TZData []byte = nil
|
||||
type UUID [16]byte
|
||||
|
||||
func GetUUIDV4() (uuidHex string) {
|
||||
uuidV4 := uuid.NewV4()
|
||||
uuidHex = hex.EncodeToString(uuidV4.Bytes())
|
||||
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
|
||||
func GetUUID() (uuidHex string) {
|
||||
uuid := NewUUID()
|
||||
uuidHex = hex.EncodeToString(uuid[:])
|
||||
return
|
||||
}
|
||||
|
||||
func RandStringBytes(n int) string {
|
||||
b := make([]byte, n)
|
||||
for i := range b {
|
||||
b[i] = letterBytes[rand2.Intn(len(letterBytes))]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func GetMD5Base64(bytes []byte) (base64Value string) {
|
||||
md5Ctx := md5.New()
|
||||
md5Ctx.Write(bytes)
|
||||
@@ -45,29 +53,15 @@ func GetMD5Base64(bytes []byte) (base64Value string) {
|
||||
return
|
||||
}
|
||||
|
||||
func GetGMTLocation() (*time.Location, error) {
|
||||
if LoadLocationFromTZData != nil && TZData != nil {
|
||||
return LoadLocationFromTZData("GMT", TZData)
|
||||
} else {
|
||||
return time.LoadLocation("GMT")
|
||||
}
|
||||
}
|
||||
|
||||
func GetTimeInFormatISO8601() (timeStr string) {
|
||||
gmt, err := GetGMTLocation()
|
||||
gmt := time.FixedZone("GMT", 0)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return time.Now().In(gmt).Format("2006-01-02T15:04:05Z")
|
||||
}
|
||||
|
||||
func GetTimeInFormatRFC2616() (timeStr string) {
|
||||
gmt, err := GetGMTLocation()
|
||||
gmt := time.FixedZone("GMT", 0)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return time.Now().In(gmt).Format("Mon, 02 Jan 2006 15:04:05 GMT")
|
||||
}
|
||||
|
||||
@@ -80,17 +74,6 @@ func GetUrlFormedMap(source map[string]string) (urlEncoded string) {
|
||||
return
|
||||
}
|
||||
|
||||
func GetFromJsonString(jsonString, key string) (result string, err error) {
|
||||
var responseMap map[string]*json.RawMessage
|
||||
err = json.Unmarshal([]byte(jsonString), &responseMap)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
fmt.Println(string(*responseMap[key]))
|
||||
err = json.Unmarshal(*responseMap[key], &result)
|
||||
return
|
||||
}
|
||||
|
||||
func InitStructWithDefaultTag(bean interface{}) {
|
||||
configType := reflect.TypeOf(bean)
|
||||
for i := 0; i < configType.Elem().NumField(); i++ {
|
||||
@@ -115,3 +98,44 @@ func InitStructWithDefaultTag(bean interface{}) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func NewUUID() UUID {
|
||||
ns := UUID{}
|
||||
safeRandom(ns[:])
|
||||
u := newFromHash(md5.New(), ns, RandStringBytes(16))
|
||||
u[6] = (u[6] & 0x0f) | (byte(2) << 4)
|
||||
u[8] = (u[8]&(0xff>>2) | (0x02 << 6))
|
||||
|
||||
return u
|
||||
}
|
||||
|
||||
func newFromHash(h hash.Hash, ns UUID, name string) UUID {
|
||||
u := UUID{}
|
||||
h.Write(ns[:])
|
||||
h.Write([]byte(name))
|
||||
copy(u[:], h.Sum(nil))
|
||||
|
||||
return u
|
||||
}
|
||||
|
||||
func safeRandom(dest []byte) {
|
||||
if _, err := rand.Read(dest); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (u UUID) String() string {
|
||||
buf := make([]byte, 36)
|
||||
|
||||
hex.Encode(buf[0:8], u[0:4])
|
||||
buf[8] = '-'
|
||||
hex.Encode(buf[9:13], u[4:6])
|
||||
buf[13] = '-'
|
||||
hex.Encode(buf[14:18], u[6:8])
|
||||
buf[18] = '-'
|
||||
hex.Encode(buf[19:23], u[8:10])
|
||||
buf[23] = '-'
|
||||
hex.Encode(buf[24:], u[10:])
|
||||
|
||||
return string(buf)
|
||||
}
|
||||
|
||||
106
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_batch_domain_records.go
generated
vendored
106
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_batch_domain_records.go
generated
vendored
@@ -1,106 +0,0 @@
|
||||
package alidns
|
||||
|
||||
//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.
|
||||
//
|
||||
// Code generated by Alibaba Cloud SDK Code Generator.
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
)
|
||||
|
||||
// AddBatchDomainRecords invokes the alidns.AddBatchDomainRecords API synchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addbatchdomainrecords.html
|
||||
func (client *Client) AddBatchDomainRecords(request *AddBatchDomainRecordsRequest) (response *AddBatchDomainRecordsResponse, err error) {
|
||||
response = CreateAddBatchDomainRecordsResponse()
|
||||
err = client.DoAction(request, response)
|
||||
return
|
||||
}
|
||||
|
||||
// AddBatchDomainRecordsWithChan invokes the alidns.AddBatchDomainRecords API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addbatchdomainrecords.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddBatchDomainRecordsWithChan(request *AddBatchDomainRecordsRequest) (<-chan *AddBatchDomainRecordsResponse, <-chan error) {
|
||||
responseChan := make(chan *AddBatchDomainRecordsResponse, 1)
|
||||
errChan := make(chan error, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
defer close(responseChan)
|
||||
defer close(errChan)
|
||||
response, err := client.AddBatchDomainRecords(request)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
} else {
|
||||
responseChan <- response
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
close(responseChan)
|
||||
close(errChan)
|
||||
}
|
||||
return responseChan, errChan
|
||||
}
|
||||
|
||||
// AddBatchDomainRecordsWithCallback invokes the alidns.AddBatchDomainRecords API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addbatchdomainrecords.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddBatchDomainRecordsWithCallback(request *AddBatchDomainRecordsRequest, callback func(response *AddBatchDomainRecordsResponse, err error)) <-chan int {
|
||||
result := make(chan int, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
var response *AddBatchDomainRecordsResponse
|
||||
var err error
|
||||
defer close(result)
|
||||
response, err = client.AddBatchDomainRecords(request)
|
||||
callback(response, err)
|
||||
result <- 1
|
||||
})
|
||||
if err != nil {
|
||||
defer close(result)
|
||||
callback(nil, err)
|
||||
result <- 0
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// AddBatchDomainRecordsRequest is the request struct for api AddBatchDomainRecords
|
||||
type AddBatchDomainRecordsRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Records string `position:"Query" name:"Records"`
|
||||
}
|
||||
|
||||
// AddBatchDomainRecordsResponse is the response struct for api AddBatchDomainRecords
|
||||
type AddBatchDomainRecordsResponse struct {
|
||||
*responses.BaseResponse
|
||||
RequestId string `json:"RequestId" xml:"RequestId"`
|
||||
TraceId string `json:"TraceId" xml:"TraceId"`
|
||||
}
|
||||
|
||||
// CreateAddBatchDomainRecordsRequest creates a request to invoke AddBatchDomainRecords API
|
||||
func CreateAddBatchDomainRecordsRequest() (request *AddBatchDomainRecordsRequest) {
|
||||
request = &AddBatchDomainRecordsRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddBatchDomainRecords", "", "")
|
||||
return
|
||||
}
|
||||
|
||||
// CreateAddBatchDomainRecordsResponse creates a response to parse from AddBatchDomainRecords response
|
||||
func CreateAddBatchDomainRecordsResponse() (response *AddBatchDomainRecordsResponse) {
|
||||
response = &AddBatchDomainRecordsResponse{
|
||||
BaseResponse: &responses.BaseResponse{},
|
||||
}
|
||||
return
|
||||
}
|
||||
11
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_domain.go
generated
vendored
11
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_domain.go
generated
vendored
@@ -76,10 +76,11 @@ func (client *Client) AddDomainWithCallback(request *AddDomainRequest, callback
|
||||
// AddDomainRequest is the request struct for api AddDomain
|
||||
type AddDomainRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
DomainName string `position:"Query" name:"DomainName"`
|
||||
GroupId string `position:"Query" name:"GroupId"`
|
||||
ResourceGroupId string `position:"Query" name:"ResourceGroupId"`
|
||||
GroupId string `position:"Query" name:"GroupId"`
|
||||
DomainName string `position:"Query" name:"DomainName"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
}
|
||||
|
||||
// AddDomainResponse is the response struct for api AddDomain
|
||||
@@ -99,7 +100,7 @@ func CreateAddDomainRequest() (request *AddDomainRequest) {
|
||||
request = &AddDomainRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddDomain", "", "")
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddDomain", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
4
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_domain_group.go
generated
vendored
4
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_domain_group.go
generated
vendored
@@ -76,8 +76,8 @@ func (client *Client) AddDomainGroupWithCallback(request *AddDomainGroupRequest,
|
||||
// AddDomainGroupRequest is the request struct for api AddDomainGroup
|
||||
type AddDomainGroupRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
GroupName string `position:"Query" name:"GroupName"`
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ func CreateAddDomainGroupRequest() (request *AddDomainGroupRequest) {
|
||||
request = &AddDomainGroupRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddDomainGroup", "", "")
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddDomainGroup", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
10
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_domain_record.go
generated
vendored
10
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_domain_record.go
generated
vendored
@@ -76,15 +76,15 @@ func (client *Client) AddDomainRecordWithCallback(request *AddDomainRecordReques
|
||||
// AddDomainRecordRequest is the request struct for api AddDomainRecord
|
||||
type AddDomainRecordRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
RR string `position:"Query" name:"RR"`
|
||||
Line string `position:"Query" name:"Line"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
DomainName string `position:"Query" name:"DomainName"`
|
||||
RR string `position:"Query" name:"RR"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
Type string `position:"Query" name:"Type"`
|
||||
Priority requests.Integer `position:"Query" name:"Priority"`
|
||||
Value string `position:"Query" name:"Value"`
|
||||
TTL requests.Integer `position:"Query" name:"TTL"`
|
||||
Priority requests.Integer `position:"Query" name:"Priority"`
|
||||
Line string `position:"Query" name:"Line"`
|
||||
}
|
||||
|
||||
// AddDomainRecordResponse is the response struct for api AddDomainRecord
|
||||
@@ -99,7 +99,7 @@ func CreateAddDomainRecordRequest() (request *AddDomainRecordRequest) {
|
||||
request = &AddDomainRecordRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddDomainRecord", "", "")
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddDomainRecord", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
110
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_gtm_access_strategy.go
generated
vendored
Normal file
110
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_gtm_access_strategy.go
generated
vendored
Normal file
@@ -0,0 +1,110 @@
|
||||
package alidns
|
||||
|
||||
//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.
|
||||
//
|
||||
// Code generated by Alibaba Cloud SDK Code Generator.
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
)
|
||||
|
||||
// AddGtmAccessStrategy invokes the alidns.AddGtmAccessStrategy API synchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmaccessstrategy.html
|
||||
func (client *Client) AddGtmAccessStrategy(request *AddGtmAccessStrategyRequest) (response *AddGtmAccessStrategyResponse, err error) {
|
||||
response = CreateAddGtmAccessStrategyResponse()
|
||||
err = client.DoAction(request, response)
|
||||
return
|
||||
}
|
||||
|
||||
// AddGtmAccessStrategyWithChan invokes the alidns.AddGtmAccessStrategy API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmaccessstrategy.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddGtmAccessStrategyWithChan(request *AddGtmAccessStrategyRequest) (<-chan *AddGtmAccessStrategyResponse, <-chan error) {
|
||||
responseChan := make(chan *AddGtmAccessStrategyResponse, 1)
|
||||
errChan := make(chan error, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
defer close(responseChan)
|
||||
defer close(errChan)
|
||||
response, err := client.AddGtmAccessStrategy(request)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
} else {
|
||||
responseChan <- response
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
close(responseChan)
|
||||
close(errChan)
|
||||
}
|
||||
return responseChan, errChan
|
||||
}
|
||||
|
||||
// AddGtmAccessStrategyWithCallback invokes the alidns.AddGtmAccessStrategy API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmaccessstrategy.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddGtmAccessStrategyWithCallback(request *AddGtmAccessStrategyRequest, callback func(response *AddGtmAccessStrategyResponse, err error)) <-chan int {
|
||||
result := make(chan int, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
var response *AddGtmAccessStrategyResponse
|
||||
var err error
|
||||
defer close(result)
|
||||
response, err = client.AddGtmAccessStrategy(request)
|
||||
callback(response, err)
|
||||
result <- 1
|
||||
})
|
||||
if err != nil {
|
||||
defer close(result)
|
||||
callback(nil, err)
|
||||
result <- 0
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// AddGtmAccessStrategyRequest is the request struct for api AddGtmAccessStrategy
|
||||
type AddGtmAccessStrategyRequest struct {
|
||||
*requests.RpcRequest
|
||||
StrategyName string `position:"Query" name:"StrategyName"`
|
||||
DefaultAddrPoolId string `position:"Query" name:"DefaultAddrPoolId"`
|
||||
AccessLines string `position:"Query" name:"AccessLines"`
|
||||
InstanceId string `position:"Query" name:"InstanceId"`
|
||||
FailoverAddrPoolId string `position:"Query" name:"FailoverAddrPoolId"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
}
|
||||
|
||||
// AddGtmAccessStrategyResponse is the response struct for api AddGtmAccessStrategy
|
||||
type AddGtmAccessStrategyResponse struct {
|
||||
*responses.BaseResponse
|
||||
RequestId string `json:"RequestId" xml:"RequestId"`
|
||||
StrategyId string `json:"StrategyId" xml:"StrategyId"`
|
||||
}
|
||||
|
||||
// CreateAddGtmAccessStrategyRequest creates a request to invoke AddGtmAccessStrategy API
|
||||
func CreateAddGtmAccessStrategyRequest() (request *AddGtmAccessStrategyRequest) {
|
||||
request = &AddGtmAccessStrategyRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddGtmAccessStrategy", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
// CreateAddGtmAccessStrategyResponse creates a response to parse from AddGtmAccessStrategy response
|
||||
func CreateAddGtmAccessStrategyResponse() (response *AddGtmAccessStrategyResponse) {
|
||||
response = &AddGtmAccessStrategyResponse{
|
||||
BaseResponse: &responses.BaseResponse{},
|
||||
}
|
||||
return
|
||||
}
|
||||
117
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_gtm_address_pool.go
generated
vendored
Normal file
117
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_gtm_address_pool.go
generated
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
package alidns
|
||||
|
||||
//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.
|
||||
//
|
||||
// Code generated by Alibaba Cloud SDK Code Generator.
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
)
|
||||
|
||||
// AddGtmAddressPool invokes the alidns.AddGtmAddressPool API synchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmaddresspool.html
|
||||
func (client *Client) AddGtmAddressPool(request *AddGtmAddressPoolRequest) (response *AddGtmAddressPoolResponse, err error) {
|
||||
response = CreateAddGtmAddressPoolResponse()
|
||||
err = client.DoAction(request, response)
|
||||
return
|
||||
}
|
||||
|
||||
// AddGtmAddressPoolWithChan invokes the alidns.AddGtmAddressPool API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmaddresspool.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddGtmAddressPoolWithChan(request *AddGtmAddressPoolRequest) (<-chan *AddGtmAddressPoolResponse, <-chan error) {
|
||||
responseChan := make(chan *AddGtmAddressPoolResponse, 1)
|
||||
errChan := make(chan error, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
defer close(responseChan)
|
||||
defer close(errChan)
|
||||
response, err := client.AddGtmAddressPool(request)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
} else {
|
||||
responseChan <- response
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
close(responseChan)
|
||||
close(errChan)
|
||||
}
|
||||
return responseChan, errChan
|
||||
}
|
||||
|
||||
// AddGtmAddressPoolWithCallback invokes the alidns.AddGtmAddressPool API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmaddresspool.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddGtmAddressPoolWithCallback(request *AddGtmAddressPoolRequest, callback func(response *AddGtmAddressPoolResponse, err error)) <-chan int {
|
||||
result := make(chan int, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
var response *AddGtmAddressPoolResponse
|
||||
var err error
|
||||
defer close(result)
|
||||
response, err = client.AddGtmAddressPool(request)
|
||||
callback(response, err)
|
||||
result <- 1
|
||||
})
|
||||
if err != nil {
|
||||
defer close(result)
|
||||
callback(nil, err)
|
||||
result <- 0
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// AddGtmAddressPoolRequest is the request struct for api AddGtmAddressPool
|
||||
type AddGtmAddressPoolRequest struct {
|
||||
*requests.RpcRequest
|
||||
InstanceId string `position:"Query" name:"InstanceId"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Name string `position:"Query" name:"Name"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
Type string `position:"Query" name:"Type"`
|
||||
Addr *[]AddGtmAddressPoolAddr `position:"Query" name:"Addr" type:"Repeated"`
|
||||
MinAvailableAddrNum requests.Integer `position:"Query" name:"MinAvailableAddrNum"`
|
||||
}
|
||||
|
||||
// AddGtmAddressPoolAddr is a repeated param struct in AddGtmAddressPoolRequest
|
||||
type AddGtmAddressPoolAddr struct {
|
||||
Mode string `name:"Mode"`
|
||||
LbaWeight string `name:"LbaWeight"`
|
||||
Value string `name:"Value"`
|
||||
}
|
||||
|
||||
// AddGtmAddressPoolResponse is the response struct for api AddGtmAddressPool
|
||||
type AddGtmAddressPoolResponse struct {
|
||||
*responses.BaseResponse
|
||||
RequestId string `json:"RequestId" xml:"RequestId"`
|
||||
AddrPoolId string `json:"AddrPoolId" xml:"AddrPoolId"`
|
||||
}
|
||||
|
||||
// CreateAddGtmAddressPoolRequest creates a request to invoke AddGtmAddressPool API
|
||||
func CreateAddGtmAddressPoolRequest() (request *AddGtmAddressPoolRequest) {
|
||||
request = &AddGtmAddressPoolRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddGtmAddressPool", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
// CreateAddGtmAddressPoolResponse creates a response to parse from AddGtmAddressPool response
|
||||
func CreateAddGtmAddressPoolResponse() (response *AddGtmAddressPoolResponse) {
|
||||
response = &AddGtmAddressPoolResponse{
|
||||
BaseResponse: &responses.BaseResponse{},
|
||||
}
|
||||
return
|
||||
}
|
||||
119
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_gtm_monitor.go
generated
vendored
Normal file
119
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/add_gtm_monitor.go
generated
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
package alidns
|
||||
|
||||
//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.
|
||||
//
|
||||
// Code generated by Alibaba Cloud SDK Code Generator.
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
)
|
||||
|
||||
// AddGtmMonitor invokes the alidns.AddGtmMonitor API synchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmmonitor.html
|
||||
func (client *Client) AddGtmMonitor(request *AddGtmMonitorRequest) (response *AddGtmMonitorResponse, err error) {
|
||||
response = CreateAddGtmMonitorResponse()
|
||||
err = client.DoAction(request, response)
|
||||
return
|
||||
}
|
||||
|
||||
// AddGtmMonitorWithChan invokes the alidns.AddGtmMonitor API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmmonitor.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddGtmMonitorWithChan(request *AddGtmMonitorRequest) (<-chan *AddGtmMonitorResponse, <-chan error) {
|
||||
responseChan := make(chan *AddGtmMonitorResponse, 1)
|
||||
errChan := make(chan error, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
defer close(responseChan)
|
||||
defer close(errChan)
|
||||
response, err := client.AddGtmMonitor(request)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
} else {
|
||||
responseChan <- response
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
close(responseChan)
|
||||
close(errChan)
|
||||
}
|
||||
return responseChan, errChan
|
||||
}
|
||||
|
||||
// AddGtmMonitorWithCallback invokes the alidns.AddGtmMonitor API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/addgtmmonitor.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) AddGtmMonitorWithCallback(request *AddGtmMonitorRequest, callback func(response *AddGtmMonitorResponse, err error)) <-chan int {
|
||||
result := make(chan int, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
var response *AddGtmMonitorResponse
|
||||
var err error
|
||||
defer close(result)
|
||||
response, err = client.AddGtmMonitor(request)
|
||||
callback(response, err)
|
||||
result <- 1
|
||||
})
|
||||
if err != nil {
|
||||
defer close(result)
|
||||
callback(nil, err)
|
||||
result <- 0
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// AddGtmMonitorRequest is the request struct for api AddGtmMonitor
|
||||
type AddGtmMonitorRequest struct {
|
||||
*requests.RpcRequest
|
||||
MonitorExtendInfo string `position:"Query" name:"MonitorExtendInfo"`
|
||||
AddrPoolId string `position:"Query" name:"AddrPoolId"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Name string `position:"Query" name:"Name"`
|
||||
EvaluationCount requests.Integer `position:"Query" name:"EvaluationCount"`
|
||||
ProtocolType string `position:"Query" name:"ProtocolType"`
|
||||
Interval requests.Integer `position:"Query" name:"Interval"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
Timeout requests.Integer `position:"Query" name:"Timeout"`
|
||||
IspCityNode *[]AddGtmMonitorIspCityNode `position:"Query" name:"IspCityNode" type:"Repeated"`
|
||||
}
|
||||
|
||||
// AddGtmMonitorIspCityNode is a repeated param struct in AddGtmMonitorRequest
|
||||
type AddGtmMonitorIspCityNode struct {
|
||||
CityCode string `name:"CityCode"`
|
||||
IspCode string `name:"IspCode"`
|
||||
}
|
||||
|
||||
// AddGtmMonitorResponse is the response struct for api AddGtmMonitor
|
||||
type AddGtmMonitorResponse struct {
|
||||
*responses.BaseResponse
|
||||
RequestId string `json:"RequestId" xml:"RequestId"`
|
||||
MonitorConfigId string `json:"MonitorConfigId" xml:"MonitorConfigId"`
|
||||
}
|
||||
|
||||
// CreateAddGtmMonitorRequest creates a request to invoke AddGtmMonitor API
|
||||
func CreateAddGtmMonitorRequest() (request *AddGtmMonitorRequest) {
|
||||
request = &AddGtmMonitorRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "AddGtmMonitor", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
// CreateAddGtmMonitorResponse creates a response to parse from AddGtmMonitor response
|
||||
func CreateAddGtmMonitorResponse() (response *AddGtmMonitorResponse) {
|
||||
response = &AddGtmMonitorResponse{
|
||||
BaseResponse: &responses.BaseResponse{},
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
package alidns
|
||||
|
||||
//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.
|
||||
//
|
||||
// Code generated by Alibaba Cloud SDK Code Generator.
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
)
|
||||
|
||||
// ApplyForRetrievalDomainName invokes the alidns.ApplyForRetrievalDomainName API synchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/applyforretrievaldomainname.html
|
||||
func (client *Client) ApplyForRetrievalDomainName(request *ApplyForRetrievalDomainNameRequest) (response *ApplyForRetrievalDomainNameResponse, err error) {
|
||||
response = CreateApplyForRetrievalDomainNameResponse()
|
||||
err = client.DoAction(request, response)
|
||||
return
|
||||
}
|
||||
|
||||
// ApplyForRetrievalDomainNameWithChan invokes the alidns.ApplyForRetrievalDomainName API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/applyforretrievaldomainname.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) ApplyForRetrievalDomainNameWithChan(request *ApplyForRetrievalDomainNameRequest) (<-chan *ApplyForRetrievalDomainNameResponse, <-chan error) {
|
||||
responseChan := make(chan *ApplyForRetrievalDomainNameResponse, 1)
|
||||
errChan := make(chan error, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
defer close(responseChan)
|
||||
defer close(errChan)
|
||||
response, err := client.ApplyForRetrievalDomainName(request)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
} else {
|
||||
responseChan <- response
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
close(responseChan)
|
||||
close(errChan)
|
||||
}
|
||||
return responseChan, errChan
|
||||
}
|
||||
|
||||
// ApplyForRetrievalDomainNameWithCallback invokes the alidns.ApplyForRetrievalDomainName API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/applyforretrievaldomainname.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) ApplyForRetrievalDomainNameWithCallback(request *ApplyForRetrievalDomainNameRequest, callback func(response *ApplyForRetrievalDomainNameResponse, err error)) <-chan int {
|
||||
result := make(chan int, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
var response *ApplyForRetrievalDomainNameResponse
|
||||
var err error
|
||||
defer close(result)
|
||||
response, err = client.ApplyForRetrievalDomainName(request)
|
||||
callback(response, err)
|
||||
result <- 1
|
||||
})
|
||||
if err != nil {
|
||||
defer close(result)
|
||||
callback(nil, err)
|
||||
result <- 0
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// ApplyForRetrievalDomainNameRequest is the request struct for api ApplyForRetrievalDomainName
|
||||
type ApplyForRetrievalDomainNameRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
DomainName string `position:"Query" name:"DomainName"`
|
||||
}
|
||||
|
||||
// ApplyForRetrievalDomainNameResponse is the response struct for api ApplyForRetrievalDomainName
|
||||
type ApplyForRetrievalDomainNameResponse struct {
|
||||
*responses.BaseResponse
|
||||
RequestId string `json:"RequestId" xml:"RequestId"`
|
||||
DomainName string `json:"DomainName" xml:"DomainName"`
|
||||
}
|
||||
|
||||
// CreateApplyForRetrievalDomainNameRequest creates a request to invoke ApplyForRetrievalDomainName API
|
||||
func CreateApplyForRetrievalDomainNameRequest() (request *ApplyForRetrievalDomainNameRequest) {
|
||||
request = &ApplyForRetrievalDomainNameRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "ApplyForRetrievalDomainName", "", "")
|
||||
return
|
||||
}
|
||||
|
||||
// CreateApplyForRetrievalDomainNameResponse creates a response to parse from ApplyForRetrievalDomainName response
|
||||
func CreateApplyForRetrievalDomainNameResponse() (response *ApplyForRetrievalDomainNameResponse) {
|
||||
response = &ApplyForRetrievalDomainNameResponse{
|
||||
BaseResponse: &responses.BaseResponse{},
|
||||
}
|
||||
return
|
||||
}
|
||||
6
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/change_domain_group.go
generated
vendored
6
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/change_domain_group.go
generated
vendored
@@ -76,10 +76,10 @@ func (client *Client) ChangeDomainGroupWithCallback(request *ChangeDomainGroupRe
|
||||
// ChangeDomainGroupRequest is the request struct for api ChangeDomainGroup
|
||||
type ChangeDomainGroupRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
GroupId string `position:"Query" name:"GroupId"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
DomainName string `position:"Query" name:"DomainName"`
|
||||
GroupId string `position:"Query" name:"GroupId"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
}
|
||||
|
||||
// ChangeDomainGroupResponse is the response struct for api ChangeDomainGroup
|
||||
@@ -95,7 +95,7 @@ func CreateChangeDomainGroupRequest() (request *ChangeDomainGroupRequest) {
|
||||
request = &ChangeDomainGroupRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "ChangeDomainGroup", "", "")
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "ChangeDomainGroup", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -76,11 +76,11 @@ func (client *Client) ChangeDomainOfDnsProductWithCallback(request *ChangeDomain
|
||||
// ChangeDomainOfDnsProductRequest is the request struct for api ChangeDomainOfDnsProduct
|
||||
type ChangeDomainOfDnsProductRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
InstanceId string `position:"Query" name:"InstanceId"`
|
||||
NewDomain string `position:"Query" name:"NewDomain"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Force requests.Boolean `position:"Query" name:"Force"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
}
|
||||
|
||||
// ChangeDomainOfDnsProductResponse is the response struct for api ChangeDomainOfDnsProduct
|
||||
@@ -95,7 +95,7 @@ func CreateChangeDomainOfDnsProductRequest() (request *ChangeDomainOfDnsProductR
|
||||
request = &ChangeDomainOfDnsProductRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "ChangeDomainOfDnsProduct", "", "")
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "ChangeDomainOfDnsProduct", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
6
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/check_domain_record.go
generated
vendored
6
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/check_domain_record.go
generated
vendored
@@ -76,10 +76,10 @@ func (client *Client) CheckDomainRecordWithCallback(request *CheckDomainRecordRe
|
||||
// CheckDomainRecordRequest is the request struct for api CheckDomainRecord
|
||||
type CheckDomainRecordRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
RR string `position:"Query" name:"RR"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
DomainName string `position:"Query" name:"DomainName"`
|
||||
RR string `position:"Query" name:"RR"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
Type string `position:"Query" name:"Type"`
|
||||
Value string `position:"Query" name:"Value"`
|
||||
}
|
||||
@@ -96,7 +96,7 @@ func CreateCheckDomainRecordRequest() (request *CheckDomainRecordRequest) {
|
||||
request = &CheckDomainRecordRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "CheckDomainRecord", "", "")
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "CheckDomainRecord", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
33
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/client.go
generated
vendored
33
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/client.go
generated
vendored
@@ -18,6 +18,7 @@ package alidns
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider"
|
||||
)
|
||||
|
||||
// Client is the sdk client struct, each func corresponds to an OpenAPI
|
||||
@@ -32,6 +33,20 @@ func NewClient() (client *Client, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// NewClientWithProvider creates a sdk client with providers
|
||||
// usage: https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/docs/2-Client-EN.md
|
||||
func NewClientWithProvider(regionId string, providers ...provider.Provider) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
var pc provider.Provider
|
||||
if len(providers) == 0 {
|
||||
pc = provider.DefaultChain
|
||||
} else {
|
||||
pc = provider.NewProviderChain(providers)
|
||||
}
|
||||
err = client.InitWithProviderChain(regionId, pc)
|
||||
return
|
||||
}
|
||||
|
||||
// NewClientWithOptions creates a sdk client with regionId/sdkConfig/credential
|
||||
// this is the common api to create a sdk client
|
||||
func NewClientWithOptions(regionId string, config *sdk.Config, credential auth.Credential) (client *Client, err error) {
|
||||
@@ -41,7 +56,7 @@ func NewClientWithOptions(regionId string, config *sdk.Config, credential auth.C
|
||||
}
|
||||
|
||||
// NewClientWithAccessKey is a shortcut to create sdk client with accesskey
|
||||
// usage: https://help.aliyun.com/document_detail/66217.html
|
||||
// usage: https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/docs/2-Client-EN.md
|
||||
func NewClientWithAccessKey(regionId, accessKeyId, accessKeySecret string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithAccessKey(regionId, accessKeyId, accessKeySecret)
|
||||
@@ -49,7 +64,7 @@ func NewClientWithAccessKey(regionId, accessKeyId, accessKeySecret string) (clie
|
||||
}
|
||||
|
||||
// NewClientWithStsToken is a shortcut to create sdk client with sts token
|
||||
// usage: https://help.aliyun.com/document_detail/66222.html
|
||||
// usage: https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/docs/2-Client-EN.md
|
||||
func NewClientWithStsToken(regionId, stsAccessKeyId, stsAccessKeySecret, stsToken string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithStsToken(regionId, stsAccessKeyId, stsAccessKeySecret, stsToken)
|
||||
@@ -57,15 +72,23 @@ func NewClientWithStsToken(regionId, stsAccessKeyId, stsAccessKeySecret, stsToke
|
||||
}
|
||||
|
||||
// NewClientWithRamRoleArn is a shortcut to create sdk client with ram roleArn
|
||||
// usage: https://help.aliyun.com/document_detail/66222.html
|
||||
// usage: https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/docs/2-Client-EN.md
|
||||
func NewClientWithRamRoleArn(regionId string, accessKeyId, accessKeySecret, roleArn, roleSessionName string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithRamRoleArn(regionId, accessKeyId, accessKeySecret, roleArn, roleSessionName)
|
||||
return
|
||||
}
|
||||
|
||||
// NewClientWithRamRoleArn is a shortcut to create sdk client with ram roleArn and policy
|
||||
// usage: https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/docs/2-Client-EN.md
|
||||
func NewClientWithRamRoleArnAndPolicy(regionId string, accessKeyId, accessKeySecret, roleArn, roleSessionName, policy string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithRamRoleArnAndPolicy(regionId, accessKeyId, accessKeySecret, roleArn, roleSessionName, policy)
|
||||
return
|
||||
}
|
||||
|
||||
// NewClientWithEcsRamRole is a shortcut to create sdk client with ecs ram role
|
||||
// usage: https://help.aliyun.com/document_detail/66223.html
|
||||
// usage: https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/docs/2-Client-EN.md
|
||||
func NewClientWithEcsRamRole(regionId string, roleName string) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithEcsRamRole(regionId, roleName)
|
||||
@@ -73,7 +96,7 @@ func NewClientWithEcsRamRole(regionId string, roleName string) (client *Client,
|
||||
}
|
||||
|
||||
// NewClientWithRsaKeyPair is a shortcut to create sdk client with rsa key pair
|
||||
// attention: rsa key pair auth is only Japan regions available
|
||||
// usage: https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/docs/2-Client-EN.md
|
||||
func NewClientWithRsaKeyPair(regionId string, publicKeyId, privateKey string, sessionExpiration int) (client *Client, err error) {
|
||||
client = &Client{}
|
||||
err = client.InitWithRsaKeyPair(regionId, publicKeyId, privateKey, sessionExpiration)
|
||||
|
||||
111
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/create_instance.go
generated
vendored
Normal file
111
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/create_instance.go
generated
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
package alidns
|
||||
|
||||
//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.
|
||||
//
|
||||
// Code generated by Alibaba Cloud SDK Code Generator.
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
)
|
||||
|
||||
// CreateInstance invokes the alidns.CreateInstance API synchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/createinstance.html
|
||||
func (client *Client) CreateInstance(request *CreateInstanceRequest) (response *CreateInstanceResponse, err error) {
|
||||
response = CreateCreateInstanceResponse()
|
||||
err = client.DoAction(request, response)
|
||||
return
|
||||
}
|
||||
|
||||
// CreateInstanceWithChan invokes the alidns.CreateInstance API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/createinstance.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) CreateInstanceWithChan(request *CreateInstanceRequest) (<-chan *CreateInstanceResponse, <-chan error) {
|
||||
responseChan := make(chan *CreateInstanceResponse, 1)
|
||||
errChan := make(chan error, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
defer close(responseChan)
|
||||
defer close(errChan)
|
||||
response, err := client.CreateInstance(request)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
} else {
|
||||
responseChan <- response
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
close(responseChan)
|
||||
close(errChan)
|
||||
}
|
||||
return responseChan, errChan
|
||||
}
|
||||
|
||||
// CreateInstanceWithCallback invokes the alidns.CreateInstance API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/createinstance.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) CreateInstanceWithCallback(request *CreateInstanceRequest, callback func(response *CreateInstanceResponse, err error)) <-chan int {
|
||||
result := make(chan int, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
var response *CreateInstanceResponse
|
||||
var err error
|
||||
defer close(result)
|
||||
response, err = client.CreateInstance(request)
|
||||
callback(response, err)
|
||||
result <- 1
|
||||
})
|
||||
if err != nil {
|
||||
defer close(result)
|
||||
callback(nil, err)
|
||||
result <- 0
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// CreateInstanceRequest is the request struct for api CreateInstance
|
||||
type CreateInstanceRequest struct {
|
||||
*requests.RpcRequest
|
||||
Month requests.Integer `position:"Query" name:"Month"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
DomainName string `position:"Query" name:"DomainName"`
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
InstanceVersion string `position:"Query" name:"InstanceVersion"`
|
||||
OwnerId requests.Integer `position:"Query" name:"OwnerId"`
|
||||
Token string `position:"Query" name:"Token"`
|
||||
}
|
||||
|
||||
// CreateInstanceResponse is the response struct for api CreateInstance
|
||||
type CreateInstanceResponse struct {
|
||||
*responses.BaseResponse
|
||||
RequestId string `json:"RequestId" xml:"RequestId"`
|
||||
OrderId string `json:"OrderId" xml:"OrderId"`
|
||||
InstanceId string `json:"InstanceId" xml:"InstanceId"`
|
||||
}
|
||||
|
||||
// CreateCreateInstanceRequest creates a request to invoke CreateInstance API
|
||||
func CreateCreateInstanceRequest() (request *CreateInstanceRequest) {
|
||||
request = &CreateInstanceRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "CreateInstance", "Alidns", "openAPI")
|
||||
return
|
||||
}
|
||||
|
||||
// CreateCreateInstanceResponse creates a response to parse from CreateInstance response
|
||||
func CreateCreateInstanceResponse() (response *CreateInstanceResponse) {
|
||||
response = &CreateInstanceResponse{
|
||||
BaseResponse: &responses.BaseResponse{},
|
||||
}
|
||||
return
|
||||
}
|
||||
106
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/delete_batch_domain_records.go
generated
vendored
106
vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/alidns/delete_batch_domain_records.go
generated
vendored
@@ -1,106 +0,0 @@
|
||||
package alidns
|
||||
|
||||
//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.
|
||||
//
|
||||
// Code generated by Alibaba Cloud SDK Code Generator.
|
||||
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||
|
||||
import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
|
||||
)
|
||||
|
||||
// DeleteBatchDomainRecords invokes the alidns.DeleteBatchDomainRecords API synchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/deletebatchdomainrecords.html
|
||||
func (client *Client) DeleteBatchDomainRecords(request *DeleteBatchDomainRecordsRequest) (response *DeleteBatchDomainRecordsResponse, err error) {
|
||||
response = CreateDeleteBatchDomainRecordsResponse()
|
||||
err = client.DoAction(request, response)
|
||||
return
|
||||
}
|
||||
|
||||
// DeleteBatchDomainRecordsWithChan invokes the alidns.DeleteBatchDomainRecords API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/deletebatchdomainrecords.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) DeleteBatchDomainRecordsWithChan(request *DeleteBatchDomainRecordsRequest) (<-chan *DeleteBatchDomainRecordsResponse, <-chan error) {
|
||||
responseChan := make(chan *DeleteBatchDomainRecordsResponse, 1)
|
||||
errChan := make(chan error, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
defer close(responseChan)
|
||||
defer close(errChan)
|
||||
response, err := client.DeleteBatchDomainRecords(request)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
} else {
|
||||
responseChan <- response
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
close(responseChan)
|
||||
close(errChan)
|
||||
}
|
||||
return responseChan, errChan
|
||||
}
|
||||
|
||||
// DeleteBatchDomainRecordsWithCallback invokes the alidns.DeleteBatchDomainRecords API asynchronously
|
||||
// api document: https://help.aliyun.com/api/alidns/deletebatchdomainrecords.html
|
||||
// asynchronous document: https://help.aliyun.com/document_detail/66220.html
|
||||
func (client *Client) DeleteBatchDomainRecordsWithCallback(request *DeleteBatchDomainRecordsRequest, callback func(response *DeleteBatchDomainRecordsResponse, err error)) <-chan int {
|
||||
result := make(chan int, 1)
|
||||
err := client.AddAsyncTask(func() {
|
||||
var response *DeleteBatchDomainRecordsResponse
|
||||
var err error
|
||||
defer close(result)
|
||||
response, err = client.DeleteBatchDomainRecords(request)
|
||||
callback(response, err)
|
||||
result <- 1
|
||||
})
|
||||
if err != nil {
|
||||
defer close(result)
|
||||
callback(nil, err)
|
||||
result <- 0
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// DeleteBatchDomainRecordsRequest is the request struct for api DeleteBatchDomainRecords
|
||||
type DeleteBatchDomainRecordsRequest struct {
|
||||
*requests.RpcRequest
|
||||
Lang string `position:"Query" name:"Lang"`
|
||||
UserClientIp string `position:"Query" name:"UserClientIp"`
|
||||
Records string `position:"Query" name:"Records"`
|
||||
}
|
||||
|
||||
// DeleteBatchDomainRecordsResponse is the response struct for api DeleteBatchDomainRecords
|
||||
type DeleteBatchDomainRecordsResponse struct {
|
||||
*responses.BaseResponse
|
||||
RequestId string `json:"RequestId" xml:"RequestId"`
|
||||
TraceId string `json:"TraceId" xml:"TraceId"`
|
||||
}
|
||||
|
||||
// CreateDeleteBatchDomainRecordsRequest creates a request to invoke DeleteBatchDomainRecords API
|
||||
func CreateDeleteBatchDomainRecordsRequest() (request *DeleteBatchDomainRecordsRequest) {
|
||||
request = &DeleteBatchDomainRecordsRequest{
|
||||
RpcRequest: &requests.RpcRequest{},
|
||||
}
|
||||
request.InitWithApiInfo("Alidns", "2015-01-09", "DeleteBatchDomainRecords", "", "")
|
||||
return
|
||||
}
|
||||
|
||||
// CreateDeleteBatchDomainRecordsResponse creates a response to parse from DeleteBatchDomainRecords response
|
||||
func CreateDeleteBatchDomainRecordsResponse() (response *DeleteBatchDomainRecordsResponse) {
|
||||
response = &DeleteBatchDomainRecordsResponse{
|
||||
BaseResponse: &responses.BaseResponse{},
|
||||
}
|
||||
return
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user