├── .github ├── CODE_OF_CONDUCT.md ├── SECURITY.md ├── SUPPORT.md ├── actions │ ├── download-caller-artifacts │ │ └── action.yml │ ├── prepare-1es-machine │ │ └── action.yml │ ├── run-general-pwsh-cmd │ │ └── action.yml │ ├── run-test-script │ │ └── action.yml │ ├── start-1es-machine │ │ └── action.yml │ ├── stop-1es-machine │ │ └── action.yml │ └── stop-lab-machine │ │ └── action.yml ├── dependabot.yml └── workflows │ ├── auto-reset-parent-or-child-lab-machine.yml │ ├── check_syntax.py │ ├── cleanup-azure-vms.yml │ ├── create-azure-machine.ps1 │ ├── create-azure-machines.ps1 │ ├── create-azure-vms.yml │ ├── cts_traffic.yml │ ├── custom.yml │ ├── ebpf.yml │ ├── ebpf_dynamic_vm.yml │ ├── ebpf_linux.yml │ ├── ebpf_matrix.json │ ├── generate-summary.ps1 │ ├── lab-quic-callee.yml │ ├── main_netperfapi.yml │ ├── manage-azure-vms.ps1 │ ├── observe-lab.yml │ ├── operate-lab.yml │ ├── prepare-matrix.ps1 │ ├── prepare-matrix.yml │ ├── quic.yml │ ├── quic_matrix.json │ ├── remove-azure-machine.ps1 │ ├── reset-child-machine.yml │ ├── schedule-lab-reset.yml │ ├── set-regression-bounds.yml │ ├── tcpip.wprp │ ├── update-react.yml │ └── xdp.yml ├── .gitignore ├── 1es-machine-manager.ps1 ├── LICENSE ├── README.md ├── dashboard ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vite │ └── deps │ │ ├── _metadata.json │ │ └── package.json ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── example.sqlite ├── index.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── public │ ├── _redirects │ ├── assets │ │ ├── background │ │ │ ├── overlay_1.svg │ │ │ ├── overlay_2.jpg │ │ │ ├── overlay_3.jpg │ │ │ └── overlay_4.jpg │ │ ├── icons │ │ │ ├── glass │ │ │ │ ├── Ubuntu-Logo.png │ │ │ │ ├── ic_glass_bag.png │ │ │ │ ├── ic_glass_buy.png │ │ │ │ ├── ic_glass_message.png │ │ │ │ ├── ic_glass_users.png │ │ │ │ └── windows.png │ │ │ ├── ic_flag_de.svg │ │ │ ├── ic_flag_en.svg │ │ │ ├── ic_flag_fr.svg │ │ │ ├── ic_notification_chat.svg │ │ │ ├── ic_notification_mail.svg │ │ │ ├── ic_notification_package.svg │ │ │ ├── ic_notification_shipping.svg │ │ │ ├── navbar │ │ │ │ ├── ic_analytics.svg │ │ │ │ ├── ic_blog.svg │ │ │ │ ├── ic_cart.svg │ │ │ │ ├── ic_disabled.svg │ │ │ │ ├── ic_lock.svg │ │ │ │ └── ic_user.svg │ │ │ └── shape-avatar.svg │ │ ├── illustrations │ │ │ ├── illustration_404.svg │ │ │ ├── illustration_avatar.png │ │ │ └── illustration_login.png │ │ ├── images │ │ │ ├── avatars │ │ │ │ ├── avatar_1.jpg │ │ │ │ ├── avatar_10.jpg │ │ │ │ ├── avatar_11.jpg │ │ │ │ ├── avatar_12.jpg │ │ │ │ ├── avatar_13.jpg │ │ │ │ ├── avatar_14.jpg │ │ │ │ ├── avatar_15.jpg │ │ │ │ ├── avatar_16.jpg │ │ │ │ ├── avatar_17.jpg │ │ │ │ ├── avatar_18.jpg │ │ │ │ ├── avatar_19.jpg │ │ │ │ ├── avatar_2.jpg │ │ │ │ ├── avatar_20.jpg │ │ │ │ ├── avatar_21.jpg │ │ │ │ ├── avatar_22.jpg │ │ │ │ ├── avatar_23.jpg │ │ │ │ ├── avatar_24.jpg │ │ │ │ ├── avatar_25.jpg │ │ │ │ ├── avatar_3.jpg │ │ │ │ ├── avatar_4.jpg │ │ │ │ ├── avatar_5.jpg │ │ │ │ ├── avatar_6.jpg │ │ │ │ ├── avatar_7.jpg │ │ │ │ ├── avatar_8.jpg │ │ │ │ └── avatar_9.jpg │ │ │ ├── covers │ │ │ │ ├── cover_1.jpg │ │ │ │ ├── cover_10.jpg │ │ │ │ ├── cover_11.jpg │ │ │ │ ├── cover_12.jpg │ │ │ │ ├── cover_13.jpg │ │ │ │ ├── cover_14.jpg │ │ │ │ ├── cover_15.jpg │ │ │ │ ├── cover_16.jpg │ │ │ │ ├── cover_17.jpg │ │ │ │ ├── cover_18.jpg │ │ │ │ ├── cover_19.jpg │ │ │ │ ├── cover_2.jpg │ │ │ │ ├── cover_20.jpg │ │ │ │ ├── cover_21.jpg │ │ │ │ ├── cover_22.jpg │ │ │ │ ├── cover_23.jpg │ │ │ │ ├── cover_24.jpg │ │ │ │ ├── cover_3.jpg │ │ │ │ ├── cover_4.jpg │ │ │ │ ├── cover_5.jpg │ │ │ │ ├── cover_6.jpg │ │ │ │ ├── cover_7.jpg │ │ │ │ ├── cover_8.jpg │ │ │ │ └── cover_9.jpg │ │ │ └── products │ │ │ │ ├── product_1.jpg │ │ │ │ ├── product_10.jpg │ │ │ │ ├── product_11.jpg │ │ │ │ ├── product_12.jpg │ │ │ │ ├── product_13.jpg │ │ │ │ ├── product_14.jpg │ │ │ │ ├── product_15.jpg │ │ │ │ ├── product_16.jpg │ │ │ │ ├── product_17.jpg │ │ │ │ ├── product_18.jpg │ │ │ │ ├── product_19.jpg │ │ │ │ ├── product_2.jpg │ │ │ │ ├── product_20.jpg │ │ │ │ ├── product_21.jpg │ │ │ │ ├── product_22.jpg │ │ │ │ ├── product_23.jpg │ │ │ │ ├── product_24.jpg │ │ │ │ ├── product_3.jpg │ │ │ │ ├── product_4.jpg │ │ │ │ ├── product_5.jpg │ │ │ │ ├── product_6.jpg │ │ │ │ ├── product_7.jpg │ │ │ │ ├── product_8.jpg │ │ │ │ └── product_9.jpg │ │ ├── logo.svg │ │ ├── placeholder.svg │ │ ├── preview.jpg │ │ └── transparent.png │ ├── favicon │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ └── favicon.ico │ └── manifest.json ├── src │ ├── _mock │ │ ├── account.js │ │ ├── blog.js │ │ ├── products.js │ │ └── user.js │ ├── app.jsx │ ├── components │ │ ├── chart │ │ │ ├── chart.js │ │ │ ├── index.js │ │ │ └── use-chart.js │ │ ├── color-utils │ │ │ ├── color-picker.jsx │ │ │ ├── color-preview.jsx │ │ │ └── index.js │ │ ├── iconify │ │ │ ├── iconify.jsx │ │ │ └── index.js │ │ ├── label │ │ │ ├── index.js │ │ │ ├── label.jsx │ │ │ └── styles.js │ │ ├── logo │ │ │ ├── index.js │ │ │ └── logo.jsx │ │ ├── scrollbar │ │ │ ├── index.js │ │ │ ├── scrollbar.jsx │ │ │ └── styles.js │ │ └── svg-color │ │ │ ├── index.js │ │ │ └── svg-color.jsx │ ├── global.css │ ├── hooks │ │ ├── use-db.js │ │ ├── use-fetch-data.js │ │ ├── use-responsive.js │ │ ├── use-scroll-to-top.js │ │ └── use-sql-lite.js │ ├── layouts │ │ └── dashboard │ │ │ ├── common │ │ │ ├── account-popover.jsx │ │ │ ├── language-popover.jsx │ │ │ ├── notifications-popover.jsx │ │ │ └── searchbar.jsx │ │ │ ├── config-layout.js │ │ │ ├── config-navigation.jsx │ │ │ ├── header.jsx │ │ │ ├── index.jsx │ │ │ ├── main.jsx │ │ │ └── nav.jsx │ ├── main.jsx │ ├── pages │ │ ├── app.jsx │ │ ├── detailed.jsx │ │ ├── full-lat-curve.jsx │ │ ├── hps.jsx │ │ ├── latency.jsx │ │ ├── page-not-found.jsx │ │ ├── rps.jsx │ │ └── throughput.jsx │ ├── routes │ │ ├── components │ │ │ ├── index.js │ │ │ └── router-link.jsx │ │ ├── hooks │ │ │ ├── index.js │ │ │ ├── use-pathname.js │ │ │ └── use-router.js │ │ └── sections.jsx │ ├── sections │ │ ├── error │ │ │ ├── index.js │ │ │ └── not-found-view.jsx │ │ └── overview │ │ │ ├── app-website-visits.jsx │ │ │ ├── app-widget-summary.jsx │ │ │ ├── graphing │ │ │ ├── graph-view.jsx │ │ │ └── index.js │ │ │ └── view │ │ │ ├── app-view.jsx │ │ │ └── index.js │ ├── theme │ │ ├── css.js │ │ ├── custom-shadows.js │ │ ├── index.jsx │ │ ├── overrides.js │ │ ├── palette.js │ │ ├── shadows.js │ │ └── typography.js │ └── utils │ │ ├── common.js │ │ ├── format-number.js │ │ ├── format-time.js │ │ └── sku.js ├── vercel.json ├── vite.config.js └── wasm_worker.js ├── docs ├── arch.md ├── archive │ ├── adding-tests.md │ ├── api-interface-schema.md │ ├── detailed-onboarding-instructions.md │ ├── devdocs.md │ ├── next-steps.md │ ├── regression.md │ ├── stateless-lab-vms-image.jpg │ └── tech-specs.md ├── internal │ ├── 1es-p2p-communication.md │ ├── arch.png │ ├── database.md │ ├── netperf-arch.png │ ├── runner-table.png │ └── threat-model.md ├── lab_consumption.md ├── lab_management.md ├── machines.md ├── onboard.md ├── questions.md └── start_here.md ├── install-pwsh.sh ├── netperf-1es-syncer ├── .gitignore ├── app.js ├── package-lock.json └── package.json ├── netperf-lib.psm1 ├── pipeline ├── generate_historical_data.py ├── regression.py └── sql.py ├── run-workflow.ps1 ├── set-netperf-context.ps1 ├── setup-host.ps1 ├── setup-runner-linux.sh └── setup-runner-windows.ps1 /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /.github/SUPPORT.md: -------------------------------------------------------------------------------- 1 | # TODO: The maintainer of this repo has not yet edited this file 2 | 3 | **REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project? 4 | 5 | - **No CSS support:** Fill out this template with information about how to file issues and get help. 6 | - **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps. 7 | - **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide. 8 | 9 | *Then remove this first heading from this SUPPORT.MD file before publishing your repo.* 10 | 11 | # Support 12 | 13 | ## How to file issues and get help 14 | 15 | This project uses GitHub Issues to track bugs and feature requests. Please search the existing 16 | issues before filing new issues to avoid duplicates. For new issues, file your bug or 17 | feature request as a new Issue. 18 | 19 | For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE 20 | FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER 21 | CHANNEL. WHERE WILL YOU HELP PEOPLE?**. 22 | 23 | ## Microsoft Support Policy 24 | 25 | Support for this **PROJECT or PRODUCT** is limited to the resources listed above. 26 | -------------------------------------------------------------------------------- /.github/actions/download-caller-artifacts/action.yml: -------------------------------------------------------------------------------- 1 | name: "Download caller artifacts" 2 | description: "This action runs multiple steps as a composite action." 3 | inputs: 4 | caller_id: 5 | description: "The caller id to use for the download." 6 | type: string 7 | required: true 8 | name: 9 | description: "The name of the artifact to download." 10 | type: string 11 | required: true 12 | gh_token: 13 | description: "The GitHub Actions token." 14 | runs: 15 | using: "composite" 16 | steps: 17 | - name: Query for artifact 18 | run: | 19 | $github_headers = @{ 20 | "Accept" = "application/vnd.github+json" 21 | "Authorization" = "Bearer ${{ inputs.gh_token }}" 22 | "X-GitHub-Api-Version" = "2022-11-28" 23 | } 24 | $github_url = "https://api.github.com/repos/microsoft/netperf/actions/runs/${{ inputs.caller_id }}/artifacts" 25 | $response = Invoke-WebRequest -Uri $github_url -Headers $github_headers -Method Get 26 | $json_response = $response.Content | ConvertFrom-Json 27 | $json_response = $json_response.artifacts 28 | $artifact = $json_response | Where-Object { $_.name -eq "${{ inputs.name }}" } 29 | if ($artifact -eq $null) { 30 | Write-Error "Artifact not found." 31 | exit 1 32 | } 33 | $artifact_download_url = $artifact.archive_download_url 34 | $response = Invoke-WebRequest -Uri $artifact_download_url -Headers $github_headers -Method Get -OutFile "${{ inputs.name }}.zip" 35 | Write-Output "Artifact downloaded successfully!" 36 | if (!(Test-Path "./artifacts")) { 37 | New-Item -ItemType Directory -Path "./artifacts" 38 | } 39 | Expand-Archive -Path "${{ inputs.name }}.zip" -DestinationPath "./artifacts" 40 | shell: pwsh 41 | -------------------------------------------------------------------------------- /.github/actions/prepare-1es-machine/action.yml: -------------------------------------------------------------------------------- 1 | name: "Prepare 1ES Machine [NEEDS NETPERF REPO CLONED FIRST]" 2 | description: "This action runs multiple steps as a composite action." 3 | runs: 4 | using: "composite" 5 | steps: 6 | - name: Check if powershell 7 (pwsh) is already installed 7 | if: ${{ runner.os != 'Windows' }} 8 | run: | 9 | if command -v pwsh &>/dev/null; then 10 | echo "PowerShell is already installed." 11 | echo "HAS_PWSH=true" >> $GITHUB_ENV 12 | else 13 | echo "PowerShell is not installed." 14 | echo "HAS_PWSH=false" >> $GITHUB_ENV 15 | fi 16 | shell: bash 17 | - name: (On Linux) Enable perf tool 18 | if: ${{ runner.os != 'Windows' }} 19 | run: | 20 | echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid 21 | shell: bash 22 | - name: Check if powershell 7 (pwsh) is already installed 23 | if: ${{ runner.os == 'Windows' }} 24 | run: | 25 | @echo off 26 | where pwsh >nul 2>nul 27 | if %errorlevel% == 0 ( 28 | echo pwsh is installed 29 | pwsh -Command "echo 'HAS_PWSH=true' >> $env:GITHUB_ENV" 30 | ) else ( 31 | echo pwsh is not installed 32 | powershell -Command "echo 'HAS_PWSH=false' >> $env:GITHUB_ENV" 33 | ) 34 | shell: cmd 35 | - name: Install powershell 7 on Linux 36 | if: ${{ env.HAS_PWSH == 'false' && runner.os != 'Windows' }} 37 | run: | 38 | sudo bash ./netperfrepo/install-pwsh.sh 39 | echo "HAS_PWSH=true" >> $GITHUB_ENV 40 | shell: bash 41 | - name: Lowercase runner.os 42 | if: ${{ env.HAS_PWSH == 'true' }} 43 | run: echo "OS=$('${{runner.os}}'.ToLower())" >> $env:GITHUB_ENV 44 | shell: pwsh 45 | - name: Lowercase OS and Set Environment Variable 46 | if: ${{ env.HAS_PWSH == 'false' }} 47 | run: | 48 | powershell -Command "echo 'OS=windows' >> $env:GITHUB_ENV" 49 | shell: cmd 50 | - name: Set up Python 51 | if: ${{ env.HAS_PWSH == 'false' }} 52 | uses: actions/setup-python@v2 53 | with: 54 | python-version: '3.x' 55 | - name: Invoke setup-runner-windows.ps1 56 | if: ${{ runner.os == 'Windows' }} 57 | run: ./netperfrepo/setup-runner-windows.ps1 58 | shell: PowerShell 59 | -------------------------------------------------------------------------------- /.github/actions/run-general-pwsh-cmd/action.yml: -------------------------------------------------------------------------------- 1 | name: "Run Pwsh Commands" 2 | description: "This action runs multiple steps as a composite action." 3 | inputs: 4 | run-cmd: 5 | description: "The serialized matrix of values to use for the composite action." 6 | type: string 7 | required: true 8 | runs: 9 | using: "composite" 10 | steps: 11 | - name: Squeeze code to 1 line 12 | if: ${{ env.HAS_PWSH == 'false' }} 13 | id: squeeze_code 14 | shell: python 15 | run: | 16 | powershell_code = """ 17 | ${{ inputs.run-cmd }} 18 | """ 19 | squeezed_code = powershell_code.replace('\n', ';').replace('\r', ';').replace("\"", "\'") 20 | print(f"::set-output name=squeezed_code::{squeezed_code}") 21 | - name: Run Pwsh Command 22 | if: ${{ env.HAS_PWSH == 'false' }} 23 | run: | 24 | powershell -Command "${{ steps.squeeze_code.outputs.squeezed_code }}" 25 | shell: cmd 26 | - name: Run Pwsh Command 27 | if: ${{ env.HAS_PWSH == 'true' }} 28 | run: | 29 | ${{ inputs.run-cmd }} 30 | shell: pwsh 31 | -------------------------------------------------------------------------------- /.github/actions/run-test-script/action.yml: -------------------------------------------------------------------------------- 1 | name: "Run Test Script [NEEDS NETPERF REPO CLONED FIRST]" 2 | description: "This action runs multiple steps as a composite action." 3 | inputs: 4 | run-script-cmd: 5 | description: "The serialized matrix of values to use for the composite action." 6 | type: string 7 | required: true 8 | matrix: 9 | description: "The serialized matrix of values to use for the composite action." 10 | type: string 11 | required: true 12 | syncer-secret: 13 | description: "For use to sync with the remote cache." 14 | type: string 15 | required: true 16 | runs: 17 | using: "composite" 18 | steps: 19 | - name: Set context and import the netperf-lib.psm1 library 20 | id: netperf_context 21 | if: ${{ env.HAS_PWSH == 'false' }} 22 | shell: python 23 | run: | 24 | import json 25 | matrix = json.loads("""${{ inputs.matrix }}""") 26 | json_str = json.dumps(matrix).replace('"', '\\"').replace('\n', ' ').replace('\r', ' ') 27 | prep_code = f"./netperfrepo/set-netperf-context.ps1 -Matrix '{json_str}' -SyncerSecret '${{ inputs.syncer-secret }}' -GithubRunId '${{ github.run_id }}-${{ github.run_attempt }}';" 28 | prep_code += "Import-Module ./netperfrepo/netperf-lib.psm1;" 29 | print(f"::set-output name=netperf_context::{prep_code}") 30 | - name: Squeeze code to 1 line 31 | if: ${{ env.HAS_PWSH == 'false' }} 32 | id: squeeze_code 33 | shell: python 34 | run: | 35 | run_script_powershell_code = """${{ inputs.run-script-cmd }}""" 36 | squeezed_code = run_script_powershell_code.replace('\n', '').replace('\r', '').replace('`', ' ') 37 | print(f"::set-output name=squeezed_code::{squeezed_code}") 38 | - name: Run Pwsh Command 39 | if: ${{ env.HAS_PWSH == 'false' }} 40 | run: | 41 | powershell -Command "${{ steps.netperf_context.outputs.netperf_context }} ${{ steps.squeeze_code.outputs.squeezed_code }}" 42 | shell: cmd 43 | - name: Run Pwsh Command 44 | if: ${{ env.HAS_PWSH == 'true' }} 45 | run: | 46 | ./netperfrepo/set-netperf-context.ps1 -Matrix '${{ inputs.matrix }}' -SyncerSecret '${{ inputs.syncer-secret }}' -GithubRunId '${{ github.run_id }}-${{ github.run_attempt }}' 47 | Import-Module ./netperfrepo/netperf-lib.psm1 48 | ${{ inputs.run-script-cmd }} 49 | shell: pwsh 50 | -------------------------------------------------------------------------------- /.github/actions/stop-1es-machine/action.yml: -------------------------------------------------------------------------------- 1 | name: "Stop 1ES Machine [NEEDS NETPERF REPO CLONED FIRST]" 2 | description: "This action runs multiple steps as a composite action." 3 | inputs: 4 | matrix: 5 | description: "The serialized matrix of values to use for the composite action." 6 | type: string 7 | required: true 8 | syncer_secret: 9 | description: "The secret to use for the syncer." 10 | type: string 11 | required: true 12 | runs: 13 | using: "composite" 14 | steps: 15 | - name: Run Python Script to Escape JSON 16 | if: ${{ env.HAS_PWSH == 'false' }} 17 | id: escape_json 18 | run: | 19 | import json 20 | matrix = json.loads("""${{ inputs.matrix }}""") 21 | json_str = json.dumps(matrix).replace('"', '\\"').replace('\n', ' ').replace('\r', ' ') 22 | print(f"::set-output name=escaped_json::{json_str}") 23 | shell: python 24 | - name: Deserialize Matrix 25 | if: ${{ env.HAS_PWSH == 'false' }} 26 | run: | 27 | powershell -Command "./netperfrepo/1es-machine-manager.ps1 -Action 'Deserialize_matrix' -GithubContextInput1 '${{ steps.escape_json.outputs.escaped_json }}'" 28 | shell: cmd 29 | - name: Deserialize Matrix 30 | if: ${{ env.HAS_PWSH == 'true' }} 31 | run: | 32 | ./netperfrepo/1es-machine-manager.ps1 -Action 'Deserialize_matrix' -GithubContextInput1 '${{ inputs.matrix }}' 33 | shell: pwsh 34 | - name: Send ACK to cache 35 | if: ${{ env.HAS_PWSH == 'false' }} 36 | run: | 37 | powershell -Command "./netperfrepo/1es-machine-manager.ps1 -Action 'Stop-1es-machine' -GithubContextInput1 '${{ inputs.syncer_secret }}' -GithubContextInput2 '${{ github.run_id }}-${{ github.run_attempt }}' -GithubContextInput3 '${{ env.env_str }}'" 38 | shell: cmd 39 | - name: Send ACK to cache 40 | if: ${{ env.HAS_PWSH == 'true' }} 41 | run: | 42 | ./netperfrepo/1es-machine-manager.ps1 -Action 'Stop-1es-machine' -GithubContextInput1 '${{ inputs.syncer_secret }}' -GithubContextInput2 '${{ github.run_id }}-${{ github.run_attempt }}' -GithubContextInput3 '${{ env.env_str }}' 43 | shell: pwsh 44 | -------------------------------------------------------------------------------- /.github/actions/stop-lab-machine/action.yml: -------------------------------------------------------------------------------- 1 | name: "Stop lab machine" 2 | description: "This action runs multiple steps as a composite action." 3 | inputs: 4 | parent: 5 | description: "The ID of the parent lab machine assigned to this machine." 6 | type: string 7 | required: true 8 | syncer_secret: 9 | description: "The secret to use for the syncer." 10 | type: string 11 | required: true 12 | runs: 13 | using: "composite" 14 | steps: 15 | - name: Report aftermath of Job [Failure] 16 | if: failure() 17 | run: | 18 | $headers = @{ 19 | "secret" = "${{ inputs.syncer_secret }}" 20 | } 21 | $parent_lab_machine_id = "${{ inputs.parent }}" 22 | $api = "https://netperfapi.azurewebsites.net/setkeyvalue?key=$parent_lab_machine_id&value=FAILED" 23 | Invoke-WebRequest -Uri $api -Headers $headers -Method Post 24 | - name: Report aftermath of Job [Success] 25 | if: success() 26 | run: | 27 | $headers = @{ 28 | "secret" = "${{ inputs.syncer_secret }}" 29 | } 30 | $parent_lab_machine_id = "${{ inputs.parent }}" 31 | $api = "https://netperfapi.azurewebsites.net/setkeyvalue?key=$parent_lab_machine_id&value=SUCCESS" 32 | Invoke-WebRequest -Uri $api -Headers $headers -Method Post 33 | - name: Report aftermath of Job [Cancelled] 34 | if: cancelled() 35 | run: | 36 | $headers = @{ 37 | "secret" = "${{ inputs.syncer_secret }}" 38 | } 39 | $parent_lab_machine_id = "${{ inputs.parent }}" 40 | $api = "https://netperfapi.azurewebsites.net/setkeyvalue?key=$parent_lab_machine_id&value=CANCELLED" 41 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: / 5 | schedule: 6 | interval: daily 7 | 8 | - package-ecosystem: npm 9 | directory: /dashboard 10 | schedule: 11 | interval: daily 12 | -------------------------------------------------------------------------------- /.github/workflows/check_syntax.py: -------------------------------------------------------------------------------- 1 | import yaml 2 | import sys 3 | 4 | def check_yaml_syntax(file_path): 5 | try: 6 | with open(file_path, 'r') as file: 7 | yaml.safe_load(file) 8 | print(f"YAML syntax is valid for file: {file_path}") 9 | except yaml.YAMLError as e: 10 | print(f"YAML syntax error in file: {file_path}\n{e}") 11 | 12 | if __name__ == "__main__": 13 | if len(sys.argv) != 2: 14 | print("Usage: python check_yaml_syntax.py ") 15 | sys.exit(1) 16 | 17 | yaml_file_path = sys.argv[1] 18 | check_yaml_syntax(yaml_file_path) 19 | -------------------------------------------------------------------------------- /.github/workflows/cleanup-azure-vms.yml: -------------------------------------------------------------------------------- 1 | name: Cleanup Azure VMs 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | tag: 7 | description: 'Tag to identify the VMs to be cleaned up' 8 | required: true 9 | type: string 10 | vmname1: 11 | description: 'Name of the first VM to be cleaned up' 12 | required: true 13 | type: string 14 | vmname2: 15 | description: 'Name of the second VM to be cleaned up' 16 | required: true 17 | type: string 18 | workflow_call: 19 | inputs: 20 | tag: 21 | description: 'Tag to identify the VMs to be cleaned up' 22 | required: true 23 | type: string 24 | vmname1: 25 | description: 'Name of the first VM to be cleaned up' 26 | required: true 27 | type: string 28 | vmname2: 29 | description: 'Name of the second VM to be cleaned up' 30 | required: true 31 | type: string 32 | secrets: 33 | AZURE_CLIENT_ID: 34 | required: true 35 | AZURE_TENANT_ID: 36 | required: true 37 | AZURE_SUBSCRIPTION_ID: 38 | required: true 39 | PERSONAL_ACCESS_TOKEN: 40 | required: true 41 | 42 | permissions: write-all 43 | 44 | jobs: 45 | # Finds all self hosted runners with a specific TAG and deletes them. 46 | delete-github-runner: 47 | permissions: write-all 48 | name: Delete GitHub Runner 49 | runs-on: windows-latest 50 | if: ${{ always() }} 51 | steps: 52 | - name: Delete temporary self hosted runners. 53 | shell: bash 54 | env: 55 | TAG: ${{ inputs.tag }} 56 | run: | 57 | RUNNERS_JSON=$(curl -L \ 58 | -H "Accept: application/vnd.github+json" \ 59 | -H "Authorization: token ${{ secrets.PERSONAL_ACCESS_TOKEN }}" \ 60 | -H "X-GitHub-Api-Version: 2022-11-28" \ 61 | "https://api.github.com/repos/microsoft/netperf/actions/runners") 62 | 63 | RUNNER_ID=$(echo $RUNNERS_JSON | jq ".runners[] | select(.labels[].name == \"$TAG\") | .id") 64 | 65 | echo "Runner IDs to be removed: " 66 | 67 | echo $RUNNER_ID | tr ' ' '\n' | xargs -I id_to_remove echo "id_to_remove" 68 | 69 | echo "Removing runners now: " 70 | 71 | for ID in $(echo $RUNNER_ID | tr ',' ' '); do curl -L -X DELETE -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{ secrets.PERSONAL_ACCESS_TOKEN }}" -H "X-GitHub-Api-Version: 2022-11-28" "https://api.github.com/repos/microsoft/netperf/actions/runners/$ID"; done 72 | 73 | delete-azure-vms: 74 | name: Delete Azure Vms 75 | needs: [delete-github-runner] 76 | runs-on: windows-latest 77 | if: ${{ always() }} 78 | steps: 79 | - name: Checkout 80 | uses: actions/checkout@v2 81 | - name: Install Latest Az PowerShell Module 82 | shell: pwsh 83 | run: | 84 | Install-Module -Name Az -Force -AllowClobber -Repository PSGallery 85 | Update-Module Az -Force 86 | Get-Module 'Az' | where {([string]($_.Version)).StartsWith('9.3.0')} | Remove-Module 87 | Get-Module -Name Az -ListAvailable 88 | - name: Login to Azure 89 | uses: azure/login@v2 90 | with: 91 | client-id: ${{ secrets.AZURE_CLIENT_ID }} 92 | tenant-id: ${{ secrets.AZURE_TENANT_ID }} 93 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} 94 | enable-AzPSSession: true 95 | - name: Delete Azure VMs 96 | shell: pwsh 97 | run: | 98 | ./.github/workflows/remove-azure-machine.ps1 -VMName ${{ inputs.vmname1 }} 99 | ./.github/workflows/remove-azure-machine.ps1 -VMName ${{ inputs.vmname2 }} 100 | -------------------------------------------------------------------------------- /.github/workflows/create-azure-vms.yml: -------------------------------------------------------------------------------- 1 | name: Create Azure VMs 2 | 3 | 4 | on: 5 | workflow_dispatch: 6 | inputs: 7 | matrix_filename: 8 | description: 'Matrix of jobs and their respective environments' 9 | required: false 10 | default: 'quic_matrix.json' 11 | type: string 12 | workflowId: 13 | description: 'The ID of the caller workflow' 14 | required: false 15 | default: 'manual' 16 | type: string 17 | 18 | workflow_call: 19 | inputs: 20 | matrix_filename: 21 | description: "Matrix of jobs and their respective environments" 22 | required: false 23 | default: 'quic_matrix.json' 24 | type: string 25 | workflowId: 26 | description: "The ID of the caller workflow" 27 | required: true 28 | type: string 29 | outputs: 30 | full-matrix: 31 | description: "The full list of jobs to be run in secnetperf" 32 | value: ${{ jobs.manage-and-create-runners.outputs.full-matrix }} 33 | azure-matrix: 34 | description: "The list of jobs to be run on Azure VMs" 35 | value: ${{ jobs.manage-and-create-runners.outputs.azure-matrix }} 36 | secrets: 37 | AZURE_CLIENT_ID: 38 | required: true 39 | AZURE_TENANT_ID: 40 | required: true 41 | AZURE_SUBSCRIPTION_ID: 42 | required: true 43 | PERSONAL_ACCESS_TOKEN: 44 | required: true 45 | VM_PASSWORD: 46 | required: true 47 | 48 | permissions: write-all 49 | 50 | jobs: 51 | manage-and-create-runners: 52 | name: Manage Runners and Create Azure VMs 53 | outputs: 54 | full-matrix: ${{ steps.generate-full-matrix.outputs.matrix }} 55 | azure-matrix: ${{ steps.generate-azure-matrix.outputs.matrix }} 56 | runs-on: windows-latest 57 | steps: 58 | - name: Checkout 59 | uses: actions/checkout@v2 60 | - name: Login to Azure 61 | uses: azure/login@v2 62 | with: 63 | client-id: ${{ secrets.AZURE_CLIENT_ID }} 64 | tenant-id: ${{ secrets.AZURE_TENANT_ID }} 65 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} 66 | enable-AzPSSession: true 67 | - name: Run manage-azure-vms.ps1 68 | uses: azure/powershell@v2 69 | with: 70 | inlineScript: ./.github/workflows/manage-azure-vms.ps1 -GithubPatToken ${{ secrets.PERSONAL_ACCESS_TOKEN }} -MatrixFileName ${{ inputs.matrix_filename }} 71 | azPSVersion: '11.5.0' 72 | - name: Create Azure VMs 73 | uses: azure/powershell@v2 74 | with: 75 | inlineScript: | 76 | ./.github/workflows/create-azure-machines.ps1 -Password ${{ secrets.VM_PASSWORD }} -GithubPatToken ${{ secrets.PERSONAL_ACCESS_TOKEN }} -WorkflowId ${{ inputs.workflowId }} 77 | azPSVersion: '11.5.0' 78 | - id: generate-full-matrix 79 | run: echo "matrix=$(jq -c '.' ./.github/workflows/processed-matrix.json)" >> $GITHUB_OUTPUT 80 | shell: bash 81 | - id: generate-azure-matrix 82 | run: echo "matrix=$(jq -c '.' ./.github/workflows/azure-matrix.json)" >> $GITHUB_OUTPUT 83 | shell: bash 84 | -------------------------------------------------------------------------------- /.github/workflows/custom.yml: -------------------------------------------------------------------------------- 1 | name: Custom Tasks 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | permissions: write-all 7 | 8 | jobs: 9 | download-artifacts: 10 | name: Download artifacts 11 | runs-on: windows-latest 12 | steps: 13 | - name: Test download artifacts 14 | run: | 15 | $truth_table = @( 16 | @{ dispatched_workflow_id = 10912645568 }, 17 | @{ dispatched_workflow_id = 10912540924 } 18 | ) 19 | $github_headers = @{ 20 | "Accept" = "application/vnd.github+json" 21 | "Authorization" = "Bearer ${{ secrets.GITHUB_TOKEN }}" 22 | "X-GitHub-Api-Version" = "2022-11-28" 23 | } 24 | 25 | # Downloads all artifacts uploaded by the callee 26 | mkdir -Force "artifacts" 27 | foreach ($row in $truth_table) { 28 | $callee_workflow_id = $row.dispatched_workflow_id 29 | if ($callee_workflow_id) { 30 | $artifacts_metadata_url = "https://api.github.com/repos/microsoft/netperf/actions/runs/$callee_workflow_id/artifacts" 31 | Write-Host "Downloading artifacts for workflow ID: $callee_workflow_id" 32 | $response = Invoke-WebRequest -Uri $artifacts_metadata_url -Headers $github_headers -Method Get 33 | $json_response = $response.Content | ConvertFrom-Json 34 | $json_response = $json_response.artifacts 35 | foreach ($artifact in $json_response) { 36 | $name = $artifact.name 37 | $archive_download_url = $artifact.archive_download_url 38 | $response = Invoke-WebRequest -Uri $archive_download_url -Headers $github_headers -Method Get -OutFile "$name.zip" 39 | Expand-Archive -Path "$name.zip" -DestinationPath "artifacts" -Force 40 | } 41 | } 42 | } 43 | shell: pwsh 44 | - name: List downloaded artifacts 45 | run: | 46 | Get-ChildItem -Path "artifacts" -Recurse 47 | shell: pwsh 48 | 49 | -------------------------------------------------------------------------------- /.github/workflows/ebpf_linux.yml: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft Corporation 2 | # SPDX-License-Identifier: MIT 3 | 4 | # This workflow will run the bpf_performance test suite on the provided Ubuntu version 5 | 6 | name: ebpf_linux 7 | 8 | on: 9 | # Permit manual runs of the workflow. 10 | workflow_dispatch: 11 | inputs: 12 | ref: 13 | description: 'EBPF Branch or Commit' 14 | required: false 15 | default: 'main' 16 | type: string 17 | 18 | pull_request: 19 | branches: 20 | - main 21 | paths: 22 | - .github/workflows/ebpf_linux.yml 23 | 24 | repository_dispatch: 25 | types: [run-ebpf-linux] 26 | 27 | concurrency: 28 | group: ebpf-linux-${{ github.event.client_payload.pr || github.event.client_payload.sha || inputs.ref || github.event.pull_request.number || 'main' }} 29 | cancel-in-progress: true 30 | 31 | permissions: 32 | contents: read 33 | 34 | jobs: 35 | build: 36 | runs-on: 37 | - ubuntu-24.04 38 | 39 | steps: 40 | - name: Checkout 41 | uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0 42 | with: 43 | ref: ${{ github.event.client_payload.pr || github.event.client_payload.sha || inputs.ref || github.event.pull_request.head.sha || 'main' }} 44 | submodules: 'recursive' 45 | repository: 'microsoft/bpf_performance' 46 | 47 | - name: Setup 48 | run: | 49 | sudo apt update 50 | sudo apt-get install -y \ 51 | gcc-multilib \ 52 | lcov \ 53 | pkg-config \ 54 | libelf-dev 55 | 56 | - name: Clone and build libbpf 57 | run: | 58 | git clone https://github.com/libbpf/libbpf.git 59 | cd libbpf 60 | git checkout v0.7.0 61 | cd src 62 | make 63 | sudo LIBDIR=/lib/x86_64-linux-gnu make install 64 | sudo ldconfig 65 | 66 | - name: Get Linux Kernel version 67 | run: | 68 | echo "COMMIT_SHA=$(uname -r)" >> $env:GITHUB_ENV 69 | 70 | - name: Configure CMake 71 | run: | 72 | cmake \ 73 | -B ${{github.workspace}}/build \ 74 | -DCMAKE_BUILD_TYPE=Release 75 | 76 | - name: Build 77 | run: | 78 | cmake --build ${{github.workspace}}/build --config Release -- -j $(nproc) 79 | 80 | - name: Create results directory 81 | run: | 82 | mkdir -p ${{github.workspace}}/results 83 | 84 | - name: Create commit_sha.txt - Ubuntu-22.04 85 | run: | 86 | echo ${{env.COMMIT_SHA}} >> ${{github.workspace}}/results/commit_sha.txt 87 | 88 | - name: Run tests 89 | working-directory: ${{github.workspace}}/build/bin 90 | run: | 91 | sudo ./bpf_performance_runner -i tests.yml -r | tee ${{github.workspace}}/results/jit-ubuntu-40.04-Release.csv 92 | exit ${PIPESTATUS[0]} 93 | 94 | - name: Upload results 95 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 96 | with: 97 | name: results-${{env.BUILD_TYPE}}-${{inputs.platform}}-${{inputs.option}} 98 | path: | 99 | ${{github.workspace}}/results/*.csv 100 | ${{github.workspace}}/results/commit_sha.txt 101 | -------------------------------------------------------------------------------- /.github/workflows/ebpf_matrix.json: -------------------------------------------------------------------------------- 1 | [ 2 | { "env": "azure", "os": "windows-2022", "arch": "x64" }, 3 | { "env": "lab", "os": "windows-2022", "arch": "x64" } 4 | ] 5 | -------------------------------------------------------------------------------- /.github/workflows/main_netperfapi.yml: -------------------------------------------------------------------------------- 1 | # Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy 2 | # More GitHub Actions for Azure: https://github.com/Azure/actions 3 | 4 | name: Build and deploy Node.js app to Azure Web App - netperfapi 5 | 6 | on: 7 | push: 8 | branches: 9 | - main 10 | paths: 11 | - 'netperf-1es-syncer/**' 12 | workflow_dispatch: 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - uses: actions/checkout@v4 20 | 21 | - name: Set up Node.js version 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version: '20.x' 25 | 26 | - name: npm install, build, and test 27 | run: | 28 | cd ./netperf-1es-syncer 29 | npm install 30 | npm run build --if-present 31 | npm run test --if-present 32 | 33 | - name: Zip artifact for deployment 34 | run: | 35 | cd ./netperf-1es-syncer 36 | zip release.zip ./* -r 37 | cp release.zip .. 38 | 39 | - name: Upload artifact for deployment job 40 | uses: actions/upload-artifact@v4.4.3 41 | with: 42 | name: node-app 43 | path: release.zip 44 | 45 | deploy: 46 | runs-on: ubuntu-latest 47 | needs: build 48 | environment: 49 | name: 'Production' 50 | url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} 51 | permissions: 52 | id-token: write #This is required for requesting the JWT 53 | 54 | steps: 55 | - name: Download artifact from build job 56 | uses: actions/download-artifact@v3 57 | with: 58 | name: node-app 59 | 60 | - name: Unzip artifact for deployment 61 | run: unzip release.zip 62 | 63 | - name: Login to Azure 64 | uses: azure/login@v1 65 | with: 66 | client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_05D4C4AB0E644643879A04E73866D340 }} 67 | tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_BA5347B0E57443BF9F939B5BBE1E3D1C }} 68 | subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_1051F037AA654C8F86FE11E7CD8772B2 }} 69 | 70 | - name: 'Deploy to Azure Web App' 71 | id: deploy-to-webapp 72 | uses: azure/webapps-deploy@v2 73 | with: 74 | app-name: 'netperfapi' 75 | slot-name: 'Production' 76 | package: . 77 | 78 | -------------------------------------------------------------------------------- /.github/workflows/prepare-matrix.yml: -------------------------------------------------------------------------------- 1 | name: Prepare Matrix 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | matrix_filename: 7 | description: 'Matrix of jobs and their respective environments' 8 | required: false 9 | default: 'quic_matrix.json' 10 | type: string 11 | workflowId: 12 | description: 'The ID of the caller workflow' 13 | required: false 14 | default: 'manual' 15 | type: string 16 | 17 | workflow_call: 18 | inputs: 19 | matrix_filename: 20 | description: "Matrix of jobs and their respective environments" 21 | required: false 22 | default: 'quic_matrix.json' 23 | type: string 24 | workflowId: 25 | description: "The ID of the caller workflow" 26 | required: true 27 | type: string 28 | outputs: 29 | lab-matrix: 30 | description: "The STATIC lab jobs to be run" 31 | value: ${{ jobs.prepare-matrix.outputs.lab-matrix }} 32 | lab-stateless-matrix: 33 | description: "The ephemeral lab jobs to be run" 34 | value: ${{ jobs.prepare-matrix.outputs.lab-stateless-matrix }} 35 | azure-matrix: 36 | description: "The list of jobs to be run on Azure VMs" 37 | value: ${{ jobs.prepare-matrix.outputs.azure-matrix }} 38 | full-matrix: 39 | description: "The full list of jobs to be run in secnetperf" 40 | value: ${{ jobs.prepare-matrix.outputs.full-matrix }} 41 | 42 | 43 | permissions: write-all 44 | 45 | jobs: 46 | prepare-matrix: 47 | name: Preparing the lab and 1es azure matrix. 48 | outputs: 49 | lab-matrix: ${{ steps.generate-lab-matrix.outputs.matrix }} 50 | azure-matrix: ${{ steps.generate-azure-matrix.outputs.matrix }} 51 | full-matrix: ${{ steps.generate-full-matrix.outputs.matrix }} 52 | lab-stateless-matrix: ${{ steps.generate-lab-stateless-matrix.outputs.matrix }} 53 | runs-on: windows-latest 54 | steps: 55 | - name: Checkout 56 | uses: actions/checkout@v2 57 | - name: Run Prepare Matrix 58 | run: ./.github/workflows/prepare-matrix.ps1 59 | - id: generate-lab-matrix 60 | run: echo "matrix=$(jq -c '.' ./.github/workflows/lab-matrix.json)" >> $GITHUB_OUTPUT 61 | shell: bash 62 | - id: generate-lab-stateless-matrix 63 | run: echo "matrix=$(jq -c '.' ./.github/workflows/lab-stateless-matrix.json)" >> $GITHUB_OUTPUT 64 | shell: bash 65 | - id: generate-azure-matrix 66 | run: echo "matrix=$(jq -c '.' ./.github/workflows/azure-matrix.json)" >> $GITHUB_OUTPUT 67 | shell: bash 68 | - id: generate-full-matrix 69 | run: echo "matrix=$(jq -c '.' ./.github/workflows/full-matrix.json)" >> $GITHUB_OUTPUT 70 | shell: bash 71 | -------------------------------------------------------------------------------- /.github/workflows/quic_matrix.json: -------------------------------------------------------------------------------- 1 | [ 2 | { "env": "azure", "os": "windows-2022", "arch": "x64", "tls": "schannel", "io": "iocp", "preferred_pool_sku": "Experimental_Boost4" }, 3 | { "env": "azure", "os": "windows-2022", "arch": "x64", "tls": "schannel", "io": "xdp", "preferred_pool_sku": "Experimental_Boost4" }, 4 | { "env": "azure", "os": "windows-2022", "arch": "x64", "tls": "schannel", "io": "wsk", "preferred_pool_sku": "Experimental_Boost4" }, 5 | { "env": "azure", "os": "ubuntu-24.04", "arch": "x64", "tls": "quictls", "io": "epoll", "preferred_pool_sku": "Experimental_Boost4" }, 6 | { "env": "azure", "os": "windows-2025", "arch": "x64", "tls": "schannel", "io": "iocp", "preferred_pool_sku": "Experimental_Boost4" }, 7 | { "env": "azure", "os": "windows-2025", "arch": "x64", "tls": "schannel", "io": "xdp", "preferred_pool_sku": "Experimental_Boost4" }, 8 | { "env": "azure", "os": "windows-2025", "arch": "x64", "tls": "schannel", "io": "wsk", "preferred_pool_sku": "Experimental_Boost4" }, 9 | { "env": "lab", "os": "windows-2022", "arch": "x64", "tls": "schannel", "io": "iocp" }, 10 | { "env": "lab", "os": "windows-2022", "arch": "x64", "tls": "schannel", "io": "xdp" }, 11 | { "env": "lab", "os": "windows-2022", "arch": "x64", "tls": "schannel", "io": "wsk" } 12 | ] 13 | -------------------------------------------------------------------------------- /.github/workflows/remove-azure-machine.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Removes an Azure VMs created by create-azure-machines.ps1. 4 | #> 5 | 6 | param ( 7 | [Parameter(Mandatory = $true)] 8 | [string]$VMName, 9 | 10 | [Parameter(Mandatory = $false)] 11 | [string]$ResourceGroupName = "netperf-ex" 12 | ) 13 | 14 | Set-StrictMode -Version "Latest" 15 | $PSDefaultParameterValues["*:ErrorAction"] = "Stop" 16 | 17 | Write-Host "[$(Get-Date)] $vmName`: Removing VM" 18 | try { 19 | $vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $vmName 20 | $null = $vm | Remove-AzVM -Force 21 | } catch { 22 | Write-Host "[$(Get-Date)] $vmName`: Failure to remove VM, reason: $_" 23 | } 24 | 25 | Write-Host "[$(Get-Date)] $vmName`: Removing Public IP" 26 | try { 27 | Remove-AzPublicIpAddress -ResourceGroupName $ResourceGroupName -Name "$vmName-PublicIP" -Force 28 | } catch { 29 | Write-Host "[$(Get-Date)] $vmName`: No Public IP found" 30 | } 31 | 32 | Write-Host "[$(Get-Date)] $vmName`: Removing NSG" 33 | try { 34 | Remove-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName -Name "$vmName-Nsg" -Force 35 | } catch { 36 | Write-Host "[$(Get-Date)] $vmName`: No NSG found" 37 | } 38 | 39 | Write-Host "[$(Get-Date)] $vmName`: Removing OS Disk" 40 | try { 41 | $osDisk = $vm.StorageProfile.OSDisk 42 | Remove-AzDisk -ResourceGroupName $ResourceGroupName -DiskName $osDisk.Name -Force 43 | } catch { 44 | Write-Host "[$(Get-Date)] $vmName`: No OS Disk found" 45 | } 46 | 47 | Write-Host "[$(Get-Date)] $VMName`: Complete" 48 | -------------------------------------------------------------------------------- /.github/workflows/reset-child-machine.yml: -------------------------------------------------------------------------------- 1 | name: reset-child-machine 2 | 3 | on: 4 | repository_dispatch: 5 | types: [reset-child-machine] 6 | 7 | jobs: 8 | print-params: 9 | name: Print Parameters 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Print input params 13 | run: | 14 | echo "parent_id: ${{ github.event.client_payload.parent_id }}" # child id is parent id - 1. 15 | echo "os: ${{ github.event.client_payload.os }}" 16 | echo "unique_env_str: ${{ github.event.client_payload.unique_env_str }}" 17 | 18 | do-reset: 19 | name: Reset child Machine 20 | runs-on: 21 | - self-hosted 22 | - parent=${{ github.event.client_payload.parent_id }} 23 | steps: 24 | - name: RESET STATE (child) 25 | run: | 26 | # TODO: Eventually, for WS 2025, we want to instead CRUD the VMs, instead of simply reseting their checkpoints here. 27 | $vmName = "netperf-${{ github.event.client_payload.os }}-client" 28 | $checkPointName = "LATEST" 29 | Restore-VMSnapshot -VMName $vmName -Name $checkPointName -Confirm:$false 30 | - name: Start VM, wait for online status, alert observer. 31 | run: | 32 | $vmName = "netperf-${{ github.event.client_payload.os }}-client" 33 | Start-VM -Name $vmName 34 | while (-not (Get-VMNetworkAdapter -VMName $vmName).IPAddresses) { 35 | Write-Host "Waiting for VM to be online..." 36 | Start-Sleep -Seconds 5 37 | } 38 | Start-Sleep 10 39 | $username = "${{ secrets.VM_DUMMY_USERNAME }}" 40 | $password = "${{ secrets.VM_DUMMY_PASSWORD }}" 41 | $securePassword = ConvertTo-SecureString $password -AsPlainText -Force 42 | $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword) 43 | Invoke-Command -VMName $vmName -Credential $credential -ScriptBlock { 44 | Start-Service -Name "actions.runner.*" 45 | Get-Service -Name "actions.runner.*" 46 | } 47 | $headers = @{ 48 | "secret" = "${{ secrets.NETPERF_SYNCER_SECRET }}" 49 | } 50 | $key = "${{ github.event.client_payload.unique_env_str }}_child_reset_done" 51 | $value = whoami 52 | $api = "https://netperfapi.azurewebsites.net/setkeyvalue?key=$key&value=$value" 53 | 54 | try { 55 | Invoke-WebRequest -Uri $api -Headers $headers -Method Post 56 | } catch { 57 | Write-Host "Failed to alert observer child reset done: $_" 58 | exit 1 59 | } 60 | -------------------------------------------------------------------------------- /.github/workflows/schedule-lab-reset.yml: -------------------------------------------------------------------------------- 1 | name: Schedule Lab Reset 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | workflowId: 7 | description: "The ID of the caller workflow" 8 | required: true 9 | type: string 10 | 11 | 12 | permissions: write-all 13 | 14 | jobs: 15 | attempt-lab-reset: 16 | name: Enqueue Lab Reset Workflow 17 | runs-on: windows-latest 18 | steps: 19 | - name: Enqueue reset workflow. Won't enqueue if there is already a reset workflow in progress. 20 | run: | 21 | $headers = @{ 22 | "Accept" = "application/vnd.github+json" 23 | "Authorization" = "Bearer ${{ secrets.GITHUB_TOKEN }}" 24 | "X-GitHub-Api-Version" = "2022-11-28" 25 | } 26 | $url = "https://api.github.com/repos/microsoft/netperf/actions/runs?status=in_progress" 27 | Write-Debug "GET $url" 28 | $activeRuns = ((Invoke-WebRequest -Uri $url -Method GET -Headers $headers).Content | ConvertFrom-Json).workflow_runs 29 | $not_found = $true 30 | foreach ($run in $activeRuns) { 31 | if ($run.name -eq "auto-reset-parent-or-child-lab-machine") { 32 | Write-Host "Found an existing reset job: $($run.name)" 33 | $not_found = $false 34 | break 35 | } 36 | } 37 | if ($not_found) { 38 | $url = "https://api.github.com/repos/microsoft/netperf/dispatches" 39 | $body = @{ 40 | event_type = "run-auto-reset-parent-or-child-lab-machine" 41 | client_payload = @{ 42 | workflow_id = "${{ inputs.workflowId }}" 43 | } 44 | } | ConvertTo-Json 45 | Write-Host "Dispatching with body: $body" 46 | try { 47 | Invoke-WebRequest -Uri $url -Headers $headers -Method Post -Body $body 48 | } catch { 49 | Write-Host "[DispatchCallee] Failed to dispatch callee: $_" 50 | exit 1 51 | } 52 | } 53 | 54 | shell: pwsh 55 | -------------------------------------------------------------------------------- /.github/workflows/set-regression-bounds.yml: -------------------------------------------------------------------------------- 1 | name: Set Regression Bounds 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - sqlite 8 | 9 | jobs: 10 | set-regression-bounds: 11 | name: Set Regression Bounds 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout netperf repo 15 | uses: actions/checkout@v4 16 | with: 17 | repository: microsoft/netperf 18 | ref: sqlite 19 | - name: Calculate regression bounds 20 | run: python regression.py 21 | -------------------------------------------------------------------------------- /.github/workflows/tcpip.wprp: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /.github/workflows/update-react.yml: -------------------------------------------------------------------------------- 1 | name: UpdateReact 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | paths: [ "dashboard/**", ".github/workflows/update-react.yml" ] 9 | pull_request: 10 | branches: 11 | - main 12 | paths: [ "dashboard/**", ".github/workflows/update-react.yml" ] 13 | 14 | concurrency: 15 | # Cancel any workflow currently in progress for the same PR. 16 | # Allow running concurrently with any other commits. 17 | group: update-react-${{ github.event.pull_request.number || github.sha }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | npm-build: 22 | name: Npm build 23 | needs: [] 24 | strategy: 25 | fail-fast: false 26 | runs-on: ubuntu-24.04 27 | steps: 28 | - name: Checkout repository 29 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 30 | - name: NPM install 31 | working-directory: dashboard 32 | run: npm install 33 | - name: NPM build 34 | working-directory: dashboard 35 | run: npm run build 36 | - name: Upload Dist 37 | if: ${{ always() }} 38 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 39 | with: 40 | name: dist 41 | path: dashboard/dist 42 | 43 | update-react: 44 | # Only update when this run is from a merge to main 45 | if: github.event_name == 'push' && github.ref == 'refs/heads/main' 46 | permissions: write-all 47 | name: Update React 48 | needs: [npm-build] 49 | strategy: 50 | fail-fast: false 51 | runs-on: ubuntu-24.04 52 | steps: 53 | - name: Checkout repository 54 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 55 | with: 56 | repository: microsoft/netperf 57 | ref: deploy 58 | - name: Remove 'dist' directory if it exists 59 | run: | 60 | if [[ -d dist ]]; then 61 | echo "Removing 'dist' directory..." 62 | rm -rf dist 63 | else 64 | echo "'dist' directory does not exist. Skipping removal." 65 | fi 66 | - name: Remove 404 html file if it exists 67 | run: | 68 | if [[ -f 404.html ]]; then 69 | echo "Removing 404.html file..." 70 | rm 404.html 71 | else 72 | echo "404.html file does not exist. Skipping removal." 73 | fi 74 | - uses: actions/download-artifact@8caf195ad4b1dee92908e23f56eeb0696f1dd42d 75 | with: 76 | name: dist 77 | path: ./dist 78 | 79 | - run: ls 80 | - run: pwd 81 | - run: cp dist/index.html 404.html 82 | - name: Commit changes 83 | if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || (github.event_name == 'workflow_dispatch') 84 | run: | 85 | git status 86 | git config user.name 'QUIC Dev[bot]' 87 | git config user.email 'quicdev@microsoft.com' 88 | git add dist 89 | git add 404.html 90 | git status 91 | git commit -m "Update React" 92 | git push 93 | -------------------------------------------------------------------------------- /.github/workflows/xdp.yml: -------------------------------------------------------------------------------- 1 | name: XDP 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | ref: 7 | description: 'XDP Branch or Commit' 8 | required: false 9 | default: 'main' 10 | type: string 11 | pull_request: 12 | branches: 13 | - main 14 | paths: 15 | - .github/workflows/xdp.yml 16 | repository_dispatch: 17 | types: [run-xdp] 18 | # Args: { guid, sha, ref, pr } 19 | 20 | concurrency: 21 | group: xdp-${{ github.event.client_payload.pr || github.event.client_payload.sha || inputs.ref || github.event.pull_request.number || 'main' }} 22 | cancel-in-progress: true 23 | 24 | permissions: read-all 25 | 26 | jobs: 27 | # For automated identification of the workflow. 28 | name: 29 | name: For ${{ github.event.client_payload.guid }} 30 | if: ${{ github.event_name == 'repository_dispatch' }} 31 | needs: [] 32 | runs-on: ubuntu-24.04 33 | steps: 34 | - run: | 35 | echo "guid: ${{ github.event.client_payload.guid }}" 36 | echo "sha: ${{ github.event.client_payload.sha }}" 37 | echo "ref: ${{ github.event.client_payload.ref }}" 38 | echo "pr: ${{ github.event.client_payload.pr }}" 39 | 40 | build: 41 | name: Build XDP 42 | needs: [] 43 | strategy: 44 | matrix: 45 | os: ['2022'] 46 | arch: [x64] 47 | fail-fast: false 48 | uses: microsoft/xdp-for-windows/.github/workflows/build.yml@main 49 | with: 50 | ref: ${{ github.event.client_payload.sha || github.event.client_payload.ref || inputs.ref || 'main' }} 51 | os: ${{ matrix.os }} 52 | arch: ${{ matrix.arch }} 53 | upload_artifacts: true 54 | 55 | test: 56 | name: Test Windows 57 | needs: [build] 58 | strategy: 59 | fail-fast: false 60 | matrix: 61 | vec: [ 62 | { env: "lab", os: "2022", arch: "x64" }, 63 | ] 64 | runs-on: 65 | - self-hosted 66 | - ${{ matrix.vec.env }} 67 | - os-windows-${{ matrix.vec.os }} 68 | - ${{ matrix.vec.arch }} 69 | steps: 70 | - name: Checkout repository 71 | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 72 | with: 73 | repository: microsoft/xdp-for-windows 74 | ref: ${{ github.event.client_payload.sha || github.event.client_payload.ref || inputs.ref || 'main' }} 75 | sparse-checkout: tools 76 | - name: Download Artifacts 77 | uses: actions/download-artifact@8caf195ad4b1dee92908e23f56eeb0696f1dd42d 78 | with: 79 | name: bin_Release_${{ matrix.vec.arch }} # Build always comes from 2022 for now 80 | path: artifacts/bin 81 | - name: Run Tests 82 | shell: pwsh 83 | run: tools/two-machine-perf.ps1 -Config Release -Arch ${{ matrix.vec.arch }} -Verbose 84 | - name: Upload Logs 85 | if: ${{ always() }} 86 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 87 | with: 88 | name: logs_${{ matrix.vec.env }}_${{ matrix.vec.os }}_${{ matrix.vec.arch }} 89 | path: artifacts/logs 90 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [Dashboard](https://microsoft.github.io/netperf/dist) 2 | 3 | # Network Perfomance Testing 4 | 5 | The repo is the common place other Microsoft owned networking projects (including Windows itself) use to run, store and visualize networking performance testing. Currently, the following projects (will) use this: 6 | 7 | - [microsoft/msquic](https://github.com/microsoft/msquic) 8 | - [microsoft/xdp-for-Windows](https://github.com/microsoft/xdp-for-windows) 9 | - [microsoft/ebpf-for-Windows](https://github.com/microsoft/ebpf-for-windows) 10 | - [Windows Server](https://www.microsoft.com/en-us/windows-server/) 11 | 12 | ## Goal 13 | 14 | Historically, networking performance testing has been spotty, inconsistent, not reproducable, and not easily accessible. Different groups or projects test performance in different ways, on different hardware. They even have different definitions of things like throughput and latency. This repo aims to fix that by providing a common, open place to run, store, and visualize networking performance testing. The end result is ultimately a set of dashboards summarizing the performance of the various projects, across various scenarios, and across various platforms. 15 | 16 | ## Documentation 17 | 18 | - [Start Here](./docs/start_here.md) 19 | 20 | ## Contributing 21 | 22 | This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 23 | 24 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. 25 | 26 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 27 | 28 | ## Trademarks 29 | 30 | This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies. 31 | -------------------------------------------------------------------------------- /dashboard/.eslintignore: -------------------------------------------------------------------------------- 1 | // .eslintignore 2 | build/* 3 | dist/* 4 | public/* 5 | **/out/* 6 | **/node_modules/* 7 | 8 | **/.next/* 9 | next.config.js 10 | 11 | vite.config.js 12 | vite.config.ts 13 | 14 | src/reportWebVitals.js 15 | src/service-worker.js 16 | src/serviceWorkerRegistration.js 17 | src/setupTests.js 18 | 19 | src/reportWebVitals.ts 20 | src/service-worker.ts 21 | src/serviceWorkerRegistration.ts 22 | src/setupTests.ts 23 | -------------------------------------------------------------------------------- /dashboard/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "env": { 4 | "browser": true, 5 | "es2021": true 6 | }, 7 | "plugins": [ 8 | "perfectionist", 9 | "unused-imports", 10 | "prettier" 11 | ], 12 | "extends": [ 13 | "airbnb", 14 | "airbnb/hooks", 15 | "prettier" 16 | ], 17 | "parserOptions": { 18 | "ecmaVersion": "latest", 19 | "sourceType": "module", 20 | "ecmaFeatures": { 21 | "jsx": true 22 | } 23 | }, 24 | "settings": { 25 | "react": { 26 | "version": "detect" 27 | }, 28 | "import/resolver": { 29 | "alias": { 30 | "map": [ 31 | [ 32 | "src", 33 | "./src" 34 | ] 35 | ], 36 | "extensions": [ 37 | ".js", 38 | ".jsx", 39 | ".json" 40 | ] 41 | } 42 | } 43 | }, 44 | "rules": { 45 | "no-alert": 0, 46 | "camelcase": 0, 47 | "no-console": 0, 48 | "no-param-reassign": 0, 49 | "naming-convention": 0, 50 | "default-param-last": 0, 51 | "no-underscore-dangle": 0, 52 | "no-use-before-define": 0, 53 | "no-restricted-exports": 0, 54 | "react/no-children-prop": 0, 55 | "react/forbid-prop-types": 0, 56 | "react/react-in-jsx-scope": 0, 57 | "jsx-a11y/anchor-is-valid": 0, 58 | "react/no-array-index-key": 0, 59 | "no-promise-executor-return": 0, 60 | "react/require-default-props": 0, 61 | "react/jsx-filename-extension": 0, 62 | "react/jsx-props-no-spreading": 0, 63 | "import/prefer-default-export": 0, 64 | "react/function-component-definition": 0, 65 | "jsx-a11y/control-has-associated-label": 0, 66 | "react/jsx-no-useless-fragment": [ 67 | 1, 68 | { 69 | "allowExpressions": true 70 | } 71 | ], 72 | "prefer-destructuring": [ 73 | 1, 74 | { 75 | "object": true, 76 | "array": false 77 | } 78 | ], 79 | "react/no-unstable-nested-components": [ 80 | 1, 81 | { 82 | "allowAsProps": true 83 | } 84 | ], 85 | "no-unused-vars": [ 86 | 1, 87 | { 88 | "args": "none" 89 | } 90 | ], 91 | "react/jsx-no-duplicate-props": [ 92 | 1, 93 | { 94 | "ignoreCase": false 95 | } 96 | ], 97 | // unused-imports 98 | // https://www.npmjs.com/package/eslint-plugin-unused-imports 99 | "unused-imports/no-unused-imports": 1, 100 | "unused-imports/no-unused-vars": [ 101 | 0, 102 | { 103 | "vars": "all", 104 | "varsIgnorePattern": "^_", 105 | "args": "after-used", 106 | "argsIgnorePattern": "^_" 107 | } 108 | ], 109 | // perfectionist 110 | // https://eslint-plugin-perfectionist.azat.io/ 111 | "perfectionist/sort-named-imports": [ 112 | 1, 113 | { 114 | "order": "asc", 115 | "type": "line-length" 116 | } 117 | ], 118 | "perfectionist/sort-named-exports": [ 119 | 1, 120 | { 121 | "order": "asc", 122 | "type": "line-length" 123 | } 124 | ], 125 | "perfectionist/sort-exports": [ 126 | 1, 127 | { 128 | "order": "asc", 129 | "type": "line-length" 130 | } 131 | ] 132 | } 133 | } -------------------------------------------------------------------------------- /dashboard/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | .pnp 6 | .pnp.js 7 | 8 | # testing 9 | coverage 10 | 11 | # production 12 | .next 13 | .swc 14 | _static 15 | out 16 | dist 17 | build 18 | 19 | # environment variables 20 | .env 21 | .env.local 22 | .env.development.local 23 | .env.test.local 24 | .env.production.local 25 | 26 | # misc 27 | .DS_Store 28 | .vercel 29 | .netlify 30 | .unimportedrc.json 31 | tsconfig.tsbuildinfo 32 | .vscode 33 | 34 | npm-debug.log* 35 | yarn-debug.log* 36 | yarn-error.log* 37 | -------------------------------------------------------------------------------- /dashboard/.prettierignore: -------------------------------------------------------------------------------- 1 | build/* 2 | dist/* 3 | public/* 4 | **/out/* 5 | **/.next/* 6 | **/node_modules/* 7 | 8 | package-lock.json 9 | yarn.lock 10 | -------------------------------------------------------------------------------- /dashboard/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "tabWidth": 2 6 | } 7 | -------------------------------------------------------------------------------- /dashboard/.vite/deps/_metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "7932a754", 3 | "configHash": "528c051e", 4 | "lockfileHash": "e3b0c442", 5 | "browserHash": "3c278aeb", 6 | "optimized": {}, 7 | "chunks": {} 8 | } -------------------------------------------------------------------------------- /dashboard/.vite/deps/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /dashboard/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### v1.8.0 2 | 3 | ###### Wed 11, 2023 4 | 5 | - Migrate to vite.js. 6 | - Upgrade and restructure the directory. 7 | - Upgrade some dependencies to the latest versions 8 | 9 | --- 10 | 11 | ### v1.7.0 12 | 13 | ###### Feb 21, 2023 14 | 15 | - Upgrade some dependencies to the latest versions 16 | 17 | --- 18 | 19 | ### v1.6.0 20 | 21 | ###### Oct 17, 2022 22 | 23 | - Upgrade and restructure the directory. 24 | - Upgrade some dependencies to the latest versions 25 | 26 | --- 27 | 28 | ### v1.5.0 29 | 30 | ###### Jul 04, 2022 31 | 32 | - Support react 18. 33 | - Upgrade some dependencies to the latest versions 34 | 35 | --- 36 | 37 | ### v1.4.0 38 | 39 | ###### Apr 12, 2022 40 | 41 | - Update `src/components`. 42 | - Update `src/sections`. 43 | - Update `src/pages`. 44 | - Update `src/layouts`. 45 | - Update `src/theme`. 46 | - Upgrade some dependencies to the latest versions 47 | 48 | --- 49 | 50 | ### v1.3.0 51 | 52 | ###### Feb 21, 2022 53 | 54 | - Support react-script v5.0.0 55 | - Source code improvement 56 | - Upgrade some dependencies to the latest versions 57 | 58 | --- 59 | 60 | ### v1.2.0 61 | 62 | ###### Sep 18, 2021 63 | 64 | - Support MIU v5.0.0 official release 65 | - Upgrade some dependencies to the latest versions 66 | - Update `src/theme/typography.js` 67 | - Upgrade some dependencies to the latest versions 68 | 69 | --- 70 | 71 | ### v1.1.0 72 | 73 | ###### Jul 23, 2021 74 | 75 | - Support MUI v5.0.0-beta.1 76 | - Upgrade some dependencies to the latest versions 77 | 78 | --- 79 | 80 | ### v1.0.0 81 | 82 | ###### Jun 28, 2021 83 | 84 | Initial release. 85 | -------------------------------------------------------------------------------- /dashboard/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Minimal UI ([https://minimals.cc/](https://minimals.cc/)) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /dashboard/README.md: -------------------------------------------------------------------------------- 1 | ## Quick Start 2 | 3 | Make sure you install Node.js on your system. 4 | 5 | - cd /dashboard 6 | - npm i 7 | - npm run dev (starts local server) 8 | 9 | ## Building for production: 10 | - npm run build 11 | - This will automatically configure everything to assume the root url is `netperf/dist` instead of `/`, for the sake of Github Pages. 12 | - A /dist folder will appear that contains the raw HTML, JS, CSS... etc. 13 | -------------------------------------------------------------------------------- /dashboard/example.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/example.sqlite -------------------------------------------------------------------------------- /dashboard/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 22 | 23 | Network performance 24 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /dashboard/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "." 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /dashboard/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@minimal/material-kit-react", 3 | "author": "minimals.cc", 4 | "licence": "MIT", 5 | "version": "1.8.0", 6 | "private": false, 7 | "scripts": { 8 | "dev": "vite", 9 | "start": "vite preview", 10 | "build": "vite build", 11 | "lint": "eslint \"src/**/*.{js,jsx,ts,tsx}\"", 12 | "lint:fix": "eslint --fix \"src/**/*.{js,jsx,ts,tsx}\"", 13 | "prettier": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"", 14 | "rm:all": "rm -rf node_modules .next out dist build", 15 | "re:start": "yarn rm:all && yarn install && yarn dev", 16 | "re:build": "yarn rm:all && yarn install && yarn build", 17 | "re:build-npm": "npm run rm:all && npm install && npm run build", 18 | "dev:host": "vite --host", 19 | "vite:start": "vite", 20 | "vite:build": "vite build" 21 | }, 22 | "dependencies": { 23 | "@emotion/react": "^11.11.3", 24 | "@emotion/styled": "^11.11.0", 25 | "@faker-js/faker": "^9.8.0", 26 | "@iconify/react": "^5.2.1", 27 | "@mui/lab": "^5.0.0-alpha.165", 28 | "@mui/material": "^5.15.13", 29 | "apexcharts": "3.44.2", 30 | "chart.js": "^4.4.8", 31 | "date-fns": "^3.5.0", 32 | "history": "^5.3.0", 33 | "lodash": "^4.17.21", 34 | "numeral": "^2.0.6", 35 | "prop-types": "^15.8.1", 36 | "react": "^18.2.0", 37 | "react-apexcharts": "^1.4.1", 38 | "react-chartjs-2": "^5.2.0", 39 | "react-dom": "^18.2.0", 40 | "react-helmet-async": "^2.0.4", 41 | "react-hook-form": "^7.57.0", 42 | "react-router-dom": "^7.6.2", 43 | "simplebar-react": "^3.3.1", 44 | "sql.js": "^1.13.0" 45 | }, 46 | "devDependencies": { 47 | "@vitejs/plugin-react-swc": "^3.10.1", 48 | "eslint": "^8.56.0", 49 | "eslint-config-airbnb": "^19.0.4", 50 | "eslint-config-prettier": "^10.1.5", 51 | "eslint-import-resolver-alias": "^1.1.2", 52 | "eslint-plugin-import": "^2.29.1", 53 | "eslint-plugin-jsx-a11y": "^6.10.0", 54 | "eslint-plugin-perfectionist": "^4.14.0", 55 | "eslint-plugin-prettier": "^5.4.1", 56 | "eslint-plugin-react": "^7.37.5", 57 | "eslint-plugin-react-hooks": "^4.6.0", 58 | "eslint-plugin-unused-imports": "^3.0.0", 59 | "prettier": "^3.5.3", 60 | "vite": "^6.3.5", 61 | "vite-plugin-checker": "^0.8.0" 62 | }, 63 | "homepage": "https://microsoft.github.io/netperf/dist" 64 | } -------------------------------------------------------------------------------- /dashboard/public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /dashboard/public/assets/background/overlay_1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/background/overlay_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/background/overlay_2.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/background/overlay_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/background/overlay_3.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/background/overlay_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/background/overlay_4.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/icons/glass/Ubuntu-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/icons/glass/Ubuntu-Logo.png -------------------------------------------------------------------------------- /dashboard/public/assets/icons/glass/ic_glass_bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/icons/glass/ic_glass_bag.png -------------------------------------------------------------------------------- /dashboard/public/assets/icons/glass/ic_glass_buy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/icons/glass/ic_glass_buy.png -------------------------------------------------------------------------------- /dashboard/public/assets/icons/glass/ic_glass_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/icons/glass/ic_glass_message.png -------------------------------------------------------------------------------- /dashboard/public/assets/icons/glass/ic_glass_users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/icons/glass/ic_glass_users.png -------------------------------------------------------------------------------- /dashboard/public/assets/icons/glass/windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/icons/glass/windows.png -------------------------------------------------------------------------------- /dashboard/public/assets/icons/ic_flag_de.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/ic_flag_en.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/ic_flag_fr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/ic_notification_chat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/ic_notification_mail.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/ic_notification_package.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/ic_notification_shipping.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/navbar/ic_analytics.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/navbar/ic_blog.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/navbar/ic_cart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/navbar/ic_disabled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/navbar/ic_lock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/navbar/ic_user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /dashboard/public/assets/icons/shape-avatar.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/illustrations/illustration_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/illustrations/illustration_avatar.png -------------------------------------------------------------------------------- /dashboard/public/assets/illustrations/illustration_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/illustrations/illustration_login.png -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_1.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_10.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_11.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_12.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_13.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_14.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_15.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_16.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_17.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_18.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_19.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_2.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_20.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_21.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_22.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_23.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_24.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_25.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_3.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_4.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_5.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_6.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_7.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_8.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/avatars/avatar_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/avatars/avatar_9.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_1.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_10.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_11.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_12.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_13.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_14.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_15.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_16.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_17.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_18.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_19.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_2.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_20.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_21.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_22.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_23.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_24.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_3.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_4.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_5.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_6.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_7.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_8.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/covers/cover_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/covers/cover_9.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_1.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_10.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_11.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_12.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_13.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_14.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_15.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_16.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_17.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_18.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_19.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_2.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_20.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_21.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_22.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_23.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_24.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_3.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_4.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_5.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_6.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_7.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_8.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/images/products/product_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/images/products/product_9.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/placeholder.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/public/assets/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/preview.jpg -------------------------------------------------------------------------------- /dashboard/public/assets/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/assets/transparent.png -------------------------------------------------------------------------------- /dashboard/public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /dashboard/public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /dashboard/public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /dashboard/public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /dashboard/public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /dashboard/public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/public/favicon/favicon.ico -------------------------------------------------------------------------------- /dashboard/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Minimal App", 3 | "name": "React Material Minimal UI Kit", 4 | "icons": [ 5 | { 6 | "src": "favicon/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "favicon/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "start_url": ".", 17 | "display": "standalone", 18 | "theme_color": "#000000", 19 | "background_color": "#ffffff" 20 | } 21 | -------------------------------------------------------------------------------- /dashboard/src/_mock/account.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const account = { 4 | displayName: 'Jaydon Frankie', 5 | email: 'demo@minimals.cc', 6 | photoURL: '/assets/images/avatars/avatar_25.jpg', 7 | }; 8 | -------------------------------------------------------------------------------- /dashboard/src/_mock/blog.js: -------------------------------------------------------------------------------- 1 | import { faker } from '@faker-js/faker'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | const POST_TITLES = [ 6 | 'Whiteboard Templates By Industry Leaders', 7 | 'Tesla Cybertruck-inspired camper trailer for Tesla fans who can’t just wait for the truck!', 8 | 'Designify Agency Landing Page Design', 9 | '✨What is Done is Done ✨', 10 | 'Fresh Prince', 11 | 'Six Socks Studio', 12 | 'vincenzo de cotiis’ crossing over showcases a research on contamination', 13 | 'Simple, Great Looking Animations in Your Project | Video Tutorial', 14 | '40 Free Serif Fonts for Digital Designers', 15 | 'Examining the Evolution of the Typical Web Design Client', 16 | 'Katie Griffin loves making that homey art', 17 | 'The American Dream retold through mid-century railroad graphics', 18 | 'Illustration System Design', 19 | 'CarZio-Delivery Driver App SignIn/SignUp', 20 | 'How to create a client-serverless Jamstack app using Netlify, Gatsby and Fauna', 21 | 'Tylko Organise effortlessly -3D & Motion Design', 22 | 'RAYO ?? A expanded visual arts festival identity', 23 | 'Anthony Burrill and Wired mag’s Andrew Diprose discuss how they made January’s Change Everything cover', 24 | 'Inside the Mind of Samuel Day', 25 | 'Portfolio Review: Is This Portfolio Too Creative?', 26 | 'Akkers van Margraten', 27 | 'Gradient Ticket icon', 28 | 'Here’s a Dyson motorcycle concept that doesn’t ‘suck’!', 29 | 'How to Animate a SVG with border-image', 30 | ]; 31 | 32 | export const posts = [...Array(23)].map((_, index) => ({ 33 | id: faker.string.uuid(), 34 | cover: `/assets/images/covers/cover_${index + 1}.jpg`, 35 | title: POST_TITLES[index + 1], 36 | createdAt: faker.date.past(), 37 | view: faker.number.int(99999), 38 | comment: faker.number.int(99999), 39 | share: faker.number.int(99999), 40 | favorite: faker.number.int(99999), 41 | author: { 42 | name: faker.person.fullName(), 43 | avatarUrl: `/assets/images/avatars/avatar_${index + 1}.jpg`, 44 | }, 45 | })); 46 | -------------------------------------------------------------------------------- /dashboard/src/_mock/products.js: -------------------------------------------------------------------------------- 1 | import { sample } from 'lodash'; 2 | import { faker } from '@faker-js/faker'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | const PRODUCT_NAME = [ 7 | 'Nike Air Force 1 NDESTRUKT', 8 | 'Nike Space Hippie 04', 9 | 'Nike Air Zoom Pegasus 37 A.I.R. Chaz Bear', 10 | 'Nike Blazer Low 77 Vintage', 11 | 'Nike ZoomX SuperRep Surge', 12 | 'Zoom Freak 2', 13 | 'Nike Air Max Zephyr', 14 | 'Jordan Delta', 15 | 'Air Jordan XXXV PF', 16 | 'Nike Waffle Racer Crater', 17 | 'Kyrie 7 EP Sisterhood', 18 | 'Nike Air Zoom BB NXT', 19 | 'Nike Air Force 1 07 LX', 20 | 'Nike Air Force 1 Shadow SE', 21 | 'Nike Air Zoom Tempo NEXT%', 22 | 'Nike DBreak-Type', 23 | 'Nike Air Max Up', 24 | 'Nike Air Max 270 React ENG', 25 | 'NikeCourt Royale', 26 | 'Nike Air Zoom Pegasus 37 Premium', 27 | 'Nike Air Zoom SuperRep', 28 | 'NikeCourt Royale', 29 | 'Nike React Art3mis', 30 | 'Nike React Infinity Run Flyknit A.I.R. Chaz Bear', 31 | ]; 32 | const PRODUCT_COLOR = [ 33 | '#00AB55', 34 | '#000000', 35 | '#FFFFFF', 36 | '#FFC0CB', 37 | '#FF4842', 38 | '#1890FF', 39 | '#94D82D', 40 | '#FFC107', 41 | ]; 42 | 43 | // ---------------------------------------------------------------------- 44 | 45 | export const products = [...Array(24)].map((_, index) => { 46 | const setIndex = index + 1; 47 | 48 | return { 49 | id: faker.string.uuid(), 50 | cover: `/assets/images/products/product_${setIndex}.jpg`, 51 | name: PRODUCT_NAME[index], 52 | price: faker.number.int({ min: 4, max: 99, precision: 0.01 }), 53 | priceSale: setIndex % 3 ? null : faker.number.int({ min: 19, max: 29, precision: 0.01 }), 54 | colors: 55 | (setIndex === 1 && PRODUCT_COLOR.slice(0, 2)) || 56 | (setIndex === 2 && PRODUCT_COLOR.slice(1, 3)) || 57 | (setIndex === 3 && PRODUCT_COLOR.slice(2, 4)) || 58 | (setIndex === 4 && PRODUCT_COLOR.slice(3, 6)) || 59 | (setIndex === 23 && PRODUCT_COLOR.slice(4, 6)) || 60 | (setIndex === 24 && PRODUCT_COLOR.slice(5, 6)) || 61 | PRODUCT_COLOR, 62 | status: sample(['sale', 'new', '', '']), 63 | }; 64 | }); 65 | -------------------------------------------------------------------------------- /dashboard/src/_mock/user.js: -------------------------------------------------------------------------------- 1 | import { sample } from 'lodash'; 2 | import { faker } from '@faker-js/faker'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export const users = [...Array(24)].map((_, index) => ({ 7 | id: faker.string.uuid(), 8 | avatarUrl: `/assets/images/avatars/avatar_${index + 1}.jpg`, 9 | name: faker.person.fullName(), 10 | company: faker.company.name(), 11 | isVerified: faker.datatype.boolean(), 12 | status: sample(['active', 'banned']), 13 | role: sample([ 14 | 'Leader', 15 | 'Hr Manager', 16 | 'UI Designer', 17 | 'UX Designer', 18 | 'UI/UX Designer', 19 | 'Project Manager', 20 | 'Backend Developer', 21 | 'Full Stack Designer', 22 | 'Front End Developer', 23 | 'Full Stack Developer', 24 | ]), 25 | })); 26 | -------------------------------------------------------------------------------- /dashboard/src/app.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable perfectionist/sort-imports */ 2 | /* eslint-disable react-hooks/exhaustive-deps */ 3 | import 'src/global.css'; 4 | 5 | import { useScrollToTop } from 'src/hooks/use-scroll-to-top'; 6 | import Router from 'src/routes/sections'; 7 | import ThemeProvider from 'src/theme'; 8 | 9 | // ---------------------------------------------------------------------- 10 | 11 | export default function App() { 12 | useScrollToTop(); 13 | 14 | return ( 15 | 16 | 17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /dashboard/src/components/chart/chart.js: -------------------------------------------------------------------------------- 1 | import { memo } from 'react'; 2 | import ApexChart from 'react-apexcharts'; 3 | 4 | import { alpha, styled } from '@mui/material/styles'; 5 | 6 | import { bgBlur } from 'src/theme/css'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | const Chart = styled(ApexChart)(({ theme }) => ({ 11 | '& .apexcharts-canvas': { 12 | // Tooltip 13 | '& .apexcharts-tooltip': { 14 | ...bgBlur({ 15 | color: theme.palette.background.default, 16 | }), 17 | color: theme.palette.text.primary, 18 | boxShadow: theme.customShadows.dropdown, 19 | borderRadius: theme.shape.borderRadius * 1.25, 20 | '&.apexcharts-theme-light': { 21 | borderColor: 'transparent', 22 | ...bgBlur({ 23 | color: theme.palette.background.default, 24 | }), 25 | }, 26 | }, 27 | '& .apexcharts-xaxistooltip': { 28 | ...bgBlur({ 29 | color: theme.palette.background.default, 30 | }), 31 | borderColor: 'transparent', 32 | color: theme.palette.text.primary, 33 | boxShadow: theme.customShadows.dropdown, 34 | borderRadius: theme.shape.borderRadius * 1.25, 35 | '&:before': { 36 | borderBottomColor: alpha(theme.palette.grey[500], 0.24), 37 | }, 38 | '&:after': { 39 | borderBottomColor: alpha(theme.palette.background.default, 0.8), 40 | }, 41 | }, 42 | '& .apexcharts-tooltip-title': { 43 | textAlign: 'center', 44 | fontWeight: theme.typography.fontWeightBold, 45 | backgroundColor: alpha(theme.palette.grey[500], 0.08), 46 | color: theme.palette.text[theme.palette.mode === 'light' ? 'secondary' : 'primary'], 47 | }, 48 | 49 | // LEGEND 50 | '& .apexcharts-legend': { 51 | padding: 0, 52 | }, 53 | '& .apexcharts-legend-series': { 54 | display: 'inline-flex !important', 55 | alignItems: 'center', 56 | }, 57 | '& .apexcharts-legend-marker': { 58 | marginRight: 8, 59 | }, 60 | '& .apexcharts-legend-text': { 61 | lineHeight: '18px', 62 | textTransform: 'capitalize', 63 | }, 64 | }, 65 | })); 66 | 67 | export default memo(Chart); 68 | -------------------------------------------------------------------------------- /dashboard/src/components/chart/index.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export { default } from './chart'; 4 | 5 | export { default as useChart } from './use-chart'; 6 | -------------------------------------------------------------------------------- /dashboard/src/components/color-utils/color-preview.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Box from '@mui/material/Box'; 4 | import Stack from '@mui/material/Stack'; 5 | import { alpha } from '@mui/material/styles'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | export default function ColorPreview({ colors, limit = 3, sx }) { 10 | const renderColors = colors.slice(0, limit); 11 | 12 | const remainingColor = colors.length - limit; 13 | 14 | return ( 15 | 16 | {renderColors.map((color, index) => ( 17 | `solid 2px ${theme.palette.background.paper}`, 26 | boxShadow: (theme) => `inset -1px 1px 2px ${alpha(theme.palette.common.black, 0.24)}`, 27 | }} 28 | /> 29 | ))} 30 | 31 | {colors.length > limit && ( 32 | {`+${remainingColor}`} 33 | )} 34 | 35 | ); 36 | } 37 | 38 | ColorPreview.propTypes = { 39 | colors: PropTypes.arrayOf(PropTypes.string), 40 | limit: PropTypes.number, 41 | sx: PropTypes.object, 42 | }; 43 | -------------------------------------------------------------------------------- /dashboard/src/components/color-utils/index.js: -------------------------------------------------------------------------------- 1 | export { default as ColorPicker } from './color-picker'; 2 | export { default as ColorPreview } from './color-preview'; 3 | -------------------------------------------------------------------------------- /dashboard/src/components/iconify/iconify.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | import { Icon } from '@iconify/react'; 4 | 5 | import Box from '@mui/material/Box'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | const Iconify = forwardRef(({ icon, width = 20, sx, ...other }, ref) => ( 10 | 18 | )); 19 | 20 | Iconify.propTypes = { 21 | icon: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), 22 | sx: PropTypes.object, 23 | width: PropTypes.number, 24 | }; 25 | 26 | export default Iconify; 27 | -------------------------------------------------------------------------------- /dashboard/src/components/iconify/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './iconify'; 2 | -------------------------------------------------------------------------------- /dashboard/src/components/label/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './label'; 2 | -------------------------------------------------------------------------------- /dashboard/src/components/label/label.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | 4 | import Box from '@mui/material/Box'; 5 | import { useTheme } from '@mui/material/styles'; 6 | 7 | import { StyledLabel } from './styles'; 8 | 9 | // ---------------------------------------------------------------------- 10 | 11 | const Label = forwardRef( 12 | ({ children, color = 'default', variant = 'soft', startIcon, endIcon, sx, ...other }, ref) => { 13 | const theme = useTheme(); 14 | 15 | const iconStyles = { 16 | width: 16, 17 | height: 16, 18 | '& svg, img': { width: 1, height: 1, objectFit: 'cover' }, 19 | }; 20 | 21 | return ( 22 | 34 | {startIcon && {startIcon} } 35 | 36 | {children} 37 | 38 | {endIcon && {endIcon} } 39 | 40 | ); 41 | } 42 | ); 43 | 44 | Label.propTypes = { 45 | children: PropTypes.node, 46 | endIcon: PropTypes.object, 47 | startIcon: PropTypes.object, 48 | sx: PropTypes.object, 49 | variant: PropTypes.oneOf(['filled', 'outlined', 'ghost', 'soft']), 50 | color: PropTypes.oneOf([ 51 | 'default', 52 | 'primary', 53 | 'secondary', 54 | 'info', 55 | 'success', 56 | 'warning', 57 | 'error', 58 | ]), 59 | }; 60 | 61 | export default Label; 62 | -------------------------------------------------------------------------------- /dashboard/src/components/label/styles.js: -------------------------------------------------------------------------------- 1 | import Box from '@mui/material/Box'; 2 | import { alpha, styled } from '@mui/material/styles'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export const StyledLabel = styled(Box)(({ theme, ownerState }) => { 7 | const lightMode = theme.palette.mode === 'light'; 8 | 9 | const filledVariant = ownerState.variant === 'filled'; 10 | 11 | const outlinedVariant = ownerState.variant === 'outlined'; 12 | 13 | const softVariant = ownerState.variant === 'soft'; 14 | 15 | const defaultStyle = { 16 | ...(ownerState.color === 'default' && { 17 | // FILLED 18 | ...(filledVariant && { 19 | color: lightMode ? theme.palette.common.white : theme.palette.grey[800], 20 | backgroundColor: theme.palette.text.primary, 21 | }), 22 | // OUTLINED 23 | ...(outlinedVariant && { 24 | backgroundColor: 'transparent', 25 | color: theme.palette.text.primary, 26 | border: `2px solid ${theme.palette.text.primary}`, 27 | }), 28 | // SOFT 29 | ...(softVariant && { 30 | color: theme.palette.text.secondary, 31 | backgroundColor: alpha(theme.palette.grey[500], 0.16), 32 | }), 33 | }), 34 | }; 35 | 36 | const colorStyle = { 37 | ...(ownerState.color !== 'default' && { 38 | // FILLED 39 | ...(filledVariant && { 40 | color: theme.palette[ownerState.color].contrastText, 41 | backgroundColor: theme.palette[ownerState.color].main, 42 | }), 43 | // OUTLINED 44 | ...(outlinedVariant && { 45 | backgroundColor: 'transparent', 46 | color: theme.palette[ownerState.color].main, 47 | border: `2px solid ${theme.palette[ownerState.color].main}`, 48 | }), 49 | // SOFT 50 | ...(softVariant && { 51 | color: theme.palette[ownerState.color][lightMode ? 'dark' : 'light'], 52 | backgroundColor: alpha(theme.palette[ownerState.color].main, 0.16), 53 | }), 54 | }), 55 | }; 56 | 57 | return { 58 | height: 24, 59 | minWidth: 24, 60 | lineHeight: 0, 61 | borderRadius: 6, 62 | cursor: 'default', 63 | alignItems: 'center', 64 | whiteSpace: 'nowrap', 65 | display: 'inline-flex', 66 | justifyContent: 'center', 67 | textTransform: 'capitalize', 68 | padding: theme.spacing(0, 0.75), 69 | fontSize: theme.typography.pxToRem(12), 70 | fontWeight: theme.typography.fontWeightBold, 71 | transition: theme.transitions.create('all', { 72 | duration: theme.transitions.duration.shorter, 73 | }), 74 | ...defaultStyle, 75 | ...colorStyle, 76 | }; 77 | }); 78 | -------------------------------------------------------------------------------- /dashboard/src/components/logo/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './logo'; 2 | -------------------------------------------------------------------------------- /dashboard/src/components/logo/logo.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | 4 | import Box from '@mui/material/Box'; 5 | import Link from '@mui/material/Link'; 6 | // import { useTheme } from '@mui/material/styles'; 7 | 8 | import { RouterLink } from 'src/routes/components'; 9 | 10 | // ---------------------------------------------------------------------- 11 | 12 | const Logo = forwardRef(({ disabledLink = false, sx, ...other }, ref) => { 13 | // const theme = useTheme(); 14 | 15 | // const PRIMARY_LIGHT = theme.palette.primary.light; 16 | 17 | // const PRIMARY_MAIN = theme.palette.primary.main; 18 | 19 | // const PRIMARY_DARK = theme.palette.primary.dark; 20 | 21 | // OR using local (public folder) 22 | // ------------------------------------------------------- 23 | // const logo = ( 24 | // your path 27 | // sx={{ width: 40, height: 40, cursor: 'pointer', ...sx }} 28 | // /> 29 | // ); 30 | 31 | 32 | 33 | const logo = ( 34 | 45 |
46 | 47 |
48 | ); 49 | 50 | if (disabledLink) { 51 | return logo; 52 | } 53 | 54 | return ( 55 | 56 | {logo} 57 |
58 |
59 | 60 | ); 61 | }); 62 | 63 | Logo.propTypes = { 64 | disabledLink: PropTypes.bool, 65 | sx: PropTypes.object, 66 | }; 67 | 68 | export default Logo; 69 | -------------------------------------------------------------------------------- /dashboard/src/components/scrollbar/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './scrollbar'; 2 | -------------------------------------------------------------------------------- /dashboard/src/components/scrollbar/scrollbar.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { memo, forwardRef } from 'react'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | import { StyledScrollbar, StyledRootScrollbar } from './styles'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | const Scrollbar = forwardRef(({ children, sx, ...other }, ref) => { 11 | const userAgent = typeof navigator === 'undefined' ? 'SSR' : navigator.userAgent; 12 | 13 | const mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent); 14 | 15 | if (mobile) { 16 | return ( 17 | 18 | {children} 19 | 20 | ); 21 | } 22 | 23 | return ( 24 | 25 | 33 | {children} 34 | 35 | 36 | ); 37 | }); 38 | 39 | Scrollbar.propTypes = { 40 | children: PropTypes.node, 41 | sx: PropTypes.object, 42 | }; 43 | 44 | export default memo(Scrollbar); 45 | -------------------------------------------------------------------------------- /dashboard/src/components/scrollbar/styles.js: -------------------------------------------------------------------------------- 1 | import SimpleBar from 'simplebar-react'; 2 | 3 | import { alpha, styled } from '@mui/material/styles'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export const StyledRootScrollbar = styled('div')(() => ({ 8 | flexGrow: 1, 9 | height: '100%', 10 | overflow: 'hidden', 11 | })); 12 | 13 | export const StyledScrollbar = styled(SimpleBar)(({ theme }) => ({ 14 | maxHeight: '100%', 15 | '& .simplebar-scrollbar': { 16 | '&:before': { 17 | backgroundColor: alpha(theme.palette.grey[600], 0.48), 18 | }, 19 | '&.simplebar-visible:before': { 20 | opacity: 1, 21 | }, 22 | }, 23 | '& .simplebar-mask': { 24 | zIndex: 'inherit', 25 | }, 26 | })); 27 | -------------------------------------------------------------------------------- /dashboard/src/components/svg-color/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './svg-color'; 2 | -------------------------------------------------------------------------------- /dashboard/src/components/svg-color/svg-color.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | const SvgColor = forwardRef(({ src, sx, ...other }, ref) => ( 9 | 24 | )); 25 | 26 | SvgColor.propTypes = { 27 | src: PropTypes.string, 28 | sx: PropTypes.object, 29 | }; 30 | 31 | export default SvgColor; 32 | -------------------------------------------------------------------------------- /dashboard/src/global.css: -------------------------------------------------------------------------------- 1 | /* scrollbar */ 2 | @import 'simplebar-react/dist/simplebar.min.css'; 3 | 4 | /* Spinner Styles */ 5 | .spinner { 6 | border: 4px solid rgba(0, 0, 0, 0.1); 7 | width: 40px; 8 | height: 40px; 9 | border-radius: 50%; 10 | border-left-color: #09f; 11 | 12 | animation: spin 1s ease infinite; 13 | position: absolute; /* Positioning the spinner */ 14 | top: 50%; /* Center vertically */ 15 | left: 50%; /* Center horizontally */ 16 | transform: translate(-50%, -50%); /* Adjust the position correctly */ 17 | } 18 | 19 | @keyframes spin { 20 | 0% { 21 | transform: rotate(0deg); 22 | } 23 | 100% { 24 | transform: rotate(360deg); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dashboard/src/hooks/use-db.js: -------------------------------------------------------------------------------- 1 | import initSqlJs from 'sql.js' 2 | 3 | const sqlPromise = initSqlJs({ 4 | locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.9.0/${file}` 5 | }); 6 | 7 | const dataPromise = fetch("http://localhost:3030/netperf/dist/example.sqlite").then(res => res.arrayBuffer()); // TODO: replace this with netperf/sqlite URL. 8 | const [SQL, buf] = await Promise.all([sqlPromise, dataPromise]) 9 | const db = new SQL.Database(new Uint8Array(buf)); 10 | 11 | export default db -------------------------------------------------------------------------------- /dashboard/src/hooks/use-fetch-data.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | 3 | function useFetchData(url) { 4 | const [data, setData] = useState(null); 5 | const [isLoading, setIsLoading] = useState(true); 6 | const [error, setError] = useState(null); 7 | 8 | useEffect(() => { 9 | fetch(url) 10 | .then(response => { 11 | if (!response.ok) { 12 | throw new Error('Network response was not ok'); 13 | } 14 | return response.json(); 15 | }) 16 | .then(json => { 17 | setData(json); 18 | setIsLoading(false); 19 | }) 20 | .catch(err => { 21 | setError(err); 22 | setIsLoading(false); 23 | }); 24 | }, [url]); // Dependency array includes url to re-run the effect if the url changes 25 | 26 | return { data, isLoading, error }; 27 | } 28 | 29 | export default useFetchData; 30 | -------------------------------------------------------------------------------- /dashboard/src/hooks/use-responsive.js: -------------------------------------------------------------------------------- 1 | import { useTheme } from '@mui/material/styles'; 2 | import useMediaQuery from '@mui/material/useMediaQuery'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useResponsive(query, start, end) { 7 | const theme = useTheme(); 8 | 9 | const mediaUp = useMediaQuery(theme.breakpoints.up(start)); 10 | 11 | const mediaDown = useMediaQuery(theme.breakpoints.down(start)); 12 | 13 | const mediaBetween = useMediaQuery(theme.breakpoints.between(start, end)); 14 | 15 | const mediaOnly = useMediaQuery(theme.breakpoints.only(start)); 16 | 17 | if (query === 'up') { 18 | return mediaUp; 19 | } 20 | 21 | if (query === 'down') { 22 | return mediaDown; 23 | } 24 | 25 | if (query === 'between') { 26 | return mediaBetween; 27 | } 28 | 29 | return mediaOnly; 30 | } 31 | 32 | // ---------------------------------------------------------------------- 33 | 34 | export function useWidth() { 35 | const theme = useTheme(); 36 | 37 | const keys = [...theme.breakpoints.keys].reverse(); 38 | 39 | return ( 40 | keys.reduce((output, key) => { 41 | // eslint-disable-next-line react-hooks/rules-of-hooks 42 | const matches = useMediaQuery(theme.breakpoints.up(key)); 43 | 44 | return !output && matches ? key : output; 45 | }, null) || 'xs' 46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /dashboard/src/hooks/use-scroll-to-top.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useLocation } from 'react-router-dom'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useScrollToTop() { 7 | const { pathname } = useLocation(); 8 | 9 | useEffect(() => { 10 | window.scrollTo(0, 0); 11 | }, [pathname]); 12 | 13 | return null; 14 | } 15 | -------------------------------------------------------------------------------- /dashboard/src/hooks/use-sql-lite.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | 3 | const function_table = {}; 4 | let call_id = 0; 5 | 6 | 7 | const useSQLiteWorker = (dbUrl) => { 8 | const [dbWorker, setDbWorker] = useState(null); 9 | const [isReady, setIsReady] = useState(false); 10 | const [db, setDb] = useState(null); 11 | const [err, setError] = useState(null); 12 | 13 | useEffect(() => { 14 | const devMode = false; 15 | let workerUrl = 'https://microsoft.github.io/netperf/wasm_worker.js' // DevURL = 'dist/wasm_worker.js' 16 | if (devMode) { 17 | workerUrl = 'wasm_worker.js'; 18 | } 19 | const worker = new Worker(workerUrl); 20 | worker.onmessage = (e) => { 21 | const { type, error, results, id } = e.data; 22 | switch (type) { 23 | case 'ready': 24 | setIsReady(true); 25 | setDb(results); 26 | break; 27 | case 'error': 28 | setError(error); 29 | break; 30 | case 'execResult': 31 | // Handle execution results here 32 | // console.log(function_table); 33 | function_table[id](results); 34 | break; 35 | default: 36 | break; 37 | } 38 | }; 39 | 40 | worker.postMessage({ type: 'init', url: dbUrl }); 41 | setDbWorker(worker); 42 | 43 | // Cleanup 44 | return () => { 45 | worker.terminate(); 46 | }; 47 | }, [dbUrl]); 48 | 49 | const exec = (sql, setState) => { 50 | 51 | call_id += 1; 52 | function_table[call_id] = setState; 53 | 54 | if (dbWorker && isReady) { 55 | dbWorker.postMessage({ type: 'exec', sql, call_id }); 56 | } else { 57 | console.error('Database is not ready or worker is not set up'); 58 | } 59 | }; 60 | 61 | return { exec, isReady, db, err }; 62 | }; 63 | 64 | export default useSQLiteWorker; 65 | -------------------------------------------------------------------------------- /dashboard/src/layouts/dashboard/common/account-popover.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/netperf/2ddb23e6b730b61abd32e2b396d576e6ca134dd7/dashboard/src/layouts/dashboard/common/account-popover.jsx -------------------------------------------------------------------------------- /dashboard/src/layouts/dashboard/common/language-popover.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | import Box from '@mui/material/Box'; 4 | import Popover from '@mui/material/Popover'; 5 | import MenuItem from '@mui/material/MenuItem'; 6 | import IconButton from '@mui/material/IconButton'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | const LANGS = [ 11 | { 12 | value: 'en', 13 | label: 'English', 14 | icon: '/assets/icons/ic_flag_en.svg', 15 | }, 16 | { 17 | value: 'de', 18 | label: 'German', 19 | icon: '/assets/icons/ic_flag_de.svg', 20 | }, 21 | { 22 | value: 'fr', 23 | label: 'French', 24 | icon: '/assets/icons/ic_flag_fr.svg', 25 | }, 26 | ]; 27 | 28 | // ---------------------------------------------------------------------- 29 | 30 | export default function LanguagePopover() { 31 | const [open, setOpen] = useState(null); 32 | 33 | const handleOpen = (event) => { 34 | setOpen(event.currentTarget); 35 | }; 36 | 37 | const handleClose = () => { 38 | setOpen(null); 39 | }; 40 | 41 | return ( 42 | <> 43 | 53 | {LANGS[0].label} 54 | 55 | 56 | 71 | {LANGS.map((option) => ( 72 | handleClose()} 76 | sx={{ typography: 'body2', py: 1 }} 77 | > 78 | 79 | 80 | {option.label} 81 | 82 | ))} 83 | 84 | 85 | ); 86 | } 87 | -------------------------------------------------------------------------------- /dashboard/src/layouts/dashboard/common/searchbar.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | import Slide from '@mui/material/Slide'; 4 | import Input from '@mui/material/Input'; 5 | import Button from '@mui/material/Button'; 6 | import { styled } from '@mui/material/styles'; 7 | import IconButton from '@mui/material/IconButton'; 8 | import InputAdornment from '@mui/material/InputAdornment'; 9 | import ClickAwayListener from '@mui/material/ClickAwayListener'; 10 | 11 | import { bgBlur } from 'src/theme/css'; 12 | 13 | import Iconify from 'src/components/iconify'; 14 | 15 | // ---------------------------------------------------------------------- 16 | 17 | const HEADER_MOBILE = 64; 18 | const HEADER_DESKTOP = 92; 19 | 20 | const StyledSearchbar = styled('div')(({ theme }) => ({ 21 | ...bgBlur({ 22 | color: theme.palette.background.default, 23 | }), 24 | top: 0, 25 | left: 0, 26 | zIndex: 99, 27 | width: '100%', 28 | display: 'flex', 29 | position: 'absolute', 30 | alignItems: 'center', 31 | height: HEADER_MOBILE, 32 | padding: theme.spacing(0, 3), 33 | boxShadow: theme.customShadows.z8, 34 | [theme.breakpoints.up('md')]: { 35 | height: HEADER_DESKTOP, 36 | padding: theme.spacing(0, 5), 37 | }, 38 | })); 39 | 40 | // ---------------------------------------------------------------------- 41 | 42 | export default function Searchbar() { 43 | const [open, setOpen] = useState(false); 44 | 45 | const handleOpen = () => { 46 | setOpen(!open); 47 | }; 48 | 49 | const handleClose = () => { 50 | setOpen(false); 51 | }; 52 | 53 | return ( 54 | 55 |
56 | {!open && ( 57 | 58 | 59 | 60 | )} 61 | 62 | 63 | 64 | 71 | 75 | 76 | } 77 | sx={{ mr: 1, fontWeight: 'fontWeightBold' }} 78 | /> 79 | 82 | 83 | 84 |
85 |
86 | ); 87 | } 88 | -------------------------------------------------------------------------------- /dashboard/src/layouts/dashboard/config-layout.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const HEADER = { 4 | H_MOBILE: 64, 5 | H_DESKTOP: 80, 6 | H_DESKTOP_OFFSET: 80 - 16, 7 | }; 8 | 9 | export const NAV = { 10 | WIDTH: 280, 11 | }; 12 | -------------------------------------------------------------------------------- /dashboard/src/layouts/dashboard/config-navigation.jsx: -------------------------------------------------------------------------------- 1 | import SvgColor from 'src/components/svg-color'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | const icon = (name) => ( 6 | 7 | ); 8 | 9 | const navConfig = [ 10 | { 11 | title: 'Overview', 12 | path: '/', 13 | icon: icon('ic_analytics'), 14 | }, 15 | { 16 | title: 'detailed throughput', 17 | path: '/throughput', 18 | icon: icon('ic_analytics'), 19 | }, 20 | { 21 | title: 'detailed latency', 22 | path: '/latency', 23 | icon: icon('ic_analytics'), 24 | }, 25 | { 26 | title: 'Requests Per Second', 27 | path: '/rps', 28 | icon: icon('ic_analytics'), 29 | }, 30 | { 31 | title: 'Handshakes Per Second', 32 | path: '/hps', 33 | icon: icon('ic_analytics'), 34 | }, 35 | // { 36 | // title: 'Detailed Analysis', 37 | // path: '/detailed', 38 | // icon: icon('ic_analytics'), 39 | // }, 40 | // { 41 | // title: 'product', 42 | // path: '/products', 43 | // icon: icon('ic_cart'), 44 | // }, 45 | // { 46 | // title: 'blog', 47 | // path: '/blog', 48 | // icon: icon('ic_blog'), 49 | // }, 50 | // { 51 | // title: 'login', 52 | // path: '/login', 53 | // icon: icon('ic_lock'), 54 | // }, 55 | // { 56 | // title: 'Not found', 57 | // path: '/404', 58 | // icon: icon('ic_disabled'), 59 | // }, 60 | ]; 61 | 62 | export default navConfig; 63 | -------------------------------------------------------------------------------- /dashboard/src/layouts/dashboard/header.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Box from '@mui/material/Box'; 4 | // import Stack from '@mui/material/Stack'; 5 | import AppBar from '@mui/material/AppBar'; 6 | import Toolbar from '@mui/material/Toolbar'; 7 | import { useTheme } from '@mui/material/styles'; 8 | import IconButton from '@mui/material/IconButton'; 9 | 10 | import { useResponsive } from 'src/hooks/use-responsive'; 11 | 12 | import { bgBlur } from 'src/theme/css'; 13 | 14 | import Iconify from 'src/components/iconify'; 15 | 16 | // import Searchbar from './common/searchbar'; 17 | import { NAV, HEADER } from './config-layout'; 18 | // import LanguagePopover from './common/language-popover'; 19 | // import NotificationsPopover from './common/notifications-popover'; 20 | 21 | // ---------------------------------------------------------------------- 22 | 23 | export default function Header({ onOpenNav }) { 24 | const theme = useTheme(); 25 | 26 | const lgUp = useResponsive('up', 'lg'); 27 | 28 | const renderContent = ( 29 | <> 30 | {!lgUp && ( 31 | 32 | 33 | 34 | )} 35 | 36 | {/* */} 37 | 38 | 39 | 40 | {/* 41 | 42 | 43 | */} 44 | 45 | ); 46 | 47 | return ( 48 | 65 | 71 | {renderContent} 72 | 73 | 74 | ); 75 | } 76 | 77 | Header.propTypes = { 78 | onOpenNav: PropTypes.func, 79 | }; 80 | -------------------------------------------------------------------------------- /dashboard/src/layouts/dashboard/index.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | import Nav from './nav'; 7 | import Main from './main'; 8 | import Header from './header'; 9 | 10 | // ---------------------------------------------------------------------- 11 | 12 | export default function DashboardLayout({ children }) { 13 | const [openNav, setOpenNav] = useState(false); 14 | 15 | return ( 16 | <> 17 |
setOpenNav(true)} /> 18 | 19 | 26 |