What’s new in v26.1LTS-0


Note

v26.1LTSは、v25.2LTSおよびそのパッチ(v25.2LTS-patch20261023まで)の内容を全て含んでいます。本ページではv25.2LTS-patch20261023との差分のみを記載しています。

Note

v26.1LTSから、コンテナイメージのタグを次の3種類から選べます。

  • v26.1LTS-0.N(例: v26.1LTS-0.0): 固定。内容は変わりません
  • v26.1LTS-0: パッチv26.1LTS-0のまま、OSなどのセキュリティパッチを適用した再ビルドに追従します
  • v26.1LTS: v26.1LTSの最新のパッチと、セキュリティパッチを適用した再ビルドに追従します

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のデフォルト値を0に変更しました。Server/User-AgentヘッダにはQmonus/v26.1LTS-0、対話シェルのバナーにはQmonus-SDK v26.1LTS-0と表示され、GET /servicesなどで返すseriesは0になります。
  • 起動バナーなどのコピーライト表記を更新しました。
  • 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プラグイン)は対象外で、値はエスケープされません。

  • Scenarioのcallout、parallel_callout、southbound_callout、parallel_southbound_callout、render_templateで、abnormal[].headersの判定が動作するようにしました。従来は判定が常に失敗し、headersの条件は無視されていました。応答ヘッダは、ヘッダ名をキー、値を文字列とするobjectとしてJSON Schemaで検証します。スキーマに書いたヘッダ名(properties、requiredなど)は大文字小文字を区別しません。同名のヘッダが複数ある場合は、値を,で連結した1つの文字列で判定します。同じエントリにheadersとbodyを併記した場合は、どちらかが一致すればabortします。

Warning

abnormal[].headersを記述済みのScenarioは、条件に一致する応答でabortするようになります。headersとbodyを併記したエントリは、headersだけの一致でもabortします。patternPropertiesとpropertyNamesは、Content-Typeのような表記のヘッダ名に対して大文字小文字を区別して判定します。

  • Scenarioのcalloutとsouthbound_calloutで、authorityを宛先に使うようにしました。従来はauthorityを無視し、常に自身のapigateway(default_apigw_host:default_apigw_port)へ送っていました。parallel_calloutとparallel_southbound_calloutのauthorityは、従来どおり使われません。
  • Scenarioのsouthbound_callout、status_poll、parallel_status_pollでauthorityを指定し、宛先が自身のapigatewayでない場合は、superuserの資格情報(x-xaas-auth-token)、family key、x-xaas-qmonusヘッダを付けないようにしました(calloutは従来からこれらを付けていません)。calloutも含め、headersを省略した場合は、Scenarioが受け取ったリクエストのヘッダを引き継がず、Content-Type: application/json(と、指定した場合はcookies。status_poll/parallel_status_pollではX-Xaas-Xidも)だけを送ります。また、lambdaの後続処理を行わないため、callout/southbound_calloutは宛先の受付応答をそのまま返します。parallel_callout/parallel_southbound_calloutは、従来どおりauthorityを使わず自身のapigatewayへ送ります。スクリプトからcontext.callout()/context.status_poll()でendpointを直接指定する呼び出しは従来どおりです。

Warning

自身のapigatewayかどうかは、送信先のホストとポートがdefault_apigw_host:default_apigw_portと一致するかで判定します。別名(Kubernetesのサービス名やlocalhostなど)やポートの省略は、自身のapigateway以外として扱います。authorityに実際と異なる値を書いていたScenarioは移行後にその宛先へ送られ、資格情報が付かないため401になる場合があります。自身のapigatewayを指定する場合はdefault_apigw_host:default_apigw_portと同じ表記にするかauthorityを削除し、外部の宛先が認証を要する場合はheadersやauthenticationを明示してください。status_poll/parallel_status_pollは従来からauthorityを宛先に使っており、外部の宛先にも資格情報と受信ヘッダを送っていたため、これに頼っていた呼び出しも同様に影響を受けます。

  • routingのtarget.validate_certと、Collectionのcollections.method.validate_cert(protocolがHTTPの場合)のデフォルト値をTrueに変更しました。httpsのupstreamの証明書とホスト名を検証します。静的ルーティング(X-Xaas-Static-Routing)でhttpsの宛先を指定した場合も、ルートの設定に従います。httpのupstreamは影響を受けません。

Warning

自己署名証明書のupstream、IPアドレスで指定した宛先でIPのSANが無い証明書、プライベートCAのupstreamでca_certsを指定していない構成では、接続に失敗します(599)。validate_cert: falseかca_certsを指定してください。また、従来はca_certsだけを指定しても検証自体が無効でしたが、今後は実際に検証されます。なお、GET /routingtreeの到達性の確認はTCP接続の可否だけを見るため、証明書の検証で失敗するルートも到達可能と表示されます。

  • callout()のauthenticationでaxis/qmonus認証(auth_modeがaxis/qmonus)を使う場合の/logonで、httpsの宛先の証明書を検証するようにしました。従来は常に検証していませんでした。authenticationのvalidate_cert(真偽値)とca_certsで変更できます。真偽値でないvalidate_certは警告ログを出力して無視します。Collectionのcollections.method.authenticationでも指定できます。この設定はaxis/qmonus認証でのみ有効です(keystone/apigee認証のlogonはapigatewayの静的ルーティングを経由するため、routingのtarget.validate_certに従います)。

Warning

axis/qmonus認証のlogon先が自己署名証明書などのhttpsの場合は、authenticationにvalidate_cert: falseかca_certsを指定してください。

  • Workflow(Scenario)のNetconfプロキシ(NetconfProxyのget-config/edit-config)とlambdaのSouthbound.Netconf(GetConfig/SetConfig)で、装置のSSHホスト鍵を検証できるようにしました。装置のoptionsに以下を指定します。デフォルトは従来どおり検証しません。スクリプトから直接使うNetconf組み込み(Netconf)は対象外で、従来どおり引数で指定します。lambdaのNetconfクラスには、装置のoptionsを渡すキーワード引数optionsを追加しました(既存の呼び出しはそのまま動作します)。
    • netconf_hostkey_b64: 装置のホスト公開鍵(ssh_host_*.pubの2列目のbase64。公開鍵の行をそのまま指定してもかまいません)。この鍵と一致する場合だけ接続します。known_hostsとssh_config_fileは使いません。
    • netconf_hostkey_verify: Trueにするとknown_hostsで検証します(デフォルトFalse)。既定のknown_hostsは~/.ssh/known_hostsです(コンテナには通常存在しないため、ssh_config_fileかnetconf_hostkey_b64を併用してください)。ssh_config_fileを指定すると、そのUserKnownHostsFileを使います。このときssh_config_fileの該当HostのHostName、IdentityFile、ProxyCommand、ConnectTimeoutなどもNetconfの接続に適用されます。
  • 起動パラメータを追加しました。
    • schedule_zombie_history_duration_days: DEATHに失敗したZombieの予約の保持日数です。デフォルトは未設定で、従来どおり削除しません。負の値は削除せず警告ログを出力し、0はDEATH時刻を過ぎたものをすべて削除します。
    • template_render_validation: Trueにすると、Template.renderでパラメータをテンプレートのスキーマで検証します。デフォルトはFalse(従来どおり検証しない)です。
  • 起動パラメータ--configで指定した設定ファイルを、起動時、PUT /services、オンラインアップグレードで書き換えないようにしました。従来の書き戻しは、_を含むオプションが消える、文字列が引用符で囲まれないなどで次の起動時に読めず、PUT /servicesは設定ファイルを空にしたうえで500になっていました。PUT /servicesの変更は同じロールの全プロセスのメモリ上にのみ反映し、再起動すると元に戻ります。また、起動時に出力するオプション一覧のログでnttcom_apigw_apikeyとamqp_urlをマスクするようにしました。
  • Scenarioのuriの評価順を変更しました。同じ深さのuriでは、固定のセグメントをワイルドカード(変数)のセグメントより先に評価します。組み込みのAPIとの間も同じです。例えば/{x}/terminalのようなScenarioが、組み込みの/log/terminalなどのAPIへのリクエストを受けなくなります。
  • routingで、同じ階層にリクエストのセグメントと名前が完全に一致するパスと変数({id}など)のパスがある場合に、完全に一致するパスを先に評価するようにしました。例えば/devices/{id}と/{kind}/searchがある場合、/devices/searchは/devices/{id}に振り分けられます(従来は/{kind}/search)。
  • /scenariosと/daemonsの登録(POST)と、コマンドを変更する更新(PUT)で、container内(入れ子を含む)のスクリプトの構文エラーを400にするようにしました。従来は登録でき、実行時に失敗していました。起動時の読み込み、プラグインのインストール、コマンドを変更しない更新では、シナリオ名と位置をエラーログに出力するだけで、従来どおり登録されます。
  • lambdaのハンドラが例外またはタイムアウトで終了した場合に、chainの結果を500として記録するようにしました。従来は成功(200)として扱っていました。southbound_calloutなどの呼び出し元はエラーになり、同期のlambda proxyは500を返します。
  • 同期のlambda proxyで、ハンドラの結果がJSONとして解釈できない文字列の場合に、JSONの文字列("...")にせず、元の文字列をtext/plain(XMLはapplication/xml)で返すようにしました。
  • routingのbody_validation_schemaで、bodyをJSONとして解釈した値を検証するようにしました。従来は解釈前の文字列を検証していたため、typeを指定しないスキーマ({"required": [...]}など)の制約が効いていませんでした。JSONでないbodyは400になります。
  • ロール名superを予約しました。Portalはロール名がsuperのアカウントをsuperuserとして扱うため、/rolesでsuperという名前のロールを作成・更新すると400になります。/accountsでは、既存のsuperロールを新たに付与すると400になります(既にsuperロールを持つアカウントの更新はできます)。プラグインのインストールでは、superロールとそれを参照するアカウントを警告ログを出力して読み飛ばし、他のプラグインのインストールは続けます。既に作成済みのsuperロールは削除されません。不要であれば、アカウントのロールを変更したうえで削除してください(superロールを持つアカウントのログイン時に警告ログを出力します)。
  • superuserと内部呼び出し以外の利用者に対して、GET /servicesのconfigurationの秘密値(super_api_keyなど)を"****"に伏せるようにしました。GET /accountsはパスワードハッシュを返さず、api_keyは本人の分だけを返します。POST/PUT/PATCH /accountsとGET /tokensの応答からはパスワードハッシュを除きました。
  • Scenarioの削除・更新時に、そのScenarioが自動生成したルーティング(routing_auto_generation_mode: trueのときのuriとadditional_paths)を削除するようにしました。従来は残り、削除したScenarioのパスへのリクエストが存在しないScenarioへ送られていました。他のScenarioが使用しているパス、プラグインとして保存したルーティング、手動で転送先を変更したルーティングは削除しません。

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エスケープ(&amp;など)されたまま送られる問題を修正しました(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のコマンドを送り続ける問題。ドキュメントどおり、ロールバックの失敗として返します。
  • 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)の場合も処理が続き、装置へ接続して結果が上書きされる問題を修正しました。
  • context.status_poll()でpathを省略してurlを指定した場合に失敗する問題を修正しました。urlを宛先に使います。superuserの資格情報とfamily keyは、宛先が自身のapigatewayの場合だけ付けます。
  • 非同期のlambda proxyのルートで、?async=falseが無視される問題を修正しました。受付応答ではなく同期の応答を返します。
  • Daemonのcallout、parallel_callout、status_poll、parallel_status_pollで、指定したheadersが送られない問題を修正しました(Content-Typeが無い場合だけapplication/jsonを補います)。
  • Scenario/Daemonのcallout、parallel_callout、status_poll、parallel_status_pollで、cookiesの値が対応しない引用符("値')で囲まれて送られる問題を修正しました。名前=値で送ります。
  • Scenarioのsnmp_get/snmp_bulkで、指定したportが使われない問題を修正しました(省略時は161)。
  • WebSocket(/subscribers)で、チャネルを1つunsubscribeすると接続ごと閉じる問題を修正しました。全チャネルをunsubscribeしても、サーバーからは接続を閉じません。
  • トランザクションのrename(PUT /transactionsのrenameコマンド)で、名前の索引が付け替えられず、変更後の名前で参照できない問題を修正しました。変更後は旧名では参照できません。実行中の他のトランザクションが使用している名前への変更は409になります。
  • 予約で引き継がないヘッダ(Content-Type、X-Xaas-Auth-Token、X-Xaas-Trace-Id)の判定で大文字小文字を区別していたため、小文字で書いたヘッダが二重に送られる問題を修正しました。
  • 存在しないロールが割り当てられたアカウントがあると、全アカウントの認可が500、その後429になる問題を修正しました。そのアカウントは警告ログを出力して権限なしとして扱い、割り当てられた他のロールの権限も持ちません。
  • apigatewayがupstreamの応答からクライアントへ転送するヘッダ(Content-Typeなどとadditional_transmission_headers)の値から、前後のダブルクォートが除去されない問題を修正しました(記述誤りにより除去処理が動作していませんでした)。

Warning

additional_transmission_headersにETagのような引用符付きの値が正しいヘッダを追加している場合は、値が変わります。

  • SIGTERM/SIGINTによる停止時に、Redis/DBの接続プールのクローズとWebサーバーの停止が実行されずに途中で停止する問題を修正しました。DBの接続プールのクローズは最大60秒待つため、返却されていないDB接続が残っている場合は停止に時間がかかり、Kubernetesの既定の猶予期間(terminationGracePeriodSecondsの30秒)を超えることがあります。
  • QmonusRoleの存在確認と削除で、404以外のエラーでも何もせずに終了し、save()が誤ってPOSTする問題を修正しました。404以外のエラーは例外にします。
  • CollectionのSNMPv3と、Scenarioのsnmp_get/snmp_bulkのSNMPv3が常に失敗する問題を修正しました。authProtocol/privProtocolの方式名(usmHMACSHAAuthProtocolなど)をpysnmp 7の値に解決し、省略時はpysnmpのデフォルトを使います。
  • repeatで、syncモード(非トランザクション)の場合に回数に比例してスタックが深くなり、RecursionError(500)になる問題を修正しました。
  • Basic認証で、:を含むパスワードを照合できず500になる問題を修正しました。
  • トランザクションのresumeで、保存した元のリクエストのbodyが送られない問題を修正しました(bodyキーで包んだ従来の形も受け付けます)。手動のresumeでcalloutが失敗した場合はSUSPENDINGに戻し、呼び出し元には従来どおり500を返します。
  • 予約の変更(rebooking)について、以下の問題を修正しました。
    • death時刻を変更してもDEATHの実行計画が新しい時刻で作り直されない問題。
    • リクエストの時刻を保存済みの時刻と正しく比較できず常に変更ありと判定され、開始済み(Live)の予約のdeath時刻を変更できない(406)問題。death時刻だけの変更にも最小生存期間(minimum_life_term)の検査を適用します。
    • 存在しない予約の変更が500になる問題(404を返します)。
  • term型の予約でBIRTH/DEATHが成功した場合に、更新前の状態で通知とtimerの判定をしていた問題を修正しました。BIRTHの成功はLive、DEATHの成功はDeadとして通知します。
  • 予約の実行で応答が無く、execution_retry_codesに599が含まれない場合にAttributeErrorになる問題、予約キューのロック中にロックの内容を予約として扱う問題、完了済みの実行計画がキューから除去されない問題を修正しました。
  • GET /heartbeatで、Redisに接続できない場合もmemorystoreが正常と報告される問題を修正しました。
  • HA構成でcoverage modeやtrace modeを短時間に切り替えると、プロセス間で同期イベントの送信が止まらなくなる問題を修正しました。受信した側は同期イベントを送り直しません。ローリング更新中に旧バージョンのプロセスが2つ以上残っている間は、旧バージョンのプロセス間で発生することがあります。
  • lambdaのchainで、2番目以降の兄弟のchainの下へ追加できない問題、親が2本以上のchainの完了を待てない問題、期限切れのchainを待つと例外になる問題(警告ログを出力して待ちを終了します)を修正しました。
  • routingで、aliasを指定しないlambda proxyが常に400になる問題、paramsのtype: numberで小数を受け付けない問題とitemsの無い定義でKeyErrorになる問題を修正しました。
  • キーフィルタで、リストの中のリストが1段余計にリストで包まれる問題を修正しました。
  • API Stubで、同じキーに複数の値を指定した検索が最初の値にしか一致しない問題(ORで一致します)、model表現でクライアントが指定したidが無視される問題、無関係なreactionしか無い場合にDELETEで削除されない問題を修正しました。
  • ページ数のヘッダ(X-Xaas-Num-Of-Pages)で、最終ページが数えられない場合がある問題を修正しました。
  • WebSocket(Subscribers、InteractiveShell、Terminals、Linter)の拒否応答に、WWW-Authenticateヘッダが付かない問題を修正しました。
  • X-Xaas-Xidを指定した要求で、所有者の付け替えが失敗する問題、トランザクションのtimeoutを1日以上延長すると延長分が正しく計算されない問題を修正しました。
  • task()でexpireが無視される問題、Scenario以外でのwaitfor()がTypeErrorになる問題、空のスクリプトの実行が500になる問題、globalの宣言が無いスクリプトでエラーの行番号が1行ずれる問題、単独の"""の行を1行のdocstringと誤判定する問題、global変数を指定したときに行のリストで渡したスクリプトを実行できない問題を修正しました。
  • schemaを指定しないTemplate/Jsonschemaのvalidate()がAttributeErrorになる問題、MU.get()で正規化前のキー(ハイフンを含むキーや予約語)を受け付けない問題、ClassのMUのフィールドでfield_formatをobjectで指定した場合に、APIの検証スキーマに含まれない問題を修正しました。
  • aspect_optionsのpreのexceptの既定のメッセージに、条件式が表示されない問題を修正しました。
  • アカウントの読み込みでDBのエラーが起きると、ロックが残り、一般ユーザーの認可が最長300秒429になる問題を修正しました。
  • トランザクションのcheckpoint_cancelがLASTONEのとき、cancelのcheckpointが二重に登録される問題を修正しました。
  • routingのous_responseのcodeが599のとき、破棄のメッセージを二重に通知する問題を修正しました。
  • 起動・停止の処理で、予約timerの一括解除、ous()、is_leader_processの判定が、反復中の削除や存在しないプロセスにより例外になる問題を修正しました。
  • Classの変更履歴が、インスタンス間やrollback用の複製で共有される問題を修正しました。
  • QmonusAccountの検索で、復号できない資格情報の行があると例外になる問題(その行を飛ばします)、存在しないアカウントのdestroy()が例外になる問題を修正しました。
  • CLI組み込みで、device=Noneを指定した場合に/devicesから装置を取得しない問題、dryrunでsession_logへの書き込みが失敗する問題を修正しました。未登録のpathのmake_cliは404を返します。
  • Netconfのparameter_bindingsで、子要素を持たない要素へのxpathが一致しない問題、Southbound.Netconf.GetConfigで未登録のテンプレートが404にならない問題を修正しました。
  • Collectionの変数置換で、文字列以外の値(数値・真偽値・null)が壊れる問題を修正しました。
  • Reflectionで、script型のreflectionを削除できない問題、MIBTreeの削除時に子孫や祖先のreflectionが消える問題、.を含むhttpのパスに一致しない問題、metrics_send_unitを指定すると既定の送信先(metrics_server_endpoints)へ送れない問題、既定の送信先が未設定の場合に送信先を指定したメトリクスまで送られない問題(送信先が決まらないメトリクスだけを警告ログを出力して破棄します)、送信失敗時に残りの単位や送信先へ送られない問題、Zabbix分の送信プロトコルの誤りを修正しました。
  • Google/Amazon形式のログで、ミリ秒がゼロ埋めされない問題(5msが.5Zになる)を修正しました。
  • routingの削除で、子を持つパスを削除すると配下のルートまで削除される問題を修正しました。
  • File Upload(PUT /upload/<path>)が常に500になり、FILE_UPLOADEDイベントが発行されない問題を修正しました。あわせて、リクエストの全ヘッダ(認証ヘッダを含む)をログに出力しないようにしました。
  • GitHub連携で、ブランチが31本以上あるリポジトリの作業ブランチやmainブランチを見つけられない問題を修正しました。
  • Python 3.12以降でscriptの実行ごとにメモリ使用量が増え続ける問題と、collection/reflection/lambdaの処理がmasterの1プロセスに集中する問題を修正しました。
  • ルートの到達性チェック(GET /routingtree)で、TLS 1.2未満で接続しないようにしました。

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のバージョンを更新しました。
asyncssh 2.23.1 -> 2.24.0
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
pyasn1 0.6.4 -> 0.6.5
requests 2.33.0 -> 2.34.2
setuptools 83.0.0 -> 84.1.0
textfsm 1.1.2 -> 2.1.0
tornado 6.5.9 -> 6.6
  • 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になる場合があります。

脆弱性対応

  • 以下のmoduleを、脆弱性(GHSA-9xw5-w5jj-pvcgほか)を修正したバージョンへ更新しました。
aiohttp 3.14.3 -> 3.14.4
yarl 1.18.3 -> 1.25.1

Note

v26への移行時は、独自プラグインや外部依存moduleがPython 3.13で動作することを確認してください。