Compute Services

Prepping your OpenWhisk code for GA

Share this post:

OpenWhisk has moved to GA!

openwhisk-hero-imageIf you’ve already been exploring OpenWhisk and building your serverless infrastructure, you’ll want to pay attention to to several deprecations now that OpenWhisk has moved to General Availability (GA).

On January 12th, 2017 features that have been marked deprecated will no longer be supported. Some of these changes are breaking changes, meaning, that if you do not address them, your OpenWhisk actions will cease to function.

Authentication

First, and most importantly, API keys and namespaces are changing. If you head over to download the latest command line interface, you’ll see instructions to set your new authentication keys and remove the old namespace.  Note: You’ll need the latest CLI to use GA features. You can learn more about these changes here: It’s time to update your OpenWhisk API Keys.

Node.js Runtime API Changes

Inside of Node.js actions, the global whisk object, and all of its methods have been deprecated. This includes:

whisk.invoke, whisk.trigger, whisk.error, whisk.done, whisk.async, whisk.setAuthKey, whisk.getAuthKey

What does that mean for you?

First, you need to require the OpenWhisk npm package and instantiate the openwhisk instance before you can use it:

var openwhisk = require('openwhisk’);

function main(params) {
var wsk = openwhisk()
  //do stuff
}

Invoking Actions and Triggers

If you were invoking actions using whisk.invoke, you need to now use the OpenWhisk npm module’s action.invoke() method. For example:

function main(params) {
  var wsk = openwhisk()
  return wsk.actions.invoke({
    actionName: “myAction",
    params: { myParam: "the value" }
  });
}

If you were firing triggers using whisk.trigger, you need to now use the OpenWhisk npm module’s trigger.invoke() method.

function main(params) {
  var wsk = openwhisk()
  return wsk.triggers.invoke({
    triggerName: “myTrigger”
  });
}

Environment Variables

The whisk.getAuthKey and whisk.setAuthKey methods no longer exist. You can now access the API host, namespace and API key values as environment variables.

Example (from helloContext.js):

function main(args) {
  return {
    "api_host": process.env['__OW_API_HOST'],
    "api_key": process.env['__OW_API_KEY'],
    "namespace": process.env['__OW_NAMESPACE'],
    "action_name": process.env['__OW_ACTION_NAME'],
    "activation_id": process.env['__OW_ACTIVATION_ID'],
    "deadline": process.env['__OW_DEADLINE']
  }
}

Asynchronous Action Changes

The behavior and implementation of asynchronous JavaScript actions has also changed. This change affects any actions which may have used whisk.async in conjunction with whisk.done and whisk.error.

Previously, you may have written an asynchronous action by returning whisk.async from main, and then use whisk.done or whisk.error to signal completion (or error) of the asynchronous operation. Something like this:

function main() {
  setTimeout(function() {
    if (error) {
      return whisk.error();
    } else {
      return whisk.done({done: true});
    }
  }, 2000);
  return whisk.async();
}

In the latest Node.js v6 actions, you should now use promises. Inside of the promise you will use either the resolve or reject method to complete the asynchronous action of the promise.

Something more like this:

function main(args) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      if (error) {
        reject(error);
      } else {
        resolve({ done: true });
      }
    }, 2000);
  })
}

You can check out the OpenWhisk docs to learn more about creating asynchronous actions, or check out an asynchronous sample here.

Synchronous actions remain the same… You can return a value from main, instead of returning a Promise.  For example:

function main(args) {
  return {
    payload:”Hello World!"
  }
}

Other Deprecations & Changes

In addition to these coding/API changes, several packages and the Swift v2 and Node.js 0.12 runtimes have been deprecated. You can see the list of package changes here.

If you have any Node.js 0.12 actions, they will need to be migrated to the Node.js 6 runtime. If you have any Swift v2 actions, you will want to migrate those to the Swift v3 runtime.

Cloudant includeDocs Deprecation

The includeDocs parameter for the Cloudant trigger has been deprecated, and will cease to function on January 12th, 2017. This parameter was used to attach the affected document as a parameter to the document change feed (document was included in every insert, update, or delete event). This is no longer supported. The document id will still be passed in the change feed, but you will now have to query the Cloudant action/database to fetch the complete document if you need it. You can read more about this change at: Cloudant Change Trigger no Longer Supports “includeDoc”.

 


 

It’s been an exciting year as advances in serverless computing, and OpenWhisk in particular, have transformed the way that we can build our applications and APIs. We no longer have to think about provisioning servers, ramping up to scale to meet demand, or building monolithic server architectures. Serverless computing enables us to think in terms of discrete, composable (and reusable) microservices that automatically scale based on demand, or automatically process input in near real time based on activity and events.

With all of this information, you should now be all set to move your OpenWhisk actions to GA. We can’t wait to see what you’ll build next!

More Compute Services stories
February 12, 2019

A “Kubernetes Everywhere” Approach: Build and Deploy Enterprise-Scale Modern Applications for Hybrid Cloud

We are excited to introduce two optional cloud-managed services and capabilities designed to enable clients to quickly build and deploy enterprise-scale container-based applications across hybrid environments: Managed Istio and Managed Knative for IBM Cloud Kubernetes Service.

Continue reading

February 7, 2019

Istio Multicluster Support

The current multicluster Istio status There is a growing community interest in running workloads on multiple clusters to achieve better scaling, failure isolation, and application agility. Istio v1.0 supports some multicluster capabilities and new ones are added in v1.1. This blog post highlights the current multicluster Istio status, helping interested people understand what capabilities exist […]

Continue reading

February 7, 2019

Whirlpool and Cloud-Native Wizards at Think 2019

The ideal app developer would be a wizard. Through telepathy, knowing what a user needs from an app in the moment, he automatically provides an update in real-time.

Continue reading