diff --git a/.scripts/clearDocker.sh b/.scripts/clearDocker.sh index 0a01032..15de9da 100644 --- a/.scripts/clearDocker.sh +++ b/.scripts/clearDocker.sh @@ -15,7 +15,13 @@ docker rm $(docker ps -aq --filter "name=functions") || true echo '####################################################' echo 'Removing images ...' echo '####################################################' -docker rmi $(docker images -q --filter "reference=*functions*") || true +docker rmi -f $(docker images -q --filter "reference=*functions*") || true + +# remove all networks +echo '####################################################' +echo 'Removing networks ...' +echo '####################################################' +docker network rm $(docker network ls -q --filter "name=FunctionsProxy") || true # remove all stray volumes if any #echo '####################################################' diff --git a/Functions/Data/Function.cs b/Functions/Data/Function.cs index f9b7ca7..7d6904f 100644 --- a/Functions/Data/Function.cs +++ b/Functions/Data/Function.cs @@ -21,7 +21,7 @@ public class Function [Required] public string ImageTag { get; set; } - public List EnvironmentVariables { get; set; } - + public List EnvironmentVariables { get; set; } = null!; + public List Instances { get; set; } = null!; } \ No newline at end of file diff --git a/Functions/Data/Instance.cs b/Functions/Data/Instance.cs index 62dce12..4aed7d1 100644 --- a/Functions/Data/Instance.cs +++ b/Functions/Data/Instance.cs @@ -22,5 +22,5 @@ public class Instance public string Name { get; set; } public int FunctionId { get; set; } - public Function Function { get; set; } + public Function Function { get; set; } = null!; } \ No newline at end of file diff --git a/Functions/Program.cs b/Functions/Program.cs index 0c0e44f..5998aba 100644 --- a/Functions/Program.cs +++ b/Functions/Program.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using System.Text; using Functions.Data.DB; using Functions.Services; @@ -8,6 +9,12 @@ var builder = WebApplication.CreateBuilder(args); //ASPNETCORE_AppConfig__TwilioSecret=my-secret builder.Configuration.AddEnvironmentVariables(); +builder.Configuration["AppConfig:FuctionNetworkName"] = Environment.GetEnvironmentVariable("FUNCTION_NETWORK") ?? "simplefunctions_functions"; +builder.Configuration["AppConfig:DB:Server"] = Environment.GetEnvironmentVariable("DB_SERVER") ?? "localhost"; +builder.Configuration["AppConfig:DB:Port"] = Environment.GetEnvironmentVariable("DB_PORT") ?? "3306"; +builder.Configuration["AppConfig:DB:User"] = Environment.GetEnvironmentVariable("DB_USER") ?? "root"; +builder.Configuration["AppConfig:DB:Password"] = Environment.GetEnvironmentVariable("DB_PASSWORD") ?? "password"; +builder.Configuration["AppConfig:DB:Database"] = Environment.GetEnvironmentVariable("DB_DATABASE") ?? "db"; builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); @@ -31,6 +38,7 @@ builder.Services.AddDbContextFactory( builder.Services.AddTransient(); +builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddHttpClient() .SetHandlerLifetime(TimeSpan.FromMinutes(5)); @@ -55,5 +63,4 @@ var dbFactory = app.Services.GetRequiredService _dbContextFactory; private readonly IExternalEndpointManager _externalEndpointManager; + private readonly IConfiguration _configuration; + private readonly INativeCommandWrapper _nativeCommandWrapper; - public FunctionManager(ILogger logger, IDockerManager dockerManager, IDbContextFactory dbContextFactory, IExternalEndpointManager externalEndpointManager) + public FunctionManager(ILogger logger, IDockerManager dockerManager, IDbContextFactory dbContextFactory, IExternalEndpointManager externalEndpointManager, IConfiguration configuration, INativeCommandWrapper nativeCommandWrapper) { _logger = logger; _dockerManager = dockerManager; _dbContextFactory = dbContextFactory; _externalEndpointManager = externalEndpointManager; + _configuration = configuration; + _nativeCommandWrapper = nativeCommandWrapper; } @@ -28,6 +32,7 @@ public class FunctionManager var db = await _dbContextFactory.CreateDbContextAsync(); await db.Functions.AddAsync(new Function(functionName, imageTag)); await db.SaveChangesAsync(); + await db.DisposeAsync(); } public async Task DeleteFunction(string functionName) { @@ -39,6 +44,7 @@ public class FunctionManager } db.Functions.Remove(function); await db.SaveChangesAsync(); + await db.DisposeAsync(); } public async Task RunInstance(string functionName, HttpMethod method, string body = "") @@ -51,8 +57,9 @@ public class FunctionManager function.Instances.Add(instance); db.Functions.Update(function); await db.SaveChangesAsync(); + await db.DisposeAsync(); - _dockerManager.ConnectNetwork("simplefunctions_functions", instance.InstanceId); + _dockerManager.ConnectNetwork(_configuration["AppConfig:FuctionNetworkName"] ?? throw new InvalidOperationException(), instance.InstanceId); _dockerManager.StartContainer(instance.InstanceId); //TODO: If not started delete instance diff --git a/Functions/Services/Interfaces/IDockerManager.cs b/Functions/Services/Interfaces/IDockerManager.cs index 4510229..917183b 100644 --- a/Functions/Services/Interfaces/IDockerManager.cs +++ b/Functions/Services/Interfaces/IDockerManager.cs @@ -11,5 +11,6 @@ public interface IDockerManager public void ConnectNetwork(string name, string containerId); public void StartContainer(string containerId); public void DeleteContainer(string containerId); + public void CreateNetwork(string name); public Task IsRunning(string containerId); } \ No newline at end of file diff --git a/Functions/Services/Interfaces/INativeCommandWrapper.cs b/Functions/Services/Interfaces/INativeCommandWrapper.cs new file mode 100644 index 0000000..edcd9a3 --- /dev/null +++ b/Functions/Services/Interfaces/INativeCommandWrapper.cs @@ -0,0 +1,6 @@ +namespace Functions.Services.Interfaces; + +public interface INativeCommandWrapper +{ + public Task GetContainerIdSelf(); +} \ No newline at end of file diff --git a/Functions/Services/NativeCommandWrapper.cs b/Functions/Services/NativeCommandWrapper.cs new file mode 100644 index 0000000..1f46af1 --- /dev/null +++ b/Functions/Services/NativeCommandWrapper.cs @@ -0,0 +1,28 @@ +using System.Diagnostics; +using Functions.Services.Interfaces; + +namespace Functions.Services; + +public class NativeCommandWrapper : INativeCommandWrapper +{ + private readonly ILogger _logger; + public NativeCommandWrapper(ILogger logger) + { + _logger = logger; + } + + public async Task GetContainerIdSelf() + { + Process proc = new(); + proc.StartInfo.FileName = "head"; + proc.StartInfo.Arguments = "-1 /proc/self/cgroup"; + proc.StartInfo.RedirectStandardOutput = true; + proc.Start(); + + ArgumentNullException.ThrowIfNull(proc); + string output = await proc.StandardOutput.ReadToEndAsync(); + _logger.LogDebug(output.Substring(24)); + await proc.WaitForExitAsync(); + return (output.Substring(24)); + } +} \ No newline at end of file diff --git a/Functions/appsettings.Development.json b/Functions/appsettings.Development.json index 092a492..827c065 100644 --- a/Functions/appsettings.Development.json +++ b/Functions/appsettings.Development.json @@ -13,6 +13,7 @@ "User": "root", "Password": "testPW", "Database": "Functions" - } + }, + "FuctionNetworkName": "FunctionsProxy" } } diff --git a/Functions/appsettings.Production.json b/Functions/appsettings.Production.json index 306882e..c290343 100644 --- a/Functions/appsettings.Production.json +++ b/Functions/appsettings.Production.json @@ -13,6 +13,7 @@ "User": "root", "Password": "testPW", "Database": "Functions" - } + }, + "FuctionNetworkName": "FunctionsProxy" } } diff --git a/SimpleFunctions.sln b/SimpleFunctions.sln index 326155e..4ea0e89 100644 --- a/SimpleFunctions.sln +++ b/SimpleFunctions.sln @@ -5,6 +5,8 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A7EF8833-F6BE-4EBD-8DB1-5AA8EDB5A16F}" ProjectSection(SolutionItems) = preProject docker-compose.yml = docker-compose.yml + .scripts\clearDocker.sh = .scripts\clearDocker.sh + .scripts\runDocker.sh = .scripts\runDocker.sh EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestFunction", "TestFunction\TestFunction.csproj", "{BC3C484C-EFD0-45E5-BE6E-9212916489E4}" diff --git a/docker-compose.yml b/docker-compose.yml index 6356bf1..0728a9e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,14 +7,15 @@ networks: functions: services: - functions: + functions: #Name can not be changed build: ./Functions environment: - ASPNETCORE_AppConfig__DB__Server: "db" - ASPNETCORE_AppConfig__DB__User: "root" - ASPNETCORE_AppConfig__DB__Password: "testPW" - ASPNETCORE_AppConfig__DB__Database: "Functions" + DB_SERVER: "db" + DB_USER: "root" + DB_PASSWORD: "testPW" + DB_DATABASE: "Functions" ASPNETCORE_ENVIRONMENT: "Production" + FUNCTION_NETWORK: "simplefunctions_functions" ports: - "8080:80" - "8081:443"