Статьи

Функция Fn для создания приложения Oracle ADF

В одном из моих предыдущих постов я описал, как создать контейнер Docker, служащий в качестве компоновщика для приложений ADF. Здесь я собираюсь показать, как использовать этот контейнер в качестве
функция на платформе Fn.

Прежде всего, давайте обновим контейнер, чтобы он соответствовал требованиям функции, то есть он может быть вызван как исполняемый двоичный файл, принимающий некоторые аргументы. В пустой папке я создал Dockerfile (простой текстовый файл с таким именем) со следующим содержимым:

1
2
FROM efedorenko/adfbuilder
ENTRYPOINT ["xargs","mvn","package","-DoracleHome=/opt/Oracle_Home","-f"]

Этот файл содержит инструкции для Docker о том, как создать новый образ Docker из существующего (efedorenko / adfbuilder из предыдущего поста), и указывает точку входа, чтобы контейнер знал, что делать, если он был инициирован запуском Docker. команда. В этом случае всякий раз, когда мы запускаем контейнер, он выполняет цель пакета Maven для файла pom с именем, полученным из stdin . Это важно, так как платформа Fn использует stdin / stdout для ввода / вывода функций в качестве стандартного подхода.

В этой же папке мы выполним команду для создания нового образа Docker (fn_adfbuilder) из нашего файла Docker:

1
docker build -t efedorenko/fn_adfbuilder.

Теперь, если мы запустим контейнер, передающий имя файла pom через стандартный ввод, вот так:

1
echo -n "/opt/MySampleApp/pom.xml" | docker run -i --rm efedorenko/fn_adfbuilder

Контейнер выполнит внутри себя то, что нам действительно нужно:

1
mvn package -DoracleHome=/opt/Oracle_Home -f/opt/MySampleApp/pom.xml

По сути, сделав это, мы получили контейнер, действующий как функция. Он создает приложение для данного файла POM .

Давайте использовать эту функцию на платформе Fn. Установка Fn на вашем локальном компьютере так же проста, как вызов одной команды и описана на странице проекта GnHub Fn . После установки Fn мы можем указать реестр Docker, в котором мы будем хранить образы наших функций-контейнеров и запустить сервер Fn:

1
2
export FN_REGISTRY=efedorenko
fn start

Следующим шагом является создание приложения Fn, которое будет использовать нашу удивительную функцию:

1
fn apps create adfbuilderapp

Для этого вновь созданного приложения мы должны указать маршрут к нашему ограничителю функции, чтобы приложение знало, когда и как его вызывать:

1
fn routes create --memory 1024 --timeout 3600 --type async adfbuilderapp /build efedorenko/fn_adfbuilder:latest

Мы создали маршрут, в котором говорится, что всякий раз, когда ресурс / build запрашивается для adfbuilderapp , платформа Fn должна создавать новый контейнер Docker на основе последней версии образа fn_adfbuilder из репозитория efedorenko и запускать его, предоставляя 1 ГБ памяти и передавая аргументы в stdin ( режим по умолчанию).
  Кроме того, поскольку сборка занимает много времени и ресурсов, мы собираемся вызвать функцию в асинхронном режиме с часовым таймаутом. После создания маршрута мы можем вызвать функцию с помощью Fn Cli :

1
2
3
4
5
echo -n "/opt/MySampleApp/pom.xml" | fn call adfbuilderapp /build
 
or over http:
 
curl -d "/opt/MySampleApp/pom.xml" http://localhost:8080/r/adfbuilderapp/build

В обоих случаях платформа поместит вызов в очередь (поскольку он асинхронный) и вернет идентификатор вызова:

1
{"call_id":"01C5EJSJC847WK400000000000"}

Функция работает сейчас, и мы можем проверить, как она работает, различными способами. Поскольку вызов функции — это просто создание и запуск контейнера Docker, мы можем увидеть его, получив список всех запущенных контейнеров:

1
2
3
4
5
6
7
8
9
docker ps
 
CONTAINER ID        IMAGE                               CREATED             STATUS                NAMES
 
6e69a067b714        efedorenko/fn_adfbuilder:latest     3 seconds ago       Up 2 seconds          01C5EJSJC847WK400000000000
 
e957cc54b638        fnproject/ui                        21 hours ago        Up 21 hours           clever_turing
 
68940f3f0136        fnproject/fnserver                  27 hours ago        Up 27 hours           fnserver

Fn создал новый контейнер и в качестве имени использовал идентификатор вызова функции. Мы можем прикрепить наш stdin / stdout к контейнеру и посмотреть, что происходит внутри:

1
docker attach 01C5EJSJC847WK400000000000

После выполнения функции мы можем использовать Fn Rest API (или Fn Cli) для запроса информации о вызове:

1
2
3
http://localhost:8080/v1/apps/adfbuilderapp/calls/01C5EJSJC847WK400000000000
 
{"message":"Successfully loaded call","call":{"id":"01C5EJSJC847WK400000000000","status":"success","app_name":"adfbuilderapp","path":"/build","completed_at":"2018-02-03T19:52:33.204Z","created_at":"2018-02-03T19:46:56.071Z","started_at":"2018-02-03T19:46:57.050Z","stats":[{"timestamp":"2018-02-03T19:46:58.189Z","metrics":

……

1
http://localhost:8080/v1/apps/adfbuilderapp/calls/01C5EJSJC847WK400000000000/log
1
{"message":"Successfully loaded log","log":{"call_id":"01C5EKA5Y747WK600000000000","log":"[INFO] Scanning for projects...\n[INFO] ------------------------------------------------------------------------\n[INFO] Reactor Build Order:\n[INFO] \n[INFO] Model\n[INFO] ViewController\n[INFO]

Мы также можем следить за вызовами функций с помощью панели инструментов Fn UI :

Результатом нашей работы является функция, которая создает приложения ADF. Прелесть этого в том, что пользователь функции, вызывающий, просто использует Rest API через http, чтобы создать приложение, и вызывающему абоненту все равно, как и где будет выполнена эта работа. Но звонящий точно знает, что вычислительные ресурсы будут использоваться не дольше, чем это необходимо для выполнения работы.

В следующий раз мы попытаемся организовать функцию в Fn Flow.

Это оно!

Опубликовано на Java Code Geeks с разрешения Евгения Федоренко, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Fn Функция для создания приложения Oracle ADF

Мнения, высказанные участниками Java Code Geeks, являются их собственными.