APRESIA Technical Blog

SONiC DASHのテスト環境を仮想マシンで作ってみた

はじめに

SONiCは、ホワイトボックススイッチにて動作するOSSのネットワークOSです。そのSONiCをベースにして、DPU/IPUなどのスマートNICあるいはアプライアンスを制御する仕組みとして、DASH(Disaggregated API for SONiC Hosts)が開発されています。
https://github.com/sonic-net/DASH
まだ、SONiC DASHを動かせるハードウェアを入手することは敷居が高いですが、DASHの動作を確認すること自体は仮想マシンにて可能です。本記事では、仮想マシン上にてSONiC DASHの環境を作成し、テストを実行するまでの手順を共有いたします。

本記事にて実施する試験内容

SONiC DASHは、SONiCのフレームワークを使って、スマートNICなどのP4プログラマブルデバイスを制御することを目的に開発されています。DASHの基本設計は以下をご参照ください。
https://github.com/sonic-net/DASH/blob/main/documentation/general/dash-sonic-hld.md
SONiC DASHが目指しているアーキテクチャは以下です。既にSONiCのコミュニティの中で、それぞれのソースコードが公開され始めています。

図1 SONiC DASHアーキテクチャ

上記の中で、今回の記事ではP4プログラムとlibsai部分を、以下の構成にて試験します。

図2 本記事の試験構成

SONiC DASHの試験環境の構築

今回の実験では、以下の仮想マシンの環境を用意しました。
  • OS:Ubuntu 20.04
  • CPUコア数:4
  • メモリ:8GB
  • ストレージ:48GB
事前にdocker-ceをインストールします(以下、参考)。
https://docs.docker.com/engine/install/ubuntu/
docker-ceをインストールしたら、以下のようにユーザをdockerグループに所属させておきます。
sudo gpasswd -a [user name] docker
また、以下のようにmakeコマンドをインストールしておきます。
sudo apt install make
SONiC DASHの仮想マシンでの試験環境の構築は以下を参考にしました。
https://github.com/sonic-net/DASH/blob/main/dash-pipeline/README-saithrift.md
以下を順番に実行します。本記事を執筆時点のgitのコミット番号は、08800bfa6cbb05da94275fa05fb924d0c932d3d2 です。
git clone https://github.com/sonic-net/DASH.git
cd DASH/dash-pipeline
make clean && make all
makeコマンドを実行すると、必要なDockerイメージをダウンロードし、テスト環境を構築します。ダウンロード速度に依りますが、ここでしばらく時間がかかります。コマンドが正常に終了すると、以下のようにDockerのイメージがダウンロードされます。
adpro@dash:~$ docker images
REPOSITORY                                            TAG           IMAGE ID       CREATED         SIZE
local/dash-saichallenger-client                       latest        6ccb0791d1ea   15 hours ago    1.51GB
local/dash-saithrift-client                           latest        961158ddb0c7   15 hours ago    532MB
sonicdash.azurecr.io/dash-saithrift-bldr              220819        4c4f3ee5f69f   5 weeks ago     1.62GB
sonicdash.azurecr.io/dash-saithrift-bldr              a7005917228   4c4f3ee5f69f   5 weeks ago     1.62GB
sonicdash.azurecr.io/dash-saichallenger-client-bldr   230601        2b031d616f3e   8 months ago    1.48GB
sonicdash.azurecr.io/dash-saichallenger-client-bldr   462187a3c1e   2b031d616f3e   8 months ago    1.48GB
sonicdash.azurecr.io/dash-saithrift-client-bldr       230523        1f012c99e214   8 months ago    500MB
sonicdash.azurecr.io/dash-saithrift-client-bldr       5fe6a8e4e50   1f012c99e214   8 months ago    500MB
sonicdash.azurecr.io/dash-p4c-bmv2                    40c82fd0c19   0fea6f535295   15 months ago   605MB
sonicdash.azurecr.io/dash-bmv2-bldr                   beeeda3f7ae   b04cd831362e   15 months ago   1GB

SONiC DASHのテストの実行

ここからは、SONiC DASHのテストを実行していきます。ここで説明するコマンドは、"DASH/dash-pipeline/"にて実行することを前提に記載しています。まず一つのウィンドウにて、以下を実行して、BMv2(P4スイッチのシミュレータ)を起動します。
make run-switch
別のウィンドウを開き、以下のようにして、SAIのthriftサーバを起動します。このサーバが起動すると、P4Runtimeを使って、BMv2にDASHのP4プログラムがロードされます。
make run-saithrift-server
これでテストを実行できる準備が整いました。テストの実行方法はコンテナ外部あるいはコンテナ内部にて実行する二通りの方法があります。ここではテスト用コンテナを起動して、そのコンテナ内部にてテストを実行する場合の実行例を示します。まず、以下のコマンドにて、テスト用コンテナを起動します。
make run-saithrift-client-bash
上記のコマンドを実行すると、テスト実行用のコンテナの中のshellに入った状態になります。このコンテナの中で、以下の手順にてテストを実行することができます。
cd /tests-dev/functional/ptf
./run-tests.sh
以下はテストを実行したときのスクリーンログの一部です。
# ./run-tests.sh

(中略)

saidashvnet_sanity.SaiThriftVnetOutboundUdpV6PktTest ... Reboot mode is: cold
Config_db.json uses default path /SAI/ptf/config/../resources/config_db.json
port_config.ini uses default path /SAI/ptf/config/../resources/port_config.ini
Ignore all the expect error code and exception captures.
Get number_of_system_ports 0
Get number_of_active_ports 2
Restore all the expect error code and exception captures.
***** Number of available resources *****
SAI_SWITCH_ATTR_ECMP_MEMBERS :  0
ecmp_members :  0
SAI_SWITCH_ATTR_NUMBER_OF_ECMP_GROUPS :  0
number_of_ecmp_groups :  0
SAI_SWITCH_ATTR_AVAILABLE_IPV4_ROUTE_ENTRY :  0
available_ipv4_route_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_IPV6_ROUTE_ENTRY :  0
available_ipv6_route_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEXTHOP_ENTRY :  0
available_ipv4_nexthop_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEXTHOP_ENTRY :  0
available_ipv6_nexthop_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEIGHBOR_ENTRY :  0
available_ipv4_neighbor_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEIGHBOR_ENTRY :  0
available_ipv6_neighbor_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_ENTRY :  0
available_next_hop_group_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_MEMBER_ENTRY :  0
available_next_hop_group_member_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_FDB_ENTRY :  0
available_fdb_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_IPMC_ENTRY :  0
available_ipmc_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY :  0
available_snat_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY :  0
available_dnat_entry :  0
SAI_SWITCH_ATTR_AVAILABLE_DOUBLE_NAT_ENTRY :  0
available_double_nat_entry :  0
Get default vlan...
For Common platform, Only check Port status.
Turn up port 281474976710657
Turn up port 281474976710658
For Common platform, expecting bridge ports not been created by default.
Finish SaiHelperBase setup

SaiThriftVnetOutboundUdpV6PktTest configureVnet OK
        Sending packet with wrong vip...
        Verifying drop...
        Sending packet with wrong dst CA IP to verify routing drop...
        Verifying drop...
        Sending packet with wrong dst CA IP to verify mapping drop...
        Verifying drop...
        Sending outbound packet...
        Verifying packet...
SaiThriftVnetOutboundUdpV6PktTest OK
SaiThriftVnetOutboundUdpV6PktTest tearDown OK
Platform not set. The common platform was selected
ok

----------------------------------------------------------------------
Ran 1 test in 0.628s

OK
上記のテストは、以下のリンクにあるPTF(Packet Test Framework)のテストを実行しています。
https://github.com/sonic-net/DASH/tree/main/test/test-cases/functional/ptf
上記のテストを実行する際に、veth0にてキャプチャをすると、以下のようにテストフレームの送受信がされていることを確認することができます。
~$ sudo tshark -i veth0
Running as user "root" and group "root". This could be dangerous.
Capturing on 'veth0'
    1 0.000000000     10.1.1.1 → 10.1.2.50    UDP 150 1234 → 80 Len=58
    2 0.043521492     10.1.1.1 → 10.1.2.50    UDP 150 1234 → 80 Len=58
    3 0.057606501     10.1.1.2 → 10.1.2.50    UDP 150 1234 → 80 Len=58
    4 0.750925458    10.1.1.10 → 10.1.2.50    UDP 150 1234 → 80 Len=58
    5 0.858421311    10.1.1.10 → 10.200.2.50  UDP 150 1234 → 80 Len=58
    6 0.965400175    10.1.1.10 → 10.1.211.211 UDP 150 1234 → 80 Len=58
    7 1.076226342    10.1.1.10 → 10.1.2.50    UDP 150 1234 → 80 Len=58
    8 1.083772241    10.1.1.10 → 10.1.2.50    UDP 150 1234 → 80 Len=58
    9 1.349784076 2000:aaaa::10a → 2000:aaaa::232 UDP 150 1234 → 80 Len=38
   10 1.458964076 2000:aaaa::10a → 2000:bbbb::232 UDP 150 1234 → 80 Len=38
   11 1.566390735 2000:aaaa::10a → 2000:aaaa::d3d3 UDP 150 1234 → 80 Len=38
   12 1.677291943 2000:aaaa::10a → 2000:aaaa::232 UDP 150 1234 → 80 Len=38
   13 1.703999486 2000:aaaa::10a → 2000:aaaa::232 UDP 150 1234 → 80 Len=38
最後に、テストのために起動したすべてのコンテナを終了する場合は、以下のコマンドを実行します。
make kill-all 

最後に

今回は仮想マシン環境にて、SONiC DASHの中の、SAIとP4プログラムの動作確認の試験を行いました。今回は基本的なテストフレームの送受信を確認しましたが、実際には以下のリンクに記載があるように、いくつかのユースケースの実装も考えられているようです。
https://github.com/sonic-net/DASH/tree/main/documentation

  • Load Balancer Service
  • VNET-to-VNET Service
  • Service Tunnel & Private Link Service
  • VNET Peering Service
  • Express Route (ER) Service
  • Encryption Gateway Service

今後もSONiC DASHの開発を追いかけようと考えています。