Statistics
| Branch: | Tag: | Revision:

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