| # Flutter Infrastructure Foundation |
| |
| The Flutter Infrastructure Foundation Team is responsible for setting up, maintaining and improving the low level infrastructure used to build, test and release Flutter. |
| |
| |
| ## DeviceLab Hardware |
| |
| Flutter keeps a lab of test beds that include hosts and phones for all the supported platforms. These test beds are used to collect performance benchmarks and detect regressions. |
| |
| As of May 2023 the Flutter DeviceLab contains 99 test beds with the following hardware and software: |
| |
| |
| <table> |
| <tr> |
| <td><strong>Host</strong> |
| </td> |
| <td><strong>Architecture</strong> |
| </td> |
| <td><strong>Phone</strong> |
| </td> |
| <td><strong>Count</strong> |
| </td> |
| </tr> |
| <tr> |
| <td>Linux |
| </td> |
| <td>X64 |
| </td> |
| <td>Android |
| </td> |
| <td>36 |
| </td> |
| </tr> |
| <tr> |
| <td>Windows |
| </td> |
| <td>X64 |
| </td> |
| <td>Android |
| </td> |
| <td>6 |
| </td> |
| </tr> |
| <tr> |
| <td>Windows |
| </td> |
| <td>Arm64 |
| </td> |
| <td>Android |
| </td> |
| <td>1 |
| </td> |
| </tr> |
| <tr> |
| <td>Windows |
| </td> |
| <td>Arm64 |
| </td> |
| <td> |
| </td> |
| <td>9 |
| </td> |
| </tr> |
| <tr> |
| <td>Mac |
| </td> |
| <td>X64 |
| </td> |
| <td>iOS |
| </td> |
| <td>18 |
| </td> |
| </tr> |
| <tr> |
| <td>Mac |
| </td> |
| <td>X64 |
| </td> |
| <td> |
| </td> |
| <td>2 |
| </td> |
| </tr> |
| <tr> |
| <td>Mac |
| </td> |
| <td>Arm64 |
| </td> |
| <td>iOS |
| </td> |
| <td>12 |
| </td> |
| </tr> |
| <tr> |
| <td>Mac |
| </td> |
| <td>Arm64 |
| </td> |
| <td> |
| </td> |
| <td>1 |
| </td> |
| </tr> |
| <tr> |
| <td>Mac |
| </td> |
| <td>X64 |
| </td> |
| <td>Android |
| </td> |
| <td>9 |
| </td> |
| </tr> |
| <tr> |
| <td>Mac |
| </td> |
| <td>Arm64 |
| </td> |
| <td>Android |
| </td> |
| <td>5 |
| </td> |
| </tr> |
| </table> |
| |
| |
| |
| ## VMs |
| |
| Flutter uses Linux and Windows virtual machines to build and test Flutter. These VMs are auto-provisioned and distributed to 4 different pools. The following is the configuration distribution: |
| |
| |
| <table> |
| <tr> |
| <td style="background-color: null"><strong>LUCI pool</strong> |
| </td> |
| <td style="background-color: null"><strong>config</strong> |
| </td> |
| <td style="background-color: null"><strong>os</strong> |
| </td> |
| <td style="background-color: null"><strong>cpus</strong> |
| </td> |
| <td style="background-color: null"><strong>count</strong> |
| </td> |
| <td style="background-color: null"><strong>total cpus</strong> |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.prod |
| </td> |
| <td style="background-color: null">e2-standard-32 |
| </td> |
| <td style="background-color: null">Linux |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 32</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 15</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 480</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.prod |
| </td> |
| <td style="background-color: null">n1-standard-8 |
| </td> |
| <td style="background-color: null">Linux |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 8</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 135</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 1080</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.try |
| </td> |
| <td style="background-color: null">e2-standard-32 |
| </td> |
| <td style="background-color: null">Linux |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 32</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 30</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 960</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.try |
| </td> |
| <td style="background-color: null">n1-standard-8 |
| </td> |
| <td style="background-color: null">Linux |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 8</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 137</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 1096</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.staging |
| </td> |
| <td style="background-color: null">e2-standard-32 |
| </td> |
| <td style="background-color: null">Linux |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 32</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 4</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 128</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.staging |
| </td> |
| <td style="background-color: null">n1-standard-8 |
| </td> |
| <td style="background-color: null">Linux |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 8</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 30</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 240</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.dart-internal.flutter |
| </td> |
| <td style="background-color: null">e2-standard-32 |
| </td> |
| <td style="background-color: null">Linux |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 32</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 20</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 640</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.prod |
| </td> |
| <td style="background-color: null">e2-highmem-8 |
| </td> |
| <td style="background-color: null">Windows |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 8</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 59</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 472</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.try |
| </td> |
| <td style="background-color: null">e2-highmem-8 |
| </td> |
| <td style="background-color: null">Windows |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 8</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 130</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 1040</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.staging |
| </td> |
| <td style="background-color: null">e2-highmem-8 |
| </td> |
| <td style="background-color: null">Windows |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 8</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 12</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 96</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.dart-internal.flutter |
| </td> |
| <td style="background-color: null">e2-highmem-8 |
| </td> |
| <td style="background-color: null">Windows |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 8</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 20</p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 160</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null"><strong>Totals</strong> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| <strong>592</strong></p> |
| |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| <strong>6392</strong></p> |
| |
| </td> |
| </tr> |
| </table> |
| |
| |
| |
| ## Mac hostonly machines |
| |
| Mac machines are organized in a different category because they are provisioned in chrome labs and have no phones attached. The machine configurations are the following: |
| |
| |
| <table> |
| <tr> |
| <td style="background-color: null"><strong>LUCI pool</strong> |
| </td> |
| <td style="background-color: null"><strong>model</strong> |
| </td> |
| <td style="background-color: null"><strong>os</strong> |
| </td> |
| <td style="background-color: null"><strong>count</strong> |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.prod |
| </td> |
| <td style="background-color: null">Macmini8,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G115 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 28</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.prod |
| </td> |
| <td style="background-color: null">Macmini9,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G115 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 31</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.try |
| </td> |
| <td style="background-color: null">Macmini8,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G115 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 74</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.try |
| </td> |
| <td style="background-color: null">Macmini9,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G115 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 71</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.staging |
| </td> |
| <td style="background-color: null">Macmini8,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G115 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 5</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.flutter.staging |
| </td> |
| <td style="background-color: null">Macmini9,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G115 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 7</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.dart-internal.flutter |
| </td> |
| <td style="background-color: null">Macmini8,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G116 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 15</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null">luci.dart-internal.flutter |
| </td> |
| <td style="background-color: null">Macmini9,1 |
| </td> |
| <td style="background-color: null">Mac-12.6-21G117 |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| 2</p> |
| |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| </tr> |
| <tr> |
| <td style="background-color: null"><strong>Totals</strong> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"> |
| </td> |
| <td style="background-color: null"><p style="text-align: right"> |
| <strong>233</strong></p> |
| |
| </td> |
| </tr> |
| </table> |
| |
| |
| |
| ## Services |
| |
| Flutter Infrastructure Foundation owns the DeviceLab provisioning services, maintains Flutter LUCI service configurations, and provides lab maintenance services. |
| |
| This is the list of services with their descriptions: |
| |
| |
| <table> |
| <tr> |
| <td><strong>Service</strong> |
| </td> |
| <td><strong>Type</strong> |
| </td> |
| <td><strong>Description</strong> |
| </td> |
| </tr> |
| <tr> |
| <td>SALT |
| </td> |
| <td>Owned |
| </td> |
| <td>Configuration provisioning service used to push configurations as code for host and devices for all the supported platforms. |
| </td> |
| </tr> |
| <tr> |
| <td>Machine Provider |
| </td> |
| <td>Configuration management |
| </td> |
| <td>Configuration service to provision, spin up and tear down virtual machines. |
| </td> |
| </tr> |
| <tr> |
| <td>LUCI swarming bot |
| </td> |
| <td>Owned |
| </td> |
| <td>Scripts used to set up and tear down LUCI services on the supported platforms. |
| </td> |
| </tr> |
| <tr> |
| <td>Capacity planning and delivery |
| </td> |
| <td>Owned |
| </td> |
| <td>Budgeting for lab expansions, delivery of new capacity, and decommissioning of end of life hardware. |
| </td> |
| </tr> |
| <tr> |
| <td>Lab maintenance |
| </td> |
| <td>Owned |
| </td> |
| <td>Faulty hardware replacement, hardware recovery and reprovisioning. |
| <p> |
| Lab migrations planning and execution. |
| </td> |
| </tr> |
| <tr> |
| <td>Onboarding of new platforms |
| </td> |
| <td>Owned |
| </td> |
| <td>Creating provisioning SALT scripts and onboarding on LUCI services. |
| </td> |
| </tr> |
| <tr> |
| <td>Device doctor |
| </td> |
| <td>Owned |
| </td> |
| <td>Phone configuration validation and device recovery. |
| </td> |
| </tr> |
| </table> |