Solrのパッケージ管理機能を使って自作プラグインを設定する

はじめに

Solr 8.4 で追加されたパッケージ管理機能を使って自作のプラグインを動的に設定してみます。ただし、Solr 8.4 では自作プラグインのインストールの際にキー読み込み関係のエラーが発生したので、今回の動作確認は Solr 8.5 で行っています。

作ったプラグイン

その名の通り、何もしないリクエストハンドラです。”Hello World!” のメッセージとバージョン番号を応答するだけです。これをコンパイルして plugin-nop-1.0.jar というファイルを作成しました。

リポジトリ登録

キー作成

$ openssl genrsa -out my_key.pem 512
$ openssl rsa -in my_key.pem -pubout -outform DER -out publickey.der
$ openssl dgst -sha1 -sign my_key.pem ../build/plugin-nop-1.0.jar | openssl enc -base64 | tr -d \\n
KzDSHoBGofrRbN2iRMZEnQEGArN7evEOELDsEPuFsYKRw7eQ11veFUvo5y3r0msqBPpCs8Fga4eJMxjDJyOzIA==

repository.json

Solr のソースコードに含まれる solr/core/src/test-files/solr/question-answer-repository/repository.json を参考にして作成しました。

上で作成したメッセージダイジェストの文字列を artifacts の sig に記載します。

ウェブサーバへ配置

Jarファイル、publickey.der、repository.json をウェブサーバに配置します。publickey.der と repository.json はこのファイル名である必要があります。

$ ls $DOC_ROOT/solr/repo2
plugin-nop-1.0.jar  publickey.der  repository.json

リポジトリをSolrに登録

$ bin/solr package add-repo nop http://localhost/solr/repo2/
$ bin/solr package list-available
Available packages:
-----
nop 		No Operation plugin
	Version: 1.0.0

パッケージのインストールとデプロイ

インストール

$ bin/solr package install nop:1.0.0
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":11}}
nop installed.

デプロイ

$ bin/solr package deploy nop:1.0.0 -collections test
Executing {"add-requesthandler":{"name":"/nop","class":"nop:jp.co.splout.solr.plugins.NopRequestHandler"}} for path:/api/collections/test/config
Execute this command (y/n): 
y
Executing http://localhost:8983/api/collections/test/config/requestHandler?componentName=/nop&meta=true for collection:test
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "config":{"requestHandler":{"/nop":{
        "name":"/nop",
        "class":"nop:jp.co.splout.solr.plugins.NopRequestHandler",
        "_packageinfo_":{
          "package":"nop",
          "version":"1.0.0",
          "files":["/package/nop/1.0.0/plugin-nop-1.0.jar"],
          "manifest":"/package/nop/1.0.0/manifest.json",
          "manifestSHA512":"794a594729c8772073338aa03bbe41866d68bf76527d2a9568779c00ca4802bf362841073d323d16ce9f44cd38757371b591c5afe96876fe65a4e7c6a3f1eb89"}}}}}

Actual: 1.0.0, expected: 1.0.0
Deployed on [test] and verified package: nop, version: 1.0.0
Deployment successful

動作確認

$ curl http://localhost:8983/solr/test/nop
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "message":"Hello, World!",
  "version":"1.0"}

パッケージのアップデート

NopRequestHandler.java のバージョン文字列を “1.1” に変更して plugin-nop-1.1.jar を作成しました。これをリポジトリに追加してデプロイします。

リポジトリへの追加

まず電子署名を作成します。

$ openssl dgst -sha1 -sign my_key.pem ../build/plugin-nop-1.1.jar | openssl enc -base64 | tr -d \\n
zlEAXf6hKNbmjAW48noLyMiilESOuPXmsA4xZ5L+zYwYOX3aIuW1SnmFa+VrRMSKwk76xG+PomTX2ELmHiOvtg==

plugin-nop-1.1.jar をウェブサーバに配置して repository.json に以下を追加します。

      {
        "version": "1.1.0",
        "date": "2020-04-21",
        "artifacts": [
          {
            "url": "plugin-nop-1.1.jar",
            "sig": "zlEAXf6hKNbmjAW48noLyMiilESOuPXmsA4xZ5L+zYwYOX3aIuW1SnmFa+VrRMSKwk76xG+PomTX2ELmHiOvtg=="
          }
        ],
        "manifest": {
          "version-constraint": "8 - 9",
          "plugins": [
            {
		"name": "request-handler",
              "setup-command": {
                "path": "/api/collections/${collection}/config",
                "payload": {"add-requesthandler": {"name": "${RH-HANDLER-PATH}", "class": "nop:jp.co.splout.solr.plugins.NopRequestHandler"}},
                "method": "POST"
              },
              "uninstall-command": {
                "path": "/api/collections/${collection}/config",
                "payload": {"delete-requesthandler": "${RH-HANDLER-PATH}"},
                "method": "POST"
              },
              "verify-command": {
                "path": "/api/collections/${collection}/config/requestHandler?componentName=${RH-HANDLER-PATH}&meta=true",
                "method": "GET",
                "condition": "$['config'].['requestHandler'].['${RH-HANDLER-PATH}'].['_packageinfo_'].['version']",
                "expected": "${package-version}"
              }
            }
          ],
          "parameter-defaults": {
            "RH-HANDLER-PATH": "/nop"
          }
        }
      }
$ bin/solr package list-available
Available packages:
-----
nop 		No Operation plugin
	Version: 1.0.0
	Version: 1.1.0

インストールとデプロイ

後の流れはほぼ同じです。

$ bin/solr package install nop:1.1.0
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":7}}
nop installed.
$ bin/solr package deploy nop:1.1.0 -collections test --update
Executing http://localhost:8983/api/collections/test/config/requestHandler?componentName=/nop&meta=true for collection:test
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "config":{"requestHandler":{"/nop":{
        "name":"/nop",
        "class":"nop:jp.co.splout.solr.plugins.NopRequestHandler",
        "_packageinfo_":{
          "package":"nop",
          "version":"1.1.0",
          "files":["/package/nop/1.1.0/plugin-nop-1.1.jar"],
          "manifest":"/package/nop/1.1.0/manifest.json",
          "manifestSHA512":"794a594729c8772073338aa03bbe41866d68bf76527d2a9568779c00ca4802bf362841073d323d16ce9f44cd38757371b591c5afe96876fe65a4e7c6a3f1eb89"}}}}}

Actual: 1.1.0, expected: 1.1.0
Deployed on [test] and verified package: nop, version: 1.1.0
Deployment successful
$ curl http://localhost:8983/solr/test/nop
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "message":"Hello, World!",
  "version":"1.1"}

無事にバージョン1.1にアップデートできました。

コメント