diff --git a/source/Calamari.Tests/AppServiceBehaviorFixture.cs b/source/Calamari.Tests/AppServiceBehaviorFixture.cs index 8aa82536..946c484a 100644 --- a/source/Calamari.Tests/AppServiceBehaviorFixture.cs +++ b/source/Calamari.Tests/AppServiceBehaviorFixture.cs @@ -1,16 +1,12 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; -using System.Net.Http; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; -using Azure.Identity; -using Azure.ResourceManager.Resources; using Azure.ResourceManager.Resources.Models; using Calamari.Azure; using Calamari.Common.Plumbing.FileSystem; @@ -281,12 +277,7 @@ private static (string packagePath, string packageName, string packageVersion) P private void AddVariables(CommandTestBuilderContext context) { - context.Variables.Add(AccountVariables.ClientId, clientId); - context.Variables.Add(AccountVariables.Password, clientSecret); - context.Variables.Add(AccountVariables.TenantId, tenantId); - context.Variables.Add(AccountVariables.SubscriptionId, subscriptionId); - context.Variables.Add("Octopus.Action.Azure.ResourceGroupName", resourceGroupName); - context.Variables.Add("Octopus.Action.Azure.WebAppName", site.Name); + AddAzureVariables(context); context.Variables.Add("Greeting", greeting); context.Variables.Add(KnownVariables.Package.EnabledFeatures, KnownVariables.Features.SubstituteInFiles); context.Variables.Add(PackageVariables.SubstituteInFilesTargets, "index.html"); @@ -297,9 +288,6 @@ private void AddVariables(CommandTestBuilderContext context) [TestFixture] public class WhenUsingALinuxAppService : AppServiceIntegrationTest { - private string linuxServicePlanName; - private string functionAppSiteName; - protected override async Task ConfigureTestResources(ResourceGroup resourceGroup) { var storageClient = new StorageManagementClient(new TokenCredentials(authToken)) @@ -329,7 +317,7 @@ protected override async Task ConfigureTestResources(ResourceGroup resourceGroup } ); - var functionAppSite = await webMgmtClient.WebApps.BeginCreateOrUpdateAsync(resourceGroupName, + site = await webMgmtClient.WebApps.BeginCreateOrUpdateAsync(resourceGroupName, $"{resourceGroupName}-linux", new Site(resourceGroupLocation) { @@ -350,9 +338,6 @@ protected override async Task ConfigureTestResources(ResourceGroup resourceGroup } } ); - - linuxServicePlanName = linuxSvcPlan.Name; - functionAppSiteName = functionAppSite.Name; } [Test] @@ -371,7 +356,7 @@ await CommandTestBuilder.CreateAsync().Wi // Assert await DoWithRetries(10, async () => { - await AssertContent($"{functionAppSiteName}.azurewebsites.net", + await AssertContent($"{site.Name}.azurewebsites.net", rootPath: $"api/HttpExample?name={greeting}", actualText: $"Hello, {greeting}"); }, @@ -382,9 +367,9 @@ await AssertContent($"{functionAppSiteName}.azurewebsites.net", public async Task CanDeployZip_ToLinuxFunctionApp_WithRunFromPackageFlag() { // Arrange - var settings = await webMgmtClient.WebApps.ListApplicationSettingsAsync(resourceGroupName, functionAppSiteName); + var settings = await webMgmtClient.WebApps.ListApplicationSettingsAsync(resourceGroupName, site.Name); settings.Properties["WEBSITE_RUN_FROM_PACKAGE"] = "1"; - await webMgmtClient.WebApps.UpdateApplicationSettingsAsync(resourceGroupName, functionAppSiteName, settings); + await webMgmtClient.WebApps.UpdateApplicationSettingsAsync(resourceGroupName, site.Name, settings); var packageInfo = PrepareZipPackage(); @@ -398,7 +383,7 @@ await CommandTestBuilder.CreateAsync().Wi // Assert await DoWithRetries(10, async () => { - await AssertContent($"{functionAppSiteName}.azurewebsites.net", + await AssertContent($"{site.Name}.azurewebsites.net", rootPath: $"api/HttpExample?name={greeting}", actualText: $"Hello, {greeting}"); }, @@ -428,104 +413,9 @@ private static (string packagePath, string packageName, string packageVersion) P private void AddVariables(CommandTestBuilderContext context) { - context.Variables.Add(AccountVariables.ClientId, clientId); - context.Variables.Add(AccountVariables.Password, clientSecret); - context.Variables.Add(AccountVariables.TenantId, tenantId); - context.Variables.Add(AccountVariables.SubscriptionId, subscriptionId); - context.Variables.Add("Octopus.Action.Azure.ResourceGroupName", resourceGroupName); - context.Variables.Add("Octopus.Action.Azure.WebAppName", functionAppSiteName); + AddAzureVariables(context); context.Variables.Add(SpecialVariables.Action.Azure.DeploymentType, "ZipDeploy"); } } } - - public abstract class AppServiceIntegrationTest - { - protected string clientId; - protected string clientSecret; - protected string tenantId; - protected string subscriptionId; - protected string resourceGroupName; - protected string resourceGroupLocation; - protected string greeting = "Calamari"; - protected string authToken; - protected WebSiteManagementClient webMgmtClient; - protected Site site; - - private ResourceGroupsOperations resourceGroupClient; - private readonly HttpClient client = new HttpClient(); - - [OneTimeSetUp] - public async Task Setup() - { - var resourceManagementEndpointBaseUri = - Environment.GetEnvironmentVariable(AccountVariables.ResourceManagementEndPoint) ?? - DefaultVariables.ResourceManagementEndpoint; - var activeDirectoryEndpointBaseUri = - Environment.GetEnvironmentVariable(AccountVariables.ActiveDirectoryEndPoint) ?? - DefaultVariables.ActiveDirectoryEndpoint; - - resourceGroupName = Guid.NewGuid().ToString(); - - clientId = ExternalVariables.Get(ExternalVariable.AzureSubscriptionClientId); - clientSecret = ExternalVariables.Get(ExternalVariable.AzureSubscriptionPassword); - tenantId = ExternalVariables.Get(ExternalVariable.AzureSubscriptionTenantId); - subscriptionId = ExternalVariables.Get(ExternalVariable.AzureSubscriptionId); - resourceGroupLocation = Environment.GetEnvironmentVariable("AZURE_NEW_RESOURCE_REGION") ?? "eastus"; - - authToken = await Auth.GetAuthTokenAsync(activeDirectoryEndpointBaseUri, resourceManagementEndpointBaseUri, - tenantId, clientId, clientSecret); - - var resourcesClient = new ResourcesManagementClient(subscriptionId, - new ClientSecretCredential(tenantId, clientId, clientSecret)); - - resourceGroupClient = resourcesClient.ResourceGroups; - - var resourceGroup = new ResourceGroup(resourceGroupLocation); - resourceGroup = await resourceGroupClient.CreateOrUpdateAsync(resourceGroupName, resourceGroup); - - webMgmtClient = new WebSiteManagementClient(new TokenCredentials(authToken)) - { - SubscriptionId = subscriptionId, - HttpClient = { BaseAddress = new Uri(DefaultVariables.ResourceManagementEndpoint) }, - }; - - await ConfigureTestResources(resourceGroup); - } - - protected abstract Task ConfigureTestResources(ResourceGroup resourceGroup); - - [OneTimeTearDown] - public async Task Cleanup() - { - if (resourceGroupClient != null) - await resourceGroupClient.StartDeleteAsync(resourceGroupName); - } - - protected async Task AssertContent(string hostName, string actualText, string rootPath = null) - { - var result = await client.GetStringAsync($"https://{hostName}/{rootPath}"); - - result.Should().Contain(actualText); - } - - protected static async Task DoWithRetries(int retries, Func action, int secondsBetweenRetries) - { - foreach (var retry in Enumerable.Range(1, retries)) - { - try - { - await action(); - break; - } - catch - { - if (retry == retries) - throw; - - await Task.Delay(secondsBetweenRetries * 1000); - } - } - } - } } diff --git a/source/Calamari.Tests/AppServiceIntegrationTest.cs b/source/Calamari.Tests/AppServiceIntegrationTest.cs new file mode 100644 index 00000000..c0d93769 --- /dev/null +++ b/source/Calamari.Tests/AppServiceIntegrationTest.cs @@ -0,0 +1,117 @@ +using System; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using Azure.Identity; +using Azure.ResourceManager.Resources; +using Azure.ResourceManager.Resources.Models; +using Calamari.Azure; +using Calamari.Tests.Shared; +using FluentAssertions; +using Microsoft.Azure.Management.WebSites; +using Microsoft.Azure.Management.WebSites.Models; +using Microsoft.Rest; +using NUnit.Framework; + +namespace Calamari.AzureAppService.Tests +{ + public abstract class AppServiceIntegrationTest + { + protected string clientId; + protected string clientSecret; + protected string tenantId; + protected string subscriptionId; + protected string resourceGroupName; + protected string resourceGroupLocation; + protected string greeting = "Calamari"; + protected string authToken; + protected WebSiteManagementClient webMgmtClient; + protected Site site; + + private ResourceGroupsOperations resourceGroupClient; + private readonly HttpClient client = new HttpClient(); + + [OneTimeSetUp] + public async Task Setup() + { + var resourceManagementEndpointBaseUri = + Environment.GetEnvironmentVariable(AccountVariables.ResourceManagementEndPoint) ?? + DefaultVariables.ResourceManagementEndpoint; + var activeDirectoryEndpointBaseUri = + Environment.GetEnvironmentVariable(AccountVariables.ActiveDirectoryEndPoint) ?? + DefaultVariables.ActiveDirectoryEndpoint; + + resourceGroupName = Guid.NewGuid().ToString(); + + clientId = ExternalVariables.Get(ExternalVariable.AzureSubscriptionClientId); + clientSecret = ExternalVariables.Get(ExternalVariable.AzureSubscriptionPassword); + tenantId = ExternalVariables.Get(ExternalVariable.AzureSubscriptionTenantId); + subscriptionId = ExternalVariables.Get(ExternalVariable.AzureSubscriptionId); + resourceGroupLocation = Environment.GetEnvironmentVariable("AZURE_NEW_RESOURCE_REGION") ?? "eastus"; + + authToken = await Auth.GetAuthTokenAsync(activeDirectoryEndpointBaseUri, resourceManagementEndpointBaseUri, + tenantId, clientId, clientSecret); + + var resourcesClient = new ResourcesManagementClient(subscriptionId, + new ClientSecretCredential(tenantId, clientId, clientSecret)); + + resourceGroupClient = resourcesClient.ResourceGroups; + + var resourceGroup = new ResourceGroup(resourceGroupLocation); + resourceGroup = await resourceGroupClient.CreateOrUpdateAsync(resourceGroupName, resourceGroup); + + webMgmtClient = new WebSiteManagementClient(new TokenCredentials(authToken)) + { + SubscriptionId = subscriptionId, + HttpClient = { BaseAddress = new Uri(DefaultVariables.ResourceManagementEndpoint) }, + }; + + await ConfigureTestResources(resourceGroup); + } + + protected abstract Task ConfigureTestResources(ResourceGroup resourceGroup); + + [OneTimeTearDown] + public async Task Cleanup() + { + if (resourceGroupClient != null) + await resourceGroupClient.StartDeleteAsync(resourceGroupName); + } + + protected async Task AssertContent(string hostName, string actualText, string rootPath = null) + { + var result = await client.GetStringAsync($"https://{hostName}/{rootPath}"); + + result.Should().Contain(actualText); + } + + protected static async Task DoWithRetries(int retries, Func action, int secondsBetweenRetries) + { + foreach (var retry in Enumerable.Range(1, retries)) + { + try + { + await action(); + break; + } + catch + { + if (retry == retries) + throw; + + await Task.Delay(secondsBetweenRetries * 1000); + } + } + } + + protected void AddAzureVariables(CommandTestBuilderContext context) + { + context.Variables.Add(AccountVariables.ClientId, clientId); + context.Variables.Add(AccountVariables.Password, clientSecret); + context.Variables.Add(AccountVariables.TenantId, tenantId); + context.Variables.Add(AccountVariables.SubscriptionId, subscriptionId); + context.Variables.Add("Octopus.Action.Azure.ResourceGroupName", resourceGroupName); + context.Variables.Add("Octopus.Action.Azure.WebAppName", site.Name); + } + } +}