Just a quick tip to share today. I talked about zipped actions a few months ago. It's how you handle adding non-supported npm modules with OpenWhisk. While OpenWhisk supports a good set of common/popular npm modules out of the box, if you want to use one that isn't on that list, you:

  • Make a zip of the action code, the package.json file, and the node_modules.
  • Update your action and point to the zip instead of just the .js file.
  • Plus add a bit of metadata (explained in my blog post linked to above)

All in all this works well, especially once you make a simple shell script to do all of the actions at once.

Today though I ran into an interesting issue. I've got a simple ElasticSearch package I'm slowly building for OpenWhisk. Right now it has 2 actions: Create, Search. I've got both of these in the same folder, with a folder structure that looks like so:

  • node_modules
  • create.js
  • package.json
  • search.js
  • upd.bat (my shell script)

The shell script simply handles updating Create and Search:

del search.zip
7z a -r search.zip search.js package.json node_modules/*
wsk action update elasticsearch/search --kind nodejs:6 .\search.zip

del create.zip
7z a -r create.zip create.js package.json node_modules/*
wsk action update elasticsearch/create --kind nodejs:6 .\create.zip

If you're curious, 7z is just a Windows-based zip CLI. Ok, so today I did some updates, and while search worked fine, create gave me:

Error: Cannot find module '/nodejsAction/G3hUBA5k`

I was pretty confused by this - but then I saw the problem. My package.json looked like so:

{
  "name": "openwhisk_es",
  "version": "1.0.0",
  "description": "",
  "main": "search.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "elasticsearch": "^12.1.3"
  }
}

See it? The issue is main pointing to search.js. When I ran the create action it couldn't find search. So the solution? I could have used 2 completely separate subdirectories. Instead, I made two new files: package.create.json and package.search.json. The only difference in both is the main value. My shell script then changes to:

del search.zip
copy package.search.json package.json
7z a -r search.zip search.js package.json node_modules/*
wsk action update elasticsearch/search --kind nodejs:6 .\search.zip

del create.zip
copy package.create.json package.json
7z a -r create.zip create.js package.json node_modules/*
wsk action update elasticsearch/create --kind nodejs:6 .\create.zip

Not exactly rocket science, but you get the idea.

p.s. Now that my desktop and laptop both have a decent Bash shell, I'm pretty much done with the Windows shell. It works fine and all, but I'm really digging Bash on Windows, especially after the Creators Update. I really haven't run into anything I can't do yet.