Giter Site home page Giter Site logo

vmware-archive / runtimes Goto Github PK

View Code? Open in Web Editor NEW
81.0 12.0 89.0 928 KB

Kubeless function runtimes: https://kubeless.io/docs/runtimes/

License: Apache License 2.0

Dockerfile 1.02% Makefile 21.29% Shell 4.61% Ballerina 2.83% C# 21.58% Go 0.39% Java 14.42% JavaScript 9.28% Roff 5.28% PHP 2.58% Python 4.67% Ruby 1.76% Scala 0.20% Jsonnet 8.79% Smarty 1.31%

runtimes's Introduction

WARNING: Kubeless is no longer actively maintained by VMware.

VMware has made the difficult decision to stop driving this project and therefore we will no longer actively respond to issues or pull requests. If you would like to take over maintaining this project independently from VMware, please let us know so we can add a link to your forked project here.

Thank You.

Kubeless Runtimes

Use this repository to submit official Runtimes for Kubeless. Runtimes are the different languages that can be used to run Kubeless functions. For more information about installing and using Kubeless, see its documentation. To get a quick introduction to the available runtimes see this document.

Where to find us

For general Kubeless or runtime discussions join the Kubeless (#kubeless) channel in the Kubernetes Slack.

For issues and support you can use this repository or the one for the Kubeless core.

How do I install these runtimes?

These runtimes are available by default when installing Kubeless. This repository may contain unreleased changes. To check exact versions of the runtimes included check the manifest in the Kubeless release page.

Runtimes Format

Take a look at the Python and the Golang runtimes for reference when you're writing your first runtime.

Before contributing a runtime, become familiar with the format. Note that the project is still under active development and the format may still evolve a bit.

You can find documentation about how to create a new runtime here.

Repository Structure

This GitHub repository contains the source for the runtimes included by default in the Kubeless installation.

The purpose of this repository is to provide a place for maintaining and contributing official runtimes, with CI processes in place for managing the releasing of runtimes into Kubeless.

The runtimes in this repository are organized into two folders:

  • stable
  • incubator

Stable runtimes meet the criteria in the technical requirements.

Incubator runtimes are those that do not meet these criteria. Having the incubator folder allows runtimes to be shared and improved on until they are ready to be moved into the stable folder.

In order to get a runtime from incubator to stable, runtime maintainers should open a pull request that moves the runtime folder.

Contributing a Runtime

We'd love for you to contribute a runtime that provides a useful language to Kubeless. Please read our Contribution Guide for more information on how you can contribute.

Owning and Maintaining A Runtime

Individual runtimes can be maintained by one or more members of the Kubernetes community. When someone maintains a stable runtime they have the access to merge changes to that runtime. To have merge access to a runtime someone needs to be listed on the runtime, in the OWNERS file, as a maintainer.

Status of the Project

This project is still under active development, so you might run into issues. If you do, please don't be shy about letting us know, or better yet, contribute a fix or feature.

runtimes's People

Contributors

allantargino avatar andresmgot avatar anguslees avatar anuruddhal avatar blijblijblij avatar caraboides avatar drmegavolt avatar grahamscott avatar henrike42 avatar iamdeit avatar jbianquetti-nami avatar jjo avatar lorenzo-ange avatar murali-reddy avatar ngtuna avatar paolomainardi avatar phsiao avatar ppbaena avatar rosskukulinski avatar sayanh avatar sebgoa avatar sepetrov avatar shashankft9 avatar smokesea avatar sshanks-kx avatar thspinto avatar timelytoga avatar tkeech1 avatar varunbpatil avatar viktorradnai avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

runtimes's Issues

Python Runtime: Error: 413 Request Entity Too Large

Hi I encountered this issue recently and noticed that there was a fix for this issue in the nodejs runtime but it appears the python runtime is still limited to the 100kb default set by the bottle module. Looking at the Kubeless.py it doesn't appear to have an equivalent environment variable to set the limit like the nodejs runtime. It looks like this stack overflow article outlines how to increase the limit.

https://stackoverflow.com/questions/16865997/python-bottle-module-causes-error-413-request-entity-too-large

If the python runtime had support to increase the size limit it would be great other wise I will have to look at another option other than Kubeless cause we will be sending larger then 100kb message.

Note: I am not a python guy I just need to "serve" python services.

C# / .NET features

I just came across this project. Looks so awesome!

A few questions:

  1. Does it support dependency injection (ILogger, repositories, etc) and if so how does it register those dependencies?
  2. Does it support a static class/method (thinking about functions for F#)?

Thanks in advance =)

.gitignore

Hi all,

Shouldn't we add a .gitignore file to avoid runtime specific artifacts to be check in?
eg: Java .classes, .NET .dll and so on.

Python cherrypy server - number of threads too low?

Hi,

I noticed that the python runtime can only handle 10 requests in parallel which is the default number of threads in the cherrypy server thread pool.

class CherryPyWSGIServer(HTTPServer):

    """A subclass of HTTPServer which calls a WSGI application."""

    wsgi_version = (1, 0)
    """The version of WSGI to produce."""

    def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None,
                 max=-1, request_queue_size=5, timeout=10, shutdown_timeout=5,
                 accepted_queue_size=-1, accepted_queue_timeout=10):
        self.requests = ThreadPool(self, min=numthreads or 1, max=max,
            accepted_queue_size=accepted_queue_size,
            accepted_queue_timeout=accepted_queue_timeout)

I thought cherrypy does auto-scaling of the thread pool, but apparently it doesn't (stackoverflow).

My proposal is to make it configurable via an environment variable.

Golang dependencies not working

Hello,
The golang dependencies not working for me. I run the command below :

kubeless function deploy create-account --runtime go1.12 --handler handler.CreateAccount --from-file ./createaccount.go --dependencies Gopkg.toml 

the result error is :

failed to list versions for http://github.com/go-bongo/bongo: fatal: unable to access 'http://github.com/go-bongo/bongo/': Could not resolve host: github.com
: exit status 128

Can you please suggest if i am missing anything ?

Query SQL Server database from dotnetcore function error

I have kubeless v1.0.6 installed and I'm trying to do simple query to sql server database from kubeless function using dotnetcore2.1/dotnetcore2.2 runtime, but the pod always crash with the following logs:

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembly 'System.Diagnostics.DiagnosticSource, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
   at System.Runtime.Loader.AssemblyLoadContext.LoadFromPath(IntPtr ptrNativeAssemblyLoadContext, String ilPath, String niPath, ObjectHandleOnStack retAssembly)
   at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath(String assemblyPath)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)
   at Kubeless.Core.Invokers.CompiledFunctionInvoker.LoadDependentAssemblies(String referencesPath) in /app/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 91
   at Kubeless.WebAPI.Startup.ConfigureServices(IServiceCollection services) in /app/Kubeless.WebAPI/Startup.cs:line 31
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Initialize()
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at Kubeless.WebAPI.Program.Main(String[] args) in /app/Kubeless.WebAPI/Program.cs:line 18

I have added System.Data.SqlClient in the .csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Kubeless.Functions" Version="0.1.1" />
    <PackageReference Include="System.Data.SqlClient" Version="4.8.1"/>
  </ItemGroup>
</Project>

And this is the function definition:

using System;
using Kubeless.Functions;
using System.Data.SqlClient;

public class module
{
    public string handler(Event k8Event, Context k8Context)
    {
        string value = "";
        string sql = "select SOME_COLUMN from SOME_TABLE where ID = 1";
        using (SqlConnection conn = new SqlConnection("some connection string"))
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
                conn.Open();
                value = cmd.ExecuteScalar().ToString();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        return value;
    }
}

Python runtime deadlock due to logging + multithreading + fork

Requests are being logged to sys.stdout using wsgi-request-logger.
The logging module (used by wsgi-request-logger) acquires a lock while writing to sys.stdout.
https://github.com/kubeless/runtimes/blob/b5fea6b3422166f13740089812a926497b6a5631/stable/python/kubeless.py#L105-L109


The default start method for a Process (using multiprocessing) in Unix is fork.

If a new Process is forked at exactly the same time as the sys.stdout lock being held in one of the threads of the main process, the lock state is replicated in the subprocess resulting in a deadlock when the subprocess tries to flush stdout (in _flush_std_streams) because the lock is already being held in the subprocess and there is nobody to release it.

  File "/opt/miniconda3/lib/python3.7/multiprocessing/util.py", line 400 in _flush_std_streams
  File "/opt/miniconda3/lib/python3.7/multiprocessing/process.py", line 317 in _bootstrap
  File "/opt/miniconda3/lib/python3.7/multiprocessing/popen_fork.py", line 74 in _launch
  File "/opt/miniconda3/lib/python3.7/multiprocessing/popen_fork.py", line 20 in __init__
  File "/opt/miniconda3/lib/python3.7/multiprocessing/context.py", line 277 in _Popen
  File "/opt/miniconda3/lib/python3.7/multiprocessing/context.py", line 223 in _Popen
  File "/opt/miniconda3/lib/python3.7/multiprocessing/process.py", line 112 in start

This happens even without a single print statement in the function's handler.


More information about this issue can be found at the following links:

Error "Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<object>"

As the title said, I got error "Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<object>'" when trying a simple function using dotnetcore 3.1 runtime. Here is the function log:


info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://testkedatabase/  
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Execute (Kubeless.WebAPI)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "Execute", controller = "Runtime"}. Executing controller action with signature System.Threading.Tasks.Task`1[System.Object] Execute() on controller Kubeless.WebAPI.Controllers.RuntimeController (Kubeless.WebAPI).
info: Kubeless.WebAPI.Controllers.RuntimeController[0]
      04/23/2020 03:39:37: Function Started. HTTP Method: GET, Path: /.
crit: Kubeless.WebAPI.Controllers.RuntimeController[0]
      04/23/2020 03:39:37: Function Corrupted. HTTP Response: 500. Reason: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<object>'.
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<object>'
   at CallSite.Target(Closure , CallSite , Object )
   at Kubeless.Core.Invokers.CompiledFunctionInvoker.Execute(Event kubelessEvent, Context kubelessContext) in /app/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 49
   at Kubeless.WebAPI.Controllers.RuntimeController.Execute() in /app/Kubeless.WebAPI/Controllers/RuntimeController.cs:line 43
info: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
      Executing ObjectResult, writing value of type 'Microsoft.AspNetCore.Mvc.ProblemDetails'.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action Kubeless.WebAPI.Controllers.RuntimeController.Execute (Kubeless.WebAPI) in 7.493ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Execute (Kubeless.WebAPI)'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 10.4912ms 500 application/problem+json; charset=utf-8

function:

using System;
using Kubeless.Functions;

public class module
{
    public string handler(Event k8Event, Context k8Context)
    {
        string plantID = "XXX";
        return plantID;
    }
}

csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Kubeless.Functions" Version="0.1.1" />
  </ItemGroup>
</Project>

Update vertx

There are some CVEs affecting Vertx and its dependency vertx-web. We should update it to a version >=3.5.4. cc/ @oscarDovao

C#: Namespaced support for functions

This issue has been reported before and apparently resolved, however, I'm curious if I'm perhaps I'm implementing this incorrectly or running an old version.

For my test I'm using the example file namespaced-helloget and using the deployment command

kubeless function deploy helloget2 --runtime dotnetcore3.1 --from-file Functions/namespaced-helloget.cs --handler module.handler

I wait for the function to be loaded:

helloget2       default         module.handler          dotnetcore3.1                                   1/1 READY

Then attempt to call the function:

kubeless function call helloget2

This results in the error:

$ kubeless function call helloget2
ERRO[0000]                                              
FATA[0000] an error on the server ("") has prevented the request from succeeding (get services helloget2:http-function-port)

The logs show:

$ kubectl logs helloget2-5b9dd69dbf-scrxh
cp: cannot create regular file '/app/Kubeless.Functions.dll': Permission denied
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:8080
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://127.0.0.1:44929/  
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Execute (Kubeless.WebAPI)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "Execute", controller = "Runtime"}. Executing controller action with signature System.Threading.Tasks.Task`1[System.Object] Execute() on controller Kubeless.WebAPI.Controllers.RuntimeController (Kubeless.WebAPI).
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action Kubeless.WebAPI.Controllers.RuntimeController.Execute (Kubeless.WebAPI) in 2.2701ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Execute (Kubeless.WebAPI)'
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HM1QSHPHL081", Request id "0HM1QSHPHL081:00000001": An unhandled exception was thrown by the application.
System.ArgumentNullException: Value cannot be null. (Parameter 'type')
   at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type)
   at Kubeless.Core.Invokers.CompiledFunctionInvoker..ctor(IFunction function, Int32 functionTimeout) in /app/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 29
   at Kubeless.WebAPI.Startup.<>c__DisplayClass4_0.<ConfigureServices>b__0(IServiceProvider _) in /app/Kubeless.WebAPI/Startup.cs:line 30
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 58.0324ms 500 
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://10.244.0.14:8080/healthz  
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "Health", controller = "Runtime"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult Health() on controller Kubeless.WebAPI.Controllers.RuntimeController (Kubeless.WebAPI).
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI) in 2.9038ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI)'
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HM1QSHPHL082", Request id "0HM1QSHPHL082:00000001": An unhandled exception was thrown by the application.
System.ArgumentNullException: Value cannot be null. (Parameter 'type')
   at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type)
   at Kubeless.Core.Invokers.CompiledFunctionInvoker..ctor(IFunction function, Int32 functionTimeout) in /app/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 29
   at Kubeless.WebAPI.Startup.<>c__DisplayClass4_0.<ConfigureServices>b__0(IServiceProvider _) in /app/Kubeless.WebAPI/Startup.cs:line 30
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 18.5316ms 500 
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://10.244.0.14:8080/healthz  
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "Health", controller = "Runtime"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult Health() on controller Kubeless.WebAPI.Controllers.RuntimeController (Kubeless.WebAPI).
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI) in 2.0856ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI)'
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HM1QSHPHL083", Request id "0HM1QSHPHL083:00000001": An unhandled exception was thrown by the application.
System.ArgumentNullException: Value cannot be null. (Parameter 'type')
   at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type)
   at Kubeless.Core.Invokers.CompiledFunctionInvoker..ctor(IFunction function, Int32 functionTimeout) in /app/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 29
   at Kubeless.WebAPI.Startup.<>c__DisplayClass4_0.<ConfigureServices>b__0(IServiceProvider _) in /app/Kubeless.WebAPI/Startup.cs:line 30
   at ResolveService(ILEmitResolverBuilderRuntimeContext , ServiceProviderEngineScope )
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 9.5518ms 500 

If this is an error on my part, please could you point to the correct usage pattern?

--- edit
I should mention that this works fine without the namespaced version.

Restriction of .NET functions to a single namespace prevents usage of some C# features

The restriction that a function's assembly can only have a single namespace prevents the usage of some C# features that embeds attributes in the resulting assembly:

  • readonly structs
    (I will update this list as more features that embed code into the resulting assembly are found.)

My proposed solution is to ignore types that have attributes named EmbeddedAttribute and/or CompilerGeneratedAttribute in the namespace counting code:

https://github.com/kubeless/runtimes/blob/31b42a99b0827170ce36833a4dcce95e09bfdda3/stable/dotnetcore/src/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs#L32-L37

Developer guide link to interface appears to be broken

In the DEVELOPER_GUIDE.md, there is a section of text that appears to have a broken link

This bit of text ...

"Functions should receive two parameters: event and context and should return the value that will be used as HTTP response. See the functions standard signature for more information. The information that will be available in event parameter will be received as HTTP headers."

has a link to https://github.com/kubeless/runtimes/blob/master/docs/runtimes#runtimes-interface which doesn't appear to resolve for me

Golang runtime doesn't support fully go.mod

Hello,

I notice that Kubless doesn't support replace sections in the go.mod file.

For example, even if I create the following go.mod file:

module gitbranch

go 1.14

require (
	github.com/go-git/go-git/v5 v5.1.0
	github.com/kubeless/kubeless v1.0.7
	github.com/logrusorgru/aurora/v3 v3.0.0
)

replace github.com/logrusorgru/aurora/v3 v3.0.0 => ../localtest                                            

from the above example, you can notice that in replace section, I overwrite the packages aurora with my local test branch,
in this scenario, the compilation should fail, but as you see form below output, it's working successfully using the github repo.

Kubeless output:

gitbranch-get   kbox            gitbranch.Get           go1.14  module gitbranch                                        1/1 READY    
                                                                                                                                     
                                                                go 1.14                                                              
                                                                                                                                     
                                                                require (                                                            
                                                                        github.com/go-git/go-git/v5 v5.1.0                                   
                                                                        github.com/kubeless/kubeless v1.0.7                                  
                                                                        github.com/logrusorgru/aurora/v3 v3.0.0                              
                                                                )                                                                    
                                                                                                                                     
                                                                replace gitlab.com/project_falcon/kubeless/payload                   
                                                                v0.2.4 => ../payload     

For me, it's a BIG problem, because currently, I am working on an application that will communicate with Kubernetes API.
Unfortunately, Kubernetes GO LIBs have broken dependency and you have to use the replace section.

example of Kubernetes:

module buildimage

go 1.14

require (
	github.com/kubeless/kubeless v1.0.7
	github.com/logrusorgru/aurora/v3 v3.0.0
	gitlab.com/project_falcon/kubeless/payload v0.2.4
	gitlab.com/project_falcon/kubeless/poddefinition/kaniko v0.1.0
	k8s.io/api v0.0.0
	k8s.io/apiextensions-apiserver v0.0.0
	k8s.io/apiserver v0.0.0
	k8s.io/cli-runtime v0.0.0
	k8s.io/client-go v7.0.0+incompatible
	k8s.io/cloud-provider v0.0.0
	k8s.io/cluster-bootstrap v0.0.0
	k8s.io/code-generator v0.0.0
	k8s.io/component-base v0.0.0
	k8s.io/cri-api v0.0.0
	k8s.io/csi-translation-lib v0.0.0
	k8s.io/kube-aggregator v0.0.0
	k8s.io/kube-controller-manager v0.0.0
	k8s.io/kube-proxy v0.0.0
	k8s.io/kube-scheduler v0.0.0
	k8s.io/kubectl v0.0.0
	k8s.io/kubelet v0.0.0
	k8s.io/kubernetes v0.0.0
	k8s.io/legacy-cloud-providers v0.0.0
	k8s.io/metrics v0.0.0
	k8s.io/sample-apiserver v0.0.0
)

replace (
	k8s.io/api => k8s.io/api v0.16.12
	k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.16.12
	k8s.io/apimachinery => k8s.io/apimachinery v0.16.12
	k8s.io/apiserver => k8s.io/apiserver v0.16.12
	k8s.io/cli-runtime => k8s.io/cli-runtime v0.16.12
	k8s.io/client-go => k8s.io/client-go v0.16.12
	k8s.io/cloud-provider => k8s.io/cloud-provider v0.16.12
	k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.16.12
	k8s.io/code-generator => k8s.io/code-generator v0.16.12
	k8s.io/component-base => k8s.io/component-base v0.16.12
	k8s.io/cri-api => k8s.io/cri-api v0.16.12
	k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.16.12
	k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.16.12
	k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.16.12
	k8s.io/kube-proxy => k8s.io/kube-proxy v0.16.12
	k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.16.12
	k8s.io/kubectl => k8s.io/kubectl v0.16.12
	k8s.io/kubelet => k8s.io/kubelet v0.16.12
	k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.16.12
	k8s.io/metrics => k8s.io/metrics v0.16.12
	k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.16.12
)

My application working fine with that go.mod file, when I run it from a local machine, but Kubeless cannot download dependencies, because it seems that it doesn't read the replace section at all.

Kubeless error

kubectl logs -n kbox --follow buildimage-79f575949d-bqphk -c compile
go: finding github.com/kubeless/kubeless 2644ad5
go: downloading github.com/kubeless/kubeless v1.0.7-0.20200406085802-2644ad500db0
go: extracting github.com/kubeless/kubeless v1.0.7-0.20200406085802-2644ad500db0
go: downloading golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3
go: downloading github.com/prometheus/client_golang v0.9.1
go: extracting github.com/prometheus/client_golang v0.9.1
go: downloading github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
go: downloading github.com/prometheus/common v0.2.0
go: downloading github.com/prometheus/procfs v0.0.0-20190129233650-316cf8ccfec5
go: downloading github.com/golang/protobuf v1.2.0
go: downloading github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973
go: extracting github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973
go: extracting github.com/prometheus/procfs v0.0.0-20190129233650-316cf8ccfec5
go: extracting github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
go: extracting github.com/golang/protobuf v1.2.0
go: extracting golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3
go: extracting github.com/prometheus/common v0.2.0
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: extracting github.com/matttproud/golang_protobuf_extensions v1.0.1
go: [email protected] requires
        k8s.io/[email protected]: reading k8s.io/api/go.mod at revision v0.0.0: unknown revision v0.0.0


I will be glad if you can point my mistakes and I can move forward with my project, currently, I'm stuck on Kubeless compilation

How to require/read files from NodeJS function

Hello!

I have a folder full of html files that are static sites. My nodejs script loads them and runs checks on them for the existence of specific html tags. I use url+zip packaging and my script and the directory in question are on the same file level.
I tried to read the files using

let websites = fs.readdirSync("./static-websites-dir")

but I get an error:

Function failed to execute: fs.js:904
  return binding.readdir(pathModule._makeLong(path), options.encoding);
                 ^

Error: ENOENT: no such file or directory, scandir './static-websites-dir'
    at Object.fs.readdirSync (fs.js:904:18)
    at Object.<anonymous> (/kubeless/scan-websites.js:56:19)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at modRequire (/kubeless_rt/kubeless.js:62:16)
::ffff:10.200.125.192 - - [15/Sep/2020:07:42:51 +0000] "POST / HTTP/1.1" 500 21 "-" "okhttp/3.12.6"

When I ran for debugging:

const files = fs.readdirSync('./');
console.log(JSON.stringify(files));

I did not see my folder anywhere...
Is there a way to deal with that without creating custom images?

python: No matching distribution found for requirements.txt

Hey there,

the dependency kafka-python is not installed.

error: from install container

/kubeless/requirements.txt: OK
WARNING: The directory '/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
WARNING: The directory '/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check
the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
ERROR: Could not find a version that satisfies the requirement requirements.txt (from -r /kubeless/requirements.txt (line 1)) (from versions: none)
ERROR: No matching distribution found for requirements.txt (from -r /kubeless/requirements.txt (line 1))

requirements.txt

kafka-python

function.yaml

apiVersion: kubeless.io/v1beta1
kind: Function
metadata:
  name: python-demo
  namespace: kubeless
  labels:
    created-by: kubeless
    function: python-demo
spec:
  runtime: python3.7
  timeout: "180"
  handler: function.app
  deps: "requirements.txt"
  checksum: sha256:FUNCTION-CHECKSUM
  function: "FUNCTION-URL"
  function-content-type: url+zip

any ideas how to debug this ?

Class name in C# must be module

I've been testing with the Dot Net Core runtime and I've noticed that if the class name is set to anything other than "module" it doesn't seem to execute the function and exits with an error "Unhandled Exception: System.InvalidOperationException: Your module (Program) was not found in this assembly.". I had passed the class name when calling the kubeless command

kubeless function deploy hello --from-file .\Program.cs --handler Program.Run --dependencies .\HelloKubeless.csproj --runtime dotnetcore2.1

Program.cs

using System;
using Kubeless.Functions;

namespace HelloKubeless
{
    public class Program
    {
        public string Run(Event evt, Context context)
        {
            return "Hello World";
        }
    }
}

PHP 8.0 and 8.1-dev support

Hello,

PHP 8.0 has been out there since some time now and PHP 8.1 is coming in a few months. Is ti planned to add support to those runtimes?

Additional question: All PHP images are based on Debian, is there any limitation about using another distro? (Alpine)

Thanks

Support for Go Modules

Hi, how is it going? I wanna know if there is someone working on implementation to support Golang modules, I consider it very important due to dep is almost deprecated and also I need it to my work :P

Missing PATH on kubeless.js runtime

Is this a BUG REPORT or FEATURE REQUEST?:
BUG REPORT

What happened:
When I send request with path ping using kubeless.js middleware it send / instead of the path

What you expected to happen:
to send the path requested

How to reproduce it (as minimally and precisely as possible):
curl --header "Host: kubernetes.docker.internal.nip.io" localhost/ping
and logs says

  'event-type': undefined,
  'event-id': undefined,
  'event-time': undefined,
  'event-namespace': undefined,
  data: {},
  extensions: {
    request: IncomingMessage {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 1,
      _maxListeners: undefined,
      socket: [Socket],
      connection: [Socket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: false,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '/',
      method: 'GET',
      statusCode: null,
      statusMessage: null,
      client: [Socket],
      _consuming: false,
      _dumped: false,
      next: [Function: next],
      baseUrl: '',
      originalUrl: '/',
      _parsedUrl: [Url],
      params: [Object],
      query: {},
      res: [ServerResponse],
      _startAt: [Array],
      _startTime: 2020-03-04T15:48:55.191Z,
      _remoteAddress: '::ffff:10.1.0.162',
      body: {},
      route: [Route]
    },
    response: ServerResponse {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      _last: false,
      chunkedEncoding: false,
      shouldKeepAlive: true,
      useChunkedEncodingByDefault: true,
      sendDate: true,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: null,
      _hasBody: true,
      _trailer: '',
      finished: false,
      _headerSent: false,
      socket: [Socket],
      connection: [Socket],
      _header: null,
      _onPendingData: [Function: bound updateOutgoingData],
      _sent100: false,
      _expect_continue: false,
      req: [IncomingMessage],
      locals: [Object: null prototype] {},
      _startAt: undefined,
      _startTime: undefined,
      writeHead: [Function: writeHead],
      __onFinished: [Function],
      [Symbol(isCorked)]: false,
      [Symbol(outHeadersKey)]: [Object: null prototype]
    }
  }
}
::ffff:10.1.0.162 - - [04/Mar/2020:15:48:55 +0000] "GET / HTTP/1.1" 200 421 "-" "PostmanRuntime/7.20.1"

on AWS, works fine: because there is path sending...

  "message": "Go Serverless v1.0! Your function executed successfully!",
  "input": {
    "resource": "/users/create",
    "path": "/users/create",
    "httpMethod": "GET",
    "headers": {
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
      "Accept-Encoding": "gzip, deflate, br",
      "Accept-Language": "es-ES,es;q=0.9,en;q=0.8",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "CL",
      "dnt": "1",
      "Host": "u5m2ln50ff.execute-api.us-east-1.amazonaws.com",
      "sec-fetch-dest": "document",
      "sec-fetch-mode": "navigate",
      "sec-fetch-site": "none",
      "upgrade-insecure-requests": "1",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
      "Via": "2.0 1ddeacce24f5e91d497c9d8a72218fd2.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "l0OoCHP16-AiD4mWWZTppe3U1wRp1_nvKf4SAv2a11VpLJ4SxSW7ZA==",
      "X-Amzn-Trace-Id": "Root=1-5e5fb4f8-ef67231d936e9b9f5229f781",
      "X-Forwarded-For": "186.10.254.186, 130.176.40.155",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
    },
    "multiValueHeaders": {
      "Accept": [
        "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
      ],
      "Accept-Encoding": [
        "gzip, deflate, br"
      ],
      "Accept-Language": [
        "es-ES,es;q=0.9,en;q=0.8"
      ],
      "CloudFront-Forwarded-Proto": [
        "https"
      ],
      "CloudFront-Is-Desktop-Viewer": [
        "true"
      ],
      "CloudFront-Is-Mobile-Viewer": [
        "false"
      ],
      "CloudFront-Is-SmartTV-Viewer": [
        "false"
      ],
      "CloudFront-Is-Tablet-Viewer": [
        "false"
      ],
      "CloudFront-Viewer-Country": [
        "CL"
      ],
      "dnt": [
        "1"
      ],
      "Host": [
        "u5m2ln50ff.execute-api.us-east-1.amazonaws.com"
      ],
      "sec-fetch-dest": [
        "document"
      ],
      "sec-fetch-mode": [
        "navigate"
      ],
      "sec-fetch-site": [
        "none"
      ],
      "upgrade-insecure-requests": [
        "1"
      ],
      "User-Agent": [
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
      ],
      "Via": [
        "2.0 1ddeacce24f5e91d497c9d8a72218fd2.cloudfront.net (CloudFront)"
      ],
      "X-Amz-Cf-Id": [
        "l0OoCHP16-AiD4mWWZTppe3U1wRp1_nvKf4SAv2a11VpLJ4SxSW7ZA=="
      ],
      "X-Amzn-Trace-Id": [
        "Root=1-5e5fb4f8-ef67231d936e9b9f5229f781"
      ],
      "X-Forwarded-For": [
        "186.10.254.186, 130.176.40.155"
      ],
      "X-Forwarded-Port": [
        "443"
      ],
      "X-Forwarded-Proto": [
        "https"
      ]
    },
    "queryStringParameters": null,
    "multiValueQueryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
      "resourceId": "j246vp",
      "resourcePath": "/users/create",
      "httpMethod": "GET",
      "extendedRequestId": "I3k21EGcIAMFePA=",
      "requestTime": "04/Mar/2020:14:02:32 +0000",
      "path": "/dev/users/create",
      "accountId": "081356250805",
      "protocol": "HTTP/1.1",
      "stage": "dev",
      "domainPrefix": "u5m2ln50ff",
      "requestTimeEpoch": 1583330552468,
      "requestId": "65f053c2-cd2b-4ecf-a272-d6015ab24bad",
      "identity": {
        "cognitoIdentityPoolId": null,
        "accountId": null,
        "cognitoIdentityId": null,
        "caller": null,
        "sourceIp": "186.10.254.186",
        "principalOrgId": null,
        "accessKey": null,
        "cognitoAuthenticationType": null,
        "cognitoAuthenticationProvider": null,
        "userArn": null,
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
        "user": null
      },
      "domainName": "u5m2ln50ff.execute-api.us-east-1.amazonaws.com",
      "apiId": "u5m2ln50ff"
    },
    "body": null,
    "isBase64Encoded": false
  }
}

Anything else we need to know?:

I found out in runtime:
https://github.com/kubeless/runtimes/blob/master/stable/nodejs/lib/helper.js#L38-L50
there no funtion for *
I would expect something like:

function routeAll(expressApp, promClient) {
  expressApp.get('/*', (req, res) => {
    return {req, res}
  });
}

I do not know if it works

Environment:

  • Kubernetes version:
    Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-13T18:08:14Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"darwin/amd64"}
    Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:07:57Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
  • Kubeless version:
    Kubeless version: v1.0.6
  • Cloud provider or physical cluster:
    Docker 2 Machine

Binary only package for golang

Is there a way to use pre-compiled package in golang runtime in kubeless?

kubeless function deploy iseven --from-file iseven.a --handler func.IsEven --runtime go1.12

Payload from Trigger CronJob is not send to event.Data

Hi,

I noticed that event.Data is empty when it is triggered by payload of CronJob.

I create my test function:

kubeless function deploy test -n kbox --runtime go1.14 --from-file test.go --handler test.Handler --dependencies go.mod

source of file test.go

package kubeless

import (
	"fmt"
	"github.com/kubeless/kubeless/pkg/functions"
)

func Handler(event functions.Event, context functions.Context) (string, error) {
	fmt.Println("datais", event.Data)
	return event.Data, nil
}

then I created the Trigger cronjob:
kubeless trigger cronjob create -n kbox test --function test -f test.json --schedule "*/1 * * * *"
source of test.json

{"action":"createpod","data":{"name":"mypodname"}}

the logs from pod test-6747bdf7b6-mz96f show that event.Data is empty

2020/10/20 07:55:16 10.104.70.145:39188 "GET /healthz HTTP/1.1" 200 kube-probe/1.17+
2020/10/20 07:55:46 10.104.70.145:39306 "GET /healthz HTTP/1.1" 200 kube-probe/1.17+
datais 
2020/10/20 07:56:03 10.104.81.106:55296 "GET / HTTP/1.1" 200 curl/7.52.1
2020/10/20 07:56:16 10.104.70.145:39452 "GET /healthz HTTP/1.1" 200 kube-probe/1.17+
2020/10/20 07:56:46 10.104.70.145:39570 "GET /healthz HTTP/1.1" 200 kube-probe/1.17+
datais 
2020/10/20 07:57:03 10.104.81.106:55768 "GET / HTTP/1.1" 200 curl/7.52.1
2020/10/20 07:57:16 10.104.70.145:39716 "GET /healthz HTTP/1.1" 200 kube-probe/1.17+
2020/10/20 07:57:46 10.104.70.145:39834 "GET /healthz HTTP/1.1" 200 kube-probe/1.17+

Can You please give me tip what I am doing wrong here.

Thank you in advance.

rebuild vulnerable Node.js images

A few of the Node.js images haven't been built in a long time and are vulnerable to various exploits; I'm not sure how to craft a PR that triggers a rebuild, but it'd be a really good idea to do so.

I'm here to help however I can 😄

Build dates for Node.js binaries included in current kubeless releases
❯ curl -sL 'https://raw.githubusercontent.com/kubeless/runtimes/master/stable/nodejs/nodejs.jsonnet' \
  | jsonnet - \
  | jq -r '.versions[].images[]|select(.phase=="runtime")|.image' \
  | xargs -I{} \
      docker run --rm --entrypoint node {} --version \
  | xargs -I{} \
      curl -sLH'accept: application/json' resolve-node.now.sh/{} \
  | jq -r '[.tag,.date]|@tsv' \
  | column -t
v6.17.1   2019-04-03
v8.16.0   2019-04-16
v10.16.0  2019-05-28
v12.5.0   2019-06-26
v14.5.0   2020-06-30
Kubeless versions vs available versions and their build dates
❯ curl -sL 'https://raw.githubusercontent.com/kubeless/runtimes/master/stable/nodejs/nodejs.jsonnet' \
  | jsonnet - \
  | jq -r '.versions[].images[]|select(.phase=="runtime")|.image' \
  | xargs -I{} \
      docker run --rm --entrypoint node {} --version \
  | xargs -I{} \
      curl -sLH'accept: application/json' resolve-node.now.sh/^{} \
  | jq -r '[.tag,.version,.date]|@tsv' \
  | column -t
^v6.17.1   v6.17.1   2019-04-03
^v8.16.0   v8.17.0   2019-12-17
^v10.16.0  v10.21.0  2020-06-02
^v12.5.0   v12.18.2  2020-06-30
^v14.5.0   v14.5.0   2020-06-30
Node.js security releases and their build dates for LTS release lines
❯ curl -sL nodejs.org/dist/index.json \
  | jq -r '.[]
    | select(.lts!=false)
    | select(.security==true)
    | select(.version|test("^v(6|8|10|12|14)"))
    | [.version,.date]
    | @tsv' \
  | column -t
v12.18.0  2020-06-02
v12.15.0  2020-02-05
v12.14.0  2019-12-16  <-- first of three security releases after 12.5.0
v10.21.0  2020-06-02
v10.19.0  2020-02-05
v10.18.0  2019-12-16
v10.16.3  2019-08-15  <-- first of four security releases after 10.16.0
v10.15.2  2019-02-28
v10.14.0  2018-11-27
v8.17.0   2019-12-17
v8.16.1   2019-08-15  <-- first of two security releases after 8.16.0
v8.15.1   2019-02-28
v8.14.0   2018-11-27
v8.11.4   2018-08-15
v8.11.0   2018-03-28
v8.9.3    2017-12-07
v6.17.0   2019-02-28
v6.15.0   2018-11-27
v6.14.4   2018-08-15
v6.14.0   2018-03-28
v6.12.2   2017-12-07
v6.11.5   2017-10-24
v6.11.1   2017-07-10

Additionally, it's probably worth calling out that both 6.x and 8.x are already EOL, and 10.x has entered maintenance-only mode. It is not safe to use either 6.x or 8.x in production and, ideally, those running 10.x should be on 10.21.0 minimum and those on 12.x should be on 12.18.0 minimum.

Thanks again and please let me know if there's anything I can do to assist!

Cannot run multi-file dotnet core 2 assembly

With a stable deploy of Kubeless 1.0.6 have the following issue:
I have a dotnet C# project with 3 files. 2 Code (cs files) and 1 cert for accessing a cockroach db.

The csproj file is as follows:

dbtest.csproj:
Project Sdk="Microsoft.NET.Sdk">

netstandard2.0

I zip the 3 files as follows:
zip dbtest.zip DbTest.cs DbConnection.cs certs/client.roach.crt

And then deploy as follows:
kubeless function deploy dbtest --from-file dbtest.zip --handler module.handler --dependencies dbtest.csproj --runtime dotnetcore2.0

The compilation stage and preparation stage work fine but when the POD tries to start the following error occurs.

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
at System.Runtime.Loader.AssemblyLoadContext.LoadFromPath(IntPtr ptrNativeAssemblyLoadContext, String ilPath, String niPath, ObjectHandleOnStack retAssembly)
at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath(String assemblyPath)
at System.Reflection.Assembly.LoadFrom(String assemblyFile)
at Kubeless.Core.Invokers.CompiledFunctionInvoker.LoadAssemblyDepedencies() in /app/src/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 29
at kubeless_netcore_runtime.Startup.ConfigureServices(IServiceCollection services) in /app/src/Kubeless.WebAPI/Startup.cs:line 47
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at kubeless_netcore_runtime.Program.BuildWebHost(String[] args) in /app/src/Kubeless.WebAPI/Program.cs:line 23
at kubeless_netcore_runtime.Program.Main(String[] args) in /app/src/Kubeless.WebAPI/Program.cs:line 18

Here is the code fro the 2 code files I use:
DbConnection.cs - is a support class:

sing System.IO;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using Npgsql;

public class DBConnection {
private NpgsqlConnection conn = null;

private X509Certificate     cert = null;

private X509Certificate getCertificate() {
    if (cert == null) {
        Assembly    assembly = this.GetType().Assembly;
        Stream      resource = assembly.GetManifestResourceStream("dbtest.certs.client.roach.crt");
        int         length = (int)resource.Length;
        byte[]      data = new byte[length];

        resource.Read(data, 0, length);
        cert = new X509Certificate(data); 
    }
    return cert;
}
public NpgsqlConnection getConnecion() {
    if (conn == null) {
        var connectionString = new NpgsqlConnectionStringBuilder {
            Host = "localhost",
            Port = 26257,
            Username = "roach", 
            Password = "blabla", 
            Database = "dbtest",
            SslMode = SslMode.Require,
            TrustServerCertificate = true
        }.ConnectionString;

        conn = new NpgsqlConnection(connectionString);
        conn.ProvideClientCertificatesCallback += (clientCerts) => {
            clientCerts.Add(getCertificate());
        };

        conn.Open();
    }
    return conn;
}

~DBConnection() {
    if (conn != null) {
        conn.Close();
    }
}

}

DbTest.cs - is the main module:

using System;
using Kubeless.Functions;
using Npgsql;

public class module
{
private DBConnection connection = new DBConnection();

public object handler(Event k8Event, Context k8Context)
{
    var conn = connection.getConnecion();
    // Insert some data
    var cmd = new NpgsqlCommand("INSERT INTO data (some_field) VALUES (@p)", conn);
    cmd.Parameters.AddWithValue("p", "Hello world");
    cmd.ExecuteNonQuery();
    

    // Retrieve all rows
    var result = "{values: [";
    var reader = new NpgsqlCommand("SELECT some_field FROM data", conn).ExecuteReader();
    while (reader.Read()) {
        if (result.Length == 0) 
            result = "{values: [" + reader.GetString(0);
        else
            result += ", " + reader.GetString(0);
    };
    result += "]}";

    return result;
}

}

Update maven.compiler from Java 6 to Java 8 (runtime java1.8)

Hi,

I have created a function using the runtime java1.8. In my code, I am using try-with-resources that is supported by Java 8.

However, when I deploy my function, the pod doesn't start. Watching it, that is its behaviour

get-books-694b7674f7-ps4kq                     0/1     Init:Error   0          73s
get-books-694b7674f7-ps4kq                     0/1     Init:1/2     1          74s
get-books-694b7674f7-ps4kq                     0/1     Init:Error   1          79s
get-books-694b7674f7-ps4kq                     0/1     Init:CrashLoopBackOff   1          90s
get-books-694b7674f7-ps4kq                     0/1     Init:1/2                2          90s
get-books-694b7674f7-ps4kq                     0/1     Init:Error              2          97s
get-books-694b7674f7-ps4kq                     0/1     Init:CrashLoopBackOff   2

Then, when I describe it, I get the following log whose ERROR is clearly "try-with-resources is not supported"

[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ function ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /kubeless/function/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.2:compile (default-compile) @ function ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 2 source files to /kubeless/function/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /kubeless/function/src/main/java/io/kubeless/BookResource.java:[85,17] try-with-resources is not supported in -source 1.6
  (use -source 7 or higher to enable try-with-resources)
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] kubeless ........................................... SUCCESS [  0.013 s]
[INFO] params ............................................. SUCCESS [ 59.696 s]
[INFO] function ........................................... FAILURE [  3.426 s]
[INFO] handler ............................................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE

Shouldn't we change this file (https://github.com/kubeless/runtimes/blob/master/stable/java/pom.xml), updating its maven.compiler from Java 6 to Java 8 (as the runtime used is java1.8)?

Thanks!

Kubeless python runtime pandas import throwing error

Tried to create a function with Python 3.7 runtime which uses pandas, but when i deploy the function pod fails with below error

File "/kubeless/lib/python3.7/site-packages/pandas/init.py", line 55, in
from pandas.core.api import (
File "/kubeless/lib/python3.7/site-packages/pandas/core/api.py", line 24, in
from pandas.core.groupby import Grouper, NamedAgg
File "/kubeless/lib/python3.7/site-packages/pandas/core/groupby/init.py", line 1, in
from pandas.core.groupby.generic import ( # noqa: F401
File "/kubeless/lib/python3.7/site-packages/pandas/core/groupby/generic.py", line 44, in
from pandas.core.frame import DataFrame
File "/kubeless/lib/python3.7/site-packages/pandas/core/frame.py", line 88, in
from pandas.core.generic import NDFrame, _shared_docs
File "/kubeless/lib/python3.7/site-packages/pandas/core/generic.py", line 71, in
from pandas.io.formats.format import DataFrameFormatter, format_percentiles
File "/kubeless/lib/python3.7/site-packages/pandas/io/formats/format.py", line 47, in
from pandas.io.common import _expand_user, _stringify_path
File "/kubeless/lib/python3.7/site-packages/pandas/io/common.py", line 9, in
import lzma
File "/opt/bitnami/python/lib/python3.7/lzma.py", line 27, in
from _lzma import *
ModuleNotFoundError: No module named '_lzma'

Can you please suggest if i am missing anything?

Support for nuget.conf in .NET Core

I am not sure if I missed a part of the documentation, but I couldn't find in the documentation a way to include a nuget.conf file along with the .csproj file in a .NET Core function. Is this already supported or is there a way that support for this could be added?

The nuget.conf file is used to manage the nuget repositories used for dependency resolution in a solution.

Python and Ruby runtimes don't expose event.extensions.response

While the documentation lists it and the PHP, Go and Node runtimes include the response-object in the event extensions, the Python and Ruby runtimes do not. As do the ballerina, Java and .Net-runtimes, but their Handlers seem a bit different anyway, while the Bottle/Sinatra-Request/Response objects could probably be handled similarly to the express ones.

Is this on purpose or an oversight?

My usecase is to add headers to the response, which the nodejs runtime allows via the exposed response object, but the Python and Ruby ones don't. If there is another way to do this, I'd be happy about suggestions.

Python runtime: completed processes not getting cleaned up

In the case when the function completes successfully or completes with an exception (i.e, non-timeout path), the processes are not cleaned up due to a missing join leading to processes getting accumulated over the course of the pod lifetime and resulting in the node running out of PIDs to assign to new processes.

I have raised a PR #82 for the same.

It might even be a good idea to use the tini init as the ENTRYPOINT for the Docker images so that even zombie processes created by misbehaving user code can be reaped. I'd be happy to submit a PR for that.

cc: @andresmgot

Update PHP Images

The Images are still PHP 7.3. Already 7.4 is out since one year so far

Error "Could not load file or assembly '/app/*.dll'." in attempt to deploy vb.net function

I wrote a function in vb and attempted to deploy it to kubeless. I got it passed the compilation phase, but the function can't be executed and the runtime container has this error log:

info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://10.244.2.80:8080/healthz  
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "Health", controller = "Runtime"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult Health() on controller Kubeless.WebAPI.Controllers.RuntimeController (Kubeless.WebAPI).
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI) in 4.0448ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Kubeless.WebAPI.Controllers.RuntimeController.Health (Kubeless.WebAPI)'
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HLVF98RHI157", Request id "0HLVF98RHI157:00000001": An unhandled exception was thrown by the application.
System.IO.FileNotFoundException: Could not load file or assembly '/app/*.dll'. The system cannot find the file specified.

File name: '/app/*.dll'
   at System.Runtime.Loader.AssemblyLoadContext.LoadFromPath(IntPtr ptrNativeAssemblyLoadContext, String ilPath, String niPath, ObjectHandleOnStack retAssembly)
   at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath(String assemblyPath)
   at Kubeless.Core.Invokers.CompiledFunctionInvoker.LoadAssembly(String path) in /app/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 37
   at Kubeless.Core.Invokers.CompiledFunctionInvoker..ctor(IFunction function, Int32 functionTimeout) in /app/Kubeless.Core/Invokers/CompiledFunctionInvoker.cs:line 26
   at Kubeless.WebAPI.Startup.<>c__DisplayClass4_0.<ConfigureServices>b__0(IServiceProvider _) in /app/Kubeless.WebAPI/Startup.cs:line 30
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Is it the assembly path should be /app/project.dll instead of /app/*.dll? If this is the case where is this /app/*.dll came from or where to look to fix this wrong path?


I am using compilation and runtime image from dotnetcore3.1 runtime to define new runtime that support vb.net. This is what I added to kubeless-config configmap (following these steps):

{
  "ID": "vbdotnetcore",
  "depName": "project.vbproj",
  "fileNameSuffix": ".vb",
  "versions": [
    {
      "images": [
        {
          "command": "/app/compile-function.sh $KUBELESS_INSTALL_VOLUME",
          "image": "lorenzoangelini3/kubeless-compile-dotnetcore31@sha256:4e6adfe873f7c4cd5e0d582bb5122f94c6d6ea73baa03b486dd93b8406deb8ca",
          "phase": "compilation"
        },
        {
          "env": {
            "DOTNETCORE_HOME": "$(KUBELESS_INSTALL_VOLUME)/packages"
          },
          "image": "lorenzoangelini3/kubeless-runtime-dotnetcore31@sha256:4a2d94bd6da4aee612a2009d863beb554c43e61199d8d3fc4bf2d28b5673940b",
          "phase": "runtime"
        }
      ],
      "name": "vbdotnetcore3.1",
      "version": "3.1"
    }
  ]
}

This is my function definition:

Imports System
Imports Kubeless.Functions

Class [module]
    Public Async Function handler(ByVal k8Event As [Event], ByVal k8Context As Context) As Task(Of Object)
        Return "Happy coding!"
    End Function
End Class

vbproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp31</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Kubeless.Functions" Version="0.1.1" />
  </ItemGroup>

</Project>

How to install unreleased runtime?

I want to use .NET core 3.1 runtime but current kubeless release (v1.0.6), which I have installed, only have .NET core up to 2.2. Is there a way to install unreleased runtime and is there any documentation on that?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.