What’s new in v26.1LTS
Note
v26.1LTSは、v25.2LTSおよびそのパッチ(v25.2LTS-patch20261023まで)の内容を全て含んでいます。本ページではv25.2LTS-patch20261023との差分のみを記載しています。
Warning
v26.1LTSではPythonのバージョンが3.13になり、未使用・保守終了の依存moduleがイメージから削除されています。独自プラグインや拡張機能がasync_timeout、backoff、aiopgなどを直接importしている場合はそのままでは動作しません。移行前に「Modules」の内容を確認してください。
General changes
- Python 3.13に対応しました。ベースイメージを
python:3.12-slim-trixieからpython:3.13-slim-trixieに変更しています。 - コンテナを非rootユーザー
axis(uid/gid 1000)で実行するように変更しました。KubernetesのsecurityContext.runAsNonRoot: trueで起動できます。ファイルパス(/root/axis-stableなど)は従来のままです。
Warning
/root配下の他のディレクトリや任意のパスへの書き込みをroot権限前提で行っている運用(ボリュームマウント先のパーミッションなど)は、非rootユーザーでは失敗する場合があります。
version起動パラメータのデフォルト値をv26.1LTSに、seriesのデフォルト値を空に変更しました。Server/User-Agentヘッダと対話シェルのバナーにはQmonus/v26.1LTSと表示されます。- 起動バナーなどのコピーライト表記を更新しました。
- CLI組み込み(
cliOptions)にauto_enable/auto_config_modeオプションを追加しました。Trueにすると、enable/configモードを持つ機種でrequiredEnableMode/requiredConfigModeに応じたモード遷移を自動で行います。デフォルトはFalse(従来どおり自動遷移しない)です。 - Linter(
/linterのWebSocket)で、有効な資格情報(x-xaas-auth-tokenまたはAuthorizationヘッダ)を必須にしました。ロールの権限は確認しません。Portalのエディタからの利用には影響ありません。
Warning
/linterに資格情報なしで直接接続しているクライアントは、401で拒否されます。
- apigatewayのBody template(
request_body_templates/response_body_templates)を非推奨にしました。将来のリリースで削除する予定です。forbidden_processまたはrequest_body_mapper/response_body_mapperで代替してください。Body templateを持つルートを登録すると警告ログを出力します(登録と動作は従来どおりです)。 - Body template(
templateの直書き)で埋め込む文字列の値を、JSONの文字列としてエスケープするようにしました。値に"などが含まれていても、JSONが壊れたり、キーを注入されたりしません。出力はJSONを前提とします。
Warning
Body templateでJSON以外(XMLなど)を出力している場合は、値に|eを付けてください。また、文字列の変数でJSONの断片を引用符の外に埋め込んでいる場合は|safeが必要です(v25.2LTSでもそのままでは動作しません)。tagで指定するテンプレート(Scenarioサービスのtemplateプラグイン)は対象外で、値はエスケープされません。
Bug fixes
- Python 3.13で削除された
ssl.wrap_socketを使用していたため、httpsスキームのルートへの到達性チェックが常に失敗していた問題を修正しました。 - 非rootユーザーで
poetry installを実行すると新しい仮想環境に全依存moduleを再インストールしようとしてビルドに失敗し、起動できなくなる問題を修正しました。 - dberaserで、MySQLではテーブル一覧が常に空になり全消去が空振りする問題、PostgreSQLではTypeErrorになる問題、削除できないテーブルがあると無限に再試行する問題を修正しました。
Warning
上記の修正により、GitHub連携モードのcheckout(cleanup=True)などで実行される全消去が実際に動作するようになります。予約テーブル以外のテーブルが削除されるため、対象環境を確認のうえ実行してください。
- マルチPod構成で、apigateway以外のノードからapigatewayノードへの内部ログインが常に401になる問題を修正しました。
- Python 3.13で
telnetlibが削除された影響でnetmikoのimportに失敗し、装置定義を含むプラグインの投入(POST /devices)やGET /devices?supported_device=true、CLI組み込み、/terminalsが実行時にエラーになる問題を、netmikoを4.8.0へ更新して修正しました。netmiko 4.6以降ではtelnetのTCP接続タイムアウトがconn_timeoutに移っていますが、telnet系の機種では従来どおりtimeout(cliOptions.timeout)の値が接続タイムアウトとして使われるようにしています。 - grpcio-toolsの更新(1.68.0)に伴い、gRPCサービサー(
POST /grpcservicers)とgRPCルーティング(POST /grpcroutings)の登録、および起動時のgRPCサービサーの同期が500(AttributeError)で失敗する問題を修正しました。 - paramiko 5の同梱に伴い、Netconf組み込みで鍵ファイル(
key_filename)やhostkey_b64を指定するとAttributeErrorで接続できない問題を、ncclientを0.7.1へ更新して修正しました。ncclient 0.7で使えなくなった独自のdevice handler(device_paramsだけを受け取るもの)とbytesのpasswordは、Netconf組み込みでは従来どおり使えるように変換しています。プラグインからncclient.manager.connect()を直接呼び出している場合は変換されないため、マイグレーションガイドを参照してください。 - 未登録のIDや不正なbodyに対して500を返していた以下のAPIが、404/400を返すように修正しました:
PUT /device_roles、PUT /collection_hooks、GET /queues(未知または廃棄済みのtaskidはDiscardedとして返します)、POST /testcases(name欠落)、DELETE /roles、POST /counters、additional_pathsのbase_pathを省略したScenario。 - Exclusivesのロック競合判定が誤っており、二重ロックが検出されない、または500になる問題を修正しました。
- Routingsで
forbidden_processの構文エラーにより400を返した後も、不正なルートがキューへ投入されていた問題を修正しました。 PUT /rolesでversion/updateが消え、versionが常に2になる問題を修正しました。POST /tasksでexpireが無視される問題、Templatesのfileモードでoutput_tag省略時の自動ファイル名が常にパス検証で拒否される問題とcharset未指定時にTypeErrorになる問題、VariableGroupsの一括登録で既存グループが上書きされる問題、Countersでinventory/uuid型の再登録が素通りする問題とexpand/shrinkの拒否時にmutexが最大120秒残る問題を修正しました。RewindableDAGのrewind後にmutexが解放されずDAG全体が停止する問題、mFIFOでチャネルが空の場合にロックが解放されない問題、FIFO.retrieve()が常にAttributeErrorになる問題、__call__を持つオブジェクトやfunctools.partialをThirdPartyPluginOperatorとして実行できない問題を修正しました。- CLI組み込みの
generic_telnetでログインが常にTypeErrorで失敗する問題、cliOptionsを部分指定した場合にencodingが未設定となりTypeErrorになる問題を修正しました。 - 非同期のlambda proxyで受付応答の
bodyを定義したルートにおいて、2回目以降の要求の受付応答に最初の要求のlambda_event_uuid(lambda_event_map)が返る問題を修正しました。返ったIDでGET /lambdaeventsを呼ぶと、別の要求の内容と結果を参照できていました。 error_body_offを設定したルートで、ターゲットがエラーを返した場合に本文が空にならない問題を修正しました。ターゲットに接続できない場合(599)の本文も空にします。ステータスコードとreasonは従来どおりです。
Warning
上記の修正により、error_body_offを設定済みのルートでは、ターゲットのエラー応答の本文がクライアントに返らなくなります。
- CLI組み込み、Workflow(Scenario)のCLIプロキシ、lambdaのCLIプロキシで、装置へ送るコマンドに埋め込んだ値の
&、<、>、"、'がHTMLエスケープ(&など)されたまま送られる問題を修正しました(v25.2LTSで発生)。値はそのまま送ります。Pythonとして実行するexecution_condition、fault_condition、parameter_bindingsのscriptと、NetconfのXMLのテンプレートは、従来どおりエスケープします。 - CLI組み込みのロールバックについて、以下の問題を修正しました。
- linuxの機種でロールバックが常に失敗する問題、それ以外の機種で
prompt_terminatorを省略したロールバックのコマンドが送られない問題。prompt_terminatorを省略した場合は、現在のプロンプトを待ち受けます(linuxはプロンプト末尾の1文字)。 fault_conditionが成立し、ロールバックに失敗した場合も、成功(RollbackComplete)として報告する問題。- ロールバックの
preconditionが満たされない場合に、preconditionのコマンドを送り続ける問題。ドキュメントどおり、ロールバックの失敗として返します。
- linuxの機種でロールバックが常に失敗する問題、それ以外の機種で
fault_conditionを式(version not in ["1.0", "1.1"]など)で記述した場合や、faultを代入しない分岐を通った場合に、常にエラーになる問題を修正しました。式はその値で、文は代入されたfaultで判定します。評価できない場合は、コマンドを送らずにエラーを返します。- Workflow(Scenario)のCLIプロキシとlambdaのCLIプロキシで、
unexpect_regexesにexpect_regexesが使われ、期待どおりの応答でも異常と判定されてロールバックが実行される問題を修正しました。 - Netconfのデフォルトハンドラ(
Southbound.Netconf.GetConfig/SetConfig)で、装置の種類が未設定(400)、またはテンプレートが未登録(404)の場合も処理が続き、装置へ接続して結果が上書きされる問題を修正しました。
Modules
依存moduleの更新
- Pythonの対応バージョンを3.13へ更新しました。
- 以下のmoduleはイメージに同梱されなくなりました。
aiobotocore, aioitertools, aiopg, aniso8601, async-timeout, backoff, botocore,
cython, gcloud-aio-pubsub, jmespath, rstr, rx, singledispatch, wrapt
async_timeout.timeout()は標準ライブラリのasyncio.timeout()に、backoffによるリトライはtenacityに置き換えてください。- 以下のmoduleのバージョンを更新しました。
cryptography 46.0.5 -> 50.0.0
gcloud-aio-auth 5.4.2 -> 5.5.1
graphql-core 3.2.8 -> 3.2.12
grpcio 1.62.0 -> 1.68.0
grpcio-tools 1.62.0 -> 1.68.0
idna 3.15 -> 3.18
ncclient 0.6.16 -> 0.7.1
netmiko 4.1.2 -> 4.8.0
paramiko 3.5.0 -> 5.0.0
protobuf 4.25.8 -> 5.29.6
requests 2.33.0 -> 2.34.2
textfsm 1.1.2 -> 2.1.0
- netmikoの更新に伴い、
rich、markdown-it-py、mdurlが追加され、futureが同梱されなくなりました。 cryptographyの更新により、イメージに同梱されるOpenSSLが4.0系になります。またgraphql-coreの更新により、GraphQLの仕様に違反するクエリ(ネストしたfragmentに隠れたフィールドの衝突など)や、極端に複雑なクエリは検証エラーになります。
Warning
cryptographyはメジャーバージョンが4つ上がっています。独自プラグインや拡張機能がcryptographyを直接使用している場合、以下の変更の影響を受けることがあります。axisが提供するSSH/NETCONF/CLI組み込み経由の利用には影響ありません。
- SECT系の楕円曲線と、
PUBLIC_KEY_TYPESなどの*_KEY_TYPES型エイリアスが削除されました。 - サポートされていないアルゴリズムの鍵を読み込んだ際の例外が
UnsupportedAlgorithmになりました(ValueErrorのサブクラスではないため、except ValueErrorでは捕捉できません)。 - X.509証明書・CRL・OCSPの解析が厳格になり、規格に沿わない証明書(古い装置が出力する一部の証明書など)で
ValueErrorになる場合があります。
Note
v26への移行時は、独自プラグインや外部依存moduleがPython 3.13で動作することを確認してください。