diff --git a/.idea/.idea.tye/.idea/.gitignore b/.idea/.idea.tye/.idea/.gitignore new file mode 100644 index 00000000..f7ad803b --- /dev/null +++ b/.idea/.idea.tye/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/contentModel.xml +/projectSettingsUpdater.xml +/modules.xml +/.idea.tye.iml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.tye/.idea/GitLink.xml b/.idea/.idea.tye/.idea/GitLink.xml new file mode 100644 index 00000000..009597cc --- /dev/null +++ b/.idea/.idea.tye/.idea/GitLink.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.tye/.idea/codestream.xml b/.idea/.idea.tye/.idea/codestream.xml new file mode 100644 index 00000000..83b27494 --- /dev/null +++ b/.idea/.idea.tye/.idea/codestream.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.tye/.idea/indexLayout.xml b/.idea/.idea.tye/.idea/indexLayout.xml new file mode 100644 index 00000000..7b08163c --- /dev/null +++ b/.idea/.idea.tye/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.tye/.idea/vcs.xml b/.idea/.idea.tye/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/.idea.tye/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Microsoft.Tye.Core/AzureFunctionServiceBuilder.cs b/src/Microsoft.Tye.Core/AzureFunctionServiceBuilder.cs index 5216ad84..21e964a5 100644 --- a/src/Microsoft.Tye.Core/AzureFunctionServiceBuilder.cs +++ b/src/Microsoft.Tye.Core/AzureFunctionServiceBuilder.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Microsoft.Tye { - public class AzureFunctionServiceBuilder : ServiceBuilder + public class AzureFunctionServiceBuilder : LaunchedServiceBuilder { public AzureFunctionServiceBuilder(string name, string path, ServiceSource source) : base(name, source) diff --git a/src/Microsoft.Tye.Extensions/Dapr/DaprExtension.cs b/src/Microsoft.Tye.Extensions/Dapr/DaprExtension.cs index 3e682fb7..16534d99 100644 --- a/src/Microsoft.Tye.Extensions/Dapr/DaprExtension.cs +++ b/src/Microsoft.Tye.Extensions/Dapr/DaprExtension.cs @@ -28,7 +28,8 @@ namespace Microsoft.Tye.Extensions.Dapr // For local run, enumerate all projects, and add services for each dapr proxy. var projects = context.Application.Services.OfType().Cast(); var executables = context.Application.Services.OfType().Cast(); - var services = projects.Concat(executables).ToList(); + var functions = context.Application.Services.OfType().Cast(); + var services = projects.Concat(executables).Concat(functions).ToList(); foreach (var project in services) { diff --git a/test/E2ETest/Microsoft.Tye.E2ETests.csproj b/test/E2ETest/Microsoft.Tye.E2ETests.csproj index d84fcf59..1c90e196 100644 --- a/test/E2ETest/Microsoft.Tye.E2ETests.csproj +++ b/test/E2ETest/Microsoft.Tye.E2ETests.csproj @@ -15,6 +15,7 @@ The Microsoft.Build.Locator package takes care of dynamically loading these assemblies at runtime. We don't need/want to ship them, just to have them as references. --> + @@ -29,6 +30,9 @@ + + + diff --git a/test/E2ETest/TyeGenerateTests.cs b/test/E2ETest/TyeGenerateTests.cs index d2fd6c9d..6e4758db 100644 --- a/test/E2ETest/TyeGenerateTests.cs +++ b/test/E2ETest/TyeGenerateTests.cs @@ -253,6 +253,10 @@ namespace E2ETest } } + + + + [ConditionalFact] [SkipIfDockerNotRunning] public async Task Generate_ConnectionStringDependency() diff --git a/test/E2ETest/TyeRunTests.cs b/test/E2ETest/TyeRunTests.cs index 09c09434..642d6c31 100644 --- a/test/E2ETest/TyeRunTests.cs +++ b/test/E2ETest/TyeRunTests.cs @@ -82,12 +82,13 @@ namespace E2ETest }); } - [Fact(Skip = "Need to figure out how to install func before running")] + //[Fact(Skip = "Need to figure out how to install func before running")] + [Fact] public async Task FrontendBackendAzureFunctionTest() { // Install to directory using var tmp = TempDirectory.Create(); - await ProcessUtil.RunAsync("npm", "install azure-functions-core-tools@3`", workingDirectory: tmp.DirectoryPath); + //await ProcessUtil.RunAsync("npm", "install azure-functions-core-tools@3`", workingDirectory: tmp.DirectoryPath); using var projectDirectory = CopyTestProjectDirectory("azure-functions"); var content = @$" @@ -97,7 +98,6 @@ name: frontend-backend services: - name: backend azureFunction: backend/ - pathToFunc: {tmp.DirectoryPath}/node_modules/azure-functions-core-tools/bin/func.dll - name: frontend project: frontend/frontend.csproj"; @@ -126,6 +126,33 @@ services: Assert.True(frontendResponse.IsSuccessStatusCode); }); } + [Fact] + public async Task DaprAzureFunctionTest() + { + using var projectDirectory = CopyTestProjectDirectory("dapr-function-app"); + + var projectFile = new FileInfo(Path.Combine(projectDirectory.DirectoryPath, "tye.yaml")); + var outputContext = new OutputContext(_sink, Verbosity.Debug); + var application = await ApplicationFactory.CreateAsync(outputContext, projectFile); + + await application.ProcessExtensionsAsync(new HostOptions(), outputContext, ExtensionContext.OperationKind.LocalRun); + var handler = new HttpClientHandler + { + ServerCertificateCustomValidationCallback = (a, b, c, d) => true, + AllowAutoRedirect = false + }; + + var client = new HttpClient(new RetryHandler(handler)); + + await RunHostingApplication(application, new HostOptions(), async (app, uri) => + { + var backendUri = await GetServiceUrl(client, uri, "dapr-test-project"); + + var backendResponse = await client.GetAsync(backendUri); + + Assert.True(backendResponse.IsSuccessStatusCode); + }); + } [ConditionalTheory] [SkipIfDockerNotRunning] diff --git a/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/.gitignore b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/.gitignore new file mode 100644 index 00000000..1d782647 --- /dev/null +++ b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/contentModel.xml +/.idea.frontend-backend.iml +/projectSettingsUpdater.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/.name b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/.name new file mode 100644 index 00000000..059e0f12 --- /dev/null +++ b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/.name @@ -0,0 +1 @@ +frontend-backend \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/GitLink.xml b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/GitLink.xml new file mode 100644 index 00000000..009597cc --- /dev/null +++ b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/GitLink.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/codestream.xml b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/codestream.xml new file mode 100644 index 00000000..90f56a85 --- /dev/null +++ b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/codestream.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/encodings.xml b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/encodings.xml new file mode 100644 index 00000000..df87cf95 --- /dev/null +++ b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/indexLayout.xml b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/indexLayout.xml new file mode 100644 index 00000000..7b08163c --- /dev/null +++ b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/vcs.xml b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/vcs.xml new file mode 100644 index 00000000..bc599707 --- /dev/null +++ b/test/E2ETest/testassets/projects/azure-functions/.idea/.idea.frontend-backend/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/azure-functions/backend/backend.csproj b/test/E2ETest/testassets/projects/azure-functions/backend/backend.csproj index 8516359a..09dcb8b4 100644 --- a/test/E2ETest/testassets/projects/azure-functions/backend/backend.csproj +++ b/test/E2ETest/testassets/projects/azure-functions/backend/backend.csproj @@ -1,10 +1,10 @@ - net6.0 - v3 + net7.0 + v4 - + diff --git a/test/E2ETest/testassets/projects/dapr-function-app/dapr-function-app.sln b/test/E2ETest/testassets/projects/dapr-function-app/dapr-function-app.sln new file mode 100644 index 00000000..5957fe31 --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/dapr-function-app.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 25.0.1706.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dapr-function-app", "function/dapr-function-app.csproj", "{0979B3EB-D56F-4402-A858-AB19B6D9B902}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0979B3EB-D56F-4402-A858-AB19B6D9B902}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0979B3EB-D56F-4402-A858-AB19B6D9B902}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0979B3EB-D56F-4402-A858-AB19B6D9B902}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0979B3EB-D56F-4402-A858-AB19B6D9B902}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B9930E6C-6675-4B5A-8D01-5BEEABAF024D} + EndGlobalSection +EndGlobal diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/HttpTrigger.cs b/test/E2ETest/testassets/projects/dapr-function-app/function/HttpTrigger.cs new file mode 100644 index 00000000..b7f536e6 --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/HttpTrigger.cs @@ -0,0 +1,32 @@ +using System.Net; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Http; +using Microsoft.Extensions.Logging; + +namespace dapr_function_app +{ + public class HttpTrigger1 + { + private readonly ILogger _logger; + + public HttpTrigger1(ILoggerFactory loggerFactory) + { + _logger = loggerFactory.CreateLogger(); + } + + [Function("HttpTrigger1")] + public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) + { + _logger.LogInformation("C# HTTP trigger function processed a request."); + + var response = req.CreateResponse(HttpStatusCode.OK); + response.Headers.Add("Content-Type", "text/plain; charset=utf-8"); + + response.WriteString("Welcome to Azure Functions!"); + + return response; + } + + + } +} diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/Program.cs b/test/E2ETest/testassets/projects/dapr-function-app/function/Program.cs new file mode 100644 index 00000000..1c6cb8e0 --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/Program.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +internal class Program +{ + private static void Main(string[] args) + { + var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults(config => + { + config.Services.AddLogging(); + }) + .Build(); + + + host.Run(); + } +} \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/Properties/launchSettings.json b/test/E2ETest/testassets/projects/dapr-function-app/function/Properties/launchSettings.json new file mode 100644 index 00000000..58c01218 --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:64181", + "sslPort": 44315 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "dapr": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/appsettings.Development.json b/test/E2ETest/testassets/projects/dapr-function-app/function/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/appsettings.json b/test/E2ETest/testassets/projects/dapr-function-app/function/appsettings.json new file mode 100644 index 00000000..d9d9a9bf --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/dapr-function-app.csproj b/test/E2ETest/testassets/projects/dapr-function-app/function/dapr-function-app.csproj new file mode 100644 index 00000000..9d671e6c --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/dapr-function-app.csproj @@ -0,0 +1,23 @@ + + + net7.0 + v4 + Exe + enable + + + + + + + + + PreserveNewest + + + PreserveNewest + Never + + + + \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/host.json b/test/E2ETest/testassets/projects/dapr-function-app/function/host.json new file mode 100644 index 00000000..5df170b6 --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/host.json @@ -0,0 +1,12 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + }, + "enableLiveMetricsFilters": true + } + } +} \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/dapr-function-app/function/local.settings.json b/test/E2ETest/testassets/projects/dapr-function-app/function/local.settings.json new file mode 100644 index 00000000..f5bff415 --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/function/local.settings.json @@ -0,0 +1,6 @@ +{ + "IsEncrypted": false, + "Values": { + "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" + } +} \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/dapr-function-app/tye.yaml b/test/E2ETest/testassets/projects/dapr-function-app/tye.yaml new file mode 100644 index 00000000..1ccba26c --- /dev/null +++ b/test/E2ETest/testassets/projects/dapr-function-app/tye.yaml @@ -0,0 +1,8 @@ +name: dapr_test_application +extensions: +- name: dapr + config: tracing + log-level: debug +services: +- name: dapr-test-project + azureFunction: function/ \ No newline at end of file diff --git a/test/E2ETest/testassets/projects/dotnet-env-vars/tye.yaml b/test/E2ETest/testassets/projects/dotnet-env-vars/tye.yaml index 63b95390..3bcba44d 100644 --- a/test/E2ETest/testassets/projects/dotnet-env-vars/tye.yaml +++ b/test/E2ETest/testassets/projects/dotnet-env-vars/tye.yaml @@ -1,6 +1,10 @@ # tye application configuration file # read all about it at https://github.com/dotnet/tye name: dotnet-env-vars +extensions: + - name: dapr + config: tracing + log-level: debug dashboardPort: 8005 services: - name: test-project