using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using HeuristicLab.Clients.Hive.CloudManager.Azure; using HeuristicLab.Clients.Hive.CloudManager.Model; using HeuristicLab.Core; namespace HeuristicLab.Clients.Hive.CloudManager.Views { public partial class AddAzureServiceDialog : Form { private BindingList subscriptions; private BindingList hostedServices; private BindingList locations; private BindingList affinityGroups; private BackgroundWorker workerUpdate; private BackgroundWorker workerCreate; private bool isInitializing; private bool bwCompleted; private bool closePending; private string certificateFile; private string certificatePassword; public AddAzureServiceDialog(IItemList subs) { InitializeComponent(); isInitializing = true; bwCompleted = true; this.subscriptions = new BindingList(subs); this.hostedServices = new BindingList(); this.locations = new BindingList(); this.affinityGroups = new BindingList(); SetLookupBinding(cmbLocation, locations, "", ""); SetLookupBinding(cmbAffinityGroup, affinityGroups, "Label", "Name"); SetLookupBinding(cmbChooseHostedService, hostedServices, "ServiceName", "ServiceName"); SetLookupBinding(cmbChooseSubscription, subscriptions, "SubscriptionName", "SubscriptionID"); if (!cbNewHostedService.Checked) { SetGroupBoxControlsEnabled(gbNewHostedService, cbNewHostedService.Checked); } certificateFile = string.Empty; certificatePassword = string.Empty; workerUpdate = new BackgroundWorker(); workerUpdate.DoWork += new DoWorkEventHandler(UpdateTask); workerUpdate.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted); workerCreate = new BackgroundWorker(); workerCreate.DoWork += new DoWorkEventHandler(CreateDoploymentTask); workerCreate.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateDeploymentCompleted); isInitializing = false; cmbChooseSubscription_SelectedValueChanged(this, EventArgs.Empty); } protected override void OnFormClosing(FormClosingEventArgs e) { if (!bwCompleted) { SetAllControlsEnabled(this, false); e.Cancel = true; closePending = true; } } private void SetLookupBinding(ListControl toBind, object dataSource, string displayMember, string valueMember) { toBind.DisplayMember = displayMember; toBind.ValueMember = valueMember; toBind.DataSource = dataSource; } private void SetGroupBoxControlsEnabled(GroupBox gb, bool isEnabled) { foreach (Control ctrl in gb.Controls) { ctrl.Enabled = isEnabled; } } private void SetAllControlsEnabled(Form frm, bool isEnabled) { foreach (Control ctrl in frm.Controls) { if (!(ctrl is ProgressBar)) { ctrl.Enabled = isEnabled; } } } private void SetBindingList(ref BindingList bindinglist, List list) { if (list != null) { BindingList newList = new BindingList(list); bindinglist = newList; } } private void UpdateBindingList(BindingList bindinglist, List list) { if (list != null) { bindinglist.Clear(); foreach (T item in list) bindinglist.Add(item); } } private void UpdateSubscriptionItem(BindingList bindinglist, Subscription item) { if (item != null) { foreach (Subscription blItem in bindinglist) if (blItem.Equals(item)) { blItem.Merge(item); } } } private bool ValidateInput() { bool valid = true; // TODO: input validation // see http://stackoverflow.com/questions/769184/winform-ui-validation return valid; } private void cbNewHostedService_CheckedChanged(object sender, EventArgs e) { if (cbNewHostedService.Checked) { Subscription subscription = (Subscription)cmbChooseSubscription.SelectedItem; if (subscription.CurrentHostedServices == subscription.MaxHostedServices) { MessageBox.Show("You have already created the maximum number of hosted services", "Limit Reached", MessageBoxButtons.OK, MessageBoxIcon.Error); cbNewHostedService.Checked = false; } else { SetGroupBoxControlsEnabled(gbNewHostedService, cbNewHostedService.Checked); cmbChooseHostedService.Enabled = false; } } else { // checked == false SetGroupBoxControlsEnabled(gbNewHostedService, false); if (hostedServices.Count == 0) { cbNewHostedService.Checked = true; } } } private void cmbChooseSubscription_SelectedValueChanged(object sender, EventArgs e) { if (!isInitializing) { Subscription item = (Subscription)cmbChooseSubscription.SelectedItem; if (item != null) { bwCompleted = false; progressBar.Visible = true; SetAllControlsEnabled(this, false); workerUpdate.RunWorkerAsync(item); } } } private void btnAddCertificate_Click(object sender, EventArgs e) { using (var form = new AddCertificate()) { form.ShowDialog(); if (!form.ErrorOccured) { certificateFile = form.CertificateFile; certificatePassword = form.CertificatePassword; lblCertificateFile.Text = certificateFile; } } } private void btnCancel_Click(object sender, EventArgs e) { this.Close(); } private void btnOk_Click(object sender, EventArgs e) { if (cmbChooseSubscription.SelectedItem != null) { Subscription sub = (Subscription)cmbChooseSubscription.SelectedItem; if (ValidateInput()) { bool newHostedServiceChecked = cbNewHostedService.Checked; bool regionChecked = rbRegion.Checked; string certFile = certificateFile; string certPw = certificatePassword; int instanceCount = Convert.ToInt32(tbInstanceCount.Text); HostedService hostedService = new HostedService(); hostedService.ServiceName = tbServiceName.Text; HostedServiceProperties properties = new HostedServiceProperties(); if (regionChecked) { properties.AffinityGroup = string.Empty; properties.Location = (string)cmbLocation.SelectedItem; } else { properties.AffinityGroup = ((AffinityGroup)cmbAffinityGroup.SelectedItem).Name; properties.Location = string.Empty; } properties.AffinityGroup = ((AffinityGroup)cmbAffinityGroup.SelectedItem).Name; properties.Label = tbLabel.Text; properties.Location = (string)cmbLocation.SelectedItem; hostedService.HostedServiceProperties = properties; var parameters = Tuple.Create(sub, newHostedServiceChecked, regionChecked, certificateFile, certificatePassword, hostedService, instanceCount); bwCompleted = false; progressBar.Visible = true; SetAllControlsEnabled(this, false); workerCreate.RunWorkerAsync(parameters); } } } private void UpdateTask(object sender, DoWorkEventArgs e) { try { Subscription item = (Subscription)e.Argument; item = CloudManagerClient.Instance.AzureProvider.GetSubscriptionInfo(item.SubscriptionID, item.CertificateThumbprint); this.Invoke((MethodInvoker)delegate { lblCores.Text = item.CurrentCoreCount + " / " + item.MaxCoreCount; }); List services = CloudManagerClient.Instance.AzureProvider.ListHostedServices(item); List locs = CloudManagerClient.Instance.AzureProvider.ListLocations(item); List groups = CloudManagerClient.Instance.AzureProvider.ListAffinityGroups(item); this.Invoke((MethodInvoker)delegate { UpdateSubscriptionItem(subscriptions, item); }); this.Invoke((MethodInvoker)delegate { UpdateBindingList(hostedServices, services); }); this.Invoke((MethodInvoker)delegate { UpdateBindingList(locations, locs); }); this.Invoke((MethodInvoker)delegate { UpdateBindingList(affinityGroups, groups); }); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { SetAllControlsEnabled(this, true); progressBar.Visible = false; bwCompleted = true; if (closePending) { this.Close(); } } private void CreateDoploymentTask(object sender, DoWorkEventArgs e) { bool errorOccured = false; Tuple parameters = (Tuple)e.Argument; Subscription sub = parameters.Item1; bool newHostedServiceChecked = parameters.Item2; bool regionChecked = parameters.Item3; string certFile = parameters.Item4; string certPw = parameters.Item5; HostedService hostedService = parameters.Item6; int instanceCount = parameters.Item7; // STEP 1 - Create Hosted Service try { if (newHostedServiceChecked) { if (regionChecked) { CloudManagerClient.Instance.AzureProvider.CreateHostedService(sub, hostedService.ServiceName, hostedService.HostedServiceProperties.Label, hostedService.HostedServiceProperties.Description, hostedService.HostedServiceProperties.Location); } else { CloudManagerClient.Instance.AzureProvider.CreateHostedService(sub, hostedService.ServiceName, hostedService.HostedServiceProperties.Label, hostedService.HostedServiceProperties.Description, new AffinityGroup() { Name = hostedService.HostedServiceProperties.AffinityGroup }); } } } catch (Exception ex) { errorOccured = true; MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } // STEP 2 - Add Certificate try { if ((!errorOccured) && (certFile != string.Empty)) { CloudManagerClient.Instance.AzureProvider.AddCertificate(sub, hostedService, certFile, certPw); } } catch (Exception ex) { errorOccured = true; MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); if (newHostedServiceChecked) { CloudManagerClient.Instance.AzureProvider.DeleteHostedService(sub, hostedService.ServiceName); } } // STEP 3 - Create Deployment try { if (!errorOccured) { CloudManagerClient.Instance.AzureProvider.CreateDeployment(sub, hostedService.ServiceName, Guid.NewGuid().ToString(), Constants.DeploymentSlotStaging, Constants.DeploymentPackageUrl, Constants.DeploymentConfigurationUrl, Constants.DeploymentLabel, instanceCount); } } catch (Exception ex) { errorOccured = true; MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); if (newHostedServiceChecked) { CloudManagerClient.Instance.AzureProvider.DeleteHostedService(sub, hostedService.ServiceName); } } e.Result = errorOccured; } private void CreateDeploymentCompleted(object sender, RunWorkerCompletedEventArgs e) { SetAllControlsEnabled(this, true); progressBar.Visible = false; bwCompleted = true; bool errorOccured = (bool)e.Result; if (closePending) { this.Close(); } else if (!errorOccured) { this.Close(); } else { this.Show(); } } } }