1
00:00:03,767 --> 00:00:05,718
これがtestbed-qemuです

2
00:00:05,718 --> 00:00:09,619
本物のprplOSルーターを
QEMUの中で起動します

3
00:00:10,120 --> 00:00:14,300
このルーターを被試験デバイス、
略してDUTと呼びます

4
00:00:14,800 --> 00:00:19,373
prplOSのcramテストを実行します。
CIと同じテストです

5
00:00:19,873 --> 00:00:24,837
選んだprplOSイメージから、
手元のマシンでDUTを起動します

6
00:00:29,197 --> 00:00:33,692
Docker Compose/rootless Podmanで
testbed-qemuコンテナを実行します

7
00:00:33,692 --> 00:00:38,740
コンテナ内のテストホストが
cram、SSH、シリアルを扱います

8
00:00:38,740 --> 00:00:43,235
その隣でQEMUがDUTを起動し、
ホストにKVMがあれば使います

9
00:00:43,235 --> 00:00:45,586
3本の配線が両側をつなぎます

10
00:00:45,586 --> 00:00:47,937
LANにはテストのトラフィックが
流れます

11
00:00:47,937 --> 00:00:52,086
WANはコンテナのDHCPサーバーから
アドレスを取得し、

12
00:00:52,086 --> 00:00:54,922
それを経由して外部に接続します

13
00:00:54,922 --> 00:00:57,480
3本目はシリアルコンソールです

14
00:00:57,480 --> 00:01:02,805
コンテナにprplOSのツリーと、
読み取り専用のイメージを渡します

15
00:01:02,805 --> 00:01:07,092
ログと結果用のフォルダも渡し、
シェル用には

16
00:01:07,092 --> 00:01:09,374
永続ディスク用の
フォルダを渡します

17
00:01:13,734 --> 00:01:19,603
Linux、git、make、Docker Compose
またはrootless Podmanが必要です

18
00:01:19,603 --> 00:01:23,020
KVMがあれば、
DUTは約30秒で起動します

19
00:01:23,020 --> 00:01:26,065
KVMがなくてもQEMUは動きますが、
低速です

20
00:01:26,565 --> 00:01:29,388
testbed-qemuリポジトリを
クローンします

21
00:01:32,900 --> 00:01:34,361
make fetchを実行します

22
00:01:34,361 --> 00:01:38,892
固定版のprplOSイメージを取得し、
チェックサムを検証します

23
00:01:38,892 --> 00:01:43,716
prplOSの軽量版テストツリーも
qa-cacheフォルダに書き出します

24
00:01:44,216 --> 00:01:46,580
次にmake test-qemu-shellを
実行します

25
00:01:46,580 --> 00:01:49,575
初回はコンテナをビルドします

26
00:01:49,575 --> 00:01:53,595
DUTを起動し、
コンテナ内でシェルを開きます

27
00:01:57,955 --> 00:02:01,838
smokeなどのテストbucketには
本物のprplOSクローンが必要です

28
00:02:01,838 --> 00:02:04,655
make fetchの軽量版ツリーでは
足りません

29
00:02:04,655 --> 00:02:08,614
そこで、testbed-qemuが固定する
コミットでprplOSをクローンします

30
00:02:09,114 --> 00:02:10,802
make test-qemuを実行します

31
00:02:10,802 --> 00:02:14,318
クローンを指定し、
smoke bucketを選びます

32
00:02:14,318 --> 00:02:18,256
新しいDUTを起動し、
SSHとデータモデルを待ちます

33
00:02:18,256 --> 00:02:23,038
このボード用にクローンが挙げる
6つのsmokeテストを実行します

34
00:02:25,502 --> 00:02:30,410
prplOSのCIのマージリクエストで
同じsmoke bucketを手動実行でき、

35
00:02:30,410 --> 00:02:33,967
QEMUジョブとして同じ
testbed-qemuコンテナで動きます

36
00:02:33,967 --> 00:02:37,453
6つのsmokeテストを実行し、
うち1つをスキップします

37
00:02:37,453 --> 00:02:39,444
次に事後テストを2つ実行します

38
00:02:39,444 --> 00:02:44,708
実行は成功しましたが、ジョブは
DUTのデバッグ情報も収集しました

39
00:02:44,708 --> 00:02:47,838
このジョブはKVMを備えた
GitLabランナーで動きます

40
00:02:52,198 --> 00:02:55,002
シェルモードは
make test-qemu-shellです

41
00:02:55,002 --> 00:02:59,409
DUTの起動中でも、
すぐにシェルが使えます

42
00:02:59,967 --> 00:03:01,655
上矢印キーを押します

43
00:03:01,655 --> 00:03:07,875
シェル履歴にtestbed-qemu waitと
testbed-qemu sshがすでにあります

44
00:03:07,875 --> 00:03:12,673
waitコマンドは、DUTが
SSHで応答するまで待機します

45
00:03:12,673 --> 00:03:16,138
次にsshでDUTのroot
シェルを開きます

46
00:03:16,638 --> 00:03:21,446
これでDUTをrootで操作できます。
例えば、経路一覧を表示します

47
00:03:25,638 --> 00:03:31,755
SSHでなくシリアルコンソールなら
testbed-qemu consoleを実行します

48
00:03:31,755 --> 00:03:33,909
Enterキーを押すと
プロンプトが出ます

49
00:03:33,909 --> 00:03:36,924
Ctrl+]（閉じ角括弧）で
シェルに戻ります

50
00:03:41,284 --> 00:03:42,410
テストを追加します

51
00:03:42,410 --> 00:03:47,967
手元のprplOSツリーに保存します。
シェルから同じファイルが見えます

52
00:03:47,967 --> 00:03:52,848
cramテストはテキストファイルで、
コマンドと期待する出力を書きます

53
00:03:52,848 --> 00:03:56,828
これはLAN経由でSSHが
DUTに届くか確認します

54
00:03:57,328 --> 00:03:59,474
testbed-qemu cramで実行します

55
00:03:59,474 --> 00:04:02,480
すでに起動中のDUTに対して
実行するので、

56
00:04:02,480 --> 00:04:05,270
起動し直さずに再実行できます

57
00:04:05,770 --> 00:04:09,455
次は壊してみます。
ファイルの期待出力を変えます

58
00:04:12,270 --> 00:04:13,194
再実行します

59
00:04:13,194 --> 00:04:18,593
cramはdiffを表示します。
期待された行と、実際の行です

60
00:04:20,770 --> 00:04:26,064
出力が正しければ受け入れます。
ランナーが示すcpコマンドを

61
00:04:26,064 --> 00:04:26,858
ホストで実行

62
00:04:32,630 --> 00:04:34,940
CIでQEMUジョブが失敗したら、

63
00:04:34,940 --> 00:04:41,043
まず手元のmake test-qemuで
同じテストを実行し、再現します

64
00:04:41,543 --> 00:04:45,620
testbed-qemu自身のテストから
再起動テストを実行します

65
00:04:45,620 --> 00:04:50,770
マーカーファイルを書き、DUTを
再起動し、SSHの復帰を待ちます

66
00:04:50,770 --> 00:04:55,706
次に、マーカーが残り、稼働時間が
リセットされたことを確認します

67
00:04:55,706 --> 00:04:59,568
このテストはtestbed-qemu自身の
CIで毎パイプライン実行されます

68
00:05:00,068 --> 00:05:03,827
make test-qemuのバッチ実行では、
常にイメージの専用コピーを

69
00:05:03,827 --> 00:05:06,054
工場出荷状態で起動します

70
00:05:06,054 --> 00:05:10,092
シェルは初回にイメージから
自身のディスクを書き込み、

71
00:05:10,092 --> 00:05:14,755
qemu-disk-stateフォルダに置き、
セッションをまたいで保持します

72
00:05:14,755 --> 00:05:17,748
testbed-qemu disk resetで
初期状態に戻せます

73
00:05:17,748 --> 00:05:21,438
その後、次の管理下の起動は
工場出荷状態から始まります

74
00:05:21,938 --> 00:05:23,150
実行が失敗すると、

75
00:05:23,150 --> 00:05:26,786
testbed-qemuは、
DUTのデバッグ情報を

76
00:05:26,786 --> 00:05:28,925
DUTの電源を切る前に
収集します

77
00:05:28,925 --> 00:05:34,914
先ほどのprplOSのCIジョブは、
成功時も含め毎回これを収集します

78
00:05:34,914 --> 00:05:38,265
起動中のシェルでは、
いつでも取得できます

79
00:05:42,625 --> 00:05:45,473
testbed-qemuにはエージェント用の
スキルもあります

80
00:05:45,473 --> 00:05:49,880
スキルファイルに正確なコマンド、
終了コードと手順書が載っています

81
00:05:49,880 --> 00:05:53,067
ここではClaude Code（Sonnet）が
autoモードで作業します

82
00:05:53,067 --> 00:05:56,729
スキルを読み込み、doctorで
ホストを確認します

83
00:05:56,729 --> 00:05:59,373
doctorはまず
コンテナイメージをビルドします

84
00:05:59,373 --> 00:06:03,984
次にテストがQEMUでDUTを起動し、
SSHとデータモデルを待ち、

85
00:06:03,984 --> 00:06:06,086
接続テストを実行します

86
00:06:06,086 --> 00:06:09,679
テストの成功を、事後チェック、

87
00:06:09,679 --> 00:06:11,917
起動時間、成果物と共に報告します

88
00:06:11,917 --> 00:06:16,324
ステータスラインは実行にかかった
トークン、時間、金額を表示します

89
00:06:18,985 --> 00:06:24,049
testbed-qemuは、prplOSイメージを
ユーザー空間ごと起動します

90
00:06:24,049 --> 00:06:27,739
DUTに本物のLAN、WAN、
シリアルコンソールを提供します

91
00:06:27,739 --> 00:06:30,198
ただし、実機の代わりにはならず、

92
00:06:30,198 --> 00:06:34,033
スイッチもセルラーゲートウェイも
模擬しません

