Juniper Extension Toolkit Developer Guide

Juniper Extension Toolkit Developer Guide

Tổng quan về JET (Juniper Extension Toolkit)

Juniper Extension Toolkit (JET), là sự phát triển tiếp theo của Junos SDK, cung cấp một giao diện lập trình hiện đại dành cho các nhà phát triển ứng dụng bên thứ ba trên các thiết bị chạy hệ điều hành Junos. JET tập trung vào việc cung cấp giao diện chuẩn hóa theo tiêu chuẩn công nghiệp để tương tác với hệ điều hành Junos OS và Junos OS Evolved của Juniper Networks, cho phép tùy biến các chức năng trên plane quản lý (management plane) và plane điều khiển (control plane).

JET cũng đi kèm chuỗi công cụ (toolchain) cùng với thư viện và các công cụ khác giúp lập trình viên có thể phát triển các ứng dụng JET chạy trực tiếp trên thiết bị mạng.

Lợi ích của JET

  • Cung cấp các API để tương tác với bất kỳ thiết bị Junos nào.
  • Hỗ trợ phát triển API với nhiều ngôn ngữ lập trình khác nhau (như Python, C, C++, Go…).
  • Cung cấp các công cụ để phát triển ứng dụng chạy trực tiếp trên thiết bị Junos.
  • Sử dụng cơ chế thông báo sự kiện (event notification) cho phép ứng dụng JET phản hồi lại các sự kiện hệ thống được chọn.

Kiến trúc của JET

JET là một framework cho phép các nhà phát triển xây dựng ứng dụng mở rộng chức năng của hệ điều hành Junos OS và Junos OS Evolved. Ví dụ, một ứng dụng JET có thể mở rộng CLI của Junos bằng cách thêm một lệnh thao tác (operational command) mới để hiển thị trạng thái cụ thể của ứng dụng. Các ứng dụng JET có thể chạy trực tiếp trên thiết bị Junos (on-box) hoặc chạy từ một thiết bị khác trong môi trường mạng và kết nối qua mạng tới thiết bị Junos.

Các ứng dụng JET tương tác với Junos OS và Junos OS Evolved thông qua các dịch vụ kiểu yêu cầu – phản hồi (request-response)thông báo (notification) dựa trên các kênh truyền thông chuẩn hóa theo chuẩn công nghiệp.

Hình 1: Minh họa kiến trúc dịch vụ request-response và notification của JET.

Bảng 1 mô tả cách ứng dụng JET tương tác với hệ điều hành Junos OS thông qua các dịch vụ:

Bảng 1: Ứng dụng JET tương tác với Junos OS thông qua các dịch vụ.

Dịch vụMô tả
Request-responseMột ứng dụng có thể gửi yêu cầu và chờ phản hồi từ hệ điều hành Junos OS.

Dịch vụ này được cung cấp bởi tiến trình jsd (JET service daemon) chạy trên Junos OS. Khi jsd nhận được một yêu cầu (theo mặc định qua cổng TCP 32767), nó tạo một phiên làm việc mới để phục vụ ứng dụng JET.

Phiên này sẽ duy trì cho đến khi cả client và server còn hoạt động và duy trì liên lạc. Trong suốt vòng đời của phiên, jsd có thể thực thi nhiều API khác nhau.

jsd hỗ trợ tối đa 8 phiên client hoạt động đồng thời, và có thể thực thi API song song từ các phiên này.

**Lưu ý: Để đảm bảo giao tiếp an toàn với jsd, nên sử dụng chứng chỉ RSA và giao thức bảo mật TLSv1.2 (tối thiểu).
NotificationsỨng dụng có thể nhận thông báo bất đồng bộ (asynchronous) về các sự kiện xảy ra trên Junos OS.

JET sử dụng một giao thức nhắn tin theo mô hình publish-subscribe (phát – đăng ký) và một thành phần notification broker.

Ứng dụng JET có thể đăng ký (subscribe) với broker này và chỉ định chủ đề (topic) mà ứng dụng quan tâm để nhận thông báo.

Broker chịu trách nhiệm phân phối thông báo đến các client quan tâm dựa trên topic.

Các tiến trình trong Junos OS (như eventd) đóng vai trò publisher, kết nối đến broker và phát các sự kiện.

📡 JET sử dụng giao thức MQTT (Message Queue Telemetry Transport) để hiện thực hóa dịch vụ thông báo này. Tham khảo thêm tại: https://mqtt.org

JET và gRPC

JET hỗ trợ framework gRPC để thực hiện gọi thủ tục từ xa (RPCs). JET sử dụng gRPC cho các dịch vụ cross-language (liên ngữ) như một cơ chế để kích hoạt dịch vụ request-response. gRPC cũng cung cấp cơ chế để định nghĩa API mà không phụ thuộc vào ngôn ngữ lập trình.

Để biết thêm thông tin, tham khảo tại https://www.grpc.io/.

Cài đặt JET VM

Tổng quan

Trước khi phát triển hoặc chạy ứng dụng JET, bạn cần cài đặt gói phần mềm JET trên một thiết bị ngoại vi. Gói phần mềm JET bao gồm công cụ JET, plugin, và các công cụ thư viện khác cần thiết để phát triển ứng dụng chạy trên thiết bị (on-device) hoặc ngoài thiết bị (off-device). Sau khi cài đặt công cụ JET trên thiết bị ngoại vi, thiết bị này sẽ hoạt động như máy ảo JET (JET virtual machine - VM) của bạn.

Nếu bạn đang phát triển một ứng dụng có phụ thuộc vào các mô-đun C hoặc C++, hoặc phát triển ứng dụng đã ký, bạn phải sử dụng JET VM cho quá trình phát triển ứng dụng JET.

Hướng dẫn tải về các gói sau trên thiết bị ngoại vi:

  • Gói phần mềm JET: Gói này bao gồm sandbox JET và tệp công cụ (toolchain). Trong tên gói junos-jet-XX.YRZ.S.tar.gz:
    • XX là số phát hành chính của sản phẩm, ví dụ: 21.
    • Y là số phát hành phụ của sản phẩm, ví dụ: 2.
    • R là loại phát hành phần mềm, ví dụ: R cho FRS hoặc phát hành bảo trì (maintenance release).
    • Z là số phiên bản xây dựng của sản phẩm, ví dụ: 1, chỉ ra FRS thay vì phát hành bảo trì.
    • S là số lần quay (spin number) của sản phẩm, ví dụ: 13.
  • Thư viện JET client IDL: Gói này chứa các tệp định nghĩa protobuf cho các API JET. Bạn cũng có thể xem các tệp này trên kho mã nguồn JET GitHub repository.

Cài đặt gói phần mềm JET

Cài đặt JET trên một thiết bị ngoại vi – thiết bị này sẽ đóng vai trò như máy ảo JET (JET VM) của bạn. Phần này sẽ hướng dẫn bạn từng bước cách cài đặt JET trên thiết bị chạy hệ điều hành Ubuntu.

  • Tải về gói phần mềm JET vào thiết bị ngoại vi của bạn từ trang tải xuống của Juniper Networks. Trong ví dụ này, chúng ta tải gói phần mềm cho JET phiên bản 21.4R2.
  • Mở cửa sổ Terminal, Command hoặc cửa sổ dòng lệnh tương tự trên thiết bị của bạn. Xác nhận tệp đã được tải về thành công.

user@jet-vm:~$ cd ~/Downloads

user@jet-vm:~/Downloads$ ls

junos-jet-21.4R2.10.tar.gz

  • Giải nén tệp

user@jet-vm:~/Downloads$ tar -zxf junos-jet-21.4R2.10.tar.gz

  • Xem nội dung của tệp đã giải nén

user@jet-vm:~/Downloads$ ls

junos-jet-21.4R2.10  junos-jet-21.4R2.10.tar.gz

user@jet-vm:~/Downloads$ cd junos-jet-21.4R2.10/

user@jet-vm:~/Downloads/junos-jet-21.4R2.10$ ls

init_linux_prereqs.sh  junos-jet-sb-21.4R2.10-signed.tgz         README

install                junos-jet-toolchain-21.4R2.10-signed.tgz

Cài đặt gói. Sử dụng lệnh ./install nếu bạn đang đăng nhập với quyền root. Nếu bạn đang đăng nhập bằng người dùng khác, hãy sử dụng lệnh sudo ./install. Khi sử dụng lệnh sudo ./install, hệ thống sẽ yêu cầu bạn nhập mật khẩu tài khoản của mình.

**Lưu ý: Đầu ra (output) trong ví dụ này đã được rút gọn để ngắn gọn.

user@jet-vm:~/Downloads/junos-jet-21.4R2.10$ sudo ./install

[sudo] password for user:

Installing jot utility

Reading package lists... Done

Building dependency tree

[...]

Installation of JET SB successful.

[...]

Installation of JET Toolchain successful.

Installation of junos-jet-sb and junos-jet-toolchain completed

JET sandbox và bộ công cụ (toolchain) đã được cài đặt trên thiết bị của bạn. Thiết bị này hiện đã hoạt động như một JET VM.

Thiết lập môi trường máy ảo (Virtual Machine Environment)

Để thiết lập biến môi trường PATH và chuẩn bị cho JET VM, thực hiện như sau:

  • Mở cửa sổ Terminal trên JET VM.
  • Thêm đường dẫn tuyệt đối đến thư mục bin nằm trong gói đã giải nén (/junos-jet-XX.YRZ.S.tar.gz/bin) vào biến PATH trong tệp .bashrc.

 

user@jet-vm:~$ echo 'PATH=$PATH:/usr/local/junos-jet/18.3R1/junos-jet-XX.YRZ.S.tar.gz'>>~/.bashrc

  • Chạy lệnh sau để hiển thị đường dẫn của tệp JET XX.YRZ.S.tar.gz trong phần đầu ra:

user@jet-vm:~$ source ~/.bashrc

  • Chạy lệnh env để đảm bảo rằng biến PATH đã chứa đường dẫn thư mục mà bạn vừa thêm vào.

user@jet-vm:~$ env

PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin: /bin:/usr/games:/usr/local/junos-jet/18.3R1/junos-jet-XX.YRZ.S.tar.gz/bin

Bạn đã sẵn sàng để phát triển ứng dụng trong môi trường JET VM.

Tải xuống JET IDL

  • Tải tệp IDL về thiết bị của bạn từ trang tải xuống của Juniper Networks.

  • Tạo một thư mục trên thiết bị của bạn để lưu trữ các tệp định nghĩa proto (protobuf definition files).

user@jet-vm:~$ mkdir jet

user@jet-vm:~$ cd jet

user@jet-vm:~/jet$ mkdir proto

  • Xác nhận tệp IDL đã tải xuống.

user@jet-vm:~/jet$ cd ../Downloads

user@jet-vm:~/Downloads$ ls

jet-idl-21.4R2.10.tar.gz  junos-jet-21.4R2.10  junos-jet-21.4R2.10.tar.gz

  • Giải nén tệp IDL vào thư mục bạn đã tạo.

user@jet-vm:~/Downloads$ tar -xzf jet-idl-21.4R2.10.tar.gz -C ../jet/proto/

  • Xác nhận tập tin đã được giải nén đúng cách.

user@jet-vm:~/Downloads$ cd ../jet/proto

user@jet-vm:~/jet/proto$ ls

1  2  README

  • Bạn có thể xem các tệp định nghĩa JET API proto mới nhất trong thư mục có tên là 2.

user@jet-vm:~/jet/proto$ cd 2

user@jet-vm:~/jet/proto/2$ ls

jnx_authentication_service.proto  jnx_routing_base_service.proto

jnx_common_addr_types.proto       jnx_routing_base_types.proto

jnx_common_base_types.proto       jnx_routing_bgp_service.proto

jnx_firewall_service.proto        jnx_routing_flexible_tunnel_profile.proto

jnx_interfaces_service.proto      jnx_routing_flexible_tunnel_service.proto

jnx_management_service.proto      jnx_routing_interface_service.proto

jnx_registration_service.proto    jnx_routing_rib_service.proto

Bạn đã tải xuống tệp IDL thành công. Tệp đã sẵn sàng để sử dụng.

Chuẩn bị biên dịch các tệp định nghĩa Proto trong Python

Nếu bạn sử dụng Python, bạn cần cài đặt một số công cụ gRPC trước khi có thể biên dịch các tệp định nghĩa proto trong Python. Các bước này cũng được mô tả trong trang Quick Start trên trang web gRPC.

  • (Tùy chọn) Kích hoạt môi trường ảo (virtual environment).

user@jet-vm:~/PycharmProjects/jetTest$ source venv/bin/activate

(venv) user@jet-vm:~/PycharmProjects/jetTest$

  • Kiểm tra xem bạn đã cài đặt các phiên bản Python và Pip mong muốn chưa. Nếu chưa cài đặt, hãy cài đặt chúng ngay bây giờ.

(venv) user@jet-vm:~/PycharmProjects/jetTest$ python --version

Python 3.8.10

(venv) user@jet-vm:~/PycharmProjects/jetTest$ python -m pip --version

pip 22.2.2 from /home/user/PycharmProjects/jetTest/venv/lib/python3.8/site-packages/pip (python 3.8)

  • Cài đặt gRPC nếu nó chưa được cài đặt.

(venv) user@jet-vm:~/PycharmProjects/jetTest$ python -m pip install grpcio

Collecting grpcio

  Downloading grpcio-1.48.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB)

     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.6/4.6 MB 6.1 MB/s eta 0:00:00

Collecting six>=1.5.2

  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)

Installing collected packages: six, grpcio

Successfully installed grpcio-1.48.1 six-1.16.0

    + Nếu gRPC đã được cài đặt, bạn sẽ thấy thông báo này:

(venv) user@jet-vm:~$ python -m pip install grpcio

Requirement already satisfied: grpcio in ./PycharmProjects/jetTest/venv/lib/python3.8/site-packages (1.48.1)

  • Cài đặt công cụ gRPC nếu nó chưa được cài đặt.

(venv) user@jet-vm:~/PycharmProjects/jetTest$ python -m pip install grpcio-tools

Collecting grpcio-tools

  Downloading grpcio_tools-1.48.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB)

     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 10.6 MB/s eta 0:00:00

Requirement already satisfied: setuptools in ./venv/lib/python3.8/site-packages (from grpcio-tools) (60.2.0)

Collecting protobuf<4.0dev,>=3.12.0

  Using cached protobuf-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB)

Requirement already satisfied: grpcio>=1.48.1 in ./venv/lib/python3.8/site-packages (from grpcio-tools) (1.48.1)

Requirement already satisfied: six>=1.5.2 in ./venv/lib/python3.8/site-packages (from grpcio>=1.48.1->grpcio-tools) (1.16.0)

Installing collected packages: protobuf, grpcio-tools

Successfully installed grpcio-tools-1.48.1 protobuf-3.20.1

Bạn đã sẵn sàng để biên dịch các tệp IDL mà bạn cần để phát triển ứng dụng của mình.

 

Chúc các bạn thực hiện thành công. Hi vọng bài viết này sẽ giúp ích cho các bạn trong công việc. Nếu bạn có vấn đề gì thắc mắc đừng ngần ngại liên hệ với chúng tôi theo thông tin dưới đây để được hỗ trợ thêm.

Hẹn gặp lại các bạn trong các bài viết tiếp theo !

CÔNG TY CỔ PHẦN DỊCH VỤ CÔNG NGHỆ DATECH

• Địa chỉ: Số 23E4 KĐT Cầu Diễn, Tổ 7, Phú Diễn, Bắc Từ Liêm, Hà Nội

• Điện thoại: 02432012368

• Hotline: 098 115 6699

• Email: info@datech.vn

• Website: https://datech.vn