Quick .NET Core 2.2 Action

A .NET Core action is a .NET Core class library with a method called Main that has the exact signature as follows:

public Newtonsoft.Json.Linq.JObject Main(Newtonsoft.Json.Linq.JObject);

In order to compile, test and archive .NET Core projects, you must have the .NET Core SDK installed locally and the environment variable DOTNET_HOME set to the location where the dotnet executable can be found.

For example, create a C# project called Apache.OpenWhisk.Example.Dotnet:

dotnet new classlib -n Apache.OpenWhisk.Example.Dotnet -lang C# -f netstandard2.0
cd Apache.OpenWhisk.Example.Dotnet

Install the Newtonsoft.Json NuGet package as follows:

dotnet add package Newtonsoft.Json -v 12.0.2

Now create a file called Hello.cs with the following content:

using System;
using Newtonsoft.Json.Linq;

namespace Apache.OpenWhisk.Example.Dotnet
{
    public class Hello
    {
        public JObject Main(JObject args)
        {
            string name = "stranger";
            if (args.ContainsKey("name")) {
                name = args["name"].ToString();
            }
            JObject message = new JObject();
            message.Add("greeting", new JValue($"Hello, {name}!"));
            return (message);
        }
    }
}

Publish the project as follows:

dotnet publish -c Release -o out

Zip the published files as follows:

cd out
zip -r -0 helloDotNet.zip *

You need to specify the name of the function handler using --main argument. The value for main needs to be in the following format: {Assembly}::{Class Full Name}::{Method}, e.q., Apache.OpenWhisk.Example.Dotnet::Apache.OpenWhisk.Example.Dotnet.Hello::Main

Create the .NET Core Action

To use on a deployment of OpenWhisk that contains the runtime as a kind:

wsk action update helloDotNet helloDotNet.zip --main Apache.OpenWhisk.Example.Dotnet::Apache.OpenWhisk.Example.Dotnet.Hello::Main --kind dotnet:2.2

Invoke the .NET Core Action

Action invocation is the same for .NET Core actions as it is for Swift and JavaScript actions:

wsk action invoke --result helloDotNet --param name World
  {
      "greeting": "Hello World!"
  }

Local Development

./gradlew core:dotnet2.2:distDocker

This will produce the image whisk/action-dotnet-v2.2

Build and Push image

docker login
./gradlew core:action-dotnet-v2.2:distDocker -PdockerImagePrefix=$prefix-user -PdockerRegistry=docker.io

Deploy OpenWhisk using ansible environment that contains the kind dotnet:2.2 Assuming you have OpenWhisk already deploy localy and OPENWHISK_HOME pointing to root directory of OpenWhisk core repository.

Set ROOTDIR to the root directory of this repository.

Redeploy OpenWhisk

cd $OPENWHISK_HOME/ansible
ANSIBLE_CMD="ansible-playbook -i ${ROOTDIR}/ansible/environments/local"
$ANSIBLE_CMD setup.yml
$ANSIBLE_CMD couchdb.yml
$ANSIBLE_CMD initdb.yml
$ANSIBLE_CMD wipe.yml
$ANSIBLE_CMD openwhisk.yml

Or you can use wskdev and create a soft link to the target ansible environment, for example:

ln -s ${ROOTDIR}/ansible/environments/local ${OPENWHISK_HOME}/ansible/environments/local-dotnet
wskdev fresh -t local-dotnet

Testing

Install dependencies from the root directory on $OPENWHISK_HOME repository

pushd $OPENWHISK_HOME
./gradlew install
podd $OPENWHISK_HOME

Using gradle to run all tests

./gradlew :tests:test

Using gradle to run some tests

./gradlew :tests:test --tests DotNet2_2ActionContainerTests

Using IntelliJ:

  • Import project as gradle project.
  • Make sure working directory is root of the project/repo

Using Container Image To Test

To use as docker action push to your own dockerhub account

docker tag whisk/action-dotnet-v2.2 $user_prefix/action-dotnet-v2.2
docker push $user_prefix/action-dotnet-v2.2

Then create the action using your the image from dockerhub

wsk action update helloDotNet helloDotNet.zip --main Apache.OpenWhisk.Example.Dotnet::Apache.OpenWhisk.Example.Dotnet.Hello::Main --docker $user_prefix/action-dotnet-v2.2

The $user_prefix is usually your dockerhub user id.

License

Apache 2.0