Statistics
| Branch: | Tag: | Revision:

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