diff --git a/classic-azure-cs-botservice/Azure.BotService.csproj b/classic-azure-cs-botservice/Azure.BotService.csproj index 2390bd595..e1fff993a 100644 --- a/classic-azure-cs-botservice/Azure.BotService.csproj +++ b/classic-azure-cs-botservice/Azure.BotService.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/classic-azure-cs-botservice/BotStack.cs b/classic-azure-cs-botservice/BotStack.cs index 1cd7e0e5f..8a8db0857 100644 --- a/classic-azure-cs-botservice/BotStack.cs +++ b/classic-azure-cs-botservice/BotStack.cs @@ -7,6 +7,7 @@ using Pulumi.Azure.Bot; using Pulumi.Azure.Core; using Pulumi.AzureAD; +using Pulumi.AzureAD.Inputs; using Pulumi.Random; using Cognitive = Pulumi.Azure.Cognitive; using Storage = Pulumi.Azure.Storage; @@ -27,15 +28,11 @@ public BotStack() AccountTier = "Standard" }); - var appServicePlan = new Plan("asp", new PlanArgs + var appServicePlan = new ServicePlan("asp", new ServicePlanArgs { ResourceGroupName = resourceGroup.Name, - Kind = "App", - Sku = new PlanSkuArgs - { - Tier = "Basic", - Size = "B1" - } + OsType = "Linux", + SkuName = "B1", }); var container = new Storage.Container("zips", new Storage.ContainerArgs @@ -75,57 +72,52 @@ public BotStack() var msa = new Application("msapp", new ApplicationArgs { - Oauth2AllowImplicitFlow = false, - AvailableToOtherTenants = true, - PublicClient = true, + PublicClient = new ApplicationPublicClientArgs + { + RedirectUris = + { + "https://address1.com", + }, + }, + FallbackPublicClientEnabled = true, DisplayName = "msapp" }); - var pwd = new RandomPassword("password", new RandomPasswordArgs - { - Length = 16, - MinNumeric = 1, - MinSpecial = 1, - MinUpper = 1, - MinLower = 1 - }); - - var msaSecret = new ApplicationPassword("msasecret", new ApplicationPasswordArgs + var msaSecret = new ApplicationPassword("msasecret", new Pulumi.AzureAD.ApplicationPasswordArgs { - ApplicationObjectId = msa.ObjectId, - EndDateRelative = "8640h", - Value = pwd.Result + ApplicationId = msa.Id, }); - var app = new AppService("app", new AppServiceArgs + var app = new LinuxWebApp("app", new LinuxWebAppArgs { ResourceGroupName = resourceGroup.Name, - AppServicePlanId = appServicePlan.Id, + ServicePlanId = appServicePlan.Id, AppSettings = { {"WEBSITE_RUN_FROM_PACKAGE", codeBlobUrl}, - {"MicrosoftAppId", msa.ApplicationId}, + {"MicrosoftAppId", msa.Id}, {"MicrosoftAppPassword", msaSecret.Value}, {"LuisApiKey", luis.PrimaryAccessKey}, }, - HttpsOnly = true + HttpsOnly = true, + SiteConfig = new LinuxWebAppSiteConfigArgs { }, }); var bot = new WebApp(botName, new WebAppArgs { DisplayName = botName, - MicrosoftAppId = msa.ApplicationId, + MicrosoftAppId = msa.Id, ResourceGroupName = resourceGroup.Name, Sku = "F0", Location = "global", - Endpoint = Output.Format($"https://{app.DefaultSiteHostname}/api/messages"), + Endpoint = Output.Format($"https://{app.DefaultHostname}/api/messages"), DeveloperAppInsightsApiKey = appInsightApiKey.Key, DeveloperAppInsightsApplicationId = appInsights.AppId, DeveloperAppInsightsKey = appInsights.InstrumentationKey }); this.BotEndpoint = bot.Endpoint; - this.MicrosoftAppId = msa.ApplicationId; + this.MicrosoftAppId = msa.Id; this.MicrosoftAppPassword = msaSecret.Value; } diff --git a/classic-azure-cs-botservice/Pulumi.yaml b/classic-azure-cs-botservice/Pulumi.yaml index d0baae8d5..6856701a8 100644 --- a/classic-azure-cs-botservice/Pulumi.yaml +++ b/classic-azure-cs-botservice/Pulumi.yaml @@ -6,5 +6,7 @@ template: azure:location: description: Azure DC region default: North Europe + azure:subscriptionId: + description: The Azure Subscription to deploy into botName: description: Microsoft Azure Bot Name \ No newline at end of file diff --git a/classic-azure-cs-botservice/README.md b/classic-azure-cs-botservice/README.md index 690ea1e5c..e4144f86c 100644 --- a/classic-azure-cs-botservice/README.md +++ b/classic-azure-cs-botservice/README.md @@ -21,41 +21,42 @@ To deploy your infrastructure, follow the below steps. ### Publish Bot Steps -1. Within the **/bot** subfolder, publish the bot to subfolder called publish: +1. Within the **/bot** subfolder, publish the bot to subfolder called publish: ```bash - $ dotnet publish -o publish + dotnet publish -o publish ``` ### Pulumi Steps -1. Within the **azure-cs-botservice** folder, create a new stack: +1. Within the **azure-cs-botservice** folder, create a new stack: ```bash - $ pulumi stack init dev + pulumi stack init dev ``` -2. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): ```bash - $ az login + az login ``` -3. Configure the location to deploy the resources to: +1. Configure the location to deploy the resources to: ```bash - $ pulumi config set azure:location "North Europe" + pulumi config set azure:location "North Europe" + pulumi config set azure:subscriptionId ``` -4. Configure the Bot Name: +1. Configure the Bot Name: ```bash - $ pulumi config set botName PulumiBot1 + pulumi config set botName PulumiBot1 ``` -5. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ```bash + ```console $ pulumi up Previewing changes: ... @@ -67,20 +68,20 @@ To deploy your infrastructure, follow the below steps. Update duration: 1m22s ``` -6. Check the deployed bot using either: +1. Check the deployed bot using either: - * Azure Portal Azure Bot Service - [Test in Webchat feature](https://docs.microsoft.com/en-us/azure/bot-service/abs-quickstart?view=azure-bot-service-4.0#test-the-bot) - * [Bot Framework Emulator](https://github.com/Microsoft/BotFramework-Emulator) pointing to the output bot endpoint and Microsoft Application Id and the secret you supplied: + * Azure Portal Azure Bot Service - [Test in Webchat feature](https://docs.microsoft.com/en-us/azure/bot-service/abs-quickstart?view=azure-bot-service-4.0#test-the-bot) + * [Bot Framework Emulator](https://github.com/Microsoft/BotFramework-Emulator) pointing to the output bot endpoint and Microsoft Application Id and the secret you supplied: - ```bash - $ BotEndpoint: "https://app8asdf.azurewebsites.net/api/messages" - $ MicrosoftAppId: "b5e65403-923c-4568-z2f6-a6f41b258azz" - $ MicrosoftAppPassword: "" - ``` + ```yaml + BotEndpoint: "https://app8asdf.azurewebsites.net/api/messages" + MicrosoftAppId: "b5e65403-923c-4568-z2f6-a6f41b258azz" + MicrosoftAppPassword: "" + ``` -7. Once you've finished, you can tear down your stack's resources by destroying and removing it: +1. Once you've finished, you can tear down your stack's resources by destroying and removing it: ```bash - $ pulumi destroy -y - $ pulumi stack rm -y + pulumi destroy -y + pulumi stack rm -y ``` diff --git a/classic-azure-cs-cosmosapp-component/.gitignore b/classic-azure-cs-cosmosapp-component/.gitignore deleted file mode 100644 index e64527066..000000000 --- a/classic-azure-cs-cosmosapp-component/.gitignore +++ /dev/null @@ -1,353 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ diff --git a/classic-azure-cs-cosmosapp-component/ArchiveFunctionApp.cs b/classic-azure-cs-cosmosapp-component/ArchiveFunctionApp.cs deleted file mode 100644 index cc6a31722..000000000 --- a/classic-azure-cs-cosmosapp-component/ArchiveFunctionApp.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2016-2018, Pulumi Corporation. All rights reserved. - -using System.Collections.Generic; - -using Pulumi; -using Pulumi.Azure.AppService; -using Pulumi.Azure.AppService.Inputs; -using Pulumi.Azure.Storage; - -public class ArchiveFunctionApp : ComponentResource -{ - public Output AppId { get; private set; } = null!; - - public ArchiveFunctionApp(string name, ArchiveFunctionAppArgs args, ComponentResourceOptions? options = null) - : base("examples:azure:ArchiveFunctionApp", name, options) - { - var opts = new CustomResourceOptions { Parent = this }; - - var storageAccount = new Account($"sa{args.Location}", new AccountArgs - { - ResourceGroupName = args.ResourceGroupName, - Location = args.Location, - AccountReplicationType = "LRS", - AccountTier = "Standard", - }, opts); - - var appServicePlan = new Plan($"asp-{args.Location}", new PlanArgs - { - ResourceGroupName = args.ResourceGroupName, - Location = args.Location, - Kind = "FunctionApp", - Sku = new PlanSkuArgs - { - Tier = "Dynamic", - Size = "Y1", - }, - }, opts); - - var container = new Container($"zips-{args.Location}", new ContainerArgs - { - StorageAccountName = storageAccount.Name, - ContainerAccessType = "private", - }, opts); - - var blob = new Blob($"zip-{args.Location}", new BlobArgs - { - StorageAccountName = storageAccount.Name, - StorageContainerName = container.Name, - Type = "Block", - Source = args.Archive, - }, opts); - - var codeBlobUrl = SharedAccessSignature.SignedBlobReadUrl(blob, storageAccount); - - args.AppSettings.Add("runtime", "dotnet"); - args.AppSettings.Add("WEBSITE_RUN_FROM_PACKAGE", codeBlobUrl); - - var app = new FunctionApp($"app-{args.Location}", new FunctionAppArgs - { - ResourceGroupName = args.ResourceGroupName, - Location = args.Location, - AppServicePlanId = appServicePlan.Id, - AppSettings = args.AppSettings, - StorageConnectionString = storageAccount.PrimaryConnectionString, - Version = "~2", - }, opts); - - this.AppId = app.Id; - } -} - -public class ArchiveFunctionAppArgs -{ - public Input ResourceGroupName { get; set; } = null!; - public string Location { get; set; } = null!; - public Input Archive { get; set; } = null!; - - private InputMap? _appSettings; - public InputMap AppSettings - { - get => _appSettings ?? (_appSettings = new InputMap()); - set => _appSettings = value; - } -} diff --git a/classic-azure-cs-cosmosapp-component/Azure.CosmosAppComponent.csproj b/classic-azure-cs-cosmosapp-component/Azure.CosmosAppComponent.csproj deleted file mode 100644 index d5c143cfb..000000000 --- a/classic-azure-cs-cosmosapp-component/Azure.CosmosAppComponent.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - Exe - net6.0 - enable - - - - - - - - - - $(DefaultItemExcludes);app\**\* - - - diff --git a/classic-azure-cs-cosmosapp-component/Containers.cs b/classic-azure-cs-cosmosapp-component/Containers.cs deleted file mode 100644 index 4fd414d64..000000000 --- a/classic-azure-cs-cosmosapp-component/Containers.cs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2016-2020, Pulumi Corporation. All rights reserved. - -using Pulumi; -using Pulumi.Azure.ContainerService; -using Pulumi.Azure.ContainerService.Inputs; -using Pulumi.Azure.Core; -using Pulumi.Docker; - -public static class Containers -{ - public static Output Run() - { - // Read a list of target locations from the config file: - // Expecting a comma-separated list, e.g., "westus,eastus,westeurope" - var locations = new Pulumi.Config().Require("locations").Split(","); - - var resourceGroup = new ResourceGroup("cosmosaci-rg", new ResourceGroupArgs {Location = locations[0]}); - - var app = new CosmosApp("aci", new CosmosAppArgs - { - ResourceGroup = resourceGroup, - Locations = locations, - DatabaseName = "pricedb", - ContainerName = "prices", - Factory = global => - { - var registry = new Registry("global", new RegistryArgs - { - ResourceGroupName = resourceGroup.Name, - AdminEnabled = true, - Sku = "Premium", - }, global.Options); - - var dockerImage = new Image("node-app", new ImageArgs - { - ImageName = Output.Format($"{registry.LoginServer}/mynodeapp:v1.0.0"), - Build = "./container", - Registry = new ImageRegistry - { - Server = registry.LoginServer, - Username = registry.AdminUsername, - Password = registry.AdminPassword, - }, - }, new ComponentResourceOptions {Parent = registry}); - - return region => - { - var connectionString = global.CosmosAccount.ConnectionStrings.Apply(cs => cs[0]); - var group = new Group($"aci-{region.Location}", new GroupArgs - { - ResourceGroupName = resourceGroup.Name, - Location = region.Location, - ImageRegistryCredentials = - { - new GroupImageRegistryCredentialArgs - { - Server = registry.LoginServer, - Username = registry.AdminUsername, - Password = registry.AdminPassword, - } - }, - OsType = "Linux", - Containers = - { - new GroupContainerArgs - { - Cpu = 0.5, - Image = dockerImage.ImageName, - Memory = 1.5, - Name = "hello-world", - Ports = - { - new GroupContainerPortArgs - { - Port = 80, - Protocol = "TCP", - } - }, - EnvironmentVariables = - { - {"ENDPOINT", global.CosmosAccount.Endpoint}, - {"MASTER_KEY", global.CosmosAccount.PrimaryMasterKey}, - {"DATABASE", global.Database.Name}, - {"COLLECTION", global.Container.Name}, - {"LOCATION", region.Location}, - }, - }, - }, - IpAddressType = "public", - DnsNameLabel = $"acishop-{region.Location}", - }, global.Options); - - return new ExternalEndpoint(group.Fqdn); - }; - } - }); - - return Output.Format($"{app.Endpoint}/cosmos"); - } -} diff --git a/classic-azure-cs-cosmosapp-component/CosmosApp.cs b/classic-azure-cs-cosmosapp-component/CosmosApp.cs deleted file mode 100644 index 47b449f39..000000000 --- a/classic-azure-cs-cosmosapp-component/CosmosApp.cs +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2016-2018, Pulumi Corporation. All rights reserved. - -using System; -using System.Collections.Immutable; -using System.Linq; - -using Pulumi; -using Pulumi.Azure.Core; -using Pulumi.Azure.CosmosDB; -using Pulumi.Azure.CosmosDB.Inputs; -using Pulumi.Azure.Network; -using Pulumi.Azure.Network.Inputs; - -public class GlobalContext -{ - public ResourceGroup ResourceGroup { get; } - public Account CosmosAccount { get; } - public SqlDatabase Database { get; } - public SqlContainer Container { get; } - public CustomResourceOptions Options { get; } - - internal GlobalContext(ResourceGroup resourceGroup, Account cosmosAccount, SqlDatabase database, SqlContainer container, CustomResourceOptions options) - { - this.ResourceGroup = resourceGroup; - this.CosmosAccount = cosmosAccount; - this.Database = database; - this.Container = container; - this.Options = options; - } -} - -public class RegionalContext -{ - public string Location { get; } - - internal RegionalContext(string location) - { - this.Location = location; - } -} - -public interface IRegionalEndpoint -{ - // Type of the endpoint - Input Type { get; } - // Azure resource ID (App Service and Public IP are supported) - Input? Id { get; } - // An arbitrary URL for other resource types - Input? Url { get; } -} - -public class AzureEndpoint : IRegionalEndpoint -{ - public Input Type => "azureEndpoints"; - - public Input Id { get; } - - public Input? Url => null; - - public AzureEndpoint(Input id) - { - this.Id = id; - } -} - -public class ExternalEndpoint : IRegionalEndpoint -{ - public Input Type => "externalEndpoints"; - - public Input? Id => null; - - public Input Url { get; } - - public ExternalEndpoint(Input url) - { - this.Url = url; - } -} - -public class CosmosAppArgs -{ - public ResourceGroup ResourceGroup { get; set; } = null!; - public string[] Locations { get; set; } = null!; - public Func> Factory { get; set; } = null!; - public Input DatabaseName { get; set; } = null!; - public Input ContainerName { get; set; } = null!; - public Input? EnableMultiMaster { get; set; } -} - -public class CosmosApp : ComponentResource -{ - public Output Endpoint { get; private set; } = null!; - - public CosmosApp(string name, CosmosAppArgs args, ComponentResourceOptions? options = null) - : base("examples:azure:CosmosApp", name, options) - { - var resourceGroup = args.ResourceGroup; - var locations = args.Locations; - var primaryLocation = locations[0]; - var parentOptions = new CustomResourceOptions { Parent = this }; - - // Cosmos DB Account with multiple replicas - var cosmosAccount = new Account($"cosmos-{name}", - new AccountArgs - { - ResourceGroupName = resourceGroup.Name, - Location = primaryLocation, - GeoLocations = locations.Select((l, i) => new AccountGeoLocationArgs { Location = l, FailoverPriority = i }).ToArray(), - OfferType = "Standard", - ConsistencyPolicy = new AccountConsistencyPolicyArgs { ConsistencyLevel = "Session" }, - EnableMultipleWriteLocations = args.EnableMultiMaster, - }, - parentOptions); - - var database = new SqlDatabase($"db-{name}", - new SqlDatabaseArgs - { - ResourceGroupName = resourceGroup.Name, - AccountName = cosmosAccount.Name, - Name = args.DatabaseName, - }, - parentOptions); - - var container = new SqlContainer($"sql-{name}", - new SqlContainerArgs - { - ResourceGroupName = resourceGroup.Name, - AccountName = cosmosAccount.Name, - DatabaseName = database.Name, - Name = args.ContainerName, - }, - parentOptions); - - // Traffic Manager as a global HTTP endpoint - var profile = new TrafficManagerProfile($"tm{name}", - new TrafficManagerProfileArgs - { - ResourceGroupName = resourceGroup.Name, - TrafficRoutingMethod = "Performance", - DnsConfig = new TrafficManagerProfileDnsConfigArgs - { - // Subdomain must be globally unique, so we default it with the full resource group name - RelativeName = Output.Format($"{name}{resourceGroup.Name}"), - Ttl = 60, - }, - MonitorConfig = new TrafficManagerProfileMonitorConfigArgs - { - Protocol = "HTTP", - Port = 80, - Path = "/api/ping", - } - }, - parentOptions); - - var globalContext = new GlobalContext(resourceGroup, cosmosAccount, database, container, parentOptions); - var buildLocation = args.Factory(globalContext); - var endpointOptions = new CustomResourceOptions { Parent = profile, DeleteBeforeReplace = true }; - - var endpoints = locations.Select(location => - { - var app = buildLocation(new RegionalContext(location)); - - return new TrafficManagerEndpoint($"tm{name}{location}".Truncate(16), - new TrafficManagerEndpointArgs - { - ResourceGroupName = resourceGroup.Name, - ProfileName = profile.Name, - Type = app.Type, - TargetResourceId = app.Id, - Target = app.Url, - EndpointLocation = location, - }, - endpointOptions); - }).ToList(); - - this.Endpoint = Output.Format($"http://{profile.Fqdn}"); - this.RegisterOutputs(); - } -} diff --git a/classic-azure-cs-cosmosapp-component/DemoStack.cs b/classic-azure-cs-cosmosapp-component/DemoStack.cs deleted file mode 100644 index 87af3bfad..000000000 --- a/classic-azure-cs-cosmosapp-component/DemoStack.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2016-2020, Pulumi Corporation. All rights reserved. - -using Pulumi; - -class DemoStack : Stack -{ - public DemoStack() - { - this.FunctionsEndpoint = Functions.Run(); - this.ContainersEndpoint = Containers.Run(); - this.VmssEndpoint = VmScaleSets.Run(); - } - - [Output] public Output FunctionsEndpoint { get; set; } - - [Output] public Output ContainersEndpoint { get; set; } - - [Output] public Output VmssEndpoint { get; set; } -} diff --git a/classic-azure-cs-cosmosapp-component/Extensions.cs b/classic-azure-cs-cosmosapp-component/Extensions.cs deleted file mode 100644 index 1b05271aa..000000000 --- a/classic-azure-cs-cosmosapp-component/Extensions.cs +++ /dev/null @@ -1,8 +0,0 @@ -public static class Extensions -{ - public static string Truncate(this string value, int maxLength) - { - if (string.IsNullOrEmpty(value)) return value; - return value.Length <= maxLength ? value : value.Substring(0, maxLength); - } -} \ No newline at end of file diff --git a/classic-azure-cs-cosmosapp-component/Functions.cs b/classic-azure-cs-cosmosapp-component/Functions.cs deleted file mode 100644 index 8da521ec4..000000000 --- a/classic-azure-cs-cosmosapp-component/Functions.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2016-2020, Pulumi Corporation. All rights reserved. - -using Pulumi; -using Pulumi.Azure.Core; - -public static class Functions -{ - public static Output Run() - { - // Read a list of target locations from the config file: - // Expecting a comma-separated list, e.g., "westus,eastus,westeurope" - var locations = new Config().Require("locations").Split(","); - - var resourceGroup = new ResourceGroup("cosmosfunctions-rg", new ResourceGroupArgs {Location = locations[0]}); - - var app = new CosmosApp("functions", new CosmosAppArgs - { - ResourceGroup = resourceGroup, - Locations = locations, - DatabaseName = "pricedb", - ContainerName = "prices", - Factory = global => region => - { - var connectionString = global.CosmosAccount.ConnectionStrings.Apply(cs => cs[0]); - var func = new ArchiveFunctionApp($"afa-{region.Location}", new ArchiveFunctionAppArgs - { - ResourceGroupName = resourceGroup.Name, - Location = region.Location, - Archive = new FileArchive("./app/bin/Debug/net6.0/publish"), - AppSettings = - { - {"CosmosDBConnection", connectionString}, - }, - }, - new ComponentResourceOptions {Parent = global.Options.Parent}); - - return new AzureEndpoint(func.AppId); - }, - }); - - return Output.Format($"{app.Endpoint}/cosmos"); - } -} diff --git a/classic-azure-cs-cosmosapp-component/Program.cs b/classic-azure-cs-cosmosapp-component/Program.cs deleted file mode 100644 index ce24073e1..000000000 --- a/classic-azure-cs-cosmosapp-component/Program.cs +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2016-2020, Pulumi Corporation. All rights reserved. - -using System.Threading.Tasks; -using Pulumi; - -class Program -{ - static Task Main() => Deployment.RunAsync(); -} diff --git a/classic-azure-cs-cosmosapp-component/Pulumi.yaml b/classic-azure-cs-cosmosapp-component/Pulumi.yaml deleted file mode 100644 index 1df1ff69b..000000000 --- a/classic-azure-cs-cosmosapp-component/Pulumi.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: azure-cs-cosmosapp-component -description: Reusable Component to Create Globally-distributed Applications with Azure Cosmos DB -runtime: dotnet -template: - config: - locations: - description: Comma-separated list of Azure regions - default: westus,westeurope diff --git a/classic-azure-cs-cosmosapp-component/README.md b/classic-azure-cs-cosmosapp-component/README.md deleted file mode 100644 index e97f09a5e..000000000 --- a/classic-azure-cs-cosmosapp-component/README.md +++ /dev/null @@ -1,96 +0,0 @@ -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-cs-cosmosapp-component/README.md#gh-light-mode-only) -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-cs-cosmosapp-component/README.md#gh-dark-mode-only) - -# Reusable Component to Create Globally-distributed Applications with Azure Cosmos DB - -This example demonstrates the usage of Pulumi to create globally-distributed applications with Azure Cosmos DB as the backend and pluggable infrastrustructure as the web tier. - -The application shows several notable features: - -1. Easy global deployments - a config setting provides a list of all the regions to deploy and a single execution deploys across them all. -2. Abstraction - the `CosmosApp` component - abstracts away all the common logic for a global app with Cosmos DB multi-region data distribution and Traffic Manager for routing the traffic. -3. Multi-model - an implementation example is currently provided for serverless functions and virtual machines. - -## `CosmosApp` component - -The [`CosmosApp`](CosmosApp.cs) defines a skeleton for the application. While not limiting the type of compute resources, it creates the multi-regional pieces of the infrastructure: - -![Cosmos App](https://github.com/mikhailshilkov/pulumi-cosmos/raw/master/pictures/globalapp.png) - -## Deploying the App - -To deploy your infrastructure, follow the below steps. - -### Prerequisites - -1. [Install Pulumi](https://www.pulumi.com/docs/get-started/install/) -2. [Install .NET Core 3.0+](https://dotnet.microsoft.com/download) - -### Steps - -#### Step 1: Create a new stack - -``` -$ pulumi stack init dev -``` - -#### Step 2: Log in to the Azure CLI - -You will be prompted to do this during deployment if you forget this step. - -``` -$ az login -``` - -#### Step 3: Build and publish the Azure Functions project: - - ``` - $ dotnet publish app - ``` - -#### Step 4: Configure the list of regions to deploy to - -``` -$ pulumi config set azure:location westus -$ pulumi config set locations westus,westeurope -``` - -#### Step 5: Deploy your changes - -Run `pulumi up` to preview and deploy changes: - -``` -$ pulumi up -Previewing changes: -+ azure-cs-cosmosapp-component-dev create -+ examples:azure:CosmosApp vms create -+ azure:network:VirtualNetwork vnet-westeurope create -+ azure:network:PublicIp pip-westeurope create -+ azure:trafficmanager:Profile tmvms create -+ azure:trafficmanager:Endpoint tmvmswesteurope create -+ azure:cosmosdb:Account cosmos-vms -... -``` - -### Step 6: Check the deployed website endpoints - -Three endpoints are now available. For example, - -``` -$ pulumi stack output VmssEndpoint -http://vmssrgcc15ea50.trafficmanager.net/cosmos - -$ curl "$(pulumi stack output VmssEndpoint)" -Document 'cosmos' not found -``` - -Go to the Azure portal and add a document with the ID "cosmos" to receive a non-empty response. - -### Step 7: Clean up - -Once you've finished experimenting, tear down your stack's resources by destroying and removing it: - -```bash -$ pulumi destroy --yes -$ pulumi stack rm --yes -``` diff --git a/classic-azure-cs-cosmosapp-component/VmScaleSets.cs b/classic-azure-cs-cosmosapp-component/VmScaleSets.cs deleted file mode 100644 index fb4759d19..000000000 --- a/classic-azure-cs-cosmosapp-component/VmScaleSets.cs +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2016-2020, Pulumi Corporation. All rights reserved. - -using System; -using System.IO; -using Pulumi; -using Pulumi.Azure.Compute; -using Pulumi.Azure.Compute.Inputs; -using Pulumi.Azure.Core; -using Pulumi.Azure.Lb; -using Pulumi.Azure.Lb.Inputs; -using Pulumi.Azure.Monitoring; -using Pulumi.Azure.Monitoring.Inputs; -using Pulumi.Azure.Network; - -public static class VmScaleSets -{ - public static Output Run() - { - // Read a list of target locations from the config file: - // Expecting a comma-separated list, e.g., "westus,eastus,westeurope" - var locations = new Config().Require("locations").Split(","); - - var resourceGroup = new ResourceGroup("cosmosvms-rg", new ResourceGroupArgs {Location = locations[0]}); - - var vmss = new CosmosApp("vmss", new CosmosAppArgs - { - ResourceGroup = resourceGroup, - Locations = locations, - DatabaseName = "pricedb", - ContainerName = "prices", - Factory = new Builder(resourceGroup).BuildVMScaleSetApp, - }); - - return Output.Format($"{vmss.Endpoint}/cosmos"); - } - - private class Builder - { - private ResourceGroup resourceGroup; - - public Builder(ResourceGroup resourceGroup) - { - this.resourceGroup = resourceGroup; - } - - public Func BuildVMScaleSetApp(GlobalContext context) - { - var options = - CustomResourceOptions.Merge(context.Options, new CustomResourceOptions {DeleteBeforeReplace = true}); - var file = File.ReadAllText("./vm/vmCustomData.yaml"); - return (RegionalContext region) => - { - var location = region.Location; - var domainName = $"rnddnplm{location}"; //TODO: random - - var publicIp = new PublicIp($"pip-{location}", new PublicIpArgs - { - ResourceGroupName = resourceGroup.Name, - Location = location, - AllocationMethod = "Static", - DomainNameLabel = domainName, - }, - options); - - var loadBalancer = new LoadBalancer($"lb-{location}", new LoadBalancerArgs - { - ResourceGroupName = resourceGroup.Name, - Location = location, - FrontendIpConfigurations = - { - new LoadBalancerFrontendIpConfigurationArgs - { - Name = "PublicIPAddress", - PublicIpAddressId = publicIp.Id, - } - } - }, - options); - - var bpepool = new BackendAddressPool($"bap-{location}", new BackendAddressPoolArgs - { - ResourceGroupName = resourceGroup.Name, - LoadbalancerId = loadBalancer.Id, - }, - options); - - var probe = new Probe($"ssh-probe-{location}".Truncate(16), new ProbeArgs - { - ResourceGroupName = resourceGroup.Name, - LoadbalancerId = loadBalancer.Id, - Port = 80, - }, - options); - - var rule = new Rule($"rule-{location}", new RuleArgs - { - ResourceGroupName = resourceGroup.Name, - BackendAddressPoolId = bpepool.Id, - BackendPort = 80, - FrontendIpConfigurationName = "PublicIPAddress", - FrontendPort = 80, - LoadbalancerId = loadBalancer.Id, - ProbeId = probe.Id, - Protocol = "Tcp", - }, - options); - - var vnet = new VirtualNetwork($"vnet-{location}", new VirtualNetworkArgs - { - ResourceGroupName = resourceGroup.Name, - Location = location, - AddressSpaces = {"10.0.0.0/16"}, - }, - options); - - var subnet = new Subnet($"subnet-{location}", new SubnetArgs - { - ResourceGroupName = resourceGroup.Name, - AddressPrefix = "10.0.2.0/24", - VirtualNetworkName = vnet.Name, - }, - options); - - var customData = Output.All(context.CosmosAccount.Endpoint, - context.CosmosAccount.PrimaryMasterKey, context.Database.Name, context.Container.Name) - .Apply(values => - { - return file.Replace("${ENDPOINT}", values[0]) - .Replace("${MASTER_KEY}", values[1]) - .Replace("${DATABASE}", values[2]) - .Replace("${COLLECTION}", values[3]) - .Replace("${LOCATION}", location); - }); - - var scaleSet = new ScaleSet($"vmss-{location}", new ScaleSetArgs - { - ResourceGroupName = resourceGroup.Name, - Location = location, - NetworkProfiles = - { - new ScaleSetNetworkProfileArgs - { - IpConfigurations = - { - new ScaleSetNetworkProfileIpConfigurationArgs - { - LoadBalancerBackendAddressPoolIds = {bpepool.Id}, - Name = "IPConfiguration", - Primary = true, - SubnetId = subnet.Id, - } - }, - Name = "networkprofile", - Primary = true, - } - }, - OsProfile = new ScaleSetOsProfileArgs - { - AdminUsername = "neo", - AdminPassword = "SEcurePwd$3", - ComputerNamePrefix = "lab", - CustomData = customData, - }, - OsProfileLinuxConfig = new ScaleSetOsProfileLinuxConfigArgs - {DisablePasswordAuthentication = false}, - Sku = new ScaleSetSkuArgs - { - Capacity = 1, - Name = "Standard_DS1_v2", - Tier = "Standard", - }, - StorageProfileDataDisks = - { - new ScaleSetStorageProfileDataDiskArgs - { - Caching = "ReadWrite", - CreateOption = "Empty", - DiskSizeGb = 10, - Lun = 0, - } - }, - StorageProfileImageReference = new ScaleSetStorageProfileImageReferenceArgs - { - Offer = "UbuntuServer", - Publisher = "Canonical", - Sku = "18.04-LTS", - Version = "latest", - }, - StorageProfileOsDisk = new ScaleSetStorageProfileOsDiskArgs - { - Caching = "ReadWrite", - CreateOption = "FromImage", - ManagedDiskType = "Standard_LRS", - Name = "", - }, - UpgradePolicyMode = "Automatic", - }, - CustomResourceOptions.Merge(options, new CustomResourceOptions {DependsOn = {bpepool, rule}})); - - var autoscale = new AutoscaleSetting($"as-{location}", new AutoscaleSettingArgs - { - ResourceGroupName = resourceGroup.Name, - Location = location, - Notification = new AutoscaleSettingNotificationArgs - { - Email = new AutoscaleSettingNotificationEmailArgs - { - CustomEmails = {"admin@contoso.com"}, - SendToSubscriptionAdministrator = true, - SendToSubscriptionCoAdministrator = true, - }, - }, - Profiles = - { - new AutoscaleSettingProfileArgs - { - Capacity = new AutoscaleSettingProfileCapacityArgs - { - Default = 1, - Maximum = 10, - Minimum = 1, - }, - Name = "defaultProfile", - Rules = - { - new AutoscaleSettingProfileRuleArgs - { - MetricTrigger = new AutoscaleSettingProfileRuleMetricTriggerArgs - { - MetricName = "Percentage CPU", - MetricResourceId = scaleSet.Id, - Operator = "GreaterThan", - Statistic = "Average", - Threshold = 75, - TimeAggregation = "Average", - TimeGrain = "PT1M", - TimeWindow = "PT5M", - }, - ScaleAction = new AutoscaleSettingProfileRuleScaleActionArgs - { - Cooldown = "PT1M", - Direction = "Increase", - Type = "ChangeCount", - Value = 1, - }, - }, - new AutoscaleSettingProfileRuleArgs - { - MetricTrigger = new AutoscaleSettingProfileRuleMetricTriggerArgs - { - MetricName = "Percentage CPU", - MetricResourceId = scaleSet.Id, - Operator = "LessThan", - Statistic = "Average", - Threshold = 25, - TimeAggregation = "Average", - TimeGrain = "PT1M", - TimeWindow = "PT5M", - }, - ScaleAction = new AutoscaleSettingProfileRuleScaleActionArgs - { - Cooldown = "PT1M", - Direction = "Decrease", - Type = "ChangeCount", - Value = 1, - }, - }, - } - } - }, - TargetResourceId = scaleSet.Id, - }, - options); - - return new AzureEndpoint(publicIp.Id); - }; - } - } -} diff --git a/classic-azure-cs-cosmosapp-component/app/Functions.csproj b/classic-azure-cs-cosmosapp-component/app/Functions.csproj deleted file mode 100644 index b3bb6b921..000000000 --- a/classic-azure-cs-cosmosapp-component/app/Functions.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - net6.0 - v3 - - - - - - - - - - PreserveNewest - - - PreserveNewest - Never - - - - diff --git a/classic-azure-cs-cosmosapp-component/app/Hello.cs b/classic-azure-cs-cosmosapp-component/app/Hello.cs deleted file mode 100644 index 37969fb08..000000000 --- a/classic-azure-cs-cosmosapp-component/app/Hello.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Azure.WebJobs; -using Microsoft.Azure.WebJobs.Extensions.Http; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; - -namespace Functions -{ - public static class MyFunctions - { - [FunctionName("Hello")] - public static async Task Hello( - [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, - ILogger log) - { - log.LogInformation("C# HTTP trigger function processed a request."); - - string name = req.Query["name"]; - - string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); - dynamic data = JsonConvert.DeserializeObject(requestBody); - name = name ?? data?.name; - - return name != null - ? (ActionResult)new OkObjectResult($"Hello, {name}") - : new BadRequestObjectResult("Please pass a name on the query string or in the request body"); - } - - [FunctionName("Cosmos")] - public static IActionResult Cosmos( - [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "cosmos")] HttpRequest req, - [CosmosDB(databaseName: "pricedb", - collectionName: "prices", - ConnectionStringSetting = "CosmosDBConnection", - Id = "test")] ToDoItem toDoItem, - ILogger log) - { - log.LogInformation("C# HTTP trigger function processed a request."); - - if (toDoItem == null) - { - return new OkObjectResult("Please create a document with id=test"); - } - else - { - return new OkObjectResult(toDoItem); - } - } - - public class ToDoItem - { - public string Id { get; set; } - public string Name { get; set; } - } - } -} diff --git a/classic-azure-cs-cosmosapp-component/app/host.json b/classic-azure-cs-cosmosapp-component/app/host.json deleted file mode 100644 index dc0bbb4da..000000000 --- a/classic-azure-cs-cosmosapp-component/app/host.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": "2.0", - "extensions": { - "http": { - "routePrefix": "" - } - } -} \ No newline at end of file diff --git a/classic-azure-cs-cosmosapp-component/app/local.settings.json b/classic-azure-cs-cosmosapp-component/app/local.settings.json deleted file mode 100644 index 4fce9ff39..000000000 --- a/classic-azure-cs-cosmosapp-component/app/local.settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "IsEncrypted": false, - "Values": { - "AzureWebJobsStorage": "UseDevelopmentStorage=true", - "FUNCTIONS_WORKER_RUNTIME": "dotnet" - } -} \ No newline at end of file diff --git a/classic-azure-cs-cosmosapp-component/container/.dockerignore b/classic-azure-cs-cosmosapp-component/container/.dockerignore deleted file mode 100644 index 93f136199..000000000 --- a/classic-azure-cs-cosmosapp-component/container/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -npm-debug.log diff --git a/classic-azure-cs-cosmosapp-component/container/Dockerfile b/classic-azure-cs-cosmosapp-component/container/Dockerfile deleted file mode 100644 index 53bbea666..000000000 --- a/classic-azure-cs-cosmosapp-component/container/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM node:8.9.3-alpine -RUN mkdir -p /usr/src/app -COPY ./app/* /usr/src/app/ -WORKDIR /usr/src/app -RUN npm install -CMD node /usr/src/app/index.js diff --git a/classic-azure-cs-cosmosapp-component/container/app/index.html b/classic-azure-cs-cosmosapp-component/container/app/index.html deleted file mode 100644 index d0327a673..000000000 --- a/classic-azure-cs-cosmosapp-component/container/app/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - YEAH Welcome to Azure Container Instances! - - - - - -
-

Welcome to Azure Container Instances!

- - - ContainerInstances_rgb_UI - - - - - - - - - - -
- - - diff --git a/classic-azure-cs-cosmosapp-component/container/app/index.js b/classic-azure-cs-cosmosapp-component/container/app/index.js deleted file mode 100644 index 974313416..000000000 --- a/classic-azure-cs-cosmosapp-component/container/app/index.js +++ /dev/null @@ -1,37 +0,0 @@ -const express = require('express'); -const morgan = require('morgan'); -const cosmos = require('@azure/cosmos'); - -const app = express(); -app.use(morgan('combined')); - - -app.get('/', (req, res) => { - res.sendFile(__dirname + '/index.html') -}); - -app.get('/cosmos', async (req, res) => { - const endpoint = process.env.ENDPOINT; - const key = process.env.MASTER_KEY; - const database = process.env.DATABASE; - const collection = process.env.COLLECTION; - const location = process.env.LOCATION; - - const client = new cosmos.CosmosClient({ endpoint, key, connectionPolicy: { preferredLocations: [location] } }); - const container = client.database(database).container(collection); - const response = await container.item("test", undefined).read(); - - if (response.resource && response.resource.url) { - res.send(response.resource.url); - } else { - res.status(404).end(); - } -}); - -app.get('/api/ping', (req, res) => { - res.send('Ack') -}); - -var listener = app.listen(process.env.PORT || 80, function() { - console.log('listening on port ' + listener.address().port); -}); diff --git a/classic-azure-cs-cosmosapp-component/container/app/package.json b/classic-azure-cs-cosmosapp-component/container/app/package.json deleted file mode 100644 index 98393f65a..000000000 --- a/classic-azure-cs-cosmosapp-component/container/app/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "aci-helloworld", - "version": "1.0.0", - "description": "", - "main": "index.js", - "dependencies": { - "@azure/cosmos": "^3.1.1", - "express": "^4.14.0", - "morgan": "^1.8.2" - }, - "devDependencies": {}, - "author": "" -} diff --git a/classic-azure-cs-cosmosapp-component/vm/vmCustomData.yaml b/classic-azure-cs-cosmosapp-component/vm/vmCustomData.yaml deleted file mode 100644 index 9ec4b1df0..000000000 --- a/classic-azure-cs-cosmosapp-component/vm/vmCustomData.yaml +++ /dev/null @@ -1,69 +0,0 @@ -#cloud-config -package_upgrade: true -packages: - - nginx - - nodejs - - npm -write_files: - - owner: www-data:www-data - - path: /etc/nginx/sites-available/default - content: | - server { - listen 80; - location / { - proxy_pass http://localhost:3000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection keep-alive; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } - } - - owner: azureuser:azureuser - - path: /home/azureuser/myapp/index.js - content: | - var express = require('express') - var app = express() - var os = require('os'); - const cosmos = require('@azure/cosmos'); - const endpoint = process.env.ENDPOINT; - const key = process.env.MASTER_KEY; - const database = process.env.DATABASE; - const collection = process.env.COLLECTION; - const preferredLocations = [process.env.LOCATION]; - const connectionPolicy = { preferredLocations }; - const client = new cosmos.CosmosClient({ endpoint, key, connectionPolicy }); - app.get('/', function (req, res) { - res.send('Hello World1 from host ' + os.hostname() + '!') - }) - app.get('/node', function (req, res) { - const version = require('child_process').execSync('nodejs --version'); - res.send(version.toString()); - }) - app.get('/cosmos', (req, res) => { - client - .database(database) - .container(collection) - .item('test', undefined) - .read() - .then(r => res.send(r.resource)) - .catch(err => res.status(500).send(err)); - }) - app.get('/api/ping', (req, res) => { - res.send('Ack') - }) - app.listen(3000, function () { - console.log('Hello world app listening on port 3000!') - }) -runcmd: - - export ENDPOINT="${ENDPOINT}" - - export MASTER_KEY="${MASTER_KEY}" - - export DATABASE="${DATABASE}" - - export COLLECTION="${COLLECTION}" - - export LOCATION="${LOCATION}" - - service nginx restart - - cd "/home/azureuser/myapp" - - npm init - - npm install express -y - - npm install @azure/cosmos -y - - nodejs index.js \ No newline at end of file diff --git a/classic-azure-cs-msi-keyvault-rbac/AppStack.cs b/classic-azure-cs-msi-keyvault-rbac/AppStack.cs index fe947cbd2..4f86991ae 100644 --- a/classic-azure-cs-msi-keyvault-rbac/AppStack.cs +++ b/classic-azure-cs-msi-keyvault-rbac/AppStack.cs @@ -8,7 +8,7 @@ using Pulumi.Azure.Core; using Pulumi.Azure.KeyVault; using Pulumi.Azure.KeyVault.Inputs; -using Pulumi.Azure.Sql; +using Pulumi.Azure.MSSql; using Pulumi.Azure.Storage; using Pulumi.Random; @@ -35,8 +35,8 @@ public AppStack() // Azure SQL Server that we want to access from the application var administratorLoginPassword = new RandomPassword("password", - new RandomPasswordArgs {Length = 16, Special = true}).Result; - var sqlServer = new SqlServer("sqlserver", new SqlServerArgs + new RandomPasswordArgs { Length = 16, Special = true }).Result; + var sqlServer = new Server("sqlserver", new ServerArgs { ResourceGroupName = resourceGroup.Name, // The login and password are required but won't be used in our application @@ -48,9 +48,8 @@ public AppStack() // Azure SQL Database that we want to access from the application var database = new Database("db", new DatabaseArgs { - ResourceGroupName = resourceGroup.Name, - ServerName = sqlServer.Name, - RequestedServiceObjectiveName = "S0", + ServerId = sqlServer.Id, + SkuName = "S0", }); // The connection string that has no credentials in it: authertication will come through MSI @@ -67,15 +66,11 @@ public AppStack() }); // A plan to host the App Service - var appServicePlan = new Plan("asp", new PlanArgs + var appServicePlan = new ServicePlan("asp", new ServicePlanArgs { ResourceGroupName = resourceGroup.Name, - Kind = "App", - Sku = new PlanSkuArgs - { - Tier = "Basic", - Size = "B1", - }, + OsType = "Linux", + SkuName = "B1", }); // ASP.NET deployment package @@ -105,7 +100,7 @@ public AppStack() // The current principal has to be granted permissions to Key Vault so that it can actually add and then remove // secrets to/from the Key Vault. Otherwise, 'pulumi up' and 'pulumi destroy' operations will fail. ObjectId = currentPrincipal, - SecretPermissions = {"delete", "get", "list", "set"}, + SecretPermissions = {"Delete", "Get", "List", "Set"}, } }, }); @@ -120,13 +115,13 @@ public AppStack() // The application hosted in App Service - var app = new AppService("app", new AppServiceArgs + var app = new LinuxWebApp("app", new LinuxWebAppArgs { ResourceGroupName = resourceGroup.Name, - AppServicePlanId = appServicePlan.Id, + ServicePlanId = appServicePlan.Id, // A system-assigned managed service identity to be used for authentication and authorization to the SQL Database and the Blob Storage - Identity = new AppServiceIdentityArgs {Type = "SystemAssigned"}, - + Identity = new LinuxWebAppIdentityArgs { Type = "SystemAssigned" }, + SiteConfig = new LinuxWebAppSiteConfigArgs { }, AppSettings = { // Website is deployed from a URL read from the Key Vault @@ -137,7 +132,7 @@ public AppStack() }, ConnectionStrings = { - new AppServiceConnectionStringArgs + new LinuxWebAppConnectionStringArgs { Name = "db", Type = "SQLAzure", @@ -155,17 +150,7 @@ public AppStack() KeyVaultId = vault.Id, TenantId = tenantId, ObjectId = principalId, - SecretPermissions = {"get"}, - }); - - // Make the App Service the admin of the SQL Server (double check if you want a more fine-grained security model in your real app) - var sqlAdmin = new ActiveDirectoryAdministrator("adadmin", new ActiveDirectoryAdministratorArgs - { - ResourceGroupName = resourceGroup.Name, - TenantId = tenantId, - ObjectId = principalId, - Login = "adadmin", - ServerName = sqlServer.Name, + SecretPermissions = { "Get" }, }); // Grant access from App Service to the container in the storage @@ -181,14 +166,13 @@ public AppStack() ips => ips.Split(",").Select( ip => new FirewallRule($"FR{ip}", new FirewallRuleArgs { - ResourceGroupName = resourceGroup.Name, + ServerId = sqlServer.Id, StartIpAddress = ip, EndIpAddress = ip, - ServerName = sqlServer.Name, }) ).ToList()); - this.Endpoint = Output.Format($"https://{app.DefaultSiteHostname}"); + this.Endpoint = Output.Format($"https://{app.DefaultHostname}"); } [Output] public Output Endpoint { get; set; } diff --git a/classic-azure-cs-msi-keyvault-rbac/Azure.KeyVault.csproj b/classic-azure-cs-msi-keyvault-rbac/Azure.KeyVault.csproj index dd4fd08d2..0362745af 100644 --- a/classic-azure-cs-msi-keyvault-rbac/Azure.KeyVault.csproj +++ b/classic-azure-cs-msi-keyvault-rbac/Azure.KeyVault.csproj @@ -8,7 +8,7 @@ - + diff --git a/classic-azure-cs-msi-keyvault-rbac/README.md b/classic-azure-cs-msi-keyvault-rbac/README.md index 3af7b0c05..b5ff692f0 100644 --- a/classic-azure-cs-msi-keyvault-rbac/README.md +++ b/classic-azure-cs-msi-keyvault-rbac/README.md @@ -26,33 +26,34 @@ To deploy your infrastructure, follow the below steps. ### Steps -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Build and publish the ASP.NET Core project: +1. Build and publish the ASP.NET Core project: - ``` - $ dotnet publish webapp + ```bash + dotnet publish webapp ``` 1. Set an appropriate Azure location like: - ``` - $ pulumi config set azure:location westus + ```bash + pulumi config set azure:location westus + pulumi config set azure:subscriptionId ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -64,9 +65,9 @@ To deploy your infrastructure, follow the below steps. Update duration: 4m16s ``` -1. Check the deployed website endpoint: +1. Check the deployed website endpoint: - ``` + ```console $ pulumi stack output Endpoint https://app129968b8.azurewebsites.net/ $ curl "$(pulumi stack output Endpoint)" @@ -78,6 +79,6 @@ To deploy your infrastructure, follow the below steps. 1. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: ```bash - $ pulumi destroy --yes - $ pulumi stack rm --yes + pulumi destroy --yes + pulumi stack rm --yes ``` diff --git a/classic-azure-cs-vm-scaleset/Azure.VmScaleset.csproj b/classic-azure-cs-vm-scaleset/Azure.VmScaleset.csproj index f444aa02a..9a4d596f6 100644 --- a/classic-azure-cs-vm-scaleset/Azure.VmScaleset.csproj +++ b/classic-azure-cs-vm-scaleset/Azure.VmScaleset.csproj @@ -8,7 +8,7 @@ - + diff --git a/classic-azure-cs-vm-scaleset/README.md b/classic-azure-cs-vm-scaleset/README.md index bcf6fe165..f4596b906 100644 --- a/classic-azure-cs-vm-scaleset/README.md +++ b/classic-azure-cs-vm-scaleset/README.md @@ -17,23 +17,22 @@ To deploy your infrastructure, follow the below steps. ### Steps -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` 1. Set an appropriate Azure location like: - ``` - $ pulumi config set azure:location westus + ```bash + pulumi config set azure:location westus + pulumi config set azure:subscriptionId ``` -1. Run `pulumi up` to preview and deploy the changes: +1. Run `pulumi up` to preview and deploy changes: -1. Run `pulumi up` to preview and deploy changes: - - ``` + ```console $ pulumi up Previewing changes: ... @@ -46,16 +45,16 @@ To deploy your infrastructure, follow the below steps. 1. Get the IP address of the newly-created instance from the stack's outputs: - ``` + ```console $ pulumi stack output IpAddress 137.117.15.111 ``` 1. Check to see that your server is now running: - ``` + ```console $ curl http://$(pulumi stack output IpAddress) - Hello, World By ! + Hello, World By ! ``` 1. From there, feel free to experiment. Simply making edits and running `pulumi up` will incrementally update your stack. @@ -63,6 +62,6 @@ To deploy your infrastructure, follow the below steps. 1. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: ```bash - $ pulumi destroy --yes - $ pulumi stack rm --yes + pulumi destroy --yes + pulumi stack rm --yes ``` diff --git a/classic-azure-cs-vm-scaleset/VmScalesetStack.cs b/classic-azure-cs-vm-scaleset/VmScalesetStack.cs index 76d79478a..ce06aed1d 100644 --- a/classic-azure-cs-vm-scaleset/VmScalesetStack.cs +++ b/classic-azure-cs-vm-scaleset/VmScalesetStack.cs @@ -28,7 +28,7 @@ public VmScalesetStack() } ); - var subnet = new Subnet("subnet", + var subnet = new Subnet("subnet", new SubnetArgs { ResourceGroupName = resourceGroup.Name, @@ -61,14 +61,12 @@ public VmScalesetStack() var bpePool = new BackendAddressPool("bpepool", new BackendAddressPoolArgs { - ResourceGroupName = resourceGroup.Name, LoadbalancerId = lb.Id, }); var sshProbe = new Probe("ssh-probe", new ProbeArgs { - ResourceGroupName = resourceGroup.Name, LoadbalancerId = lb.Id, Port = applicationPort, }); @@ -76,8 +74,7 @@ public VmScalesetStack() var natRule = new Rule("lbnatrule-http", new RuleArgs { - ResourceGroupName = resourceGroup.Name, - BackendAddressPoolId = bpePool.Id, + BackendAddressPoolIds = { bpePool.Id }, BackendPort = applicationPort, FrontendIpConfigurationName = "PublicIPAddress", FrontendPort = applicationPort, @@ -86,69 +83,65 @@ public VmScalesetStack() Protocol = "Tcp", }); - var scaleSet = new ScaleSet("vmscaleset", - new ScaleSetArgs + var scaleSet = new LinuxVirtualMachineScaleSet("vmscaleset", + new LinuxVirtualMachineScaleSetArgs { ResourceGroupName = resourceGroup.Name, - NetworkProfiles = new ScaleSetNetworkProfileArgs + NetworkInterfaces = new[] { - IpConfigurations = new ScaleSetNetworkProfileIpConfigurationArgs[] { - new ScaleSetNetworkProfileIpConfigurationArgs { - LoadBalancerBackendAddressPoolIds = bpePool.Id, - Name = "IPConfiguration", - Primary = true, - SubnetId = subnet.Id, - } + new LinuxVirtualMachineScaleSetNetworkInterfaceArgs + { + IpConfigurations = new [] { + new LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationArgs { + LoadBalancerBackendAddressPoolIds = {bpePool.Id}, + Name = "IPConfiguration", + Primary = true, + SubnetId = subnet.Id, + } + }, + Name = "networkprofile", + Primary = true }, - Name = "networkprofile", - Primary = true }, - OsProfile = new ScaleSetOsProfileArgs - { - ComputerNamePrefix = "vmlab", - AdminUsername = "testadmin", - AdminPassword = "Password1234!", - CustomData = - @"#!/bin/bash + AdminUsername = "testadmin", + AdminPassword = "Password1234!", + ComputerNamePrefix = "vmlab", + CustomData = System.Convert.ToBase64String( + System.Text.Encoding.UTF8.GetBytes(@"#!/bin/bash echo ""Hello, World by $HOSTNAME!"" > index.html -nohup python -m SimpleHTTPServer 80 &" - }, - OsProfileLinuxConfig = new ScaleSetOsProfileLinuxConfigArgs - { - DisablePasswordAuthentication = false - }, - Sku = new ScaleSetSkuArgs - { - Capacity = 1, - Name = "Standard_DS1_v2", - Tier = "Standard", - }, - StorageProfileOsDisk = new ScaleSetStorageProfileOsDiskArgs +nohup python -m SimpleHTTPServer 80 &")), + DisablePasswordAuthentication = false, + Sku = "Standard_DS1_V2", + OsDisk = new LinuxVirtualMachineScaleSetOsDiskArgs { Caching = "ReadWrite", - CreateOption = "FromImage", - ManagedDiskType = "Standard_LRS", - Name = "" + StorageAccountType = "Standard_LRS", }, - StorageProfileDataDisks = new ScaleSetStorageProfileDataDiskArgs + DataDisks = new[] { - Caching = "ReadWrite", - CreateOption = "Empty", - DiskSizeGb = 10, - Lun = 0 + new LinuxVirtualMachineScaleSetDataDiskArgs + { + StorageAccountType = "Standard_LRS", + Caching = "ReadWrite", + CreateOption = "Empty", + DiskSizeGb = 10, + Lun = 0 + }, }, - StorageProfileImageReference = new ScaleSetStorageProfileImageReferenceArgs + SourceImageReference = new LinuxVirtualMachineScaleSetSourceImageReferenceArgs { Offer = "UbuntuServer", Publisher = "Canonical", Sku = "16.04-LTS", Version = "latest", }, - UpgradePolicyMode = "Manual" - + AutomaticOsUpgradePolicy = new LinuxVirtualMachineScaleSetAutomaticOsUpgradePolicyArgs + { + DisableAutomaticRollback = false, + EnableAutomaticOsUpgrade = false, + }, }, new CustomResourceOptions { DeleteBeforeReplace = true, DependsOn = bpePool }); - var autoscale = new AutoscaleSetting("vmss-autoscale", new AutoscaleSettingArgs { @@ -220,8 +213,8 @@ nohup python -m SimpleHTTPServer 80 &" }, TargetResourceId = scaleSet.Id }); - - + + // The public IP address is not allocated until the VM is running, so wait for that // resource to create, and then lookup the IP address again to report its public IP. @@ -231,7 +224,7 @@ nohup python -m SimpleHTTPServer 80 &" { (_, string name, string resourceGroupName) = t; var ip = await GetPublicIP.InvokeAsync(new GetPublicIPArgs - {Name = name, ResourceGroupName = resourceGroupName}); + { Name = name, ResourceGroupName = resourceGroupName }); return ip.IpAddress; }); } diff --git a/classic-azure-cs-webserver/Azure.WebServer.csproj b/classic-azure-cs-webserver/Azure.WebServer.csproj index f444aa02a..9a4d596f6 100644 --- a/classic-azure-cs-webserver/Azure.WebServer.csproj +++ b/classic-azure-cs-webserver/Azure.WebServer.csproj @@ -8,7 +8,7 @@ - + diff --git a/classic-azure-cs-webserver/README.md b/classic-azure-cs-webserver/README.md index 292e09c64..0b045379b 100644 --- a/classic-azure-cs-webserver/README.md +++ b/classic-azure-cs-webserver/README.md @@ -16,23 +16,24 @@ To deploy your infrastructure, follow the below steps. ### Steps -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` 1. Set an appropriate Azure location like: - ``` - $ pulumi config set azure:location westus + ```bash + pulumi config set azure:location westus + pulumi config set azure:subscriptionId ``` 1. Run `pulumi up` to preview and deploy the changes: -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -45,14 +46,14 @@ To deploy your infrastructure, follow the below steps. 1. Get the IP address of the newly-created instance from the stack's outputs: - ``` + ```console $ pulumi stack output IpAddress 137.117.15.111 ``` 1. Check to see that your server is now running: - ``` + ```console $ curl http://$(pulumi stack output IpAddress) Hello, World! ``` @@ -62,6 +63,6 @@ To deploy your infrastructure, follow the below steps. 1. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: ```bash - $ pulumi destroy --yes - $ pulumi stack rm --yes + pulumi destroy --yes + pulumi stack rm --yes ``` diff --git a/classic-azure-cs-webserver/WebServerStack.cs b/classic-azure-cs-webserver/WebServerStack.cs index 13a24632d..582137ef5 100644 --- a/classic-azure-cs-webserver/WebServerStack.cs +++ b/classic-azure-cs-webserver/WebServerStack.cs @@ -17,10 +17,10 @@ public WebServerStack() new VirtualNetworkArgs { ResourceGroupName = resourceGroup.Name, - AddressSpaces = {"10.0.0.0/16"}, + AddressSpaces = { "10.0.0.0/16" }, Subnets = { - new VirtualNetworkSubnetArgs {Name = "default", AddressPrefix = "10.0.1.0/24"} + new VirtualNetworkSubnetArgs {Name = "default", AddressPrefixes = {"10.0.1.0/24"}} } } ); @@ -29,7 +29,8 @@ public WebServerStack() new PublicIpArgs { ResourceGroupName = resourceGroup.Name, - AllocationMethod = "Dynamic" + AllocationMethod = "Dynamic", + Sku = "Basic", }); var networkInterface = new NetworkInterface("server-nic", @@ -52,7 +53,7 @@ public WebServerStack() new VirtualMachineArgs { ResourceGroupName = resourceGroup.Name, - NetworkInterfaceIds = {networkInterface.Id}, + NetworkInterfaceIds = { networkInterface.Id }, VmSize = "Standard_A0", DeleteDataDisksOnTermination = true, DeleteOsDiskOnTermination = true, @@ -82,7 +83,7 @@ nohup python -m SimpleHTTPServer 80 &" Sku = "16.04-LTS", Version = "latest" } - }, new CustomResourceOptions {DeleteBeforeReplace = true}); + }, new CustomResourceOptions { DeleteBeforeReplace = true }); // The public IP address is not allocated until the VM is running, so wait for that @@ -93,7 +94,7 @@ nohup python -m SimpleHTTPServer 80 &" { (_, string name, string resourceGroupName) = t; var ip = await GetPublicIP.InvokeAsync(new GetPublicIPArgs - {Name = name, ResourceGroupName = resourceGroupName}); + { Name = name, ResourceGroupName = resourceGroupName }); return ip.IpAddress; }); } diff --git a/classic-azure-fs-aci/Azure.Aci.fsproj b/classic-azure-fs-aci/Azure.Aci.fsproj index c6f7d45c4..da0b44764 100644 --- a/classic-azure-fs-aci/Azure.Aci.fsproj +++ b/classic-azure-fs-aci/Azure.Aci.fsproj @@ -12,8 +12,8 @@ - - + + diff --git a/classic-azure-fs-aci/Program.fs b/classic-azure-fs-aci/Program.fs index 10466aecd..ca6cecbe4 100644 --- a/classic-azure-fs-aci/Program.fs +++ b/classic-azure-fs-aci/Program.fs @@ -6,6 +6,7 @@ open Pulumi.Azure.ContainerService open Pulumi.Azure.ContainerService.Inputs open Pulumi.Azure.Core open Pulumi.Docker +open Pulumi.Docker.Inputs [] module Helpers = @@ -14,10 +15,10 @@ module Helpers = let infra () = let resourceGroup = ResourceGroup "aci-rg" - let registry = + let registry: Registry = Registry("registry", - RegistryArgs - (ResourceGroupName = io resourceGroup.Name, + Azure.ContainerService.RegistryArgs( + ResourceGroupName = io resourceGroup.Name, AdminEnabled = input true, Sku = input "Premium")) @@ -26,9 +27,9 @@ let infra () = Image("node-app", ImageArgs (ImageName = imageName, - Build = inputLeft "./app", + Build = input (DockerBuildArgs(Dockerfile = "./app")), Registry = input( - ImageRegistry + RegistryArgs (Server = io registry.LoginServer, Username = io registry.AdminUsername, Password = io registry.AdminPassword)))) diff --git a/classic-azure-fs-aci/README.md b/classic-azure-fs-aci/README.md index 45f5d8412..d989f9b52 100644 --- a/classic-azure-fs-aci/README.md +++ b/classic-azure-fs-aci/README.md @@ -16,27 +16,28 @@ To deploy your infrastructure, follow the below steps. ### Steps -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Configure the location to deploy the resources to: +1. Configure the location to deploy the resources to: - ``` - $ pulumi config set azure:location + ```bash + pulumi config set azure:location + pulumi config set azure:subscriptionId ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -48,9 +49,9 @@ To deploy your infrastructure, follow the below steps. Update duration: 1m56s ``` -1. Check the deployed container endpoint: +1. Check the deployed container endpoint: - ``` + ```console $ pulumi stack output endpoint https://acifsharp.westeurope.azurecontainer.io $ curl "$(pulumi stack output endpoint)" @@ -63,11 +64,11 @@ To deploy your infrastructure, follow the below steps. ``` -6. From there, feel free to experiment. Simply making edits and running `pulumi up` will incrementally update your stack. +1. From there, feel free to experiment. Simply making edits and running `pulumi up` will incrementally update your stack. -7. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: +1. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: ```bash - $ pulumi destroy --yes - $ pulumi stack rm --yes + pulumi destroy --yes + pulumi stack rm --yes ``` diff --git a/classic-azure-fs-aks/Azure.Aks.fsproj b/classic-azure-fs-aks/Azure.Aks.fsproj index c47c1588b..bf9230e7d 100644 --- a/classic-azure-fs-aks/Azure.Aks.fsproj +++ b/classic-azure-fs-aks/Azure.Aks.fsproj @@ -10,10 +10,10 @@ - - + + - + diff --git a/classic-azure-fs-aks/Program.fs b/classic-azure-fs-aks/Program.fs index eed123c6d..6c1ae2de1 100644 --- a/classic-azure-fs-aks/Program.fs +++ b/classic-azure-fs-aks/Program.fs @@ -5,7 +5,7 @@ open Pulumi.Azure.Core open Pulumi.Azure.ContainerService open Pulumi.Azure.ContainerService.Inputs open Pulumi.Azure.Network -open Pulumi.Azure.Role +open Pulumi.Azure.Authorization open Pulumi.FSharp open Pulumi.Random open Pulumi.Tls @@ -14,14 +14,6 @@ open Pulumi.Tls module Helpers = let createResourceGroup name = ResourceGroup(name) - let createPassword name = - RandomPassword(name, - RandomPasswordArgs( - Length = input 20, - Special = input true - ) - ) - let createPrivateKey name = PrivateKey(name, PrivateKeyArgs( @@ -37,11 +29,10 @@ module Helpers = ServicePrincipal(name, ServicePrincipalArgs(ApplicationId = io app.ApplicationId)) - let createServicePrincipalPassword name (password: RandomPassword) (servicePrincipal: ServicePrincipal) = + let createServicePrincipalPassword name (servicePrincipal: ServicePrincipal) = ServicePrincipalPassword(name, ServicePrincipalPasswordArgs( ServicePrincipalId = io servicePrincipal.Id, - Value = io password.Result, EndDate = input "2099-01-01T00:00:00Z" )) @@ -64,7 +55,7 @@ module Helpers = SubnetArgs( ResourceGroupName = io resourceGroup.Name, VirtualNetworkName = io vnet.Name, - AddressPrefix = input "10.2.1.0/24" + AddressPrefixes = inputList [input "10.2.1.0/24"] )) let createCluster @@ -98,15 +89,11 @@ module Helpers = ClientSecret = io servicePrincipalPassword.Value ) - let rbacArgs = - KubernetesClusterRoleBasedAccessControlArgs(Enabled = input true) - let networkProfileArgs = KubernetesClusterNetworkProfileArgs( NetworkPlugin = input "azure", DnsServiceIp = input "10.2.2.254", - ServiceCidr = input "10.2.2.0/24", - DockerBridgeCidr = input "172.17.0.1/16" + ServiceCidr = input "10.2.2.0/24" ) KubernetesCluster(name, @@ -117,17 +104,16 @@ module Helpers = LinuxProfile = input linuxProfileArgs, ServicePrincipal = input servicePrincipalArgs, KubernetesVersion = input kubernetesVersion, - RoleBasedAccessControl = input rbacArgs, + RoleBasedAccessControlEnabled = input true, NetworkProfile = input networkProfileArgs )) let infra () = let resourceGroup = Helpers.createResourceGroup "fsaks" - let password = Helpers.createPassword "fsakspassword" let privateKey = Helpers.createPrivateKey "fsakssshkey" let app = Helpers.createApplication "fsaks" let servicePrincipal = Helpers.createServicePrincipal "fsakssp" app - let servicePrincipalPassword = Helpers.createServicePrincipalPassword "fsakssppassword" password servicePrincipal + let servicePrincipalPassword = Helpers.createServicePrincipalPassword "fsakssppassword" servicePrincipal let networkRole = Helpers.assignNetworkContributorRole "role-assignment" servicePrincipal resourceGroup let vnet = Helpers.createVnet "fsaksvnet" resourceGroup let subnet = Helpers.createSubnet "fsakssubnet" vnet resourceGroup diff --git a/classic-azure-fs-aks/README.md b/classic-azure-fs-aks/README.md index 16e522cf3..64483a6ef 100644 --- a/classic-azure-fs-aks/README.md +++ b/classic-azure-fs-aks/README.md @@ -14,8 +14,9 @@ Stands up an [Azure Kubernetes Service](https://azure.microsoft.com/en-us/servic Configure the environment: ```bash -$ pulumi config set azure:location westeurope -$ az login +pulumi config set azure:location westeurope +pulumi config set azure:subscriptionId +az login ``` ## Deploying the App (short version) @@ -23,35 +24,34 @@ $ az login To make it easier to try out you can use the available [Makefile](Makefile), like: ```bash -$ make deploy +make deploy ``` This will build the project and run `pulumi up -y`. If you haven't created a stack you will be prompted to do so. - When the deploy is finished you can export the kubernetes config by running ```bash -$ make exportconfig +make exportconfig ``` With the config exported you can now test to access the kubernetes cluster ```bash -$ KUBECONFIG=./kubeconfig.yaml kubectl get nodes +KUBECONFIG=./kubeconfig.yaml kubectl get nodes ``` If you want to cleanup when you are done you can run ```bash -$ make destroy -$ make rmstack +make destroy +make rmstack ``` To list all make targets run ```bash -$ make help +make help ``` The [Makefile](Makefile) also works as documentation on what commands you need to run to deploy the application. @@ -61,24 +61,24 @@ The [Makefile](Makefile) also works as documentation on what commands you need t If you don't have make installed you will have to run the "native" commands. To deploy you run ```bash -$ pulumi up --yes +pulumi up --yes ``` This will prompt you to create a stack if you haven't done so already. When the deploy is ready you can export the kubernetes config with ```bash -$ pulumi stack output kubeconfig --show-secrets > kubeconfig.yaml +pulumi stack output kubeconfig --show-secrets > kubeconfig.yaml ``` and then test the deployment with ```bash -$ KUBECONFIG=./kubeconfig.yaml kubectl get nodes +KUBECONFIG=./kubeconfig.yaml kubectl get nodes ``` If you want to cleanup the cloud resources when you are done you can run ```bash -$ pulumi destroy -y -$ pulumi stack rm -y +pulumi destroy -y +pulumi stack rm -y ``` diff --git a/classic-azure-fs-appservice/Azure.AppService.fsproj b/classic-azure-fs-appservice/Azure.AppService.fsproj index 4df989551..a1d435689 100644 --- a/classic-azure-fs-appservice/Azure.AppService.fsproj +++ b/classic-azure-fs-appservice/Azure.AppService.fsproj @@ -12,7 +12,7 @@ - + diff --git a/classic-azure-fs-appservice/Program.fs b/classic-azure-fs-appservice/Program.fs index 69ed0c95b..06fd0999b 100644 --- a/classic-azure-fs-appservice/Program.fs +++ b/classic-azure-fs-appservice/Program.fs @@ -6,7 +6,7 @@ open Pulumi.Azure.AppInsights open Pulumi.Azure.AppService open Pulumi.Azure.AppService.Inputs open Pulumi.Azure.Core -open Pulumi.Azure.Sql +open Pulumi.Azure.MSSql open Pulumi.Azure.Storage let infra () = @@ -19,13 +19,12 @@ let infra () = AccountReplicationType = input "LRS", AccountTier = input "Standard")) - let sku = PlanSkuArgs(Tier = input "Basic", Size = input "B1") let appServicePlan = - Plan("asp", - PlanArgs + ServicePlan("asp", + ServicePlanArgs (ResourceGroupName = io resourceGroup.Name, - Kind = input "App", - Sku = input sku)) + OsType = input "Linux", + SkuName = input "B1")) let container = Container("zips", @@ -54,8 +53,8 @@ let infra () = let username = config.Get "sqlAdmin" let password = config.RequireSecret "sqlPassword" let sqlServer = - SqlServer("sql", - SqlServerArgs + Server("sql", + ServerArgs (ResourceGroupName = io resourceGroup.Name, AdministratorLogin = input (if not(isNull username) then username else "pulumi"), AdministratorLoginPassword = io password, @@ -64,9 +63,8 @@ let infra () = let database = Database("db", DatabaseArgs - (ResourceGroupName = io resourceGroup.Name, - ServerName = io sqlServer.Name, - RequestedServiceObjectiveName = input "S0")) + (ServerId = io sqlServer.Id, + SkuName = input "S0")) let connectionString = Outputs.pair3 sqlServer.Name database.Name password @@ -76,7 +74,7 @@ let infra () = server database username pwd) let connectionStringSetting = - AppServiceConnectionStringArgs + LinuxWebAppConnectionStringArgs (Name = input "db", Type = input "SQLAzure", Value = io connectionString) @@ -87,19 +85,19 @@ let infra () = sprintf "InstrumentationKey=%s" key) let app = - AppService("app", - AppServiceArgs + LinuxWebApp("app", + LinuxWebAppArgs (ResourceGroupName = io resourceGroup.Name, - AppServicePlanId = io appServicePlan.Id, + ServicePlanId = io appServicePlan.Id, AppSettings = inputMap ["WEBSITE_RUN_FROM_PACKAGE", io codeBlobUrl; "APPINSIGHTS_INSTRUMENTATIONKEY", io appInsights.InstrumentationKey; "APPLICATIONINSIGHTS_CONNECTION_STRING", io appInsightsConnectionString; "ApplicationInsightsAgent_EXTENSION_VERSION", input "~2"], - + SiteConfig = LinuxWebAppSiteConfigArgs(), ConnectionStrings = inputList [input connectionStringSetting])) - dict [("endpoint", app.DefaultSiteHostname :> obj)] + dict [("endpoint", app.DefaultHostname :> obj)] [] let main _ = diff --git a/classic-azure-fs-appservice/README.md b/classic-azure-fs-appservice/README.md index 3504f465d..80ddcd504 100644 --- a/classic-azure-fs-appservice/README.md +++ b/classic-azure-fs-appservice/README.md @@ -19,33 +19,34 @@ To deploy your infrastructure, follow the below steps. ### Steps -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Configure the location to deploy the resources to: +1. Configure the location to deploy the resources to: - ``` - $ pulumi config set azure:location + ```bash + pulumi config set azure:location + pulumi config set azure:subscriptionId ``` 1. Define SQL Server password (make it complex enough to satisfy Azure policy): - ``` + ```bash pulumi config set --secret sqlPassword ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -57,9 +58,9 @@ To deploy your infrastructure, follow the below steps. Update duration: 1m14.59910109s ``` -1. Check the deployed website endpoint: +1. Check the deployed website endpoint: - ``` + ```console $ pulumi stack output endpoint https://azpulumi-as0ef47193.azurewebsites.net $ curl "$(pulumi stack output endpoint)" @@ -70,11 +71,11 @@ To deploy your infrastructure, follow the below steps. ``` -6. From there, feel free to experiment. Simply making edits and running `pulumi up` will incrementally update your stack. +1. From there, feel free to experiment. Simply making edits and running `pulumi up` will incrementally update your stack. -7. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: +1. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: ```bash - $ pulumi destroy --yes - $ pulumi stack rm --yes + pulumi destroy --yes + pulumi stack rm --yes ``` diff --git a/classic-azure-go-aks-multicluster/Pulumi.yaml b/classic-azure-go-aks-multicluster/Pulumi.yaml index 5e0fbf216..d93f7269f 100644 --- a/classic-azure-go-aks-multicluster/Pulumi.yaml +++ b/classic-azure-go-aks-multicluster/Pulumi.yaml @@ -6,9 +6,6 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public - password: - description: Your cluster password - secret: true sshPublicKey: description: Your SSH public key (generate with `ssh-keygen -t rsa -f key.rsa`) location: diff --git a/classic-azure-go-aks-multicluster/README.md b/classic-azure-go-aks-multicluster/README.md index c343dce48..019fcfdc5 100644 --- a/classic-azure-go-aks-multicluster/README.md +++ b/classic-azure-go-aks-multicluster/README.md @@ -4,7 +4,7 @@ # Multiple Azure Kubernetes Service (AKS) Clusters This example demonstrates creating multiple Azure Kubernetes Service (AKS) clusters in different regions and with -different node counts. Please see https://docs.microsoft.com/en-us/azure/aks/ for more information about AKS. +different node counts. Please see for more information about AKS. ## Prerequisites @@ -16,7 +16,7 @@ We will be deploying to Azure, so you will need an Azure account. If you don't h ## Running the Example -> **Note**: Due to an issue in the Azure Terraform Provider (https://github.com/terraform-providers/terraform-provider-azurerm/issues/1635) the +> **Note**: Due to an issue in the Azure Terraform Provider () the > creation of an Azure Service Principal, which is needed to create the Kubernetes cluster (see main.go), is delayed and may not > be available when the cluster is created. If you get a Service Principal not found error, as a work around, you should be able to run `pulumi up` > again, at which time the Service Principal should have been created. @@ -26,29 +26,29 @@ After cloning this repo, `cd` into it and run these commands. 1. Create a new stack, which is an isolated deployment target for this example: ```bash - $ pulumi stack init + pulumi stack init ``` 2. Set the required configuration variables for this program: ```bash - $ pulumi config set azure:environment public - $ pulumi config set password --secret [your-cluster-password-here] - $ ssh-keygen -t rsa -f key.rsa - $ pulumi config set sshPublicKey < key.rsa.pub + pulumi config set azure:environment public + pulumi config set azure:subscriptionId + ssh-keygen -t rsa -f key.rsa + pulumi config set sshPublicKey < key.rsa.pub ``` 3. Deploy everything with the `pulumi up` command. This provisions all the Azure resources necessary, including an Active Directory service principal and AKS clusters: ```bash - $ pulumi up + pulumi up ``` 4. After a couple minutes, your AKS clusters will be ready. The AKS cluster names will be printed as output variables once `pulumi up` completes. - ```bash + ```console $ pulumi up ... @@ -67,6 +67,6 @@ After cloning this repo, `cd` into it and run these commands. 6. Once you are done, you can destroy all of the resources, and the stack: ```bash - $ pulumi destroy - $ pulumi stack rm + pulumi destroy + pulumi stack rm ``` diff --git a/classic-azure-go-aks-multicluster/go.mod b/classic-azure-go-aks-multicluster/go.mod index 3ae2ded5d..080342bdd 100644 --- a/classic-azure-go-aks-multicluster/go.mod +++ b/classic-azure-go-aks-multicluster/go.mod @@ -1,9 +1,99 @@ module github.com/pulumi/examples/azure-go-aks -go 1.13 +go 1.21 + +toolchain go1.23.0 + +require ( + github.com/pulumi/pulumi-azure/sdk/v6 v6.0.0 + github.com/pulumi/pulumi-azuread/sdk/v5 v5.0.0 + github.com/pulumi/pulumi/sdk/v3 v3.130.0 +) require ( - github.com/pulumi/pulumi-azure/sdk/v4 v4.0.0 - github.com/pulumi/pulumi-azuread/sdk/v4 v4.0.0 - github.com/pulumi/pulumi/sdk/v3 v3.0.0 + dario.cat/mergo v1.0.0 // indirect + github.com/BurntSushi/toml v1.2.1 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/atotto/clipboard v0.1.4 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/blang/semver v3.5.1+incompatible // indirect + github.com/charmbracelet/bubbles v0.16.1 // indirect + github.com/charmbracelet/bubbletea v0.25.0 // indirect + github.com/charmbracelet/lipgloss v0.7.1 // indirect + github.com/cheggaaa/pb v1.0.29 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/djherbis/times v1.5.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/fatih/color v1.15.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.12.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.2.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl/v2 v2.17.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mitchellh/go-ps v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.2 // indirect + github.com/opentracing/basictracer-go v1.1.0 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/pgavlin/fx v0.1.6 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/term v1.1.0 // indirect + github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect + github.com/pulumi/esc v0.9.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/texttheater/golang-levenshtein v1.0.1 // indirect + github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 // indirect + github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + github.com/zclconf/go-cty v1.13.2 // indirect + go.uber.org/atomic v1.9.0 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect + golang.org/x/mod v0.18.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/tools v0.22.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/grpc v1.63.2 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/frand v1.4.2 // indirect ) diff --git a/classic-azure-go-aks-multicluster/go.sum b/classic-azure-go-aks-multicluster/go.sum index fb7e9066f..1111b99fe 100644 --- a/classic-azure-go-aks-multicluster/go.sum +++ b/classic-azure-go-aks-multicluster/go.sum @@ -1,73 +1,124 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= +github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= 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/cheggaaa/pb v1.0.18 h1:G/DgkKaBP0V5lnBg/vx61nVxxAU+VqU5yMzSc0f2PPE= +github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= +github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= +github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= +github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= +github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= +github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= github.com/cheggaaa/pb v1.0.18/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/djherbis/times v1.2.0 h1:xANXjsC/iBqbO00vkWlYwPWgBgEVU6m6AFYg0Pic+Mc= github.com/djherbis/times v1.2.0/go.mod h1:CGMZlo255K5r4Yw0b9RRfFQpM2y7uOmxg4jm9HsaVf8= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/djherbis/times v1.5.0 h1:79myA211VwPhFTqUk8xehWrsEO+zcIZj0zT8mXPVARU= +github.com/djherbis/times v1.5.0/go.mod h1:5q7FDLvbNg1L/KaBmPcWlVR9NmoKo3+ucqUA3ijQhA0= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= +github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc= github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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= @@ -79,77 +130,118 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/hashicorp/hcl/v2 v2.17.0 h1:z1XvSUyXd1HP10U4lrLg5e0JMVz6CPaJvAgxM0KNZVY= +github.com/hashicorp/hcl/v2 v2.17.0/go.mod h1:gJyW2PTShkJqQBKpAmPO3yxMxIuoXkOF2TpqXzrQyx4= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/basictracer-go v1.1.0 h1:Oa1fTSBvAl8pa3U+IJYqrKm0NALwH9OsgwOqDv4xJW0= +github.com/opentracing/basictracer-go v1.1.0/go.mod h1:V2HZueSJEp879yv285Aap1BS69fQMD+MNP1mRs6mBQc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pgavlin/fx v0.1.6 h1:r9jEg69DhNoCd3Xh0+5mIbdbS3PqWrVWujkY76MFRTU= +github.com/pgavlin/fx v0.1.6/go.mod h1:KWZJ6fqBBSh8GxHYqwYCf3rYE7Gp2p0N8tJp8xv9u9M= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= +github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= 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_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -162,63 +254,97 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pulumi/pulumi-azure/sdk/v4 v4.0.0 h1:7xhO/ElTrC4/u5hdDbcB+QsJkbMKiTRdovZWpB51TvA= -github.com/pulumi/pulumi-azure/sdk/v4 v4.0.0/go.mod h1:oOjat41tnqyi4yzMI3xD32oXfrcQvErTjhNkSMPctoI= -github.com/pulumi/pulumi-azuread/sdk/v4 v4.0.0 h1:Fo8KNxSTyStg8R4aDMr4/cDEVnTkE262iio76Sol2Mw= -github.com/pulumi/pulumi-azuread/sdk/v4 v4.0.0/go.mod h1:E6a7MAO0l3d3nVhFwn65mvmQ3+duEU2cIY676CnAUGY= -github.com/pulumi/pulumi/sdk/v3 v3.0.0 h1:zkragE05t1Rco/ymfqMU4UXdEmKMmOH0SXhUKQxujxQ= -github.com/pulumi/pulumi/sdk/v3 v3.0.0/go.mod h1:GBHyQ7awNQSRmiKp/p8kIKrGrMOZeA/k2czoM/GOqds= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= +github.com/pulumi/esc v0.9.1 h1:HH5eEv8sgyxSpY5a8yePyqFXzA8cvBvapfH8457+mIs= +github.com/pulumi/esc v0.9.1/go.mod h1:oEJ6bOsjYlQUpjf70GiX+CXn3VBmpwFDxUTlmtUN84c= +github.com/pulumi/pulumi-azure/sdk/v6 v6.0.0 h1:wVYbClLXWeS/S4C9cMzRx1S9UoP1Cq0WD0Fe9+mcYbQ= +github.com/pulumi/pulumi-azure/sdk/v6 v6.0.0/go.mod h1:pUHSNjHd67sHq8az9fpNaLqB2f7GWHRs/PCh3Xg3bEU= +github.com/pulumi/pulumi-azuread/sdk/v5 v5.0.0 h1:jgrctSdhAS/JncMIS90yB6bqZU2OcBjl7YexhDjMzWk= +github.com/pulumi/pulumi-azuread/sdk/v5 v5.0.0/go.mod h1:CRAdEw3CasGLeus6o8N9aVjGEksX7d1MFSsLmSlMXfo= +github.com/pulumi/pulumi/sdk/v3 v3.3.1/go.mod h1:GBHyQ7awNQSRmiKp/p8kIKrGrMOZeA/k2czoM/GOqds= +github.com/pulumi/pulumi/sdk/v3 v3.130.0 h1:gGJNd+akPqhZ+vrsZmAjSNJn6kGJkitjjkwrmIQMmn8= +github.com/pulumi/pulumi/sdk/v3 v3.130.0/go.mod h1:p1U24en3zt51agx+WlNboSOV8eLlPWYAkxMzVEXKbnY= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6 h1:9VTskZOIRf2vKF3UL8TuWElry5pgUpV1tFSe/e/0m/E= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= +github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= +github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 h1:X9dsIWPuuEJlPX//UmRKophhOKCGXc46RVIGuttks68= github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7/go.mod h1:UxoP3EypF8JfGEjAII8jx1q8rQyDnX8qdTCs/UQBVIE= -github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM= github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty v1.13.2 h1:4GvrUxe/QUDYuJKAav4EYqdM47/kZa672LwmXFmEKT0= +github.com/zclconf/go-cty v1.13.2/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -226,19 +352,29 @@ golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6 h1:TjszyFsQsyZNHwdVdZ5m7bjmreu0znc2kRYsEml9/Ww= golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= +golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -250,14 +386,28 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -267,17 +417,48 @@ golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 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.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -290,26 +471,33 @@ golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDq golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200608174601-1b747fd94509 h1:MI14dOfl3OG6Zd32w3ugsrvcUO810fDZdWakTq39dH4= golang.org/x/tools v0.0.0-20200608174601-1b747fd94509/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 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= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482 h1:i+Aiej6cta/Frzp13/swvwz5O00kYcSe0A/C5Wd7zX8= google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= 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= @@ -318,21 +506,19 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -341,11 +527,16 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= +lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= +lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= +pgregory.net/rapid v0.6.1 h1:4eyrDxyht86tT4Ztm+kvlyNBLIk071gR+ZQdhphc9dQ= +pgregory.net/rapid v0.6.1/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/classic-azure-go-aks-multicluster/main.go b/classic-azure-go-aks-multicluster/main.go index c0c44a93e..0a8bef6b0 100644 --- a/classic-azure-go-aks-multicluster/main.go +++ b/classic-azure-go-aks-multicluster/main.go @@ -3,9 +3,9 @@ package main import ( "fmt" - "github.com/pulumi/pulumi-azure/sdk/v4/go/azure/containerservice" - "github.com/pulumi/pulumi-azure/sdk/v4/go/azure/core" - "github.com/pulumi/pulumi-azuread/sdk/v4/go/azuread" + "github.com/pulumi/pulumi-azure/sdk/v6/go/azure/containerservice" + "github.com/pulumi/pulumi-azure/sdk/v6/go/azure/core" + "github.com/pulumi/pulumi-azuread/sdk/v5/go/azuread" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumi/config" ) @@ -21,7 +21,6 @@ func main() { pulumi.Run(func(ctx *pulumi.Context) error { // Set up configuration variables for this stack. c := config.New(ctx, "") - password := c.Require("password") location := c.Get("location") if location == "" { location = "eastus" @@ -54,13 +53,12 @@ func main() { adSpPasswordArgs := azuread.ServicePrincipalPasswordArgs{ ServicePrincipalId: adSp.ID(), - Value: pulumi.String(password), - EndDate: pulumi.String("2099-01-01T00:00:00Z"), } adSpPassword, err := azuread.NewServicePrincipalPassword(ctx, "aksSpPassword", &adSpPasswordArgs) if err != nil { return err } + ctx.Export("password", adSpPassword.Value) // Per-cluster configs aksClusterConfigs := [2]*aksClusterConfig{ diff --git a/classic-azure-go-webserver-component/README.md b/classic-azure-go-webserver-component/README.md index cbe153c55..b87147adc 100755 --- a/classic-azure-go-webserver-component/README.md +++ b/classic-azure-go-webserver-component/README.md @@ -16,34 +16,35 @@ defining a `WebServer` class, we can hide many details (see [here](./webserver.g ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Configure the deployment. The username and password here will be used to configure the Virtual Machine. The +1. Configure the deployment. The username and password here will be used to configure the Virtual Machine. The password must adhere to the [Azure restrictions on VM passwords]( https://docs.microsoft.com/en-us/azure/virtual-machines/windows/faq#what-are-the-password-requirements-when-creating-a-vm). - ``` - $ pulumi config set azure:location westus # any valid Azure region will do - $ pulumi config set username webmaster - $ pulumi config set password --secret - $ pulumi config set count 5 # optional -- will default to 2 if left out + ```bash + pulumi config set azure:location westus # any valid Azure region will do + pulumi config set azure:subscriptionId + pulumi config set username webmaster + pulumi config set password --secret + pulumi config set count 5 # optional -- will default to 2 if left out ``` Note that `--secret` ensures your password is encrypted safely. -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -55,9 +56,9 @@ defining a `WebServer` class, we can hide many details (see [here](./webserver.g Update duration: 4m27s ``` -1. Check the resulting IP addresses: +1. Check the resulting IP addresses: - ``` + ```console $ pulumi stack output ipAddresses [ 40.112.181.239, ..., 40.112.181.240 ] ``` diff --git a/classic-azure-go-webserver-component/go.mod b/classic-azure-go-webserver-component/go.mod index 86ef3d860..9403f2dbf 100644 --- a/classic-azure-go-webserver-component/go.mod +++ b/classic-azure-go-webserver-component/go.mod @@ -1,8 +1,97 @@ module github.com/pulumi/examples/azure-go-webserver-component -go 1.13 +go 1.21 + +toolchain go1.23.0 + +require ( + github.com/pulumi/pulumi-azure/sdk/v6 v6.3.1 + github.com/pulumi/pulumi/sdk/v3 v3.133.0 +) require ( - github.com/pulumi/pulumi-azure/sdk/v4 v4.0.0 - github.com/pulumi/pulumi/sdk/v3 v3.0.0 + dario.cat/mergo v1.0.0 // indirect + github.com/BurntSushi/toml v1.2.1 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/atotto/clipboard v0.1.4 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/blang/semver v3.5.1+incompatible // indirect + github.com/charmbracelet/bubbles v0.16.1 // indirect + github.com/charmbracelet/bubbletea v0.25.0 // indirect + github.com/charmbracelet/lipgloss v0.7.1 // indirect + github.com/cheggaaa/pb v1.0.29 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/djherbis/times v1.5.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/fatih/color v1.15.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.12.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.2.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl/v2 v2.17.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mitchellh/go-ps v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.2 // indirect + github.com/opentracing/basictracer-go v1.1.0 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/pgavlin/fx v0.1.6 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/term v1.1.0 // indirect + github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect + github.com/pulumi/esc v0.9.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/texttheater/golang-levenshtein v1.0.1 // indirect + github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + github.com/zclconf/go-cty v1.13.2 // indirect + go.uber.org/atomic v1.9.0 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect + golang.org/x/mod v0.18.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/tools v0.22.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/grpc v1.63.2 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/frand v1.4.2 // indirect ) diff --git a/classic-azure-go-webserver-component/go.sum b/classic-azure-go-webserver-component/go.sum index b8138d5a1..1381b7104 100644 --- a/classic-azure-go-webserver-component/go.sum +++ b/classic-azure-go-webserver-component/go.sum @@ -1,349 +1,318 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= +github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -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/cheggaaa/pb v1.0.18 h1:G/DgkKaBP0V5lnBg/vx61nVxxAU+VqU5yMzSc0f2PPE= -github.com/cheggaaa/pb v1.0.18/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= +github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= +github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= +github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= +github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= +github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= +github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/djherbis/times v1.2.0 h1:xANXjsC/iBqbO00vkWlYwPWgBgEVU6m6AFYg0Pic+Mc= -github.com/djherbis/times v1.2.0/go.mod h1:CGMZlo255K5r4Yw0b9RRfFQpM2y7uOmxg4jm9HsaVf8= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/djherbis/times v1.5.0 h1:79myA211VwPhFTqUk8xehWrsEO+zcIZj0zT8mXPVARU= +github.com/djherbis/times v1.5.0/go.mod h1:5q7FDLvbNg1L/KaBmPcWlVR9NmoKo3+ucqUA3ijQhA0= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc= -github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= +github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -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= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/hcl/v2 v2.17.0 h1:z1XvSUyXd1HP10U4lrLg5e0JMVz6CPaJvAgxM0KNZVY= +github.com/hashicorp/hcl/v2 v2.17.0/go.mod h1:gJyW2PTShkJqQBKpAmPO3yxMxIuoXkOF2TpqXzrQyx4= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= -github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/opentracing/basictracer-go v1.1.0 h1:Oa1fTSBvAl8pa3U+IJYqrKm0NALwH9OsgwOqDv4xJW0= +github.com/opentracing/basictracer-go v1.1.0/go.mod h1:V2HZueSJEp879yv285Aap1BS69fQMD+MNP1mRs6mBQc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pgavlin/fx v0.1.6 h1:r9jEg69DhNoCd3Xh0+5mIbdbS3PqWrVWujkY76MFRTU= +github.com/pgavlin/fx v0.1.6/go.mod h1:KWZJ6fqBBSh8GxHYqwYCf3rYE7Gp2p0N8tJp8xv9u9M= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= +github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= 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_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pulumi/pulumi-azure/sdk/v4 v4.0.0 h1:7xhO/ElTrC4/u5hdDbcB+QsJkbMKiTRdovZWpB51TvA= -github.com/pulumi/pulumi-azure/sdk/v4 v4.0.0/go.mod h1:oOjat41tnqyi4yzMI3xD32oXfrcQvErTjhNkSMPctoI= -github.com/pulumi/pulumi/sdk/v3 v3.0.0 h1:zkragE05t1Rco/ymfqMU4UXdEmKMmOH0SXhUKQxujxQ= -github.com/pulumi/pulumi/sdk/v3 v3.0.0/go.mod h1:GBHyQ7awNQSRmiKp/p8kIKrGrMOZeA/k2czoM/GOqds= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= -github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= -github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= +github.com/pulumi/esc v0.9.1 h1:HH5eEv8sgyxSpY5a8yePyqFXzA8cvBvapfH8457+mIs= +github.com/pulumi/esc v0.9.1/go.mod h1:oEJ6bOsjYlQUpjf70GiX+CXn3VBmpwFDxUTlmtUN84c= +github.com/pulumi/pulumi-azure/sdk/v6 v6.3.1 h1:qn5zRk5UDNSLvw3cSaxnJB2wKoIA4A/uLB+qptxRwXY= +github.com/pulumi/pulumi-azure/sdk/v6 v6.3.1/go.mod h1:5ARiwRnDudNp7tj1kG01JI+B5YMvcfUNSBwg1FlmpyA= +github.com/pulumi/pulumi/sdk/v3 v3.133.0 h1:o+7dbJZY9BVgAjOF5GYIWgjp/zpKAgWZwD4pPjUMXKQ= +github.com/pulumi/pulumi/sdk/v3 v3.133.0/go.mod h1:J5kQEX8v87aeUhk6NdQXnjCo1DbiOnOiL3Sf2DuDda8= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6 h1:9VTskZOIRf2vKF3UL8TuWElry5pgUpV1tFSe/e/0m/E= -github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 h1:X9dsIWPuuEJlPX//UmRKophhOKCGXc46RVIGuttks68= -github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7/go.mod h1:UxoP3EypF8JfGEjAII8jx1q8rQyDnX8qdTCs/UQBVIE= -github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM= -github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= -github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= +github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty v1.13.2 h1:4GvrUxe/QUDYuJKAav4EYqdM47/kZa672LwmXFmEKT0= +github.com/zclconf/go-cty v1.13.2/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6 h1:TjszyFsQsyZNHwdVdZ5m7bjmreu0znc2kRYsEml9/Ww= -golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= +golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200608174601-1b747fd94509 h1:MI14dOfl3OG6Zd32w3ugsrvcUO810fDZdWakTq39dH4= -golang.org/x/tools v0.0.0-20200608174601-1b747fd94509/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482 h1:i+Aiej6cta/Frzp13/swvwz5O00kYcSe0A/C5Wd7zX8= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -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= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= +lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= +pgregory.net/rapid v0.6.1 h1:4eyrDxyht86tT4Ztm+kvlyNBLIk071gR+ZQdhphc9dQ= +pgregory.net/rapid v0.6.1/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/classic-azure-go-webserver-component/main.go b/classic-azure-go-webserver-component/main.go index 9e5472637..7a52868cd 100644 --- a/classic-azure-go-webserver-component/main.go +++ b/classic-azure-go-webserver-component/main.go @@ -5,8 +5,8 @@ package main import ( "fmt" - "github.com/pulumi/pulumi-azure/sdk/v4/go/azure/core" - "github.com/pulumi/pulumi-azure/sdk/v4/go/azure/network" + "github.com/pulumi/pulumi-azure/sdk/v6/go/azure/core" + "github.com/pulumi/pulumi-azure/sdk/v6/go/azure/network" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumi/config" ) @@ -35,8 +35,8 @@ func main() { AddressSpaces: pulumi.StringArray{pulumi.String("10.0.0.0/16")}, Subnets: network.VirtualNetworkSubnetArray{ network.VirtualNetworkSubnetArgs{ - Name: pulumi.String("default"), - AddressPrefix: pulumi.String("10.0.1.0/24"), + Name: pulumi.String("default"), + AddressPrefixes: pulumi.StringArray([]pulumi.StringInput{pulumi.String("10.0.1.0/24")}), }, }, }) diff --git a/classic-azure-go-webserver-component/webserver.go b/classic-azure-go-webserver-component/webserver.go index 2e6ba1ead..90d0888a0 100644 --- a/classic-azure-go-webserver-component/webserver.go +++ b/classic-azure-go-webserver-component/webserver.go @@ -3,8 +3,8 @@ package main import ( - "github.com/pulumi/pulumi-azure/sdk/v4/go/azure/compute" - "github.com/pulumi/pulumi-azure/sdk/v4/go/azure/network" + "github.com/pulumi/pulumi-azure/sdk/v6/go/azure/compute" + "github.com/pulumi/pulumi-azure/sdk/v6/go/azure/network" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/classic-azure-py-aks-multicluster/Pulumi.yaml b/classic-azure-py-aks-multicluster/Pulumi.yaml index 3b80e2902..ef301b7ab 100644 --- a/classic-azure-py-aks-multicluster/Pulumi.yaml +++ b/classic-azure-py-aks-multicluster/Pulumi.yaml @@ -9,6 +9,8 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into password: description: Your cluster password secret: true diff --git a/classic-azure-py-aks-multicluster/README.md b/classic-azure-py-aks-multicluster/README.md index a3940da58..1b6e4d357 100644 --- a/classic-azure-py-aks-multicluster/README.md +++ b/classic-azure-py-aks-multicluster/README.md @@ -4,7 +4,7 @@ # Multiple Azure Kubernetes Service (AKS) Clusters This example demonstrates creating multiple Azure Kubernetes Service (AKS) clusters in different regions and with -different node counts. Please see https://docs.microsoft.com/en-us/azure/aks/ for more information about AKS. +different node counts. Please see for more information about AKS. # Prerequisites @@ -16,7 +16,7 @@ We will be deploying to Azure, so you will need an Azure account. If you don't h # Running the Example -> **Note**: Due to an issue in the Azure Terraform Provider (https://github.com/terraform-providers/terraform-provider-azurerm/issues/1635) the +> **Note**: Due to an issue in the Azure Terraform Provider () the > creation of an Azure Service Principal, which is needed to create the Kubernetes cluster (see index.ts), is delayed and may not > be available when the cluster is created. If you get a Service Principal not found error, as a work around, you should be able to run `pulumi up` > again, at which time the Service Principal should have been created. @@ -26,29 +26,30 @@ After cloning this repo, `cd` into it and run these commands. 1. Create a new stack, which is an isolated deployment target for this example: ```bash - $ pulumi stack init dev + pulumi stack init dev ``` 1. Set the required configuration variables for this program: ```bash - $ pulumi config set azure:environment public - $ pulumi config set password --secret [your-cluster-password-here] - $ ssh-keygen -t rsa -f key.rsa - $ pulumi config set sshPublicKey < key.rsa.pub + pulumi config set azure:environment public + pulumi config set azure:subscriptionId + pulumi config set password --secret [your-cluster-password-here] + ssh-keygen -t rsa -f key.rsa + pulumi config set sshPublicKey < key.rsa.pub ``` 1. Deploy everything with the `pulumi up` command. This provisions all the Azure resources necessary, including an Active Directory service principal and AKS clusters: ```bash - $ pulumi up + pulumi up ``` 1. After a couple minutes, your AKS clusters will be ready. The AKS cluster names will be printed as output variables once `pulumi up` completes. - ```bash + ```console $ pulumi up ... @@ -67,6 +68,6 @@ After cloning this repo, `cd` into it and run these commands. 1. Once you are done, you can destroy all of the resources, and the stack: ```bash - $ pulumi destroy - $ pulumi stack rm + pulumi destroy + pulumi stack rm ``` diff --git a/classic-azure-py-aks-multicluster/__main__.py b/classic-azure-py-aks-multicluster/__main__.py index 6c5c2c162..02b6b89e7 100644 --- a/classic-azure-py-aks-multicluster/__main__.py +++ b/classic-azure-py-aks-multicluster/__main__.py @@ -18,12 +18,11 @@ ad_sp = ad.ServicePrincipal( "aksSp", - application_id=ad_app.application_id) + client_id=ad_app.client_id) ad_sp_password = ad.ServicePrincipalPassword( "aksSpPassword", service_principal_id=ad_sp.id, - value=password, end_date="2099-01-01T00:00:00Z") aks_cluster_config = [ @@ -43,7 +42,7 @@ ), ), service_principal=containerservice.KubernetesClusterServicePrincipalArgs( - client_id=ad_app.application_id, + client_id=ad_app.client_id, client_secret=ad_sp_password.value ), location=config["location"], diff --git a/classic-azure-py-aks-multicluster/requirements.txt b/classic-azure-py-aks-multicluster/requirements.txt index 743f49c1c..fefed03fd 100644 --- a/classic-azure-py-aks-multicluster/requirements.txt +++ b/classic-azure-py-aks-multicluster/requirements.txt @@ -1,4 +1,4 @@ pulumi>=3.5.1,<4.0.0 -pulumi-azure>=4.7.0,<5.0.0 -pulumi-azuread>=4.3.0,<5.0.0 +pulumi-azure>=6.0.0,<7.0.0 +pulumi-azuread>=5.53.0,<6.0.0 pulumi-random>=4.2.0,<5.0.0 diff --git a/classic-azure-py-arm-template/README.md b/classic-azure-py-arm-template/README.md index 08887353e..710e3c99c 100644 --- a/classic-azure-py-arm-template/README.md +++ b/classic-azure-py-arm-template/README.md @@ -23,7 +23,7 @@ here](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) to connect 1. Create a new stack: - ```sh + ```console $ pulumi stack init Enter a stack name: azure-arm-dev ``` @@ -31,14 +31,15 @@ here](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) to connect 2. Set the required configuration variables for this program, and log into Azure: ```bash - $ pulumi config set azure:environment public - $ pulumi config set azure:location westus2 - $ az login + pulumi config set azure:environment public + pulumi config set azure:location westus2 + pulumi config set azure:subscriptionId + az login ``` 3. Perform the deployment: - ```sh + ```console $ pulumi up Updating stack 'azure-arm-dev' Performing changes: @@ -62,8 +63,8 @@ here](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) to connect 4. Tidy up and delete all resources allocated by your deployment: ```bash - $ pulumi destroy -y --skip-preview - $ pulumi stack rm -y + pulumi destroy -y --skip-preview + pulumi stack rm -y ``` ## Next Steps diff --git a/classic-azure-py-arm-template/requirements.txt b/classic-azure-py-arm-template/requirements.txt index e665e30ed..4597cbd3d 100644 --- a/classic-azure-py-arm-template/requirements.txt +++ b/classic-azure-py-arm-template/requirements.txt @@ -1,2 +1,2 @@ pulumi>=3.5.1,<4.0.0 -pulumi-azure>=4.7.0,<5.0.0 +pulumi-azure>=6.0.0,<7.0.0 diff --git a/classic-azure-py-hdinsight-spark/Pulumi.yaml b/classic-azure-py-hdinsight-spark/Pulumi.yaml index f3395b64b..207f345a9 100644 --- a/classic-azure-py-hdinsight-spark/Pulumi.yaml +++ b/classic-azure-py-hdinsight-spark/Pulumi.yaml @@ -12,6 +12,8 @@ template: azure:location: description: The Azure location to use default: WestUS + azure:subscriptionId: + description: The Azure Subscription to deploy into username: description: Spark username secret: true diff --git a/classic-azure-py-hdinsight-spark/README.md b/classic-azure-py-hdinsight-spark/README.md index 5bebe1f71..52c6c599c 100644 --- a/classic-azure-py-hdinsight-spark/README.md +++ b/classic-azure-py-hdinsight-spark/README.md @@ -10,31 +10,32 @@ An example Pulumi component that deploys a Spark cluster on Azure HDInsight. 1. Create a new stack: ```bash - $ pulumi stack init dev + pulumi stack init dev ``` 1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): ```bash - $ az login + az login ``` -1. Specify the Azure location to use: +1. Specify the Azure location and subscription to use: ```bash - $ pulumi config set azure:location WestUS + pulumi config set azure:location WestUS + pulumi config set azure:subscriptionId ``` 1. Define Spark username and password (make it complex enough to satisfy Azure policy): ```bash - $ pulumi config set username - $ pulumi config set --secret password + pulumi config set username + pulumi config set --secret password ``` 1. Run `pulumi up` to preview and deploy changes: - ``` bash + ``` console $ pulumi up Previewing changes: ... @@ -48,7 +49,7 @@ An example Pulumi component that deploys a Spark cluster on Azure HDInsight. 1. Check the deployed Spark endpoint: - ```bash + ```console $ pulumi stack output endpoint https://myspark1234abcd.azurehdinsight.net/ diff --git a/classic-azure-py-hdinsight-spark/__main__.py b/classic-azure-py-hdinsight-spark/__main__.py index dc90275a1..8ec44c13e 100644 --- a/classic-azure-py-hdinsight-spark/__main__.py +++ b/classic-azure-py-hdinsight-spark/__main__.py @@ -37,18 +37,18 @@ ), roles=hdinsight.SparkClusterRolesArgs( head_node=hdinsight.SparkClusterRolesHeadNodeArgs( - vm_size="Standard_D12_v2", + vm_size="Standard_D12_V2", username=username, password=password ), worker_node=hdinsight.SparkClusterRolesWorkerNodeArgs( - vm_size="Standard_D12_v2", + vm_size="Standard_D12_V2", username=username, password=password, target_instance_count=3, ), zookeeper_node=hdinsight.SparkClusterRolesZookeeperNodeArgs( - vm_size="Standard_D12_v2", + vm_size="Standard_D12_V2", username=username, password=password, ), diff --git a/classic-azure-py-hdinsight-spark/requirements.txt b/classic-azure-py-hdinsight-spark/requirements.txt index e665e30ed..4597cbd3d 100644 --- a/classic-azure-py-hdinsight-spark/requirements.txt +++ b/classic-azure-py-hdinsight-spark/requirements.txt @@ -1,2 +1,2 @@ pulumi>=3.5.1,<4.0.0 -pulumi-azure>=4.7.0,<5.0.0 +pulumi-azure>=6.0.0,<7.0.0 diff --git a/classic-azure-py-msi-keyvault-rbac/Pulumi.yaml b/classic-azure-py-msi-keyvault-rbac/Pulumi.yaml index 9572990ee..adc34c47f 100644 --- a/classic-azure-py-msi-keyvault-rbac/Pulumi.yaml +++ b/classic-azure-py-msi-keyvault-rbac/Pulumi.yaml @@ -11,3 +11,5 @@ template: default: public azure:location: description: The Azure location to use (e.g., `eastus` or `westeurope`) + azure:subscriptionId: + description: The Azure Subscription to deploy into diff --git a/classic-azure-py-msi-keyvault-rbac/README.md b/classic-azure-py-msi-keyvault-rbac/README.md index f5e801066..edf4d66fc 100644 --- a/classic-azure-py-msi-keyvault-rbac/README.md +++ b/classic-azure-py-msi-keyvault-rbac/README.md @@ -20,30 +20,31 @@ The application consists of several parts: 1. Create a new stack: ```bash - $ pulumi stack init dev + pulumi stack init dev ``` 1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): ```bash - $ az login + az login ``` 1. Build and publish the ASP.NET Core project: ```bash - $ dotnet publish webapp + dotnet publish webapp ``` -1. Set an appropriate Azure location like: +1. Set an appropriate Azure location and subscription like: ```bash - $ pulumi config set azure:location westus + pulumi config set azure:location westus + pulumi config set azure:subscriptionId ``` 1. Run `pulumi up` to preview and deploy changes: - ```bash + ```console $ pulumi up Previewing changes: ... @@ -57,7 +58,7 @@ The application consists of several parts: 1. Check the deployed website endpoint: - ```bash + ```console $ pulumi stack output endpoint https://app129968b8.azurewebsites.net/ $ curl "$(pulumi stack output endpoint)" diff --git a/classic-azure-py-msi-keyvault-rbac/__main__.py b/classic-azure-py-msi-keyvault-rbac/__main__.py index b8deda3c6..a3e0f4438 100644 --- a/classic-azure-py-msi-keyvault-rbac/__main__.py +++ b/classic-azure-py-msi-keyvault-rbac/__main__.py @@ -1,11 +1,11 @@ -from pulumi_azure import core, storage, sql, appservice, keyvault, authorization +from pulumi_azure import core, storage, mssql, appservice, keyvault, authorization from pulumi import export, Output, asset import pulumi_random as random def createFirewallRules(arg): ips = arg.split(",") for ip in ips: - rule = sql.FirewallRule( + rule = mssql.FirewallRule( "FR%s" % ip, resource_group_name=resource_group.name, start_ip_address=ip, @@ -32,7 +32,7 @@ def createFirewallRules(arg): special=True, ).result -sql_server = sql.SqlServer( +sql_server = mssql.Server( "sqlserver", resource_group_name=resource_group.name, administrator_login_password=administrator_login_password, @@ -40,11 +40,10 @@ def createFirewallRules(arg): version="12.0") -database = sql.Database( +database = mssql.Database( "sqldb", - resource_group_name=resource_group.name, - server_name=sql_server.name, - requested_service_objective_name="S0") + server_id=sql_server.id, + sku_name="S0") connection_string = Output.all(sql_server.name, database.name) \ .apply(lambda args: f"Server=tcp:{args[0]}.database.windows.net;Database={args[1]};") or "1111" @@ -57,14 +56,11 @@ def createFirewallRules(arg): source=asset.FileAsset("./README.md") ) -app_service_plan = appservice.Plan( +app_service_plan = appservice.ServicePlan( "asp", resource_group_name=resource_group.name, - kind="App", - sku=appservice.PlanSkuArgs( - tier="Basic", - size="B1" - ) + os_type="Linux", + sku_name="B1", ) blob = storage.Blob( @@ -87,7 +83,7 @@ def createFirewallRules(arg): access_policies=[keyvault.KeyVaultAccessPolicyArgs( tenant_id=tenant_id, object_id=current_principal, - secret_permissions=["delete", "get", "list", "set"] + secret_permissions=["Delete", "Get", "List", "Set"] )] ) @@ -95,7 +91,7 @@ def createFirewallRules(arg): connection_string=storage_account.primary_connection_string, start="2020-01-01", expiry="2030-01-01", - container_name=container_storage_account.name, + container_name=container.name, permissions=storage.GetAccountBlobContainerSASPermissionsArgs( read=True, write=False, @@ -118,13 +114,14 @@ def createFirewallRules(arg): secret_uri = Output.all(vault.vault_uri, secret.name, secret.version) \ .apply(lambda args: f"{args[0]}secrets/{args[1]}/{args[2]}") -app = appservice.AppService( +app = appservice.LinuxWebApp( "app", resource_group_name=resource_group.name, - app_service_plan_id=app_service_plan.id, + service_plan_id=app_service_plan.id, identity=appservice.AppServiceIdentityArgs( type="SystemAssigned", ), + site_config={}, app_settings={ "WEBSITE_RUN_FROM_ZIP": secret_uri.apply(lambda args: "@Microsoft.KeyVault(SecretUri=" + args + ")"), "StorageBlobUrl": text_blob.url, @@ -144,16 +141,7 @@ def createFirewallRules(arg): key_vault_id=vault.id, tenant_id=tenant_id, object_id=principal_id, - secret_permissions=["get"]) - -sql_admin = sql.ActiveDirectoryAdministrator( - "adamin", - resource_group_name=resource_group.name, - tenant_id=tenant_id, - object_id=principal_id, - login="adadmin", - server_name=sql_server.name) - + secret_permissions=["Get"]) blob_permission = authorization.Assignment( "readblob", @@ -164,6 +152,6 @@ def createFirewallRules(arg): ips = app.outbound_ip_addresses.apply(createFirewallRules) -export("endpoint", app.default_site_hostname.apply( +export("endpoint", app.default_hostname.apply( lambda endpoint: "https://" + endpoint )) diff --git a/classic-azure-py-msi-keyvault-rbac/requirements.txt b/classic-azure-py-msi-keyvault-rbac/requirements.txt index a91780f7c..0b8a609be 100644 --- a/classic-azure-py-msi-keyvault-rbac/requirements.txt +++ b/classic-azure-py-msi-keyvault-rbac/requirements.txt @@ -1,3 +1,3 @@ pulumi>=3.5.1,<4.0.0 -pulumi-azure>=4.7.0,<5.0.0 +pulumi-azure>=6.0.0,<7.0.0 pulumi-random>=4.2.0,<5.0.0 diff --git a/classic-azure-py-vm-scaleset/Pulumi.yaml b/classic-azure-py-vm-scaleset/Pulumi.yaml index 88f2a72e3..6a44ab17f 100644 --- a/classic-azure-py-vm-scaleset/Pulumi.yaml +++ b/classic-azure-py-vm-scaleset/Pulumi.yaml @@ -12,3 +12,5 @@ template: azure:location: description: The Azure location to use default: WestUS + azure:subscriptionId: + description: The Azure Subscription to deploy into diff --git a/classic-azure-py-vm-scaleset/README.md b/classic-azure-py-vm-scaleset/README.md index b26a1bce6..632640707 100644 --- a/classic-azure-py-vm-scaleset/README.md +++ b/classic-azure-py-vm-scaleset/README.md @@ -16,20 +16,21 @@ This example provisions a Scale Set of Linux web servers with nginx deployed, co 1. Create a new stack: ```bash - $ pulumi stack init dev + pulumi stack init dev ``` 1. Configure the app deployment. ```bash - $ pulumi config set azure:location westus # any valid Azure region will do + pulumi config set azure:location westus # any valid Azure region will do + pulumi config set azure:subscriptionId ``` Optionally, configure the username and password for the admin user. Otherwise, they will be auto-generated. ```bash - $ pulumi config set adminUser webmaster - $ pulumi config set adminPassword --secret + pulumi config set adminUser webmaster + pulumi config set adminPassword --secret ``` Note that `--secret` ensures your password is encrypted safely. @@ -37,12 +38,12 @@ This example provisions a Scale Set of Linux web servers with nginx deployed, co 1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): ```bash - $ az login + az login ``` 1. Run `pulumi up` to preview and deploy changes: - ```bash + ```console $ pulumi up Previewing update: ... @@ -56,7 +57,7 @@ This example provisions a Scale Set of Linux web servers with nginx deployed, co 1. Check the domain name of the PIP: - ```bash + ```console $ pulumi stack output publicAddress dsuv3vqbgi.westeurope.cloudapp.azure.com $ curl http://$(pulumi stack output publicAddress) diff --git a/classic-azure-py-vm-scaleset/__main__.py b/classic-azure-py-vm-scaleset/__main__.py index d433b0213..9b666f1b5 100644 --- a/classic-azure-py-vm-scaleset/__main__.py +++ b/classic-azure-py-vm-scaleset/__main__.py @@ -1,6 +1,7 @@ from pulumi import Config, export, ResourceOptions from pulumi_azure import core, network, lb, compute import pulumi_random as random +import base64 config = Config() admin_user = config.get("adminUser") or "azureuser" @@ -34,19 +35,16 @@ bpepool = lb.BackendAddressPool( "bpepool", - resource_group_name=resource_group.name, loadbalancer_id=load_balancer.id) ssh_probe = lb.Probe( "ssh-probe", - resource_group_name=resource_group.name, loadbalancer_id=load_balancer.id, port=application_port) nat_ule = lb.Rule( "lbnatrule-http", - resource_group_name=resource_group.name, - backend_address_pool_id=bpepool.id, + backend_address_pool_ids=[bpepool.id], backend_port=application_port, frontend_ip_configuration_name="PublicIPAddress", frontend_port=application_port, @@ -64,13 +62,13 @@ resource_group_name=resource_group.name, address_prefixes=["10.0.2.0/24"], virtual_network_name=vnet.name, - enforce_private_link_endpoint_network_policies=False) + private_link_service_network_policies_enabled=False) -scale_set = compute.ScaleSet( +scale_set = compute.LinuxVirtualMachineScaleSet( "vmscaleset", resource_group_name=resource_group.name, - network_profiles=[compute.ScaleSetNetworkProfileArgs( - ip_configurations=[compute.ScaleSetNetworkProfileIpConfigurationArgs( + network_interfaces=[compute.LinuxVirtualMachineScaleSetNetworkInterfaceArgs( + ip_configurations=[compute.LinuxVirtualMachineScaleSetNetworkInterfaceIpConfigurationArgs( load_balancer_backend_address_pool_ids=[bpepool.id], name="IPConfiguration", primary=True, @@ -79,43 +77,34 @@ name="networkprofile", primary=True, )], - os_profile=compute.ScaleSetOsProfileArgs( - admin_username=admin_user, - admin_password=admin_password, - computer_name_prefix="vmlab", - custom_data=""" - #cloud-config - packages: - - nginx - """, - ), - os_profile_linux_config=compute.ScaleSetOsProfileLinuxConfigArgs( - disable_password_authentication=False, - ), - sku=compute.ScaleSetSkuArgs( - capacity=1, - name="Standard_DS1_v2", - tier="Standard", - ), - storage_profile_data_disks=[compute.ScaleSetStorageProfileDataDiskArgs( + admin_username=admin_user, + admin_password=admin_password, + computer_name_prefix="vmlab", + custom_data=base64.b64encode(bytes(""" + #cloud-config + packages: + - nginx + """, 'utf-8')).decode('utf-8'), + disable_password_authentication=False, + sku="Standard_DS1_v2", + data_disks=[compute.LinuxVirtualMachineScaleSetDataDiskArgs( + storage_account_type="Standard_LRS", caching="ReadWrite", create_option="Empty", disk_size_gb=10, lun=0, )], - storage_profile_image_reference=compute.ScaleSetStorageProfileImageReferenceArgs( + source_image_reference=compute.LinuxVirtualMachineScaleSetSourceImageReferenceArgs( offer="UbuntuServer", publisher="Canonical", sku="16.04-LTS", version="latest", ), - storage_profile_os_disk=compute.ScaleSetStorageProfileOsDiskArgs( + os_disk=compute.LinuxVirtualMachineScaleSetOsDiskArgs( caching="ReadWrite", - create_option="FromImage", - managed_disk_type="Standard_LRS", - name="", + storage_account_type="Standard_LRS", ), - upgrade_policy_mode="Manual", + upgrade_mode="Manual", opts=ResourceOptions(depends_on=[bpepool])) export("public_address", public_ip.fqdn) diff --git a/classic-azure-py-vm-scaleset/requirements.txt b/classic-azure-py-vm-scaleset/requirements.txt index a91780f7c..0b8a609be 100644 --- a/classic-azure-py-vm-scaleset/requirements.txt +++ b/classic-azure-py-vm-scaleset/requirements.txt @@ -1,3 +1,3 @@ pulumi>=3.5.1,<4.0.0 -pulumi-azure>=4.7.0,<5.0.0 +pulumi-azure>=6.0.0,<7.0.0 pulumi-random>=4.2.0,<5.0.0 diff --git a/classic-azure-py-webserver-component/README.md b/classic-azure-py-webserver-component/README.md index dd901c7f4..e3b3efbdf 100644 --- a/classic-azure-py-webserver-component/README.md +++ b/classic-azure-py-webserver-component/README.md @@ -20,31 +20,32 @@ can be composed into a higher-level, reusable abstraction. 1. Create a new stack: ```bash - $ pulumi stack init + pulumi stack init ``` 1. Set the Azure environment: ```bash - $ pulumi config set azure:environment public + pulumi config set azure:environment public + pulumi config set azure:subscriptionId ``` 1. Set the required configuration for this example. This example requires you to supply a username and password to the virtual machine that we are going to create. ```bash - $ pulumi config set username myusername + pulumi config set username myusername ``` The password is a secret, so we can ask Pulumi to encrypt the configuration: ```bash - $ pulumi config set --secret password Hunter2hunter2 + pulumi config set --secret password Hunter2hunter2 ``` 1. Run `pulumi up` to preview and deploy the changes: - ```bash + ```console $ pulumi up Previewing update (dev): @@ -85,21 +86,21 @@ the virtual machine that we are going to create. 1. Get the IP address of the newly-created instance from the stack's outputs: - ```bash + ```console $ pulumi stack output public_ip 13.64.196.146 ``` 1. Check to see that your server is now running: - ```bash + ```console $ curl http://$(pulumi stack output public_ip) Hello, World! ``` 1. Destroy the stack: - ```bash + ```console $ pulumi destroy -y Previewing destroy (dev): diff --git a/classic-azure-py-webserver-component/__main__.py b/classic-azure-py-webserver-component/__main__.py index 5d1793539..7a68583a5 100644 --- a/classic-azure-py-webserver-component/__main__.py +++ b/classic-azure-py-webserver-component/__main__.py @@ -14,7 +14,7 @@ resource_group_name=resource_group.name, location=resource_group.location, address_spaces=["10.0.0.0/16"], - subnets=[network.VirtualNetworkSubnetArgs(name="default", address_prefix="10.0.1.0/24")], + subnets=[network.VirtualNetworkSubnetArgs(name="default", address_prefixes=["10.0.1.0/24"])], opts=ResourceOptions(parent=resource_group), ) diff --git a/classic-azure-py-webserver-component/requirements.txt b/classic-azure-py-webserver-component/requirements.txt index e665e30ed..4597cbd3d 100644 --- a/classic-azure-py-webserver-component/requirements.txt +++ b/classic-azure-py-webserver-component/requirements.txt @@ -1,2 +1,2 @@ pulumi>=3.5.1,<4.0.0 -pulumi-azure>=4.7.0,<5.0.0 +pulumi-azure>=6.0.0,<7.0.0 diff --git a/classic-azure-ts-aks-helm/.gitignore b/classic-azure-ts-aks-helm/.gitignore deleted file mode 100644 index dc6dae78d..000000000 --- a/classic-azure-ts-aks-helm/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin/ -/node_modules/ -key.rsa -key.rsa.pub diff --git a/classic-azure-ts-aks-helm/Pulumi.yaml b/classic-azure-ts-aks-helm/Pulumi.yaml deleted file mode 100644 index 2fa6fbd85..000000000 --- a/classic-azure-ts-aks-helm/Pulumi.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: azure-ts-aks-helm -runtime: nodejs -description: Create an Azure Kubernetes Service (AKS) cluster and deploy a Helm Chart into it -template: - config: - azure:environment: - description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) - default: public - password: - description: Your cluster password - secret: true - sshPublicKey: - description: Your SSH public key (generate with `ssh-keygen -t rsa -f key.rsa`) diff --git a/classic-azure-ts-aks-helm/README.md b/classic-azure-ts-aks-helm/README.md deleted file mode 100644 index 637d44b59..000000000 --- a/classic-azure-ts-aks-helm/README.md +++ /dev/null @@ -1,116 +0,0 @@ -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-aks-helm/README.md#gh-light-mode-only) -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-aks-helm/README.md#gh-dark-mode-only) - -# Azure Kubernetes Service (AKS) Cluster and Helm Chart - -This example demonstrates creating an Azure Kubernetes Service (AKS) Cluster, and deploying a Helm Chart into it, -all in one Pulumi program. Please see https://docs.microsoft.com/en-us/azure/aks/ for more information about AKS. - -## Prerequisites - -Ensure you have [downloaded and installed the Pulumi CLI](https://www.pulumi.com/docs/get-started/install/). - -We will be deploying to Azure, so you will need an Azure account. If you don't have an account, -[sign up for free here](https://azure.microsoft.com/en-us/free/). -[Follow the instructions here](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) to connect Pulumi to your Azure account. - -This example deploys a Helm Chart from [Bitnami's Helm chart repository](https://github.com/bitnami/charts) - -In addition you will need the following CLI tools: - -``` -$ az --version # Azure CLI -azure-cli 2.11.1 -core 2.11.1 -telemetry 1.0.5 -... - -$ npm --version # Node.js Package Manager -6.14.6 - -$ tsc --version # TypeScript compiler -Version 4.0.2 -``` - -## Running the Example - -After cloning this repo, `cd` into it and run these commands. A Kubernetes cluster and Apache web server will appear! - -1. Login to your Azure account: - - ```bash - $ az login - ``` - -2. Download nodejs dependencies: - - ```bash - $ npm install - ``` - -3. Create a new stack, which is an isolated deployment target for this example: - - ```bash - $ pulumi stack init - ``` - -4. Set the required configuration variables for this program: - - ```bash - $ pulumi config set azure:environment public - $ pulumi config set password --secret [your-cluster-password-here] - $ ssh-keygen -t rsa -f key.rsa - $ pulumi config set sshPublicKey < key.rsa.pub - ``` - -5. Deploy everything with the `pulumi up` command. This provisions all the Azure resources necessary, including - an Active Directory service principal, AKS cluster, and then deploys the Apache Helm Chart, all in a single gesture: - - > **Note**: Due to an [issue](https://github.com/terraform-providers/terraform-provider-azuread/issues/156) in Azure Terraform Provider, the - > creation of an Azure Service Principal, which is needed to create the Kubernetes cluster (see cluster.ts), is delayed and may not - > be available when the cluster is created. If you get a "Service Principal not found" error, as a work around, you should be able to run `pulumi up` - > again, at which time the Service Principal replication should have been completed. See [this issue](https://github.com/Azure/AKS/issues/1206) and - > [this doc](https://docs.microsoft.com/en-us/azure/aks/troubleshooting#im-receiving-errors-that-my-service-principal-was-not-found-when-i-try-to-create-a-new-cluster-without-passing-in-an-existing-one) - > for further details. - - ```bash - $ pulumi up - ``` - -6. After a couple minutes, your cluster and Apache server will be ready. Three output variables will be printed, - reflecting your cluster name (`cluster`), Kubernetes config (`kubeConfig`) and server IP address (`serviceIP`). - - Using these output variables, you may `curl` your Apache server's `serviceIP`: - - ```bash - $ curl $(pulumi stack output serviceIP) -

It works!

- ``` - - And you may also configure your `kubectl` client using the `kubeConfig` configuration: - - ```bash - $ pulumi stack output kubeconfig --show-secrets > kubeconfig.yaml - $ KUBECONFIG=./kubeconfig.yaml kubectl get service - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - apache-apache LoadBalancer 10.0.125.196 40.76.52.208 80:32080/TCP,443:31419/TCP 9m - kubernetes ClusterIP 10.0.0.1 443/TCP 13h - ``` - -7. At this point, you have a running cluster. Feel free to modify your program, and run `pulumi up` to redeploy changes. - The Pulumi CLI automatically detects what has changed and makes the minimal edits necessary to accomplish these - changes. This could be altering the existing chart, adding new Azure or Kubernetes resources, or anything, really. - -8. Once you are done, you can destroy all of the resources, and the stack: - - ```bash - $ pulumi destroy - $ pulumi stack rm - ``` - -9. If you make changes to the example `ts` code outside of an IDE, run - the TypeScript compiler to check your changes: - - ```bash - $ tsc --build tsconfig.json - ``` diff --git a/classic-azure-ts-aks-helm/cluster.ts b/classic-azure-ts-aks-helm/cluster.ts deleted file mode 100644 index 45ed1f310..000000000 --- a/classic-azure-ts-aks-helm/cluster.ts +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as azuread from "@pulumi/azuread"; -import * as k8s from "@pulumi/kubernetes"; -import * as pulumi from "@pulumi/pulumi"; -import * as config from "./config"; - -// Create the AD service principal for the K8s cluster. -const adApp = new azuread.Application("aks", { - displayName: "aks", -}); -const adSp = new azuread.ServicePrincipal("aksSp", { applicationId: adApp.applicationId }); -const adSpPassword = new azuread.ServicePrincipalPassword("aksSpPassword", { - servicePrincipalId: adSp.id, -}); - -// Now allocate an AKS cluster. -export const k8sCluster = new azure.containerservice.KubernetesCluster("aksCluster", { - resourceGroupName: config.resourceGroup.name, - location: config.location, - defaultNodePool: { - name: "aksagentpool", - nodeCount: config.nodeCount, - vmSize: config.nodeSize, - }, - dnsPrefix: `${pulumi.getStack()}-kube`, - linuxProfile: { - adminUsername: "aksuser", - sshKey: { - keyData: config.sshPublicKey, - }, - }, - servicePrincipal: { - clientId: adApp.applicationId, - clientSecret: adSpPassword.value, - }, -}); - -// Expose a K8s provider instance using our custom cluster instance. -export const k8sProvider = new k8s.Provider("aksK8s", { - kubeconfig: k8sCluster.kubeConfigRaw, -}); diff --git a/classic-azure-ts-aks-helm/config.ts b/classic-azure-ts-aks-helm/config.ts deleted file mode 100644 index 0a670ea19..000000000 --- a/classic-azure-ts-aks-helm/config.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as pulumi from "@pulumi/pulumi"; - -// Parse and export configuration variables for this stack. -const config = new pulumi.Config(); -export const password = config.require("password"); -export const location = config.get("location") || azure.Locations.EastUS; -export const nodeCount = config.getNumber("nodeCount") || 2; -export const nodeSize = config.get("nodeSize") || "Standard_D2_v2"; -export const sshPublicKey = config.require("sshPublicKey"); -export const resourceGroup = new azure.core.ResourceGroup("aks", { location }); diff --git a/classic-azure-ts-aks-helm/index.ts b/classic-azure-ts-aks-helm/index.ts deleted file mode 100644 index 6d188f3ad..000000000 --- a/classic-azure-ts-aks-helm/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as k8s from "@pulumi/kubernetes"; -import * as pulumi from "@pulumi/pulumi"; -import { k8sCluster, k8sProvider } from "./cluster"; - -const apache = new k8s.helm.v3.Chart( - "apache", - { - repo: "bitnami", - chart: "apache", - version: "9.1.17", - fetchOpts: { - repo: "https://charts.bitnami.com/bitnami", - }, - }, - { provider: k8sProvider }, -); - -export let cluster = k8sCluster.name; -export let kubeConfig = k8sCluster.kubeConfigRaw; -// Wait for the cluster to be ready before trying to get the IP info. -export let serviceIP = pulumi.unsecret(k8sCluster.kubeConfigRaw.apply(kubeconfig => apache - .getResourceProperty("v1/Service", "default", "apache", "status") - .apply(status => status.loadBalancer.ingress[0].ip))); diff --git a/classic-azure-ts-aks-helm/package.json b/classic-azure-ts-aks-helm/package.json deleted file mode 100644 index 5ba1f78a1..000000000 --- a/classic-azure-ts-aks-helm/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "azure-ts-aks-helm", - "version": "0.1.0", - "devDependencies": { - "@types/node": "^8.0.0" - }, - "dependencies": { - "@pulumi/azure": "^4.0.0", - "@pulumi/azuread": "^4.0.0", - "@pulumi/kubernetes": "^3.0.0", - "@pulumi/pulumi": "^3.0.0" - }, - "license": "Apache-2.0" -} diff --git a/classic-azure-ts-aks-helm/tsconfig.json b/classic-azure-ts-aks-helm/tsconfig.json deleted file mode 100644 index 3bf998d8a..000000000 --- a/classic-azure-ts-aks-helm/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "outDir": "bin", - "target": "es2016", - "module": "commonjs", - "moduleResolution": "node", - "declaration": true, - "sourceMap": true, - "stripInternal": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true, - "strictNullChecks": true - }, - "files": [ - "index.ts", - "config.ts" - ] -} diff --git a/classic-azure-ts-aks-keda/Pulumi.yaml b/classic-azure-ts-aks-keda/Pulumi.yaml index c8ae207ed..d64b7d51a 100644 --- a/classic-azure-ts-aks-keda/Pulumi.yaml +++ b/classic-azure-ts-aks-keda/Pulumi.yaml @@ -6,3 +6,5 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into diff --git a/classic-azure-ts-aks-keda/README.md b/classic-azure-ts-aks-keda/README.md index d4cd524ce..e89bbfc97 100644 --- a/classic-azure-ts-aks-keda/README.md +++ b/classic-azure-ts-aks-keda/README.md @@ -3,7 +3,7 @@ # Azure Kubernetes Service (AKS) Cluster and Azure Functions with KEDA -This example demonstrates creating an Azure Kubernetes Service (AKS) Cluster, and deploying an Azure Function App with Kubernetes-based Event Driven Autoscaling (KEDA) into it, all in one Pulumi program. Please see https://docs.microsoft.com/en-us/azure/aks/ for more information about AKS and https://docs.microsoft.com/en-us/azure/azure-functions/functions-kubernetes-keda for more information about KEDA. +This example demonstrates creating an Azure Kubernetes Service (AKS) Cluster, and deploying an Azure Function App with Kubernetes-based Event Driven Autoscaling (KEDA) into it, all in one Pulumi program. Please see for more information about AKS and for more information about KEDA. ## Prerequisites @@ -16,16 +16,18 @@ We will be deploying to Azure, so you will need an Azure account. If you don't h This example deploys a Helm Chart from Kedacore Helm chart repository. If you are using Helm v2: + ```bash -$ helm init --client-only -$ helm repo add kedacore https://kedacore.github.io/charts -$ helm repo update +helm init --client-only +helm repo add kedacore https://kedacore.github.io/charts +helm repo update ``` If you are using Helm v3: -``` -$ helm repo add kedacore https://kedacore.github.io/charts -$ helm repo update + +```bash +helm repo add kedacore https://kedacore.github.io/charts +helm repo update ``` ## Running the Example @@ -35,13 +37,14 @@ After cloning this repo, `cd` into it and run these commands. 1. Create a new stack, which is an isolated deployment target for this example: ```bash - $ pulumi stack init + pulumi stack init ``` 2. Set the Azure region to deploy to: ```bash - $ pulumi config set azure:location + pulumi config set azure:location + pulumi config set azure:subscriptionId ``` 3. Deploy everything with the `pulumi up` command. This provisions all the Azure resources necessary, including an Active Directory service principal, AKS cluster, and then deploys the Apache Helm Chart, and an Azure Function managed by KEDA, all in a single gesture: @@ -54,14 +57,14 @@ After cloning this repo, `cd` into it and run these commands. > for further details. ```bash - $ pulumi up + pulumi up ``` 4. After a couple minutes, your cluster and Azure Function app will be ready. Four output variables will be printed, reflecting your cluster name (`clusterName`), Kubernetes config (`kubeConfig`), Storage Account name (`storageAccountName`), and storage queue name (`queueName`). Using these output variables, you may configure your `kubectl` client using the `kubeConfig` configuration: - ```bash + ```console $ pulumi stack output kubeconfig --show-secrets > kubeconfig.yaml $ KUBECONFIG=./kubeconfig.yaml kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE @@ -73,7 +76,7 @@ After cloning this repo, `cd` into it and run these commands. Wait for a minute and then query the deployments again: - ```bash + ```console $ KUBECONFIG=./kubeconfig.yaml kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE keda-edge 1/1 1 1 14m @@ -82,7 +85,7 @@ After cloning this repo, `cd` into it and run these commands. Note that the `queue-handler` deployment got 1 instance ready. Looking at the pods: - ```bash + ```console $ KUBECONFIG=./kubeconfig.yaml kubectl get pod NAME READY STATUS RESTARTS AGE keda-edge-97664558c-q2mkd 1/1 Running 0 15m queue-handler-c496dcfc-mb6tx 1/1 Running 0 2m3s @@ -90,7 +93,7 @@ After cloning this repo, `cd` into it and run these commands. There's now a pod processing queue messages. The message should be gone from the storage queue at this point. Query the logs of the pod: - ```bash + ```console $ KUBECONFIG=./kubeconfig.yaml kubectl logs queue-handler-c496dcfc-mb6tx ... C# Queue trigger function processed: Test Message @@ -103,6 +106,6 @@ After cloning this repo, `cd` into it and run these commands. 6. Once you are done, you can destroy all of the resources, and the stack: ```bash - $ pulumi destroy - $ pulumi stack rm + pulumi destroy + pulumi stack rm ``` diff --git a/classic-azure-ts-aks-keda/cluster.ts b/classic-azure-ts-aks-keda/cluster.ts index 4fb9a9fc3..72e1a2983 100644 --- a/classic-azure-ts-aks-keda/cluster.ts +++ b/classic-azure-ts-aks-keda/cluster.ts @@ -25,10 +25,6 @@ export class AksCluster extends pulumi.ComponentResource { opts: pulumi.ComponentResourceOptions = {}) { super("examples:keda:AksCluster", name, args, opts); - const password = new random.RandomPassword("password", { - length: 20, - special: true, - }).result; const sshPublicKey = new tls.PrivateKey("keda", { algorithm: "RSA", rsaBits: 4096, @@ -36,10 +32,9 @@ export class AksCluster extends pulumi.ComponentResource { // Create the AD service principal for the K8s cluster. const adApp = new azuread.Application("aks", {displayName: "aks"}, { parent: this }); - const adSp = new azuread.ServicePrincipal("aksSp", { applicationId: adApp.applicationId }, { parent: this }); + const adSp = new azuread.ServicePrincipal("aksSp", { applicationId: adApp.clientId }, { parent: this }); const adSpPassword = new azuread.ServicePrincipalPassword("aksSpPassword", { servicePrincipalId: adSp.id, - value: password, endDate: "2099-01-01T00:00:00Z", }, { parent: this }); @@ -53,7 +48,7 @@ export class AksCluster extends pulumi.ComponentResource { const subnet = new azure.network.Subnet("keda", { resourceGroupName: args.resourceGroupName, virtualNetworkName: vnet.name, - addressPrefix: "10.2.1.0/24", + addressPrefixes: ["10.2.1.0/24"], }, { parent: this }); // Now allocate an AKS cluster. @@ -78,12 +73,11 @@ export class AksCluster extends pulumi.ComponentResource { clientSecret: adSpPassword.value, }, kubernetesVersion: args.kubernetesVersion, - roleBasedAccessControl: { enabled: true }, + roleBasedAccessControlEnabled: true, networkProfile: { networkPlugin: "azure", dnsServiceIp: "10.2.2.254", serviceCidr: "10.2.2.0/24", - dockerBridgeCidr: "172.17.0.1/16", }, }, { parent: this }); diff --git a/classic-azure-ts-aks-keda/keda.ts b/classic-azure-ts-aks-keda/keda.ts index 7b9832546..e2eaa407d 100644 --- a/classic-azure-ts-aks-keda/keda.ts +++ b/classic-azure-ts-aks-keda/keda.ts @@ -50,9 +50,9 @@ export class KedaService extends pulumi.ComponentResource { { provider: args.k8sProvider, parent: this }); // Deploy a KEDA Edge Helm chart - const keda = new k8s.helm.v2.Chart("keda-edge", { + const keda = new k8s.helm.v4.Chart("keda-edge", { chart: "keda", - fetchOpts: { + repositoryOpts: { repo: "https://kedacore.github.io/charts", }, version: "2.2.1", diff --git a/classic-azure-ts-aks-keda/package.json b/classic-azure-ts-aks-keda/package.json index 50fa97aa1..074ced243 100644 --- a/classic-azure-ts-aks-keda/package.json +++ b/classic-azure-ts-aks-keda/package.json @@ -5,13 +5,13 @@ "@types/node": "^8.0.0" }, "dependencies": { - "@pulumi/azure": "^4.0.0", - "@pulumi/azuread": "^4.0.0", - "@pulumi/docker": "^3.0.0", - "@pulumi/kubernetes": "^3.0.0", + "@pulumi/azure": "^6.0.0", + "@pulumi/azuread": "^5.0.0", + "@pulumi/docker": "^4.0.0", + "@pulumi/kubernetes": "^4.0.0", "@pulumi/pulumi": "^3.0.0", "@pulumi/random": "^4.0.0", - "@pulumi/tls": "4.0.0" + "@pulumi/tls": "^5.0.0" }, "license": "Apache-2.0" -} +} \ No newline at end of file diff --git a/classic-azure-ts-aks-mean/Pulumi.yaml b/classic-azure-ts-aks-mean/Pulumi.yaml index 687178d28..5763a1afd 100644 --- a/classic-azure-ts-aks-mean/Pulumi.yaml +++ b/classic-azure-ts-aks-mean/Pulumi.yaml @@ -6,6 +6,8 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into password: description: Your cluster password secret: true diff --git a/classic-azure-ts-aks-mean/README.md b/classic-azure-ts-aks-mean/README.md index 949f84aeb..9ce7c6035 100644 --- a/classic-azure-ts-aks-mean/README.md +++ b/classic-azure-ts-aks-mean/README.md @@ -28,7 +28,7 @@ npm install 1. Create a new stack: - ```sh + ```console $ pulumi stack init Enter a stack name: azure-mean ``` @@ -36,16 +36,17 @@ npm install 1. Set the required configuration variables for this program: ```bash - $ pulumi config set azure:environment public - $ pulumi config set password --secret [your-cluster-password-here] - $ ssh-keygen -t rsa -f key.rsa - $ pulumi config set sshPublicKey < key.rsa.pub - $ az login + pulumi config set azure:environment public + pulumi config set password --secret + pulumi config set azure:subscriptionId + ssh-keygen -t rsa -f key.rsa + pulumi config set sshPublicKey < key.rsa.pub + az login ``` 1. Perform the deployment: - ```sh + ```console $ pulumi up Updating stack 'azure-mean' Performing changes: @@ -79,7 +80,7 @@ npm install in this case `40.76.25.71`. It is exported with a stack output variable, `frontendAddress`. We can use `curl` and `grep` to retrieve the `` of the site the proxy points at. - ```sh + ```console $ curl -sL $(pulumi stack output frontendAddress) | grep "<title>" <title>Node/Angular Todo App> ``` diff --git a/classic-azure-ts-aks-mean/index.ts b/classic-azure-ts-aks-mean/index.ts index 6e28292e5..510ff71ee 100644 --- a/classic-azure-ts-aks-mean/index.ts +++ b/classic-azure-ts-aks-mean/index.ts @@ -18,7 +18,7 @@ const cosmosdb = new azure.cosmosdb.Account("cosmosDb", { maxStalenessPrefix: 100000, }, offerType: "Standard", - enableAutomaticFailover: true, + automaticFailoverEnabled: true, geoLocations: [ { location: config.location, failoverPriority: 0 }, { location: config.failoverLocation, failoverPriority: 1 }, @@ -30,7 +30,7 @@ const mongoConnStrings = new k8s.core.v1.Secret( "mongo-secrets", { metadata: { name: "mongo-secrets" }, - data: mongoHelpers.parseConnString(cosmosdb.connectionStrings), + data: mongoHelpers.parseConnString(cosmosdb.primaryMongodbConnectionString), }, { provider: k8sProvider }, ); diff --git a/classic-azure-ts-aks-mean/mongoHelpers.ts b/classic-azure-ts-aks-mean/mongoHelpers.ts index 6b983d614..c60c33e43 100644 --- a/classic-azure-ts-aks-mean/mongoHelpers.ts +++ b/classic-azure-ts-aks-mean/mongoHelpers.ts @@ -3,7 +3,7 @@ import * as pulumi from "@pulumi/pulumi"; export function parseConnString( - conns: pulumi.Output, + conn: pulumi.Output, ): pulumi.Output<{ [key: string]: string }> { // Per the official docs[1], the format of this connection string is: // @@ -37,9 +37,8 @@ export function parseConnString( return Buffer.from(s).toString("base64"); } - const retVal: pulumi.Output<{ [key: string]: string }> = conns.apply(conns => { + const retVal: pulumi.Output<{ [key: string]: string }> = conn.apply(conn => { - const conn = conns[0] ?? "mongodb://username:password@host:port/[database]?ssl=true"; const noProtocol = conn.replace(/^mongodb\:\/\//, ""); const [username, rest1, rest2] = noProtocol.split(":", 3); const [password, host] = rest1.split("@", 2); diff --git a/classic-azure-ts-aks-mean/package.json b/classic-azure-ts-aks-mean/package.json index 5686343d6..7820d9215 100644 --- a/classic-azure-ts-aks-mean/package.json +++ b/classic-azure-ts-aks-mean/package.json @@ -4,11 +4,11 @@ "@types/node": "^8.0.0" }, "dependencies": { - "@pulumi/azure": "^4.0.0", - "@pulumi/azuread": "^4.0.0", + "@pulumi/azure": "^6.0.0", + "@pulumi/azuread": "^5.0.0", "@pulumi/kubernetes": "^3.0.0", "@pulumi/pulumi": "^3.0.0", "@types/mongoose": "^5.2.11", "mongoose": "^5.2.13" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-aks-multicluster/.gitignore b/classic-azure-ts-aks-multicluster/.gitignore deleted file mode 100644 index dc6dae78d..000000000 --- a/classic-azure-ts-aks-multicluster/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin/ -/node_modules/ -key.rsa -key.rsa.pub diff --git a/classic-azure-ts-aks-multicluster/Pulumi.yaml b/classic-azure-ts-aks-multicluster/Pulumi.yaml deleted file mode 100644 index 9d8120a22..000000000 --- a/classic-azure-ts-aks-multicluster/Pulumi.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: azure-ts-aks-multicluster -runtime: nodejs -description: Create multiple Azure Kubernetes Service (AKS) clusters in different regions and with different node counts -template: - config: - azure:environment: - description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) - default: public - password: - description: Your cluster password - secret: true - sshPublicKey: - description: Your SSH public key (generate with `ssh-keygen -t rsa -f key.rsa`) - location: - description: The location to use for the Azure Resource Group diff --git a/classic-azure-ts-aks-multicluster/README.md b/classic-azure-ts-aks-multicluster/README.md deleted file mode 100644 index 1bfacd0d9..000000000 --- a/classic-azure-ts-aks-multicluster/README.md +++ /dev/null @@ -1,72 +0,0 @@ -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-aks-multicluster/README.md#gh-light-mode-only) -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-aks-multicluster/README.md#gh-dark-mode-only) - -# Multiple Azure Kubernetes Service (AKS) Clusters - -This example demonstrates creating multiple Azure Kubernetes Service (AKS) clusters in different regions and with -different node counts. Please see https://docs.microsoft.com/en-us/azure/aks/ for more information about AKS. - -## Prerequisites - -Ensure you have [downloaded and installed the Pulumi CLI](https://www.pulumi.com/docs/get-started/install/). - -We will be deploying to Azure, so you will need an Azure account. If you don't have an account, -[sign up for free here](https://azure.microsoft.com/en-us/free/). -[Follow the instructions here](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) to connect Pulumi to your Azure account. - -## Running the Example - -> **Note**: Due to an issue in the Azure Terraform Provider (https://github.com/terraform-providers/terraform-provider-azurerm/issues/1635) the -> creation of an Azure Service Principal, which is needed to create the Kubernetes cluster (see index.ts), is delayed and may not -> be available when the cluster is created. If you get a Service Principal not found error, as a work around, you should be able to run `pulumi up` -> again, at which time the Service Principal should have been created. - -After cloning this repo, `cd` into it and run these commands. - -1. Create a new stack, which is an isolated deployment target for this example: - - ```bash - $ pulumi stack init - ``` - -2. Set the required configuration variables for this program: - - ```bash - $ pulumi config set azure:environment public - $ pulumi config set password --secret [your-cluster-password-here] - $ ssh-keygen -t rsa -f key.rsa - $ pulumi config set sshPublicKey < key.rsa.pub - ``` - -3. Deploy everything with the `pulumi up` command. This provisions all the Azure resources necessary, including - an Active Directory service principal and AKS clusters: - - ```bash - $ pulumi up - ``` - -4. After a couple minutes, your AKS clusters will be ready. The AKS cluster names will be printed as output variables - once `pulumi up` completes. - - ```bash - $ pulumi up - ... - - Outputs: - + aksClusterNames: [ - + [0]: "akscluster-east513be264" - + [1]: "akscluster-westece285c7" - ] - ... - ``` - -5. At this point, you have multiple AKS clusters running in different regions. Feel free to modify your program, and - run `pulumi up` to redeploy changes. The Pulumi CLI automatically detects what has changed and makes the minimal - edits necessary to accomplish these changes. - -6. Once you are done, you can destroy all of the resources, and the stack: - - ```bash - $ pulumi destroy - $ pulumi stack rm - ``` diff --git a/classic-azure-ts-aks-multicluster/config.ts b/classic-azure-ts-aks-multicluster/config.ts deleted file mode 100644 index 483a5155d..000000000 --- a/classic-azure-ts-aks-multicluster/config.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as pulumi from "@pulumi/pulumi"; - -// Parse and export configuration variables for this stack. -const config = new pulumi.Config(); -export const password = config.require("password"); -export const location = config.get("location") || azure.Locations.EastUS; -export const sshPublicKey = config.require("sshPublicKey"); -export const resourceGroup = new azure.core.ResourceGroup("aks", {location: location}); diff --git a/classic-azure-ts-aks-multicluster/index.ts b/classic-azure-ts-aks-multicluster/index.ts deleted file mode 100644 index aa872616a..000000000 --- a/classic-azure-ts-aks-multicluster/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as azuread from "@pulumi/azuread"; -import * as pulumi from "@pulumi/pulumi"; -import * as config from "./config"; - -// Per-cluster config -const aksClusterConfig = [ - { - name: "east", - location: azure.Locations.EastUS, - nodeCount: 2, - nodeSize: "Standard_D2_v2", - }, - { - name: "west", - location: azure.Locations.WestUS, - nodeCount: 5, - nodeSize: "Standard_D2_v2", - }, -]; - -// Create the AD service principal for the K8s cluster. -const adApp = new azuread.Application("aks", {displayName: "aks"}); -const adSp = new azuread.ServicePrincipal("aksSp", {applicationId: adApp.applicationId}); -const adSpPassword = new azuread.ServicePrincipalPassword("aksSpPassword", { - servicePrincipalId: adSp.id, - value: config.password, - endDate: "2099-01-01T00:00:00Z", -}); - -// Create the individual clusters -const k8sClusters = aksClusterConfig.map((perClusterConfig, index) => { - const cluster = new azure.containerservice.KubernetesCluster(`aksCluster-${perClusterConfig.name}`, { - // Global config arguments - resourceGroupName: config.resourceGroup.name, - linuxProfile: { - adminUsername: "aksuser", - sshKey: { - keyData: config.sshPublicKey, - }, - }, - servicePrincipal: { - clientId: adApp.applicationId, - clientSecret: adSpPassword.value, - }, - // Per-cluster config arguments - location: perClusterConfig.location, - defaultNodePool: { - name: "aksagentpool", - nodeCount: perClusterConfig.nodeCount, - vmSize: perClusterConfig.nodeSize, - }, - dnsPrefix: `${pulumi.getStack()}-kube`, - }); - return cluster; -}); - -export const aksClusterNames = k8sClusters.map(cluster => cluster.name); diff --git a/classic-azure-ts-aks-multicluster/package.json b/classic-azure-ts-aks-multicluster/package.json deleted file mode 100644 index 1f84f1dfc..000000000 --- a/classic-azure-ts-aks-multicluster/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "azure-ts-aks-multicluster", - "version": "0.1.0", - "devDependencies": { - "@types/node": "^8.0.0" - }, - "dependencies": { - "@pulumi/azure": "^4.0.0", - "@pulumi/azuread": "^4.0.0", - "@pulumi/kubernetes": "^3.0.0", - "@pulumi/pulumi": "^3.0.0" - }, - "license": "Apache-2.0" -} diff --git a/classic-azure-ts-aks-multicluster/tsconfig.json b/classic-azure-ts-aks-multicluster/tsconfig.json deleted file mode 100644 index f6311eccf..000000000 --- a/classic-azure-ts-aks-multicluster/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "outDir": "bin", - "target": "es2016", - "module": "commonjs", - "moduleResolution": "node", - "declaration": true, - "sourceMap": true, - "stripInternal": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true, - "strictNullChecks": true - }, - "files": [ - "index.ts" - ] -} diff --git a/classic-azure-ts-aks-with-diagnostics/.gitignore b/classic-azure-ts-aks-with-diagnostics/.gitignore deleted file mode 100644 index dc6dae78d..000000000 --- a/classic-azure-ts-aks-with-diagnostics/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin/ -/node_modules/ -key.rsa -key.rsa.pub diff --git a/classic-azure-ts-aks-with-diagnostics/Pulumi.yaml b/classic-azure-ts-aks-with-diagnostics/Pulumi.yaml deleted file mode 100644 index a0bb18704..000000000 --- a/classic-azure-ts-aks-with-diagnostics/Pulumi.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: azure-ts-aks-with-diagnostics -runtime: nodejs -description: Create an Azure Kubernetes Service (AKS) cluster and enable diagnostics -template: - config: - azure:environment: - description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) - default: public - password: - description: Your cluster password - secret: true - sshPublicKey: - description: Your SSH public key (generate with `ssh-keygen -t rsa -f key.rsa`) diff --git a/classic-azure-ts-aks-with-diagnostics/README.md b/classic-azure-ts-aks-with-diagnostics/README.md deleted file mode 100644 index f00090291..000000000 --- a/classic-azure-ts-aks-with-diagnostics/README.md +++ /dev/null @@ -1,61 +0,0 @@ -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-aks-with-diagnostics/README.md#gh-light-mode-only) -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-aks-with-diagnostics/README.md#gh-dark-mode-only) - -# Azure Kubernetes Service (AKS) Cluster with Diagnostics - -This example demonstrates creating an Azure Kubernetes Service (AKS) Cluster, and enables diagnostics for the cluster. -Please see https://docs.microsoft.com/en-us/azure/aks/ for more information about AKS. - -## Prerequisites - -Ensure you have [downloaded and installed the Pulumi CLI](https://www.pulumi.com/docs/get-started/install/). - -We will be deploying to Azure, so you will need an Azure account. If you don't have an account, -[sign up for free here](https://azure.microsoft.com/en-us/free/). -[Follow the instructions here](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) to connect Pulumi to your Azure account. - -## Running the Example - -After cloning this repo, `cd` into it and run these commands. A Kubernetes cluster and Apache web server will appear! - -1. Create a new stack, which is an isolated deployment target for this example: - - ```bash - $ pulumi stack init - ``` - -2. Set the required configuration variables for this program: - - ```bash - $ pulumi config set azure:environment public - $ pulumi config set password --secret [your-cluster-password-here] - $ ssh-keygen -t rsa -f key.rsa - $ pulumi config set sshPublicKey < key.rsa.pub - ``` - -3. Deploy everything with the `pulumi up` command. This provisions all the Azure resources necessary, including - an Active Directory service principal, AKS cluster, and then enables diagnostics for the cluster, all in a single gesture: - - ```bash - $ pulumi up - ``` - -4. After a couple minutes, your cluster and Apache server will be ready. Your `kubeconfig` will be the application output and - you may also configure your `kubectl` client using the `kubeconfig` configuration: - - ```bash - $ pulumi stack output kubeconfig --show-secrets > kubeconfig.yaml - $ kubectl get namespaces - .... - ``` - -5. At this point, you have a running cluster. Feel free to modify your program, and run `pulumi up` to redeploy changes. - The Pulumi CLI automatically detects what has changed and makes the minimal edits necessary to accomplish these - changes. This could be altering the existing chart, adding new Azure or Kubernetes resources, or anything, really. - -6. Once you are done, you can destroy all of the resources, and the stack: - - ```bash - $ pulumi destroy - $ pulumi stack rm - ``` diff --git a/classic-azure-ts-aks-with-diagnostics/index.ts b/classic-azure-ts-aks-with-diagnostics/index.ts deleted file mode 100644 index 7d94cfc3b..000000000 --- a/classic-azure-ts-aks-with-diagnostics/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as azuread from "@pulumi/azuread"; -import * as k8s from "@pulumi/kubernetes"; -import * as pulumi from "@pulumi/pulumi"; - -const config = new pulumi.Config(); -const password = config.require("password"); -const location = config.get("location") || "East US"; -const nodeCount = config.getNumber("nodeCount") || 2; -const nodeSize = config.get("nodeSize") || "Standard_D2_v2"; -const sshPublicKey = config.require("sshPublicKey"); - -const resourceGroup = new azure.core.ResourceGroup("aks", { location }); -const loganalytics = new azure.operationalinsights.AnalyticsWorkspace("aksloganalytics", { - resourceGroupName: resourceGroup.name, - location: resourceGroup.location, - sku: "PerGB2018", - retentionInDays: 30, -}); - -// Step 2: Create the AD service principal for the k8s cluster. -const adApp = new azuread.Application("aks", {displayName: "aks"}); -const adSp = new azuread.ServicePrincipal("aksSp", { applicationId: adApp.applicationId }); -const adSpPassword = new azuread.ServicePrincipalPassword("aksSpPassword", { - servicePrincipalId: adSp.id, - value: password, - endDate: "2099-01-01T00:00:00Z", -}); - -// Wait for the Service Principle to be initialized. The ServicePrincipal will be used to initialize the AKS cluster during creation -const applicationId = adApp.applicationId.apply(async (adAppId) => { - let count = 0; - while (true) { - try { - await azuread.getServicePrincipal({ - applicationId: adAppId, - }); - break; - } catch (e) { - console.log("retrying"); - count++; - if (count > 5) { - throw e; - } - } - } - return adAppId; -}); - -// Step 3: This step creates an AKS cluster. -const k8sCluster = new azure.containerservice.KubernetesCluster("aksCluster", { - resourceGroupName: resourceGroup.name, - location: location, - defaultNodePool: { - name: "aksagentpool", - nodeCount: nodeCount, - vmSize: nodeSize, - }, - dnsPrefix: `${pulumi.getStack()}-kube`, - linuxProfile: { - adminUsername: "aksuser", - sshKey: { keyData: sshPublicKey}, - }, - servicePrincipal: { - clientId: applicationId, - clientSecret: adSpPassword.value, - }, - addonProfile: { - omsAgent: { - enabled: true, - logAnalyticsWorkspaceId: loganalytics.id, - }, - }, -}); - -// Step 4: Enables the Monitoring Diagonostic control plane component logs and AllMetrics -const azMonitoringDiagnostic = new azure.monitoring.DiagnosticSetting("aks", { - logAnalyticsWorkspaceId: loganalytics.id, - targetResourceId: k8sCluster.id, - logs: [{ - category: "kube-apiserver", - enabled : true, - - retentionPolicy: { - enabled: true, - }, - }], - metrics: [{ - category: "AllMetrics", - - retentionPolicy: { - enabled: true, - }, - }], -}); - -// Step 5: Expose a k8s provider instance using our custom cluster instance. -const k8sProvider = new k8s.Provider("aksK8s", { - kubeconfig: k8sCluster.kubeConfigRaw, -}); - -// Export the kubeconfig -export const kubeconfig = k8sCluster.kubeConfigRaw; diff --git a/classic-azure-ts-aks-with-diagnostics/package.json b/classic-azure-ts-aks-with-diagnostics/package.json deleted file mode 100644 index fdd53109e..000000000 --- a/classic-azure-ts-aks-with-diagnostics/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "azure-ts-aks-with-diagnostics", - "version": "0.1.0", - "devDependencies": { - "@types/node": "^8.0.0" - }, - "dependencies": { - "@pulumi/azure": "^4.0.0", - "@pulumi/azuread": "^4.0.0", - "@pulumi/kubernetes": "^3.0.0", - "@pulumi/pulumi": "^3.0.0" - }, - "license": "Apache-2.0" -} diff --git a/classic-azure-ts-aks-with-diagnostics/tsconfig.json b/classic-azure-ts-aks-with-diagnostics/tsconfig.json deleted file mode 100644 index 3bf998d8a..000000000 --- a/classic-azure-ts-aks-with-diagnostics/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "outDir": "bin", - "target": "es2016", - "module": "commonjs", - "moduleResolution": "node", - "declaration": true, - "sourceMap": true, - "stripInternal": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true, - "strictNullChecks": true - }, - "files": [ - "index.ts", - "config.ts" - ] -} diff --git a/classic-azure-ts-api-management/Pulumi.yaml b/classic-azure-ts-api-management/Pulumi.yaml index e7718e750..485d6e60c 100644 --- a/classic-azure-ts-api-management/Pulumi.yaml +++ b/classic-azure-ts-api-management/Pulumi.yaml @@ -8,3 +8,5 @@ template: default: public azure:location: description: The Azure location to deploy to (e.g., `eastus`, or `westeurope`) + azure:subscriptionId: + description: The Azure Subscription to deploy into diff --git a/classic-azure-ts-api-management/README.md b/classic-azure-ts-api-management/README.md index 729302ee0..c864bd4b1 100644 --- a/classic-azure-ts-api-management/README.md +++ b/classic-azure-ts-api-management/README.md @@ -11,33 +11,34 @@ An example Pulumi program that deploys an instance of Azure API Management with ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: - ``` - $ npm install + ```bash + npm install ``` -1. Configure Azure location: +1. Configure Azure environment: - ``` - $ pulumi config set azure:location + ```bash + pulumi config set azure:location + pulumi config set azure:subscriptionId ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing update (dev): ... @@ -49,9 +50,9 @@ An example Pulumi program that deploys an instance of Azure API Management with Duration: 34m54s ``` -1. Check the deployed function endpoint: +1. Check the deployed function endpoint: - ``` + ```console $ pulumi stack output endpoint https://greeting-service12345678.azure-api.net/hello/Pulumi $ curl --header "Ocp-Apim-Subscription-Key: $(pulumi stack output key)" $(pulumi stack output endpoint) @@ -59,9 +60,9 @@ An example Pulumi program that deploys an instance of Azure API Management with ... ``` -1. Verify that API caches the response for 30 seconds - the same time should be returned for subsequent queries: +1. Verify that API caches the response for 30 seconds - the same time should be returned for subsequent queries: - ``` + ```console $ curl --header "Ocp-Apim-Subscription-Key: $(pulumi stack output key)" $(pulumi stack output endpoint) {"time":"2019-06-17T15:16:08.227Z","greeting":"Hello Pulumi!"} ... diff --git a/classic-azure-ts-api-management/package.json b/classic-azure-ts-api-management/package.json index 127070795..d77637e87 100644 --- a/classic-azure-ts-api-management/package.json +++ b/classic-azure-ts-api-management/package.json @@ -5,7 +5,7 @@ "@types/node": "^8.0.0" }, "dependencies": { - "@pulumi/azure": "^4.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/pulumi": "^3.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-appservice-devops/README.md b/classic-azure-ts-appservice-devops/README.md index fafe1d335..9de69aaab 100644 --- a/classic-azure-ts-appservice-devops/README.md +++ b/classic-azure-ts-appservice-devops/README.md @@ -9,51 +9,58 @@ Provisions Azure SQL Database and Azure Application Insights to be used in combi ## Running the App manually with Pulumi CLI -1. Build and publish the ASP.NET Core project: +1. Build and publish the ASP.NET Core project: - ``` - $ dotnet publish src + ```bash + dotnet publish src ``` -1. Navigate to `infra`: +1. Navigate to `infra`: - ``` - $ cd infra + ```bash + cd infra ``` -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: + ```bash + npm install ``` - $ npm install + +1. Configure target Azure environment: + + ```bash + pulumi config set azure:location + pulumi config set azure:subscriptionId ``` 1. Define SQL Server username: - ``` + ```bash pulumi config set sqlUsername ``` 1. Define SQL Server password (make it complex enough to satisfy Azure policy): - ``` + ```bash pulumi config set --secret sqlPassword ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -65,9 +72,9 @@ Provisions Azure SQL Database and Azure Application Insights to be used in combi Update duration: 1m14.59910109s ``` -1. Check the deployed website endpoint: +1. Check the deployed website endpoint: - ``` + ```console $ pulumi stack output endpoint https://dev-as10d706a2.azurewebsites.net $ curl "$(pulumi stack output endpoint)" diff --git a/classic-azure-ts-appservice-devops/infra/Pulumi.yaml b/classic-azure-ts-appservice-devops/infra/Pulumi.yaml index 8fa4ab930..9339612cd 100644 --- a/classic-azure-ts-appservice-devops/infra/Pulumi.yaml +++ b/classic-azure-ts-appservice-devops/infra/Pulumi.yaml @@ -6,6 +6,8 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into sqlUsername: description: Azure SQL Server username secret: true diff --git a/classic-azure-ts-appservice-devops/infra/package.json b/classic-azure-ts-appservice-devops/infra/package.json index adfca6024..cd0592574 100644 --- a/classic-azure-ts-appservice-devops/infra/package.json +++ b/classic-azure-ts-appservice-devops/infra/package.json @@ -8,6 +8,6 @@ }, "dependencies": { "@pulumi/pulumi": "^3.0.0", - "@pulumi/azure": "^4.0.0" + "@pulumi/azure": "^6.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-appservice-springboot/Dockerfile b/classic-azure-ts-appservice-springboot/Dockerfile deleted file mode 100644 index 47f90ca87..000000000 --- a/classic-azure-ts-appservice-springboot/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM gradle:5.6-jdk11 as build -WORKDIR /app -COPY ./src ./src -COPY build.gradle . -RUN gradle build - -FROM openjdk:8-jdk-alpine -VOLUME /tmp -COPY --from=build /app/build/libs/gs-rest-service-0.1.0.jar /app.jar -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/classic-azure-ts-appservice-springboot/Jenkinsfile b/classic-azure-ts-appservice-springboot/Jenkinsfile deleted file mode 100644 index 72238a305..000000000 --- a/classic-azure-ts-appservice-springboot/Jenkinsfile +++ /dev/null @@ -1,40 +0,0 @@ -pipeline { - agent any - - stages { - stage ("Checkout code") { - steps { - // The examples repo contains several repos. To avoid checking out every single project under it, - // upload this project into your own repo. - git url: "git@github.com:your-repo/azure-ts-appservice-springboot.git", - // Set your credentials id value here. - // See https://jenkins.io/doc/book/using/using-credentials/#adding-new-global-credentials - credentialsId: "youCredentialsId", - // You could define a new stage that specifically runs for, say, feature/* branches - // and run only "pulumi preview" for those. - branch: "master" - } - } - - stage ("Install dependencies") { - steps { - sh "curl -fsSL https://get.pulumi.com | sh" - sh "$HOME/.pulumi/bin/pulumi version" - } - } - - stage ("Pulumi up") { - steps { - // The value "node 8.9.4" is the configuration name in our Global Tool Configuration setup for node. - // You should use the name that you used when you added the installation on that page. - nodejs(nodeJSInstallationName: "node 8.9.4") { - withEnv(["PATH+PULUMI=$HOME/.pulumi/bin"]) { - sh "cd infrastructure && npm install" - sh "pulumi stack select ${PULUMI_STACK} --cwd infrastructure/" - sh "pulumi up --yes --cwd infrastructure/" - } - } - } - } - } -} diff --git a/classic-azure-ts-appservice-springboot/README.md b/classic-azure-ts-appservice-springboot/README.md deleted file mode 100644 index 6c838005b..000000000 --- a/classic-azure-ts-appservice-springboot/README.md +++ /dev/null @@ -1,61 +0,0 @@ -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-appservice-springboot/infrastructure/index.ts#gh-light-mode-only) -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-appservice-springboot/infrastructure/index.ts#gh-dark-mode-only) - -# Spring Boot App on Azure App Service Using Jenkins - -This example shows how you can deploy a Spring Boot app to an Azure App Service instance using Pulumi in a Jenkins Pipeline. The Spring Boot app is packaged into a container image that is conveniently built as part of the Pulumi app. The container image is pushed up to a private Azure Container Registry and then used as the source for an App Service instance. - -## Prerequisites - -1. [Install Pulumi](https://www.pulumi.com/docs/get-started/install/) -1. [Configure Azure credentials](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) - -## Steps - -### Step 1: Create a new stack - -``` -$ cd infrastructure -$ pulumi stack init dev -``` - -### Step 2: Log in to the Azure CLI - -You will be prompted to do this during deployment if you forget this step. - -``` -$ az login -``` - -### Step 3: Install NPM dependencies - -``` -$ npm install -``` - -### Step 4: Deploy your changes - -Run `pulumi up` to preview and deploy changes: - -``` -$ pulumi up -Previewing changes: -+ pulumi:pulumi:Stack jenkins-tutorial-dev create -+ docker:image:Image spring-boot-greeting-app create -+ azure:core:ResourceGroup jenkins-tutorial-group create -+ azure:containerservice:Registry myacr create -+ azure:appservice:Plan appservice-plan create -+ azure:appservice:AppService spring-boot-greeting-app create -+ pulumi:pulumi:Stack jenkins-tutorial-dev create -... -``` - -### Step 5: Check the deployed website endpoint - -``` -$ pulumi stack output appServiceEndpoint -https://azpulumi-as0ef47193.azurewebsites.net - -$ curl "$(pulumi stack output appServiceEndpoint)/greeting" -{"id":1, "content": "Hello, World"} -``` diff --git a/classic-azure-ts-appservice-springboot/build.gradle b/classic-azure-ts-appservice-springboot/build.gradle deleted file mode 100644 index bb6eff034..000000000 --- a/classic-azure-ts-appservice-springboot/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE") - } -} - -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'idea' -apply plugin: 'org.springframework.boot' -apply plugin: 'io.spring.dependency-management' - -bootJar { - baseName = 'gs-rest-service' - version = '0.1.0' -} - -repositories { - mavenCentral() -} - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -dependencies { - compile("org.springframework.boot:spring-boot-starter-web") - testCompile('org.springframework.boot:spring-boot-starter-test') - testCompile('com.jayway.jsonpath:json-path') -} diff --git a/classic-azure-ts-appservice-springboot/infrastructure/.gitignore b/classic-azure-ts-appservice-springboot/infrastructure/.gitignore deleted file mode 100644 index c6958891d..000000000 --- a/classic-azure-ts-appservice-springboot/infrastructure/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin/ -/node_modules/ diff --git a/classic-azure-ts-appservice-springboot/infrastructure/Pulumi.yaml b/classic-azure-ts-appservice-springboot/infrastructure/Pulumi.yaml deleted file mode 100644 index 5356a44f8..000000000 --- a/classic-azure-ts-appservice-springboot/infrastructure/Pulumi.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: jenkins-tutorial -runtime: nodejs -description: A Pulumi app to deploy a SpringBoot app on Azure. diff --git a/classic-azure-ts-appservice-springboot/infrastructure/index.ts b/classic-azure-ts-appservice-springboot/infrastructure/index.ts deleted file mode 100644 index 3fa453c6c..000000000 --- a/classic-azure-ts-appservice-springboot/infrastructure/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as docker from "@pulumi/docker"; -import * as pulumi from "@pulumi/pulumi"; - -// Create an Azure Resource Group -const resourceGroup = new azure.core.ResourceGroup("jenkins-tutorial-group"); - -const appServicePlan = new azure.appservice.Plan("appservice-plan", { - kind: "Linux", - resourceGroupName: resourceGroup.name, - reserved: true, - sku: { - tier: "Basic", - size: "B1", - }, -}); - -const registry = new azure.containerservice.Registry("myacr", { - resourceGroupName: resourceGroup.name, - sku: "Basic", - adminEnabled: true, -}); - -const customImage = "spring-boot-greeting-app"; -const myImage = new docker.Image(customImage, { - imageName: pulumi.interpolate`${registry.loginServer}/${customImage}:v1.0.0`, - build: { - context: `../`, - }, - registry: { - server: registry.loginServer, - username: registry.adminUsername, - password: registry.adminPassword, - }, -}); - -const appService = new azure.appservice.AppService(customImage, { - resourceGroupName: resourceGroup.name, - appServicePlanId: appServicePlan.id, - appSettings: { - WEBSITES_ENABLE_APP_SERVICE_STORAGE: "false", - DOCKER_REGISTRY_SERVER_URL: pulumi.interpolate`https://${registry.loginServer}`, - DOCKER_REGISTRY_SERVER_USERNAME: registry.adminUsername, - DOCKER_REGISTRY_SERVER_PASSWORD: registry.adminPassword, - // Our custom image exposes port 9000. - WEBSITES_PORT: "9000", - }, - siteConfig: { - alwaysOn: true, - linuxFxVersion: pulumi.interpolate`DOCKER|${myImage.imageName}`, - }, - httpsOnly: true, -}); - -export const appServiceEndpoint = pulumi.interpolate`https://${appService.defaultSiteHostname}`; diff --git a/classic-azure-ts-appservice-springboot/infrastructure/package.json b/classic-azure-ts-appservice-springboot/infrastructure/package.json deleted file mode 100644 index 5bec71ce0..000000000 --- a/classic-azure-ts-appservice-springboot/infrastructure/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "azure-typescript", - "devDependencies": { - "@types/node": "latest" - }, - "dependencies": { - "@pulumi/azure": "^4.0.0", - "@pulumi/docker": "^3.0.0", - "@pulumi/pulumi": "^3.0.0" - } -} diff --git a/classic-azure-ts-appservice-springboot/infrastructure/tsconfig.json b/classic-azure-ts-appservice-springboot/infrastructure/tsconfig.json deleted file mode 100644 index 61fe22191..000000000 --- a/classic-azure-ts-appservice-springboot/infrastructure/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "outDir": "bin", - "target": "es2016", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true, - "strictNullChecks": true - }, - "files": [ - "index.ts" - ] -} diff --git a/classic-azure-ts-appservice-springboot/src/main/java/hello/Application.java b/classic-azure-ts-appservice-springboot/src/main/java/hello/Application.java deleted file mode 100644 index 5abd41142..000000000 --- a/classic-azure-ts-appservice-springboot/src/main/java/hello/Application.java +++ /dev/null @@ -1,12 +0,0 @@ -package hello; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} diff --git a/classic-azure-ts-appservice-springboot/src/main/java/hello/Greeting.java b/classic-azure-ts-appservice-springboot/src/main/java/hello/Greeting.java deleted file mode 100644 index 5d10b59b7..000000000 --- a/classic-azure-ts-appservice-springboot/src/main/java/hello/Greeting.java +++ /dev/null @@ -1,20 +0,0 @@ -package hello; - -public class Greeting { - - private final long id; - private final String content; - - public Greeting(long id, String content) { - this.id = id; - this.content = content; - } - - public long getId() { - return id; - } - - public String getContent() { - return content; - } -} diff --git a/classic-azure-ts-appservice-springboot/src/main/java/hello/GreetingController.java b/classic-azure-ts-appservice-springboot/src/main/java/hello/GreetingController.java deleted file mode 100644 index 2eb3789e1..000000000 --- a/classic-azure-ts-appservice-springboot/src/main/java/hello/GreetingController.java +++ /dev/null @@ -1,18 +0,0 @@ -package hello; - -import java.util.concurrent.atomic.AtomicLong; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class GreetingController { - - private static final String template = "Hello, %s!"; - private final AtomicLong counter = new AtomicLong(); - - @RequestMapping("/greeting") - public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) { - return new Greeting(counter.incrementAndGet(), String.format(template, name)); - } -} diff --git a/classic-azure-ts-appservice-springboot/src/main/resources/application.properties b/classic-azure-ts-appservice-springboot/src/main/resources/application.properties deleted file mode 100644 index 51a536c5d..000000000 --- a/classic-azure-ts-appservice-springboot/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -server.port=9000 diff --git a/classic-azure-ts-arm-template/.gitignore b/classic-azure-ts-arm-template/.gitignore deleted file mode 100644 index c6958891d..000000000 --- a/classic-azure-ts-arm-template/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin/ -/node_modules/ diff --git a/classic-azure-ts-arm-template/Pulumi.yaml b/classic-azure-ts-arm-template/Pulumi.yaml deleted file mode 100644 index 7c0ef6ee1..000000000 --- a/classic-azure-ts-arm-template/Pulumi.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: azure-arm-template -runtime: nodejs -description: An example of deploying an Azure Resource Manager (ARM) template using Pulumi. diff --git a/classic-azure-ts-arm-template/README.md b/classic-azure-ts-arm-template/README.md deleted file mode 100644 index 536cdeec4..000000000 --- a/classic-azure-ts-arm-template/README.md +++ /dev/null @@ -1,78 +0,0 @@ -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-arm-template/README.md#gh-light-mode-only) -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-arm-template/README.md#gh-dark-mode-only) - -# Azure Resource Manager (ARM) Template - -This example simply deploys an existing Azure Resource Manager (ARM) template using Pulumi. This accepts -any existing valid ARM template, enabling easy migration from existing JSON templates and towards infrastructure -as code using Pulumi. Once deployed, it is easy to incrementally refactor resources at a time out of the template -and into code. - -[Read more about ARM templates here]( -https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview). - -## Prerequisites - -Ensure you have [downloaded and installed the Pulumi CLI](https://www.pulumi.com/docs/get-started/install/). - -We will be deploying to Azure, so you will need an Azure account. If you don't have an account, -[sign up for free here](https://azure.microsoft.com/en-us/free/). [Follow the instructions -here](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) to connect Pulumi to your Azure account. - -Now, install dependencies: - -```sh -npm install -``` - -## Running the App - -1. Create a new stack: - - ```sh - $ pulumi stack init - Enter a stack name: azure-arm-dev - ``` - -2. Set the required configuration variables for this program, and log into Azure: - - ```bash - $ pulumi config set azure:environment public - $ pulumi config set azure:location westus2 - $ az login - ``` - -3. Perform the deployment: - - ```sh - $ pulumi up - Updating stack 'azure-arm-dev' - Performing changes: - - Type Name Status - + pulumi:pulumi:Stack azure-arm--azure-arm-dev created - + ├─ azure:core:ResourceGroup rg created - + └─ azure:core:ResourceGroupTemplateDeployment arm-dep created - - Outputs: - storageAccountName: "abevrwebgje2wstorage" - - Resources: - + 3 created - - Duration: 1m8s - ``` - - Notice here that the `storageAccountName` allocated by the ARM template deployment is exported. - -4. Tidy up and delete all resources allocated by your deployment: - - ```bash - $ pulumi destroy -y --skip-preview - $ pulumi stack rm -y --skip-preview - ``` - -## Next Steps - -For more Azure examples, please [check out the Azure Getting Started Guide]( -https://www.pulumi.com/docs/intro/cloud-providers/azure/). diff --git a/classic-azure-ts-arm-template/index.ts b/classic-azure-ts-arm-template/index.ts deleted file mode 100644 index 66534296a..000000000 --- a/classic-azure-ts-arm-template/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2016-2021, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as pulumi from "@pulumi/pulumi"; - -// Create a resource group to deploy all ARM template resources into. -const resourceGroup = new azure.core.ResourceGroup("test"); - -// Create an ARM template deployment using an ordinary JSON ARM template. This could be read from disk, of course. -const armDeployment = new azure.core.ResourceGroupTemplateDeployment("test-dep", { - resourceGroupName: resourceGroup.name, - templateContent: JSON.stringify({ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "outputs": { - "storageAccountName": { - "type": "String", - "value": "[variables('storageAccountName')]", - }, - }, - "parameters": { - "storageAccountType": { - "type": "String", - "defaultValue": "Standard_LRS", - "allowedValues": [ - "Standard_LRS", - "Standard_GRS", - "Standard_ZRS", - ], - "metadata": { - "description": "Storage Account type", - }, - }, - }, - "resources": [ - { - "type": "Microsoft.Storage/storageAccounts", - "name": "[variables('storageAccountName')]", - "apiVersion": "2019-04-01", - "location": "[variables('location')]", - "sku": { - "name": "[parameters('storageAccountType')]", - }, - }, - { - "type": "Microsoft.Network/publicIPAddresses", - "apiVersion": "2019-09-01", - "name": "[variables('publicIPAddressName')]", - "location": "[variables('location')]", - "properties": { - "publicIPAllocationMethod": "[variables('publicIPAddressType')]", - "dnsSettings": { - "domainNameLabel": "[variables('dnsLabelPrefix')]", - }, - }, - }, - ], - "variables": { - "location": "[resourceGroup().location]", - "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'storage')]", - "publicIPAddressName": "[concat('myPublicIp', uniquestring(resourceGroup().id))]", - "publicIPAddressType": "Dynamic", - "dnsLabelPrefix": `${pulumi.getProject()}-${pulumi.getStack()}`, - }, - }), - parametersContent: JSON.stringify({ - "storageAccountType": { - "value": "Standard_GRS", - }, - }), - deploymentMode: "Incremental", -}); - -// Finally, export the allocated storage account name. -export const storageAccountName = armDeployment.outputContent.apply((content: string) => JSON.parse(content)["storageAccountName"]["value"]); diff --git a/classic-azure-ts-arm-template/package.json b/classic-azure-ts-arm-template/package.json deleted file mode 100644 index 740a297e6..000000000 --- a/classic-azure-ts-arm-template/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "azure-arm-template", - "devDependencies": { - "@types/node": "^8.0.0" - }, - "dependencies": { - "@pulumi/azure": "^4.0.0", - "@pulumi/pulumi": "^3.0.0" - } -} diff --git a/classic-azure-ts-arm-template/tsconfig.json b/classic-azure-ts-arm-template/tsconfig.json deleted file mode 100644 index 61fe22191..000000000 --- a/classic-azure-ts-arm-template/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "outDir": "bin", - "target": "es2016", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true, - "strictNullChecks": true - }, - "files": [ - "index.ts" - ] -} diff --git a/classic-azure-ts-cosmosapp-component/Pulumi.yaml b/classic-azure-ts-cosmosapp-component/Pulumi.yaml index 253e1d257..3d4846f05 100644 --- a/classic-azure-ts-cosmosapp-component/Pulumi.yaml +++ b/classic-azure-ts-cosmosapp-component/Pulumi.yaml @@ -6,6 +6,8 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into locations: description: Comma-separated list of Azure regions default: westus,westeurope diff --git a/classic-azure-ts-cosmosapp-component/README.md b/classic-azure-ts-cosmosapp-component/README.md index b664bfb6b..baf5eb70b 100644 --- a/classic-azure-ts-cosmosapp-component/README.md +++ b/classic-azure-ts-cosmosapp-component/README.md @@ -25,36 +25,43 @@ The application has three example of using this component with the following com ## Prerequisites -1. [Install Pulumi](https://www.pulumi.com/docs/get-started/install/) -1. [Configure Azure credentials](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) +1. [Install Pulumi](https://www.pulumi.com/docs/get-started/install/) +1. [Configure Azure credentials](https://www.pulumi.com/docs/intro/cloud-providers/azure/setup/) ## Steps ### Step 1: Create a new stack -``` -$ pulumi stack init dev +```bash +pulumi stack init dev ``` ### Step 2: Log in to the Azure CLI You will be prompted to do this during deployment if you forget this step. -``` -$ az login +```bash +az login ``` ### Step 3: Install NPM dependencies +```bash +npm install ``` -$ npm install + +### Step 4: Configure target Azure environment + +```bash +pulumi config set azure:location +pulumi config set azure:subscriptionId ``` -### Step 4: Deploy your changes +### Step 5: Deploy your changes Run `pulumi up` to preview and deploy changes: -``` +```console $ pulumi up Previewing changes: + azure-ts-cosmosapp-component-dev create @@ -67,11 +74,11 @@ Previewing changes: ... ``` -### Step 5: Check the deployed website endpoints +### Step 6: Check the deployed website endpoints Three endpoints are now available. For example, -``` +```console $ pulumi stack output functionsEndpoint http://functionscosmosfunc-rgcc15ea50.trafficmanager.net/api/cosmos @@ -85,7 +92,7 @@ Go to the Azure portal and add a document with the ID "cosmos" to receive a non- The `unittests.ts` file contains two sample unit tests that can be run with Mocha: -``` +```bash mocha -r ts-node/register unittests.ts ``` @@ -93,6 +100,6 @@ mocha -r ts-node/register unittests.ts The `policy` folder contains two sample policies that can be applied with the `policy-pack` argument: -``` +```bash pulumi up --policy-pack policy ``` diff --git a/classic-azure-ts-cosmosapp-component/aci.ts b/classic-azure-ts-cosmosapp-component/aci.ts index e08d51490..b45a73809 100644 --- a/classic-azure-ts-cosmosapp-component/aci.ts +++ b/classic-azure-ts-cosmosapp-component/aci.ts @@ -55,7 +55,7 @@ function buildContainerApp({ cosmosAccount, database, container, opts }: GlobalC }], environmentVariables: { ENDPOINT: cosmosAccount.endpoint, - MASTER_KEY: cosmosAccount.primaryMasterKey, + MASTER_KEY: cosmosAccount.primaryKey, DATABASE: database.name, COLLECTION: container.name, LOCATION: location, diff --git a/classic-azure-ts-cosmosapp-component/cosmosApp.ts b/classic-azure-ts-cosmosapp-component/cosmosApp.ts index 7d619b2a8..9e87d06b5 100644 --- a/classic-azure-ts-cosmosapp-component/cosmosApp.ts +++ b/classic-azure-ts-cosmosapp-component/cosmosApp.ts @@ -58,7 +58,7 @@ export class CosmosApp extends pulumi.ComponentResource { maxIntervalInSeconds: 300, maxStalenessPrefix: 100000, }, - enableMultipleWriteLocations: args.enableMultiMaster, + multipleWriteLocationsEnabled: args.enableMultiMaster, }, parentOpts); const database = new azure.cosmosdb.SqlDatabase(`db-${name}`, { @@ -71,6 +71,7 @@ export class CosmosApp extends pulumi.ComponentResource { resourceGroupName: resourceGroup.name, accountName: cosmosAccount.name, databaseName: database.name, + partitionKeyPaths: ["/id"], }, { parent: cosmosAccount, ...opts }); // Traffic Manager as a global HTTP endpoint @@ -95,13 +96,9 @@ export class CosmosApp extends pulumi.ComponentResource { const app = buildLocation({ location }); // An endpoint per region for Traffic Manager, link to the corresponding instance - return new azure.network.TrafficManagerEndpoint(`tm${name}${location}`.substring(0, 16), { - resourceGroupName: resourceGroup.name, - profileName: profile.name, - type: app.id ? "azureEndpoints" : "externalEndpoints", - targetResourceId: app.id, - target: app.url, - endpointLocation: location, + return new azure.network.TrafficManagerAzureEndpoint(`tm${name}${location}`.substring(0, 16), { + profileId: profile.id, + targetResourceId: app.id!, }, { parent: profile, deleteBeforeReplace: true, ...opts }); })); diff --git a/classic-azure-ts-cosmosapp-component/functionApp.ts b/classic-azure-ts-cosmosapp-component/functionApp.ts index 7f8506220..b65ae573b 100644 --- a/classic-azure-ts-cosmosapp-component/functionApp.ts +++ b/classic-azure-ts-cosmosapp-component/functionApp.ts @@ -30,7 +30,7 @@ function buildFunctionApp({ cosmosAccount, database, container, opts }: GlobalCo callbackFactory: () => { const client = new CosmosClient({ endpoint: cosmosAccount.endpoint.get(), - key: cosmosAccount.primaryMasterKey.get(), + key: cosmosAccount.primaryKey.get(), connectionPolicy: { preferredLocations: [location] }, }); const collection = client.database(database.name.get()).container(container.name.get()); diff --git a/classic-azure-ts-cosmosapp-component/package.json b/classic-azure-ts-cosmosapp-component/package.json index d05b11dae..132dd8e89 100644 --- a/classic-azure-ts-cosmosapp-component/package.json +++ b/classic-azure-ts-cosmosapp-component/package.json @@ -9,9 +9,9 @@ }, "dependencies": { "@azure/cosmos": "latest", - "@pulumi/azure": "^4.0.0", - "@pulumi/docker": "^3.0.0", + "@pulumi/azure": "^6.0.0", + "@pulumi/docker": "^4.0.0", "@pulumi/pulumi": "^3.0.0", "@pulumi/random": "^4.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-cosmosapp-component/vms.ts b/classic-azure-ts-cosmosapp-component/vms.ts index ca99a46b0..93e79e429 100644 --- a/classic-azure-ts-cosmosapp-component/vms.ts +++ b/classic-azure-ts-cosmosapp-component/vms.ts @@ -38,19 +38,16 @@ function buildVMScaleSetApp({ cosmosAccount, database, container, opts }: Global }, opts); const bpepool = new azure.lb.BackendAddressPool(`bap-${location}`, { - resourceGroupName: resourceGroup.name, loadbalancerId: loadBalancer.id, }, opts); const probe = new azure.lb.Probe(`ssh-probe-${location}`.substring(0, 16), { - resourceGroupName: resourceGroup.name, loadbalancerId: loadBalancer.id, port: 80, }, opts); const rule = new azure.lb.Rule(`rl-${location}`, { - resourceGroupName: resourceGroup.name, - backendAddressPoolId: bpepool.id, + backendAddressPoolIds: [bpepool.id], backendPort: 80, frontendIpConfigurationName: "PublicIPAddress", frontendPort: 80, @@ -71,7 +68,7 @@ function buildVMScaleSetApp({ cosmosAccount, database, container, opts }: Global virtualNetworkName: vnet.name, }, opts); - const customData = pulumi.all([cosmosAccount.endpoint, cosmosAccount.primaryMasterKey, database.name, container.name]) + const customData = pulumi.all([cosmosAccount.endpoint, cosmosAccount.primaryKey, database.name, container.name]) .apply(([endpoint, key, databaseName, collectionName]) => { const s = file.replace("${ENDPOINT}", endpoint) .replace("${MASTER_KEY}", key) diff --git a/classic-azure-ts-dynamicresource/Pulumi.yaml b/classic-azure-ts-dynamicresource/Pulumi.yaml deleted file mode 100644 index 27a9f62d1..000000000 --- a/classic-azure-ts-dynamicresource/Pulumi.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: azure-cdn-custom-domain -runtime: nodejs -description: Creates Azure CDN with a custom domain. -template: - config: - azure:environment: - description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) - default: public diff --git a/classic-azure-ts-dynamicresource/README.md b/classic-azure-ts-dynamicresource/README.md deleted file mode 100644 index e9e28a404..000000000 --- a/classic-azure-ts-dynamicresource/README.md +++ /dev/null @@ -1,86 +0,0 @@ -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-dynamicresource/README.md#gh-light-mode-only) -[![Deploy this example with Pulumi](https://get.pulumi.com/new/button-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/classic-azure-ts-dynamicresource/README.md#gh-dark-mode-only) - -# Azure CDN Custom Domain Dynamic Provider - -## Prerequisites - -Prior to running this example, ensure that the custom domain you will be adding to your CDN endpoint has a CNAME record in your domain registrar's DNS management portal. The dynamic provider will validate that the mapping exists and will fail the deployment if the CDN endpoint is not reachable through your custom domain. - -## Usage - -In order to create a custom domain, you must have first created a CDN profile and an endpoint in that profile. Once those are created, you can use the `CDNCustomDomainResource` just like any other resource. - -Here's an example: - -```ts -const cdnCustomDomainResource = new CDNCustomDomainResource("cdnCustomDomain", { - // Ensure that there is a CNAME record for mycompany.com - // pointing to my-cdn-endpoint.azureedge.net. - // You would do that in your domain registrar's portal. - customDomainHostName: "mycompany.com", - customDomainName: "custom-domain", - profileName: cdnProfileName, - endpointName: cdnEndpointName, - // This will enable HTTPS through Azure's one-click - // automated certificate deployment. - // The certificate is fully managed by Azure from provisioning - // to automatic renewal at no additional cost to you. - httpsEnabled: true, - resourceGroupName: resourceGroupName -}, { parent: cdnEndpoint }); -``` - -That's it! The dynamic provider will automatically use the underlying Azure provider's configuration to determine the credentials to your subscription. If it cannot find them through the Azure provider, it will also look at the following environment variables: - -- `ARM_CLIENT_ID` -- `ARM_CLIENT_SECRET` // Make sure to store the value for this var as secret in your CI/CD system. -- `ARM_TENANT_ID` -- `ARM_SUBSCRIPTION_ID` - -## Running the App - -1. Create a new stack: - - ``` - $ pulumi stack init azure-cdn-custom-domain - ``` - -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - - ``` - $ az login - ``` - -1. Restore NPM dependencies: - - ``` - $ npm install - ``` - - ...or if you prefer using `yarn`, then `yarn install`. - -1. Run `pulumi up` to preview and deploy changes: - - ``` - $ pulumi up - Previewing changes: - ... - - Performing changes: - ... - ... - Update duration: ... - ``` - -## Dynamic Providers - -Learn more about dynamic providers [here](https://www.pulumi.com/docs/intro/concepts/resources/#dynamicproviders). - -## Known Issues - -If you get a 404 error when deleting a custom domain or a deserialization error `SyntaxError: Unexpected token o in JSON at position 1`, these were due to bugs in the older versions of the Azure nodeJS SDK. See https://github.com/Azure/azure-sdk-for-js/issues/2842 for more info. Ensure that you have the latest versions by running `npm list @azure/ms-rest-js @azure/ms-rest-azure-js`. The versions you should have are: -- `@azure/ms-rest-js` - 1.8.10 -- `@azure/ms-rest-azure-js` - 1.3.7 - -If you do not have the latest versions, delete your `node_modules` folder and `package-lock.json` (or `yarn.lock` if you are using yarn) and run `npm install` (or `yarn install`) again. diff --git a/classic-azure-ts-dynamicresource/cdnCustomDomain.ts b/classic-azure-ts-dynamicresource/cdnCustomDomain.ts deleted file mode 100644 index 9853f7ab0..000000000 --- a/classic-azure-ts-dynamicresource/cdnCustomDomain.ts +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as pulumi from "@pulumi/pulumi"; - -import * as cdnManagement from "@azure/arm-cdn"; -import { ServiceClientCredentials } from "@azure/ms-rest-js"; -import * as msRestAzure from "@azure/ms-rest-nodeauth"; - -/** - * CustomDomainOptions represents the inputs to the dynamic resource. - * Any property of type `Input` will automatically be resolved to their type `T` - * by the custom dynamic resource before passing them to the functions in the - * dynamic resource provider. - */ -export interface CustomDomainOptions { - resourceGroupName: pulumi.Input; - profileName: pulumi.Input; - endpointName: pulumi.Input; - customDomainHostName: pulumi.Input; - httpsEnabled: pulumi.Input; -} - -/** - * DynamicProviderInputs represents the inputs that are passed as inputs - * to each function in the implementation of a `pulumi.dynamic.ResourceProvider`. - * The property names in this must match `CustomDomainOptions`. - */ -interface DynamicProviderInputs { - resourceGroupName: string; - profileName: string; - endpointName: string; - customDomainHostName: string; - httpsEnabled: boolean; -} - -/** - * DynamicProviderOutputs represents the output type of `create` function in the - * dynamic resource provider. - */ -interface DynamicProviderOutputs extends DynamicProviderInputs, cdnManagement.CdnManagementModels.CustomDomainsCreateResponse { - name: string; -} - -class CDNCustomDomainResourceProvider implements pulumi.dynamic.ResourceProvider { - private name: string; - - constructor(name: string) { - this.name = name; - } - - private async getCDNManagementClient(): Promise { - let clientID = azure.config.clientId; - let clientSecret = azure.config.clientSecret; - let tenantID = azure.config.tenantId; - let subscriptionID = azure.config.subscriptionId; - let credentials: ServiceClientCredentials; - - // If at least one of them is empty, try looking at the env vars. - if (!clientID || !clientSecret || !tenantID || !subscriptionID) { - await pulumi.log.info("Checking env vars for ARM credentials.", undefined, undefined, true); - clientID = process.env["ARM_CLIENT_ID"]; - clientSecret = process.env["ARM_CLIENT_SECRET"]; - tenantID = process.env["ARM_TENANT_ID"]; - subscriptionID = process.env["ARM_SUBSCRIPTION_ID"]; - } - - // If they are still empty, try to get the creds from Az CLI. - if (!clientID || !clientSecret || !tenantID || !subscriptionID) { - await pulumi.log.info("Env vars did not contain ARM credentials. Trying Az CLI.", undefined, undefined, true); - // `create()` will throw an error if the Az CLI is not installed or `az login` has never been run. - const cliCredentials = await msRestAzure.AzureCliCredentials.create(); - subscriptionID = cliCredentials.subscriptionInfo.id; - credentials = cliCredentials; - await pulumi.log.info("Using credentials from Az CLI.", undefined, undefined, true); - } else { - credentials = await msRestAzure.loginWithServicePrincipalSecret(clientID, clientSecret, tenantID); - } - - return new cdnManagement.CdnManagementClient(credentials, subscriptionID); - } - - async check(olds: DynamicProviderInputs, news: DynamicProviderInputs): Promise { - // If none of the CDN properties changed, then there is nothing to be validated. - if (olds.profileName === news.profileName && - olds.endpointName === news.endpointName && - olds.customDomainHostName === news.customDomainHostName) { - return { inputs: news }; - } - - const failures: pulumi.dynamic.CheckFailure[] = []; - if (!news.endpointName) { - failures.push({ - property: "endpointName", - reason: "endpointName is required", - }); - } - if (!news.profileName) { - failures.push({ - property: "profileName", - reason: "profileName is required", - }); - } - if (!news.customDomainHostName) { - failures.push({ - property: "customDomainHostName", - reason: "customDomainHostName is required", - }); - } - - if (failures.length > 0) { - return { failures: failures }; - } - - return { inputs: news }; - } - - async diff(id: string, previousOutput: DynamicProviderOutputs, news: DynamicProviderInputs): Promise { - const replaces: string[] = []; - let changes = false; - let deleteBeforeReplace = false; - - if (previousOutput.customDomainHostName !== news.customDomainHostName || previousOutput.name !== this.name) { - await pulumi.log.warn("Changing the domain name properties will cause downtime.", undefined, undefined, true); - - changes = true; - deleteBeforeReplace = true; - if (previousOutput.customDomainHostName !== news.customDomainHostName) { - replaces.push("customDomainHostName"); - } - if (previousOutput.name !== this.name) { - replaces.push("customDomainName"); - } - } - - if (previousOutput.endpointName !== news.endpointName) { - changes = true; - deleteBeforeReplace = true; - replaces.push("endpointName"); - } - - // HTTPS can be enabled/disabled in-place. - if (previousOutput.httpsEnabled !== news.httpsEnabled) { - changes = true; - replaces.push("httpsEnabled"); - } - - return { - deleteBeforeReplace: deleteBeforeReplace, - replaces: replaces, - changes: changes, - }; - } - - async create(inputs: DynamicProviderInputs): Promise { - const cdnClient = await this.getCDNManagementClient(); - - const validationOutput = await cdnClient.endpoints.validateCustomDomain( - inputs.resourceGroupName, - inputs.profileName, - inputs.endpointName, - inputs.customDomainHostName); - if (!validationOutput.customDomainValidated) { - throw new Error(`Validation of custom domain failed with ${validationOutput.reason}`); - } - - const result = - await cdnClient.customDomains.create( - inputs.resourceGroupName, - inputs.profileName, - inputs.endpointName, - this.name, - inputs.customDomainHostName); - - if (inputs.httpsEnabled) { - await pulumi.log.info("Enabling HTTPS for the custom domain", undefined, undefined, true); - - await cdnClient.customDomains.enableCustomHttps( - inputs.resourceGroupName, - inputs.profileName, - inputs.endpointName, - this.name, - { - customDomainHttpsParameters: { - certificateSource: "Cdn", - certificateSourceParameters: { - certificateType: "Dedicated", - }, - protocolType: "ServerNameIndication", - }, - }); - } - - const outs: DynamicProviderOutputs = { - ...result, - name: this.name, - resourceGroupName: inputs.resourceGroupName, - profileName: inputs.profileName, - endpointName: inputs.endpointName, - customDomainHostName: inputs.customDomainHostName, - httpsEnabled: inputs.httpsEnabled, - }; - - return { id: result.id!, outs: outs }; - } - - async read(id: string, props: DynamicProviderOutputs): Promise { - const cdnClient = await this.getCDNManagementClient(); - const result = await cdnClient.customDomains.get(props.resourceGroupName, props.profileName, props.endpointName, this.name); - return { - id: result.id, - props: { ...props, ...result }, - }; - } - - async delete(id: string, props: DynamicProviderOutputs): Promise { - const cdnClient = await this.getCDNManagementClient(); - const result = await cdnClient.customDomains.deleteMethod(props.resourceGroupName, props.profileName, props.endpointName, this.name); - if (result._response.status >= 400) { - throw new Error("Error response received while trying to delete the custom domain."); - } - if (!result.resourceState) { - return; - } - if (result.resourceState !== "Deleting") { - throw new Error(`Provisioning state of the custom domain was expected to be 'Deleting', but was ${result.resourceState}.`); - } - - await pulumi.log.info( - "The request to delete was successful. However, it can take a minute or two to fully complete deletion.", - undefined, - undefined, - true); - } - - /** - * The only thing that the update method really updates in the custom domain is the HTTPS enablement. - */ - async update(id: string, currentOutputs: DynamicProviderOutputs, newInputs: DynamicProviderInputs): Promise { - const cdnClient = await this.getCDNManagementClient(); - if (newInputs.httpsEnabled) { - await cdnClient.customDomains.enableCustomHttps( - newInputs.resourceGroupName, - newInputs.profileName, - newInputs.endpointName, - this.name, - { - customDomainHttpsParameters: { - certificateSource: "Cdn", - certificateSourceParameters: { - certificateType: "Dedicated", - }, - protocolType: "ServerNameIndication", - }, - }); - - currentOutputs.httpsEnabled = true; - return { outs: currentOutputs }; - } - - await cdnClient.customDomains.disableCustomHttps( - newInputs.resourceGroupName, - newInputs.profileName, - newInputs.endpointName, - this.name); - - currentOutputs.httpsEnabled = false; - return { outs: currentOutputs }; - } -} - -/** - * CDNCustomDomainResource is a resource that can be used to create - * custom domains against Azure CDN resources. - * The Azure CDN resource itself must exist in order to create a custom domain for it. - * - * Outputs from the dynamic resource provider must be declared in the dynamic resource itself - * as `public readonly` members with the type `Output`. These are automatically set by the dynamic - * provider engine. The names of these properties must match the names of the properties exactly as - * returned in the outputs of the dynamic resource provider functions. - */ -export class CDNCustomDomainResource extends pulumi.dynamic.Resource { - /** - * These are the same properties that were originally passed as inputs, but available as outputs - * for convenience. The names of these properties must match with `CustomDomainOptions`. - */ - public readonly resourceGroupName: pulumi.Output; - public readonly profileName: pulumi.Output; - public readonly endpointName: pulumi.Output; - public readonly customDomainHostName: pulumi.Output; - public readonly httpsEnabled: pulumi.Output; - - // The following are properties set by the CDN rest client. - public readonly customHttpsProvisioningState: pulumi.Output; - public readonly customHttpsProvisioningSubstate: pulumi.Output; - public readonly provisioningState: pulumi.Output; - public readonly resourceState: pulumi.Output; - public readonly type: pulumi.Output; - - constructor(name: string, args: CustomDomainOptions, opts?: pulumi.CustomResourceOptions) { - super(new CDNCustomDomainResourceProvider(name), `azure:cdn:Endpoint:CustomDomains:${name}`, args, opts); - } -} diff --git a/classic-azure-ts-dynamicresource/index.ts b/classic-azure-ts-dynamicresource/index.ts deleted file mode 100644 index fe3f806b5..000000000 --- a/classic-azure-ts-dynamicresource/index.ts +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2016-2019, Pulumi Corporation. All rights reserved. - -import * as azure from "@pulumi/azure"; -import * as pulumi from "@pulumi/pulumi"; - -import { CDNCustomDomainResource } from "./cdnCustomDomain"; - -/** - * The location where our resource group and the resources under it will be created. - * - * To externalize this value, and make this configurable across environments/stacks, - * learn more at https://www.pulumi.com/docs/intro/concepts/config/. - */ -const location = azure.Locations.WestUS; - -// Create an Azure Resource Group -const resourceGroup = new azure.core.ResourceGroup("resourceGroup", { - location: location, -}); - -// Create an Azure resource (Storage Account) so we can point the CDN endpoint to it. -const storageAccount = new azure.storage.Account("storageAccount", { - resourceGroupName: resourceGroup.name, - accountTier: "Standard", - accountReplicationType: "LRS", -}); - -/** - * Create a Blob container in the storage account, - * to store any static files. The CDN endpoint will be pointed at the - * endpoint for this blob container. - */ -const blobContainer = new azure.storage.Container("blobContainer", { - storageAccountName: storageAccount.name, - // Make each "blob" in the container publicly accessible. - // DO NOT set this property if you are going to store sensitive files! - containerAccessType: "blob", -}); - -const cdnProfile = new azure.cdn.Profile("cdnProfile", { - resourceGroupName: resourceGroup.name, - // Choose an appropriate SKU to use. - // https://docs.microsoft.com/en-us/azure/cdn/cdn-features - sku: "Standard_Akamai", -}); - -const cdnEndpoint = new azure.cdn.Endpoint("cdnEndpoint", { - /** - * Specify a well-known name for the endpoint name, - * so you can add a CNAME record for your custom domain - * pointing to this CDN endpoint to it. - * - * For example, the URL for this CDN endpoint when it is created - * would be `my-cdn-endpoint.azureedge.net`. - */ - name: "my-cdn-endpoint", - resourceGroupName: resourceGroup.name, - profileName: cdnProfile.name, - isHttpsAllowed: true, - isHttpAllowed: false, - isCompressionEnabled: true, - originHostHeader: storageAccount.primaryBlobHost, - contentTypesToCompresses: [ - "text/plain", - "text/html", - "text/css", - "text/javascript", - "application/x-javascript", - "application/javascript", - "application/json", - "application/xml", - "image/png", - "image/jpeg", - ], - origins: [ - { - name: "cdn-origin", - hostName: storageAccount.primaryBlobHost, - httpsPort: 443, - }, - ], -}); - -export const cdnEndpointUrl = pulumi.interpolate`https://${cdnEndpoint.hostName}`; - -export const cdnCustomDomainResource = new CDNCustomDomainResource("cdnCustomDomain", { - resourceGroupName: resourceGroup.name, - // Ensure that there is a CNAME record for mycompany.com pointing to my-cdn-endpoint.azureedge.net. - // You would do that in your domain registrar's portal. - customDomainHostName: "mycompany.com", - profileName: cdnProfile.name, - endpointName: cdnEndpoint.name, - /** - * This will enable HTTPS through Azure's one-click - * automated certificate deployment. The certificate is - * fully managed by Azure from provisioning to automatic renewal - * at no additional cost to you. - */ - httpsEnabled: true, -}, { parent: cdnEndpoint }); diff --git a/classic-azure-ts-dynamicresource/package.json b/classic-azure-ts-dynamicresource/package.json deleted file mode 100644 index dabc53c9a..000000000 --- a/classic-azure-ts-dynamicresource/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "azure-ts-appservice", - "version": "1.0.0", - "devDependencies": { - "@types/node": "^8.0.0" - }, - "dependencies": { - "@azure/arm-cdn": "^5.0.0", - "@azure/ms-rest-azure-js": "^1.3.7", - "@azure/ms-rest-js": "^1.8.10", - "@azure/ms-rest-nodeauth": "^1.1.1", - "@pulumi/azure": "^4.0.0", - "@pulumi/pulumi": "^3.0.0" - } -} diff --git a/classic-azure-ts-dynamicresource/tsconfig.json b/classic-azure-ts-dynamicresource/tsconfig.json deleted file mode 100644 index 94efe58fa..000000000 --- a/classic-azure-ts-dynamicresource/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "outDir": "bin", - "target": "es2016", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true, - "strictNullChecks": true - }, - "files": [ - "cdnCustomDomain.ts", - "index.ts" - ] -} diff --git a/classic-azure-ts-hdinsight-spark/Pulumi.yaml b/classic-azure-ts-hdinsight-spark/Pulumi.yaml index 6d7ef2365..12f69ebf9 100644 --- a/classic-azure-ts-hdinsight-spark/Pulumi.yaml +++ b/classic-azure-ts-hdinsight-spark/Pulumi.yaml @@ -6,9 +6,11 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into username: description: Spark username secret: true password: description: "Spark password (complex enough to satisfy Azure policy: 8+ chars of lowercase, uppercase, digits, and special symbols)" - secret: true \ No newline at end of file + secret: true diff --git a/classic-azure-ts-hdinsight-spark/README.md b/classic-azure-ts-hdinsight-spark/README.md index 48323c5e3..2d1b307d8 100644 --- a/classic-azure-ts-hdinsight-spark/README.md +++ b/classic-azure-ts-hdinsight-spark/README.md @@ -7,27 +7,36 @@ An example Pulumi component that deploys a Spark cluster on Azure HDInsight. ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: - ``` - $ npm install + ```bash + npm install ``` -1. Run `pulumi up` to preview and deploy changes: +1. Configure target Azure environment: + ```bash + pulumi config set azure:location + pulumi config set azure:subscriptionId + pulumi config set username + pulumi config set password --secret ``` + +1. Run `pulumi up` to preview and deploy changes: + + ```console $ pulumi up Previewing changes: ... @@ -39,9 +48,9 @@ An example Pulumi component that deploys a Spark cluster on Azure HDInsight. Update duration: 15m6s ``` -1. Check the deployed Spark endpoint: +1. Check the deployed Spark endpoint: - ``` + ```console $ pulumi stack output endpoint https://myspark1234abcd.azurehdinsight.net/ diff --git a/classic-azure-ts-hdinsight-spark/index.ts b/classic-azure-ts-hdinsight-spark/index.ts index 364bcfd1d..9143708d6 100644 --- a/classic-azure-ts-hdinsight-spark/index.ts +++ b/classic-azure-ts-hdinsight-spark/index.ts @@ -36,24 +36,23 @@ const sparkCluster = new azure.hdinsight.SparkCluster("myspark", { storageContainerId: storageContainer.id, }], gateway: { - enabled: true, username, password, }, roles: { headNode: { - vmSize: "Standard_D12_v2", + vmSize: "Standard_D12_V2", username, password, }, workerNode: { targetInstanceCount: 3, - vmSize: "Standard_D12_v2", + vmSize: "Standard_D12_V2", username, password, }, zookeeperNode: { - vmSize: "Standard_D12_v2", + vmSize: "Standard_D12_V2", username, password, }, diff --git a/classic-azure-ts-hdinsight-spark/package.json b/classic-azure-ts-hdinsight-spark/package.json index bb1d268f1..6d9f564c8 100644 --- a/classic-azure-ts-hdinsight-spark/package.json +++ b/classic-azure-ts-hdinsight-spark/package.json @@ -5,7 +5,7 @@ "@types/node": "^8.0.0" }, "dependencies": { - "@pulumi/azure": "^4.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/pulumi": "^3.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-msi-keyvault-rbac/Pulumi.yaml b/classic-azure-ts-msi-keyvault-rbac/Pulumi.yaml index da1c6b591..2483bbc4f 100644 --- a/classic-azure-ts-msi-keyvault-rbac/Pulumi.yaml +++ b/classic-azure-ts-msi-keyvault-rbac/Pulumi.yaml @@ -8,3 +8,5 @@ template: default: public azure:location: description: The Azure location to use (e.g., `eastus` or `westeurope`) + azure:subscriptionId: + description: The Azure Subscription to deploy into diff --git a/classic-azure-ts-msi-keyvault-rbac/README.md b/classic-azure-ts-msi-keyvault-rbac/README.md index 7544d20b9..f794a2d98 100644 --- a/classic-azure-ts-msi-keyvault-rbac/README.md +++ b/classic-azure-ts-msi-keyvault-rbac/README.md @@ -17,39 +17,40 @@ The application consists of several parts: ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: - ``` - $ npm install + ```bash + npm install ``` -1. Build and publish the ASP.NET Core project: +1. Build and publish the ASP.NET Core project: - ``` - $ dotnet publish webapp + ```bash + dotnet publish webapp ``` -1. Set an appropriate Azure location like: +1. Configure target Azure environment: - ``` - $ pulumi config set azure:location westus + ```bash + pulumi config set azure:location + pulumi config set azure:subscriptionId ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -61,9 +62,9 @@ The application consists of several parts: Update duration: 4m16s ``` -1. Check the deployed website endpoint: +1. Check the deployed website endpoint: - ``` + ```console $ pulumi stack output endpoint https://app129968b8.azurewebsites.net/ $ curl "$(pulumi stack output endpoint)" diff --git a/classic-azure-ts-msi-keyvault-rbac/index.ts b/classic-azure-ts-msi-keyvault-rbac/index.ts index 5c270bd42..12cddbb0c 100644 --- a/classic-azure-ts-msi-keyvault-rbac/index.ts +++ b/classic-azure-ts-msi-keyvault-rbac/index.ts @@ -22,7 +22,7 @@ const storageContainer = new azure.storage.Container("files", { // Azure SQL Server that we want to access from the application const administratorLoginPassword = new random.RandomPassword("password", { length: 16, special: true }).result; -const sqlServer = new azure.sql.SqlServer("sqlserver", { +const sqlServer = new azure.mssql.Server("sqlserver", { resourceGroupName: resourceGroup.name, // The login and password are required but won't be used in our application administratorLogin: "manualadmin", @@ -31,10 +31,8 @@ const sqlServer = new azure.sql.SqlServer("sqlserver", { }); // Azure SQL Database that we want to access from the application -const database = new azure.sql.Database("sqldb", { - resourceGroupName: resourceGroup.name, - serverName: sqlServer.name, - requestedServiceObjectiveName: "S0", +const database = new azure.mssql.Database("sqldb", { + serverId: sqlServer.id, }); // The connection string that has no credentials in it: authertication will come through MSI @@ -81,7 +79,7 @@ const vault = new azure.keyvault.KeyVault("vault", { // The current principal has to be granted permissions to Key Vault so that it can actually add and then remove // secrets to/from the Key Vault. Otherwise, 'pulumi up' and 'pulumi destroy' operations will fail. objectId: currentPrincipal, - secretPermissions: ["delete", "get", "list", "set"], + secretPermissions: ["Delete", "Get", "List", "Set"], }], }); @@ -119,27 +117,26 @@ const app = new azure.appservice.AppService("app", { }); // Work around a preview issue https://github.com/pulumi/pulumi-azure/issues/192 -const principalId = app.identity.apply(id => id.principalId || "11111111-1111-1111-1111-111111111111"); +const principalId = app.identity.apply(id => id!.principalId || "11111111-1111-1111-1111-111111111111"); // Grant App Service access to KV secrets const policy = new azure.keyvault.AccessPolicy("app-policy", { keyVaultId: vault.id, tenantId: tenantId, objectId: principalId, - secretPermissions: ["get"], + secretPermissions: ["Get"], }); // Make the App Service the admin of the SQL Server (double check if you want a more fine-grained security model in your real app) -const sqlAdmin = new azure.sql.ActiveDirectoryAdministrator("adadmin", { - resourceGroupName: resourceGroup.name, +const sqlAdmin = new azure.mssql.ManagedInstanceActiveDirectoryAdministrator("adadmin", { + managedInstanceId: sqlServer.id, tenantId: tenantId, objectId: principalId, - login: "adadmin", - serverName: sqlServer.name, + loginUsername: "adadmin", }); // Grant access from App Service to the container in the storage -const blobPermission = new azure.role.Assignment("readblob", { +const blobPermission = new azure.authorization.Assignment("readblob", { principalId, scope: pulumi.interpolate`${storageAccount.id}/blobServices/default/containers/${storageContainer.name}`, roleDefinitionName: "Storage Blob Data Reader", @@ -148,11 +145,10 @@ const blobPermission = new azure.role.Assignment("readblob", { // Add SQL firewall exceptions const firewallRules = app.outboundIpAddresses.apply( ips => ips.split(",").map( - ip => new azure.sql.FirewallRule(`FR${ip}`, { - resourceGroupName: resourceGroup.name, + ip => new azure.mssql.FirewallRule(`FR${ip}`, { + serverId: sqlServer.id, startIpAddress: ip, endIpAddress: ip, - serverName: sqlServer.name, }), )); diff --git a/classic-azure-ts-msi-keyvault-rbac/package.json b/classic-azure-ts-msi-keyvault-rbac/package.json index 603278a07..48fc67c11 100644 --- a/classic-azure-ts-msi-keyvault-rbac/package.json +++ b/classic-azure-ts-msi-keyvault-rbac/package.json @@ -5,8 +5,8 @@ "@types/node": "^8.0.0" }, "dependencies": { - "@pulumi/azure": "^4.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/pulumi": "^3.0.0", "@pulumi/random": "^4.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-serverless-url-shortener-global/Pulumi.yaml b/classic-azure-ts-serverless-url-shortener-global/Pulumi.yaml index 071ee591e..8a1c8ddb5 100644 --- a/classic-azure-ts-serverless-url-shortener-global/Pulumi.yaml +++ b/classic-azure-ts-serverless-url-shortener-global/Pulumi.yaml @@ -6,6 +6,8 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into locations: description: Comma-separated list of location aliases default: westus,westeurope diff --git a/classic-azure-ts-serverless-url-shortener-global/README.md b/classic-azure-ts-serverless-url-shortener-global/README.md index 469c7460f..d19a149f9 100644 --- a/classic-azure-ts-serverless-url-shortener-global/README.md +++ b/classic-azure-ts-serverless-url-shortener-global/README.md @@ -7,33 +7,34 @@ Multi-region deployment of Azure Functions and Cosmos DB with Traffic Manager ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: - ``` - $ npm install + ```bash + npm install ``` -1. Specify the Azure regions to deploy the application: +1. Specify the Azure subscription and regions to deploy the application: - ``` - $ pulumi config set locations westus,westeurope + ```bash + pulumi config set locations westus,westeurope + pulumi config set azure:subscriptionId ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -45,9 +46,9 @@ Multi-region deployment of Azure Functions and Cosmos DB with Traffic Manager Update duration: 21m33.3252322s ``` -1. Add a short URL: +1. Add a short URL: - ``` + ```console $ pulumi stack output addEndpoint https://urlshort-add94ac80f8.azurewebsites.net/api/urlshort-add $ curl -H "Content-Type: application/json" \ @@ -57,9 +58,9 @@ Multi-region deployment of Azure Functions and Cosmos DB with Traffic Manager Short URL saved ``` -1. Query a short URL: +1. Query a short URL: - ``` + ```console $ pulumi stack output endpoint http://urlshort-tm.trafficmanager.net/api/ $ curl -L $(pulumi stack output endpoint)pulumi diff --git a/classic-azure-ts-serverless-url-shortener-global/index.ts b/classic-azure-ts-serverless-url-shortener-global/index.ts index b68f6445c..73b292d93 100644 --- a/classic-azure-ts-serverless-url-shortener-global/index.ts +++ b/classic-azure-ts-serverless-url-shortener-global/index.ts @@ -39,6 +39,7 @@ const collection = new azure.cosmosdb.SqlContainer("Urls", { resourceGroupName: resourceGroup.name, accountName: account.name, databaseName: database.name, + partitionKeyPaths: ["/key"], }); // Traffic Manager as a global HTTP endpoint @@ -64,7 +65,7 @@ const fn = new azure.appservice.HttpEventSubscription("AddUrl", { methods: ["POST"], callbackFactory: () => { const endpoint = account.endpoint.get(); - const key = account.primaryMasterKey.get(); + const key = account.primaryKey.get(); const client = new CosmosClient({ endpoint, key, connectionPolicy: { preferredLocations: [primaryLocation] } }); const container = client.database(database.name.get()).container(collection.name.get()); @@ -85,7 +86,7 @@ for (const location of locations) { route: "{key}", callbackFactory: () => { const endpoint = account.endpoint.get(); - const key = account.primaryMasterKey.get(); + const key = account.primaryKey.get(); const client = new CosmosClient({ endpoint, key, connectionPolicy: { preferredLocations: [location] } }); const container = client.database(database.name.get()).container(collection.name.get()); @@ -114,13 +115,9 @@ for (const location of locations) { const app = fn.functionApp; // An endpoint per region for Traffic Manager, link to the corresponding Function App - const endpoint = new azure.network.TrafficManagerEndpoint(`tme${location}`, { - resourceGroupName: resourceGroup.name, - profileName: profile.name, - type: "azureEndpoints", + const endpoint = new azure.network.TrafficManagerAzureEndpoint(`tme${location}`, { + profileId: profile.id, targetResourceId: app.id, - target: app.defaultHostname, - endpointLocation: app.location, }); } diff --git a/classic-azure-ts-serverless-url-shortener-global/package.json b/classic-azure-ts-serverless-url-shortener-global/package.json index d7e2b07c1..f68f53fb5 100644 --- a/classic-azure-ts-serverless-url-shortener-global/package.json +++ b/classic-azure-ts-serverless-url-shortener-global/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@azure/cosmos": "^3.1.0", - "@pulumi/azure": "^4.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/pulumi": "^3.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-stream-analytics/Pulumi.yaml b/classic-azure-ts-stream-analytics/Pulumi.yaml index e0cee0b55..980efb76d 100644 --- a/classic-azure-ts-stream-analytics/Pulumi.yaml +++ b/classic-azure-ts-stream-analytics/Pulumi.yaml @@ -8,3 +8,5 @@ template: default: public azure:location: description: The Azure location to deploy to (e.g., `eastus` or `westeurope`) + azure:subscriptionId: + description: The Azure Subscription to deploy into diff --git a/classic-azure-ts-stream-analytics/README.md b/classic-azure-ts-stream-analytics/README.md index 54e59c430..acbd992c1 100644 --- a/classic-azure-ts-stream-analytics/README.md +++ b/classic-azure-ts-stream-analytics/README.md @@ -7,33 +7,34 @@ An example Pulumi program that deploys an Azure Stream Analytics job to transfor ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: - ``` - $ npm install + ```bash + npm install ``` -1. Configure the location to deploy the example to: +1. Configure the Azure location and subscription to deploy the example to: - ``` - $ pulumi config set azure:location + ```bash + pulumi config set azure:location + pulumi config set azure:subscriptionId ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing update (dev): ... @@ -45,9 +46,9 @@ An example Pulumi program that deploys an Azure Stream Analytics job to transfor Update duration: 2m43s ``` -1. Use the following sample messages for testing: +1. Use the following sample messages for testing: - ``` + ```jsonc // Inputs (1 line - 1 event): {"Make":"Kia","Sales":2,"Time":"2019-06-26T10:22:36Z"} {"Make":"Kia","Sales":1,"Time":"2019-06-26T10:22:37Z"} @@ -60,8 +61,8 @@ An example Pulumi program that deploys an Azure Stream Analytics job to transfor You can send a message with a `curl` command: - ``` + ```bash curl -X POST '$(pulumi stack output inputEndpoint)' -H 'Authorization: $(pulumi stack output sasToken)' -H 'Content-Type: application/atom+xml;type=entry;charset=utf-8' -d '{"Make":"Kia","Sales":2,"Time":"2019-06-26T10:22:36Z"}' ``` -1. [Start the Stream Analytics job](https://docs.microsoft.com/en-us/azure/stream-analytics/start-job). The job will start emitting messages to the output Event Hub once per minute. The Azure Function `analytics-output` will start printing those events into the console (you'd have to open the function console in the Azure portal to see them). +1. [Start the Stream Analytics job](https://docs.microsoft.com/en-us/azure/stream-analytics/start-job). The job will start emitting messages to the output Event Hub once per minute. The Azure Function `analytics-output` will start printing those events into the console (you'd have to open the function console in the Azure portal to see them). diff --git a/classic-azure-ts-stream-analytics/index.ts b/classic-azure-ts-stream-analytics/index.ts index 75b544b45..ede3b3243 100644 --- a/classic-azure-ts-stream-analytics/index.ts +++ b/classic-azure-ts-stream-analytics/index.ts @@ -10,7 +10,7 @@ const resourceGroup = new azure.core.ResourceGroup("streams-rg"); // Define an Event Hub Namespace with two Hubs for an input and an output data streams const namespace = new azure.eventhub.EventHubNamespace("streams-ns", { resourceGroupName: resourceGroup.name, - sku: "standard", + sku: "Standard", }); const inputHub = new azure.eventhub.EventHub("inputs", { @@ -20,7 +20,7 @@ const inputHub = new azure.eventhub.EventHub("inputs", { messageRetention: 7, }); -const consumerGroup = new azure.eventhub.EventHubConsumerGroup("analytics", { +const consumerGroup = new azure.eventhub.ConsumerGroup("analytics", { resourceGroupName: resourceGroup.name, namespaceName: namespace.name, eventhubName: inputHub.name, diff --git a/classic-azure-ts-stream-analytics/package.json b/classic-azure-ts-stream-analytics/package.json index cd7248c49..28ad709dc 100644 --- a/classic-azure-ts-stream-analytics/package.json +++ b/classic-azure-ts-stream-analytics/package.json @@ -6,9 +6,9 @@ "@types/utf8": "^2.1.6" }, "dependencies": { - "@pulumi/azure": "^4.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/pulumi": "^3.0.0", "crypto": "^1.0.1", "utf8": "^3.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-vm-provisioners/README.md b/classic-azure-ts-vm-provisioners/README.md index c44dc5271..5bc29467e 100755 --- a/classic-azure-ts-vm-provisioners/README.md +++ b/classic-azure-ts-vm-provisioners/README.md @@ -13,30 +13,29 @@ First, create a stack, using `pulumi stack init`. Now, we need to ensure that our dependencies are installed: +```bash +npm install ``` -$ npm install -``` - You'll need to log in to the azure cli. You will be prompted to do this during deployment if you forget this step. -``` -$ az login +```bash +az login ``` We'll need to set some config for login credentials, and location information. -``` +```bash pulumi config set azure:location westus +pulumi config set azure:subscriptionId pulumi config set username pulumi config set password --secret - ``` Next, generate an OpenSSH keypair for use with your server - as per the Azure [Requirements][1] -``` -$ ssh-keygen -t rsa -f rsa -m PEM +```bash +ssh-keygen -t rsa -f rsa -m PEM ``` This will output two files, `rsa` and `rsa.pub`, in the current directory. Be sure not to commit these files! @@ -44,9 +43,9 @@ This will output two files, `rsa` and `rsa.pub`, in the current directory. Be su We then need to configure our stack so that the public key is used by our VM, and the private key used for subsequent SCP and SSH steps to configure our server after it is stood up. -``` -$ cat rsa.pub | pulumi config set publicKey -- -$ cat rsa | pulumi config set privateKey --secret -- +```bash +cat rsa.pub | pulumi config set publicKey -- +cat rsa | pulumi config set privateKey --secret -- ``` Notice that we've used `--secret` for `privateKey`. This ensures the private key is stored as an encrypted [Pulumi secret](https://www.pulumi.com/docs/intro/concepts/secrets/). diff --git a/classic-azure-ts-vm-provisioners/index.ts b/classic-azure-ts-vm-provisioners/index.ts index 89d350592..e602b3c2f 100644 --- a/classic-azure-ts-vm-provisioners/index.ts +++ b/classic-azure-ts-vm-provisioners/index.ts @@ -13,7 +13,7 @@ const username = config.require("username"); const password = config.requireSecret("password"); // retrieve the ssh publicKey from config -const publicKey = config.get("publicKey"); +const publicKey = config.require("publicKey"); // The privateKey associated with the selected key must be provided (either directly or base64 encoded). const privateKey = config.requireSecret("privateKey").apply(key => { @@ -33,7 +33,7 @@ const network = new azure.network.VirtualNetwork("server-network", { addressSpaces: ["10.0.0.0/16"], subnets: [{ name: "default", - addressPrefix: "10.0.1.0/24", + addressPrefixes: ["10.0.1.0/24"], }], }); @@ -144,7 +144,7 @@ const changeToken = getFileHash("myapp.conf"); const cpConfig = new command.remote.CopyToRemote("config", { triggers: [changeToken], connection, - source: new pulumi.asset.FileArchive("myapp.conf"), + source: new pulumi.asset.FileAsset("myapp.conf"), remotePath: `/home/${username}/myapp.conf`, }, { dependsOn: [vm, pubIp] }); diff --git a/classic-azure-ts-vm-provisioners/package.json b/classic-azure-ts-vm-provisioners/package.json index baa33d52d..33f0551f4 100755 --- a/classic-azure-ts-vm-provisioners/package.json +++ b/classic-azure-ts-vm-provisioners/package.json @@ -1,11 +1,10 @@ { "name": "azure-vm-provisioners", "version": "0.1.0", - "main": "index.js", "dependencies": { - "@pulumi/azure": "^5.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/command": "^1.0.0", "@pulumi/pulumi": "^3.0.0", - "@pulumi/tls": "^4.0.0" + "@pulumi/tls": "^5.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-vm-scaleset/Pulumi.yaml b/classic-azure-ts-vm-scaleset/Pulumi.yaml index 22f8c6409..e993a0a4d 100644 --- a/classic-azure-ts-vm-scaleset/Pulumi.yaml +++ b/classic-azure-ts-vm-scaleset/Pulumi.yaml @@ -6,3 +6,5 @@ template: azure:environment: description: The Azure environment to use (`public`, `usgovernment`, `german`, `china`) default: public + azure:subscriptionId: + description: The Azure Subscription to deploy into diff --git a/classic-azure-ts-vm-scaleset/README.md b/classic-azure-ts-vm-scaleset/README.md index 440793363..0d5e3f99e 100644 --- a/classic-azure-ts-vm-scaleset/README.md +++ b/classic-azure-ts-vm-scaleset/README.md @@ -13,42 +13,43 @@ This example provisions a Scale Set of Linux web servers with nginx deployed, co ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Configure the app deployment. +1. Configure the app deployment. - ``` - $ pulumi config set azure:location westus # any valid Azure region will do + ```bash + pulumi config set azure:location westus # any valid Azure region will do + pulumi config set azure:subscriptionId ``` Optionally, configure the username and password for the admin user. Otherwise, they will be auto-generated. - ``` - $ pulumi config set adminUser webmaster - $ pulumi config set adminPassword --secret + ```bash + pulumi config set adminUser webmaster + pulumi config set adminPassword --secret ``` Note that `--secret` ensures your password is encrypted safely. -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: - ``` - $ npm install + ```bash + npm install ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing update: ... @@ -60,9 +61,9 @@ This example provisions a Scale Set of Linux web servers with nginx deployed, co Update duration: 2m19s ``` -1. Check the domain name of the PIP: +1. Check the domain name of the PIP: - ``` + ```console $ pulumi stack output publicAddress dsuv3vqbgi.westeurope.cloudapp.azure.com $ curl http://$(pulumi stack output publicAddress) diff --git a/classic-azure-ts-vm-scaleset/index.ts b/classic-azure-ts-vm-scaleset/index.ts index 0f85a2f55..574c4dddd 100644 --- a/classic-azure-ts-vm-scaleset/index.ts +++ b/classic-azure-ts-vm-scaleset/index.ts @@ -59,15 +59,15 @@ const vnet = new azure.network.VirtualNetwork("vnet", { }); const subnet = new azure.network.Subnet("subnet", { - enforcePrivateLinkEndpointNetworkPolicies: false, + privateLinkServiceNetworkPoliciesEnabled: false, resourceGroupName: resourceGroup.name, addressPrefixes: ["10.0.2.0/24"], virtualNetworkName: vnet.name, }); -const scaleSet = new azure.compute.ScaleSet("vmscaleset", { +const scaleSet = new azure.compute.LinuxVirtualMachineScaleSet("vmscaleset", { resourceGroupName: resourceGroup.name, - networkProfiles: [{ + networkInterfaces: [{ ipConfigurations: [{ loadBalancerBackendAddressPoolIds: [bpepool.id], name: "IPConfiguration", @@ -77,42 +77,33 @@ const scaleSet = new azure.compute.ScaleSet("vmscaleset", { name: "networkprofile", primary: true, }], - osProfile: { - adminUsername: adminUser, - adminPassword, - computerNamePrefix: "vmlab", - customData: + adminUsername: adminUser, + adminPassword, + computerNamePrefix: "vmlab", + customData: Buffer.from( `#cloud-config packages: - - nginx`, - }, - osProfileLinuxConfig: { - disablePasswordAuthentication: false, - }, - sku: { - capacity: 1, - name: "Standard_DS1_v2", - tier: "Standard", - }, - storageProfileDataDisks: [{ + - nginx`).toString("base64"), + disablePasswordAuthentication: false, + sku: "Standard_DS1_v2", + dataDisks: [{ + storageAccountType: "Standard_LRS", caching: "ReadWrite", createOption: "Empty", diskSizeGb: 10, lun: 0, }], - storageProfileImageReference: { + sourceImageReference: { offer: "UbuntuServer", publisher: "Canonical", sku: "16.04-LTS", version: "latest", }, - storageProfileOsDisk: { + osDisk: { caching: "ReadWrite", - createOption: "FromImage", - managedDiskType: "Standard_LRS", - name: "", + storageAccountType: "Standard_LRS", }, - upgradePolicyMode: "Manual", + upgradeMode: "Manual", }, { dependsOn: [bpepool] }); const autoscale = new azure.monitoring.AutoscaleSetting("vmss-autoscale", { diff --git a/classic-azure-ts-vm-scaleset/package.json b/classic-azure-ts-vm-scaleset/package.json index c2e6e3da7..86cb0659f 100644 --- a/classic-azure-ts-vm-scaleset/package.json +++ b/classic-azure-ts-vm-scaleset/package.json @@ -2,8 +2,8 @@ "name": "azure-ts-vm-scaleset", "version": "0.1.0", "dependencies": { - "@pulumi/azure": "^5.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/pulumi": "^3.0.0", "@pulumi/random": "^4.0.0" } -} +} \ No newline at end of file diff --git a/classic-azure-ts-webserver-component/Pulumi.yaml b/classic-azure-ts-webserver-component/Pulumi.yaml index 576648f59..519bcfc87 100755 --- a/classic-azure-ts-webserver-component/Pulumi.yaml +++ b/classic-azure-ts-webserver-component/Pulumi.yaml @@ -6,6 +6,8 @@ template: azure:location: description: The Azure location to use default: westus + azure:subscriptionId: + description: The Azure Subscription to deploy into username: description: The username used to configure the Virtual Machine password: diff --git a/classic-azure-ts-webserver-component/README.md b/classic-azure-ts-webserver-component/README.md index 8a95d8f6e..03e907a48 100755 --- a/classic-azure-ts-webserver-component/README.md +++ b/classic-azure-ts-webserver-component/README.md @@ -16,40 +16,41 @@ defining a `WebServer` class, we can hide many details (see [here](./webserver.t ## Running the App -1. Create a new stack: +1. Create a new stack: - ``` - $ pulumi stack init dev + ```bash + pulumi stack init dev ``` -1. Configure the deployment. The username and password here will be used to configure the Virtual Machine. The +1. Configure the deployment. The username and password here will be used to configure the Virtual Machine. The password must adhere to the [Azure restrictions on VM passwords]( https://docs.microsoft.com/en-us/azure/virtual-machines/windows/faq#what-are-the-password-requirements-when-creating-a-vm). - ``` - $ pulumi config set azure:location westus # any valid Azure region will do - $ pulumi config set username webmaster - $ pulumi config set password --secret - $ pulumi config set count 5 # optional -- will default to 2 if left out + ```bash + pulumi config set azure:location westus # any valid Azure region will do + pulumi config set azure:subscriptionId + pulumi config set username webmaster + pulumi config set password --secret + pulumi config set count 5 # optional -- will default to 2 if left out ``` Note that `--secret` ensures your password is encrypted safely. -1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): - ``` - $ az login + ```bash + az login ``` -1. Restore NPM dependencies: +1. Restore NPM dependencies: - ``` - $ npm install + ```bash + npm install ``` -1. Run `pulumi up` to preview and deploy changes: +1. Run `pulumi up` to preview and deploy changes: - ``` + ```console $ pulumi up Previewing changes: ... @@ -61,9 +62,9 @@ defining a `WebServer` class, we can hide many details (see [here](./webserver.t Update duration: 4m27s ``` -1. Check the resulting IP addresses: +1. Check the resulting IP addresses: - ``` + ```console $ pulumi stack output ipAddresses [ 40.112.181.239, ..., 40.112.181.240 ] ``` diff --git a/classic-azure-ts-webserver-component/index.ts b/classic-azure-ts-webserver-component/index.ts index 9d198be37..88d9d9518 100644 --- a/classic-azure-ts-webserver-component/index.ts +++ b/classic-azure-ts-webserver-component/index.ts @@ -19,7 +19,7 @@ const network = new azure.network.VirtualNetwork("server-network", { addressSpaces: ["10.0.0.0/16"], subnets: [{ name: "default", - addressPrefix: "10.0.1.0/24", + addressPrefixes: ["10.0.1.0/24"], }], }); diff --git a/classic-azure-ts-webserver-component/package.json b/classic-azure-ts-webserver-component/package.json index 599b0dd4c..5cb7c5686 100755 --- a/classic-azure-ts-webserver-component/package.json +++ b/classic-azure-ts-webserver-component/package.json @@ -2,7 +2,7 @@ "name": "ws-ts-azure-comp", "version": "0.1.0", "dependencies": { - "@pulumi/azure": "^4.0.0", + "@pulumi/azure": "^6.0.0", "@pulumi/pulumi": "^3.0.0" } -} +} \ No newline at end of file diff --git a/misc/test/definitions/azure.go b/misc/test/definitions/azure.go index 86ff535ad..e6ef5b978 100644 --- a/misc/test/definitions/azure.go +++ b/misc/test/definitions/azure.go @@ -61,10 +61,6 @@ var AzureTests = TestDefinitions{ }, }, }, - { - Tags: []Tag{AzureCloud, AzureClassicProvider, TS}, - Dir: "classic-azure-ts-arm-template", - }, { Tags: []Tag{AzureCloud, AzureClassicProvider, TS}, Dir: "classic-azure-ts-stream-analytics",