root / Classes / AddLoadBalancerViewController.m @ 9fee07a6
History | View | Annotate | Download (9.1 kB)
1 | 700184fb | Miltiadis Vasilakis | // |
---|---|---|---|
2 | 700184fb | Miltiadis Vasilakis | // AddLoadBalancerNameViewController.m |
3 | 700184fb | Miltiadis Vasilakis | // OpenStack |
4 | 700184fb | Miltiadis Vasilakis | // |
5 | 700184fb | Miltiadis Vasilakis | // Created by Michael Mayo on 4/8/11. |
6 | 700184fb | Miltiadis Vasilakis | // Copyright 2011 __MyCompanyName__. All rights reserved. |
7 | 700184fb | Miltiadis Vasilakis | // |
8 | 700184fb | Miltiadis Vasilakis | |
9 | 700184fb | Miltiadis Vasilakis | #import "AddLoadBalancerViewController.h" |
10 | 700184fb | Miltiadis Vasilakis | #import "OpenStackAccount.h" |
11 | 700184fb | Miltiadis Vasilakis | #import "UIViewController+Conveniences.h" |
12 | 700184fb | Miltiadis Vasilakis | #import "RSTextFieldCell.h" |
13 | 700184fb | Miltiadis Vasilakis | #import "UIColor+MoreColors.h" |
14 | 700184fb | Miltiadis Vasilakis | #import "AddLoadBalancerAlgorithmViewController.h" |
15 | 700184fb | Miltiadis Vasilakis | #import "LoadBalancer.h" |
16 | 700184fb | Miltiadis Vasilakis | #import "LBProtocolViewController.h" |
17 | 700184fb | Miltiadis Vasilakis | #import "LBVirtualIPTypeViewController.h" |
18 | 700184fb | Miltiadis Vasilakis | #import "AddLoadBalancerRegionViewController.h" |
19 | 700184fb | Miltiadis Vasilakis | #import "LBAlgorithmViewController.h" |
20 | 700184fb | Miltiadis Vasilakis | #import "Server.h" |
21 | 700184fb | Miltiadis Vasilakis | #import "Flavor.h" |
22 | 700184fb | Miltiadis Vasilakis | #import "Image.h" |
23 | 700184fb | Miltiadis Vasilakis | #import "LoadBalancerNode.h" |
24 | 700184fb | Miltiadis Vasilakis | #import "LBNodesViewController.h" |
25 | 700184fb | Miltiadis Vasilakis | #import "LoadBalancerProtocol.h" |
26 | 700184fb | Miltiadis Vasilakis | #import "AccountManager.h" |
27 | 700184fb | Miltiadis Vasilakis | #import "APICallback.h" |
28 | 700184fb | Miltiadis Vasilakis | |
29 | 700184fb | Miltiadis Vasilakis | #define kDetailsSection 0 |
30 | 700184fb | Miltiadis Vasilakis | #define kNodesSection 1 |
31 | 700184fb | Miltiadis Vasilakis | |
32 | 700184fb | Miltiadis Vasilakis | #define kName 0 |
33 | 700184fb | Miltiadis Vasilakis | #define kProtocol 1 |
34 | 700184fb | Miltiadis Vasilakis | #define kVirtualIPType 2 |
35 | 700184fb | Miltiadis Vasilakis | #define kRegion 3 |
36 | 700184fb | Miltiadis Vasilakis | #define kAlgorithm 4 |
37 | 700184fb | Miltiadis Vasilakis | |
38 | 700184fb | Miltiadis Vasilakis | @implementation AddLoadBalancerViewController |
39 | 700184fb | Miltiadis Vasilakis | |
40 | 700184fb | Miltiadis Vasilakis | @synthesize account, loadBalancer; |
41 | 700184fb | Miltiadis Vasilakis | |
42 | 700184fb | Miltiadis Vasilakis | - (id)initWithAccount:(OpenStackAccount *)a { |
43 | 700184fb | Miltiadis Vasilakis | self = [super initWithNibName:@"AddLoadBalancerNameViewController" bundle:nil]; |
44 | 700184fb | Miltiadis Vasilakis | if (self) { |
45 | 700184fb | Miltiadis Vasilakis | self.account = a; |
46 | 700184fb | Miltiadis Vasilakis | self.loadBalancer = [[[LoadBalancer alloc] init] autorelease]; |
47 | 700184fb | Miltiadis Vasilakis | self.loadBalancer.virtualIPType = @"Public"; |
48 | 700184fb | Miltiadis Vasilakis | self.loadBalancer.region = [self.account.loadBalancerRegions objectAtIndex:0]; |
49 | 700184fb | Miltiadis Vasilakis | self.loadBalancer.algorithm = @"RANDOM"; |
50 | 700184fb | Miltiadis Vasilakis | self.loadBalancer.protocol = [[[LoadBalancerProtocol alloc] init] autorelease]; |
51 | 700184fb | Miltiadis Vasilakis | self.loadBalancer.protocol.name = @"HTTP"; |
52 | 700184fb | Miltiadis Vasilakis | self.loadBalancer.protocol.port = 80; |
53 | 700184fb | Miltiadis Vasilakis | } |
54 | 700184fb | Miltiadis Vasilakis | return self; |
55 | 700184fb | Miltiadis Vasilakis | } |
56 | 700184fb | Miltiadis Vasilakis | |
57 | 700184fb | Miltiadis Vasilakis | - (void)dealloc { |
58 | 700184fb | Miltiadis Vasilakis | [account release]; |
59 | 700184fb | Miltiadis Vasilakis | [loadBalancer release]; |
60 | 700184fb | Miltiadis Vasilakis | [algorithmNames release]; |
61 | 700184fb | Miltiadis Vasilakis | [super dealloc]; |
62 | 700184fb | Miltiadis Vasilakis | } |
63 | 700184fb | Miltiadis Vasilakis | |
64 | 700184fb | Miltiadis Vasilakis | #pragma mark - View lifecycle |
65 | 700184fb | Miltiadis Vasilakis | |
66 | 700184fb | Miltiadis Vasilakis | - (void)viewDidLoad { |
67 | 700184fb | Miltiadis Vasilakis | [super viewDidLoad]; |
68 | 700184fb | Miltiadis Vasilakis | self.navigationItem.title = @"Add Load Balancer"; |
69 | 700184fb | Miltiadis Vasilakis | [self addSaveButton]; |
70 | 700184fb | Miltiadis Vasilakis | [self addCancelButton]; |
71 | 700184fb | Miltiadis Vasilakis | |
72 | 700184fb | Miltiadis Vasilakis | algorithmNames = [[NSDictionary alloc] initWithObjectsAndKeys: |
73 | 700184fb | Miltiadis Vasilakis | @"Random", @"RANDOM", |
74 | 700184fb | Miltiadis Vasilakis | @"Round Robin", @"ROUND_ROBIN", |
75 | 700184fb | Miltiadis Vasilakis | @"Weighted Round Robin", @"WEIGHTED_ROUND_ROBIN", |
76 | 700184fb | Miltiadis Vasilakis | @"Least Connections", @"LEAST_CONNECTIONS", |
77 | 700184fb | Miltiadis Vasilakis | @"Weighted Least Connections", @"WEIGHTED_LEAST_CONNECTIONS", |
78 | 700184fb | Miltiadis Vasilakis | nil]; |
79 | 700184fb | Miltiadis Vasilakis | |
80 | 700184fb | Miltiadis Vasilakis | } |
81 | 700184fb | Miltiadis Vasilakis | |
82 | 700184fb | Miltiadis Vasilakis | - (void)viewDidUnload { |
83 | 700184fb | Miltiadis Vasilakis | [super viewDidUnload]; |
84 | 700184fb | Miltiadis Vasilakis | // Release any retained subviews of the main view. |
85 | 700184fb | Miltiadis Vasilakis | // e.g. self.myOutlet = nil; |
86 | 700184fb | Miltiadis Vasilakis | } |
87 | 700184fb | Miltiadis Vasilakis | |
88 | 700184fb | Miltiadis Vasilakis | - (void)viewWillAppear:(BOOL)animated { |
89 | 700184fb | Miltiadis Vasilakis | [super viewWillAppear:animated]; |
90 | 700184fb | Miltiadis Vasilakis | [self.tableView reloadData]; |
91 | 700184fb | Miltiadis Vasilakis | } |
92 | 700184fb | Miltiadis Vasilakis | |
93 | 700184fb | Miltiadis Vasilakis | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { |
94 | 700184fb | Miltiadis Vasilakis | return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait); |
95 | 700184fb | Miltiadis Vasilakis | } |
96 | 700184fb | Miltiadis Vasilakis | |
97 | 700184fb | Miltiadis Vasilakis | #pragma mark - Table view data source |
98 | 700184fb | Miltiadis Vasilakis | |
99 | 700184fb | Miltiadis Vasilakis | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
100 | 700184fb | Miltiadis Vasilakis | return 2; |
101 | 700184fb | Miltiadis Vasilakis | } |
102 | 700184fb | Miltiadis Vasilakis | |
103 | 700184fb | Miltiadis Vasilakis | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
104 | 700184fb | Miltiadis Vasilakis | if (section == kDetailsSection) { |
105 | 700184fb | Miltiadis Vasilakis | return 5; |
106 | 700184fb | Miltiadis Vasilakis | } else { |
107 | 700184fb | Miltiadis Vasilakis | return 1; |
108 | 700184fb | Miltiadis Vasilakis | } |
109 | 700184fb | Miltiadis Vasilakis | } |
110 | 700184fb | Miltiadis Vasilakis | |
111 | 700184fb | Miltiadis Vasilakis | - (UITableViewCell *)nameCell:(UITableView *)tableView { |
112 | 700184fb | Miltiadis Vasilakis | static NSString *CellIdentifier = @"NameCell"; |
113 | 700184fb | Miltiadis Vasilakis | |
114 | 700184fb | Miltiadis Vasilakis | RSTextFieldCell *cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
115 | 700184fb | Miltiadis Vasilakis | if (cell == nil) { |
116 | 700184fb | Miltiadis Vasilakis | cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; |
117 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Name"; |
118 | 700184fb | Miltiadis Vasilakis | cell.textField.delegate = self; |
119 | 700184fb | Miltiadis Vasilakis | nameTextField = cell.textField; |
120 | 700184fb | Miltiadis Vasilakis | } |
121 | 700184fb | Miltiadis Vasilakis | return cell; |
122 | 700184fb | Miltiadis Vasilakis | } |
123 | 700184fb | Miltiadis Vasilakis | |
124 | 700184fb | Miltiadis Vasilakis | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
125 | 700184fb | Miltiadis Vasilakis | if (indexPath.section == kDetailsSection && indexPath.row == kName) { |
126 | 700184fb | Miltiadis Vasilakis | return [self nameCell:tableView]; |
127 | 700184fb | Miltiadis Vasilakis | } else if (indexPath.section == kDetailsSection) { |
128 | 700184fb | Miltiadis Vasilakis | static NSString *CellIdentifier = @"Cell"; |
129 | 700184fb | Miltiadis Vasilakis | |
130 | 700184fb | Miltiadis Vasilakis | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
131 | 700184fb | Miltiadis Vasilakis | if (cell == nil) { |
132 | 700184fb | Miltiadis Vasilakis | cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; |
133 | 700184fb | Miltiadis Vasilakis | cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
134 | 700184fb | Miltiadis Vasilakis | } |
135 | 700184fb | Miltiadis Vasilakis | |
136 | 700184fb | Miltiadis Vasilakis | switch (indexPath.row) { |
137 | 700184fb | Miltiadis Vasilakis | case kProtocol: |
138 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Protocol"; |
139 | 700184fb | Miltiadis Vasilakis | cell.detailTextLabel.text = [NSString stringWithFormat:@"%@:%i", self.loadBalancer.protocol.name, self.loadBalancer.protocol.port]; |
140 | 700184fb | Miltiadis Vasilakis | break; |
141 | 700184fb | Miltiadis Vasilakis | case kVirtualIPType: |
142 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Virtual IP Type"; |
143 | 700184fb | Miltiadis Vasilakis | cell.detailTextLabel.text = self.loadBalancer.virtualIPType; |
144 | 700184fb | Miltiadis Vasilakis | break; |
145 | 700184fb | Miltiadis Vasilakis | case kRegion: |
146 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Region"; |
147 | 700184fb | Miltiadis Vasilakis | cell.detailTextLabel.text = self.loadBalancer.region; |
148 | 700184fb | Miltiadis Vasilakis | break; |
149 | 700184fb | Miltiadis Vasilakis | case kAlgorithm: |
150 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Algorithm"; |
151 | 700184fb | Miltiadis Vasilakis | cell.detailTextLabel.text = [algorithmNames objectForKey:self.loadBalancer.algorithm]; |
152 | 700184fb | Miltiadis Vasilakis | break; |
153 | 700184fb | Miltiadis Vasilakis | default: |
154 | 700184fb | Miltiadis Vasilakis | break; |
155 | 700184fb | Miltiadis Vasilakis | } |
156 | 700184fb | Miltiadis Vasilakis | |
157 | 700184fb | Miltiadis Vasilakis | |
158 | 700184fb | Miltiadis Vasilakis | return cell; |
159 | 700184fb | Miltiadis Vasilakis | } else { |
160 | 700184fb | Miltiadis Vasilakis | static NSString *CellIdentifier = @"NodeCell"; |
161 | 700184fb | Miltiadis Vasilakis | |
162 | 700184fb | Miltiadis Vasilakis | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
163 | 700184fb | Miltiadis Vasilakis | if (cell == nil) { |
164 | 700184fb | Miltiadis Vasilakis | cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; |
165 | 700184fb | Miltiadis Vasilakis | cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
166 | 700184fb | Miltiadis Vasilakis | } |
167 | 700184fb | Miltiadis Vasilakis | |
168 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Nodes"; |
169 | 700184fb | Miltiadis Vasilakis | |
170 | 700184fb | Miltiadis Vasilakis | if ([self.loadBalancer.nodes count] == 1) { |
171 | 700184fb | Miltiadis Vasilakis | cell.detailTextLabel.text = @"1 Node"; |
172 | 700184fb | Miltiadis Vasilakis | } else { |
173 | 700184fb | Miltiadis Vasilakis | cell.detailTextLabel.text = [NSString stringWithFormat:@"%i Nodes", [self.loadBalancer.nodes count]]; |
174 | 700184fb | Miltiadis Vasilakis | } |
175 | 700184fb | Miltiadis Vasilakis | |
176 | 700184fb | Miltiadis Vasilakis | return cell; |
177 | 700184fb | Miltiadis Vasilakis | } |
178 | 700184fb | Miltiadis Vasilakis | } |
179 | 700184fb | Miltiadis Vasilakis | |
180 | 700184fb | Miltiadis Vasilakis | #pragma mark - Table view delegate |
181 | 700184fb | Miltiadis Vasilakis | |
182 | 700184fb | Miltiadis Vasilakis | - (void)nextButtonPressed:(id)sender { |
183 | 700184fb | Miltiadis Vasilakis | AddLoadBalancerAlgorithmViewController *vc = [[AddLoadBalancerAlgorithmViewController alloc] initWithAccount:self.account]; |
184 | 700184fb | Miltiadis Vasilakis | [self.navigationController pushViewController:vc animated:YES]; |
185 | 700184fb | Miltiadis Vasilakis | [vc release]; |
186 | 700184fb | Miltiadis Vasilakis | } |
187 | 700184fb | Miltiadis Vasilakis | |
188 | 700184fb | Miltiadis Vasilakis | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
189 | 700184fb | Miltiadis Vasilakis | if (indexPath.section == kNodesSection) { |
190 | 700184fb | Miltiadis Vasilakis | LBNodesViewController *vc = [[LBNodesViewController alloc] initWithNibName:@"LBNodesViewController" bundle:nil]; |
191 | 700184fb | Miltiadis Vasilakis | vc.isNewLoadBalancer = YES; |
192 | 700184fb | Miltiadis Vasilakis | vc.account = self.account; |
193 | 700184fb | Miltiadis Vasilakis | vc.loadBalancer = self.loadBalancer; |
194 | 700184fb | Miltiadis Vasilakis | [self.navigationController pushViewController:vc animated:YES]; |
195 | 700184fb | Miltiadis Vasilakis | [vc release]; |
196 | 700184fb | Miltiadis Vasilakis | } else if (indexPath.row == kProtocol) { |
197 | 700184fb | Miltiadis Vasilakis | LBProtocolViewController *vc = [[LBProtocolViewController alloc] initWithAccount:self.account loadBalancer:self.loadBalancer]; |
198 | 700184fb | Miltiadis Vasilakis | [self.navigationController pushViewController:vc animated:YES]; |
199 | 700184fb | Miltiadis Vasilakis | [vc release]; |
200 | 700184fb | Miltiadis Vasilakis | } else if (indexPath.row == kVirtualIPType) { |
201 | 700184fb | Miltiadis Vasilakis | LBVirtualIPTypeViewController *vc = [[LBVirtualIPTypeViewController alloc] initWithAccount:self.account loadBalancer:self.loadBalancer]; |
202 | 700184fb | Miltiadis Vasilakis | [self.navigationController pushViewController:vc animated:YES]; |
203 | 700184fb | Miltiadis Vasilakis | [vc release]; |
204 | 700184fb | Miltiadis Vasilakis | } else if (indexPath.row == kRegion) { |
205 | 700184fb | Miltiadis Vasilakis | AddLoadBalancerRegionViewController *vc = [[AddLoadBalancerRegionViewController alloc] initWithAccount:self.account]; |
206 | 700184fb | Miltiadis Vasilakis | vc.loadBalancer = self.loadBalancer; |
207 | 700184fb | Miltiadis Vasilakis | [self.navigationController pushViewController:vc animated:YES]; |
208 | 700184fb | Miltiadis Vasilakis | [vc release]; |
209 | 700184fb | Miltiadis Vasilakis | } else if (indexPath.row == kAlgorithm) { |
210 | 700184fb | Miltiadis Vasilakis | LBAlgorithmViewController *vc = [[LBAlgorithmViewController alloc] initWithLoadBalancer:self.loadBalancer]; |
211 | 700184fb | Miltiadis Vasilakis | [self.navigationController pushViewController:vc animated:YES]; |
212 | 700184fb | Miltiadis Vasilakis | [vc release]; |
213 | 700184fb | Miltiadis Vasilakis | } |
214 | 700184fb | Miltiadis Vasilakis | } |
215 | 700184fb | Miltiadis Vasilakis | |
216 | 700184fb | Miltiadis Vasilakis | #pragma mark - Text field delegate |
217 | 700184fb | Miltiadis Vasilakis | |
218 | 700184fb | Miltiadis Vasilakis | - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { |
219 | 700184fb | Miltiadis Vasilakis | self.loadBalancer.name = [textField.text stringByReplacingCharactersInRange:range withString:string]; |
220 | 700184fb | Miltiadis Vasilakis | return YES; |
221 | 700184fb | Miltiadis Vasilakis | } |
222 | 700184fb | Miltiadis Vasilakis | |
223 | 700184fb | Miltiadis Vasilakis | - (BOOL)textFieldShouldReturn:(UITextField *)textField { |
224 | 700184fb | Miltiadis Vasilakis | [textField resignFirstResponder]; |
225 | 700184fb | Miltiadis Vasilakis | return NO; |
226 | 700184fb | Miltiadis Vasilakis | } |
227 | 700184fb | Miltiadis Vasilakis | |
228 | 700184fb | Miltiadis Vasilakis | #pragma mark - Button Handlers |
229 | 700184fb | Miltiadis Vasilakis | |
230 | 700184fb | Miltiadis Vasilakis | - (void)saveLoadBalancer { |
231 | 700184fb | Miltiadis Vasilakis | // TODO: show "saving" spinner and refresh list when dismissing |
232 | 700184fb | Miltiadis Vasilakis | [[self.account.manager createLoadBalancer:self.loadBalancer] success:^(OpenStackRequest *request) { |
233 | 700184fb | Miltiadis Vasilakis | [self dismissModalViewControllerAnimated:YES]; |
234 | 700184fb | Miltiadis Vasilakis | } failure:^(OpenStackRequest *request) { |
235 | 700184fb | Miltiadis Vasilakis | [self alert:@"There was a problem creating the load balancer." request:request]; |
236 | 700184fb | Miltiadis Vasilakis | }]; |
237 | 700184fb | Miltiadis Vasilakis | } |
238 | 700184fb | Miltiadis Vasilakis | |
239 | 700184fb | Miltiadis Vasilakis | - (void)saveButtonPressed:(id)sender { |
240 | 700184fb | Miltiadis Vasilakis | if (self.loadBalancer.name && ![@"" isEqualToString:self.loadBalancer.name]) { |
241 | 700184fb | Miltiadis Vasilakis | if (self.loadBalancer.nodes && [self.loadBalancer.nodes count] > 0) { |
242 | 700184fb | Miltiadis Vasilakis | [self saveLoadBalancer]; |
243 | 700184fb | Miltiadis Vasilakis | } else { |
244 | 700184fb | Miltiadis Vasilakis | [self alert:nil message:@"Please add at least one node."]; |
245 | 700184fb | Miltiadis Vasilakis | } |
246 | 700184fb | Miltiadis Vasilakis | } else { |
247 | 700184fb | Miltiadis Vasilakis | [self alert:nil message:@"Please enter a name."]; |
248 | 700184fb | Miltiadis Vasilakis | [nameTextField becomeFirstResponder]; |
249 | 700184fb | Miltiadis Vasilakis | } |
250 | 700184fb | Miltiadis Vasilakis | |
251 | 700184fb | Miltiadis Vasilakis | |
252 | 700184fb | Miltiadis Vasilakis | } |
253 | 700184fb | Miltiadis Vasilakis | |
254 | 700184fb | Miltiadis Vasilakis | @end |