mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-24 05:04:05 -08:00
Update Azure SDK For Go
Signed-off-by: Matthieu MOREL <matthieu.morel35@gmail.com>
This commit is contained in:
parent
afab845e65
commit
bbdc7d5902
|
@ -23,11 +23,13 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
|
||||||
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2018-10-01/network"
|
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
|
||||||
"github.com/Azure/go-autorest/autorest"
|
"github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud"
|
||||||
"github.com/Azure/go-autorest/autorest/adal"
|
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
|
||||||
"github.com/Azure/go-autorest/autorest/azure"
|
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
|
||||||
|
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4"
|
||||||
|
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2"
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -68,7 +70,7 @@ var (
|
||||||
DefaultSDConfig = SDConfig{
|
DefaultSDConfig = SDConfig{
|
||||||
Port: 80,
|
Port: 80,
|
||||||
RefreshInterval: model.Duration(5 * time.Minute),
|
RefreshInterval: model.Duration(5 * time.Minute),
|
||||||
Environment: azure.PublicCloud.Name,
|
Environment: "AzurePublicCloud",
|
||||||
AuthenticationMethod: authMethodOAuth,
|
AuthenticationMethod: authMethodOAuth,
|
||||||
HTTPClientConfig: config_util.DefaultHTTPClientConfig,
|
HTTPClientConfig: config_util.DefaultHTTPClientConfig,
|
||||||
}
|
}
|
||||||
|
@ -80,6 +82,26 @@ var (
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var environments = map[string]cloud.Configuration{
|
||||||
|
"AZURECHINACLOUD": cloud.AzureChina,
|
||||||
|
"AZURECLOUD": cloud.AzurePublic,
|
||||||
|
"AZUREGERMANCLOUD": cloud.AzurePublic,
|
||||||
|
"AZUREPUBLICCLOUD": cloud.AzurePublic,
|
||||||
|
"AZUREUSGOVERNMENT": cloud.AzureGovernment,
|
||||||
|
"AZUREUSGOVERNMENTCLOUD": cloud.AzureGovernment,
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloudConfigurationFromName returns cloud configuration based on the common name specified.
|
||||||
|
func CloudConfigurationFromName(name string) (cloud.Configuration, error) {
|
||||||
|
name = strings.ToUpper(name)
|
||||||
|
env, ok := environments[name]
|
||||||
|
if !ok {
|
||||||
|
return env, fmt.Errorf("There is no cloud configuration matching the name %q", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return env, nil
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
discovery.RegisterConfig(&SDConfig{})
|
discovery.RegisterConfig(&SDConfig{})
|
||||||
prometheus.MustRegister(failuresCount)
|
prometheus.MustRegister(failuresCount)
|
||||||
|
@ -175,80 +197,88 @@ func NewDiscovery(cfg *SDConfig, logger log.Logger) *Discovery {
|
||||||
|
|
||||||
// azureClient represents multiple Azure Resource Manager providers.
|
// azureClient represents multiple Azure Resource Manager providers.
|
||||||
type azureClient struct {
|
type azureClient struct {
|
||||||
nic network.InterfacesClient
|
nic *armnetwork.InterfacesClient
|
||||||
vm compute.VirtualMachinesClient
|
vm *armcompute.VirtualMachinesClient
|
||||||
vmss compute.VirtualMachineScaleSetsClient
|
vmss *armcompute.VirtualMachineScaleSetsClient
|
||||||
vmssvm compute.VirtualMachineScaleSetVMsClient
|
vmssvm *armcompute.VirtualMachineScaleSetVMsClient
|
||||||
|
logger log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// createAzureClient is a helper function for creating an Azure compute client to ARM.
|
// createAzureClient is a helper function for creating an Azure compute client to ARM.
|
||||||
func createAzureClient(cfg SDConfig) (azureClient, error) {
|
func createAzureClient(cfg SDConfig) (azureClient, error) {
|
||||||
env, err := azure.EnvironmentFromName(cfg.Environment)
|
cloudConfiguration, err := CloudConfigurationFromName(cfg.Environment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return azureClient{}, err
|
return azureClient{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
activeDirectoryEndpoint := env.ActiveDirectoryEndpoint
|
|
||||||
resourceManagerEndpoint := env.ResourceManagerEndpoint
|
|
||||||
|
|
||||||
var c azureClient
|
var c azureClient
|
||||||
|
|
||||||
var spt *adal.ServicePrincipalToken
|
telemetry := policy.TelemetryOptions{
|
||||||
|
ApplicationID: userAgent,
|
||||||
|
}
|
||||||
|
|
||||||
switch cfg.AuthenticationMethod {
|
credential, err := newCredential(cfg, policy.ClientOptions{
|
||||||
case authMethodManagedIdentity:
|
Cloud: cloudConfiguration,
|
||||||
spt, err = adal.NewServicePrincipalTokenFromManagedIdentity(resourceManagerEndpoint, &adal.ManagedIdentityOptions{ClientID: cfg.ClientID})
|
Telemetry: telemetry,
|
||||||
if err != nil {
|
})
|
||||||
return azureClient{}, err
|
if err != nil {
|
||||||
}
|
return azureClient{}, err
|
||||||
case authMethodOAuth:
|
|
||||||
oauthConfig, err := adal.NewOAuthConfig(activeDirectoryEndpoint, cfg.TenantID)
|
|
||||||
if err != nil {
|
|
||||||
return azureClient{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
spt, err = adal.NewServicePrincipalToken(*oauthConfig, cfg.ClientID, string(cfg.ClientSecret), resourceManagerEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
return azureClient{}, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := config_util.NewClientFromConfig(cfg.HTTPClientConfig, "azure_sd")
|
client, err := config_util.NewClientFromConfig(cfg.HTTPClientConfig, "azure_sd")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return azureClient{}, err
|
return azureClient{}, err
|
||||||
}
|
}
|
||||||
sender := autorest.DecorateSender(client)
|
options := &arm.ClientOptions{
|
||||||
preparer := autorest.WithUserAgent(userAgent)
|
ClientOptions: policy.ClientOptions{
|
||||||
|
Transport: client,
|
||||||
|
Cloud: cloudConfiguration,
|
||||||
|
Telemetry: telemetry,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
bearerAuthorizer := autorest.NewBearerAuthorizer(spt)
|
c.vm, err = armcompute.NewVirtualMachinesClient(cfg.SubscriptionID, credential, options)
|
||||||
|
if err != nil {
|
||||||
|
return azureClient{}, err
|
||||||
|
}
|
||||||
|
|
||||||
c.vm = compute.NewVirtualMachinesClientWithBaseURI(resourceManagerEndpoint, cfg.SubscriptionID)
|
c.nic, err = armnetwork.NewInterfacesClient(cfg.SubscriptionID, credential, options)
|
||||||
c.vm.Authorizer = bearerAuthorizer
|
if err != nil {
|
||||||
c.vm.Sender = sender
|
return azureClient{}, err
|
||||||
c.vm.RequestInspector = preparer
|
}
|
||||||
|
|
||||||
c.nic = network.NewInterfacesClientWithBaseURI(resourceManagerEndpoint, cfg.SubscriptionID)
|
c.vmss, err = armcompute.NewVirtualMachineScaleSetsClient(cfg.SubscriptionID, credential, options)
|
||||||
c.nic.Authorizer = bearerAuthorizer
|
if err != nil {
|
||||||
c.nic.Sender = sender
|
return azureClient{}, err
|
||||||
c.nic.RequestInspector = preparer
|
}
|
||||||
|
|
||||||
c.vmss = compute.NewVirtualMachineScaleSetsClientWithBaseURI(resourceManagerEndpoint, cfg.SubscriptionID)
|
c.vmssvm, err = armcompute.NewVirtualMachineScaleSetVMsClient(cfg.SubscriptionID, credential, options)
|
||||||
c.vmss.Authorizer = bearerAuthorizer
|
if err != nil {
|
||||||
c.vmss.Sender = sender
|
return azureClient{}, err
|
||||||
c.vmss.RequestInspector = preparer
|
}
|
||||||
|
|
||||||
c.vmssvm = compute.NewVirtualMachineScaleSetVMsClientWithBaseURI(resourceManagerEndpoint, cfg.SubscriptionID)
|
|
||||||
c.vmssvm.Authorizer = bearerAuthorizer
|
|
||||||
c.vmssvm.Sender = sender
|
|
||||||
c.vmssvm.RequestInspector = preparer
|
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// azureResource represents a resource identifier in Azure.
|
func newCredential(cfg SDConfig, policyClientOptions policy.ClientOptions) (azcore.TokenCredential, error) {
|
||||||
type azureResource struct {
|
var credential azcore.TokenCredential
|
||||||
Name string
|
switch cfg.AuthenticationMethod {
|
||||||
ResourceGroup string
|
case authMethodManagedIdentity:
|
||||||
|
options := &azidentity.ManagedIdentityCredentialOptions{ClientOptions: policyClientOptions, ID: azidentity.ClientID(cfg.ClientID)}
|
||||||
|
managedIdentityCredential, err := azidentity.NewManagedIdentityCredential(options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
credential = azcore.TokenCredential(managedIdentityCredential)
|
||||||
|
case authMethodOAuth:
|
||||||
|
options := &azidentity.ClientSecretCredentialOptions{ClientOptions: policyClientOptions}
|
||||||
|
secretCredential, err := azidentity.NewClientSecretCredential(cfg.TenantID, cfg.ClientID, string(cfg.ClientSecret), options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
credential = azcore.TokenCredential(secretCredential)
|
||||||
|
}
|
||||||
|
return credential, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// virtualMachine represents an Azure virtual machine (which can also be created by a VMSS)
|
// virtualMachine represents an Azure virtual machine (which can also be created by a VMSS)
|
||||||
|
@ -266,22 +296,17 @@ type virtualMachine struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new azureResource object from an ID string.
|
// Create a new azureResource object from an ID string.
|
||||||
func newAzureResourceFromID(id string, logger log.Logger) (azureResource, error) {
|
func newAzureResourceFromID(id string, logger log.Logger) (*arm.ResourceID, error) {
|
||||||
// Resource IDs have the following format.
|
if logger == nil {
|
||||||
// /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/PROVIDER/TYPE/NAME
|
logger = log.NewNopLogger()
|
||||||
// or if embedded resource then
|
|
||||||
// /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/PROVIDER/TYPE/NAME/TYPE/NAME
|
|
||||||
s := strings.Split(id, "/")
|
|
||||||
if len(s) != 9 && len(s) != 11 {
|
|
||||||
err := fmt.Errorf("invalid ID '%s'. Refusing to create azureResource", id)
|
|
||||||
level.Error(logger).Log("err", err)
|
|
||||||
return azureResource{}, err
|
|
||||||
}
|
}
|
||||||
|
resourceID, err := arm.ParseResourceID(id)
|
||||||
return azureResource{
|
if err != nil {
|
||||||
Name: strings.ToLower(s[8]),
|
err := fmt.Errorf("invalid ID '%s': %w", id, err)
|
||||||
ResourceGroup: strings.ToLower(s[4]),
|
level.Error(logger).Log("err", err)
|
||||||
}, nil
|
return &arm.ResourceID{}, err
|
||||||
|
}
|
||||||
|
return resourceID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
|
func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
|
||||||
|
@ -292,6 +317,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
|
||||||
failuresCount.Inc()
|
failuresCount.Inc()
|
||||||
return nil, fmt.Errorf("could not create Azure client: %w", err)
|
return nil, fmt.Errorf("could not create Azure client: %w", err)
|
||||||
}
|
}
|
||||||
|
client.logger = d.logger
|
||||||
|
|
||||||
machines, err := client.getVMs(ctx, d.cfg.ResourceGroup)
|
machines, err := client.getVMs(ctx, d.cfg.ResourceGroup)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -344,7 +370,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
|
||||||
azureLabelMachineComputerName: model.LabelValue(vm.ComputerName),
|
azureLabelMachineComputerName: model.LabelValue(vm.ComputerName),
|
||||||
azureLabelMachineOSType: model.LabelValue(vm.OsType),
|
azureLabelMachineOSType: model.LabelValue(vm.OsType),
|
||||||
azureLabelMachineLocation: model.LabelValue(vm.Location),
|
azureLabelMachineLocation: model.LabelValue(vm.Location),
|
||||||
azureLabelMachineResourceGroup: model.LabelValue(r.ResourceGroup),
|
azureLabelMachineResourceGroup: model.LabelValue(r.ResourceGroupName),
|
||||||
azureLabelMachineSize: model.LabelValue(vm.Size),
|
azureLabelMachineSize: model.LabelValue(vm.Size),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,7 +396,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if networkInterface.InterfacePropertiesFormat == nil {
|
if networkInterface.Properties == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,21 +404,21 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
|
||||||
// This information is available via another API call however the Go SDK does not
|
// This information is available via another API call however the Go SDK does not
|
||||||
// yet support this. On deallocated machines, this value happens to be nil so it
|
// yet support this. On deallocated machines, this value happens to be nil so it
|
||||||
// is a cheap and easy way to determine if a machine is allocated or not.
|
// is a cheap and easy way to determine if a machine is allocated or not.
|
||||||
if networkInterface.Primary == nil {
|
if networkInterface.Properties.Primary == nil {
|
||||||
level.Debug(d.logger).Log("msg", "Skipping deallocated virtual machine", "machine", vm.Name)
|
level.Debug(d.logger).Log("msg", "Skipping deallocated virtual machine", "machine", vm.Name)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if *networkInterface.Primary {
|
if *networkInterface.Properties.Primary {
|
||||||
for _, ip := range *networkInterface.IPConfigurations {
|
for _, ip := range networkInterface.Properties.IPConfigurations {
|
||||||
// IPAddress is a field defined in PublicIPAddressPropertiesFormat,
|
// IPAddress is a field defined in PublicIPAddressPropertiesFormat,
|
||||||
// therefore we need to validate that both are not nil.
|
// therefore we need to validate that both are not nil.
|
||||||
if ip.PublicIPAddress != nil && ip.PublicIPAddress.PublicIPAddressPropertiesFormat != nil && ip.PublicIPAddress.IPAddress != nil {
|
if ip.Properties != nil && ip.Properties.PublicIPAddress != nil && ip.Properties.PublicIPAddress.Properties != nil && ip.Properties.PublicIPAddress.Properties.IPAddress != nil {
|
||||||
labels[azureLabelMachinePublicIP] = model.LabelValue(*ip.PublicIPAddress.IPAddress)
|
labels[azureLabelMachinePublicIP] = model.LabelValue(*ip.Properties.PublicIPAddress.Properties.IPAddress)
|
||||||
}
|
}
|
||||||
if ip.PrivateIPAddress != nil {
|
if ip.Properties != nil && ip.Properties.PrivateIPAddress != nil {
|
||||||
labels[azureLabelMachinePrivateIP] = model.LabelValue(*ip.PrivateIPAddress)
|
labels[azureLabelMachinePrivateIP] = model.LabelValue(*ip.Properties.PrivateIPAddress)
|
||||||
address := net.JoinHostPort(*ip.PrivateIPAddress, fmt.Sprintf("%d", d.port))
|
address := net.JoinHostPort(*ip.Properties.PrivateIPAddress, fmt.Sprintf("%d", d.port))
|
||||||
labels[model.AddressLabel] = model.LabelValue(address)
|
labels[model.AddressLabel] = model.LabelValue(address)
|
||||||
ch <- target{labelSet: labels, err: nil}
|
ch <- target{labelSet: labels, err: nil}
|
||||||
return
|
return
|
||||||
|
@ -427,93 +453,84 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
|
||||||
|
|
||||||
func (client *azureClient) getVMs(ctx context.Context, resourceGroup string) ([]virtualMachine, error) {
|
func (client *azureClient) getVMs(ctx context.Context, resourceGroup string) ([]virtualMachine, error) {
|
||||||
var vms []virtualMachine
|
var vms []virtualMachine
|
||||||
var result compute.VirtualMachineListResultPage
|
|
||||||
var err error
|
|
||||||
if len(resourceGroup) == 0 {
|
if len(resourceGroup) == 0 {
|
||||||
result, err = client.vm.ListAll(ctx)
|
pager := client.vm.NewListAllPager(nil)
|
||||||
|
for pager.More() {
|
||||||
|
nextResult, err := pager.NextPage(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not list virtual machines: %w", err)
|
||||||
|
}
|
||||||
|
for _, vm := range nextResult.Value {
|
||||||
|
vms = append(vms, mapFromVM(*vm))
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
result, err = client.vm.List(ctx, resourceGroup)
|
pager := client.vm.NewListPager(resourceGroup, nil)
|
||||||
}
|
for pager.More() {
|
||||||
if err != nil {
|
nextResult, err := pager.NextPage(ctx)
|
||||||
return nil, fmt.Errorf("could not list virtual machines: %w", err)
|
if err != nil {
|
||||||
}
|
return nil, fmt.Errorf("could not list virtual machines: %w", err)
|
||||||
for result.NotDone() {
|
}
|
||||||
for _, vm := range result.Values() {
|
for _, vm := range nextResult.Value {
|
||||||
vms = append(vms, mapFromVM(vm))
|
vms = append(vms, mapFromVM(*vm))
|
||||||
}
|
}
|
||||||
err = result.NextWithContext(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("could not list virtual machines: %w", err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return vms, nil
|
return vms, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type VmssListResultPage interface {
|
func (client *azureClient) getScaleSets(ctx context.Context, resourceGroup string) ([]armcompute.VirtualMachineScaleSet, error) {
|
||||||
NextWithContext(ctx context.Context) (err error)
|
var scaleSets []armcompute.VirtualMachineScaleSet
|
||||||
NotDone() bool
|
|
||||||
Values() []compute.VirtualMachineScaleSet
|
|
||||||
}
|
|
||||||
|
|
||||||
func (client *azureClient) getScaleSets(ctx context.Context, resourceGroup string) ([]compute.VirtualMachineScaleSet, error) {
|
|
||||||
var scaleSets []compute.VirtualMachineScaleSet
|
|
||||||
var result VmssListResultPage
|
|
||||||
var err error
|
|
||||||
if len(resourceGroup) == 0 {
|
if len(resourceGroup) == 0 {
|
||||||
var rtn compute.VirtualMachineScaleSetListWithLinkResultPage
|
pager := client.vmss.NewListAllPager(nil)
|
||||||
rtn, err = client.vmss.ListAll(ctx)
|
for pager.More() {
|
||||||
if err != nil {
|
nextResult, err := pager.NextPage(ctx)
|
||||||
return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
|
||||||
|
}
|
||||||
|
for _, vmss := range nextResult.Value {
|
||||||
|
scaleSets = append(scaleSets, *vmss)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
result = &rtn
|
|
||||||
} else {
|
} else {
|
||||||
var rtn compute.VirtualMachineScaleSetListResultPage
|
pager := client.vmss.NewListPager(resourceGroup, nil)
|
||||||
rtn, err = client.vmss.List(ctx, resourceGroup)
|
for pager.More() {
|
||||||
if err != nil {
|
nextResult, err := pager.NextPage(ctx)
|
||||||
return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
|
if err != nil {
|
||||||
}
|
return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
|
||||||
result = &rtn
|
}
|
||||||
}
|
for _, vmss := range nextResult.Value {
|
||||||
|
scaleSets = append(scaleSets, *vmss)
|
||||||
for result.NotDone() {
|
}
|
||||||
scaleSets = append(scaleSets, result.Values()...)
|
|
||||||
err = result.NextWithContext(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return scaleSets, nil
|
return scaleSets, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *azureClient) getScaleSetVMs(ctx context.Context, scaleSet compute.VirtualMachineScaleSet) ([]virtualMachine, error) {
|
func (client *azureClient) getScaleSetVMs(ctx context.Context, scaleSet armcompute.VirtualMachineScaleSet) ([]virtualMachine, error) {
|
||||||
var vms []virtualMachine
|
var vms []virtualMachine
|
||||||
// TODO do we really need to fetch the resourcegroup this way?
|
// TODO do we really need to fetch the resourcegroup this way?
|
||||||
r, err := newAzureResourceFromID(*scaleSet.ID, nil)
|
r, err := newAzureResourceFromID(*scaleSet.ID, client.logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not parse scale set ID: %w", err)
|
return nil, fmt.Errorf("could not parse scale set ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := client.vmssvm.List(ctx, r.ResourceGroup, *(scaleSet.Name), "", "", "")
|
pager := client.vmssvm.NewListPager(r.ResourceGroupName, *(scaleSet.Name), nil)
|
||||||
if err != nil {
|
for pager.More() {
|
||||||
return nil, fmt.Errorf("could not list virtual machine scale set vms: %w", err)
|
nextResult, err := pager.NextPage(ctx)
|
||||||
}
|
|
||||||
for result.NotDone() {
|
|
||||||
for _, vm := range result.Values() {
|
|
||||||
vms = append(vms, mapFromVMScaleSetVM(vm, *scaleSet.Name))
|
|
||||||
}
|
|
||||||
err = result.NextWithContext(ctx)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not list virtual machine scale set vms: %w", err)
|
return nil, fmt.Errorf("could not list virtual machine scale set vms: %w", err)
|
||||||
}
|
}
|
||||||
|
for _, vmssvm := range nextResult.Value {
|
||||||
|
vms = append(vms, mapFromVMScaleSetVM(*vmssvm, *scaleSet.Name))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return vms, nil
|
return vms, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mapFromVM(vm compute.VirtualMachine) virtualMachine {
|
func mapFromVM(vm armcompute.VirtualMachine) virtualMachine {
|
||||||
osType := string(vm.StorageProfile.OsDisk.OsType)
|
osType := string(*vm.Properties.StorageProfile.OSDisk.OSType)
|
||||||
tags := map[string]*string{}
|
tags := map[string]*string{}
|
||||||
networkInterfaces := []string{}
|
networkInterfaces := []string{}
|
||||||
var computerName string
|
var computerName string
|
||||||
|
@ -523,18 +540,17 @@ func mapFromVM(vm compute.VirtualMachine) virtualMachine {
|
||||||
tags = vm.Tags
|
tags = vm.Tags
|
||||||
}
|
}
|
||||||
|
|
||||||
if vm.NetworkProfile != nil {
|
if vm.Properties != nil {
|
||||||
for _, vmNIC := range *(vm.NetworkProfile.NetworkInterfaces) {
|
if vm.Properties.NetworkProfile != nil {
|
||||||
networkInterfaces = append(networkInterfaces, *vmNIC.ID)
|
for _, vmNIC := range vm.Properties.NetworkProfile.NetworkInterfaces {
|
||||||
|
networkInterfaces = append(networkInterfaces, *vmNIC.ID)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if vm.Properties.OSProfile != nil && vm.Properties.OSProfile.ComputerName != nil {
|
||||||
|
computerName = *(vm.Properties.OSProfile.ComputerName)
|
||||||
if vm.VirtualMachineProperties != nil {
|
|
||||||
if vm.VirtualMachineProperties.OsProfile != nil && vm.VirtualMachineProperties.OsProfile.ComputerName != nil {
|
|
||||||
computerName = *(vm.VirtualMachineProperties.OsProfile.ComputerName)
|
|
||||||
}
|
}
|
||||||
if vm.VirtualMachineProperties.HardwareProfile != nil {
|
if vm.Properties.HardwareProfile != nil {
|
||||||
size = string(vm.VirtualMachineProperties.HardwareProfile.VMSize)
|
size = string(*vm.Properties.HardwareProfile.VMSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -552,8 +568,8 @@ func mapFromVM(vm compute.VirtualMachine) virtualMachine {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mapFromVMScaleSetVM(vm compute.VirtualMachineScaleSetVM, scaleSetName string) virtualMachine {
|
func mapFromVMScaleSetVM(vm armcompute.VirtualMachineScaleSetVM, scaleSetName string) virtualMachine {
|
||||||
osType := string(vm.StorageProfile.OsDisk.OsType)
|
osType := string(*vm.Properties.StorageProfile.OSDisk.OSType)
|
||||||
tags := map[string]*string{}
|
tags := map[string]*string{}
|
||||||
networkInterfaces := []string{}
|
networkInterfaces := []string{}
|
||||||
var computerName string
|
var computerName string
|
||||||
|
@ -563,18 +579,17 @@ func mapFromVMScaleSetVM(vm compute.VirtualMachineScaleSetVM, scaleSetName strin
|
||||||
tags = vm.Tags
|
tags = vm.Tags
|
||||||
}
|
}
|
||||||
|
|
||||||
if vm.NetworkProfile != nil {
|
if vm.Properties != nil {
|
||||||
for _, vmNIC := range *(vm.NetworkProfile.NetworkInterfaces) {
|
if vm.Properties.NetworkProfile != nil {
|
||||||
networkInterfaces = append(networkInterfaces, *vmNIC.ID)
|
for _, vmNIC := range vm.Properties.NetworkProfile.NetworkInterfaces {
|
||||||
|
networkInterfaces = append(networkInterfaces, *vmNIC.ID)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if vm.Properties.OSProfile != nil && vm.Properties.OSProfile.ComputerName != nil {
|
||||||
|
computerName = *(vm.Properties.OSProfile.ComputerName)
|
||||||
if vm.VirtualMachineScaleSetVMProperties != nil {
|
|
||||||
if vm.VirtualMachineScaleSetVMProperties.OsProfile != nil && vm.VirtualMachineScaleSetVMProperties.OsProfile.ComputerName != nil {
|
|
||||||
computerName = *(vm.VirtualMachineScaleSetVMProperties.OsProfile.ComputerName)
|
|
||||||
}
|
}
|
||||||
if vm.VirtualMachineScaleSetVMProperties.HardwareProfile != nil {
|
if vm.Properties.HardwareProfile != nil {
|
||||||
size = string(vm.VirtualMachineScaleSetVMProperties.HardwareProfile.VMSize)
|
size = string(*vm.Properties.HardwareProfile.VMSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,36 +611,20 @@ var errorNotFound = errors.New("network interface does not exist")
|
||||||
|
|
||||||
// getNetworkInterfaceByID gets the network interface.
|
// getNetworkInterfaceByID gets the network interface.
|
||||||
// If a 404 is returned from the Azure API, `errorNotFound` is returned.
|
// If a 404 is returned from the Azure API, `errorNotFound` is returned.
|
||||||
// On all other errors, an autorest.DetailedError is returned.
|
func (client *azureClient) getNetworkInterfaceByID(ctx context.Context, networkInterfaceID string) (*armnetwork.Interface, error) {
|
||||||
func (client *azureClient) getNetworkInterfaceByID(ctx context.Context, networkInterfaceID string) (*network.Interface, error) {
|
r, err := newAzureResourceFromID(networkInterfaceID, client.logger)
|
||||||
result := network.Interface{}
|
if err != nil {
|
||||||
queryParameters := map[string]interface{}{
|
return nil, fmt.Errorf("could not parse network interface ID: %w", err)
|
||||||
"api-version": "2018-10-01",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
preparer := autorest.CreatePreparer(
|
resp, err := client.nic.Get(ctx, r.ResourceGroupName, r.Name, nil)
|
||||||
autorest.AsGet(),
|
|
||||||
autorest.WithBaseURL(client.nic.BaseURI),
|
|
||||||
autorest.WithPath(networkInterfaceID),
|
|
||||||
autorest.WithQueryParameters(queryParameters),
|
|
||||||
autorest.WithUserAgent(userAgent))
|
|
||||||
req, err := preparer.Prepare((&http.Request{}).WithContext(ctx))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, autorest.NewErrorWithError(err, "network.InterfacesClient", "Get", nil, "Failure preparing request")
|
var responseError *azcore.ResponseError
|
||||||
}
|
if errors.As(err, &responseError) && responseError.StatusCode == http.StatusNotFound {
|
||||||
|
|
||||||
resp, err := client.nic.GetSender(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, autorest.NewErrorWithError(err, "network.InterfacesClient", "Get", resp, "Failure sending request")
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err = client.nic.GetResponder(resp)
|
|
||||||
if err != nil {
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
|
||||||
return nil, errorNotFound
|
return nil, errorNotFound
|
||||||
}
|
}
|
||||||
return nil, autorest.NewErrorWithError(err, "network.InterfacesClient", "Get", resp, "Failure responding to request")
|
return nil, fmt.Errorf("Failed to retrieve Interface %v with error: %w", networkInterfaceID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &result, nil
|
return &resp.Interface, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,8 @@ package azure
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
|
||||||
|
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/goleak"
|
"go.uber.org/goleak"
|
||||||
)
|
)
|
||||||
|
@ -29,34 +30,36 @@ func TestMapFromVMWithEmptyTags(t *testing.T) {
|
||||||
id := "test"
|
id := "test"
|
||||||
name := "name"
|
name := "name"
|
||||||
size := "size"
|
size := "size"
|
||||||
|
vmSize := armcompute.VirtualMachineSizeTypes(size)
|
||||||
|
osType := armcompute.OperatingSystemTypesLinux
|
||||||
vmType := "type"
|
vmType := "type"
|
||||||
location := "westeurope"
|
location := "westeurope"
|
||||||
computerName := "computer_name"
|
computerName := "computer_name"
|
||||||
networkProfile := compute.NetworkProfile{
|
networkProfile := armcompute.NetworkProfile{
|
||||||
NetworkInterfaces: &[]compute.NetworkInterfaceReference{},
|
NetworkInterfaces: []*armcompute.NetworkInterfaceReference{},
|
||||||
}
|
}
|
||||||
properties := &compute.VirtualMachineProperties{
|
properties := &armcompute.VirtualMachineProperties{
|
||||||
OsProfile: &compute.OSProfile{
|
OSProfile: &armcompute.OSProfile{
|
||||||
ComputerName: &computerName,
|
ComputerName: &computerName,
|
||||||
},
|
},
|
||||||
StorageProfile: &compute.StorageProfile{
|
StorageProfile: &armcompute.StorageProfile{
|
||||||
OsDisk: &compute.OSDisk{
|
OSDisk: &armcompute.OSDisk{
|
||||||
OsType: "Linux",
|
OSType: &osType,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
NetworkProfile: &networkProfile,
|
NetworkProfile: &networkProfile,
|
||||||
HardwareProfile: &compute.HardwareProfile{
|
HardwareProfile: &armcompute.HardwareProfile{
|
||||||
VMSize: compute.VirtualMachineSizeTypes(size),
|
VMSize: &vmSize,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
testVM := compute.VirtualMachine{
|
testVM := armcompute.VirtualMachine{
|
||||||
ID: &id,
|
ID: &id,
|
||||||
Name: &name,
|
Name: &name,
|
||||||
Type: &vmType,
|
Type: &vmType,
|
||||||
Location: &location,
|
Location: &location,
|
||||||
Tags: nil,
|
Tags: nil,
|
||||||
VirtualMachineProperties: properties,
|
Properties: properties,
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedVM := virtualMachine{
|
expectedVM := virtualMachine{
|
||||||
|
@ -80,37 +83,39 @@ func TestMapFromVMWithTags(t *testing.T) {
|
||||||
id := "test"
|
id := "test"
|
||||||
name := "name"
|
name := "name"
|
||||||
size := "size"
|
size := "size"
|
||||||
|
vmSize := armcompute.VirtualMachineSizeTypes(size)
|
||||||
|
osType := armcompute.OperatingSystemTypesLinux
|
||||||
vmType := "type"
|
vmType := "type"
|
||||||
location := "westeurope"
|
location := "westeurope"
|
||||||
computerName := "computer_name"
|
computerName := "computer_name"
|
||||||
tags := map[string]*string{
|
tags := map[string]*string{
|
||||||
"prometheus": new(string),
|
"prometheus": new(string),
|
||||||
}
|
}
|
||||||
networkProfile := compute.NetworkProfile{
|
networkProfile := armcompute.NetworkProfile{
|
||||||
NetworkInterfaces: &[]compute.NetworkInterfaceReference{},
|
NetworkInterfaces: []*armcompute.NetworkInterfaceReference{},
|
||||||
}
|
}
|
||||||
properties := &compute.VirtualMachineProperties{
|
properties := &armcompute.VirtualMachineProperties{
|
||||||
OsProfile: &compute.OSProfile{
|
OSProfile: &armcompute.OSProfile{
|
||||||
ComputerName: &computerName,
|
ComputerName: &computerName,
|
||||||
},
|
},
|
||||||
StorageProfile: &compute.StorageProfile{
|
StorageProfile: &armcompute.StorageProfile{
|
||||||
OsDisk: &compute.OSDisk{
|
OSDisk: &armcompute.OSDisk{
|
||||||
OsType: "Linux",
|
OSType: &osType,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
NetworkProfile: &networkProfile,
|
NetworkProfile: &networkProfile,
|
||||||
HardwareProfile: &compute.HardwareProfile{
|
HardwareProfile: &armcompute.HardwareProfile{
|
||||||
VMSize: compute.VirtualMachineSizeTypes(size),
|
VMSize: &vmSize,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
testVM := compute.VirtualMachine{
|
testVM := armcompute.VirtualMachine{
|
||||||
ID: &id,
|
ID: &id,
|
||||||
Name: &name,
|
Name: &name,
|
||||||
Type: &vmType,
|
Type: &vmType,
|
||||||
Location: &location,
|
Location: &location,
|
||||||
Tags: tags,
|
Tags: tags,
|
||||||
VirtualMachineProperties: properties,
|
Properties: properties,
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedVM := virtualMachine{
|
expectedVM := virtualMachine{
|
||||||
|
@ -134,34 +139,36 @@ func TestMapFromVMScaleSetVMWithEmptyTags(t *testing.T) {
|
||||||
id := "test"
|
id := "test"
|
||||||
name := "name"
|
name := "name"
|
||||||
size := "size"
|
size := "size"
|
||||||
|
vmSize := armcompute.VirtualMachineSizeTypes(size)
|
||||||
|
osType := armcompute.OperatingSystemTypesLinux
|
||||||
vmType := "type"
|
vmType := "type"
|
||||||
location := "westeurope"
|
location := "westeurope"
|
||||||
computerName := "computer_name"
|
computerName := "computer_name"
|
||||||
networkProfile := compute.NetworkProfile{
|
networkProfile := armcompute.NetworkProfile{
|
||||||
NetworkInterfaces: &[]compute.NetworkInterfaceReference{},
|
NetworkInterfaces: []*armcompute.NetworkInterfaceReference{},
|
||||||
}
|
}
|
||||||
properties := &compute.VirtualMachineScaleSetVMProperties{
|
properties := &armcompute.VirtualMachineScaleSetVMProperties{
|
||||||
OsProfile: &compute.OSProfile{
|
OSProfile: &armcompute.OSProfile{
|
||||||
ComputerName: &computerName,
|
ComputerName: &computerName,
|
||||||
},
|
},
|
||||||
StorageProfile: &compute.StorageProfile{
|
StorageProfile: &armcompute.StorageProfile{
|
||||||
OsDisk: &compute.OSDisk{
|
OSDisk: &armcompute.OSDisk{
|
||||||
OsType: "Linux",
|
OSType: &osType,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
NetworkProfile: &networkProfile,
|
NetworkProfile: &networkProfile,
|
||||||
HardwareProfile: &compute.HardwareProfile{
|
HardwareProfile: &armcompute.HardwareProfile{
|
||||||
VMSize: compute.VirtualMachineSizeTypes(size),
|
VMSize: &vmSize,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
testVM := compute.VirtualMachineScaleSetVM{
|
testVM := armcompute.VirtualMachineScaleSetVM{
|
||||||
ID: &id,
|
ID: &id,
|
||||||
Name: &name,
|
Name: &name,
|
||||||
Type: &vmType,
|
Type: &vmType,
|
||||||
Location: &location,
|
Location: &location,
|
||||||
Tags: nil,
|
Tags: nil,
|
||||||
VirtualMachineScaleSetVMProperties: properties,
|
Properties: properties,
|
||||||
}
|
}
|
||||||
|
|
||||||
scaleSet := "testSet"
|
scaleSet := "testSet"
|
||||||
|
@ -187,37 +194,39 @@ func TestMapFromVMScaleSetVMWithTags(t *testing.T) {
|
||||||
id := "test"
|
id := "test"
|
||||||
name := "name"
|
name := "name"
|
||||||
size := "size"
|
size := "size"
|
||||||
|
vmSize := armcompute.VirtualMachineSizeTypes(size)
|
||||||
|
osType := armcompute.OperatingSystemTypesLinux
|
||||||
vmType := "type"
|
vmType := "type"
|
||||||
location := "westeurope"
|
location := "westeurope"
|
||||||
computerName := "computer_name"
|
computerName := "computer_name"
|
||||||
tags := map[string]*string{
|
tags := map[string]*string{
|
||||||
"prometheus": new(string),
|
"prometheus": new(string),
|
||||||
}
|
}
|
||||||
networkProfile := compute.NetworkProfile{
|
networkProfile := armcompute.NetworkProfile{
|
||||||
NetworkInterfaces: &[]compute.NetworkInterfaceReference{},
|
NetworkInterfaces: []*armcompute.NetworkInterfaceReference{},
|
||||||
}
|
}
|
||||||
properties := &compute.VirtualMachineScaleSetVMProperties{
|
properties := &armcompute.VirtualMachineScaleSetVMProperties{
|
||||||
OsProfile: &compute.OSProfile{
|
OSProfile: &armcompute.OSProfile{
|
||||||
ComputerName: &computerName,
|
ComputerName: &computerName,
|
||||||
},
|
},
|
||||||
StorageProfile: &compute.StorageProfile{
|
StorageProfile: &armcompute.StorageProfile{
|
||||||
OsDisk: &compute.OSDisk{
|
OSDisk: &armcompute.OSDisk{
|
||||||
OsType: "Linux",
|
OSType: &osType,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
NetworkProfile: &networkProfile,
|
NetworkProfile: &networkProfile,
|
||||||
HardwareProfile: &compute.HardwareProfile{
|
HardwareProfile: &armcompute.HardwareProfile{
|
||||||
VMSize: compute.VirtualMachineSizeTypes(size),
|
VMSize: &vmSize,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
testVM := compute.VirtualMachineScaleSetVM{
|
testVM := armcompute.VirtualMachineScaleSetVM{
|
||||||
ID: &id,
|
ID: &id,
|
||||||
Name: &name,
|
Name: &name,
|
||||||
Type: &vmType,
|
Type: &vmType,
|
||||||
Location: &location,
|
Location: &location,
|
||||||
Tags: tags,
|
Tags: tags,
|
||||||
VirtualMachineScaleSetVMProperties: properties,
|
Properties: properties,
|
||||||
}
|
}
|
||||||
|
|
||||||
scaleSet := "testSet"
|
scaleSet := "testSet"
|
||||||
|
@ -242,18 +251,26 @@ func TestMapFromVMScaleSetVMWithTags(t *testing.T) {
|
||||||
func TestNewAzureResourceFromID(t *testing.T) {
|
func TestNewAzureResourceFromID(t *testing.T) {
|
||||||
for _, tc := range []struct {
|
for _, tc := range []struct {
|
||||||
id string
|
id string
|
||||||
expected azureResource
|
expected *arm.ResourceID
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
id: "/a/b/c/group/d/e/f/name",
|
id: "/subscriptions/SUBSCRIPTION_ID/resourceGroups/group/providers/PROVIDER/TYPE/name",
|
||||||
expected: azureResource{"name", "group"},
|
expected: &arm.ResourceID{
|
||||||
|
Name: "name",
|
||||||
|
ResourceGroupName: "group",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "/a/b/c/group/d/e/f/name/g/h",
|
id: "/subscriptions/SUBSCRIPTION_ID/resourceGroups/group/providers/PROVIDER/TYPE/name/TYPE/h",
|
||||||
expected: azureResource{"name", "group"},
|
expected: &arm.ResourceID{
|
||||||
|
Name: "h",
|
||||||
|
ResourceGroupName: "group",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
actual, _ := newAzureResourceFromID(tc.id, nil)
|
actual, err := newAzureResourceFromID(tc.id, nil)
|
||||||
require.Equal(t, tc.expected, actual)
|
require.Nil(t, err)
|
||||||
|
require.Equal(t, tc.expected.Name, actual.Name)
|
||||||
|
require.Equal(t, tc.expected.ResourceGroupName, actual.ResourceGroupName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
45
go.mod
45
go.mod
|
@ -3,11 +3,10 @@ module github.com/prometheus/prometheus
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Azure/azure-sdk-for-go v65.0.0+incompatible
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0
|
||||||
github.com/Azure/go-autorest/autorest v0.11.29
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.23
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1
|
||||||
github.com/alecthomas/kingpin/v2 v2.3.2
|
github.com/alecthomas/kingpin/v2 v2.3.2
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137
|
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137
|
||||||
github.com/aws/aws-sdk-go v1.45.19
|
github.com/aws/aws-sdk-go v1.45.19
|
||||||
|
@ -26,6 +25,7 @@ require (
|
||||||
github.com/gogo/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.2
|
||||||
github.com/golang/snappy v0.0.4
|
github.com/golang/snappy v0.0.4
|
||||||
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8
|
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8
|
||||||
|
github.com/google/uuid v1.3.0
|
||||||
github.com/gophercloud/gophercloud v1.5.0
|
github.com/gophercloud/gophercloud v1.5.0
|
||||||
github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd
|
github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||||
|
@ -38,6 +38,7 @@ require (
|
||||||
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b
|
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b
|
||||||
github.com/linode/linodego v1.19.0
|
github.com/linode/linodego v1.19.0
|
||||||
github.com/miekg/dns v1.1.55
|
github.com/miekg/dns v1.1.55
|
||||||
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f
|
||||||
github.com/oklog/run v1.1.0
|
github.com/oklog/run v1.1.0
|
||||||
github.com/oklog/ulid v1.3.1
|
github.com/oklog/ulid v1.3.1
|
||||||
|
@ -67,6 +68,7 @@ require (
|
||||||
go.uber.org/automaxprocs v1.5.2
|
go.uber.org/automaxprocs v1.5.2
|
||||||
go.uber.org/goleak v1.2.1
|
go.uber.org/goleak v1.2.1
|
||||||
go.uber.org/multierr v1.11.0
|
go.uber.org/multierr v1.11.0
|
||||||
|
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b
|
||||||
golang.org/x/net v0.15.0
|
golang.org/x/net v0.15.0
|
||||||
golang.org/x/oauth2 v0.10.0
|
golang.org/x/oauth2 v0.10.0
|
||||||
golang.org/x/sync v0.3.0
|
golang.org/x/sync v0.3.0
|
||||||
|
@ -87,36 +89,18 @@ require (
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
cloud.google.com/go/compute v1.22.0 // indirect
|
||||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 // indirect
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
|
||||||
github.com/google/gnostic-models v0.6.8 // indirect
|
|
||||||
github.com/google/s2a-go v0.1.4 // indirect
|
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
|
||||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
|
|
||||||
github.com/stretchr/objx v0.5.0 // indirect
|
|
||||||
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
|
||||||
google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 // indirect
|
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 // indirect
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
|
||||||
cloud.google.com/go/compute v1.22.0 // indirect
|
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect
|
|
||||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
|
||||||
github.com/Microsoft/go-winio v0.6.1 // indirect
|
github.com/Microsoft/go-winio v0.6.1 // indirect
|
||||||
github.com/armon/go-metrics v0.4.1 // indirect
|
github.com/armon/go-metrics v0.4.1 // indirect
|
||||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
||||||
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect
|
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/docker/distribution v2.8.2+incompatible // indirect
|
github.com/docker/distribution v2.8.2+incompatible // indirect
|
||||||
github.com/docker/go-connections v0.4.0 // indirect
|
github.com/docker/go-connections v0.4.0 // indirect
|
||||||
|
@ -142,18 +126,21 @@ require (
|
||||||
github.com/golang/glog v1.1.0 // indirect
|
github.com/golang/glog v1.1.0 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
|
github.com/google/gnostic-models v0.6.8 // indirect
|
||||||
github.com/google/go-cmp v0.5.9 // indirect
|
github.com/google/go-cmp v0.5.9 // indirect
|
||||||
github.com/google/go-querystring v1.1.0 // indirect
|
github.com/google/go-querystring v1.1.0 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/s2a-go v0.1.4 // indirect
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect
|
github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect
|
||||||
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
|
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.0 // indirect
|
github.com/gorilla/websocket v1.5.0 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
||||||
github.com/hashicorp/cronexpr v1.1.2 // indirect
|
github.com/hashicorp/cronexpr v1.1.2 // indirect
|
||||||
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
github.com/hashicorp/go-hclog v1.5.0 // indirect
|
github.com/hashicorp/go-hclog v1.5.0 // indirect
|
||||||
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
||||||
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.4 // indirect
|
github.com/hashicorp/go-retryablehttp v0.7.4 // indirect
|
||||||
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
|
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
|
||||||
github.com/hashicorp/golang-lru v0.6.0 // indirect
|
github.com/hashicorp/golang-lru v0.6.0 // indirect
|
||||||
|
@ -163,6 +150,7 @@ require (
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/jpillora/backoff v1.0.0 // indirect
|
github.com/jpillora/backoff v1.0.0 // indirect
|
||||||
github.com/julienschmidt/httprouter v1.3.0 // indirect
|
github.com/julienschmidt/httprouter v1.3.0 // indirect
|
||||||
|
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||||
|
@ -173,23 +161,26 @@ require (
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/morikuni/aec v1.0.0 // indirect
|
github.com/morikuni/aec v1.0.0 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
|
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
github.com/opencontainers/image-spec v1.0.2 // indirect
|
github.com/opencontainers/image-spec v1.0.2 // indirect
|
||||||
|
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/prometheus/procfs v0.11.0 // indirect
|
github.com/prometheus/procfs v0.11.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
|
github.com/stretchr/objx v0.5.0 // indirect
|
||||||
|
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
||||||
go.mongodb.org/mongo-driver v1.12.0 // indirect
|
go.mongodb.org/mongo-driver v1.12.0 // indirect
|
||||||
go.opencensus.io v0.24.0 // indirect
|
go.opencensus.io v0.24.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.16.0 // indirect
|
go.opentelemetry.io/otel/metric v1.16.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
||||||
golang.org/x/crypto v0.13.0 // indirect
|
golang.org/x/crypto v0.13.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b
|
|
||||||
golang.org/x/mod v0.12.0 // indirect
|
golang.org/x/mod v0.12.0 // indirect
|
||||||
golang.org/x/term v0.12.0 // indirect
|
golang.org/x/term v0.12.0 // indirect
|
||||||
golang.org/x/text v0.13.0 // indirect
|
golang.org/x/text v0.13.0 // indirect
|
||||||
google.golang.org/appengine v1.6.7 // indirect
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gotest.tools/v3 v3.0.3 // indirect
|
gotest.tools/v3 v3.0.3 // indirect
|
||||||
|
|
37
go.sum
37
go.sum
|
@ -34,36 +34,22 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
|
||||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw=
|
|
||||||
github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg=
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0/go.mod h1:243D9iHbcQXoFUtgHJwL7gl2zx1aDuDMjvBZVGr2uW0=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
|
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
|
||||||
github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw=
|
|
||||||
github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c=
|
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
|
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
|
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
|
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
|
|
||||||
github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk=
|
|
||||||
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
|
|
||||||
github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac=
|
|
||||||
github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E=
|
|
||||||
github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
|
|
||||||
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
|
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY=
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY=
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
@ -295,7 +281,6 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
|
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
@ -742,7 +727,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
||||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
|
@ -838,9 +822,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
|
||||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
|
||||||
golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
|
golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
|
||||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
@ -922,7 +904,6 @@ golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
|
||||||
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
|
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
|
||||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
@ -1013,14 +994,12 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
|
||||||
golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU=
|
golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU=
|
||||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
|
Loading…
Reference in a new issue