Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive.CloudManager/3.3/Views/CloudResourcesView.cs @ 7441

Last change on this file since 7441 was 7441, checked in by spimming, 12 years ago

#1680: Implemented Save and Delete in CloudResourcesView and CloudManagerClient

File size: 12.8 KB
Line 
1using System;
2using System.Diagnostics;
3using System.Timers;
4using System.Windows.Forms;
5using HeuristicLab.Clients.Hive.CloudManager.Model;
6using HeuristicLab.Common;
7using HeuristicLab.Core;
8using HeuristicLab.Core.Views;
9using HeuristicLab.MainForm;
10
11namespace HeuristicLab.Clients.Hive.CloudManager.Views {
12  [View("Cloud Resources View")]
13  [Content(typeof(IItemList<Subscription>), IsDefaultView = true)]
14  public partial class CloudResourcesView : ItemView, IDisposable {
15    private System.Timers.Timer timer = new System.Timers.Timer();
16    private int updateInterval = 15000;
17    private DateTime dueTime;
18
19    private const int subscriptionImageIndex = 0;
20    private const int serviceImageIndex = 1;
21    private const int deploymentImageIndex = 2;
22
23    public new IItemList<Subscription> Content {
24      get { return (IItemList<Subscription>)base.Content; }
25      set { base.Content = value; }
26    }
27
28    private IItemList<HostedService> hostedServices;
29    public IItemList<HostedService> HostedServices {
30      get { return hostedServices; }
31      set { hostedServices = value; }
32    }
33
34    public CloudResourcesView() {
35      InitializeComponent();
36
37      treeCloudResources.ImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.NewFolder);
38      treeCloudResources.ImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.NetworkCenterLarge);
39      treeCloudResources.ImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.MonitorLarge);
40
41      HostedServices = CloudManagerClient.Instance.HostedServices;
42      Content = CloudManagerClient.Instance.Subscriptions;
43
44
45      CloudManagerClient.Instance.Refreshing += new EventHandler(Instance_Refreshing);
46      CloudManagerClient.Instance.Refreshed += new EventHandler(Instance_Refreshed);
47
48      timer.AutoReset = true;
49      timer.Interval = 1000;
50      timer.Elapsed += PerformUpdate;
51      timer.Start();
52      dueTime = DateTime.Now.AddMilliseconds(updateInterval);
53    }
54
55    #region Register Content Events
56    protected override void DeregisterContentEvents() {
57      Content.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Subscription>>(Content_ItemsAdded);
58      Content.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Subscription>>(Content_ItemsRemoved);
59      base.DeregisterContentEvents();
60    }
61    protected override void RegisterContentEvents() {
62      base.RegisterContentEvents();
63      Content.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Subscription>>(Content_ItemsAdded);
64      Content.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Subscription>>(Content_ItemsRemoved);
65    }
66    #endregion
67
68    /// <summary>
69    /// Clean up any resources being used.
70    /// </summary>
71    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
72    protected override void Dispose(bool disposing) {
73      if (disposing && (components != null)) {
74        components.Dispose();
75        CloudManagerClient.Instance.Refreshing -= new EventHandler(Instance_Refreshing);
76        CloudManagerClient.Instance.Refreshed -= new EventHandler(Instance_Refreshed);
77        timer.Stop();
78        timer.Dispose();
79        timer = null;
80      }
81      base.Dispose(disposing);
82    }
83
84    protected override void SetEnabledStateOfControls() {
85      base.SetEnabledStateOfControls();
86      if (Content == null || Content.Count == 0) {
87        btnAddSlaveService.Enabled = false;
88        btnDelete.Enabled = false;
89        btnSave.Enabled = false;
90      } else {
91        btnAddSlaveService.Enabled = true;
92        btnDelete.Enabled = true;
93        btnSave.Enabled = true;
94      }
95    }
96
97    protected override void OnContentChanged() {
98      base.OnContentChanged();
99      SetEnabledStateOfControls();
100      if (Content == null) {
101        viewHost.Content = null;
102        treeCloudResources.Nodes.Clear();
103      } else if (treeCloudResources.Nodes.Count == 0) {
104        treeCloudResources.BeginUpdate();
105        //treeCloudResources.Nodes.Clear();
106        foreach (Subscription sub in Content) {
107          TreeNode nodeSub = GetTreeNode(sub, sub.SubscriptionName, subscriptionImageIndex);
108          foreach (HostedService s in HostedServices) {
109            if (s.Subscription.SubscriptionID == sub.SubscriptionID) {
110              TreeNode nodeServ = GetTreeNode(s, s.HostedServiceProperties.Label, serviceImageIndex);
111              foreach (Deployment d in s.Deployments) {
112                TreeNode nodeDepl = GetTreeNode(d, d.Label + " (" + d.DeploymentSlot + ")", deploymentImageIndex);
113                nodeServ.Nodes.Add(nodeDepl);
114              }
115              nodeSub.Nodes.Add(nodeServ);
116            }
117          }
118          treeCloudResources.Nodes.Add(nodeSub);
119        }
120        treeCloudResources.EndUpdate();
121      } else {
122        treeCloudResources.BeginUpdate();
123        TreeNodeCollection tncSubs = treeCloudResources.Nodes;
124
125        // Delete treenodes that have no corresponding data in Content and HosteServices
126        foreach (TreeNode tnSub in tncSubs) {
127          Subscription s = (Subscription)tnSub.Tag;
128          int idx = Content.IndexOf(s);
129          if (idx == -1) {
130            tncSubs.Remove(tnSub);
131          } else {
132            TreeNodeCollection tncHS = tnSub.Nodes;
133            foreach (TreeNode tnHS in tncHS) {
134              HostedService hs = (HostedService)tnHS.Tag;
135              int idxHS = HostedServices.IndexOf(hs);
136              if (idxHS == -1) {
137                tncHS.Remove(tnHS);
138              } else {
139                TreeNodeCollection tncDep = tnHS.Nodes;
140                foreach (TreeNode tnDep in tncDep) {
141                  Deployment dep = (Deployment)tnDep.Tag;
142                  HostedService hsDep = HostedServices[idxHS];
143                  int idxDep = hsDep.Deployments.IndexOf(dep);
144                  if (idxDep == -1) {
145                    tncDep.Remove(tnDep);
146                  }
147                }
148              }
149            }
150          }
151        }
152
153        // Add missing treenodes
154        foreach (Subscription sub in Content) {
155          bool foundSub = false;
156          TreeNode foundSubNode = null;
157          foreach (TreeNode tnSub in treeCloudResources.Nodes) {
158            if (((Subscription)tnSub.Tag).Equals(sub)) {
159              foundSub = true;
160              foundSubNode = tnSub;
161            }
162          }
163          TreeNode nodeSub;
164          if (!foundSub) {
165            nodeSub = GetTreeNode(sub, sub.SubscriptionName, subscriptionImageIndex);
166            treeCloudResources.Nodes.Add(nodeSub);
167          } else {
168            nodeSub = foundSubNode;
169          }
170          foreach (HostedService s in HostedServices) {
171            if (s.Subscription.SubscriptionID == sub.SubscriptionID) {
172              bool foundHS = false;
173              TreeNode foundHSNode = null;
174              foreach (TreeNode tnHS in nodeSub.Nodes) {
175                if (((HostedService)tnHS.Tag).Equals(s)) {
176                  foundHS = true;
177                  foundHSNode = tnHS;
178                }
179              }
180              TreeNode nodeServ;
181              if (!foundHS) {
182                nodeServ = GetTreeNode(s, s.HostedServiceProperties.Label, serviceImageIndex);
183                nodeSub.Nodes.Add(nodeServ);
184              } else {
185                nodeServ = foundHSNode;
186              }
187              foreach (Deployment d in s.Deployments) {
188                bool foundDep = false;
189                TreeNode foundDepNode;
190                foreach (TreeNode tnDep in nodeServ.Nodes) {
191                  if (((Deployment)tnDep.Tag).Equals(d)) {
192                    foundDep = true;
193                    foundDepNode = tnDep;
194                  }
195                }
196                TreeNode nodeDepl;
197                if (!foundDep) {
198                  nodeDepl = GetTreeNode(d, d.Label + " (" + d.DeploymentSlot + ")", deploymentImageIndex);
199                  nodeServ.Nodes.Add(nodeDepl);
200                } else {
201                  // nothing to do
202                }
203              }
204            }
205          }
206        }
207        // ----------------------------
208        treeCloudResources.EndUpdate();
209      }
210    }
211
212    private TreeNode GetTreeNode(Object tag, string text, int imageIndex) {
213      TreeNode node = new TreeNode();
214      node.Tag = tag;
215      node.Text = text;
216      node.ImageIndex = imageIndex;
217      node.SelectedImageIndex = node.ImageIndex;
218      return node;
219    }
220
221    private void Instance_Refreshing(object sender, EventArgs e) {
222      Debug.WriteLine("Instance_Refreshing");
223      //if (treeCloudResources.InvokeRequired) {
224      //  treeCloudResources.Invoke((MethodInvoker)delegate { OnContentChanged(); });
225      //} else {
226      //  OnContentChanged();
227      //}
228    }
229
230    private void Instance_Refreshed(object sender, EventArgs e) {
231      Debug.WriteLine("Instance_Refreshed");
232      if (treeCloudResources.InvokeRequired) {
233        treeCloudResources.Invoke((MethodInvoker)delegate { OnContentChanged(); });
234      } else {
235        OnContentChanged();
236      }
237    }
238
239    private void Content_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<Subscription>> e) {
240      OnContentChanged();
241    }
242
243    private void Content_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<Subscription>> e) {
244      OnContentChanged();
245    }
246
247    private void PerformUpdate(object sender, ElapsedEventArgs e) {
248      TimeSpan timeToRefresh = dueTime - DateTime.Now;
249
250      if (timeToRefresh.Seconds >= 0) {
251        this.Invoke((MethodInvoker)delegate { lblRefresh.Text = "Done. " + timeToRefresh.Seconds + "s to next refresh."; });
252      } else {
253        timer.Stop();
254        this.Invoke((MethodInvoker)delegate { lblRefresh.Text = "Refreshing data ..."; });
255
256        // statistics
257        Debug.WriteLine("perform update");
258        CloudManagerClient.Instance.Refresh();
259
260        dueTime = DateTime.Now.AddMilliseconds(updateInterval);
261        if (timer != null) {
262          timer.Start();
263        }
264      }
265    }
266
267    private void btnAddSubscription_Click(object sender, EventArgs e) {
268      using (var form = new AddSubscriptionDialog()) {
269        form.ShowDialog();
270        if (!form.ErrorOccured) {
271          if (form.Subscription != null) {
272            Subscription sub = form.Subscription;
273            CloudManagerClient.Instance.Add(sub);
274          }
275        }
276      }
277    }
278
279    private void btnAddSlaveService_Click(object sender, EventArgs e) {
280      // When refreshing subscriptions in the dialog,
281      // discoverservices and safetoconfig properties are always set to false
282      // -> work on deep copy
283      Cloner cloner = new Cloner();
284      IItemList<Subscription> subscriptions = cloner.Clone(Content);
285      using (var form = new AddAzureServiceDialog(subscriptions)) {
286        form.ShowDialog();
287
288      }
289    }
290
291    private void treeCloudResources_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
292      viewHost.Content = (IContent)e.Node.Tag;
293    }
294
295    private void btnSave_Click(object sender, EventArgs e) {
296      if (treeCloudResources.SelectedNode != null) {
297        TreeNode tn = treeCloudResources.SelectedNode;
298        TreeNode tnParent = tn.Parent;
299        Object obj = tn.Tag;
300        Object objParent = tnParent.Tag;
301        if (obj is Subscription) {
302          // CloudManagerClient.Instance.Save((Subscription)obj);
303        } else if (obj is HostedService) {
304          // nothing to do so far
305        } else if (obj is Deployment && objParent is HostedService) {
306          HostedService hs = (HostedService)objParent;
307          Deployment dep = (Deployment)obj;
308          //call async
309          CloudManagerClient.Instance.ChangeIntances(dep, hs);
310        }
311      }
312    }
313
314    private void btnDelete_Click(object sender, EventArgs e) {
315      if (treeCloudResources.SelectedNode != null) {
316        TreeNode tn = treeCloudResources.SelectedNode;
317        TreeNode tnParent = tn.Parent;
318        Object obj = tn.Tag;
319        Object objParent = null;
320        if (tnParent != null) {
321          objParent = tnParent.Tag;
322        }
323        viewHost.Content = null;
324        if (obj is Subscription) {
325          CloudManagerClient.Instance.Delete((Subscription)obj);
326        } else if (obj is HostedService) {
327          // nothing to do so far
328        } else if (obj is Deployment && objParent is HostedService) {
329          HostedService hs = (HostedService)objParent;
330          Deployment dep = (Deployment)obj;
331          //call async
332          CloudManagerClient.Instance.Delete(dep, hs);
333        }
334      }
335    }
336  }
337}
Note: See TracBrowser for help on using the repository browser.