root / Classes / AddLoadBalancerAlgorithmViewController.m @ 7db1712d
History | View | Annotate | Download (9 kB)
1 | 700184fb | Miltiadis Vasilakis | // |
---|---|---|---|
2 | 700184fb | Miltiadis Vasilakis | // AddLoadBalancerAlgorithmViewController.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 "AddLoadBalancerAlgorithmViewController.h" |
10 | 700184fb | Miltiadis Vasilakis | #import "OpenStackAccount.h" |
11 | 700184fb | Miltiadis Vasilakis | #import "UIViewController+Conveniences.h" |
12 | 700184fb | Miltiadis Vasilakis | #import <QuartzCore/QuartzCore.h> |
13 | 700184fb | Miltiadis Vasilakis | #import "LoadBalancer.h" |
14 | 700184fb | Miltiadis Vasilakis | |
15 | 700184fb | Miltiadis Vasilakis | #define kRandom 0 |
16 | 700184fb | Miltiadis Vasilakis | #define kRoundRobin 1 |
17 | 700184fb | Miltiadis Vasilakis | #define kWeightedRoundRobin 2 |
18 | 700184fb | Miltiadis Vasilakis | #define kLeastConnections 3 |
19 | 700184fb | Miltiadis Vasilakis | #define kWeightedLeastConnections 4 |
20 | 700184fb | Miltiadis Vasilakis | |
21 | 700184fb | Miltiadis Vasilakis | #define kNodes 5 |
22 | 700184fb | Miltiadis Vasilakis | #define kAnimationTime 0.5 |
23 | 700184fb | Miltiadis Vasilakis | |
24 | 700184fb | Miltiadis Vasilakis | |
25 | 700184fb | Miltiadis Vasilakis | @implementation AddLoadBalancerAlgorithmViewController |
26 | 700184fb | Miltiadis Vasilakis | |
27 | 700184fb | Miltiadis Vasilakis | @synthesize account, loadBalancer, tableView, pickerView; |
28 | 700184fb | Miltiadis Vasilakis | |
29 | 700184fb | Miltiadis Vasilakis | - (id)initWithAccount:(OpenStackAccount *)a { |
30 | 700184fb | Miltiadis Vasilakis | self = [super initWithNibName:@"AddLoadBalancerAlgorithmViewController" bundle:nil]; |
31 | 700184fb | Miltiadis Vasilakis | if (self) { |
32 | 700184fb | Miltiadis Vasilakis | self.account = a; |
33 | 700184fb | Miltiadis Vasilakis | } |
34 | 700184fb | Miltiadis Vasilakis | return self; |
35 | 700184fb | Miltiadis Vasilakis | } |
36 | 700184fb | Miltiadis Vasilakis | |
37 | 700184fb | Miltiadis Vasilakis | - (void)dealloc { |
38 | 700184fb | Miltiadis Vasilakis | [account release]; |
39 | 700184fb | Miltiadis Vasilakis | [loadBalancer release]; |
40 | 700184fb | Miltiadis Vasilakis | [tableView release]; |
41 | 700184fb | Miltiadis Vasilakis | [pickerView release]; |
42 | 700184fb | Miltiadis Vasilakis | [loadBalancerIcon release]; |
43 | 700184fb | Miltiadis Vasilakis | [serverIcons release]; |
44 | 700184fb | Miltiadis Vasilakis | [dots release]; |
45 | 700184fb | Miltiadis Vasilakis | [super dealloc]; |
46 | 700184fb | Miltiadis Vasilakis | } |
47 | 700184fb | Miltiadis Vasilakis | |
48 | 700184fb | Miltiadis Vasilakis | #pragma mark - View lifecycle |
49 | 700184fb | Miltiadis Vasilakis | |
50 | 700184fb | Miltiadis Vasilakis | - (void)viewDidLoad { |
51 | 700184fb | Miltiadis Vasilakis | [super viewDidLoad]; |
52 | 700184fb | Miltiadis Vasilakis | self.navigationItem.title = @"Algorithm"; |
53 | 700184fb | Miltiadis Vasilakis | } |
54 | 700184fb | Miltiadis Vasilakis | |
55 | 700184fb | Miltiadis Vasilakis | #pragma mark - Table view data source |
56 | 700184fb | Miltiadis Vasilakis | |
57 | 700184fb | Miltiadis Vasilakis | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
58 | 700184fb | Miltiadis Vasilakis | return 1; |
59 | 700184fb | Miltiadis Vasilakis | } |
60 | 700184fb | Miltiadis Vasilakis | |
61 | 700184fb | Miltiadis Vasilakis | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
62 | 700184fb | Miltiadis Vasilakis | return 1; |
63 | 700184fb | Miltiadis Vasilakis | } |
64 | 700184fb | Miltiadis Vasilakis | |
65 | 700184fb | Miltiadis Vasilakis | - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { |
66 | 700184fb | Miltiadis Vasilakis | switch ([self.pickerView selectedRowInComponent:0]) { |
67 | 700184fb | Miltiadis Vasilakis | case kRandom: |
68 | 700184fb | Miltiadis Vasilakis | return @"Directs traffic to a randomly selected node."; |
69 | 700184fb | Miltiadis Vasilakis | case kRoundRobin: |
70 | 700184fb | Miltiadis Vasilakis | return @"Directs traffic in a circular pattern to each node of a load balancer in succession."; |
71 | 700184fb | Miltiadis Vasilakis | case kWeightedRoundRobin: |
72 | 700184fb | Miltiadis Vasilakis | return @"Directs traffic in a circular pattern to each node of a load balancer in succession with a larger proportion of requests being serviced by nodes with a greater weight."; |
73 | 700184fb | Miltiadis Vasilakis | case kLeastConnections: |
74 | 700184fb | Miltiadis Vasilakis | return @"Directs traffic to the node with the fewest open connections to the load balancer."; |
75 | 700184fb | Miltiadis Vasilakis | case kWeightedLeastConnections: |
76 | 700184fb | Miltiadis Vasilakis | return @"Directs traffic to the node with the fewest open connections between the load balancer. Nodes with a larger weight will service more connections at any one time."; |
77 | 700184fb | Miltiadis Vasilakis | default: |
78 | 700184fb | Miltiadis Vasilakis | return @""; |
79 | 700184fb | Miltiadis Vasilakis | } |
80 | 700184fb | Miltiadis Vasilakis | } |
81 | 700184fb | Miltiadis Vasilakis | |
82 | 700184fb | Miltiadis Vasilakis | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { |
83 | 700184fb | Miltiadis Vasilakis | return 132; |
84 | 700184fb | Miltiadis Vasilakis | } |
85 | 700184fb | Miltiadis Vasilakis | |
86 | 700184fb | Miltiadis Vasilakis | - (void)animateDot:(NSInteger)dotIndex toServer:(NSInteger)serverIndex { |
87 | 700184fb | Miltiadis Vasilakis | UIView *dot = [dots objectAtIndex:dotIndex]; |
88 | 700184fb | Miltiadis Vasilakis | dot.frame = CGRectMake(10, 30, 6, 6); |
89 | 700184fb | Miltiadis Vasilakis | dot.alpha = 0; |
90 | 700184fb | Miltiadis Vasilakis | [dot setNeedsDisplay]; |
91 | 700184fb | Miltiadis Vasilakis | |
92 | 700184fb | Miltiadis Vasilakis | [UIView animateWithDuration:kAnimationTime delay:dotIndex * kAnimationTime options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction animations:^{ |
93 | 700184fb | Miltiadis Vasilakis | CGRect goal = dot.frame; |
94 | 700184fb | Miltiadis Vasilakis | goal.origin.x += 140; |
95 | 700184fb | Miltiadis Vasilakis | dot.frame = goal; |
96 | 700184fb | Miltiadis Vasilakis | dot.alpha = 1; |
97 | 700184fb | Miltiadis Vasilakis | } completion:^(BOOL finished) { |
98 | 700184fb | Miltiadis Vasilakis | [UIView animateWithDuration:kAnimationTime delay:0 options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction animations:^{ |
99 | 700184fb | Miltiadis Vasilakis | |
100 | 700184fb | Miltiadis Vasilakis | if ([self.pickerView selectedRowInComponent:0] == kRandom) { |
101 | 700184fb | Miltiadis Vasilakis | dot.center = [[serverIcons objectAtIndex:arc4random() % kNodes] center]; |
102 | 700184fb | Miltiadis Vasilakis | } else if ([self.pickerView selectedRowInComponent:0] == kRoundRobin || [self.pickerView selectedRowInComponent:0] == kWeightedRoundRobin) { |
103 | 700184fb | Miltiadis Vasilakis | dot.center = [[serverIcons objectAtIndex:serverIndex] center]; |
104 | 700184fb | Miltiadis Vasilakis | } else if ([self.pickerView selectedRowInComponent:0] == kLeastConnections || [self.pickerView selectedRowInComponent:0] == kWeightedLeastConnections) { |
105 | 700184fb | Miltiadis Vasilakis | if (dotIndex < kNodes - 2) { |
106 | 700184fb | Miltiadis Vasilakis | dot.center = [[serverIcons objectAtIndex:0] center]; |
107 | 700184fb | Miltiadis Vasilakis | } else { |
108 | 700184fb | Miltiadis Vasilakis | dot.center = [[serverIcons objectAtIndex:1] center]; |
109 | 700184fb | Miltiadis Vasilakis | } |
110 | 700184fb | Miltiadis Vasilakis | } |
111 | 700184fb | Miltiadis Vasilakis | |
112 | 700184fb | Miltiadis Vasilakis | } completion:^(BOOL finished) { |
113 | 700184fb | Miltiadis Vasilakis | if (dotIndex == kNodes - 1) { |
114 | 700184fb | Miltiadis Vasilakis | [self animateDots]; |
115 | 700184fb | Miltiadis Vasilakis | } |
116 | 700184fb | Miltiadis Vasilakis | }]; |
117 | 700184fb | Miltiadis Vasilakis | }]; |
118 | 700184fb | Miltiadis Vasilakis | } |
119 | 700184fb | Miltiadis Vasilakis | |
120 | 700184fb | Miltiadis Vasilakis | - (void)animateDot:(NSTimer *)timer { |
121 | 700184fb | Miltiadis Vasilakis | [self animateDot:[[timer.userInfo objectForKey:@"dotIndex"] intValue] toServer:[[timer.userInfo objectForKey:@"serverIndex"] intValue]]; |
122 | 700184fb | Miltiadis Vasilakis | } |
123 | 700184fb | Miltiadis Vasilakis | |
124 | 700184fb | Miltiadis Vasilakis | - (void)animateDots { |
125 | 700184fb | Miltiadis Vasilakis | for (int i = 0; i < kNodes; i++) { |
126 | 700184fb | Miltiadis Vasilakis | [self animateDot:i toServer:i]; |
127 | 700184fb | Miltiadis Vasilakis | } |
128 | 700184fb | Miltiadis Vasilakis | } |
129 | 700184fb | Miltiadis Vasilakis | |
130 | 700184fb | Miltiadis Vasilakis | - (UITableViewCell *)algorithmCell:(UITableView *)tableView { |
131 | 700184fb | Miltiadis Vasilakis | static NSString *CellIdentifier = @"Cell"; |
132 | 700184fb | Miltiadis Vasilakis | |
133 | 700184fb | Miltiadis Vasilakis | UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
134 | 700184fb | Miltiadis Vasilakis | if (cell == nil) { |
135 | 700184fb | Miltiadis Vasilakis | cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; |
136 | 7db1712d | Miltiadis Vasilakis | cell.selectionStyle = UITableViewCellSelectionStyleNone; |
137 | 700184fb | Miltiadis Vasilakis | |
138 | 700184fb | Miltiadis Vasilakis | loadBalancerIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"load-balancers-icon.png"]]; |
139 | 700184fb | Miltiadis Vasilakis | loadBalancerIcon.center = cell.center; |
140 | 700184fb | Miltiadis Vasilakis | CGRect r = loadBalancerIcon.frame; |
141 | 700184fb | Miltiadis Vasilakis | r.origin.y += 10; |
142 | 700184fb | Miltiadis Vasilakis | loadBalancerIcon.frame = r; |
143 | 700184fb | Miltiadis Vasilakis | // loadBalancerIcon.clipsToBounds = NO; |
144 | 700184fb | Miltiadis Vasilakis | // [loadBalancerIcon.layer setShadowColor:[[UIColor blackColor] CGColor]]; |
145 | 700184fb | Miltiadis Vasilakis | // [loadBalancerIcon.layer setShadowRadius:1.0f]; |
146 | 700184fb | Miltiadis Vasilakis | // [loadBalancerIcon.layer setShadowOffset:CGSizeMake(1, 1)]; |
147 | 700184fb | Miltiadis Vasilakis | // [loadBalancerIcon.layer setShadowOpacity:0.8f]; |
148 | 700184fb | Miltiadis Vasilakis | |
149 | 700184fb | Miltiadis Vasilakis | [cell addSubview:loadBalancerIcon]; |
150 | 700184fb | Miltiadis Vasilakis | |
151 | 700184fb | Miltiadis Vasilakis | serverIcons = [[NSMutableArray alloc] initWithCapacity:5]; |
152 | 700184fb | Miltiadis Vasilakis | dots = [[NSMutableArray alloc] initWithCapacity:5]; |
153 | 700184fb | Miltiadis Vasilakis | |
154 | 700184fb | Miltiadis Vasilakis | for (int i = 0; i < kNodes; i++) { |
155 | 700184fb | Miltiadis Vasilakis | UIImageView *server = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"custom-icon.png"]]; |
156 | 700184fb | Miltiadis Vasilakis | UIView *dot = [[UIView alloc] initWithFrame:CGRectMake(10, 30, 6, 6)]; |
157 | 700184fb | Miltiadis Vasilakis | dot.backgroundColor = [UIColor redColor]; |
158 | 700184fb | Miltiadis Vasilakis | dot.layer.cornerRadius = 3.5; |
159 | 700184fb | Miltiadis Vasilakis | server.frame = CGRectMake(20 + (61 * i), 80, 35, 35); |
160 | 700184fb | Miltiadis Vasilakis | // server.clipsToBounds = NO; |
161 | 700184fb | Miltiadis Vasilakis | // [server.layer setShadowColor:[[UIColor blackColor] CGColor]]; |
162 | 700184fb | Miltiadis Vasilakis | // [server.layer setShadowRadius:1.0f]; |
163 | 700184fb | Miltiadis Vasilakis | // [server.layer setShadowOffset:CGSizeMake(1, 1)]; |
164 | 700184fb | Miltiadis Vasilakis | // [server.layer setShadowOpacity:0.8f]; |
165 | 700184fb | Miltiadis Vasilakis | [cell addSubview:server]; |
166 | 700184fb | Miltiadis Vasilakis | [cell addSubview:dot]; |
167 | 700184fb | Miltiadis Vasilakis | [cell sendSubviewToBack:dot]; |
168 | 700184fb | Miltiadis Vasilakis | [serverIcons addObject:server]; |
169 | 700184fb | Miltiadis Vasilakis | [dots addObject:dot]; |
170 | 700184fb | Miltiadis Vasilakis | [server release]; |
171 | 700184fb | Miltiadis Vasilakis | [dot release]; |
172 | 700184fb | Miltiadis Vasilakis | } |
173 | 700184fb | Miltiadis Vasilakis | |
174 | 700184fb | Miltiadis Vasilakis | //[NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(animateDots) userInfo:nil repeats:NO]; |
175 | 700184fb | Miltiadis Vasilakis | [self animateDots]; |
176 | 700184fb | Miltiadis Vasilakis | |
177 | 700184fb | Miltiadis Vasilakis | } |
178 | 700184fb | Miltiadis Vasilakis | |
179 | 700184fb | Miltiadis Vasilakis | return cell; |
180 | 700184fb | Miltiadis Vasilakis | } |
181 | 700184fb | Miltiadis Vasilakis | |
182 | 700184fb | Miltiadis Vasilakis | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
183 | 700184fb | Miltiadis Vasilakis | |
184 | 700184fb | Miltiadis Vasilakis | return [self algorithmCell:self.tableView]; |
185 | 700184fb | Miltiadis Vasilakis | |
186 | 700184fb | Miltiadis Vasilakis | static NSString *CellIdentifier = @"Cell"; |
187 | 700184fb | Miltiadis Vasilakis | |
188 | 700184fb | Miltiadis Vasilakis | UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
189 | 700184fb | Miltiadis Vasilakis | if (cell == nil) { |
190 | 700184fb | Miltiadis Vasilakis | cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; |
191 | 700184fb | Miltiadis Vasilakis | cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
192 | 700184fb | Miltiadis Vasilakis | } |
193 | 700184fb | Miltiadis Vasilakis | |
194 | 700184fb | Miltiadis Vasilakis | switch (indexPath.section) { |
195 | 700184fb | Miltiadis Vasilakis | case kRandom: |
196 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Random"; |
197 | 700184fb | Miltiadis Vasilakis | break; |
198 | 700184fb | Miltiadis Vasilakis | case kRoundRobin: |
199 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Round Robin"; |
200 | 700184fb | Miltiadis Vasilakis | break; |
201 | 700184fb | Miltiadis Vasilakis | case kWeightedRoundRobin: |
202 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Weighted Round Robin"; |
203 | 700184fb | Miltiadis Vasilakis | break; |
204 | 700184fb | Miltiadis Vasilakis | case kLeastConnections: |
205 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Least Connections"; |
206 | 700184fb | Miltiadis Vasilakis | break; |
207 | 700184fb | Miltiadis Vasilakis | case kWeightedLeastConnections: |
208 | 700184fb | Miltiadis Vasilakis | cell.textLabel.text = @"Weighted Least Connections"; |
209 | 700184fb | Miltiadis Vasilakis | break; |
210 | 700184fb | Miltiadis Vasilakis | default: |
211 | 700184fb | Miltiadis Vasilakis | break; |
212 | 700184fb | Miltiadis Vasilakis | } |
213 | 700184fb | Miltiadis Vasilakis | return cell; |
214 | 700184fb | Miltiadis Vasilakis | } |
215 | 700184fb | Miltiadis Vasilakis | |
216 | 700184fb | Miltiadis Vasilakis | #pragma mark - Table view delegate |
217 | 700184fb | Miltiadis Vasilakis | |
218 | 700184fb | Miltiadis Vasilakis | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
219 | 700184fb | Miltiadis Vasilakis | } |
220 | 700184fb | Miltiadis Vasilakis | |
221 | 700184fb | Miltiadis Vasilakis | #pragma mark - Picker data source |
222 | 700184fb | Miltiadis Vasilakis | |
223 | 700184fb | Miltiadis Vasilakis | - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { |
224 | 700184fb | Miltiadis Vasilakis | return 1; |
225 | 700184fb | Miltiadis Vasilakis | } |
226 | 700184fb | Miltiadis Vasilakis | |
227 | 700184fb | Miltiadis Vasilakis | - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { |
228 | 700184fb | Miltiadis Vasilakis | return 5; |
229 | 700184fb | Miltiadis Vasilakis | } |
230 | 700184fb | Miltiadis Vasilakis | |
231 | 700184fb | Miltiadis Vasilakis | #pragma mark - Picker delegate |
232 | 700184fb | Miltiadis Vasilakis | |
233 | 700184fb | Miltiadis Vasilakis | - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { |
234 | 700184fb | Miltiadis Vasilakis | switch (row) { |
235 | 700184fb | Miltiadis Vasilakis | case kRandom: |
236 | 700184fb | Miltiadis Vasilakis | return @"Random"; |
237 | 700184fb | Miltiadis Vasilakis | case kRoundRobin: |
238 | 700184fb | Miltiadis Vasilakis | return @"Round Robin"; |
239 | 700184fb | Miltiadis Vasilakis | case kWeightedRoundRobin: |
240 | 700184fb | Miltiadis Vasilakis | return @"Weighted Round Robin"; |
241 | 700184fb | Miltiadis Vasilakis | case kLeastConnections: |
242 | 700184fb | Miltiadis Vasilakis | return @"Least Connections"; |
243 | 700184fb | Miltiadis Vasilakis | case kWeightedLeastConnections: |
244 | 700184fb | Miltiadis Vasilakis | return @"Weighted Least Connections"; |
245 | 700184fb | Miltiadis Vasilakis | default: |
246 | 700184fb | Miltiadis Vasilakis | return @""; |
247 | 700184fb | Miltiadis Vasilakis | } |
248 | 700184fb | Miltiadis Vasilakis | } |
249 | 700184fb | Miltiadis Vasilakis | |
250 | 700184fb | Miltiadis Vasilakis | - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { |
251 | 700184fb | Miltiadis Vasilakis | // change the animation |
252 | 700184fb | Miltiadis Vasilakis | [self.tableView reloadData]; |
253 | 700184fb | Miltiadis Vasilakis | //[self animateDots]; |
254 | 700184fb | Miltiadis Vasilakis | } |
255 | 700184fb | Miltiadis Vasilakis | |
256 | 700184fb | Miltiadis Vasilakis | @end |