はじめに
RescaleCLIマニュアルを日本語に訳しました(ほとんどGoogle翻訳)。ラフにですが、日本語に問題がないかざっとは確認済みです。体裁にバラツキがまだありますが、時間があるときに改善します。まずは一旦公開しますね!
RescaleCLI 日本語マニュアル
Rescale クライアントアプリケーション(「The App」)は、RescaleAPI を明示的に知らなくても、Rescaleにジョブを送信するための Java based クライアントアプリケーションです。 RescaleAPI 用の簡単なコマンドラインユーティリティを提供するだけでなく、ファイルを Rescale Data Store に直接アップロードするための マルチスレッド転送ライブラリも統合しています。またデータのダウンロードも、ブラウザを使うより高速です。同時に、Rescale データストアからのファイルの Upload/Download に関連するすべての認証も処理します。 アプリケーションにはいくつかの主な機能があります:
- 送信
- 現在の作業ディレクトリにあるジョブを Rescale に送信する
- ステータス
- Rescale で実行中のジョブのステータスを取得します。
- 同期
- ジョブの出力ファイルをハードディスクに同期する
APIトークンの取得
API を使用するには、APIトークンが必要です。Rescale アカウントのトークンを発行してAPIアクセスのアカウントを有効にするにはこちらを参照ください、何らかの理由で、トークンが発行できない場合は、Rescale アカウントのトークンを発行してAPIアクセスのアカウントを有効にするには、Rescale にお問い合わせください。(私、daisuke@rescale.com 宛てでも良いです)
Rescaleクライアントアプリケーションを使用したジョブの送信
ジョブは、次のコマンドを使用して送信できます(クライアント・アプリケーションの jarfileがrescale.jarに名前が変更されたものとします)。
API_TOKEN='<Your API Key>'
RUN_SCRIPT='<Your input-script>'
JP="https://platform.rescale.jp/"
java -jar rescale.jar submit -X ${JP} -p ${API_TOKEN} -i ${RUN_SCRIPT}
APIに大きな変更が加えられていない限り、使用可能な他のフラグ/スイッチはいくつかありますが、実際には使用できません。ユーザーが Rescale にジョブを送信するためのラッパースクリプトを作成すると便利です。
- 以下は bash の例で
/usr/local/bin/
などのPATHの設定された場所に、rescale-submit
という名前で、ファイルに保存することとします。 - またAPI_TOKENを直接ソースコードにハードコーディングは望ましくないので、環境変数から読み込むよううにします。
rescale-submitスクリプトの作成
export RESCALE_API_TOKEN='<Your API Key>'
# !/bin/bash
JP="https://platform.rescale.jp/"
java -jar /usr/local/bin/rescale.jar -X ${JP} submit -p ${RESCALE_API_TOKEN} -E -i $1
この場合、jarファイルは /usr/local/bin/rescale.jar
にあります。 ユーザーは単純なコマンドを使用してジョブを送信できます(このラッパースクリプトが作成されていることが前提です)。
RUN_SCRIPT='<Your input-script>'
rescale-submit ${RUN_SCRIPT}
この場合の ${RUN_SCRIPT}
には、ユーザーが Rescale で実行したいコマンドが含まれており、コマンドラインから実行できる任意の種類の ".sh" スクリプトにすることができます。スクリプトは、長い送信スクリプトまたは単純なonelinerスクリプトです。
スクリプトの種類にかかわらず、アプリケーションは環境設定やサポートされていないコマンドに関する不注意な問題を最小限に抑えるためにスクリプトを解析しようとします。
Hello World
非常に簡単な例を見てみましょう。 Hello World ジョブを実行するには、ローカルマシン上でシェル端末を開きます。
mkdir helloworld
cd helloworld
vi submit.sh
submit.shに次の行を追加してください
# !/bin/sh -f
# RESCALE_NAME="HelloWorld"
# RESCALE_CORES=1
echo "Hello World!" > hello_world
sleep 1000
入力ファイルをいくつか作成します:
echo "file 0" > file0
mkdir inputs
echo "file 1" > inputs/file1
echo "file 2" > inputs/file2
ジョブをサブミットします:
RUN_SCRIPT='submit.sh'
rescale-submit ${RUN_SCRIPT}
2017-01-10 00:09:12,468 - Running SGE version of Rescale Client App
2017-01-10 00:09:12,479 - Executing Command.
2017-01-10 00:09:12,481 - Parsing Input Files
2017-01-10 00:09:12,482 - No existing files to include
2017-01-10 00:09:13,591 - No core type specified by user. Using default core type 'Nickel'
2017-01-10 00:09:13,594 - Did not find explicitly specified analysis, checking implicitly selected analyses
2017-01-10 00:09:13,594 - No implicitly selected analyses, assuming user-included analysis
2017-01-10 00:09:13,596 - Zipping Files
2017-01-10 00:09:13,597 - Creating temporary encrypted zip at /Users/daisuke/dev/RescaleCLI/helloworld/input.zip
2017-01-10 00:09:13,615 - Finished writing encrypted file
2017-01-10 00:09:13,615 - Uploading Files
2017-01-10 00:09:13,617 - Uploading: /Users/daisuke/dev/RescaleCLI/helloworld/run.sh
2017-01-10 00:09:13,618 - Uploading run.sh:
2017-01-10 00:09:16,260 - ##############################| 112B / 112B
2017-01-10 00:09:16,677 - Uploading: /Users/daisuke/dev/RescaleCLI/helloworld/input.zip
2017-01-10 00:09:16,677 - Uploading input.zip:
2017-01-10 00:09:16,906 - ##############################| 1.13KB / 1.13KB
2017-01-10 00:09:17,265 - Job: Saving Job
2017-01-10 00:09:18,139 - Job oswvm: Saved
2017-01-10 00:09:18,139 - Job oswvm: Submitting
2017-01-10 00:09:18,717 - Job oswvm: Starting polling cycle
2017-01-10 00:10:19,045 - Job oswvm: Status - Validated
2017-01-10 00:11:19,261 - Job oswvm: Status - Validated
2017-01-10 00:12:19,523 - Job oswvm: Status - Validated
2017-01-10 00:13:19,826 - Job oswvm: Status - Validated
2017-01-10 00:14:20,130 - Job oswvm: Status - Executing
2017-01-10 00:15:20,417 - Job oswvm: Status - Executing
2017-01-10 00:16:20,673 - Job oswvm: Status - Executing
2017-01-10 00:17:21,026 - Job oswvm: Status - Executing
2017-01-10 00:18:21,297 - Job oswvm: Status - Executing
2017-01-10 00:19:21,548 - Job oswvm: Status - Completed
2017-01-10 00:19:21,548 - Job oswvm: Finished...
2017-01-10 00:19:21,548 - Job oswvm: Downloading files to /Users/daisuke/dev/RescaleCLI/helloworld/output
2017-01-10 00:19:22,004 - Downloading output/inputs/file2
2017-01-10 00:19:22,005 - Downloading file2:
2017-01-10 00:19:24,306 - ##############################| 16B / 16B
2017-01-10 00:19:24,307 - Downloading output/hello_world
2017-01-10 00:19:24,307 - Downloading hello_world:
2017-01-10 00:19:24,497 - ##############################| 32B / 32B
2017-01-10 00:19:24,497 - Downloading output/rescale-submit.sh
2017-01-10 00:19:24,497 - Downloading rescale-submit.sh:
2017-01-10 00:19:24,698 - ##############################| 160B / 160B
2017-01-10 00:19:24,699 - Downloading output/file0
2017-01-10 00:19:24,699 - Downloading file0:
2017-01-10 00:19:24,848 - ##############################| 16B / 16B
2017-01-10 00:19:24,848 - Downloading output/submit.sh
2017-01-10 00:19:24,848 - Downloading submit.sh:
2017-01-10 00:19:25,025 - ##############################| 112B / 112B
2017-01-10 00:19:25,025 - Downloading output/run.sh
2017-01-10 00:19:25,025 - Downloading run.sh:
2017-01-10 00:19:25,147 - ##############################| 112B / 112B
2017-01-10 00:19:25,147 - Downloading output/inputs/file1
2017-01-10 00:19:25,147 - Downloading file1:
2017-01-10 00:19:25,306 - ##############################| 16B / 16B
2017-01-10 00:19:25,306 - Downloading output/process_output.log
2017-01-10 00:19:25,306 - Downloading process_output.log:
2017-01-10 00:19:25,454 - ##############################| 176B / 176B
2017-01-10 00:19:25,553 - Finished downloading files.
またユーザーは、Rescale Web UIにログインして、ジョブのテールと監視を行うことができます。
ジョブリストに SGEJob "HelloWorld" としてのジョブが表示されます:
ステータスページにはジョブの進行状況が表示され、実行番号をクリックしてファイルを選択することで、UI内でファイルをテールできます。
The Input Parser
アプリケーションはデフォルトで SGE 入力パーサを使用して、スクリプトからの情報を解析してRescaleの設定として使用し、送信スクリプトの不要なクラスタ固有の設定を解析します。 たとえば、次のような submit.sh
という名前のスクリプトがあるとします。
# !/bin/sh
# RESCALE_NAME="Hello World!"
module load hello-world
source /home/rescale/environments/hello_world
/usr/lib64/openmpi/bin/mpirun echo “hello-world” > $(hostname)
パーサは、クラスタ固有のラインモジュールロードを解析して、このラインでスクリプトがエラーにならないようにします。次に、環境を変更するコマンドを削除しようとします。この場合、ソースとなる行は解析され、Rescale 環境を妨げません。
さらに、実行可能ファイルがローカルクラスタ上の Rescale と同じ場所に存在しない可能性が高いため、パーサーは実行可能ファイル/バイナリへの絶対参照を削除しようとします。この場合、mpirun への参照は、Rescale 環境の PATH 環境変数を介して参照されます。結果のスクリプトは、run.sh
という名前のファイルに保存され、次のようになります。
# !/bin/sh
# RESCALE_NAME="HelloWorld!"
# module load hello-world
# source /home/rescale/environments/hello_world
mpirun echo “hello-world” > $(hostname)
Rescale解析コマンドは ./run.sh
に設定されます。 このスクリプトは、入力ファイルと共にRescale にアップロードされます。

Command Line Options
アプリケーションは、次のコマンドラインオプションをサポートしています:
-
-h
orHelp
-
-E
or--end-to-end
- 入力ファイルのアップロード、ジョブの実行、結果の監視、結果ファイルのダウンロードなど、ジョブの end to end を実行します。
-
-p <API token>
- APIトークンを指定します。
-
-i <input file>
- input fileを指定します
このアプリは次のコマンドラインコマンドをサポートしています。
status
は、指定されたジョブのステータスを要求します。連続的に監視するループに配置します。 指数バックオフアルゴリズムを使用して、時間がかかるジョブを監視することをお勧めします。
まず最初に、APIキーと対象とするJOB_IDを以下の変数に格納します。
API_TOKEN='<Your API Key>'
JOB_ID='<JOB-ID you want to sync>'
OPTION='status'
java -jar /usr/local/bin/rescale.jar ${OPTION} -p ${API_TOKEN} -j ${JOB_ID}
"sync" は結果ファイルをダウンロードします。
OPTION='sync'
java -jar /usr/local/bin/rescale.jar ${OPTION} -p ${API_TOKEN} -j ${JOB_ID}
さらに、指定できるいくつかの高度なJavaシステム・プロパティーがあります。
- rescale.loglevel(TRACE、DEBUG、INFO、WARNING、ERROR、OFF)
- https.proxyHost
- https.proxyPort
たとえば、DEBUGロギングを有効にして実行し、proxy.com:8888をプロキシサーバーとして使用するには、次のコマンドを使用できます。
LOG_LEVEL='DEBUG'
PROXY_HOST='proxy'
PROXY_PORT='8888'
OPTION='status'
java \
-Drescale.loglevel=${LOG_LEVEL} \
-Dhttps.proxyHost=${PROXY_HOST} \
-Dhttps.proxyPort=${PROXY_PORT} \
-jar /usr/local/bin/rescale.jar ${OPTION} \
-p ${API_TOKEN} -j ${JOB_ID}
-Dとシステム・プロパティーの名前の間にはスペースがないことに注意してください。 さらに、-Dスイッチは-jarオプションの前にも存在する必要があります。
Rescale Specific Flags
このアプリケーションでは、Rescale specific 設定フラグの使用をサポートしています。これにより、ユーザーは自分が望むようにジョブを正確に設定できます。現在利用可能なフラグは次のとおりです。 これらのフラグが含まれていない場合、フォールバック値が最初に使用されます。 代替値が使用できない場合は、デフォルト値(太字と下線付き)が使用されます。
# RESCALE_CORES='{1|2|4|8|16|32|64|128|...}'
使用するコアの数。 コアのタイプに応じて、許可された値はリストされたオプションのサブセットです。 このオプションのフォールバック値は SGE #$ -pe value
です。
# RESCALE_CORE_TYPE='{LowMemory|Standard|High Memory|HPC|GPU|High I/O|High Memory HPC|HPC+}'
使用するRescaleコアタイプ。このオプションの代替値はありません。
# RESCALE_NAME='<string>'
あなたの仕事の名前。このオプションのフォールバック値はSGE#$ - Nvalueです。
# RESCALE_ANALYSIS='{abaqus|adina|aermod|ansys_cfx|ansys_fluent| ... |user_included| ...}'
使用された分析。オプションの完全なリストについてはsupport@rescale.comまでお問い合わせください。フォールバック値は、解析可能な任意の解析名であり、スクリプトのモジュールまたはソース行で指定されます。
# RESCALE_ANALYSIS_VERSION
使用する選択された分析の特定のバージョン。これはオプションの設定です。省略すると、最新のバージョンが使用されます。興味のある分析の有効なバージョン文字列については、support@rescale.comまでお問い合わせください。
# RESCALE_EXISTING_FILES='<comma delimited list of strings>'
例えば、
# RESCALE_EXISTING_FILES=aAbBcC, dDeEfF, gGhHiI
このジョブにRescaleにすでに格納されているリストされたファイルを含めます。リストされたファイルが存在しない場合、検証時にジョブは失敗します。このオプションの代替値はありません。
# USE_RESCALE_LICENSE
分析コードには、提供されているライセンスのサイズ変更を使用します。
すでに存在するライセンスを使用する場合は、実行スクリプトを使用して環境変数を使用して設定することができます。
# RESCALE_ENV_<varname>=<value>
Rescaleクラスタでライセンスサーバー情報を設定するために使用されます。 を環境変数名の名前に置き換え、をライセンスサーバーの場所に置き換えます。例えば:
# RESCALE_ENV_RLM_LICENSE='8112@licenseproxy.rescale.com'
は、クラスタノードで 8112@licenseproxy.rescale.com
に設定された RLM_LICENSE 環境変数を作成します。
SGEとRescaleの両方で動作するサンプルスクリプトは、次のようになります(モジュールラインはコメントアウトされ、mpirun への絶対参照は削除されます)。
# !/bin/bash
# RESCALE_NAME="ConvergeSample"
# RESCALE_CORES=32
# RESCALE_CORE_TYPE=HPC
# RESCALE_ANALYSIS=converge_open_mpi
module load converge
/usr/bin/mpirun -np 32 converge-2.1.0
Rescaleでのみ動作するサンプルスクリプトは、以下のようになります。 コマンドラインコマンドは、解析コードテーブル(別の添付ファイル)にあります。
# !/bin/bash
# RESCALE_NAME="ConvergeSample"
# RESCALE_CORES=32
# RESCALE_CORE_TYPE=HPC
# RESCALE_ANALYSIS=converge_open_mpi
converge-mpi -n all -v 2.1
Input Files, Running The Job, Output Files
アプリケーションは現在の作業ディレクトリ内のすべてのファイルをinput.zipという一時ファイルに圧縮します。 次に run.sh と input.zip の両方をアップロードし、ジョブに入力ファイルとして取り込みます。 また、入力スクリプトの#RESCALE_EXISTING_FILES lineに記載されているファイルも含まれます。 たとえば、ディレクトリが次のようになっているとします。
materials/material2
mesh.sim
submit.sh
rescale-submit submit.shを使用してジョブを送信すると、一時的にzipファイルが作成され、submit.shスクリプトがrun.shに解析されます。 あなたのディレクトリは次のようになります:
input.zip
materials/material1
materials/material2
mesh.sim
run.sh
submit.sh
アプリは、run.shスクリプトとともに、input.zipファイルをRescaleにアップロードします。アプリケーションは、ローカルファイルシステムからzipファイルを削除し、ジョブの保存/送信を試みます。 ジョブが検証に合格すると、保存され、Rescaleに送信されます。 アプリケーションはポーリングサイクルを開始し、ジョブのステータスが完了するまで待機します。 この時点で、アプリケーションは参照用に使用できるjobidも印刷します。
ジョブが完了すると、リモートのRescale作業ディレクトリにあるすべてのファイルがディレクトリ名出力でローカルファイルシステムにダウンロードされます。 作業ディレクトリは次のようになります。
materials/material1
materials/material2
mesh.sim
output/output1
output/output2
run.sh submit.sh
すべての出力ファイルがダウンロードされると、アプリケーションは終了します。 ジョブが実行されている間、ユーザーはアプリケーションによって印刷されたジョブを使用してステータスを実行することができます。 ステータスを取得するには、コマンドラインからhttps://platform.rescale.com/jobs/<job-id>/
または次のコマンドを実行します。
API_TOKEN='<Your API Key>'
JOB_ID='<JOB-ID you want to sync>'
OPTION='status'
java -jar rescale.jar ${OPTION} -p ${API_TOKEN} -j ${JOB_ID}
Syncing
(進行中の作業)
ユーザーは、リモート出力ファイルをローカルファイルシステムと同期させたい場合があります。
ユーザーがアプリケーションを通して出力ファイルを同期させたい理由の1つは、手動でジョブを通過してブラウザを介してファイルをダウンロードする必要はありません。 .rescalefile に sync states を格納する、アプリケーションに組み込まれたファイルを同期する非常に基本的な実装があります。
同期コマンドは、ダウンロードしたファイルを格納するのに十分なディスク容量を持つファイルシステムから実行する必要があります。 ユーザーは、ここで説明するディスク容量のオーバーランを避けるために、Appの機能でいくつかのトリックを使用することができます。 基本的な同期コマンドは次のとおりです。すべてのジョブを現在の作業ディレクトリに同期させます。
まず最初に、APIキーと対象とするJOB_IDを以下の変数に格納します。
API_TOKEN='<Your API Key>'
JOB_ID='<JOB-ID you want to sync>'
今回、Optionは sync
のみですので、あらかじめこれを設定しておきます。
OPTION='sync'
java -jar /usr/local/bin/rescale.jar ${OPTION} -p ${API_TOKEN}
(*This functionality is currently disabled)
ユーザーが単一のジョブを同期させたいだけなら、ユーザーは次のように実行します。
java -jar /usr/local/bin/rescale.jar ${OPTION} -p ${API_TOKEN} -j ${JOB_ID}
最後に、ユーザーは特定のジョブ ${JOB_ID} よりも新しいすべてのジョブを同期させたい場合、ユーザーは次のコマンドを使用します。
java -jar /usr/local/bin/rescale.jar ${OPTION} -p ${API_TOKEN} -n ${JOB_ID}
連続的な同期のために、ユーザは同期時間を指定することができます。秒単位の時間
2回の同期試行の間の遅延時間を決定します:
SYNC_TIME='<syn time [sec]>'
java -jar /usr/local/bin/rescale.jar ${OPTION} -p ${API_TOKEN} -d ${SYNC_TIME}
作業ディレクトリが指定されている場合、ジョブ出力ファイルは次のディレクトリに同期されます。たとえば、zzzZZZ、yyyYYY、xxxXXX、cccCCC、bbbBBB、aaaAAAという新しい日付の作成日の順に、次のジョブを実行したとします。
ユーザがコマンド java -jar /usr/local/bin/rescale.jarsync -p <api-token> -n xxxXXX
を実行すると、アプリケーションは次のディレクトリを作成します。"rescale_job_zzzZZZ"、"rescale_job_yyyYYY"、"rescale_job_xxxXXX"
これらのディレクトリ内の出力ファイルを同期させ "zzzZZZ" と "yyyYYY" の同期が成功し、"xxxXXX" の同期が失敗した場合、次回ユーザーが同じコマンドを実行すると、アプリケーションは "zzzZZZ" と" yyyYYY" を再び同期しようとはせず、"xxxXXX" のみを再び同期しようとします。
同期状態ファイルはそれぞれの出力ファイルディレクトリに保存されるため、ユーザーが別の作業ディレクトリから sync
コマンドを実行しようとすると、そのディレクトリにファイルが再同期されます。
Q & A
ジョブを投入しファイルアップロード中に通信が切れたとき
ジョブ投入をし、ファイルアップロード中にWifi接続をわざと切って、ジョブがどうなるかを観察します。
./rescale-submit submit.sh
ジョブ投入が始まります。下記の一番下で、wifiを切ります
2016-12-21 18:34:02,460 - Running SGE version of Rescale Client App
2016-12-21 18:34:02,468 - Executing Command.
2016-12-21 18:34:02,471 - Parsing Input Files
2016-12-21 18:34:02,471 - No existing files to include
2016-12-21 18:34:03,328 - No core type specified by user. Using default core type 'Nickel'
2016-12-21 18:34:03,330 - Did not find explicitly specified analysis, checking implicitly selected analyses
2016-12-21 18:34:03,330 - No implicitly selected analyses, assuming user-included analysis
2016-12-21 18:34:03,336 - Zipping Files
2016-12-21 18:34:03,336 - Creating temporary encrypted zip at /Users/daisuke/Documents/Rescale/API/source/input.zip
2016-12-21 18:34:05,776 - Finished writing encrypted file
2016-12-21 18:34:05,776 - Uploading Files
2016-12-21 18:34:05,778 - Uploading: /Users/daisuke/Documents/Rescale/API/source/run.sh
2016-12-21 18:34:05,779 - Uploading run.sh:
2016-12-21 18:34:07,556 - ##############################| 112B / 112B
2016-12-21 18:34:08,042 - Uploading: /Users/daisuke/Documents/Rescale/API/source/input.zip
2016-12-21 18:34:08,042 - Uploading input.zip:
2016-12-21 18:34:20,790 - ###### | 8.21MB / 37.51MB
20秒後ほどで再接続します。
2016-12-21 18:35:55,073 - ############ | 15.30MB / 37.51MB
長時間放置し、再接続します。下記のようにタイムアウトします。
2016-12-21 18:43:13,077 - ### | 5.00MB / 37.51MB
2016-12-21 18:43:18,556 - An unhandled error occurred: Transfer failed: 55721b74-d856-4e84-8515-1c042fbb3283
複数ファイルがあるとき、アップロードに成功したファイルは、Rescale Storage 上に保存されています。
JOBを投入し計算中にセッションが切れたとき
ジョブ投入をし、計算が走り始めてからWifi接続をわざと切って、ジョブがどうなるかを観察します。
./rescale-submit submit.sh
ジョブ投入が始まります。下記の一番下で、wifiを切ります
2016-12-21 18:17:51,035 - Running SGE version of Rescale Client App
2016-12-21 18:17:51,047 - Executing Command.
2016-12-21 18:17:51,050 - Parsing Input Files
2016-12-21 18:17:51,050 - No existing files to include
2016-12-21 18:17:52,275 - No core type specified by user. Using default core type 'Nickel'
2016-12-21 18:17:52,278 - Did not find explicitly specified analysis, checking implicitly selected analyses
2016-12-21 18:17:52,278 - No implicitly selected analyses, assuming user-included analysis
2016-12-21 18:17:52,281 - Zipping Files
2016-12-21 18:17:52,281 - Creating temporary encrypted zip at /Users/daisuke/Documents/Rescale/API/source/input.zip
2016-12-21 18:17:54,934 - Finished writing encrypted file
2016-12-21 18:17:54,934 - Uploading Files
2016-12-21 18:17:54,936 - Uploading: /Users/daisuke/Documents/Rescale/API/source/run.sh
2016-12-21 18:17:54,938 - Uploading run.sh:
2016-12-21 18:17:58,815 - ##############################| 112B / 112B
2016-12-21 18:17:59,983 - Uploading: /Users/daisuke/Documents/Rescale/API/source/input.zip
2016-12-21 18:17:59,983 - Uploading input.zip:
2016-12-21 18:18:32,237 - ##############################| 37.51MB / 37.51MB
2016-12-21 18:18:34,636 - Job: Saving Job
2016-12-21 18:18:35,751 - Job suXRa: Saved
2016-12-21 18:18:35,751 - Job suXRa: Submitting
2016-12-21 18:18:37,104 - Job suXRa: Starting polling cycle
2016-12-21 18:19:37,110 - An unhandled error occurred: java.net.UnknownHostException: platform.rescale.jp: unknown error
ジョブはCLIでエラーが出ますが、ジョブは走り続けます。
Tips
便利なOneliner
java -jar /usr/local/bin/rescale.jar \
-X https://platform.rescale.jp/ list-info -a -p ${RESCALE_API_TOKEN} \
| jq -c '{code: .code, versionCode: .versions[].versionCode, allowdCoreTypes: .versions[].allowedCoreTypes[]}'
~~~~ 省略 ~~~~~
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"bronze"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"copper"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"gpu-kepler"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"granite"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"hi-io"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"hi-io-plus"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"hi-mem"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"hi-mem-hpc"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"hpc"}
{"code":"cd_adapco_star_ccm","versionCode":"12.2.10","allowdCoreTypes":"hpc-3"}
~~~~ 省略 ~~~~~