이 페이지의 내용
gNOI 운영 체제(OS) 서비스
요약 gNOI 운영 체제(OS
) 서비스를 사용하여 대상 네트워크 장치의 소프트웨어를 업그레이드합니다.
gNOI OS
서비스를 사용하여 대상 장치에서 소프트웨어를 업그레이드할 수 있습니다. proto 정의 파일은 https://github.com/openconfig/gnoi/blob/master/os/os.proto 에 있습니다.
소프트웨어 설치에는 서비스 RPC에 해당하는 세 가지 OS
주요 단계가 있습니다.
- 설치
- 활성화
- 확인
RPC는 Install()
지정된 이미지를 대상 디바이스의 디렉터리로 /var/tmp/
전송합니다. 대상 파일 이름은 메시지 version
필드에 정의된 TransferRequest
값입니다. RPC는 Activate()
이미지를 설치하고 디바이스를 재부팅하여 새로 설치된 이미지를 활성화합니다. RPC는 Verify()
디바이스에서 OS 버전을 검증합니다.
gNOI system
서비스 SetPackage()
RPC를 사용하여 디바이스에 소프트웨어를 설치할 수도 있습니다. 자세한 내용은 gNOI 시스템 서비스를 참조하세요.
지원되는 RPC
릴리스에 도입된 | RPC | 설명 |
---|---|---|
Activate() |
다음 재부팅 시 사용되는 OS 버전을 설정합니다.
참고:
Junos 디바이스는 메시지의 필드를 |
진화한 Junos OS 22.2R1 |
Install() |
소프트웨어 이미지를 대상으로 전송합니다.
참고:
Junos 디바이스는 메시지의 필드를 |
진화한 Junos OS 22.2R1 |
Verify() |
실행 중인 OS 버전을 확인합니다. 이 RPC는 성공할 때까지 대상이 부팅되는 동안 여러 번 호출될 수 있습니다.
참고:
Junos 디바이스는 VerifyResponse를 지원하지 |
진화한 Junos OS 22.2R1 |
네트워크 디바이스 구성
시작하기 전에:
- gRPC 서비스 구성에 설명된 대로 네트워크 디바이스에서 gRPC 서비스를 구성합니다.
- gNOI 서비스 구성에 설명된 대로 gNOI 작업을 지원하도록 네트워크 관리 시스템을 구성합니다.
서비스 RPC를 OS
사용하기 위해 추가 구성이 필요하지 않습니다.
예: 설치 및 활성화
이 예제에서 클라이언트는 다음 작업을 수행하는 Python 응용 프로그램을 실행합니다 gnoi_os_install_activate.py
.
- 소프트웨어 패키지를 로컬 네트워크 관리 시스템에서 네트워크 디바이스로 복사합니다.
- 네트워크 장치에 패키지를 설치합니다.
- 네트워크 디바이스를 재부팅하여 새 소프트웨어 이미지를 활성화합니다.
애플리케이션은 메시지와 함께 InstallRequest()
RPC를 호출하여 Install()
파일을 전송합니다. 응용 프로그램은 각 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 version
부터 , Install()
, 및 Verify()
RPC의 Activate()
필드는 패키지 이름 대신 소프트웨어 버전 문자열(에 /system/state/software-version
표시됨)을 사용합니다.
응용 프로그램 실행
클라이언트가 응용 프로그램을 실행하면 응용 프로그램은 로컬 장치에서 네트워크 장치의 디렉터리로 /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
변경 내역 테이블
기능 지원은 사용 중인 플랫폼 및 릴리스에 따라 결정됩니다. 기능 탐색기 를 사용하여 플랫폼에서 기능이 지원되는지 확인합니다.
version
부터 ,
Install()
, 및
Verify()
RPC의
Activate()
필드는 패키지 이름 대신 소프트웨어 버전 문자열(에
/system/state/software-version
표시됨)을 사용합니다.