このページの目次
gNOI オペレーティング システム (OS) サービス
概要 gNOI オペレーティング システム (OS
) サービスを使用して、ターゲット ネットワーク デバイス上のソフトウェアをアップグレードします。
gNOI OS
サービスを使用して、ターゲット デバイスのソフトウェアをアップグレードできます。プロトタイプ定義ファイルは https://github.com/openconfig/gnoi/blob/master/os/os.proto にあります。
ソフトウェアのインストールには、サービス RPC に対応する OS
3 つの主要な手順があります。
- インストール
- アクティブ 化
- 確認
RPC はInstall()
、指定されたイメージをターゲット デバイス上のディレクトリに/var/tmp/
転送します。宛先ファイル名は、メッセージのversion
フィールドで定義されたTransferRequest
値です。RPC はActivate()
イメージをインストールし、デバイスを再起動して、新しくインストールされたイメージをアクティブにします。RPC はVerify()
、デバイスの OS バージョンを検証します。
gNOI system
サービス SetPackage()
RPC を使用して、デバイスにソフトウェアをインストールすることもできます。詳細については、「 gNOI システム サービス」を参照してください。
対応する RPC
リリースで導入された | RPC | の説明 |
---|---|---|
Activate() |
次回の再起動時に使用する OS バージョンを設定します。
メモ:
Junosデバイスは、メッセージの フィールド |
Junos OS Evolved 22.2R1 |
Install() |
ソフトウェアイメージをターゲットに転送します。
メモ:
Junosデバイスは、メッセージの フィールド |
Junos OS Evolved 22.2R1 |
Verify() |
実行中の OS バージョンを確認します。この RPC は、成功するまでターゲットの起動中に複数回呼び出される可能性があります。
メモ:
Junosデバイスは、VerifyResponseをサポートし |
Junos OS Evolved 22.2R1 |
ネットワーク デバイスの設定
始める前に:
- 「gRPC サービスの構成」の説明に従って、ネットワーク デバイスで gRPC サービスを構成します。
- gNOI サービスの設定の説明に従って、gNOI 操作をサポートするようにネットワーク管理システムを設定します。
サービス RPC を使用する OS
ために追加の構成は必要ありません。
例: インストールとアクティブ化
この例では、クライアントは次の操作を実行する Python アプリケーションを実行します gnoi_os_install_activate.py
。
- ローカル ネットワーク管理システムからネットワーク デバイスにソフトウェア パッケージをコピーします。
- ネットワーク デバイスにパッケージをインストールします。
- ネットワーク デバイスを再起動し、新しいソフトウェア イメージをアクティブにします。
アプリケーションは、 Install()
メッセージを使用して InstallRequest()
RPC を呼び出してファイルを転送します。アプリケーションは、10% の転送完了間隔ごとに進行状況メッセージを出力することによって、ファイル転送の進行状況を追跡します。ファイル転送が成功すると、アプリケーションは RPC を呼び出して Activate()
イメージをインストールし、ターゲットを再起動します。
アプリケーションはモジュール grpc_channel
をインポートしてチャネルを確立します。この grpc_channel
モジュールについては、 gNOI サービスの設定で説明しています。アプリケーションの引数はファイルに格納されます args_os_install_activate.txt
。アプリケーション ファイルと引数ファイルは次のとおりです。
gnoi_os_install_activate.py
"""gRPC gNOI OS Install, Activate utility.""" from __future__ import print_function import argparse import logging import os from functools import partial from getpass import getpass import os_pb2 import os_pb2_grpc from grpc_channel import grpc_authenticate_channel_mutual MAX_BYTES = 65536 def get_args(parser): parser.add_argument('--server', dest='server', type=str, default='localhost', help='Server IP or name. Default is localhost') parser.add_argument('--port', dest='port', nargs='?', type=int, default=50051, help='The server port. Default is 50051') parser.add_argument('--client_key', dest='client_key', type=str, default='', help='Full path of the client private key. Default ""') parser.add_argument('--client_cert', dest='client_cert', type=str, default='', help='Full path of the client certificate. Default ""') parser.add_argument('--root_ca_cert', dest='root_ca_cert', required=True, type=str, help='Full path of the Root CA certificate.') parser.add_argument('--user_id', dest='user_id', required=True, type=str, help='User ID for RPC call credentials.') parser.add_argument('--no_reboot', dest='no_reboot', type=int, default=0, help='Reboot immediately or not. Default 0 (Reboot immediately)') parser.add_argument('--source_package', dest='source_package', type=str, default='', help='Full path of the source file. Default ""') parser.add_argument('--timeout', dest='timeout', type=int, default=600, help='Timeout in seconds. Default 600') parser.add_argument('--version', dest='version', type=str, default='', help='OS version to activate. Default is ""') args = parser.parse_args() return args def send_rpc(channel, metadata, args): print("Executing GNOI::OS::Install") stub = os_pb2_grpc.OSStub(channel) it = [] # Create file transfer request req = os_pb2.InstallRequest() req.transfer_request.version = args.version it.append(req) # Read source package and add to request source_package_bytes = os.path.getsize(args.source_package) with open(args.source_package, "rb") as file: # Read data in 64 KB chunks and calculate checksum and data messages for data in iter(partial(file.read, MAX_BYTES), b''): req = os_pb2.InstallRequest() req.transfer_content = data it.append(req) req = os_pb2.InstallRequest() req.transfer_end.SetInParent() it.append(req) next_pct = 0 transfer_percent = 0 validated = False activated = False try: responses = stub.Install( iter(it), metadata=metadata, timeout=args.timeout) print("OS Install start\n") for response in responses: rsp_type = response.WhichOneof('response') if rsp_type == 'install_error': print("%s: %s -- %s\n" % (rsp_type, response.install_error.type, response.install_error.detail)) raise Exception("Install Error") elif rsp_type == 'transfer_ready': print("%s: %s\n" % (rsp_type, response.transfer_ready)) elif rsp_type == 'transfer_progress': transfer_percent = int(float( response.transfer_progress.bytes_received) / float(source_package_bytes) * 100) if 0 == (transfer_percent % 10) and transfer_percent != next_pct: next_pct = transfer_percent print("Transfer percent complete: %s%%" % transfer_percent) logging.info('Transferring file %s%%', transfer_percent) elif rsp_type == 'validated': print("%s: %s -- %s\n" % (rsp_type, response.validated.version, response.validated.description)) logging.info('Validated: %s', response.validated.version) validated = True if transfer_percent > 0 and validated: print("Executing GNOI::OS::Activate") req = os_pb2.ActivateRequest() req.version = args.version req.no_reboot = args.no_reboot activate_response = stub.Activate( req, metadata=metadata, timeout=args.timeout) rsp_type = activate_response.WhichOneof('response') if rsp_type == 'activate_ok': activated = True except Exception as e: logging.error('Error installing package: %s', e) print(e) else: if activated: logging.info('Installation complete: %s', args.version) print('Installation complete for %s' % args.version) def main(): parser = argparse.ArgumentParser(fromfile_prefix_chars='@') args = get_args(parser) grpc_server_password = getpass("gRPC server password for executing RPCs: ") metadata = [('username', args.user_id), ('password', grpc_server_password)] try: # Establish grpc channel to network device channel = grpc_authenticate_channel_mutual( args.server, args.port, args.root_ca_cert, args.client_key, args.client_cert) response = send_rpc(channel, metadata, args) except Exception as e: logging.error('Received error: %s', e) print(e) if __name__ == '__main__': logging.basicConfig(filename='gnoi-install.log', format='%(asctime)s %(levelname)-8s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') main()
args_os_install_activate.txt
--root_ca_cert=/etc/pki/certs/serverRootCA.crt --client_key=/home/lab/certs/client.key --client_cert=/home/lab/certs/client.crt --server=10.53.52.169 --port=50051 --user_id=gnoi-user --source_package=/home/lab/images/junos-evo-install-ptx-x86-64-22.3R1.9-EVO.iso --timeout=1800 --version=22.3R1.9-EVO
Junos OS Evolvedリリース23.4R1以降、 Activate()
、 、および Verify()
RPCのフィールドはversion
、パッケージ名の代わりにソフトウェアバージョン文字列(に/system/state/software-version
Install()
表示)を使用します。
アプリケーションの実行
クライアントがアプリケーションを実行すると、アプリケーションはローカル デバイスからネットワーク デバイス上のディレクトリに /var/tmp
パッケージをコピーし、パッケージをインストールしてから、デバイスを再起動してインストールを完了します。
lab@gnoi-client:~/src/gnoi/proto$ python3 gnoi_os_install_activate.py @args_os_install_activate.txt gRPC server password for executing RPCs: Creating channel Executing GNOI::OS::Install OS Install response transfer_ready: Transfer percent complete: 10% Transfer percent complete: 20% Transfer percent complete: 30% Transfer percent complete: 40% Transfer percent complete: 50% Transfer percent complete: 60% Transfer percent complete: 70% Transfer percent complete: 80% Transfer percent complete: 90% Transfer percent complete: 100% validated: 22.3R1.9-EVO -- Use Activate to Validate and Integrity Check the installed Image Executing GNOI::OS::Activate Installation complete for 22.3R1.9-EVO
変更履歴テーブル
機能のサポートは、使用しているプラットフォームとリリースによって決まります。 機能エクスプローラー を使用して、機能がプラットフォームでサポートされているかどうかを判断します。
Activate()
、 、および
Verify()
RPCのフィールドは
version
、パッケージ名の代わりにソフトウェアバージョン文字列(に
/system/state/software-version
Install()
表示)を使用します。