LoginSignup
2

RESTゲートウェイのnodeMetadata設定を楽にするツールを作ってみた

Last updated at Posted at 2022-12-17

以下のようなツールを作って公開しました。(作成時間:約二時間)
機能は単純です。

YAMLファイルをJSONにして書き出すツールです。 引数オプションにより、既存のJSONへキーを追加することも出来ます。

以上です。

具体的な使い方

「RESTゲートウェイに任意のJSON拡張情報をもたせるnodeMetadata設定」の記事を参考に具体的な使い方をご紹介します。

ツールのインストール

yml-to-jsonをグローバルインストールします。

npm install -g yml-to-json

rest.ymlを準備

ファイル名は何でも良いです。

nodeMetadata:
  greeting: "こんにちは"
  message:  "テキストメッセージだよ"
  foo:
    bar: "バー"
    baz: 
      greeting: "Hello!"
      array: [1,2,3,4,5]

Symbolのノード構成に合わせるると以下の様な感じです。

image.png

書き換え先(追記先)のJSONファイルの確認

今回はRESTゲートウェイに任意のJSON拡張情報をもたせるので、以下のtarget/gateways/rest-gateway/rest.jsonを書き換えていきます。

target/gateways/rest-gateway/rest.jsonのパスを確認しておいてください
このパスは2022/12/18現在です。今後、仕様変更等でパスが変更になる可能性がありますので、その都度確認をしてください。

image.png

書き換え前の target/gateways/rest-gateway/rest.json の中身はこちら
{
  "network": {
    "name": "testnet",
    "description": "Symbol Sainet Network"
  },
  "port": 3000,
  "protocol": "HTTP",
  "sslKeyPath": "/symbol-workdir/restSSL.key",
  "sslCertificatePath": "/symbol-workdir/restSSL.crt",
  "crossDomain": {
    "allowedHosts": [
      "*"
    ],
    "allowedMethods": [
      "GET",
      "POST",
      "PUT",
      "OPTIONS"
    ]
  },
  "uncirculatingAccountPublicKeys": [],
  "extensions": [
    "accountLink",
    "aggregate",
    "lockHash",
    "lockSecret",
    "mosaic",
    "metadata",
    "multisig",
    "namespace",
    "receipts",
    "restrictions",
    "transfer"
  ],
  "db": {
    "url": "mongodb://db:27017/",
    "name": "catapult",
    "pageSizeMin": 10,
    "pageSizeMax": 100,
    "maxConnectionAttempts": 15,
    "baseRetryDelay": 750,
    "connectionPoolSize": 10
  },
  "apiNode": {
    "host": "node",
    "port": 7900,
    "tlsClientCertificatePath": "/symbol-workdir/api-node-config/cert/node.crt.pem",
    "tlsClientKeyPath": "/symbol-workdir/api-node-config/cert/node.key.pem",
    "tlsCaCertificatePath": "/symbol-workdir/api-node-config/cert/ca.cert.pem",
    "timeout": 1000,
    "networkPropertyFilePath": "/symbol-workdir/api-node-config/config-network.properties",
    "nodePropertyFilePath": "/symbol-workdir/api-node-config/config-node.properties"
  },
  "websocket": {
    "mq": {
      "host": "broker",
      "port": 7902,
      "monitorInterval": 500,
      "connectTimeout": 10000,
      "monitorLoggingThrottle": 60000,
      "maxSubscriptions": 300
    },
    "allowOptionalAddress": true
  },
  "throttling": {
    "burst": 80,
    "rate": 60
  },
  "logging": {
    "console": {
      "formats": [
        "colorize",
        "simple"
      ],
      "level": "verbose",
      "handleExceptions": true
    },
    "file": {
      "formats": [
        "prettyPrint"
      ],
      "level": "verbose",
      "handleExceptions": true,
      "filename": "/symbol-workdir/logs/catapult-rest.log",
      "maxsize": 20971520,
      "maxFiles": 100
    }
  },
  "numBlocksTransactionFeeStats": 300,
  "deployment": {
    "deploymentTool": "symbol-bootstrap",
    "deploymentToolVersion": "1.1.9.2",
    "lastUpdatedDate": "2022-12-12"
  }
}

ノードの停止

ツールの実行前にノードは停止しておきます。

symbol-bootstrap stop

yml-to-jsonでrest.ymlの値をrest.jsonへ追記

以下のコマンドを実行します。

yml-to-json rest.yml target/gateways/rest-gateway/rest.json 

問題がなければ以下のようになります。

image.png

※エラーが表示された場合には、変換元のrest.ymlか変換先のrest.jsonが存在していない可能性があるので確認してください。

引数オプションの説明

  • 第一引数(必須):変換元YAMLファイル
  • 第二引数(必須):第一引数で指定されたYAMLをJSONに変換後、第二引数で指定したファイルに追記する。既存のキーが存在する場合は上書きされるので注意。
  • 第三引数(オプション):第一引数で指定されたYAMLをJSONに変換後、第二引数で指定したファイルには追記せず、第三引数に指定されたファイルに書き出す(主に確認用)

正常に処理が終わると以下のように第二引数で指定したtarget/gateways/rest-gateway/rest.jsonに第一引数で指定したrest.ymlの値が追記されます。
※第三引数を指定すると第二引数で指定したファイルには追記せず、第三引数に指定されたファイルにJSONを書き出します。主に変更される箇所を確認したりする際に使ってください。

image.png

書き換え後の target/gateways/rest-gateway/rest.json の中身はこちら
{
  "network": {
    "name": "testnet",
    "description": "Symbol Sainet Network"
  },
  "port": 3000,
  "protocol": "HTTP",
  "sslKeyPath": "/symbol-workdir/restSSL.key",
  "sslCertificatePath": "/symbol-workdir/restSSL.crt",
  "crossDomain": {
    "allowedHosts": [
      "*"
    ],
    "allowedMethods": [
      "GET",
      "POST",
      "PUT",
      "OPTIONS"
    ]
  },
  "uncirculatingAccountPublicKeys": [],
  "extensions": [
    "accountLink",
    "aggregate",
    "lockHash",
    "lockSecret",
    "mosaic",
    "metadata",
    "multisig",
    "namespace",
    "receipts",
    "restrictions",
    "transfer"
  ],
  "db": {
    "url": "mongodb://db:27017/",
    "name": "catapult",
    "pageSizeMin": 10,
    "pageSizeMax": 100,
    "maxConnectionAttempts": 15,
    "baseRetryDelay": 750,
    "connectionPoolSize": 10
  },
  "apiNode": {
    "host": "node",
    "port": 7900,
    "tlsClientCertificatePath": "/symbol-workdir/api-node-config/cert/node.crt.pem",
    "tlsClientKeyPath": "/symbol-workdir/api-node-config/cert/node.key.pem",
    "tlsCaCertificatePath": "/symbol-workdir/api-node-config/cert/ca.cert.pem",
    "timeout": 1000,
    "networkPropertyFilePath": "/symbol-workdir/api-node-config/config-network.properties",
    "nodePropertyFilePath": "/symbol-workdir/api-node-config/config-node.properties"
  },
  "websocket": {
    "mq": {
      "host": "broker",
      "port": 7902,
      "monitorInterval": 500,
      "connectTimeout": 10000,
      "monitorLoggingThrottle": 60000,
      "maxSubscriptions": 300
    },
    "allowOptionalAddress": true
  },
  "throttling": {
    "burst": 80,
    "rate": 60
  },
  "logging": {
    "console": {
      "formats": [
        "colorize",
        "simple"
      ],
      "level": "verbose",
      "handleExceptions": true
    },
    "file": {
      "formats": [
        "prettyPrint"
      ],
      "level": "verbose",
      "handleExceptions": true,
      "filename": "/symbol-workdir/logs/catapult-rest.log",
      "maxsize": 20971520,
      "maxFiles": 100
    }
  },
  "numBlocksTransactionFeeStats": 300,
  "deployment": {
    "deploymentTool": "symbol-bootstrap",
    "deploymentToolVersion": "1.1.9.2",
    "lastUpdatedDate": "2022-12-12"
  },
  "nodeMetadata": {
    "greeting": "こんにちは",
    "message": "テキストメッセージだよ",
    "foo": {
      "bar": "バー",
      "baz": {
        "greeting": "Hello!",
        "array": [
          1,
          2,
          3,
          4,
          5
        ]
      }
    }
  }
}

ノードの起動

最後にノードを起動して変更が適応されたか確認します。

symbol-bootstrap run -d

http://(ノードURL):3000/node/matadata

ちょっと便利なところ

第二引数(必須):第一引数で指定されたYAMLをJSONに変換後、第二引数で指定したファイルに追記する。既存のキーが存在する場合は上書きされるので注意。

第二引数で指定されたJSONファイルに既存のキーが存在している場合、そのキーを上書きします。
どういうことかというと、例えば先程追記したrest.ymlファイルの中身を以下のように変更して実行するとtarget/gateways/rest-gateway/rest.jsonのnodeMetadataが更新されます。

rest.yml
nodeMetadata:
  message:  "今日も一日..."
  after:
    five: "飲みに行くぞ!"

再実行

yml-to-json rest.yml target/gateways/rest-gateway/rest.json

nodeMetadataキーの値が書き換わりましたね!便利!

target/gateways/rest-gateway/rest.json
{
  "network": {
    "name": "testnet",
    "description": "Symbol Sainet Network"
  },
  
...省略

  "deployment": {
    "deploymentTool": "symbol-bootstrap",
    "deploymentToolVersion": "1.1.9.2",
    "lastUpdatedDate": "2022-12-12"
  },
  "nodeMetadata": {
    "message": "今日も一日...",
    "after": {
      "five": "飲みに行くぞ!"
    }
  }
}

ツールについての注意点

このツールは主に自分用に作っています。
エラー処理やオプション等の実装は正直手抜きです。(制作時間二時間ですから。。。)使用の際にはその点理解して使ってください。
ツールは予告なくバージョンアップしていきますのでご了承ください。
また、本ツールに関するいかなる保証および賠償を行いません。
従って本ツールに関して発生した問題は、使用者の責任および費用負担によって処理されるものとします。

最後に

なぜ作ったか? ということなのですが...単純にYAMLの方が慣れ親しんでいるからです。
あと、SymbolノードのカスタムプリセットもYAMLなので、そっちに合わせたほうが管理し易いと思ったのもあります。
かたやYAM、かたやJSON...と管理するのは面倒ですよね?(私は面倒だった...)

ちなみに、ノードが動かなくなったら下記のコマンドでrest.jsonを初期化出来ます。

symbol-bootstrap stop
symbol-bootstrap config --upgrade
symbol-bootstrap run -d

参考:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2