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の環境を作成し、テストを実行するまでの手順を共有いたします。
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のコミュニティの中で、それぞれのソースコードが公開され始めています。
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の試験環境の構築
今回の実験では、以下の仮想マシンの環境を用意しました。
https://docs.docker.com/engine/install/ubuntu/
docker-ceをインストールしたら、以下のようにユーザをdockerグループに所属させておきます。
https://github.com/sonic-net/DASH/blob/main/dash-pipeline/README-saithrift.md
以下を順番に実行します。本記事を執筆時点のgitのコミット番号は、08800bfa6cbb05da94275fa05fb924d0c932d3d2 です。
- OS:Ubuntu 20.04
- CPUコア数:4
- メモリ:8GB
- ストレージ:48GB
https://docs.docker.com/engine/install/ubuntu/
docker-ceをインストールしたら、以下のようにユーザをdockerグループに所属させておきます。
sudo gpasswd -a [user name] dockerまた、以下のようにmakeコマンドをインストールしておきます。
sudo apt install makeSONiC 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 allmakeコマンドを実行すると、必要な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スイッチのシミュレータ)を起動します。
https://github.com/sonic-net/DASH/tree/main/test/test-cases/functional/ptf
上記のテストを実行する際に、veth0にてキャプチャをすると、以下のようにテストフレームの送受信がされていることを確認することができます。
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
今後もSONiC DASHの開発を追いかけようと考えています。
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の開発を追いかけようと考えています。