feat(autopilot): add interactive hardware hash mode#203
Open
mchave3 wants to merge 50 commits into
Open
Conversation
There was a problem hiding this comment.
Pull request overview
Adds a new interactive Autopilot hardware hash upload provisioning mode across Foundry OSD (media authoring) and Foundry.Deploy (deployment runtime), including JSON serialization, UI strings, deploy-step behavior, telemetry, and regression tests.
Changes:
- Introduces
InteractiveHardwareHashUploadas anAutopilotProvisioningModewith readable JSON (de)serialization in both Core and Deploy. - Updates OSD + Deploy UI/view-models and localized resources to surface the new mode and summarize it in preflight/launch screens.
- Adds deploy-step handling (explicit guard) and tests covering configuration, validation, telemetry, and deploy-step behavior.
Reviewed changes
Copilot reviewed 97 out of 97 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Foundry/Views/AutopilotPage.xaml | Adds a new SettingsExpander + ToggleSwitch for interactive hardware-hash upload. |
| src/Foundry/ViewModels/StartMediaViewModel.cs | Passes through the selected Autopilot provisioning mode and formats interactive mode in summaries. |
| src/Foundry/ViewModels/AutopilotConfigurationViewModel.cs | Adds interactive-mode state, toggles, and localized text bindings. |
| src/Foundry/Strings/ar-SA/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/bg-BG/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/cs-CZ/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/da-DK/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/de-DE/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/el-GR/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/en-GB/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/en-US/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/es-ES/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/es-MX/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/et-EE/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/fi-FI/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/fr-CA/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/fr-FR/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/he-IL/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/hr-HR/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/hu-HU/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/it-IT/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/ja-JP/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/ko-KR/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/lt-LT/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/lv-LV/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/nb-NO/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/nl-NL/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/pl-PL/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/pt-BR/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/pt-PT/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/ro-RO/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/ru-RU/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/sk-SK/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/sl-SI/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/sr-Latn-RS/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/sv-SE/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/th-TH/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/tr-TR/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/uk-UA/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/zh-CN/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry/Strings/zh-TW/Resources.resw | Adds localized strings for interactive mode and updates Autopilot description. |
| src/Foundry.Deploy/ViewModels/MainWindowViewModel.cs | Treats interactive mode as a valid Autopilot selection without requiring a JSON profile. |
| src/Foundry.Deploy/ViewModels/DeploymentPreparationViewModel.cs | Adds interactive-mode state and updates UI summary text to include it. |
| src/Foundry.Deploy/Strings/ar-SA/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/bg-BG/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/cs-CZ/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/da-DK/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/de-DE/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/el-GR/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/en-GB/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/en-US/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/es-ES/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/es-MX/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/et-EE/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/fi-FI/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/fr-CA/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/fr-FR/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/he-IL/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/hr-HR/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/hu-HU/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/it-IT/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/ja-JP/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/ko-KR/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/lt-LT/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/lv-LV/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/nb-NO/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/nl-NL/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/pl-PL/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/pt-BR/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/pt-PT/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/ro-RO/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/ru-RU/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/sk-SK/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/sl-SI/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/sr-Latn-RS/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/sv-SE/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/th-TH/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/tr-TR/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/uk-UA/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/zh-CN/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Strings/zh-TW/Resources.resx | Adds localized “interactive” mode label for Deploy preparation summary. |
| src/Foundry.Deploy/Services/Deployment/Steps/ProvisionAutopilotStep.cs | Adds an explicit guard that blocks interactive mode when the assistant is not staged. |
| src/Foundry.Deploy/Services/Deployment/DeploymentOrchestrator.cs | Reports interactive mode in deployment telemetry properties. |
| src/Foundry.Deploy/Models/Configuration/AutopilotProvisioningModeJsonConverter.cs | Adds JSON read/write support for interactiveHardwareHashUpload. |
| src/Foundry.Deploy/Models/Configuration/AutopilotProvisioningMode.cs | Adds InteractiveHardwareHashUpload enum value and docs. |
| src/Foundry.Deploy.Tests/ProvisionAutopilotStepTests.cs | Adds tests verifying interactive mode is blocked and does not stage JSON profiles. |
| src/Foundry.Deploy.Tests/DeploymentPreparationViewModelTests.cs | Adds tests asserting interactive mode hides JSON/cert UI and doesn’t require profile selection. |
| src/Foundry.Deploy.Tests/DeploymentLaunchPreparationServiceTests.cs | Adds test ensuring interactive mode doesn’t require JSON profile selection to launch. |
| src/Foundry.Deploy.Tests/DeployConfigurationModelTests.cs | Adds test for deserializing interactive provisioning mode from deploy config JSON. |
| src/Foundry.Core/Services/Telemetry/BootMediaTelemetryPropertyBuilder.cs | Adds interactive mode to boot media telemetry mapping. |
| src/Foundry.Core/Services/Configuration/AutopilotConfigurationValidator.cs | Treats interactive mode as “ready” during configuration validation. |
| src/Foundry.Core/Models/Configuration/AutopilotProvisioningModeJsonConverter.cs | Adds JSON read/write support for interactiveHardwareHashUpload. |
| src/Foundry.Core/Models/Configuration/AutopilotProvisioningMode.cs | Adds InteractiveHardwareHashUpload enum value and docs. |
| src/Foundry.Core.Tests/Configuration/FoundryConfigurationServiceTests.cs | Adds round-trip serialization test for interactive provisioning mode. |
| src/Foundry.Core.Tests/Configuration/DeployConfigurationGeneratorTests.cs | Adds test ensuring interactive mode omits certificate/PFX metadata in generated deploy config. |
| src/Foundry.Core.Tests/Configuration/AutopilotConfigurationValidatorTests.cs | Adds test ensuring interactive mode validates as ready without profile/cert metadata. |
| src/Foundry.Core.Tests/BootMediaTelemetryPropertyBuilderTests.cs | Adds test ensuring interactive mode telemetry string is reported. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
36
to
43
| return settings.ProvisioningMode switch | ||
| { | ||
| AutopilotProvisioningMode.JsonProfile => GetSelectedJsonProfile(settings) is not null | ||
| ? AutopilotConfigurationValidationResult.Ready(AutopilotConfigurationValidationCode.Ready) | ||
| : AutopilotConfigurationValidationResult.Blocked(AutopilotConfigurationValidationCode.JsonProfileMissing), | ||
| AutopilotProvisioningMode.HardwareHashUpload => EvaluateHardwareHashUpload(settings.HardwareHashUpload, currentTimeUtc), | ||
| AutopilotProvisioningMode.InteractiveHardwareHashUpload => AutopilotConfigurationValidationResult.Ready(AutopilotConfigurationValidationCode.Ready), | ||
| _ => AutopilotConfigurationValidationResult.Blocked(AutopilotConfigurationValidationCode.UnsupportedProvisioningMode) |
| Assert.False(viewModel.IsAutopilotProfileSelectionEnabled); | ||
| Assert.False(viewModel.IsHardwareHashGroupTagControlsVisible); | ||
| Assert.False(viewModel.IsHardwareHashUploadMessageVisible); | ||
| Assert.Contains("Interactive", viewModel.AutopilotModeText, StringComparison.OrdinalIgnoreCase); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
InteractiveHardwareHashUploadas a first-class Autopilot provisioning mode.Reason
Some environments block customer-managed app registrations or unattended certificate-based Graph authentication. This starts the interactive hardware hash upload path without replacing the existing zero-touch certificate upload flow.
Main Changes
interactiveHardwareHashUploadin Core and Deploy.Testing
dotnet test src\Foundry.Core.Tests\Foundry.Core.Tests.csproj -v minimaldotnet test src\Foundry.Deploy.Tests\Foundry.Deploy.Tests.csproj -v minimaldotnet test src\Foundry.Localization.Tests\Foundry.Localization.Tests.csproj -v minimaldotnet build src\Foundry\Foundry.csproj -v minimaldotnet build src\Foundry.Deploy\Foundry.Deploy.csproj -v minimalRefs #202