From fe07afe8704451945df6f62e0332e0a1b9ab044c Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Fri, 9 Dec 2022 13:53:11 -0600 Subject: [PATCH 01/10] moving more to vcpu --- lw-inventory/cmd/lwaws/aws.go | 915 ++++++++---------------------- lw-inventory/cmd/lwazure/azure.go | 350 ++++-------- lw-inventory/cmd/lwgcp/gcp.go | 342 +++++------ lw-inventory/go.mod | 17 - 4 files changed, 492 insertions(+), 1132 deletions(-) diff --git a/lw-inventory/cmd/lwaws/aws.go b/lw-inventory/cmd/lwaws/aws.go index 246caaf..d603c49 100644 --- a/lw-inventory/cmd/lwaws/aws.go +++ b/lw-inventory/cmd/lwaws/aws.go @@ -8,58 +8,27 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/service/autoscaling" "github.com/aws/aws-sdk-go-v2/service/ec2" - "github.com/aws/aws-sdk-go-v2/service/ecs" - "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing" - "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" - ec2Types "github.com/aws/aws-sdk-go-v2/service/ec2/types" - ecsTypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" - "github.com/aws/aws-sdk-go-v2/service/eks" - "github.com/aws/aws-sdk-go-v2/service/rds" - "github.com/aws/aws-sdk-go-v2/service/redshift" "github.com/lacework-dev/scripts/lw-inventory/helpers" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) -const ( - EC2 = "EC2 VM" - RDS = "RDS Instance" - REDSHIFT = "Redshift" - NATGATEWAY = "NAT Gateway" - ELBv1 = "ELBv1" - ELBv2 = "ELBv2" - ECS = "ECS EC2 VM" - ECS_TASKS = "ECS Task" - FARGATE_RUNNING_TASKS = "Fargate Running Task" - FARGATE_RUNNING_CONTAINERS = "Fargate Running Containers" - FARGATE_TOTAL_CONTAINERS = "Fargate Total Containers" - FARGATE_ACTIVE_SERVICES = "Fargate Active Services" - EKS_FARGATE_ACTIVE_PROFILES = "EKS Fargate Active Profiles" - ENTERPRISE_AGENT = "Enterprise Agent" - STANDARD_AGENT = "Standard Agent" -) - -type AgentlessServiceCount struct { - Region string - Service string - Count int -} - -type AgentContainerCount struct { - Region string - ContainerType string - Count int +type InstanceType struct { + Name string + vCPU int32 + Region string } -type AgentVMInfo struct { - Region string - AMI string - AccountId string - AgentType string - OS string +type EC2VMInfo struct { + Region string + AMI string + AccountId string + AgentType string + OS string + vCPU int32 + InstanceType string } type OSCounts struct { @@ -75,11 +44,9 @@ func Run(profiles []string, regions []string, debug bool) { fmt.Println("Beginning Scan") fmt.Printf("Profiles to use: %s\n", profiles) - //loop over all profiles and get counts - var agentlessCounts []AgentlessServiceCount - var ec2VMInfo []AgentVMInfo - var enterpriseAgentVMInfo []AgentVMInfo - var agentContainers []AgentContainerCount + var totalvCPU int32 + accountVCPUS := make(map[string]int32) + var totalVMOSCounts OSCounts for _, p := range profiles { fmt.Println("Using profile", p) @@ -91,91 +58,81 @@ func Run(profiles []string, regions []string, debug bool) { } fmt.Printf("Scanning regions: %s\n", regions) - agentlessCounts = getAgentlessCounts(p, regions) - ec2VMInfo = getAgentVMCounts(p, regions) - enterpriseAgentVMInfo = getEnterpriseAgentVMCounts(p, regions) - agentContainers = getAgentContainerCounts(p, regions) + instanceTypes := getInstanceTypes(p, regions) + ec2InstanceInfo := getEC2Instances(p, regions) - } + //allVMs = append(allVMs, ec2InstanceInfo...) - //run through each region - agentlessResourceCount := 0 - agentContainerCount := make(map[string]int) - standardAgents := []string{} - enterpriseAgents := []string{} - agentlessServices := []string{EC2, RDS, REDSHIFT, ELBv1, ELBv2, NATGATEWAY, ECS} - agentServices := []string{ECS_TASKS, FARGATE_RUNNING_TASKS, FARGATE_RUNNING_CONTAINERS, FARGATE_TOTAL_CONTAINERS, FARGATE_ACTIVE_SERVICES, EKS_FARGATE_ACTIVE_PROFILES} - var enterpriseAgentOSCounts OSCounts - var standardAgentOSCounts OSCounts - for _, r := range regions { - agentlessCountByRegion := 0 + var vmOSCounts OSCounts + var accountIds []string + var accountData = make(map[string][]EC2VMInfo) + for _, vm := range ec2InstanceInfo { + for _, it := range instanceTypes { + if it.Region == vm.Region && it.Name == vm.InstanceType { + vm.vCPU = it.vCPU + accountData[vm.AccountId] = append(accountData[vm.AccountId], vm) - log.Debugln("Region ", r) - for _, s := range agentlessServices { - agentlessCountByRegion += getAgentlessCountByService(agentlessCounts, r, s) + } + } + if vm.OS == "Linux/UNIX" { + vmOSCounts.Linux++ + } else { + vmOSCounts.Windows++ + } + + if !helpers.Contains(accountIds, vm.AccountId) { + accountIds = append(accountIds, vm.AccountId) + } } - agentlessResourceCount += agentlessCountByRegion + totalVMOSCounts.Linux += vmOSCounts.Linux + totalVMOSCounts.Windows += vmOSCounts.Windows - for _, s := range agentServices { - agentContainerCount[s] += getAgentCountByService(agentContainers, r, s) + for account, vms := range accountData { + for _, vm := range vms { + accountVCPUS[account] += vm.vCPU + totalvCPU += vm.vCPU + } } - } - //get a list of AMIs to compare against - var amis []string - for _, vm := range ec2VMInfo { - amis = append(amis, vm.AMI) - } + fmt.Println("----------------------------------------------") + fmt.Printf("Total AWS vCPUs %d\n", totalvCPU) - for _, vm := range enterpriseAgentVMInfo { - if vm.AgentType == ENTERPRISE_AGENT { - enterpriseAgents = append(enterpriseAgents, vm.AMI) + fmt.Println("\nAccount Breakdown") + for account, vcpus := range accountVCPUS { + fmt.Printf("Account: %s - %d\n", account, vcpus) } - //sometimes instances for EKS/ECS don't show up in EC2 list...might be offline or managed instances in ECS - if !helpers.Contains(amis, vm.AMI) { - log.Printf("Instance not in EC2 instance list %s %s", vm.AMI, vm.Region) - } - } + fmt.Println("\nVM OS Counts") + fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) + fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) - var accountIds []string - for _, vm := range ec2VMInfo { - if !helpers.Contains(accountIds, vm.AccountId) { - accountIds = append(accountIds, vm.AccountId) - } - } - for _, vm := range ec2VMInfo { - if !helpers.Contains(enterpriseAgents, vm.AMI) { - standardAgents = append(standardAgents, vm.AMI) - if vm.OS == "Linux/UNIX" { - standardAgentOSCounts.Linux++ - } else { - standardAgentOSCounts.Windows++ - } - } else { - if vm.OS == "Linux/UNIX" { - enterpriseAgentOSCounts.Linux++ - } else { - enterpriseAgentOSCounts.Windows++ - } - } + fmt.Println("\nNumber of AWS Accounts inventoried:", len(accountIds)) + fmt.Println("----------------------------------------------") } + + //var totalvCPU int32 + //accountVCPUS := make(map[string]int32) + //for account, vms := range accountData { + // for _, vm := range vms { + // accountVCPUS[account] += vm.vCPU + // totalvCPU += vm.vCPU + // } + //} + fmt.Println("----------------------------------------------") - fmt.Printf("Total Resources %d\n", agentlessResourceCount) - fmt.Printf("Standard VM Agents: %d\n", len(standardAgents)) - fmt.Printf("Enterprise VM Agents: %d\n", len(enterpriseAgents)) - for s, c := range agentContainerCount { - fmt.Printf("%s: %d\n", s, c) + fmt.Printf("Total AWS vCPUs %d\n", totalvCPU) + + fmt.Println("\nAccount Breakdown") + for account, vcpus := range accountVCPUS { + fmt.Printf("Account: %s - %d\n", account, vcpus) } fmt.Println("\nVM OS Counts") - fmt.Printf("Standard Linux VMs %d\n", standardAgentOSCounts.Linux) - fmt.Printf("Standard Windows VMs %d\n", standardAgentOSCounts.Windows) - fmt.Printf("Enterprise Linux VMs %d\n", enterpriseAgentOSCounts.Linux) - fmt.Printf("Enterprise Windows VMs %d\n", enterpriseAgentOSCounts.Windows) + fmt.Printf("Linux VMs %d\n", totalVMOSCounts.Linux) + fmt.Printf("Windows VMs %d\n", totalVMOSCounts.Windows) - fmt.Println("\nNumber of AWS Accounts inventoried", len(accountIds)) + fmt.Println("\nNumber of AWS Accounts inventoried:", len(accountVCPUS)) fmt.Println("----------------------------------------------") } @@ -183,6 +140,7 @@ func getSession(profile string, region string) *aws.Config { cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region), config.WithSharedConfigProfile(profile), + config.WithDefaultsMode(aws.DefaultsModeInRegion), ) if err != nil { log.Errorln("Error connecting to AWS", err) @@ -216,398 +174,72 @@ func getRegions(cfg aws.Config) []string { return regions } -func getAgentlessCountByService(counts []AgentlessServiceCount, region string, service string) int { - for _, i := range counts { - if i.Service == service && i.Region == region { - log.Debugf("%s: %d\n", service, i.Count) - return i.Count - } - } - return 0 -} +func getInstanceTypesByRegion(cfg aws.Config, region string) []InstanceType { + var instanceTypes []InstanceType + log.Println("aws cfg", cfg) -func getAgentCountByService(counts []AgentContainerCount, region string, containerType string) int { - for _, i := range counts { - if i.ContainerType == containerType && i.Region == region { - // log.Debugf("%s: %d\n", containerType, i.Count) - return i.Count - } - } - return 0 -} - -func getAgentlessCounts(profile string, regions []string) []AgentlessServiceCount { - log.Debugf("start getAgentlessCounts\n") - start := time.Now() - - numFuncs := 0 - channel := make(chan AgentlessServiceCount) - var serviceCountList []AgentlessServiceCount - for _, r := range regions { - cfg := getSession(profile, r) - //ec2 instances - numFuncs += 1 - go func(r string) { - channel <- getEC2InstanceCountByRegion(*cfg, r) - }(r) - - //rds instances - numFuncs += 1 - go func(r string) { - channel <- getRDSInstanceCountByRegion(*cfg, r) - }(r) - - //redshift instances - numFuncs += 1 - go func(r string) { - channel <- getRedshiftInstanceCountByRegion(*cfg, r) - }(r) - - //elbv1 instances - numFuncs += 1 - go func(r string) { - channel <- getELBv1InstanceCountByRegion(*cfg, r) - }(r) - - // //elbv2 instances - numFuncs += 1 - go func(r string) { - channel <- getELBv2InstanceCountByRegion(*cfg, r) - }(r) - - //NAT gateways - numFuncs += 1 - go func(r string) { - channel <- getNatGatewayInstanceCountByRegion(*cfg, r) - }(r) - } - - for i := 0; i < numFuncs; i++ { - count := <-channel - serviceCountList = append(serviceCountList, count) - } - - elapsed := time.Since(start) - log.Debugf("end getAgentlessCounts - %s\n", elapsed) - return serviceCountList -} - -func getAgentContainerCounts(profile string, regions []string) []AgentContainerCount { - log.Debugf("start getAgentContainerCounts\n") - start := time.Now() - - numFuncs := 0 - channel := make(chan AgentContainerCount) - var agentContainerList []AgentContainerCount - - for _, r := range regions { - cfg := getSession(profile, r) - //ECS Tasks - numFuncs += 1 - go func(r string) { - channel <- getECSTaskDefinitionsByRegion(*cfg, r) - }(r) - - //Running Fargate Tasks - numFuncs += 1 - go func(r string) { - channel <- getFargateRunningTasksByRegion(*cfg, r) - }(r) - - //Running Fargate Containers - numFuncs += 1 - go func(r string) { - channel <- getFargateRunningContainersByRegion(*cfg, r) - }(r) - - //Total Fargate Containers - numFuncs += 1 - go func(r string) { - channel <- getFargateTotalContainersByRegion(*cfg, r) - }(r) - - numFuncs += 1 - go func(r string) { - channel <- getEKSFargateActiveProfilesByRegion(*cfg, r) - }(r) - - numFuncs += 1 - go func(r string) { - channel <- getFargateActiveServicesByRegion(*cfg, r) - }(r) - } - - for i := 0; i < numFuncs; i++ { - containers := <-channel - agentContainerList = append(agentContainerList, containers) - } - - elapsed := time.Since(start) - log.Debugf("end getAgentContainerCounts - %s\n", elapsed) - - return agentContainerList -} - -func getEKSFargateActiveProfilesByRegion(cfg aws.Config, region string) AgentContainerCount { - service := eks.NewFromConfig(cfg) - output := eks.NewListClustersPaginator(service, &eks.ListClustersInput{}) - - count := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getEKSFargateActiveProfilesByRegion ListFargateProfiles ", region, output, err) - } else { - for _, c := range page.Clusters { - output := eks.NewListFargateProfilesPaginator(service, &eks.ListFargateProfilesInput{ClusterName: &c}) - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getEKSFargateActiveProfilesByRegion ListFargateProfiles ", region, c, err) - } else { - count += len(page.FargateProfileNames) - } - } - } - } - } - - return AgentContainerCount{ - Region: region, - ContainerType: EKS_FARGATE_ACTIVE_PROFILES, - Count: count, - } -} - -func getECSTaskDefinitionsByRegion(cfg aws.Config, region string) AgentContainerCount { - service := ecs.NewFromConfig(cfg) - output := ecs.NewListTaskDefinitionsPaginator(service, &ecs.ListTaskDefinitionsInput{}) - - count := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getECSTaskDefinitionsByRegion ListTaskDefinitions ", region, err) - } else { - count += len(page.TaskDefinitionArns) - } - } - - return AgentContainerCount{ - Region: region, - ContainerType: ECS_TASKS, - Count: count, - } -} - -func getFargateRunningTasksByRegion(cfg aws.Config, region string) AgentContainerCount { - service := ecs.NewFromConfig(cfg) - output := ecs.NewListClustersPaginator(service, &ecs.ListClustersInput{}) - - taskCount := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getFargateRunningTasksByRegion ListClusters ", region, err) - } else { - for _, cluster := range page.ClusterArns { - output := ecs.NewListTasksPaginator(service, &ecs.ListTasksInput{ - Cluster: &cluster, - }) - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getFargateRunningTasksByRegion ListTasks ", region, err) - } else { - taskCount += len(page.TaskArns) - } - } - } - } - } - - return AgentContainerCount{ - Region: region, - ContainerType: FARGATE_RUNNING_TASKS, - Count: taskCount, - } -} - -func getFargateActiveServicesByRegion(cfg aws.Config, region string) AgentContainerCount { - service := ecs.NewFromConfig(cfg) - output := ecs.NewListClustersPaginator(service, &ecs.ListClustersInput{}) - - count := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getFargateActiveServicesByRegion ListClusters ", region, err) - } else { - output, err := service.DescribeClusters(context.TODO(), &ecs.DescribeClustersInput{ - Clusters: page.ClusterArns, - }) - - if err != nil { - log.Errorln("getFargateActiveServicesByRegion DescribeClusters ", region, err) - } else { - for _, c := range output.Clusters { - count += int(c.ActiveServicesCount) - } - } - } - } - - return AgentContainerCount{ - Region: region, - ContainerType: FARGATE_ACTIVE_SERVICES, - Count: count, - } -} - -func getFargateRunningContainersByRegion(cfg aws.Config, region string) AgentContainerCount { - service := ecs.NewFromConfig(cfg) - output := ecs.NewListClustersPaginator(service, &ecs.ListClustersInput{}) - - taskCount := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getFargateRunningContainersByRegion ListClusters ", region, err) - } else { - for _, cluster := range page.ClusterArns { - output := ecs.NewListTasksPaginator(service, &ecs.ListTasksInput{ - Cluster: &cluster, - }) - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getFargateRunningContainersByRegion ListTasks ", region, err) - } else { - if len(page.TaskArns) > 0 { - outputDT, err := service.DescribeTasks(context.TODO(), &ecs.DescribeTasksInput{ - Cluster: &cluster, - Tasks: page.TaskArns, - }) - if err != nil { - log.Errorln("getFargateRunningContainersByRegion DescribeTasks ", region, err) - } else { - for _, t := range outputDT.Tasks { - if t.LaunchType == ecsTypes.LaunchTypeFargate && ecsTypes.DesiredStatus(*t.LastStatus) == ecsTypes.DesiredStatusRunning { - for _, c := range t.Containers { - if ecsTypes.DesiredStatus(*c.LastStatus) == ecsTypes.DesiredStatusRunning { - taskCount += 1 - } - } - } - } - } - } - } - } - } - } - } - - return AgentContainerCount{ - Region: region, - ContainerType: FARGATE_RUNNING_CONTAINERS, - Count: taskCount, - } -} - -func getFargateTotalContainersByRegion(cfg aws.Config, region string) AgentContainerCount { - service := ecs.NewFromConfig(cfg) - output := ecs.NewListClustersPaginator(service, &ecs.ListClustersInput{}) + service := ec2.NewFromConfig(cfg) + output := ec2.NewDescribeInstanceTypesPaginator(service, &ec2.DescribeInstanceTypesInput{}) - taskCount := 0 for output.HasMorePages() { page, err := output.NextPage(context.TODO()) if err != nil { - log.Errorln("getFargateTotalContainersByRegion ListClusters ", region, err) + log.Errorln("getInstanceTypes NewDescribeInstanceTypesPaginator ", region, err) } else { - for _, cluster := range page.ClusterArns { - output := ecs.NewListTasksPaginator(service, &ecs.ListTasksInput{ - Cluster: &cluster, + for _, it := range page.InstanceTypes { + //fmt.Println(it.InstanceType, it.VCpuInfo.DefaultVCpus, region) + instanceTypes = append(instanceTypes, InstanceType{ + Name: fmt.Sprintf("%s", it.InstanceType), + vCPU: *it.VCpuInfo.DefaultVCpus, + Region: region, }) - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getFargateTotalContainersByRegion ListTasks ", region, err) - } else { - if len(page.TaskArns) > 0 { - outputDT, err := service.DescribeTasks(context.TODO(), &ecs.DescribeTasksInput{ - Cluster: &cluster, - Tasks: page.TaskArns, - }) - if err != nil { - log.Errorln("getFargateTotalContainersByRegion DescribeTasks ", region, err) - } else { - for _, t := range outputDT.Tasks { - if t.LaunchType == ecsTypes.LaunchTypeFargate && ecsTypes.DesiredStatus(*t.LastStatus) == ecsTypes.DesiredStatusRunning { - taskCount += len(t.Containers) - } - } - } - } - } - } } } } - return AgentContainerCount{ - Region: region, - ContainerType: FARGATE_TOTAL_CONTAINERS, - Count: taskCount, - } + return instanceTypes } -func getAgentVMCounts(profile string, regions []string) []AgentVMInfo { - log.Debugf("start getAgentVMCounts\n") +func getInstanceTypes(profile string, regions []string) []InstanceType { + log.Debugf("start getInstanceTypes\n") start := time.Now() numFuncs := 0 - channel := make(chan []AgentVMInfo) - var serviceCountList []AgentVMInfo + channel := make(chan []InstanceType) + var instanceTypes []InstanceType for _, r := range regions { cfg := getSession(profile, r) - //EC2s + //Instance Types numFuncs += 1 go func(r string) { - channel <- getEC2InstancesByRegion(*cfg, r) + channel <- getInstanceTypesByRegion(*cfg, r) }(r) } for i := 0; i < numFuncs; i++ { - vms := <-channel - serviceCountList = append(serviceCountList, vms...) + instanceTypesPerRegion := <-channel + instanceTypes = append(instanceTypes, instanceTypesPerRegion...) } elapsed := time.Since(start) - log.Debugf("end getAgentVMCounts - %s\n", elapsed) + log.Debugf("end getInstanceTypes - %s\n", elapsed) - return serviceCountList + return instanceTypes } -func getEnterpriseAgentVMCounts(profile string, regions []string) []AgentVMInfo { - log.Debugf("start getEnterpriseAgentVMCounts\n") +func getEC2Instances(profile string, regions []string) []EC2VMInfo { + log.Debugf("start getEC2Instances\n") start := time.Now() numFuncs := 0 - channel := make(chan []AgentVMInfo) - var serviceCountList []AgentVMInfo + channel := make(chan []EC2VMInfo) + var serviceCountList []EC2VMInfo for _, r := range regions { cfg := getSession(profile, r) - //ECS EC2s - numFuncs += 1 - go func(r string) { - channel <- getECSVMCountByRegion(*cfg, r) - }(r) - - //EKS EC2s + //EC2s numFuncs += 1 go func(r string) { - channel <- getEKSVMCountByRegion(*cfg, r) + channel <- getEC2InstancesByRegion(*cfg, r) }(r) } @@ -617,117 +249,143 @@ func getEnterpriseAgentVMCounts(profile string, regions []string) []AgentVMInfo } elapsed := time.Since(start) - log.Debugf("end getEnterpriseAgentVMCounts - %s\n", elapsed) + log.Debugf("end getEC2Instances - %s\n", elapsed) return serviceCountList } -func getEKSVMCountByRegion(cfg aws.Config, region string) []AgentVMInfo { - service := eks.NewFromConfig(cfg) - autoscalingService := autoscaling.NewFromConfig(cfg) - - var instances []AgentVMInfo - output, err := service.ListClusters(context.TODO(), &eks.ListClustersInput{}) - - if err != nil { - log.Errorln("getEKSVMCountByRegion ListClusters ", region, err) - } else { - for _, cluster := range output.Clusters { - output, err := service.ListNodegroups(context.TODO(), &eks.ListNodegroupsInput{ - ClusterName: &cluster, - }) - if err != nil { - log.Errorln("getEKSVMCountByRegion ListNodegroups ", region, err) - } else { - for _, nodegroup := range output.Nodegroups { - output, err := service.DescribeNodegroup(context.TODO(), &eks.DescribeNodegroupInput{ - ClusterName: &cluster, - NodegroupName: &nodegroup, - }) - if err != nil { - log.Errorln("getEKSVMCountByRegion DescribeNodegroup ", region, err) - } else { - var asgNames []string - for _, autoscalingGroup := range output.Nodegroup.Resources.AutoScalingGroups { - asgNames = append(asgNames, *autoscalingGroup.Name) - } - - outputDASG, err := autoscalingService.DescribeAutoScalingGroups(context.TODO(), &autoscaling.DescribeAutoScalingGroupsInput{ - AutoScalingGroupNames: asgNames, - }) - - if err != nil { - log.Errorln("getEKSVMCountByRegion DescribeAutoScalingGroups ", region, err) - } else { - for _, asg := range outputDASG.AutoScalingGroups { - for _, i := range asg.Instances { - instances = append(instances, AgentVMInfo{Region: region, AMI: *i.InstanceId, AgentType: ENTERPRISE_AGENT}) - } - } - } - } - } - } - } - } - - return instances -} - -func getECSVMCountByRegion(cfg aws.Config, region string) []AgentVMInfo { - service := ecs.NewFromConfig(cfg) - var instances []AgentVMInfo - output, err := service.ListClusters(context.TODO(), &ecs.ListClustersInput{}) - - if err != nil { - log.Errorln("getECSVMCountByRegion ListClusters ", region, err) - } else { - for _, cluster := range output.ClusterArns { - output, err := service.ListContainerInstances(context.TODO(), &ecs.ListContainerInstancesInput{ - Cluster: &cluster, - }) - - if err != nil { - log.Errorln("getECSVMCountByRegion ListContainerInstances ", region, err) - } else { - for _, cia := range output.ContainerInstanceArns { - output, err := service.DescribeContainerInstances(context.TODO(), &ecs.DescribeContainerInstancesInput{ - Cluster: &cluster, - ContainerInstances: []string{cia}, - }) - - if err != nil { - log.Errorln("getECSVMCountByRegion DescribeContainerInstances ", region, err) - } else { - for _, i := range output.ContainerInstances { - instances = append(instances, AgentVMInfo{Region: region, AMI: *i.Ec2InstanceId, AgentType: ENTERPRISE_AGENT}) - } - } - } - } - } - } - - return instances -} - -func getEC2InstanceCountByRegion(cfg aws.Config, region string) AgentlessServiceCount { - ec2Instances := getEC2InstancesByRegion(cfg, region) - - return AgentlessServiceCount{ - Region: region, - Service: EC2, - Count: len(ec2Instances), - } -} - -func getEC2InstancesByRegion(cfg aws.Config, region string) []AgentVMInfo { +//func getContainerEC2Instances(profile string, regions []string) []EC2VMInfo { +// log.Debugf("start getContainerEC2Instances\n") +// start := time.Now() +// +// numFuncs := 0 +// channel := make(chan []EC2VMInfo) +// var serviceCountList []EC2VMInfo +// for _, r := range regions { +// cfg := getSession(profile, r) +// //ECS EC2s +// numFuncs += 1 +// go func(r string) { +// channel <- getECSVMCountByRegion(cfg, r) +// }(r) +// +// //EKS EC2s +// numFuncs += 1 +// go func(r string) { +// channel <- getEKSVMCountByRegion(cfg, r) +// }(r) +// } +// +// for i := 0; i < numFuncs; i++ { +// vms := <-channel +// serviceCountList = append(serviceCountList, vms...) +// } +// +// elapsed := time.Since(start) +// log.Debugf("end getContainerEC2Instances - %s\n", elapsed) +// +// return serviceCountList +//} + +//func getEKSVMCountByRegion(cfg aws.Config, region string) []EC2VMInfo { +// service := eks.NewFromConfig(cfg) +// autoscalingService := autoscaling.NewFromConfig(cfg) +// +// var instances []EC2VMInfo +// output, err := service.ListClusters(context.TODO(), &eks.ListClustersInput{}) +// +// if err != nil { +// log.Errorln("getEKSVMCountByRegion ListClusters ", region, err) +// } else { +// for _, cluster := range output.Clusters { +// output, err := service.ListNodegroups(context.TODO(), &eks.ListNodegroupsInput{ +// ClusterName: &cluster, +// }) +// if err != nil { +// log.Errorln("getEKSVMCountByRegion ListNodegroups ", region, err) +// } else { +// for _, nodegroup := range output.Nodegroups { +// output, err := service.DescribeNodegroup(context.TODO(), &eks.DescribeNodegroupInput{ +// ClusterName: &cluster, +// NodegroupName: &nodegroup, +// }) +// if err != nil { +// log.Errorln("getEKSVMCountByRegion DescribeNodegroup ", region, err) +// } else { +// var asgNames []string +// for _, autoscalingGroup := range output.Nodegroup.Resources.AutoScalingGroups { +// asgNames = append(asgNames, *autoscalingGroup.Name) +// } +// +// outputDASG, err := autoscalingService.DescribeAutoScalingGroups(context.TODO(), &autoscaling.DescribeAutoScalingGroupsInput{ +// AutoScalingGroupNames: asgNames, +// }) +// +// if err != nil { +// log.Errorln("getEKSVMCountByRegion DescribeAutoScalingGroups ", region, err) +// } else { +// for _, asg := range outputDASG.AutoScalingGroups { +// for _, i := range asg.Instances { +// role := fmt.Sprintf("%s", *output.Nodegroup.NodeRole) +// instances = append(instances, EC2VMInfo{Region: region, AMI: *i.InstanceId, InstanceType: *i.InstanceType, AccountId: role[13:25]}) +// } +// } +// } +// } +// } +// } +// } +// } +// +// return instances +//} + +//func getECSVMCountByRegion(cfg aws.Config, region string) []EC2VMInfo { +// service := ecs.NewFromConfig(cfg) +// var instances []EC2VMInfo +// output, err := service.ListClusters(context.TODO(), &ecs.ListClustersInput{}) +// +// if err != nil { +// log.Errorln("getECSVMCountByRegion ListClusters ", region, err) +// } else { +// for _, cluster := range output.ClusterArns { +// output, err := service.ListContainerInstances(context.TODO(), &ecs.ListContainerInstancesInput{ +// Cluster: &cluster, +// }) +// +// if err != nil { +// log.Errorln("getECSVMCountByRegion ListContainerInstances ", region, err) +// } else { +// for _, cia := range output.ContainerInstanceArns { +// output, err := service.DescribeContainerInstances(context.TODO(), &ecs.DescribeContainerInstancesInput{ +// Cluster: &cluster, +// ContainerInstances: []string{cia}, +// }) +// +// if err != nil { +// log.Errorln("getECSVMCountByRegion DescribeContainerInstances ", region, err) +// } else { +// for _, i := range output.ContainerInstances { +// parts := strings.Split(*i.ContainerInstanceArn, ":") +// accountId := parts[4] +// instances = append(instances, EC2VMInfo{Region: region, AMI: *i.Ec2InstanceId, AccountId: accountId}) +// } +// } +// } +// } +// } +// } +// +// return instances +//} + +func getEC2InstancesByRegion(cfg aws.Config, region string) []EC2VMInfo { service := ec2.NewFromConfig(cfg) output := ec2.NewDescribeInstancesPaginator(service, &ec2.DescribeInstancesInput{ Filters: []ec2Types.Filter{{Name: aws.String("instance-state-name"), Values: []string{"running", "pending"}}}, }) - instances := []AgentVMInfo{} + var instances []EC2VMInfo for output.HasMorePages() { page, err := output.NextPage(context.TODO()) @@ -736,9 +394,9 @@ func getEC2InstancesByRegion(cfg aws.Config, region string) []AgentVMInfo { } else { for _, res := range page.Reservations { for _, i := range res.Instances { - //log.Info("platform ", i.Platform) - //log.Info("platform details ", *i.PlatformDetails) - instances = append(instances, AgentVMInfo{Region: region, AMI: *i.InstanceId, AgentType: STANDARD_AGENT, OS: *i.PlatformDetails, AccountId: *res.OwnerId}) + if *res.OwnerId != "" { + instances = append(instances, EC2VMInfo{Region: region, AMI: *i.InstanceId, OS: *i.PlatformDetails, AccountId: *res.OwnerId, InstanceType: fmt.Sprintf("%s", i.InstanceType)}) + } } } } @@ -747,118 +405,13 @@ func getEC2InstancesByRegion(cfg aws.Config, region string) []AgentVMInfo { return instances } -func getRDSInstanceCountByRegion(cfg aws.Config, region string) AgentlessServiceCount { - service := rds.NewFromConfig(cfg) - output := rds.NewDescribeDBInstancesPaginator(service, &rds.DescribeDBInstancesInput{}) - - instanceCount := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getRDSInstanceCountByRegion DescribeDBInstances ", region, err) - } else { - instanceCount += len(page.DBInstances) - } - } - - return AgentlessServiceCount{ - Region: region, - Service: RDS, - Count: instanceCount, - } -} - -func getRedshiftInstanceCountByRegion(cfg aws.Config, region string) AgentlessServiceCount { - service := redshift.NewFromConfig(cfg) - output := redshift.NewDescribeClustersPaginator(service, &redshift.DescribeClustersInput{}) - - instanceCount := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getRedshiftInstanceCountByRegion DescribeClusters ", region, err) - } else { - instanceCount += len(page.Clusters) - } - } - - return AgentlessServiceCount{ - Region: region, - Service: REDSHIFT, - Count: instanceCount, - } -} - -func getELBv1InstanceCountByRegion(cfg aws.Config, region string) AgentlessServiceCount { - service := elasticloadbalancing.NewFromConfig(cfg) - output := elasticloadbalancing.NewDescribeLoadBalancersPaginator(service, &elasticloadbalancing.DescribeLoadBalancersInput{}) - - instanceCount := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getELBv1InstanceCountByRegion DescribeLoadBalancers ", region, err) - } else { - instanceCount += len(page.LoadBalancerDescriptions) - } - } - - return AgentlessServiceCount{ - Region: region, - Service: ELBv1, - Count: instanceCount, - } -} - -func getELBv2InstanceCountByRegion(cfg aws.Config, region string) AgentlessServiceCount { - service := elasticloadbalancingv2.NewFromConfig(cfg) - output := elasticloadbalancingv2.NewDescribeLoadBalancersPaginator(service, &elasticloadbalancingv2.DescribeLoadBalancersInput{}) - - instanceCount := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getELBv2InstanceCountByRegion DescribeLoadBalancers ", region, err) - } else { - instanceCount += len(page.LoadBalancers) - } - } - - return AgentlessServiceCount{ - Region: region, - Service: ELBv2, - Count: instanceCount, - } -} - -func getNatGatewayInstanceCountByRegion(cfg aws.Config, region string) AgentlessServiceCount { - service := ec2.NewFromConfig(cfg) - output := ec2.NewDescribeNatGatewaysPaginator(service, &ec2.DescribeNatGatewaysInput{}) - - instanceCount := 0 - for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) - if err != nil { - log.Errorln("getNatGatewayInstanceCountByRegion DescribeNatGateways ", region, err) - } else { - instanceCount += len(page.NatGateways) - } - } - - return AgentlessServiceCount{ - Region: region, - Service: NATGATEWAY, - Count: instanceCount, - } -} - func ParseProfiles(cmd *cobra.Command) []string { profilesFlag := helpers.GetFlagEnvironmentString(cmd, "profile", "profile", "Missing Profile(s) to use", false) var profiles []string if profilesFlag != "" { profilesTemp := strings.Split(profilesFlag, ",") for _, p := range profilesTemp { - trimmed := strings.TrimSpace((p)) + trimmed := strings.TrimSpace(p) profiles = append(profiles, trimmed) } } else { diff --git a/lw-inventory/cmd/lwazure/azure.go b/lw-inventory/cmd/lwazure/azure.go index 5b1f6df..8f4fd24 100644 --- a/lw-inventory/cmd/lwazure/azure.go +++ b/lw-inventory/cmd/lwazure/azure.go @@ -19,212 +19,171 @@ func Run(subscriptionsToIgnore []string, debug bool) { subscriptions := getSubscriptions() - totalAgentlessCount := 0 - totalStandardAgents := 0 - totalEnterpriseAgents := 0 - totalStandardAgentLinuxCount := 0 - totalStandardAgentWindowsCount := 0 - totalEnterpriseAgentLinuxCount := 0 - totalEnterpriseAgentWindowsCount := 0 - + var vmOSCounts OSCounts + var totalVCPUs int32 subscriptionsInventoried := 0 for _, subscription := range subscriptions { if !helpers.Contains(subscriptionsToIgnore, subscription) { + var subscriptionVMOSCounts OSCounts subscriptionsInventoried++ fmt.Println("Scanning Subscription", subscription) setSubscription(subscription) - rgs := getResourceGroups() - agentlessCount := getAgentlessCount(rgs) - standardAgents := getStandardAgents(rgs) + standardAgents := getStandardAgents() enterpriseAgents := getEntepriseAgents() - fmt.Println("\nResources", agentlessCount) - fmt.Println("Standard Agents", len(standardAgents)) - fmt.Println("Enterprise Agents", len(enterpriseAgents)) + var locations []string + for _, vm := range standardAgents { + if !helpers.Contains(locations, vm.Location) { + locations = append(locations, vm.Location) + } + } + + for _, vm := range enterpriseAgents { + if !helpers.Contains(locations, vm.Location) { + locations = append(locations, vm.Location) + } + } + + var vmSizes []MachineType + for _, location := range locations { + vmSizes = getVMSizesByLocation(location) + } - standardAgentWindowsCount := 0 - standardAgentLinuxCount := 0 + var standardAgentsWithvCPU []VMInfo for _, vm := range standardAgents { + for _, size := range vmSizes { + if vm.Location == size.Location && vm.VMSize == size.Name { + vm.vCPUs = size.vCPUs + totalVCPUs += size.vCPUs + standardAgentsWithvCPU = append(standardAgentsWithvCPU, vm) + } + } + } + + var enterpriseAgentsWithvCPU []VMInfo + for _, vm := range enterpriseAgents { + for _, size := range vmSizes { + if vm.Location == size.Location && vm.VMSize == size.Name { + vm.vCPUs = size.vCPUs + totalVCPUs += size.vCPUs + enterpriseAgentsWithvCPU = append(enterpriseAgentsWithvCPU, vm) + } + } + } + + fmt.Println("Standard Agents", len(standardAgentsWithvCPU)) + fmt.Println("Enterprise Agents", len(enterpriseAgentsWithvCPU)) + + for _, vm := range standardAgentsWithvCPU { if vm.OS == "Linux" { - standardAgentLinuxCount++ + subscriptionVMOSCounts.Linux++ } else { - standardAgentWindowsCount++ + subscriptionVMOSCounts.Windows++ } } - enterpriseAgentLinuxCount := 0 - enterpriseAgentWindowsCount := 0 - for _, vm := range enterpriseAgents { + for _, vm := range enterpriseAgentsWithvCPU { if vm.OS == "Linux" { - enterpriseAgentLinuxCount++ + subscriptionVMOSCounts.Linux++ } else { - enterpriseAgentWindowsCount++ + subscriptionVMOSCounts.Windows++ } } fmt.Println("\nVM OS Counts") - fmt.Printf("Standard Linux VMs %d\n", standardAgentLinuxCount) - fmt.Printf("Standard Windows VMs %d\n", standardAgentWindowsCount) - fmt.Printf("Enterprise Linux VMs %d\n", enterpriseAgentLinuxCount) - fmt.Printf("Enterprise Windows VMs %d\n\n", enterpriseAgentWindowsCount) - - totalAgentlessCount += agentlessCount - totalStandardAgents += len(standardAgents) - totalEnterpriseAgents += len(enterpriseAgents) - - totalStandardAgentLinuxCount += standardAgentLinuxCount - totalStandardAgentWindowsCount += standardAgentWindowsCount - totalEnterpriseAgentLinuxCount += enterpriseAgentLinuxCount - totalEnterpriseAgentWindowsCount += enterpriseAgentWindowsCount + fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) + fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) + + vmOSCounts.Linux += subscriptionVMOSCounts.Linux + vmOSCounts.Windows += subscriptionVMOSCounts.Windows + } } fmt.Println("----------------------------------------------") - fmt.Println("Total Resources", totalAgentlessCount) - fmt.Println("Standard Agents", totalStandardAgents) - fmt.Println("Enterprise Agents", totalEnterpriseAgents) - + fmt.Println("Total vCPUs", totalVCPUs) fmt.Println("\nTotal VM OS Counts") - fmt.Printf("Standard Linux VMs %d\n", totalStandardAgentLinuxCount) - fmt.Printf("Standard Windows VMs %d\n", totalStandardAgentWindowsCount) - fmt.Printf("Enterprise Linux VMs %d\n", totalEnterpriseAgentLinuxCount) - fmt.Printf("Enterprise Windows VMs %d\n", totalEnterpriseAgentWindowsCount) + fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) + fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) fmt.Println("\nNumber of Azure subscriptions inventoried", subscriptionsInventoried) fmt.Println("----------------------------------------------") } type VMInfo struct { - OS string - ID string -} - -func getStandardAgents(resourceGroups []string) []VMInfo { - fmt.Println("Gathering Standard Agent Count") - vmCount := getVMs() - return vmCount -} - -func getEntepriseAgents() []VMInfo { - fmt.Println("Gathering Enterprise Agent Count") - nodes := getAKSNodes() - return nodes + OS string + ID string + Location string + vCPUs int32 + VMSize string } -func getAgentlessCount(resourceGroups []string) int { - fmt.Println("Gathering resource count") - resourceCount := 0 - numFuncs := 0 - channel := make(chan int) - - numFuncs += 1 - go func() { - channel <- len(getVMs()) - }() - - numFuncs += 1 - go func() { - channel <- getVMScaleSet() - }() - - numFuncs += 1 - go func() { - channel <- getSQLServers() - }() - - numFuncs += 1 - go func() { - channel <- getLoadBalancers() - }() - - numFuncs += 1 - go func(rgs []string) { - channel <- getGatewayCount(rgs) - }(resourceGroups) - - for i := 0; i < numFuncs; i++ { - counts := <-channel - resourceCount += counts - } - - return resourceCount +type OSCounts struct { + Windows int + Linux int } -func getGatewayCount(resourceGroups []string) int { - gatewayCount := 0 - for _, rg := range resourceGroups { - gatewayCount += getGateways(rg) - } - return gatewayCount +type MachineType struct { + vCPUs int32 + Name string + Location string } -func ParseIgnoreSubscriptions(cmd *cobra.Command) []string { - subscriptionsFlag := helpers.GetFlagEnvironmentString(cmd, "ignore-subscriptions", "ignore-subscriptions", "", false) - var subscriptions []string - if subscriptionsFlag != "" { - subsTemp := strings.Split(subscriptionsFlag, ",") - for _, p := range subsTemp { - trimmed := strings.TrimSpace(p) - subscriptions = append(subscriptions, trimmed) - } - } - return subscriptions +type getVMSizesResponse struct { + Name string `json:"name"` + Cores int32 `json:"numberOfCores"` } -type getGatewayListResponse struct { - Name string `json:"name"` -} - -func getGateways(resourceGroup string) int { +func getVMSizesByLocation(location string) []MachineType { buf := bytes.NewBuffer([]byte{}) - cmd := exec.Command("az", "network", "vnet-gateway", "list", "-g", resourceGroup) + cmd := exec.Command("az", "vm", "list-sizes", "-l", location) cmd.Stdout = buf cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { - helpers.Bail("error running az network vnet-gateway list", err) + helpers.Bail("error running az vm list-sizes", err) } - response := []getGatewayListResponse{} + response := []getVMSizesResponse{} if err := json.NewDecoder(buf).Decode(&response); err != nil { - helpers.Bail("Error decoding vnet gateways json", err) + helpers.Bail("Error decoding vm size json", err) } - gateways := len(response) + var machineTypes []MachineType + for _, size := range response { + machineTypes = append(machineTypes, MachineType{ + vCPUs: size.Cores, + Name: size.Name, + Location: location, + }) + } - log.Debugln("gateways returned", resourceGroup, gateways) - return gateways + return machineTypes } -type getVMScaleSetResponse struct { - SKU struct { - Capacity int `json:"capacity"` - } `json:"sku"` +func getStandardAgents() []VMInfo { + fmt.Println("Gathering Standard Agent Count") + vmCount := getVMs() + return vmCount } -func getVMScaleSet() int { - buf := bytes.NewBuffer([]byte{}) - - //az group list | jq -r '.[] | .name' - cmd := exec.Command("az", "vmss", "list") - cmd.Stdout = buf - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - helpers.Bail("error running az vmss list", err) - } - - response := []getVMScaleSetResponse{} - if err := json.NewDecoder(buf).Decode(&response); err != nil { - helpers.Bail("Error decoding scalesets json", err) - } +func getEntepriseAgents() []VMInfo { + fmt.Println("Gathering Enterprise Agent Count") + nodes := getAKSNodes() + return nodes +} - var scalesets int - for _, ss := range response { - scalesets += ss.SKU.Capacity +func ParseIgnoreSubscriptions(cmd *cobra.Command) []string { + subscriptionsFlag := helpers.GetFlagEnvironmentString(cmd, "ignore-subscriptions", "ignore-subscriptions", "", false) + var subscriptions []string + if subscriptionsFlag != "" { + subsTemp := strings.Split(subscriptionsFlag, ",") + for _, p := range subsTemp { + trimmed := strings.TrimSpace(p) + subscriptions = append(subscriptions, trimmed) + } } - - log.Debugln("scalesets returned", scalesets) - return scalesets + return subscriptions } type getAKSNodesResponse struct { @@ -237,7 +196,9 @@ type getAKSNodesResponse struct { Max int `json:"maxCount"` Mode string `json:"mode"` OSType string `json:"osType"` + VMSize string `json:"vmSize"` } `json:"agentPoolProfiles"` + Location string `json:"location"` } func getAKSNodes() []VMInfo { @@ -260,8 +221,7 @@ func getAKSNodes() []VMInfo { for _, pool := range cluster.AgentPoolProfiles { //both user and system pools, daemonset is installed on all nodes if pool.PowerState.Code == "Running" { - nodes = append(nodes, VMInfo{OS: pool.OSType}) - //nodes += pool.Count + nodes = append(nodes, VMInfo{OS: pool.OSType, Location: cluster.Location, VMSize: pool.VMSize}) } } } @@ -270,86 +230,6 @@ func getAKSNodes() []VMInfo { return nodes } -type getSQLServerListResponse struct { - Name string `json:"name"` -} - -func getSQLServers() int { - buf := bytes.NewBuffer([]byte{}) - - cmd := exec.Command("az", "sql", "server", "list") - cmd.Stdout = buf - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - helpers.Bail("error running az sql server list", err) - } - - response := []getSQLServerListResponse{} - if err := json.NewDecoder(buf).Decode(&response); err != nil { - helpers.Bail("Error decoding sqlservers json", err) - } - - sqlservers := len(response) - - log.Debugln("sqlservers returned", sqlservers) - return sqlservers -} - -type getLoadBalancerListResponse struct { - Name string `json:"name"` -} - -func getLoadBalancers() int { - buf := bytes.NewBuffer([]byte{}) - - cmd := exec.Command("az", "network", "lb", "list") - cmd.Stdout = buf - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - helpers.Bail("error running az network lb list", err) - } - - response := []getLoadBalancerListResponse{} - if err := json.NewDecoder(buf).Decode(&response); err != nil { - helpers.Bail("Error decoding loadbalancers json", err) - } - - loadbalancers := len(response) - - log.Debugln("loadbalancers returned", loadbalancers) - return loadbalancers -} - -type getGroupListResponse struct { - Name string `json:"name"` -} - -func getResourceGroups() []string { - buf := bytes.NewBuffer([]byte{}) - - //az group list | jq -r '.[] | .name' - cmd := exec.Command("az", "group", "list") - cmd.Stdout = buf - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - helpers.Bail("error running az group list", err) - } - - response := []getGroupListResponse{} - if err := json.NewDecoder(buf).Decode(&response); err != nil { - helpers.Bail("Error decoding groups json", err) - } - - var groups []string - for _, group := range response { - log.Debugln("Resource group name", group.Name) - groups = append(groups, group.Name) - } - - log.Debugln("resource groups returned", groups) - return groups -} - func setSubscription(subscription string) bool { buf := bytes.NewBuffer([]byte{}) @@ -374,7 +254,11 @@ type getVMsListResponse struct { OSType string `json:"osType"` } `json:"osDisk"` } `json:"storageProfile"` - ID string `json:"vmId"` + HardwareProfile struct { + VMSize string `json:"vmSize"` + } `json:"hardwareProfile"` + ID string `json:"vmId"` + Location string `json:"location"` } func getVMs() []VMInfo { @@ -394,7 +278,7 @@ func getVMs() []VMInfo { var vms = []VMInfo{} for _, vm := range response { - vms = append(vms, VMInfo{OS: vm.StorageProfile.OSDisk.OSType, ID: vm.ID}) + vms = append(vms, VMInfo{OS: vm.StorageProfile.OSDisk.OSType, ID: vm.ID, Location: vm.Location, VMSize: vm.HardwareProfile.VMSize}) } log.Debugln("vms returned", vms) diff --git a/lw-inventory/cmd/lwgcp/gcp.go b/lw-inventory/cmd/lwgcp/gcp.go index 486049b..a652d81 100644 --- a/lw-inventory/cmd/lwgcp/gcp.go +++ b/lw-inventory/cmd/lwgcp/gcp.go @@ -11,33 +11,36 @@ import ( "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/serviceusage/v1" - "google.golang.org/api/sqladmin/v1" computepb "google.golang.org/genproto/googleapis/cloud/compute/v1" + "strconv" "strings" ) -const ( - GCE_VM = "GCE VM" - GKE_VM = "GKE VM" -) - type ProjectInfo struct { ID string Name string Number int64 } -type AgentlessServiceCount struct { - Region string - Service string - Count int +type VMInstanceInfo struct { + Zone string + Image string + OS string + InstanceType string + Project string + vCPU int32 + Name string } -type VMInstanceInfo struct { - Zone string - Image string - VMType string - OS string +type InstanceType struct { + Zone string + Name string +} + +type MachineType struct { + vCPUs int32 + Name string + Zone string } type OSCounts struct { @@ -51,165 +54,46 @@ func Run(projectsToIgnore []string, credentials string, debug bool) { } projects := getProjects(credentials, projectsToIgnore) - agentlessCount := getAgentlessCount(credentials, projects) - vms := getVMInstances(credentials, projects) - enterpriseVMs := getEntepriseAgents(vms) - standardVMs := getStandardAgents(vms) - - fmt.Println("----------------------------------------------") - fmt.Printf("Total Resources %d\n", agentlessCount+len(vms)) - fmt.Printf("Standard VM Agents: %d\n", len(standardVMs)) - fmt.Printf("Enterprise VM Agents: %d\n", len(enterpriseVMs)) - fmt.Println("Number of GCP projects inventoried", len(projects)) - fmt.Println("----------------------------------------------") -} - -func getAgentlessCount(credentials string, projects []ProjectInfo) int { - fmt.Println("Gathering resource count") - resourceCount := 0 - numFuncs := 0 - channel := make(chan int) - - numFuncs += 1 - go func(credentials string, projects []ProjectInfo) { - channel <- getLoadBalancers(credentials, projects) - }(credentials, projects) - - numFuncs += 1 - go func(credentials string, projects []ProjectInfo) { - channel <- getGateways(credentials, projects) - }(credentials, projects) - - numFuncs += 1 - go func(credentials string, projects []ProjectInfo) { - channel <- getSQLServerInstances(credentials, projects) - }(credentials, projects) - - for i := 0; i < numFuncs; i++ { - counts := <-channel - resourceCount += counts - } - - return resourceCount -} - -func getStandardAgents(vms []VMInstanceInfo) []VMInstanceInfo { - var standardVMs []VMInstanceInfo + machineTypes := getMachinesTypes(credentials, projects, vms) + var vmsWithvCPU []VMInstanceInfo for _, vm := range vms { - if vm.VMType == GCE_VM { - standardVMs = append(standardVMs, vm) + for _, mt := range machineTypes { + if vm.Zone == mt.Zone && vm.InstanceType == mt.Name { + vm.vCPU = mt.vCPUs + } } - } - return standardVMs -} - -func getEntepriseAgents(vms []VMInstanceInfo) []VMInstanceInfo { - var enterpriseVMs []VMInstanceInfo - - for _, vm := range vms { - if vm.VMType == GKE_VM { - enterpriseVMs = append(enterpriseVMs, vm) + if vm.vCPU == 0 { + vm.vCPU = parseCustomInstanceType(vm.InstanceType) } + vmsWithvCPU = append(vmsWithvCPU, vm) } - return enterpriseVMs -} - -func getLoadBalancers(credentials string, projects []ProjectInfo) int { - fmt.Println("Inventorying LoadBalancers") - ctx := context.Background() - - loadbalancerCount := 0 for _, project := range projects { - if isServiceEnabled(project.Number, "compute.googleapis.com", credentials) { - instancesClient, err := compute.NewForwardingRulesRESTClient(ctx) - - if err != nil { - fmt.Errorf("NewInstancesRESTClient: %v", err) - return 0 - } - defer instancesClient.Close() - - req := &computepb.AggregatedListForwardingRulesRequest{ - Project: project.ID, + fmt.Println("Project:", project.Name) + var vcpus int32 + for _, vm := range vmsWithvCPU { + if vm.Project == project.Name { + log.Debugln(vm.Name, vm.InstanceType, vm.vCPU) + vcpus += vm.vCPU } - - it := instancesClient.AggregatedList(ctx, req) - // Despite using the `MaxResults` parameter, you don't need to handle the pagination - // yourself. The returned iterator object handles pagination - // automatically, returning separated pages as you iterate over the results. - for { - pair, err := it.Next() - if err == iterator.Done { - break - } - if err != nil { - fmt.Errorf("getLoadBalancers pair iterator: %v", err) - return 0 - } - //fmt.Println(pair) - if pair.Value.ForwardingRules != nil { - //fmt.Println(pair) - loadbalancerCount += len(pair.Value.ForwardingRules) - } - } - } else { - fmt.Println("Compute not enabled for ", project.Name) } + fmt.Printf("vCPUs: %d\n\n", vcpus) } - - log.Debugln("LoadBalancers found", loadbalancerCount) - return loadbalancerCount + fmt.Println("----------------------------------------------") + fmt.Println("Number of GCP projects inventoried:", len(projects)) + fmt.Println("----------------------------------------------") } -func getGateways(credentials string, projects []ProjectInfo) int { - fmt.Println("Inventorying Gateways") - ctx := context.Background() - - routerCount := 0 - - for _, project := range projects { - if isServiceEnabled(project.Number, "compute.googleapis.com", credentials) { - instancesClient, err := compute.NewRoutersRESTClient(ctx) - - if err != nil { - fmt.Errorf("NewInstancesRESTClient: %v", err) - return 0 - } - defer instancesClient.Close() - - req := &computepb.AggregatedListRoutersRequest{ - Project: project.ID, - } - - it := instancesClient.AggregatedList(ctx, req) - // Despite using the `MaxResults` parameter, you don't need to handle the pagination - // yourself. The returned iterator object handles pagination - // automatically, returning separated pages as you iterate over the results. - for { - pair, err := it.Next() - if err == iterator.Done { - break - } - if err != nil { - fmt.Errorf("getGateways pair iterator: %v", err) - return 0 - } - //fmt.Println(pair) - if pair.Value.Routers != nil { - //fmt.Println(pair) - routerCount += len(pair.Value.Routers) - } - } - } else { - fmt.Println("Compute not enabled for ", project.Name) - } +func parseCustomInstanceType(instanceType string) int32 { + parts := strings.Split(instanceType, "-") + i, err := strconv.ParseInt(parts[2], 10, 32) + if err != nil { + panic(err) } - - log.Debugln("Gateways found", routerCount) - return routerCount + vcpus := int32(i) + return vcpus } func ParseCredentials(cmd *cobra.Command) string { @@ -229,38 +113,6 @@ func ParseProjectsToIgnore(cmd *cobra.Command) []string { return projectsToIgnore } -func getSQLServerInstances(credentials string, projects []ProjectInfo) int { - fmt.Println("Inventorying SQL") - ctx := context.Background() - sqlService, err := sqladmin.NewService(ctx, option.WithCredentialsFile(credentials)) - if err != nil { - log.Fatalln("error in getSQLServerInstances", err) - } - - sqlCount := 0 - - for _, project := range projects { - if isServiceEnabled(project.Number, "sqladmin.googleapis.com", credentials) { - //fmt.Println("got in enabled") - req := sqlService.Instances.List(project.ID) - if err := req.Pages(ctx, func(page *sqladmin.InstancesListResponse) error { - //for _, db := range page.Items { - // fmt.Println(db.Name) - //} - sqlCount += len(page.Items) - return nil - }); err != nil { - log.Fatal("err in getSQLServerInstances", err) - } - } else { - fmt.Println("SQL not enabled for", project.Name, "("+project.ID+")") - } - } - - log.Debugln("SQL Servers found", sqlCount) - return sqlCount -} - func isProjectValid(project *cloudresourcemanager.Project, projectsToIgnore []string) bool { yesno := project.LifecycleState == "ACTIVE" && !helpers.Contains(projectsToIgnore, project.ProjectId) return yesno @@ -303,9 +155,6 @@ func getVMInstances(credentials string, projects []ProjectInfo) []VMInstanceInfo } it := instancesClient.AggregatedList(ctx, req) - // Despite using the `MaxResults` parameter, you don't need to handle the pagination - // yourself. The returned iterator object handles pagination - // automatically, returning separated pages as you iterate over the results. for { pair, err := it.Next() if err == iterator.Done { @@ -318,13 +167,11 @@ func getVMInstances(credentials string, projects []ProjectInfo) []VMInstanceInfo instances := pair.Value.Instances if len(instances) > 0 { for _, instance := range instances { - //fmt.Println(instance) if instance.GetStatus() == "RUNNING" { - if _, ok := instance.GetLabels()["goog-gke-node"]; ok { - vms = append(vms, VMInstanceInfo{Zone: pair.Key, VMType: GKE_VM}) - } else { - vms = append(vms, VMInstanceInfo{Zone: pair.Key, VMType: GCE_VM}) - } + parts := strings.Split(*instance.MachineType, "/") + instanceType := parts[10] + zone := parts[8] + vms = append(vms, VMInstanceInfo{Project: project.Name, Zone: zone, InstanceType: instanceType, Name: *instance.Name}) } } } @@ -338,6 +185,99 @@ func getVMInstances(credentials string, projects []ProjectInfo) []VMInstanceInfo return vms } +func getMachinesTypes(credentials string, projects []ProjectInfo, vms []VMInstanceInfo) []MachineType { + fmt.Println("Getting Machine Types") + var project ProjectInfo + for _, p := range projects { + if isServiceEnabled(p.Number, "compute.googleapis.com", credentials) { + if project.ID == "" { + project = p + } + } + } + + var machineTypes []MachineType + if len(vms) == 0 { + return machineTypes + } + + var instanceTypes []string + var zones []string + for _, vm := range vms { + if !helpers.Contains(instanceTypes, vm.InstanceType) { + instanceTypes = append(instanceTypes, vm.InstanceType) + } + if !helpers.Contains(zones, vm.Zone) { + zones = append(zones, vm.Zone) + } + } + + for _, instanceType := range instanceTypes { + mt := getMachineTypeByName(credentials, project, instanceType, zones) + if len(mt) > 0 { + machineTypes = append(machineTypes, mt...) + } + } + + return machineTypes +} + +func getMachineTypeByName(credentials string, project ProjectInfo, instanceType string, zones []string) []MachineType { + + ctx := context.Background() + + var machineTypes []MachineType + + instancesClient, err := compute.NewMachineTypesRESTClient(ctx) + + if err != nil { + fmt.Errorf("NewMachineTypesRESTClient: %v", err) + return nil + } + defer instancesClient.Close() + + //format the query string + x := fmt.Sprintf(`(name = "%s") AND ((zone = "%s")`, instanceType, zones[0]) + for _, z := range zones[1:] { + x += fmt.Sprintf(` OR (zone = "%s")`, z) + } + x += ")" //need the trailing ")" + + var machineTypeQuery *string + machineTypeQuery = &x + + req := &computepb.AggregatedListMachineTypesRequest{ + Project: project.ID, + Filter: machineTypeQuery, + } + + it := instancesClient.AggregatedList(ctx, req) + for { + pair, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + fmt.Errorf("NewInstancesRESTClient pair iterator: %v", err) + return nil + } + + types := pair.Value.MachineTypes + + for _, mt := range types { + machineTypes = append(machineTypes, MachineType{ + vCPUs: *mt.GuestCpus, + Name: *mt.Name, + Zone: *mt.Zone, + }) + } + + } + + log.Debugln("Machine Type found", len(machineTypes)) + return machineTypes +} + func getProjects(credentials string, projectsToIgnore []string) []ProjectInfo { fmt.Println("Inventorying Compute") ctx := context.Background() diff --git a/lw-inventory/go.mod b/lw-inventory/go.mod index 37992cd..0733a61 100644 --- a/lw-inventory/go.mod +++ b/lw-inventory/go.mod @@ -3,7 +3,6 @@ module github.com/lacework-dev/scripts/lw-inventory go 1.18 require ( - cloud.google.com/go/appengine v1.3.0 cloud.google.com/go/compute v1.10.0 github.com/spf13/cobra v1.5.0 github.com/spf13/viper v1.12.0 @@ -13,22 +12,13 @@ require ( require ( cloud.google.com/go v0.102.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.4 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1 // indirect - github.com/golang-jwt/jwt v3.2.1+incompatible // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect github.com/googleapis/gax-go/v2 v2.5.1 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect go.opencensus.io v0.23.0 // indirect - golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88 // indirect golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 // indirect golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1 // indirect golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect @@ -45,15 +35,8 @@ require ( github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19 // indirect - github.com/aws/aws-sdk-go-v2/service/autoscaling v1.23.10 github.com/aws/aws-sdk-go-v2/service/ec2 v1.52.1 - github.com/aws/aws-sdk-go-v2/service/ecs v1.18.15 - github.com/aws/aws-sdk-go-v2/service/eks v1.21.8 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.14.12 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.18.12 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12 // indirect - github.com/aws/aws-sdk-go-v2/service/rds v1.24.0 - github.com/aws/aws-sdk-go-v2/service/redshift v1.26.4 github.com/aws/aws-sdk-go-v2/service/sso v1.11.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.16.13 // indirect github.com/aws/smithy-go v1.13.3 // indirect From 6d7859283fbd2eb8febf918c455bf0191e49a52b Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Thu, 15 Dec 2022 09:16:05 -0600 Subject: [PATCH 02/10] removing some debug --- lw-inventory/cmd/lwaws/aws.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lw-inventory/cmd/lwaws/aws.go b/lw-inventory/cmd/lwaws/aws.go index d603c49..db81624 100644 --- a/lw-inventory/cmd/lwaws/aws.go +++ b/lw-inventory/cmd/lwaws/aws.go @@ -96,7 +96,7 @@ func Run(profiles []string, regions []string, debug bool) { } fmt.Println("----------------------------------------------") - fmt.Printf("Total AWS vCPUs %d\n", totalvCPU) + fmt.Printf("AWS vCPUs %d for profile %s\n", totalvCPU, p) fmt.Println("\nAccount Breakdown") for account, vcpus := range accountVCPUS { @@ -176,7 +176,7 @@ func getRegions(cfg aws.Config) []string { func getInstanceTypesByRegion(cfg aws.Config, region string) []InstanceType { var instanceTypes []InstanceType - log.Println("aws cfg", cfg) + //log.Println("aws cfg", cfg) service := ec2.NewFromConfig(cfg) output := ec2.NewDescribeInstanceTypesPaginator(service, &ec2.DescribeInstanceTypesInput{}) From 1986826a4b038321502c2a24a64c8e32c8675a9c Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Fri, 20 Jan 2023 15:37:43 -0600 Subject: [PATCH 03/10] WIP ECS Fargate --- lw-inventory/cmd/lwaws/aws.go | 173 +++++++++++++++++++++++++++++++--- lw-inventory/cmd/lwgcp/gcp.go | 9 ++ lw-inventory/go.mod | 9 +- lw-inventory/go.sum | 10 ++ 4 files changed, 185 insertions(+), 16 deletions(-) diff --git a/lw-inventory/cmd/lwaws/aws.go b/lw-inventory/cmd/lwaws/aws.go index db81624..831c952 100644 --- a/lw-inventory/cmd/lwaws/aws.go +++ b/lw-inventory/cmd/lwaws/aws.go @@ -3,6 +3,9 @@ package lwaws import ( "context" "fmt" + "github.com/aws/aws-sdk-go-v2/service/ecs" + "math" + "strconv" "strings" "time" @@ -10,6 +13,7 @@ import ( "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/ec2" ec2Types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + ecsTypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" "github.com/lacework-dev/scripts/lw-inventory/helpers" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -36,6 +40,18 @@ type OSCounts struct { Linux int } +type ContainerClusterInfo struct { + Region string + ContainerType string + vCPU float64 + ClusterName string + AccountId string +} + +const ( + FARGATE_RUNNING_CONTAINERS = "Fargate Running Containers" +) + func Run(profiles []string, regions []string, debug bool) { if debug { log.SetLevel(log.DebugLevel) @@ -45,7 +61,8 @@ func Run(profiles []string, regions []string, debug bool) { fmt.Printf("Profiles to use: %s\n", profiles) var totalvCPU int32 - accountVCPUS := make(map[string]int32) + accountVMVCPUS := make(map[string]int32) + accountContainerVCPUS := make(map[string]int32) var totalVMOSCounts OSCounts for _, p := range profiles { @@ -60,17 +77,19 @@ func Run(profiles []string, regions []string, debug bool) { instanceTypes := getInstanceTypes(p, regions) ec2InstanceInfo := getEC2Instances(p, regions) + containerInfo := getContainerInfo(p, regions) //allVMs = append(allVMs, ec2InstanceInfo...) var vmOSCounts OSCounts var accountIds []string - var accountData = make(map[string][]EC2VMInfo) + var vmAccountData = make(map[string][]EC2VMInfo) + var containervCPUData = make(map[string]float64) for _, vm := range ec2InstanceInfo { for _, it := range instanceTypes { if it.Region == vm.Region && it.Name == vm.InstanceType { vm.vCPU = it.vCPU - accountData[vm.AccountId] = append(accountData[vm.AccountId], vm) + vmAccountData[vm.AccountId] = append(vmAccountData[vm.AccountId], vm) } } @@ -85,37 +104,51 @@ func Run(profiles []string, regions []string, debug bool) { } } + for _, container := range containerInfo { + containervCPUData[container.AccountId] = containervCPUData[container.AccountId] + container.vCPU + } + totalVMOSCounts.Linux += vmOSCounts.Linux totalVMOSCounts.Windows += vmOSCounts.Windows - for account, vms := range accountData { + for account, vms := range vmAccountData { for _, vm := range vms { - accountVCPUS[account] += vm.vCPU + accountVMVCPUS[account] += vm.vCPU totalvCPU += vm.vCPU } } + for account, vcpu := range containervCPUData { + vcpus := int32(math.Round(vcpu)) + accountContainerVCPUS[account] += vcpus + totalvCPU += vcpus + } + fmt.Println("----------------------------------------------") fmt.Printf("AWS vCPUs %d for profile %s\n", totalvCPU, p) fmt.Println("\nAccount Breakdown") - for account, vcpus := range accountVCPUS { - fmt.Printf("Account: %s - %d\n", account, vcpus) + for account, vcpus := range accountVMVCPUS { + fmt.Printf("Account VM vCPUs: %s - %d\n", account, vcpus) + } + + for account, vcpus := range accountContainerVCPUS { + fmt.Printf("Account Container vCPUs: %s - %d\n", account, vcpus) } fmt.Println("\nVM OS Counts") fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) - fmt.Println("\nNumber of AWS Accounts inventoried:", len(accountIds)) + fmt.Println("\nNumber of AWS Accounts Inventoried:", len(accountIds)) fmt.Println("----------------------------------------------") } //var totalvCPU int32 - //accountVCPUS := make(map[string]int32) + //accountVMVCPUS := make(map[string]int32) //for account, vms := range accountData { // for _, vm := range vms { - // accountVCPUS[account] += vm.vCPU + // accountVMVCPUS[account] += vm.vCPU // totalvCPU += vm.vCPU // } //} @@ -124,7 +157,7 @@ func Run(profiles []string, regions []string, debug bool) { fmt.Printf("Total AWS vCPUs %d\n", totalvCPU) fmt.Println("\nAccount Breakdown") - for account, vcpus := range accountVCPUS { + for account, vcpus := range accountVMVCPUS { fmt.Printf("Account: %s - %d\n", account, vcpus) } @@ -132,7 +165,7 @@ func Run(profiles []string, regions []string, debug bool) { fmt.Printf("Linux VMs %d\n", totalVMOSCounts.Linux) fmt.Printf("Windows VMs %d\n", totalVMOSCounts.Windows) - fmt.Println("\nNumber of AWS Accounts inventoried:", len(accountVCPUS)) + fmt.Println("\nNumber of AWS Accounts inventoried:", len(accountVMVCPUS)) fmt.Println("----------------------------------------------") } @@ -254,6 +287,122 @@ func getEC2Instances(profile string, regions []string) []EC2VMInfo { return serviceCountList } +func getContainerInfo(profile string, regions []string) []ContainerClusterInfo { + log.Debugf("start getContainer\n") + start := time.Now() + + numFuncs := 0 + channel := make(chan []ContainerClusterInfo) + var containerList []ContainerClusterInfo + + for _, r := range regions { + cfg := getSession(profile, r) + //ECS Tasks + //numFuncs += 1 + //go func(r string) { + // channel <- getECSTaskDefinitionsByRegion(*cfg, r) + //}(r) + // + ////Running Fargate Tasks + //numFuncs += 1 + //go func(r string) { + // channel <- getECSFargateRunningTasksByRegion(*cfg, r) + //}(r) + + //Running Fargate Containers + numFuncs += 1 + go func(r string) { + channel <- getECSFargateRunningContainersByRegion(*cfg, r) + }(r) + + ////Total Fargate Containers + //numFuncs += 1 + //go func(r string) { + // channel <- getECSFargateTotalContainersByRegion(*cfg, r) + //}(r) + // + //numFuncs += 1 + //go func(r string) { + // channel <- getEKSFargateActiveProfilesByRegion(*cfg, r) + //}(r) + // + //numFuncs += 1 + //go func(r string) { + // channel <- getECSFargateActiveServicesByRegion(*cfg, r) + //}(r) + } + + for i := 0; i < numFuncs; i++ { + containers := <-channel + containerList = append(containerList, containers...) + } + + elapsed := time.Since(start) + log.Debugf("end getContainer - %s\n", elapsed) + + return containerList +} + +func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []ContainerClusterInfo { + service := ecs.NewFromConfig(cfg) + output := ecs.NewListClustersPaginator(service, &ecs.ListClustersInput{}) + + var allClusterInfo []ContainerClusterInfo + for output.HasMorePages() { + page, err := output.NextPage(context.TODO()) + if err != nil { + log.Errorln("getECSFargateRunningContainersByRegion ListClusters ", region, err) + } else { + + for _, cluster := range page.ClusterArns { + output := ecs.NewListTasksPaginator(service, &ecs.ListTasksInput{ + Cluster: &cluster, + }) + for output.HasMorePages() { + //var clusterInfo ContainerClusterInfo + //clusterInfo.ClusterName = page. + page, err := output.NextPage(context.TODO()) + if err != nil { + log.Errorln("getECSFargateRunningContainersByRegion ListTasks ", region, err) + } else { + if len(page.TaskArns) > 0 { + outputDT, err := service.DescribeTasks(context.TODO(), &ecs.DescribeTasksInput{ + Cluster: &cluster, + Tasks: page.TaskArns, + }) + if err != nil { + log.Errorln("getECSFargateRunningContainersByRegion DescribeTasks ", region, err) + } else { + for _, t := range outputDT.Tasks { + if t.LaunchType == ecsTypes.LaunchTypeFargate && ecsTypes.DesiredStatus(*t.LastStatus) == ecsTypes.DesiredStatusRunning { + for _, c := range t.Containers { + if ecsTypes.DesiredStatus(*c.LastStatus) == ecsTypes.DesiredStatusRunning { + vcpu, _ := strconv.ParseFloat(*t.Cpu, 32) + clusterPieces := strings.Split(cluster, ":") + println(clusterPieces) + clusterInfo := ContainerClusterInfo{ + Region: region, + ContainerType: FARGATE_RUNNING_CONTAINERS, + vCPU: vcpu / 1024, + ClusterName: cluster, + AccountId: clusterPieces[4], + } + allClusterInfo = append(allClusterInfo, clusterInfo) + } + } + } + } + } + } + } + } + } + } + } + + return allClusterInfo +} + //func getContainerEC2Instances(profile string, regions []string) []EC2VMInfo { // log.Debugf("start getContainerEC2Instances\n") // start := time.Now() diff --git a/lw-inventory/cmd/lwgcp/gcp.go b/lw-inventory/cmd/lwgcp/gcp.go index a652d81..34a713c 100644 --- a/lw-inventory/cmd/lwgcp/gcp.go +++ b/lw-inventory/cmd/lwgcp/gcp.go @@ -48,6 +48,14 @@ type OSCounts struct { Linux int } +type ContainerClusterInfo struct { + Zone string + ContainerType string + vCPU float64 + ClusterName string + Project string +} + func Run(projectsToIgnore []string, credentials string, debug bool) { if debug { log.SetLevel(log.DebugLevel) @@ -56,6 +64,7 @@ func Run(projectsToIgnore []string, credentials string, debug bool) { projects := getProjects(credentials, projectsToIgnore) vms := getVMInstances(credentials, projects) machineTypes := getMachinesTypes(credentials, projects, vms) + getCloudRunCounts var vmsWithvCPU []VMInstanceInfo for _, vm := range vms { diff --git a/lw-inventory/go.mod b/lw-inventory/go.mod index 0733a61..17a58df 100644 --- a/lw-inventory/go.mod +++ b/lw-inventory/go.mod @@ -12,6 +12,7 @@ require ( require ( cloud.google.com/go v0.102.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ecs v1.23.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-cmp v0.5.9 // indirect @@ -28,18 +29,18 @@ require ( ) require ( - github.com/aws/aws-sdk-go-v2 v1.16.16 + github.com/aws/aws-sdk-go-v2 v1.17.3 github.com/aws/aws-sdk-go-v2/config v1.17.1 github.com/aws/aws-sdk-go-v2/credentials v1.12.14 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19 // indirect github.com/aws/aws-sdk-go-v2/service/ec2 v1.52.1 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.11.17 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.16.13 // indirect - github.com/aws/smithy-go v1.13.3 // indirect + github.com/aws/smithy-go v1.13.5 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect diff --git a/lw-inventory/go.sum b/lw-inventory/go.sum index 8c3988a..5dabba4 100644 --- a/lw-inventory/go.sum +++ b/lw-inventory/go.sum @@ -83,6 +83,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/aws/aws-sdk-go-v2 v1.16.11/go.mod h1:WTACcleLz6VZTp7fak4EO5b9Q4foxbn+8PIz3PmyKlo= github.com/aws/aws-sdk-go-v2 v1.16.16 h1:M1fj4FE2lB4NzRb9Y0xdWsn2P0+2UHVxwKyOa4YJNjk= github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k= +github.com/aws/aws-sdk-go-v2 v1.17.3 h1:shN7NlnVzvDUgPQ+1rLMSxY8OWRNDRYtiqe0p/PgrhY= +github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.17.1 h1:BWxTjokU/69BZ4DnLrZco6OvBDii6ToEdfBL/y5I1nA= github.com/aws/aws-sdk-go-v2/config v1.17.1/go.mod h1:uOxDHjBemNTF2Zos+fgG0NNfE86wn1OAHDTGxjMEYi0= github.com/aws/aws-sdk-go-v2/credentials v1.12.14 h1:AtVG/amkjbDBfnPr/tuW2IG18HGNznP6L12Dx0rLz+Q= @@ -92,9 +94,13 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.12/go.mod h1:aZ4vZnyUuxedC7e github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.18/go.mod h1:348MLhzV1GSlZSMusdwQpXKbhD7X2gbI/TxwAPKkYZQ= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 h1:s4g/wnzMf+qepSNgTvaQQHNxyMLKSawNhKCPNy++2xY= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 h1:I3cakv2Uy1vNmmhRQmFptYDxOvBnwCdNwyw63N0RaRU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.12/go.mod h1:ckaCVTEdGAxO6KwTGzgskxR1xM+iJW4lxMyDFVda2Fc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 h1:/K482T5A3623WJgWT8w1yRAFK4RzGzEl7y39yhtn9eA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 h1:5NbbMrIzmUn/TXFqAle6mgrH5m9cOvMLRGL7pnG8tRE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19 h1:g5qq9sgtEzt2szMaDqQO6fqKe026T6dHTFJp5NsPzkQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19/go.mod h1:cVHo8KTuHjShb9V8/VjH3S/8+xPu16qx8fdGwmotJhE= github.com/aws/aws-sdk-go-v2/service/autoscaling v1.23.10 h1:D6U34TKBxZ2rtP9QO0gqMmy0yU2zfXzkgmFcwr64Fv0= @@ -103,6 +109,8 @@ github.com/aws/aws-sdk-go-v2/service/ec2 v1.52.1 h1:A2hit+4GRYOdvs2aJxGhDrrRS17z github.com/aws/aws-sdk-go-v2/service/ec2 v1.52.1/go.mod h1:YbPg6ou7dlvFTJMmbV3zhec+A22S1Ow+ZB6k6xUs9oY= github.com/aws/aws-sdk-go-v2/service/ecs v1.18.15 h1:dseu9SGI3VepG39If8W1HTyNrI/PFyh8PoJUDjnYCtQ= github.com/aws/aws-sdk-go-v2/service/ecs v1.18.15/go.mod h1:KIyoYPeoCLYhO0mA82lUwtZnEyQPVdgg6aPSGQOD0TA= +github.com/aws/aws-sdk-go-v2/service/ecs v1.23.0 h1:U1C52Ja15znyDMd+J5t9URqHyGBTN0hPZt1UHlDFa7U= +github.com/aws/aws-sdk-go-v2/service/ecs v1.23.0/go.mod h1:YXZ3cd8LDvvQytFpWjqbgdmHRAyJi4qbIT5dYdyhfeM= github.com/aws/aws-sdk-go-v2/service/eks v1.21.8 h1:uF8ubOoj49FDr0/Lyo5tR7OpKgT/xNcwuzEHMZBI0Ok= github.com/aws/aws-sdk-go-v2/service/eks v1.21.8/go.mod h1:R9cRhIInyI6RvK1CjhZSksjWN3wnNAx9ZtAqe5Jjvw0= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.14.12 h1:y97T4mPCBDVRtUxMAWA9ZNXnTHA2p4YXFBDSkMrxr4U= @@ -122,6 +130,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.16.13/go.mod h1:Ru3QVMLygVs/07UQ3YDu github.com/aws/smithy-go v1.12.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.13.3 h1:l7LYxGuzK6/K+NzJ2mC+VvLUbae0sL3bXU//04MkmnA= github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= From b717e29fd21bcc4549253d37fd54716c85b0b3b1 Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Fri, 20 Jan 2023 15:38:38 -0600 Subject: [PATCH 04/10] fixing oops --- lw-inventory/cmd/lwgcp/gcp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lw-inventory/cmd/lwgcp/gcp.go b/lw-inventory/cmd/lwgcp/gcp.go index 34a713c..a13f3e5 100644 --- a/lw-inventory/cmd/lwgcp/gcp.go +++ b/lw-inventory/cmd/lwgcp/gcp.go @@ -64,7 +64,7 @@ func Run(projectsToIgnore []string, credentials string, debug bool) { projects := getProjects(credentials, projectsToIgnore) vms := getVMInstances(credentials, projects) machineTypes := getMachinesTypes(credentials, projects, vms) - getCloudRunCounts + //getCloudRunCounts var vmsWithvCPU []VMInstanceInfo for _, vm := range vms { From cec559686dda82c880aa593691d7ead7fafb2e10 Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Fri, 20 Jan 2023 15:48:09 -0600 Subject: [PATCH 05/10] including stopped now --- lw-inventory/cmd/lwaws/aws.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lw-inventory/cmd/lwaws/aws.go b/lw-inventory/cmd/lwaws/aws.go index 831c952..6ebbe84 100644 --- a/lw-inventory/cmd/lwaws/aws.go +++ b/lw-inventory/cmd/lwaws/aws.go @@ -379,7 +379,7 @@ func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []Con if ecsTypes.DesiredStatus(*c.LastStatus) == ecsTypes.DesiredStatusRunning { vcpu, _ := strconv.ParseFloat(*t.Cpu, 32) clusterPieces := strings.Split(cluster, ":") - println(clusterPieces) + //println(clusterPieces) clusterInfo := ContainerClusterInfo{ Region: region, ContainerType: FARGATE_RUNNING_CONTAINERS, @@ -531,7 +531,7 @@ func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []Con func getEC2InstancesByRegion(cfg aws.Config, region string) []EC2VMInfo { service := ec2.NewFromConfig(cfg) output := ec2.NewDescribeInstancesPaginator(service, &ec2.DescribeInstancesInput{ - Filters: []ec2Types.Filter{{Name: aws.String("instance-state-name"), Values: []string{"running", "pending"}}}, + Filters: []ec2Types.Filter{{Name: aws.String("instance-state-name"), Values: []string{"running", "pending", "stopped"}}}, }) var instances []EC2VMInfo From b4d0a576bd696d02a6891ddbcbf864b08cde3fff Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Fri, 27 Jan 2023 10:01:10 -0600 Subject: [PATCH 06/10] adding more vcpu counting --- lw-inventory/cmd/lwaws/aws.go | 28 +++++++++++++++------------- lw-inventory/cmd/lwazure/azure.go | 8 ++++---- lw-inventory/cmd/lwgcp/gcp.go | 3 ++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/lw-inventory/cmd/lwaws/aws.go b/lw-inventory/cmd/lwaws/aws.go index 6ebbe84..f39a673 100644 --- a/lw-inventory/cmd/lwaws/aws.go +++ b/lw-inventory/cmd/lwaws/aws.go @@ -3,6 +3,7 @@ package lwaws import ( "context" "fmt" + "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/aws-sdk-go-v2/service/ecs" "math" "strconv" @@ -62,6 +63,7 @@ func Run(profiles []string, regions []string, debug bool) { var totalvCPU int32 accountVMVCPUS := make(map[string]int32) + totalAccountvCPUS := make(map[string]int32) accountContainerVCPUS := make(map[string]int32) var totalVMOSCounts OSCounts @@ -114,6 +116,7 @@ func Run(profiles []string, regions []string, debug bool) { for account, vms := range vmAccountData { for _, vm := range vms { accountVMVCPUS[account] += vm.vCPU + totalAccountvCPUS[account] += vm.vCPU totalvCPU += vm.vCPU } } @@ -121,6 +124,7 @@ func Run(profiles []string, regions []string, debug bool) { for account, vcpu := range containervCPUData { vcpus := int32(math.Round(vcpu)) accountContainerVCPUS[account] += vcpus + totalAccountvCPUS[account] += vcpus totalvCPU += vcpus } @@ -135,6 +139,7 @@ func Run(profiles []string, regions []string, debug bool) { for account, vcpus := range accountContainerVCPUS { fmt.Printf("Account Container vCPUs: %s - %d\n", account, vcpus) } + fmt.Println("Lambda counts not available at this time") fmt.Println("\nVM OS Counts") fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) @@ -144,28 +149,20 @@ func Run(profiles []string, regions []string, debug bool) { fmt.Println("----------------------------------------------") } - //var totalvCPU int32 - //accountVMVCPUS := make(map[string]int32) - //for account, vms := range accountData { - // for _, vm := range vms { - // accountVMVCPUS[account] += vm.vCPU - // totalvCPU += vm.vCPU - // } - //} - fmt.Println("----------------------------------------------") fmt.Printf("Total AWS vCPUs %d\n", totalvCPU) fmt.Println("\nAccount Breakdown") - for account, vcpus := range accountVMVCPUS { + for account, vcpus := range totalAccountvCPUS { fmt.Printf("Account: %s - %d\n", account, vcpus) } + fmt.Println("Lambda counts not available at this time") fmt.Println("\nVM OS Counts") fmt.Printf("Linux VMs %d\n", totalVMOSCounts.Linux) fmt.Printf("Windows VMs %d\n", totalVMOSCounts.Windows) - fmt.Println("\nNumber of AWS Accounts inventoried:", len(accountVMVCPUS)) + fmt.Println("\nNumber of AWS Accounts Inventoried:", len(accountVMVCPUS)) fmt.Println("----------------------------------------------") } @@ -173,7 +170,10 @@ func getSession(profile string, region string) *aws.Config { cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region), config.WithSharedConfigProfile(profile), - config.WithDefaultsMode(aws.DefaultsModeInRegion), + //config.WithDefaultsMode(aws.DefaultsModeInRegion), + config.WithRetryer(func() aws.Retryer { + return retry.AddWithMaxAttempts(retry.NewStandard(), 1) + }), ) if err != nil { log.Errorln("Error connecting to AWS", err) @@ -218,6 +218,9 @@ func getInstanceTypesByRegion(cfg aws.Config, region string) []InstanceType { page, err := output.NextPage(context.TODO()) if err != nil { log.Errorln("getInstanceTypes NewDescribeInstanceTypesPaginator ", region, err) + if strings.Contains(err.Error(), "credentials") { + println("auth issue") + } } else { for _, it := range page.InstanceTypes { //fmt.Println(it.InstanceType, it.VCpuInfo.DefaultVCpus, region) @@ -353,7 +356,6 @@ func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []Con if err != nil { log.Errorln("getECSFargateRunningContainersByRegion ListClusters ", region, err) } else { - for _, cluster := range page.ClusterArns { output := ecs.NewListTasksPaginator(service, &ecs.ListTasksInput{ Cluster: &cluster, diff --git a/lw-inventory/cmd/lwazure/azure.go b/lw-inventory/cmd/lwazure/azure.go index 8f4fd24..489eb33 100644 --- a/lw-inventory/cmd/lwazure/azure.go +++ b/lw-inventory/cmd/lwazure/azure.go @@ -71,8 +71,8 @@ func Run(subscriptionsToIgnore []string, debug bool) { } } - fmt.Println("Standard Agents", len(standardAgentsWithvCPU)) - fmt.Println("Enterprise Agents", len(enterpriseAgentsWithvCPU)) + fmt.Println("VM vCPU Counts", len(standardAgentsWithvCPU)) + fmt.Println("Container vCPU Counts", len(enterpriseAgentsWithvCPU)) for _, vm := range standardAgentsWithvCPU { if vm.OS == "Linux" { @@ -162,13 +162,13 @@ func getVMSizesByLocation(location string) []MachineType { } func getStandardAgents() []VMInfo { - fmt.Println("Gathering Standard Agent Count") + fmt.Println("Gathering VM vCPU Count") vmCount := getVMs() return vmCount } func getEntepriseAgents() []VMInfo { - fmt.Println("Gathering Enterprise Agent Count") + fmt.Println("Gathering AKS vCPU Count") nodes := getAKSNodes() return nodes } diff --git a/lw-inventory/cmd/lwgcp/gcp.go b/lw-inventory/cmd/lwgcp/gcp.go index a13f3e5..c71ada7 100644 --- a/lw-inventory/cmd/lwgcp/gcp.go +++ b/lw-inventory/cmd/lwgcp/gcp.go @@ -81,6 +81,7 @@ func Run(projectsToIgnore []string, credentials string, debug bool) { for _, project := range projects { fmt.Println("Project:", project.Name) + fmt.Println("Cloud Run counts not available at this time") var vcpus int32 for _, vm := range vmsWithvCPU { if vm.Project == project.Name { @@ -176,7 +177,7 @@ func getVMInstances(credentials string, projects []ProjectInfo) []VMInstanceInfo instances := pair.Value.Instances if len(instances) > 0 { for _, instance := range instances { - if instance.GetStatus() == "RUNNING" { + if instance.GetStatus() == "RUNNING" || instance.GetStatus() == "STOPPED" { parts := strings.Split(*instance.MachineType, "/") instanceType := parts[10] zone := parts[8] From f52217a328bee58f31b53514b6030f609bd31305 Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Mon, 30 Jan 2023 10:53:50 -0600 Subject: [PATCH 07/10] only looking at running --- lw-inventory/cmd/lwaws/aws.go | 2 +- lw-inventory/cmd/lwgcp/gcp.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lw-inventory/cmd/lwaws/aws.go b/lw-inventory/cmd/lwaws/aws.go index f39a673..c4775c5 100644 --- a/lw-inventory/cmd/lwaws/aws.go +++ b/lw-inventory/cmd/lwaws/aws.go @@ -533,7 +533,7 @@ func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []Con func getEC2InstancesByRegion(cfg aws.Config, region string) []EC2VMInfo { service := ec2.NewFromConfig(cfg) output := ec2.NewDescribeInstancesPaginator(service, &ec2.DescribeInstancesInput{ - Filters: []ec2Types.Filter{{Name: aws.String("instance-state-name"), Values: []string{"running", "pending", "stopped"}}}, + Filters: []ec2Types.Filter{{Name: aws.String("instance-state-name"), Values: []string{"running", "pending"}}}, }) var instances []EC2VMInfo diff --git a/lw-inventory/cmd/lwgcp/gcp.go b/lw-inventory/cmd/lwgcp/gcp.go index c71ada7..cebc180 100644 --- a/lw-inventory/cmd/lwgcp/gcp.go +++ b/lw-inventory/cmd/lwgcp/gcp.go @@ -177,7 +177,7 @@ func getVMInstances(credentials string, projects []ProjectInfo) []VMInstanceInfo instances := pair.Value.Instances if len(instances) > 0 { for _, instance := range instances { - if instance.GetStatus() == "RUNNING" || instance.GetStatus() == "STOPPED" { + if instance.GetStatus() == "RUNNING" { parts := strings.Split(*instance.MachineType, "/") instanceType := parts[10] zone := parts[8] From 62a51bb40295eb5d15245f315e78f371d12b7cfa Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Tue, 11 Apr 2023 09:53:22 -0500 Subject: [PATCH 08/10] adding lambda --- lw-inventory/cmd/lwaws/aws.go | 274 ++++++++++------------------ lw-inventory/cmd/lwazure/azure.go | 152 +++++++++++++++- lw-inventory/go.mod | 11 +- lw-inventory/go.sum | 288 +----------------------------- 4 files changed, 258 insertions(+), 467 deletions(-) diff --git a/lw-inventory/cmd/lwaws/aws.go b/lw-inventory/cmd/lwaws/aws.go index c4775c5..0f9f9c9 100644 --- a/lw-inventory/cmd/lwaws/aws.go +++ b/lw-inventory/cmd/lwaws/aws.go @@ -3,21 +3,21 @@ package lwaws import ( "context" "fmt" - "github.com/aws/aws-sdk-go-v2/aws/retry" - "github.com/aws/aws-sdk-go-v2/service/ecs" - "math" - "strconv" - "strings" - "time" - "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/ec2" ec2Types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + "github.com/aws/aws-sdk-go-v2/service/ecs" ecsTypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" + "github.com/aws/aws-sdk-go-v2/service/lambda" "github.com/lacework-dev/scripts/lw-inventory/helpers" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "math" + "strconv" + "strings" + "time" ) type InstanceType struct { @@ -49,6 +49,14 @@ type ContainerClusterInfo struct { AccountId string } +type LambdaInfo struct { + Region string + Name string + Memory int32 + vCPU float64 + AccountId string +} + const ( FARGATE_RUNNING_CONTAINERS = "Fargate Running Containers" ) @@ -65,6 +73,7 @@ func Run(profiles []string, regions []string, debug bool) { accountVMVCPUS := make(map[string]int32) totalAccountvCPUS := make(map[string]int32) accountContainerVCPUS := make(map[string]int32) + accountLambdaVCPUS := make(map[string]int32) var totalVMOSCounts OSCounts for _, p := range profiles { @@ -80,13 +89,13 @@ func Run(profiles []string, regions []string, debug bool) { instanceTypes := getInstanceTypes(p, regions) ec2InstanceInfo := getEC2Instances(p, regions) containerInfo := getContainerInfo(p, regions) - - //allVMs = append(allVMs, ec2InstanceInfo...) + lambdaInfo := getLambdaInfo(p, regions) var vmOSCounts OSCounts var accountIds []string var vmAccountData = make(map[string][]EC2VMInfo) var containervCPUData = make(map[string]float64) + var lambdavCPUData = make(map[string]float64) for _, vm := range ec2InstanceInfo { for _, it := range instanceTypes { if it.Region == vm.Region && it.Name == vm.InstanceType { @@ -110,6 +119,10 @@ func Run(profiles []string, regions []string, debug bool) { containervCPUData[container.AccountId] = containervCPUData[container.AccountId] + container.vCPU } + for _, lambda := range lambdaInfo { + lambdavCPUData[lambda.AccountId] = lambdavCPUData[lambda.AccountId] + lambda.vCPU + } + totalVMOSCounts.Linux += vmOSCounts.Linux totalVMOSCounts.Windows += vmOSCounts.Windows @@ -128,6 +141,13 @@ func Run(profiles []string, regions []string, debug bool) { totalvCPU += vcpus } + for account, vcpu := range containervCPUData { + vcpus := int32(math.Round(vcpu)) + accountLambdaVCPUS[account] += vcpus + totalAccountvCPUS[account] += vcpus + totalvCPU += vcpus + } + fmt.Println("----------------------------------------------") fmt.Printf("AWS vCPUs %d for profile %s\n", totalvCPU, p) @@ -139,7 +159,10 @@ func Run(profiles []string, regions []string, debug bool) { for account, vcpus := range accountContainerVCPUS { fmt.Printf("Account Container vCPUs: %s - %d\n", account, vcpus) } - fmt.Println("Lambda counts not available at this time") + + for account, vcpus := range accountLambdaVCPUS { + fmt.Printf("Account Lambda vCPUs: %s - %d\n", account, vcpus) + } fmt.Println("\nVM OS Counts") fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) @@ -156,7 +179,11 @@ func Run(profiles []string, regions []string, debug bool) { for account, vcpus := range totalAccountvCPUS { fmt.Printf("Account: %s - %d\n", account, vcpus) } - fmt.Println("Lambda counts not available at this time") + + //for account, vcpus := range totalAccountvCPUS { + // fmt.Printf("Account Lambda vCPUs: %s - %d\n", account, vcpus) + //} + //fmt.Println("Lambda counts not available at this time") fmt.Println("\nVM OS Counts") fmt.Printf("Linux VMs %d\n", totalVMOSCounts.Linux) @@ -167,7 +194,7 @@ func Run(profiles []string, regions []string, debug bool) { } func getSession(profile string, region string) *aws.Config { - cfg, err := config.LoadDefaultConfig(context.TODO(), + cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRegion(region), config.WithSharedConfigProfile(profile), //config.WithDefaultsMode(aws.DefaultsModeInRegion), @@ -185,7 +212,7 @@ func getSession(profile string, region string) *aws.Config { func getRegions(cfg aws.Config) []string { service := ec2.NewFromConfig(cfg) var regions []string - regionsResponse, err := service.DescribeRegions(context.TODO(), &ec2.DescribeRegionsInput{ + regionsResponse, err := service.DescribeRegions(context.Background(), &ec2.DescribeRegionsInput{ AllRegions: aws.Bool(true), }) @@ -207,15 +234,39 @@ func getRegions(cfg aws.Config) []string { return regions } +func getLambdas(cfg aws.Config, region string) []LambdaInfo { + service := lambda.NewFromConfig(cfg) + output := lambda.NewListFunctionsPaginator(service, &lambda.ListFunctionsInput{}) + + var lambdas []LambdaInfo + for output.HasMorePages() { + page, err := output.NextPage(context.Background()) + if err != nil { + log.Errorln("getLambdas NewListFunctionsPaginator ", err) + } else { + for _, it := range page.Functions { + clusterPieces := strings.Split(*it.FunctionArn, ":") + lambdas = append(lambdas, LambdaInfo{ + Region: region, + Name: *it.FunctionName, + Memory: *it.MemorySize, + AccountId: clusterPieces[4], + vCPU: float64(*it.MemorySize) / 1024, + }) + } + } + } + return lambdas +} + func getInstanceTypesByRegion(cfg aws.Config, region string) []InstanceType { var instanceTypes []InstanceType - //log.Println("aws cfg", cfg) service := ec2.NewFromConfig(cfg) output := ec2.NewDescribeInstanceTypesPaginator(service, &ec2.DescribeInstanceTypesInput{}) for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) + page, err := output.NextPage(context.Background()) if err != nil { log.Errorln("getInstanceTypes NewDescribeInstanceTypesPaginator ", region, err) if strings.Contains(err.Error(), "credentials") { @@ -223,7 +274,6 @@ func getInstanceTypesByRegion(cfg aws.Config, region string) []InstanceType { } } else { for _, it := range page.InstanceTypes { - //fmt.Println(it.InstanceType, it.VCpuInfo.DefaultVCpus, region) instanceTypes = append(instanceTypes, InstanceType{ Name: fmt.Sprintf("%s", it.InstanceType), vCPU: *it.VCpuInfo.DefaultVCpus, @@ -300,39 +350,11 @@ func getContainerInfo(profile string, regions []string) []ContainerClusterInfo { for _, r := range regions { cfg := getSession(profile, r) - //ECS Tasks - //numFuncs += 1 - //go func(r string) { - // channel <- getECSTaskDefinitionsByRegion(*cfg, r) - //}(r) - // - ////Running Fargate Tasks - //numFuncs += 1 - //go func(r string) { - // channel <- getECSFargateRunningTasksByRegion(*cfg, r) - //}(r) - //Running Fargate Containers numFuncs += 1 go func(r string) { channel <- getECSFargateRunningContainersByRegion(*cfg, r) }(r) - - ////Total Fargate Containers - //numFuncs += 1 - //go func(r string) { - // channel <- getECSFargateTotalContainersByRegion(*cfg, r) - //}(r) - // - //numFuncs += 1 - //go func(r string) { - // channel <- getEKSFargateActiveProfilesByRegion(*cfg, r) - //}(r) - // - //numFuncs += 1 - //go func(r string) { - // channel <- getECSFargateActiveServicesByRegion(*cfg, r) - //}(r) } for i := 0; i < numFuncs; i++ { @@ -346,13 +368,41 @@ func getContainerInfo(profile string, regions []string) []ContainerClusterInfo { return containerList } +func getLambdaInfo(profile string, regions []string) []LambdaInfo { + log.Debugf("start getContainer\n") + start := time.Now() + + numFuncs := 0 + channel := make(chan []LambdaInfo) + var lambdasList []LambdaInfo + + for _, r := range regions { + cfg := getSession(profile, r) + + numFuncs += 1 + go func(r string) { + channel <- getLambdas(*cfg, r) + }(r) + } + + for i := 0; i < numFuncs; i++ { + containers := <-channel + lambdasList = append(lambdasList, containers...) + } + + elapsed := time.Since(start) + log.Debugf("end getContainer - %s\n", elapsed) + + return lambdasList +} + func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []ContainerClusterInfo { service := ecs.NewFromConfig(cfg) output := ecs.NewListClustersPaginator(service, &ecs.ListClustersInput{}) var allClusterInfo []ContainerClusterInfo for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) + page, err := output.NextPage(context.Background()) if err != nil { log.Errorln("getECSFargateRunningContainersByRegion ListClusters ", region, err) } else { @@ -361,14 +411,12 @@ func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []Con Cluster: &cluster, }) for output.HasMorePages() { - //var clusterInfo ContainerClusterInfo - //clusterInfo.ClusterName = page. - page, err := output.NextPage(context.TODO()) + page, err := output.NextPage(context.Background()) if err != nil { log.Errorln("getECSFargateRunningContainersByRegion ListTasks ", region, err) } else { if len(page.TaskArns) > 0 { - outputDT, err := service.DescribeTasks(context.TODO(), &ecs.DescribeTasksInput{ + outputDT, err := service.DescribeTasks(context.Background(), &ecs.DescribeTasksInput{ Cluster: &cluster, Tasks: page.TaskArns, }) @@ -381,7 +429,6 @@ func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []Con if ecsTypes.DesiredStatus(*c.LastStatus) == ecsTypes.DesiredStatusRunning { vcpu, _ := strconv.ParseFloat(*t.Cpu, 32) clusterPieces := strings.Split(cluster, ":") - //println(clusterPieces) clusterInfo := ContainerClusterInfo{ Region: region, ContainerType: FARGATE_RUNNING_CONTAINERS, @@ -405,131 +452,6 @@ func getECSFargateRunningContainersByRegion(cfg aws.Config, region string) []Con return allClusterInfo } -//func getContainerEC2Instances(profile string, regions []string) []EC2VMInfo { -// log.Debugf("start getContainerEC2Instances\n") -// start := time.Now() -// -// numFuncs := 0 -// channel := make(chan []EC2VMInfo) -// var serviceCountList []EC2VMInfo -// for _, r := range regions { -// cfg := getSession(profile, r) -// //ECS EC2s -// numFuncs += 1 -// go func(r string) { -// channel <- getECSVMCountByRegion(cfg, r) -// }(r) -// -// //EKS EC2s -// numFuncs += 1 -// go func(r string) { -// channel <- getEKSVMCountByRegion(cfg, r) -// }(r) -// } -// -// for i := 0; i < numFuncs; i++ { -// vms := <-channel -// serviceCountList = append(serviceCountList, vms...) -// } -// -// elapsed := time.Since(start) -// log.Debugf("end getContainerEC2Instances - %s\n", elapsed) -// -// return serviceCountList -//} - -//func getEKSVMCountByRegion(cfg aws.Config, region string) []EC2VMInfo { -// service := eks.NewFromConfig(cfg) -// autoscalingService := autoscaling.NewFromConfig(cfg) -// -// var instances []EC2VMInfo -// output, err := service.ListClusters(context.TODO(), &eks.ListClustersInput{}) -// -// if err != nil { -// log.Errorln("getEKSVMCountByRegion ListClusters ", region, err) -// } else { -// for _, cluster := range output.Clusters { -// output, err := service.ListNodegroups(context.TODO(), &eks.ListNodegroupsInput{ -// ClusterName: &cluster, -// }) -// if err != nil { -// log.Errorln("getEKSVMCountByRegion ListNodegroups ", region, err) -// } else { -// for _, nodegroup := range output.Nodegroups { -// output, err := service.DescribeNodegroup(context.TODO(), &eks.DescribeNodegroupInput{ -// ClusterName: &cluster, -// NodegroupName: &nodegroup, -// }) -// if err != nil { -// log.Errorln("getEKSVMCountByRegion DescribeNodegroup ", region, err) -// } else { -// var asgNames []string -// for _, autoscalingGroup := range output.Nodegroup.Resources.AutoScalingGroups { -// asgNames = append(asgNames, *autoscalingGroup.Name) -// } -// -// outputDASG, err := autoscalingService.DescribeAutoScalingGroups(context.TODO(), &autoscaling.DescribeAutoScalingGroupsInput{ -// AutoScalingGroupNames: asgNames, -// }) -// -// if err != nil { -// log.Errorln("getEKSVMCountByRegion DescribeAutoScalingGroups ", region, err) -// } else { -// for _, asg := range outputDASG.AutoScalingGroups { -// for _, i := range asg.Instances { -// role := fmt.Sprintf("%s", *output.Nodegroup.NodeRole) -// instances = append(instances, EC2VMInfo{Region: region, AMI: *i.InstanceId, InstanceType: *i.InstanceType, AccountId: role[13:25]}) -// } -// } -// } -// } -// } -// } -// } -// } -// -// return instances -//} - -//func getECSVMCountByRegion(cfg aws.Config, region string) []EC2VMInfo { -// service := ecs.NewFromConfig(cfg) -// var instances []EC2VMInfo -// output, err := service.ListClusters(context.TODO(), &ecs.ListClustersInput{}) -// -// if err != nil { -// log.Errorln("getECSVMCountByRegion ListClusters ", region, err) -// } else { -// for _, cluster := range output.ClusterArns { -// output, err := service.ListContainerInstances(context.TODO(), &ecs.ListContainerInstancesInput{ -// Cluster: &cluster, -// }) -// -// if err != nil { -// log.Errorln("getECSVMCountByRegion ListContainerInstances ", region, err) -// } else { -// for _, cia := range output.ContainerInstanceArns { -// output, err := service.DescribeContainerInstances(context.TODO(), &ecs.DescribeContainerInstancesInput{ -// Cluster: &cluster, -// ContainerInstances: []string{cia}, -// }) -// -// if err != nil { -// log.Errorln("getECSVMCountByRegion DescribeContainerInstances ", region, err) -// } else { -// for _, i := range output.ContainerInstances { -// parts := strings.Split(*i.ContainerInstanceArn, ":") -// accountId := parts[4] -// instances = append(instances, EC2VMInfo{Region: region, AMI: *i.Ec2InstanceId, AccountId: accountId}) -// } -// } -// } -// } -// } -// } -// -// return instances -//} - func getEC2InstancesByRegion(cfg aws.Config, region string) []EC2VMInfo { service := ec2.NewFromConfig(cfg) output := ec2.NewDescribeInstancesPaginator(service, &ec2.DescribeInstancesInput{ @@ -539,7 +461,7 @@ func getEC2InstancesByRegion(cfg aws.Config, region string) []EC2VMInfo { var instances []EC2VMInfo for output.HasMorePages() { - page, err := output.NextPage(context.TODO()) + page, err := output.NextPage(context.Background()) if err != nil { log.Errorln("getEC2InstancesByRegion DescribeInstances ", region, err) } else { diff --git a/lw-inventory/cmd/lwazure/azure.go b/lw-inventory/cmd/lwazure/azure.go index 489eb33..5079527 100644 --- a/lw-inventory/cmd/lwazure/azure.go +++ b/lw-inventory/cmd/lwazure/azure.go @@ -30,6 +30,11 @@ func Run(subscriptionsToIgnore []string, debug bool) { setSubscription(subscription) standardAgents := getStandardAgents() enterpriseAgents := getEntepriseAgents() + scaleSets := getVMScaleSet() + rgs := getResourceGroups() + for _, group := range rgs { + getContainers(group) + } var locations []string for _, vm := range standardAgents { @@ -38,6 +43,12 @@ func Run(subscriptionsToIgnore []string, debug bool) { } } + for _, vm := range scaleSets { + if !helpers.Contains(locations, vm.Location) { + locations = append(locations, vm.Location) + } + } + for _, vm := range enterpriseAgents { if !helpers.Contains(locations, vm.Location) { locations = append(locations, vm.Location) @@ -50,29 +61,51 @@ func Run(subscriptionsToIgnore []string, debug bool) { } var standardAgentsWithvCPU []VMInfo + var vmvCPU int32 for _, vm := range standardAgents { for _, size := range vmSizes { if vm.Location == size.Location && vm.VMSize == size.Name { vm.vCPUs = size.vCPUs + vmvCPU += vm.vCPUs totalVCPUs += size.vCPUs standardAgentsWithvCPU = append(standardAgentsWithvCPU, vm) } } } + var scaleSetsWithvCPU []VMInfo + var scalesetvCPU int32 + for _, vm := range scaleSets { + for _, size := range vmSizes { + if vm.Location == size.Location && vm.VMSize == size.Name { + vm.vCPUs = size.vCPUs * vm.Quantity + scalesetvCPU += vm.vCPUs + totalVCPUs += vm.vCPUs + scaleSetsWithvCPU = append(scaleSetsWithvCPU, vm) + } + } + } + var enterpriseAgentsWithvCPU []VMInfo + var k8svCPU int32 for _, vm := range enterpriseAgents { for _, size := range vmSizes { if vm.Location == size.Location && vm.VMSize == size.Name { vm.vCPUs = size.vCPUs + k8svCPU += vm.vCPUs totalVCPUs += size.vCPUs enterpriseAgentsWithvCPU = append(enterpriseAgentsWithvCPU, vm) } } } - fmt.Println("VM vCPU Counts", len(standardAgentsWithvCPU)) - fmt.Println("Container vCPU Counts", len(enterpriseAgentsWithvCPU)) + fmt.Println("VM Counts", len(standardAgentsWithvCPU)) + fmt.Println("VM Scale Set Counts", len(scaleSetsWithvCPU)) + fmt.Println("AKS Counts", len(enterpriseAgentsWithvCPU)) + + fmt.Println("\nVM vCPU Counts", vmvCPU) + fmt.Println("VM Scale Set vCPU Counts", scalesetvCPU) + fmt.Println("AKS vCPU Counts", k8svCPU) for _, vm := range standardAgentsWithvCPU { if vm.OS == "Linux" { @@ -82,6 +115,14 @@ func Run(subscriptionsToIgnore []string, debug bool) { } } + for _, vm := range scaleSetsWithvCPU { + if vm.OS == "Linux" { + subscriptionVMOSCounts.Linux += vm.Quantity + } else { + subscriptionVMOSCounts.Windows += vm.Quantity + } + } + for _, vm := range enterpriseAgentsWithvCPU { if vm.OS == "Linux" { subscriptionVMOSCounts.Linux++ @@ -106,7 +147,7 @@ func Run(subscriptionsToIgnore []string, debug bool) { fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) - fmt.Println("\nNumber of Azure subscriptions inventoried", subscriptionsInventoried) + fmt.Println("\nNumber of Azure subscriptions Inventoried", subscriptionsInventoried) fmt.Println("----------------------------------------------") } @@ -116,11 +157,12 @@ type VMInfo struct { Location string vCPUs int32 VMSize string + Quantity int32 } type OSCounts struct { - Windows int - Linux int + Windows int32 + Linux int32 } type MachineType struct { @@ -243,6 +285,106 @@ func setSubscription(subscription string) bool { return true } +type getResourceGroupList struct { + Name string `json:"name"` +} + +func getResourceGroups() []string { + buf := bytes.NewBuffer([]byte{}) + + cmd := exec.Command("az", "group", "list") + cmd.Stdout = buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + helpers.Bail("error running az group list", err) + } + + response := []getResourceGroupList{} + if err := json.NewDecoder(buf).Decode(&response); err != nil { + helpers.Bail("Error decoding groups json", err) + } + + var groups []string + for _, group := range response { + groups = append(groups, group.Name) + } + + return groups +} + +type getContainerListResponse struct { + Containers []struct { + Resources struct { + Requests struct { + CPU float32 `json:"cpu"` + } `json:"requests"` + } `json:"resources"` + } `json:"containers"` + Location string `json:"location"` + OSType string `json:"osType"` +} + +func getContainers(resourceGroup string) []VMInfo { + buf := bytes.NewBuffer([]byte{}) + + cmd := exec.Command("az", "container", "list", "-g", resourceGroup) + cmd.Stdout = buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + helpers.Bail("error running az container list", err) + } + + response := []getContainerListResponse{} + if err := json.NewDecoder(buf).Decode(&response); err != nil { + helpers.Bail("Error decoding container json", err) + } + + var vms = []VMInfo{} + for _, containers := range response { + for _, container := range containers.Containers { + vms = append(vms, VMInfo{Location: containers.Location, OS: containers.OSType, vCPUs: int32(container.Resources.Requests.CPU)}) + } + } + return vms +} + +type getVMScaleSetResponse struct { + SKU struct { + Capacity int32 `json:"capacity"` + Name string `json:"name"` + } `json:"sku"` + VirtualMachineProfile struct { + StorageProfile struct { + OSDisk struct { + OSType string `json:"osType"` + } `json:"osDisk"` + } + } `json:"virtualMachineProfile"` + Location string `json:"location"` +} + +func getVMScaleSet() []VMInfo { + buf := bytes.NewBuffer([]byte{}) + + cmd := exec.Command("az", "vmss", "list") + cmd.Stdout = buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + helpers.Bail("error running az vmss list", err) + } + + response := []getVMScaleSetResponse{} + if err := json.NewDecoder(buf).Decode(&response); err != nil { + helpers.Bail("Error decoding scalesets json", err) + } + + var vms = []VMInfo{} + for _, ss := range response { + vms = append(vms, VMInfo{OS: ss.VirtualMachineProfile.StorageProfile.OSDisk.OSType, ID: "", Location: ss.Location, VMSize: ss.SKU.Name, Quantity: ss.SKU.Capacity}) + } + return vms +} + type getVMsListResponse struct { StorageProfile struct { ImageReference struct { diff --git a/lw-inventory/go.mod b/lw-inventory/go.mod index 17a58df..518ab20 100644 --- a/lw-inventory/go.mod +++ b/lw-inventory/go.mod @@ -4,6 +4,8 @@ go 1.18 require ( cloud.google.com/go/compute v1.10.0 + github.com/aws/aws-sdk-go-v2/service/ecs v1.23.0 + github.com/aws/aws-sdk-go-v2/service/lambda v1.29.3 github.com/spf13/cobra v1.5.0 github.com/spf13/viper v1.12.0 google.golang.org/api v0.99.0 @@ -11,11 +13,8 @@ require ( ) require ( - cloud.google.com/go v0.102.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.23.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect github.com/googleapis/gax-go/v2 v2.5.1 // indirect @@ -29,12 +28,12 @@ require ( ) require ( - github.com/aws/aws-sdk-go-v2 v1.17.3 + github.com/aws/aws-sdk-go-v2 v1.17.5 github.com/aws/aws-sdk-go-v2/config v1.17.1 github.com/aws/aws-sdk-go-v2/credentials v1.12.14 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19 // indirect github.com/aws/aws-sdk-go-v2/service/ec2 v1.52.1 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12 // indirect diff --git a/lw-inventory/go.sum b/lw-inventory/go.sum index 5dabba4..442d4bc 100644 --- a/lw-inventory/go.sum +++ b/lw-inventory/go.sum @@ -17,42 +17,17 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.101.1/go.mod h1:55HwjsGW4CHD3JrNuMdZtSDsgTs0CuCB/bBTugD+7AA= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1 h1:vpK6iQWv/2uUeFJth4/cBHsQAGjn1iIE6AAlxipRaA0= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go/appengine v1.3.0 h1:z2DPG6TitHyk7yRUFchWgN6x2UlPQjMOUNkdrH2daBc= -cloud.google.com/go/appengine v1.3.0/go.mod h1:oj0/KtGGSPDnpaSrBx6wlN3H9QhwJfmC/hRbxNAYaOg= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0 h1:aoLIYaA1fX3ywihqpBk2APQKOo20nXsp1GEZQbx5Jk4= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -63,28 +38,13 @@ 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.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.0/go.mod h1:GbaLEoMqbVm6sx3Z0R++gSiBlgMv6yUi2q1DeGFKQgE= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.4 h1:pqrAR74b6EoR4kcxF7L7Wg2B8Jgil9UUZtMvxhEFqWo= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.4/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 h1:QkAcEIAKbNL4KoFr4SathZPhDhF4mVwpBMFlYjyAqy8= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0 h1:jp0dGvZ7ZK0mgqnTSClMxa5xuRL7NZgHameVYF6BurY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= -github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1 h1:BWe8a+f/t+7KY7zH2mqygeUD0t8hNFXe08p1Pb3/jKE= -github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aws/aws-sdk-go-v2 v1.16.11/go.mod h1:WTACcleLz6VZTp7fak4EO5b9Q4foxbn+8PIz3PmyKlo= -github.com/aws/aws-sdk-go-v2 v1.16.16 h1:M1fj4FE2lB4NzRb9Y0xdWsn2P0+2UHVxwKyOa4YJNjk= -github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k= -github.com/aws/aws-sdk-go-v2 v1.17.3 h1:shN7NlnVzvDUgPQ+1rLMSxY8OWRNDRYtiqe0p/PgrhY= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.17.5 h1:TzCUW1Nq4H8Xscph5M/skINUitxM5UBAyvm2s7XBzL4= +github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.17.1 h1:BWxTjokU/69BZ4DnLrZco6OvBDii6ToEdfBL/y5I1nA= github.com/aws/aws-sdk-go-v2/config v1.17.1/go.mod h1:uOxDHjBemNTF2Zos+fgG0NNfE86wn1OAHDTGxjMEYi0= github.com/aws/aws-sdk-go-v2/credentials v1.12.14 h1:AtVG/amkjbDBfnPr/tuW2IG18HGNznP6L12Dx0rLz+Q= @@ -92,49 +52,31 @@ github.com/aws/aws-sdk-go-v2/credentials v1.12.14/go.mod h1:opAndTyq+YN7IpVG57z2 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.12 h1:wgJBHO58Pc1V1QAnzdVM3JK3WbE/6eUF0JxCZ+/izz0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.12/go.mod h1:aZ4vZnyUuxedC7eD4JyEHpGnCz+O2sHQEx3VvAwklSE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.18/go.mod h1:348MLhzV1GSlZSMusdwQpXKbhD7X2gbI/TxwAPKkYZQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 h1:s4g/wnzMf+qepSNgTvaQQHNxyMLKSawNhKCPNy++2xY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 h1:I3cakv2Uy1vNmmhRQmFptYDxOvBnwCdNwyw63N0RaRU= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29 h1:9/aKwwus0TQxppPXFmf010DFrE+ssSbzroLVYINA+xE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29/go.mod h1:Dip3sIGv485+xerzVv24emnjX5Sg88utCL8fwGmCeWg= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.12/go.mod h1:ckaCVTEdGAxO6KwTGzgskxR1xM+iJW4lxMyDFVda2Fc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 h1:/K482T5A3623WJgWT8w1yRAFK4RzGzEl7y39yhtn9eA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 h1:5NbbMrIzmUn/TXFqAle6mgrH5m9cOvMLRGL7pnG8tRE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23 h1:b/Vn141DBuLVgXbhRWIrl9g+ww7G+ScV5SzniWR13jQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23/go.mod h1:mr6c4cHC+S/MMkrjtSlG4QA36kOznDep+0fga5L/fGQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19 h1:g5qq9sgtEzt2szMaDqQO6fqKe026T6dHTFJp5NsPzkQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19/go.mod h1:cVHo8KTuHjShb9V8/VjH3S/8+xPu16qx8fdGwmotJhE= -github.com/aws/aws-sdk-go-v2/service/autoscaling v1.23.10 h1:D6U34TKBxZ2rtP9QO0gqMmy0yU2zfXzkgmFcwr64Fv0= -github.com/aws/aws-sdk-go-v2/service/autoscaling v1.23.10/go.mod h1:9XhGxXdcX9/pZwXc3BzvVQtSBVJCwL2IH2AtrfsUGBY= github.com/aws/aws-sdk-go-v2/service/ec2 v1.52.1 h1:A2hit+4GRYOdvs2aJxGhDrrRS17zSa66M+k1IqqgUic= github.com/aws/aws-sdk-go-v2/service/ec2 v1.52.1/go.mod h1:YbPg6ou7dlvFTJMmbV3zhec+A22S1Ow+ZB6k6xUs9oY= -github.com/aws/aws-sdk-go-v2/service/ecs v1.18.15 h1:dseu9SGI3VepG39If8W1HTyNrI/PFyh8PoJUDjnYCtQ= -github.com/aws/aws-sdk-go-v2/service/ecs v1.18.15/go.mod h1:KIyoYPeoCLYhO0mA82lUwtZnEyQPVdgg6aPSGQOD0TA= github.com/aws/aws-sdk-go-v2/service/ecs v1.23.0 h1:U1C52Ja15znyDMd+J5t9URqHyGBTN0hPZt1UHlDFa7U= github.com/aws/aws-sdk-go-v2/service/ecs v1.23.0/go.mod h1:YXZ3cd8LDvvQytFpWjqbgdmHRAyJi4qbIT5dYdyhfeM= -github.com/aws/aws-sdk-go-v2/service/eks v1.21.8 h1:uF8ubOoj49FDr0/Lyo5tR7OpKgT/xNcwuzEHMZBI0Ok= -github.com/aws/aws-sdk-go-v2/service/eks v1.21.8/go.mod h1:R9cRhIInyI6RvK1CjhZSksjWN3wnNAx9ZtAqe5Jjvw0= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.14.12 h1:y97T4mPCBDVRtUxMAWA9ZNXnTHA2p4YXFBDSkMrxr4U= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.14.12/go.mod h1:VrUvYb3ZCeUcJMIYmCJUjfwfyIFKOnXhdyfue/MSCIE= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.18.12 h1:jemAfH91rYzeDdNPDNdZHLSXxaXW5l1fcUT1+nRQ8cM= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.18.12/go.mod h1:X2UdAVE3dDmC83sWf9gXW3EL2mVjDCS4vRUctHz8GjM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12 h1:7iPTTX4SAI2U2VOogD7/gmHlsgnYSgoNHt7MSQXtG2M= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12/go.mod h1:1TODGhheLWjpQWSuhYuAUWYTCKwEjx2iblIFKDHjeTc= -github.com/aws/aws-sdk-go-v2/service/rds v1.24.0 h1:MdkVN+IfOrMdcD4fhoHOVabXqsN1fyiTWMIKJhGnLzQ= -github.com/aws/aws-sdk-go-v2/service/rds v1.24.0/go.mod h1:0+TdWzMBupUemfH+AlJ55BSD/KNPKyIcf5X3++cJOTA= -github.com/aws/aws-sdk-go-v2/service/redshift v1.26.4 h1:YB8FvFQNR4sybEU4BwoqtmtMkhrVHduq+5v1g0h3Dek= -github.com/aws/aws-sdk-go-v2/service/redshift v1.26.4/go.mod h1:ni/7gZjj90pk2dZ3WJxwHzOpNQlw/BniUJNPAh3iW7w= +github.com/aws/aws-sdk-go-v2/service/lambda v1.29.3 h1:Jjs5NrYKu52crBLi8+lL6h79NakoYASRYANhPktRz0U= +github.com/aws/aws-sdk-go-v2/service/lambda v1.29.3/go.mod h1:iPDYs5hrSZ+/8Ifoq9ZpoiuHZXDEJx9Udurdoq20958= github.com/aws/aws-sdk-go-v2/service/sso v1.11.17 h1:pXxu9u2z1UqSbjO9YA8kmFJBhFc1EVTDaf7A+S+Ivq8= github.com/aws/aws-sdk-go-v2/service/sso v1.11.17/go.mod h1:mS5xqLZc/6kc06IpXn5vRxdLaED+jEuaSRv5BxtnsiY= github.com/aws/aws-sdk-go-v2/service/sts v1.16.13 h1:dl8T0PJlN92rvEGOEUiD0+YPYdPEaCZK0TqHukvSfII= github.com/aws/aws-sdk-go-v2/service/sts v1.16.13/go.mod h1:Ru3QVMLygVs/07UQ3YDur1AQZZp2tUNje8wfloFttC0= github.com/aws/smithy-go v1.12.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.13.3 h1:l7LYxGuzK6/K+NzJ2mC+VvLUbae0sL3bXU//04MkmnA= -github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -142,12 +84,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -157,20 +93,13 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -184,8 +113,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -201,10 +128,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -218,17 +143,11 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -239,34 +158,17 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0 h1:zO8WHNx/MYiAKJ3d5spxZXZE6KHmIQGQcAzwUzV7qQw= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1 h1:kBRZU0PSuI7PspsSb/ChWoVResUcwNVIdpB049pKTiw= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -288,31 +190,24 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -339,7 +234,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -348,7 +242,6 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -356,8 +249,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88 h1:Tgea0cVUD0ivh5ADBX4WwuI12DUd2to3nCYe2eayMIw= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -381,7 +272,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -392,7 +282,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -424,20 +313,7 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591 h1:D0B/7al0LLrVC8aWF4+oxpv/m8bc7ViFfVS8/gXGdqI= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 h1:MgJ6t2zo8v0tbmLCueaCbF1RM+TtB0rs3Lv8DGtOIpY= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -449,20 +325,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1 h1:3VPzK7eqH25j7GYw5w6g/GzNRc0/fYtrxz27z1gD4W0= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -475,8 +337,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -508,49 +368,20 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -603,19 +434,10 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -636,29 +458,6 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.97.0 h1:x/vEL1XDF/2V4xzdNgFPaKHluRESo2aTsL7QzHnBtGQ= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.99.0 h1:tsBtOIklCE2OFxhmcYSVqGwSAN/Y897srxmcvAQnwK8= google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -692,7 +491,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -705,56 +503,7 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220405205423-9d709892a2bf/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220921223823-23cae91e6737 h1:K1zaaMdYBXRyX+cwFnxj7M6zwDyumLQMZ5xqwGvjreQ= -google.golang.org/genproto v0.0.0-20220921223823-23cae91e6737/go.mod h1:2r/26NEF3bFmT3eC3aZreahSal0C3Shl8Gi6vyDYqOQ= google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e h1:halCgTFuLWDRD61piiNSxPsARANGD3Xl16hPrLgLiIg= google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -770,29 +519,11 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0 h1:fPVVDxY9w++VjTZsYvXWqEf9Rqar/e+9zYfxKK+W+YU= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -805,8 +536,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -816,7 +545,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= From 5fd347d37d5a7b46f2ef41a63c9639cce3c65e49 Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Wed, 18 Oct 2023 16:47:41 -0500 Subject: [PATCH 09/10] adding quotas as a way to get vcpu count --- lw-inventory/cmd/azure.go | 8 +- lw-inventory/cmd/lwazure/azure.go | 337 ++++++++++++++++++++++-------- lw-inventory/helpers/utils.go | 4 + 3 files changed, 259 insertions(+), 90 deletions(-) diff --git a/lw-inventory/cmd/azure.go b/lw-inventory/cmd/azure.go index 90c194a..fdbae1e 100644 --- a/lw-inventory/cmd/azure.go +++ b/lw-inventory/cmd/azure.go @@ -12,13 +12,19 @@ var azureCmd = &cobra.Command{ Long: `Grab Azure Inventory`, Run: func(cmd *cobra.Command, args []string) { subscriptions := lwazure.ParseIgnoreSubscriptions(cmd) + includeLocations := lwazure.ParseIncludeLocations(cmd) + excludeLocations := lwazure.ParseExcludeLocations(cmd) debug := helpers.ParseDebug(cmd) - lwazure.Run(subscriptions, debug) + useQuotas := helpers.ParseUseQuotas(cmd) + lwazure.Run(subscriptions, debug, useQuotas, includeLocations, excludeLocations) }, } func init() { rootCmd.AddCommand(azureCmd) azureCmd.Flags().StringP("ignore-subscriptions", "i", "", "Azure subscriptions to ignore") + azureCmd.Flags().StringP("include-locations", "", "", "Azure locations to include") + azureCmd.Flags().StringP("exclude-locations", "", "", "Azure locations to exclude") azureCmd.Flags().BoolP("debug", "d", false, "Show Debug Logs") + azureCmd.Flags().BoolP("useQuotas", "q", false, "Use Quotas") } diff --git a/lw-inventory/cmd/lwazure/azure.go b/lw-inventory/cmd/lwazure/azure.go index 5079527..908e045 100644 --- a/lw-inventory/cmd/lwazure/azure.go +++ b/lw-inventory/cmd/lwazure/azure.go @@ -9,10 +9,54 @@ import ( "github.com/spf13/cobra" "os" "os/exec" + "strconv" "strings" ) +gi status +var defaultIncludedLocations = []string{ + "eastus", + "eastus2", + "westus", + "centralus", + "northcentralus", + "southcentralus", + "northeurope", + "westeurope", + "eastasia", + "southeastasia", + "japaneast", + "japanwest", + "australiaeast", + "australiasoutheast", + "australiacentral", + "brazilsouth", + "southindia", + "centralindia", + "westindia", + "canadacentral", + "canadaeast", + "westus2", + "westcentralus", + "uksouth", + "ukwest", + "koreacentral", + "koreasouth", + "francecentral", + "southafricanorth", + "uaenorth", + "switzerlandnorth", + "germanywestcentral", + "norwayeast", + "jioindiawest", + "westus3", + "swedencentral", + "qatarcentral", + "polandcentral", + "italynorth", + "israelcentral", +} -func Run(subscriptionsToIgnore []string, debug bool) { +func Run(subscriptionsToIgnore []string, debug bool, useQuotas bool, includeLocations []string, excludeLocations []string) { if debug { log.SetLevel(log.DebugLevel) } @@ -22,130 +66,155 @@ func Run(subscriptionsToIgnore []string, debug bool) { var vmOSCounts OSCounts var totalVCPUs int32 subscriptionsInventoried := 0 + for _, subscription := range subscriptions { if !helpers.Contains(subscriptionsToIgnore, subscription) { var subscriptionVMOSCounts OSCounts subscriptionsInventoried++ fmt.Println("Scanning Subscription", subscription) - setSubscription(subscription) - standardAgents := getStandardAgents() - enterpriseAgents := getEntepriseAgents() - scaleSets := getVMScaleSet() - rgs := getResourceGroups() - for _, group := range rgs { - getContainers(group) + + valid := setSubscription(subscription) + if !valid { + continue } - var locations []string - for _, vm := range standardAgents { - if !helpers.Contains(locations, vm.Location) { - locations = append(locations, vm.Location) + if useQuotas { + //locations := getLocations() + locations := defaultIncludedLocations + + if includeLocations != nil { + locations = includeLocations } - } - for _, vm := range scaleSets { - if !helpers.Contains(locations, vm.Location) { - locations = append(locations, vm.Location) + for _, l := range locations { + if helpers.Contains(excludeLocations, l) { + continue + } + + totalVCPUs += getUsage(l) + } + } else { + standardAgents := getStandardAgents() + enterpriseAgents := getEntepriseAgents() + scaleSets := getVMScaleSet() + rgs := getResourceGroups() + for _, group := range rgs { + getContainers(group) } - } - for _, vm := range enterpriseAgents { - if !helpers.Contains(locations, vm.Location) { - locations = append(locations, vm.Location) + var locations []string + for _, vm := range standardAgents { + if !helpers.Contains(locations, vm.Location) { + locations = append(locations, vm.Location) + } } - } - var vmSizes []MachineType - for _, location := range locations { - vmSizes = getVMSizesByLocation(location) - } + for _, vm := range scaleSets { + if !helpers.Contains(locations, vm.Location) { + locations = append(locations, vm.Location) + } + } - var standardAgentsWithvCPU []VMInfo - var vmvCPU int32 - for _, vm := range standardAgents { - for _, size := range vmSizes { - if vm.Location == size.Location && vm.VMSize == size.Name { - vm.vCPUs = size.vCPUs - vmvCPU += vm.vCPUs - totalVCPUs += size.vCPUs - standardAgentsWithvCPU = append(standardAgentsWithvCPU, vm) + for _, vm := range enterpriseAgents { + if !helpers.Contains(locations, vm.Location) { + locations = append(locations, vm.Location) } } - } - var scaleSetsWithvCPU []VMInfo - var scalesetvCPU int32 - for _, vm := range scaleSets { - for _, size := range vmSizes { - if vm.Location == size.Location && vm.VMSize == size.Name { - vm.vCPUs = size.vCPUs * vm.Quantity - scalesetvCPU += vm.vCPUs - totalVCPUs += vm.vCPUs - scaleSetsWithvCPU = append(scaleSetsWithvCPU, vm) + var vmSizes []MachineType + for _, location := range locations { + vmSizes = getVMSizesByLocation(location) + } + + var standardAgentsWithvCPU []VMInfo + var vmvCPU int32 + for _, vm := range standardAgents { + for _, size := range vmSizes { + if vm.Location == size.Location && vm.VMSize == size.Name { + vm.vCPUs = size.vCPUs + vmvCPU += vm.vCPUs + totalVCPUs += size.vCPUs + standardAgentsWithvCPU = append(standardAgentsWithvCPU, vm) + } } } - } - var enterpriseAgentsWithvCPU []VMInfo - var k8svCPU int32 - for _, vm := range enterpriseAgents { - for _, size := range vmSizes { - if vm.Location == size.Location && vm.VMSize == size.Name { - vm.vCPUs = size.vCPUs - k8svCPU += vm.vCPUs - totalVCPUs += size.vCPUs - enterpriseAgentsWithvCPU = append(enterpriseAgentsWithvCPU, vm) + var scaleSetsWithvCPU []VMInfo + var scalesetvCPU int32 + for _, vm := range scaleSets { + for _, size := range vmSizes { + if vm.Location == size.Location && vm.VMSize == size.Name { + vm.vCPUs = size.vCPUs * vm.Quantity + scalesetvCPU += vm.vCPUs + totalVCPUs += vm.vCPUs + scaleSetsWithvCPU = append(scaleSetsWithvCPU, vm) + } } } - } - fmt.Println("VM Counts", len(standardAgentsWithvCPU)) - fmt.Println("VM Scale Set Counts", len(scaleSetsWithvCPU)) - fmt.Println("AKS Counts", len(enterpriseAgentsWithvCPU)) + var enterpriseAgentsWithvCPU []VMInfo + var k8svCPU int32 + for _, vm := range enterpriseAgents { + for _, size := range vmSizes { + if vm.Location == size.Location && vm.VMSize == size.Name { + vm.vCPUs = size.vCPUs + k8svCPU += vm.vCPUs + totalVCPUs += size.vCPUs + enterpriseAgentsWithvCPU = append(enterpriseAgentsWithvCPU, vm) + } + } + } - fmt.Println("\nVM vCPU Counts", vmvCPU) - fmt.Println("VM Scale Set vCPU Counts", scalesetvCPU) - fmt.Println("AKS vCPU Counts", k8svCPU) + fmt.Println("VM Counts", len(standardAgentsWithvCPU)) + fmt.Println("VM Scale Set Counts", len(scaleSetsWithvCPU)) + fmt.Println("AKS Counts", len(enterpriseAgentsWithvCPU)) - for _, vm := range standardAgentsWithvCPU { - if vm.OS == "Linux" { - subscriptionVMOSCounts.Linux++ - } else { - subscriptionVMOSCounts.Windows++ - } - } + fmt.Println("\nVM vCPU Counts", vmvCPU) + fmt.Println("VM Scale Set vCPU Counts", scalesetvCPU) + fmt.Println("AKS vCPU Counts", k8svCPU) - for _, vm := range scaleSetsWithvCPU { - if vm.OS == "Linux" { - subscriptionVMOSCounts.Linux += vm.Quantity - } else { - subscriptionVMOSCounts.Windows += vm.Quantity + for _, vm := range standardAgentsWithvCPU { + if vm.OS == "Linux" { + subscriptionVMOSCounts.Linux++ + } else { + subscriptionVMOSCounts.Windows++ + } } - } - for _, vm := range enterpriseAgentsWithvCPU { - if vm.OS == "Linux" { - subscriptionVMOSCounts.Linux++ - } else { - subscriptionVMOSCounts.Windows++ + for _, vm := range scaleSetsWithvCPU { + if vm.OS == "Linux" { + subscriptionVMOSCounts.Linux += vm.Quantity + } else { + subscriptionVMOSCounts.Windows += vm.Quantity + } } - } - fmt.Println("\nVM OS Counts") - fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) - fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) + for _, vm := range enterpriseAgentsWithvCPU { + if vm.OS == "Linux" { + subscriptionVMOSCounts.Linux++ + } else { + subscriptionVMOSCounts.Windows++ + } + } - vmOSCounts.Linux += subscriptionVMOSCounts.Linux - vmOSCounts.Windows += subscriptionVMOSCounts.Windows + fmt.Println("\nVM OS Counts") + fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) + fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) + vmOSCounts.Linux += subscriptionVMOSCounts.Linux + vmOSCounts.Windows += subscriptionVMOSCounts.Windows + } } } fmt.Println("----------------------------------------------") fmt.Println("Total vCPUs", totalVCPUs) - fmt.Println("\nTotal VM OS Counts") - fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) - fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) + + if !useQuotas { + fmt.Println("\nTotal VM OS Counts") + fmt.Printf("Linux VMs %d\n", vmOSCounts.Linux) + fmt.Printf("Windows VMs %d\n", vmOSCounts.Windows) + } fmt.Println("\nNumber of Azure subscriptions Inventoried", subscriptionsInventoried) fmt.Println("----------------------------------------------") @@ -228,6 +297,32 @@ func ParseIgnoreSubscriptions(cmd *cobra.Command) []string { return subscriptions } +func ParseIncludeLocations(cmd *cobra.Command) []string { + includeFlag := helpers.GetFlagEnvironmentString(cmd, "include-locations", "include-locations", "", false) + var locations []string + if includeFlag != "" { + locTemp := strings.Split(includeFlag, ",") + for _, p := range locTemp { + trimmed := strings.TrimSpace(p) + locations = append(locations, trimmed) + } + } + return locations +} + +func ParseExcludeLocations(cmd *cobra.Command) []string { + excludeFlag := helpers.GetFlagEnvironmentString(cmd, "exclude-locations", "exclude-locations", "", false) + var locations []string + if excludeFlag != "" { + locTemp := strings.Split(excludeFlag, ",") + for _, p := range locTemp { + trimmed := strings.TrimSpace(p) + locations = append(locations, trimmed) + } + } + return locations +} + type getAKSNodesResponse struct { AgentPoolProfiles []struct { PowerState struct { @@ -279,7 +374,8 @@ func setSubscription(subscription string) bool { cmd.Stdout = buf cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { - helpers.Bail("error running az set subscription", err) + log.Errorln("error running az set subscription", err) + return false } return true @@ -453,3 +549,66 @@ func getSubscriptions() []string { return subscriptions } + +type getListLocationsResponse struct { + DisplayName string `json:"displayName"` + Name string `json:"name"` +} + +func getLocations() []string { + buf := bytes.NewBuffer([]byte{}) + + cmd := exec.Command("az", "account", "list-locations") + cmd.Stdout = buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + helpers.Bail("error running az account list-locations", err) + } + + response := []getListLocationsResponse{} + if err := json.NewDecoder(buf).Decode(&response); err != nil { + helpers.Bail("Error decoding list locations json", err) + } + + var locations []string + for _, location := range response { + locations = append(locations, location.Name) + } + + return locations +} + +type getListUsageResponse struct { + Value string `json:"currentValue"` + Name string `json:"localName"` +} + +func getUsage(location string) int32 { + buf := bytes.NewBuffer([]byte{}) + + cmd := exec.Command("az", "vm", "list-usage", "--location", location) + cmd.Stdout = buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + fmt.Errorf("error running az vm list-usage", err) + return 0 + } + + response := []getListUsageResponse{} + if err := json.NewDecoder(buf).Decode(&response); err != nil { + helpers.Bail("Error decoding list usage json", err) + } + + var vcpus int32 + for _, q := range response { + if q.Name == "Total Regional vCPUs" { + vcpu, err := strconv.ParseInt(q.Value, 10, 32) + if err != nil { + println(err) + } + vcpus = int32(vcpu) + } + } + fmt.Printf("%s: %d vCPUS\n", location, vcpus) + return vcpus +} diff --git a/lw-inventory/helpers/utils.go b/lw-inventory/helpers/utils.go index 3feb675..0c6eec5 100644 --- a/lw-inventory/helpers/utils.go +++ b/lw-inventory/helpers/utils.go @@ -27,6 +27,10 @@ func ParseDebug(cmd *cobra.Command) bool { return GetFlagEnvironmentBool(cmd, "debug", "debug", false) } +func ParseUseQuotas(cmd *cobra.Command) bool { + return GetFlagEnvironmentBool(cmd, "useQuotas", "useQuotas", false) +} + func GetFlagEnvironmentBool(cmd *cobra.Command, flag string, env string, required bool) bool { value, _ := cmd.Flags().GetBool(flag) return value From d623fb620f7fbe1e25df4d1946a686b8011fb35e Mon Sep 17 00:00:00 2001 From: Brian Byers Date: Wed, 18 Oct 2023 16:49:45 -0500 Subject: [PATCH 10/10] adding quotas as a way to get vcpu count --- lw-inventory/cmd/lwazure/azure.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lw-inventory/cmd/lwazure/azure.go b/lw-inventory/cmd/lwazure/azure.go index 908e045..e650fa8 100644 --- a/lw-inventory/cmd/lwazure/azure.go +++ b/lw-inventory/cmd/lwazure/azure.go @@ -12,7 +12,7 @@ import ( "strconv" "strings" ) -gi status + var defaultIncludedLocations = []string{ "eastus", "eastus2",