2 // LBServersViewController.m
5 // Created by Mike Mayo on 5/9/11.
6 // Copyright 2011 __MyCompanyName__. All rights reserved.
9 #import "LBServersViewController.h"
10 #import "OpenStackAccount.h"
11 #import "AccountManager.h"
12 #import "LoadBalancer.h"
16 #import "UIViewController+Conveniences.h"
17 #import "ActivityIndicatorView.h"
18 #import "APICallback.h"
19 #import "LoadBalancerNode.h"
20 #import "LoadBalancerProtocol.h"
23 @implementation LBServersViewController
25 @synthesize account, loadBalancer, serverNodes, originalServerNodes;
27 - (id)initWithAccount:(OpenStackAccount *)a loadBalancer:(LoadBalancer *)lb serverNodes:(NSMutableArray *)sn {
28 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
29 self = [super initWithStyle:UITableViewStyleGrouped];
31 self = [super initWithStyle:UITableViewStylePlain];
35 self.loadBalancer = lb;
36 self.serverNodes = sn;
37 self.originalServerNodes = [[sn copy] autorelease];
44 [loadBalancer release];
45 [serverNodes release];
46 [originalServerNodes release];
50 #pragma mark - View lifecycle
54 self.navigationItem.title = @"Cloud Servers";
56 if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
60 if ([self.account.servers count] == 0) {
61 // we may not have loaded the servers yet, so load them now
63 NSString *activityMessage = @"Loading...";
64 ActivityIndicatorView *activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
65 [activityIndicatorView addToView:self.view];
67 [[self.account.manager getServersWithCallback] success:^(OpenStackRequest *request) {
68 [activityIndicatorView removeFromSuperviewAndRelease];
69 [self.tableView reloadData];
70 } failure:^(OpenStackRequest *request) {
71 [activityIndicatorView removeFromSuperviewAndRelease];
72 [self alert:@"There was a problem loading your servers." request:request];
78 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
79 return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
82 #pragma mark - Table view data source
84 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
88 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
89 return [self.account.sortedServers count];
92 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
93 static NSString *CellIdentifier = @"Cell";
95 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
97 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
100 Server *server = [self.account.sortedServers objectAtIndex:indexPath.row];
101 cell.textLabel.text = server.name;
102 cell.detailTextLabel.text = server.flavor.name;
103 if ([server.image respondsToSelector:@selector(logoPrefix)]) {
104 if ([[server.image logoPrefix] isEqualToString:kCustomImage]) {
105 cell.imageView.image = [UIImage imageNamed:kCloudServersIcon];
107 cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-icon.png", [server.image logoPrefix]]];
111 cell.accessoryType = UITableViewCellAccessoryNone;
112 for (LoadBalancerNode *node in self.serverNodes) {
113 if ([node.server isEqual:server]) {
114 cell.accessoryType = UITableViewCellAccessoryCheckmark;
121 #pragma mark - Table view delegate
123 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
124 Server *server = [self.account.sortedServers objectAtIndex:indexPath.row];
125 LoadBalancerNode *nodeToRemove = nil;
126 for (LoadBalancerNode *node in self.serverNodes) {
127 if ([node.server isEqual:server]) {
133 [self.serverNodes removeObject:nodeToRemove];
135 LoadBalancerNode *node = [[LoadBalancerNode alloc] init];
136 node.condition = @"ENABLED";
137 node.server = server;
138 node.address = [[server.addresses objectForKey:@"public"] objectAtIndex:0];
139 node.port = [NSString stringWithFormat:@"%i", self.loadBalancer.protocol.port];
140 [self.serverNodes addObject:node];
143 [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
144 [NSTimer scheduledTimerWithTimeInterval:0.35 target:self.tableView selector:@selector(reloadData) userInfo:nil repeats:NO];
147 #pragma mark - Button Handlers
149 - (void)doneButtonPressed:(id)sender {
151 // compare original nodes to current nodes and alter the LB
152 NSMutableArray *nodesToAdd = [[NSMutableArray alloc] init];
153 NSMutableArray *nodesToDelete = [[NSMutableArray alloc] init];
155 NSLog(@"original nodes: %@", self.originalServerNodes);
156 NSLog(@"current nodes: %@", self.serverNodes);
158 for (LoadBalancerNode *node in self.originalServerNodes) {
159 if (![self.serverNodes containsObject:node]) {
160 [nodesToDelete addObject:node];
161 NSLog(@"going to delete: %@", node);
165 for (LoadBalancerNode *node in self.serverNodes) {
166 if (![self.originalServerNodes containsObject:node]) {
167 [nodesToAdd addObject:node];
168 NSLog(@"going to add: %@", node);
172 for (LoadBalancerNode *node in nodesToAdd) {
173 [self.loadBalancer.nodes addObject:node];
176 for (LoadBalancerNode *node in nodesToDelete) {
177 [self.loadBalancer.nodes removeObject:node];
180 [nodesToDelete release];
181 [nodesToAdd release];
183 [self dismissModalViewControllerAnimated:YES];