private void UpdateWorkloadsWithInstallRecord( IEnumerable <WorkloadId> workloadIds, SdkFeatureBand sdkFeatureBand, IEnumerable <ManifestVersionUpdate> manifestsToUpdate, DirectoryPath?offlineCache = null) { if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs)) { var installer = _workloadInstaller.GetPackInstaller(); IEnumerable <PackInfo> workloadPackToUpdate = new List <PackInfo>(); var transaction = new CliTransaction(); transaction.RollbackStarted = () => { Reporter.WriteLine(LocalizableStrings.RollingBackInstall); }; // Don't hide the original error if roll back fails, but do log the rollback failure transaction.RollbackFailed = ex => { Reporter.WriteLine(string.Format(LocalizableStrings.RollBackFailedMessage, ex.Message)); }; transaction.Run( action: context => { bool rollback = !string.IsNullOrWhiteSpace(_fromRollbackDefinition); foreach (var manifestUpdate in manifestsToUpdate) { _workloadInstaller.InstallWorkloadManifest(manifestUpdate, context, offlineCache, rollback); } _workloadResolver.RefreshWorkloadManifests(); workloadPackToUpdate = GetUpdatablePacks(installer); installer.InstallWorkloadPacks(workloadPackToUpdate, sdkFeatureBand, context, offlineCache); }, rollback: () => { // Nothing to roll back at this level, InstallWorkloadManifest and InstallWorkloadPacks handle the transaction rollback }); } else { var installer = _workloadInstaller.GetWorkloadInstaller(); foreach (var workloadId in workloadIds) { installer.InstallWorkload(workloadId); } } }
public override int Execute() { try { Reporter.WriteLine(); var featureBand = new SdkFeatureBand(_sdkVersion); var installedWorkloads = _workloadInstaller.GetWorkloadInstallationRecordRepository().GetInstalledWorkloads(featureBand); var unrecognizedWorkloads = _workloadIds.Where(workloadId => !installedWorkloads.Contains(workloadId)); if (unrecognizedWorkloads.Any()) { throw new Exception(string.Format(LocalizableStrings.WorkloadNotInstalled, string.Join(" ", unrecognizedWorkloads))); } foreach (var workloadId in _workloadIds) { Reporter.WriteLine(string.Format(LocalizableStrings.RemovingWorkloadInstallationRecord, workloadId)); _workloadInstaller.GetWorkloadInstallationRecordRepository() .DeleteWorkloadInstallationRecord(workloadId, featureBand); } if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs)) { var installer = _workloadInstaller.GetPackInstaller(); installer.GarbageCollectInstalledWorkloadPacks(); } else { var installer = _workloadInstaller.GetWorkloadInstaller(); foreach (var workloadId in _workloadIds) { installer.UninstallWorkload(workloadId); } } Reporter.WriteLine(); Reporter.WriteLine(string.Format(LocalizableStrings.UninstallSucceeded, string.Join(" ", _workloadIds))); Reporter.WriteLine(); } catch (Exception e) { _workloadInstaller.Shutdown(); // Don't show entire stack trace throw new GracefulException(string.Format(LocalizableStrings.WorkloadUninstallFailed, e.Message), e, isUserError: false); } return(_workloadInstaller.ExitCode); }
private void InstallWorkloadsWithInstallRecord(IEnumerable <WorkloadId> workloadIds, SdkFeatureBand sdkFeatureBand) { if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs)) { var installer = _workloadInstaller.GetPackInstaller(); var workloadPackToInstall = workloadIds .SelectMany(workloadId => _workloadResolver.GetPacksInWorkload(workloadId.ToString())) .Distinct() .Select(packId => _workloadResolver.TryGetPackInfo(packId)); TransactionalAction.Run( action: () => { foreach (var packId in workloadPackToInstall) { installer.InstallWorkloadPack(packId, sdkFeatureBand); } foreach (var workloadId in workloadIds) { _workloadInstaller.WriteWorkloadInstallationRecord(workloadId, sdkFeatureBand); } }, rollback: () => { foreach (var packId in workloadPackToInstall) { installer.RollBackWorkloadPackInstall(packId, sdkFeatureBand); } foreach (var workloadId in workloadIds) { _workloadInstaller.DeleteWorkloadInstallationRecord(workloadId, sdkFeatureBand); } }); } else { var installer = _workloadInstaller.GetWorkloadInstaller(); foreach (var workloadId in workloadIds) { installer.InstallWorkload(workloadId); } } }
private void InstallWorkloadsWithInstallRecord( IEnumerable <WorkloadId> workloadIds, SdkFeatureBand sdkFeatureBand, IEnumerable <ManifestVersionUpdate> manifestsToUpdate, DirectoryPath?offlineCache) { if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs)) { var installer = _workloadInstaller.GetPackInstaller(); IEnumerable <PackInfo> workloadPackToInstall = new List <PackInfo>(); IEnumerable <WorkloadId> newWorkloadInstallRecords = new List <WorkloadId>(); var transaction = new CliTransaction(); transaction.RollbackStarted = () => { Reporter.WriteLine(LocalizableStrings.RollingBackInstall); }; // Don't hide the original error if roll back fails, but do log the rollback failure transaction.RollbackFailed = ex => { Reporter.WriteLine(string.Format(LocalizableStrings.RollBackFailedMessage, ex.Message)); }; transaction.Run( action: context => { bool rollback = !string.IsNullOrWhiteSpace(_fromRollbackDefinition); foreach (var manifestUpdate in manifestsToUpdate) { _workloadInstaller.InstallWorkloadManifest(manifestUpdate, context, offlineCache, rollback); } _workloadResolver.RefreshWorkloadManifests(); workloadPackToInstall = GetPacksToInstall(workloadIds); installer.InstallWorkloadPacks(workloadPackToInstall, sdkFeatureBand, context, offlineCache); var recordRepo = _workloadInstaller.GetWorkloadInstallationRecordRepository(); newWorkloadInstallRecords = workloadIds.Except(recordRepo.GetInstalledWorkloads(sdkFeatureBand)); foreach (var workloadId in newWorkloadInstallRecords) { recordRepo.WriteWorkloadInstallationRecord(workloadId, sdkFeatureBand); } }, rollback: () => { // InstallWorkloadManifest and InstallWorkloadPacks already handle rolling back their actions, so here we only // need to delete the installation records foreach (var workloadId in newWorkloadInstallRecords) { _workloadInstaller.GetWorkloadInstallationRecordRepository() .DeleteWorkloadInstallationRecord(workloadId, sdkFeatureBand); } }); } else { var installer = _workloadInstaller.GetWorkloadInstaller(); foreach (var workloadId in workloadIds) { installer.InstallWorkload(workloadId); } } }