CodeReady Workspace 備忘録

Failure in creating/running a workspace

  • Failed to pull image "registry.redhat.io/codeready-workspaces/theia-rhel8 nvalid username/password: unauthorized:

    -> change tag via plugins / editor etc.

plugin

Introduction to Eclipse Che | Eclipse Che Documentation

F1 -> plugin で補完 -> Plugin Manager: Add Registry -> 名前(適当)、vsixのURI 入れる

Using a Visual Studio Code extension in Che https://docs.google.com/document/d/1gZHKXe1GEduY48RgntMUrqjSs9llq8WpCmgqssY5Ikw/edit#heading=h.s7tesxgcl8k3

How to add extensions and plugins to Eclipse Theia - EclipseSource

Kafka備忘録

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

bin/kafka-server-start.sh -daemon config/server.properties

tail -f logs/server.log


bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic alerts

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic alerts

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic alerts


bin/kafka-server-stop.sh

bin/zookeeper-server-stop.sh

Droolsブログ : 12 Kogito Examples

12 Kogito Examples

Kogito 0.9.1 がリリースされました!

f:id:tokobayashi:20200423143925p:plain

別に切りのいい数字じゃないって? や、そうなんですけど、0.9.1 はドキュメントや examples を整備して「いい感じに仕上げました」マイルストーンリリースなのです。今後もバージョン自体はどんどん上がっていくのですが(0.10.0 もう出た)、今まで様子見だったひともここらで手を出してみては?というところです。

ドキュメントはこちら。英語だけど https://www.deepl.com/translator にぶっこめば OK!

https://docs.jboss.org/kogito/release/latest/html_single/

今回は Kogito がどんなものか体験するため kogito-examples をざっと紹介します。

まず clone します。デフォルトで stable ブランチになっています。このブランチが最新安定バージョン(現時点で 0.9.1)です。

git clone https://github.com/kiegroup/kogito-examples.git
cd kogito-examples

中にはたくさんのサンプルがあります。どのサンプルにも README.md があり、実行コマンド、テスト用の curl コマンドが記載されています。

Quarkus 用のサンプルを紹介しますが、それぞれ対になる Spring Boot 用のサンプルもあります。内容はほとんど同じで、起動コマンドが違うだけです。

ruleunit-quarkus-example

基本的なルール実行サービスです。ローン申請ファクト(LoanApplication)を POST すると、承認された申請が返ってきます。

mvn clean compile quarkus:dev

で、起動。起動したら次の curl コマンドでテストできます。

curl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"maxAmount":5000,"loanApplications":[{"id":"ABC10001","amount":2000,"deposit":100,"applicant":{"age":45,"name":"John"}}, {"id":"ABC10002","amount":5000,"deposit":100,"applicant":{"age":25,"name":"Paul"}}, {"id":"ABC10015","amount":1000,"deposit":100,"applicant":{"age":12,"name":"George"}}]}' http://localhost:8080/find-approved

ソースコードを説明すると

  • RuleUnitQuery.drl : ルールを記述する DRL。ポイントは「unit LoanUnit;」という宣言です。これで LoanUnit クラスと組み合わせて、サービス全体を生成できるようにします。ルールの「/loanApplications[]」という記法は LoanUnit クラスの DataStore loanApplications からファクトを評価するということですが、通常の DRL での「LoanApplication()」パターンと同じだと思っていいです。また DRL に「query」も記述されています。これが上記テストで使用した REST エンドポイントを生成します。
  • LoanApplication.java : ローン申請ファクト
  • Applicant.java : 申請者情報。LoanApplication のただのプロパティです
  • LoanUnit.java : RuleUnitData を implements します。今までの Drools では使われていなかった(実際には存在していましたが)ルールユニットという仕組みです。仕組みといっても簡単にいうとルールとファクトを結び付けるもので、 DataStore というクラスでファクトをラップするだけです。「maxAmount」は DRL で global として扱われます。この情報を DRL 側に書いて、このクラスを不要にする記法もあります。

その他の必要なコードは quarkus:dev で生成されます。target/ の下を見てみると面白いでしょう。

README.md には dev じゃない実行や GraalVM による native ビルドについても記載されています。

OpenShift/Red Hat CodeReady Container 上での実行についてもまた後日書くつもりですが、手順のみならこちら(https://tkobayas.wordpress.com/2020/03/23/simple-steps-to-run-kogito-on-red-hat-codeready-containers/)を参照ください

dmn-quarkus-example

DRL の代わりに DMN を使ったサービスです。DMN についてはまた後日ブログを書く予定ですが、とりあえず実行してみましょう。交通違反情報を POST すると罰金や免許停止かどうかが返ってきます。

mvn clean compile quarkus:dev

起動したら

curl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"Driver":{"Points":2},"Violation":{"Type":"speed","Actual Speed":120,"Speed Limit":100}}' http://localhost:8080/Traffic%20Violation

ソースコードは dmn ファイル1枚だけ!

f:id:tokobayashi:20200423144022p:plain

process-script-example

スクリプトタスクのみのシンプルなプロセスサービス。お気づきかもしれませんが、DroolsjBPM といった名前は前面には出していません(実際に依存ライブラリ名には出てきますが)。ルールもプロセスもひっくるめて Kogito という考え方です。

mvn clean compile quarkus:dev

起動したら

curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"name" : "john"}' http://localhost:8080/scripts

簡単過ぎですかね。これをベースにプロセスを拡張していってもいいでしょう。こちらもソースは bpmn ファイル一枚のみ。

  • scripts.bpmn : BPMN も VSCode のエクテンションやオンラインエディターで閲覧、編集します。jBPM/BPMN 関連もまた後日詳しく書きたいなあー

f:id:tokobayashi:20200423144037p:plain

その他

ruleunit-quarkus-example のデシジョンテーブル版 decisiontable-quarkus-example や、ルールとプロセスを融合した process-business-rules-quarkus 、プランニングの process-optaplanner-springboot などなどあります。

一番本格的なやつは kogito-travel-agency で、Infinispan による永続化、Kafka によるメッセージ連携、データを GraphQL で取得などさまざまな機能を体験できます。OpenShift にデプロイするにはドキュメントの以下のセクションを参照してください。

https://docs.jboss.org/kogito/release/latest/html_single/#con-kogito-travel-agency_kogito-deploying-on-openshift

Droolsブログ : 11 Kie Server

11 Kie Server

ここまでルールエンジンを実行するために直接 Java コードを書いてましたが、REST API での実行も可能です。その場合 REST エンドポイントを公開するための Web アプリが必要です。そのために Kie Server という Web アプリが提供されています。Kie Server は以下のようなことができます。

  • KJAR のデプロイ、アンデプロイ、スタート、ストップ(Business Central または REST API で管理)
  • KJAR のリモート実行(ルール、プロセス、ソルバー)
  • REST または JMS に対応
  • ペイロードは JAXB, JSON, XSTREAM に対応
  • 上記プロトコルをラップした Java クライアント API を提供

などなど。

Kie Server はアプリケーションサーバーにデプロイすることで、ルールエンジンサーバーとして動作します。クライアントは REST API でファクトをインサート、ルール実行、結果の取得を行います。ルールエンジンを Kie Server 側にすることでクライアントは CPU/メモリ消費を分離、軽量化することができます。

Kie Server は単独でも利用可能ですが、Business Central により GUI 管理することができます。Kie Server と Business Central は異なるサーバーで運用可能で、本番稼動時にはそのほうがおすすめですが、開発時には同一サーバーで利用もできます。

では使ってみましょう。

前回 10 Business Central で使った WildFly に Kie Server をデプロイしていきます。WildFly + Business Central のセットアップは前回記事を参照してください!

こちらのリンクの「KIE Server WARS」から「ee7, ee8, webc WAR」をクリックし、kie-server-7.XX.0.Final-ee8.war をダウンロードします。

https://www.drools.org/download/download.html

2020年3月現在で 7.33.0.Final が最新バージョンですが、前回記事で 7.32.0.Final を使って進めているのでここでは 7.32.0.Final の WAR をダウンロードします(が、後からこのブログを読んだ人は最新バージョンを使ってね!)。 7.32.0.Final の WAR のリンクはこちらです。

https://repo1.maven.org/maven2/org/kie/server/kie-server/7.32.0.Final/kie-server-7.32.0.Final-ee8.war

wildfly-14.0.1.Final/standalone/deployments の下に WAR をコピーします。

さて、WildFly を起動する前に2つやることがあります。

1) WAR名変更

アクセス時の URL を簡単にするために WAR 名を変更します。必須ではないですが、変更しない場合、以下の説明の URL は適宜読み替えて下さい。

  • business-central-7.32.0.Final-wildfly14.war -> business-central.war
  • kie-server-7.32.0.Final-ee8.war -> kie-server.war

2) システムプロパティ

以下のシステムプロパティを standalone-full.xml に追加してください。ユーザは前回記事で作成したとおりです。ロール kie-server を持たせておくのを忘れないように。パスワードはサンプルなので平文ですが、もちろん隠すことも出来ます。詳しくは WildFly のドキュメントを参照ください。

  <system-properties>
    <property name="org.kie.server.controller" value="http://localhost:8080/business-central/rest/controller"/>
    <property name="org.kie.server.controller.user" value="rhdmAdmin"/>
    <property name="org.kie.server.controller.pwd" value="password1!"/>
    <property name="org.kie.server.id" value="default-kieserver"/>
    <property name="org.kie.server.location" value="http://localhost:8080/kie-server/services/rest/server"/>
    <property name="org.kie.server.user" value="rhdmAdmin"/>
    <property name="org.kie.server.pwd" value="password1!"/>
  </system-properties>

では WildFly を起動します。Kie Server が MDB を使用するので、今回は standalone-full.xml を使います。

$ ./standalone.sh -c standalone-full.xml

起動には少々時間がかかります。。。Kie Server デプロイ後もごにょごにょログがでます。

17:51:25,241 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 45) WFLYSRV0010: Deployed "kie-server.war" (runtime-name : "kie-server.war")
...

まずは Business Central が Kie Server を認識しているか確認してみましょう。

http://localhost:8080/business-central/

[メニュー]->[デプロイ]->[実行サーバー] で確認できます。"default-kieserver" が見えるはずです。この名前はシステムプロパティで設定したものです。

f:id:tokobayashi:20200305160150p:plain

さて、前回記事でプロジェクト helloProject を作っていたのでそれをデプロイします。プロジェクトが無い人は前回記事を参考に作ってください(テストシナリオは不要です)。

そしてデプロイ前に1点、プロジェクトに追加することがあります。それはステートレス ksession を設定することです。「実行して結果を受け取って終了」というユースケースではステートレス ksession のほうが適切です。また Kie Server ではそのような使い方が推奨です。Kie Server でステートフル ksession を使うことも可能ですが、障害時のハンドリングなどが困難になります。ステートレス ksession については 04 ステートレス ksession をご覧ください。

さてステートレス ksession の設定ですが、Business Central で以下のように進めます。

  • プロジェクトの [設定]タブ -> [KIE bases] から「KIE ベースの追加」をクリック
  • 名前に「mykbase」と入力
  • その kbase 設定の右のほうに「KIE sessions」というリンクがあるのでそれをクリック
  • ポップアップが出るので、「KIE session を追加」をクリック
  • 名前に「myksession」と入力 f:id:tokobayashi:20200305160155p:plain
  • その右のボックスにはデフォルトで「stateless」とあるのでそのままでOK
  • 「完了」をクリック。ポップアップが閉じる
  • 左下の「保存」をクリック

ここまで来たらビルドして Kie Server にデプロイします。右上の「デプロイ」ボタンをクリックしてください。成功すれば「サーバー設定へのデプロイに成功し、コンテナの開始に成功しました。」というポップアップがでます。「helloProject_1.0.0-SNAPSHOT」という名前のデプロイメントユニット(コンテナとも呼ばれます)が作成され、開始されていることも確認できます。

f:id:tokobayashi:20200305160158p:plain

では実行してみましょう!

以下の curl コマンドで、Person オブジェクトを insert します。明示的に fireAllRules と言っていませんが、ステートレスの場合、自動的に fireAllRules もやってくれます。

curl -u rhdmAdmin:password1! -X POST -H 'Content-Type: application/json' http://localhost:8080/kie-server/services/rest/server/containers/instances/helloProject_1.0.0-SNAPSHOT -d '{"lookup":"myksession","commands":[{"insert":{"object":{"com.myspace.helloproject.Person":{"name":"太郎","age":30,"adult":false}},"out-identifier":"fact-1"}}]}'

次のようなレスポンスが返ってきます。

{
  "type" : "SUCCESS",
  "msg" : "Container helloProject_1.0.0-SNAPSHOT successfully called.",
  "result" : {
    "execution-results" : {
      "results" : [ {
        "value" : {"com.myspace.helloproject.Person":{
  "name" : "太郎",
  "age" : 30,
  "adult" : true
}},
        "key" : "fact-1"
      } ],
      "facts" : [ {
        "value" : {"org.drools.core.common.DefaultFactHandle":{
  "external-form" : "0:1:155540311:155540311:1:DEFAULT:NON_TRAIT:com.myspace.helloproject.Person"
}},
        "key" : "fact-1"
      } ]
    }
  }
}

ルールが実行されて adult が true になってますね。

Red Hat CodeReady Containers 備忘録

インストール

developers.redhat.com

crc setup

crc config set memory 12000
crc start

eval $(crc oc-env)

crc config は crc start の前にする。すでに作っていたら、一回 crc delete する必要がある(v 1.4.0 現在)

[BUG] The crc start -m option only works the first time the VM is created · Issue #809 · code-ready/crc · GitHub

version up

ERRO Error creating host: Error creating the VM: Error creating machine: Error in driver during machine creation: virError(Code=9, Domain=20, Message='operation failed: domain 'crc' already exists with uuid 2fecb995-b740-4b38-9c10-cf7c50087fc1') 
sudo virsh undefine crc

trouble shooting

FATAL Failed to check if libvirtd service is active 

$ sudo systemctl restart libvirtd
FATAL Bundle 'crc_libvirt_4.3.0.crcbundle' was requested, but the existing VM is using 'crc_libvirt_4.3.8.crcbundle' 

$ crc delete

コンソール

crc console

kube:admin をクリック -> kubeadmin でログイン

htpasswd_provider をクリック -> developer でログイン

リモートアクセス

How to access CRC or apps deployed on CRC remotely · Issue #705 · code-ready/crc · GitHub

Droolsブログ : 10 Business Central

10 Business Central

Drools には Business Central という強力な Web UI ツールが付いています。以下、機能を列挙しますと

  • ルール、デシジョンテーブル、データオブジェクト、プロセスなど、ファイルの管理
  • プロジェクトの管理
  • ルール、デシジョンテーブル、データオブジェクト、プロセスなどのエディター
  • テストシナリオの作成、実行
  • プロジェクトから kjar をビルド、kie-server(後日解説)へのデプロイ
  • kie-server インスタンスの管理
  • ロールベースのアクセス制限
  • プロセス、タスクの実行(jBPM)
  • プロセスインスタンスの監視(jBPM)

などなど。

ファイルは Git でバージョン管理されており、他の Git クライアントとの連携ももちろん出来ます。

ちなみに Workbench, Decision Central などの呼び名もありますが、「Business Central」で統一する方向のようです。

では使ってみましょう。

こちらのリンクの「Business Central Workbench」から「WildFly 14 WAR」をダウンロードします。

https://www.drools.org/download/download.html

WildFly 本体はこちらからダウンロードします。(EAP でも OK です)

https://wildfly.org/downloads/

最新の WildFly 18.0.1.Final でも動作しましたが、ちょっとエラーが出るようです。今回は 14.0.1.Final でやります。「14.0.1.Final」の「Java EE Full & Web Distribution」をダウンロードします。

wildfly-14.0.1.Final.zip を解凍したら wildfly-14.0.1.Final/standalone/deployments の下に先ほどダウンロードした business-central-7.32.0.Final-wildfly14.war コピーします。

wildfly-14.0.1.Final/bin に移動し、add-user.sh でユーザを作成します (Windows の人は適宜 bat に読み替えて下さい) b) Application User の方です。ユーザ名は何でも構いません。ロールは admin,kie-server,rest-all を与えます。

$ ./add-user.sh 

What type of user do you wish to add? 
 a) Management User (mgmt-users.properties) 
 b) Application User (application-users.properties)
(a): b

Enter the details of the new user to add.
Using realm 'ApplicationRealm' as discovered from the existing property files.
Username : rhdmAdmin
...
Password : 
Re-enter Password : 
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[  ]: admin,kie-server,rest-all
About to add user 'rhdmAdmin' for realm 'ApplicationRealm'
Is this correct yes/no? yes
...
yes/no? yes
...

また WildFly デフォルトの -Xmx と -XX:MaxMetaspaceSize は少ないのでそれぞれ 2G くらいに増やしておきます。

bin/standalone.conf

   JAVA_OPTS="-Xms64m -Xmx2g -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2g -Djava.net.preferIPv4Stack=true"

では WildFly を起動します。

$ ./standalone.sh

デプロイには少々時間がかかります。。。

...
16:36:52,739 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 42) WFLYSRV0010: Deployed "business-central-7.32.0.Final-wildfly14.war" (runtime-name : "business-central-7.32.0.Final-wildfly14.war")

以下の URL でアクセスします。

http://localhost:8080/business-central-7.32.0.Final-wildfly14

先ほど作ったユーザでログインします。 f:id:tokobayashi:20200207155133p:plain

まず最初に日本語UIに変更しておきましょう。右上の歯車アイコンをクリックし、Settings メニューから「Languages」をクリック、セレクトボックスから「Japanese」を選んで OK をクリックしてください。 f:id:tokobayashi:20200207155153p:plain

日本語になりましたね!

ではプロジェクトを作っていきましょう。 [メニュー]->[プロジェクト] をクリックすると「スペース」という画面になります。スペースというのは複数のプロジェクトをまとめる単位です。デフォルトで「MySpace」というスペースがあるのでそれを使います。「MySpace」をクリックすると。。。 f:id:tokobayashi:20200207155210p:plain

どーんと「ここには何もありません」と表示されますね。「プロジェクトの追加」からプロジェクトを作成します。ちなみに「サンプルを試す」で様々なサンプルを見ることができます。ルール関連だと「Mortgages」サンプルがおすすめです。

「プロジェクトの追加」をクリックするとポップアップが出るのでプロジェクト名を決めます。ここでは helloProject とします。プロジェクトが作成されてもまだ空っぽなので「ここには何もありません」と表示されています。

データオブジェクト(= POJO)を作ってみましょう。「アセットの追加」をクリックします。様々なアセットを作成できます。「データオブジェクト」をクリックするとポップアップが出ます。データオブジェクト名を Person 、パッケージを com.myspace.helloproject とし、OK をクリックします。 データオブジェクトを作ってみましょう。「アセットの追加」をクリックします。様々なアセットを作成できます。「データオブジェクト」をクリックするとポップアップが出ます。データオブジェクト名を Person 、パッケージを com.myspace.helloproject とし、OK をクリックします。

この画面でデータオブジェクトのフィールドを追加できます。「フィールドを追加」から

  • name を String
  • age を int
  • adult を boolean

。。。 と追加していきます。最後に「保存」を忘れずに!

「ソース」タブをクリックすればわかるように、これは単純に Java ソースを作ってくれるものです。この画面でデータオブジェクトを作成する以外にも、別途必要なクラスを持った jar ファイルを dependency に設定することでそのクラスをルールで使えます。 f:id:tokobayashi:20200207155236p:plain

続いてルールを書きます。

「アセットの追加」(プロジェクトが空っぽじゃないときは右上にボタンがあるよ!)をクリックして「ガイド付きルール」を選択します。ルール名は helloPerson 、パッケージは com.myspace.helloproject とします。「ガイド付きルール」というのは GUI でルールを書くというものです。右端の方にあるプラスアイコンをクリックして WHEN や THEN の中身を追加していきます。まず WHEN のプラスアイコンをクリック、「条件をルールに追加...」から「Person」を選択します。するとルールに「Person があります」という文が追加されます。そこから詳細を設定していきます。

  • 「Person があります」をクリック、「フィールドに制限を追加」 -> age を選択
  • age の右のセレクトボックスから「は次の値よりも大きい」を選択
  • その右のえんぴつアイコンをクリック -> 「固定値」をクリック
  • テキストボックスに 20 を入力
  • 「Person があります」をクリック、「変数名」のテキストボックスに $p を入力し「設定」をクリック

続いて THEN のプラスアイコンをクリック、「$p のフィールド値を変更」を選択、「Person [$p] の値 設定」という文が追加されるのでそれをクリックし、セレクトボックスから adult を追加し、値に true を選択します。最後に「保存」。 f:id:tokobayashi:20200207155252p:plain

「ソース」タブを見ればわかるように、これは DRL を作成してくれます。

続いてテストシナリオを書きます。「アセットの追加」->「テストシナリオ」、名前は testscenario1 、パッケージは com.myspace.helloproject とします。

  • 「GIVEN」列の「INSTANCE1」をクリック、右の「テストツール」パネルから「Person」を選択、「Insert Data Object」をクリック
  • すると「INSTANCE1」が「Person」に変化します。次はその下のセルをクリックし、「テストツール」パネルから name を選択、「Insert Data Object」をクリック
  • するとそのセルが「name」に変化。そのセルを右クリックし、「右に列を挿入」を選択
  • すると右にセルが増えるので、同様に「テストツール」パネルから age を選択、「Insert Data Object」をクリック
  • 「EXPECT」列も同様に INSTANCE を「Person」に、PROPERTY は「adult」を指定(列は増やさない)
  • 1行目は name「太郎」、age「35」、adult「true」で、値を入力
  • 右クリック「行を下に挿入」で行を増やせるので2行目は name「次郎」、age「18」、adult「false」にする
  • 保存
  • メニュー中央の三角(再生)ボタンをクリック!右側に結果が出ます。テストシナリオでルールが正しく動いていることを検証できました。

f:id:tokobayashi:20200207155308p:plain

Business Central の機能はまだまだたくさんありますが、今回はここまで!