aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/FSE/Tango.FSE.Publisher.UI/MainWindowVM.cs
blob: 148ee37f6beb8b3c8cafed7056538c1931243fa4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tango.Protobuf.UI
{
    public class FileItem : Item
    {
        public override string ToString()
        {
            return File.ReadAllText(Path);
        }
    }
}
f='#n245'>245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Tango.AdvancedInstaller;
using Tango.Core;
using Tango.Core.Commands;
using Tango.FSE.BL.Web;
using Tango.FSE.Web.Messages;
using Tango.MachineService.Gateway;
using Tango.Settings;
using Tango.SharedUI;
using Tango.Transport.Web;

namespace Tango.FSE.Publisher.UI
{
    public class MainWindowVM : ViewModel
    {
        private FSEWebClient _client;
        private String _buildFolder;
        private const String APP_EXE_NAME = "Tango.FSE.UI.exe";

        private List<EnvironmentConfiguration> _environments;
        public List<EnvironmentConfiguration> Environments
        {
            get { return _environments; }
            set { _environments = value; RaisePropertyChangedAuto(); }
        }

        private EnvironmentConfiguration _selectedEnvironment;
        public EnvironmentConfiguration SelectedEnvironment
        {
            get { return _selectedEnvironment; }
            set { _selectedEnvironment = value; RaisePropertyChangedAuto(); OnSelectedEnvironmentChanged(); InvalidateRelayCommands(); }
        }

        private String _localVersion;
        public String LocalVersion
        {
            get { return _localVersion; }
            set { _localVersion = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _remoteVersion;
        public String RemoteVersion
        {
            get { return _remoteVersion; }
            set { _remoteVersion = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _buidConfig;
        public String BuildConfig
        {
            get { return _buidConfig; }
            set { _buidConfig = value; RaisePropertyChangedAuto(); OnBuildConfigChanged(); InvalidateRelayCommands(); }
        }

        private String _email;
        public String Email
        {
            get { return _email; }
            set { _email = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _password;
        public String Password
        {
            get { return _password; }
            set { _password = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _comments;
        public String Comments
        {
            get { return _comments; }
            set { _comments = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private TangoProgress<double> _progress;
        public TangoProgress<double> Progress
        {
            get { return _progress; }
            set { _progress = value; RaisePropertyChangedAuto(); }
        }


        public RelayCommand PublishCommand { get; set; }

        public MainWindowVM()
        {
            PublishCommand = new RelayCommand(Publish, CanPublish);

            var settings = SettingsManager.Default.GetOrCreate<PublisherSettings>();
            Email = settings.Email;
            Password = settings.Password;
        }

        private bool CanPublish()
        {
            try
            {
                return
                    SelectedEnvironment != null &&
                    Email.IsNotNullOrEmpty() &&
                    Password.IsNotNullOrEmpty() &&
                    Comments.IsNotNullOrEmpty() &&
                    System.Version.Parse(LocalVersion) > System.Version.Parse(RemoteVersion) &&
                    IsFree;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                return false;
            }
        }

        public async void Init()
        {
            try
            {
                IsFree = false;
                UpdateProgress("Retrieving environments...");
                using (HttpClient http = new HttpClient())
                {
                    GatewayClient client = new GatewayClient(ConfigurationManager.AppSettings.Get("GatewayUrl"), http);
                    Environments = (await client.GetEnvironmentsAsync(new EnvironmentsRequest())).Environments.OrderBy(x => x.DisplayIndex).ToList();
                }

                SelectedEnvironment = Environments.SingleOrDefault(x => x.Name == "TEST");

                BuildConfig = "Release";

                ProgressReady();
            }
            catch (Exception ex)
            {
                ShowError($"Error retrieving environments from gateway service.\n{ex.FlattenMessage()}");
            }
            finally
            {
                IsFree = true;
            }
        }

        private void OnBuildConfigChanged()
        {
            UpdateProgress("Searching build path...");

            String path = Path.GetFullPath($@"../../../../Build\FSE\{BuildConfig}");
            if (!Directory.Exists(path))
            {
                ShowError($"Could not locate FSE build folder at '{path}'.");
            }

            _buildFolder = path;

            try
            {
                String appExe = Path.Combine(path, APP_EXE_NAME);
                LocalVersion = FileVersionInfo.GetVersionInfo(appExe).ProductVersion;
                ProgressReady();
            }
            catch (Exception ex)
            {
                ShowError($"Could not determine the local application version.\n{ex.FlattenMessage()}");
            }
        }

        private async Task OnSelectedEnvironmentChanged()
        {
            if (SelectedEnvironment != null)
            {
                try
                {
                    IsFree = false;
                    UpdateProgress("Getting remote version...");
                    _client = new FSEWebClient(SelectedEnvironment.MachineServiceAddress);
                    RemoteVersion = (await _client.GetLatestVersion(new Web.Messages.LatestVersionRequest())).Version;
                    ProgressReady();
                }
                catch (Exception ex)
                {
                    ShowError($"Error retrieving the remote version.\n{ex.FlattenMessage()}");
                }
                finally
                {
                    IsFree = true;
                }
            }
        }

        private async void Publish()
        {
            try
            {
                IsFree = false;
                UpdateProgress("Publishing Tango FSE...");

                var settings = SettingsManager.Default.GetOrCreate<PublisherSettings>();
                settings.Email = Email;
                settings.Password = Password;
                settings.Save();

                UpdateProgress("Validating Tango FSE installer....");

                String projectPath = Path.GetFullPath(@"../../../../Advanced Installer Projects\FSE Installer.aip");

                if (!File.Exists(projectPath))
                {
                    throw new FileNotFoundException($"Could not locate advanced installer project at '{projectPath}'.");
                }

                String installerName = $"Tango FSE v{System.Version.Parse(LocalVersion).ToString(3)}.exe";
                String installerPath = Path.GetFullPath($@"../../../../Build\Installers\FSE\Release\{installerName}");

                if (!Directory.Exists(Path.GetDirectoryName(installerPath)))
                {
                    throw new DirectoryNotFoundException($"Could not locate installer output directory '{Path.GetDirectoryName(installerPath)}'.");
                }

                UpdateProgress("Authenticating with machine service...");
                await _client.Login(new LoginRequest()
                {
                    Email = Email,
                    Password = Password,
                    Version = LocalVersion
                });

                UpdateProgress("Requesting version upload...");
                var uploadResponse = await _client.UploadVersion(new UploadVersionRequest()
                {
                    Comments = Comments,
                    InstallerBlobName = installerName,
                    Version = LocalVersion
                });

                UpdateProgress("Building Tango FSE installer...");

                InstallerBuilder builder = new InstallerBuilder(projectPath);
                await builder.Build(LocalVersion, installerPath);

                if (!File.Exists(installerPath))
                {
                    throw new FileNotFoundException($"Installer build was successful but the output installer could not be located at the specified path '{installerPath}'.");
                }

                UpdateProgress("Uploading Tango FSE installer...");

                using (StorageBlobUploader uploader = new StorageBlobUploader(uploadResponse.InstallerBlobAddress, installerPath))
                {
                    uploader.Progress += (x, e) =>
                    {
                        UpdateProgress("Uploading Tango FSE installer...", false, e.Current, e.Total);
                    };

                    await uploader.Upload();
                }

                UpdateProgress("Finalizing version publishing...");

                await _client.NotifyVersionUploadCompleted(new UploadCompletedRequest()
                {
                    Token = uploadResponse.Token
                });

                UpdateProgress("Validating...");
                await OnSelectedEnvironmentChanged();

                if (LocalVersion != RemoteVersion)
                {
                    throw new InvalidDataException("Publishing completed but the local and remote versions are different?!");
                }

                Process.Start(SelectedEnvironment.MachineServiceAddress + "/fse");

                UpdateProgress("Version published successfully!", false, 100, 100);
                ShowInfo("Tango FSE published successfully!");
            }
            catch (Exception ex)
            {
                ShowError($"Error while trying to publish Tango FSE\n{ex.FlattenMessage()}");
            }
            finally
            {
                IsFree = true;
            }
        }

        private void ShowError(String error)
        {
            UpdateProgress("Error!", false, 0, 100);
            MessageBox.Show(error, "FSE Publisher", MessageBoxButton.OK, MessageBoxImage.Error);
        }

        private void ShowInfo(String message)
        {
            MessageBox.Show(message, "FSE Publisher", MessageBoxButton.OK, MessageBoxImage.Information);
        }

        private void UpdateProgress(String message, bool isIndeterminate = true, double value = 0, double max = 100)
        {
            Progress = new TangoProgress<double>(message, isIndeterminate, value, max);
        }

        private void ProgressReady()
        {
            UpdateProgress("Ready", false, 0, 100);
        }
    }
}