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