Это цикл переводных заметок автора Priti Desai. Поскольку сами заметки довольно короткие, то в одной публикации будет собрано сразу несколько. Будут рассмотрены детали развертывания приложений для OpenWhisk с примерами, а в конце цикла — приведена архитектура и код приложения, использующего бессерверные вычисления на основе OpenWhisk.


Автоматизируем развертывание приложения для OpenWhisk


Вы уже поставили OpenWhisk и проверили простую функцию hello.js в работе?


cat hello.js
function main() {
    return {payload:  'Hello World'};
}

А хотите автоматизировать развертывание этой простейшей функции? Если да, продолжайте читать эту заметку. Я покажу, как использовать openwhisk-wskdeploy для автоматизации развертывания простейшей функции.


Необходимые компоненты



Шаг первый


Создаем файл-манифест (manifest.yaml) с таким содержимым:


packages:
    helloworld:
        actions:
            helloworld:
                location: src/hello.js
                runtime: nodejs:6
                outputs:
                    payload:
                        type: string
                        description: a simple greeting message, Hello World.

Шаг второй


Создаем файл для развертывания (deployment.yaml):


application:
    name: SampleHelloWorld
    namespace: _
    packages:
        helloworld:
            actions:
                helloworld:

На самом деле этот файл для поставки helloworld не обязателен, достаточно манифеста из первого шага.


Шаг третий


Создаем структуру каталогов. Выглядит она примерно так:


# ls -1R ~/SampleHelloWorldApp/
deployment.yaml
manifest.yaml
src/

./src:
hello.js

Шаг четвертый


Выполняем развертывание функции HelloWorld:


./wskdeploy -p ~/SampleHelloWorldApp/
         ____      ___                   _    _ _     _     _
        /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __
   /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /
  /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <
  \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\
   \___\/              |_|

Packages:
Name: helloworld
  * action: helloworld
    bindings:

Triggers:

 Rules

Do you really want to deploy this? (y/N): y
Deploying pacakge helloworld ... Done!
Deploying action helloworld/helloworld ... Done!

Deployment completed successfully.

Шаг пятый


Проверяем работоспособность:


# wsk action invoke --blocking --result helloworld/helloworld
{
    "payload": "Hello World"
}

Шаг шестой


Радуемся!


Развертывание: функция, условие и правило


Давайте посмотрим на дополнительные вещи, необходимые при автоматизации:



Передача параметров в функцию


Модифицируем код:


function main(params) {
  return {payload:  'Hello, ' + params.name + ' from ' + params.place};
}

Шаг первый


Создаем файл-манифест:


packages:
    helloworld:
        actions:
            helloworld:
                location: src/hello.js
                runtime: nodejs:6
            inputs:
                    name:
                        type: string
                        description: name of a person
                    place:
                        type: string
                        description: location of a person
            outputs:
                    payload:
                        type: string
                        description: a simple greeting message, Hello World!

Можно указать значения параметров в файле манифеста и пропустить создание файла для развертывания:


packages:
    helloworld:
        actions:
            helloworld:
                location: src/hello.js
                runtime: nodejs:6
            inputs:
                    name: Amy
                    place: Paris
            outputs:
                    payload:
                        type: string
                        description: a simple greeting message, Hello World!

Шаг второй


Создаем файл для развертывания:


Выставляем значения по умолчанию, добавляя секцию "inputs", вложенную в функцию "helloworld":


application:
    name: SampleHelloWorld
    namespace: _
    packages:
        helloworld:
            actions:
                helloworld:
                    inputs:
                        name: Amy
                        place: Paris

Проверяем, что структура каталогов не изменилась с прошлого раза.


Шаг третий


Разворачиваем функцию:


# ./wskdeploy -p ~/SampleHelloWorldApp/
         ____      ___                   _    _ _     _     _
        /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __
   /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /
  /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <
  \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\
   \___\/              |_|
Packages:
Name: helloworld
  * action: helloworld
    bindings:
        - name: name value: Amy
        - name: place value: Paris
Triggers:
 Rules
Do you really want to deploy this? (y/N): y
Deploying pacakge helloworld ... Done!
Deploying action helloworld/helloworld ... Done!
Deployment completed successfully.

Шаг четвертый


Проверяем работоспособность:


wsk action invoke --blocking --result helloworld/helloworld
{
    "payload": "Hello, Amy from Paris"
}

Переопределяем значения по-умолчанию, передавая значения с помощью параметра --param:


wsk action invoke --blocking --result helloworld/helloworld --param name Mark --param place Barcelona
{
    "payload": "Hello, Mark from Barcelona"
}

Создание условия и правила связывания


Шаг первый


Добавляем две секции в манифест:


packages:
    helloworld:
        actions:
            helloworld:
                location: src/helloworld.js
                runtime: nodejs:6
                inputs:
                    name:
                        type: string
                        description: name of a person
                    place:
                        type: string
                        description: location of a person
                outputs:
                    payload:
                        type: string
                        description: a simple greeting message, Hello World!
        triggers:
            locationUpdate:
        rules:
            helloworldOnLocationUpdate:
                action: helloworld
                trigger: locationUpdate

Шаг второй


Разворачиваем функцию, условие и правило связывания:


./wskdeploy -p ~/SampleHelloWorldApp/
         ____      ___                   _    _ _     _     _
        /\   \    / _ \ _ __   ___ _ __ | |  | | |__ (_)___| | __
   /\  /__\   \  | | | | '_ \ / _ \ '_ \| |  | | '_ \| / __| |/ /
  /  \____ \  /  | |_| | |_) |  __/ | | | |/\| | | | | \__ \   <
  \   \  /  \/    \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\
   \___\/              |_|
Packages:
Name: helloworld
  * action: helloworld
    bindings:
        - name: name value: Amy
        - name: place value: Paris
Triggers:
* trigger: locationUpdate
    bindings:
 Rules
* rule: helloworldOnLocationUpdate
    - trigger: locationUpdate
    - action: helloworld
Do you really want to deploy this? (y/N): y
Deploying pacakge helloworld ... Done!
Deploying action helloworld/helloworld ... Done!
Deploying trigger locationUpdate ... Done!
Deploying rule helloworldOnLocationUpdate ... Done!
Deployment completed successfully.

Шаг третий


Проверяем работоспособность:


  • смотрим работающие функции:

    wsk activation poll
    Enter Ctrl-c to exit.
    Polling for activation logs
  • открываем еще один терминал и вводим команду для активации условного срабатывания:

    wsk trigger fire locationUpdate
    ok: triggered locationUpdate with id 4c3a8b1792d546a68ac58538c3f5d637
  • смотрим результаты в первом терминале:

    Activation: helloworld (d545c458f3d34d6fbf5c29173be3d29e)
    []
    Activation: locationUpdate (4c3a8b1792d546a68ac58538c3f5d637)
    []
    Activation: helloworldOnLocationUpdate (c099355c1f1f4d6d8d30f54e8dac2b84)
    []
  • определяем id условного срабатывания и проверяем результаты функции:

    wsk activation get d545c458f3d34d6fbf5c29173be3d29e
    ok: got activation d545c458f3d34d6fbf5c29173be3d29e
    {
    ...
    "activationId": "d545c458f3d34d6fbf5c29173be3d29e",
    "start": 1489444142544,
    "end": 1489444142598,
    "response": {
        "status": "success",
        "statusCode": 0,
        "success": true,
        "result": {
            "payload": "Hello, Amy from Paris"
        }
    },
    ...
    }

Анонс


Бессерверные вычисления на основе OpenWhisk, часть 1
Бессерверные вычисления на основе OpenWhisk, часть 2
Бессерверные вычисления на основе OpenWhisk, часть 3
Бессерверные вычисления на основе OpenWhisk, часть 4

Комментарии (0)