Fix compile errors
[pithos-ios] / Classes / LBServersViewController.m
1 //
2 //  LBServersViewController.m
3 //  OpenStack
4 //
5 //  Created by Mike Mayo on 5/9/11.
6 //  Copyright 2011 __MyCompanyName__. All rights reserved.
7 //
8
9 #import "LBServersViewController.h"
10 #import "OpenStackAccount.h"
11 #import "AccountManager.h"
12 #import "LoadBalancer.h"
13 #import "Server.h"
14 #import "Flavor.h"
15 #import "Image.h"
16 #import "UIViewController+Conveniences.h"
17 #import "ActivityIndicatorView.h"
18 #import "APICallback.h"
19 #import "LoadBalancerNode.h"
20 #import "LoadBalancerProtocol.h"
21
22
23 @implementation LBServersViewController
24
25 @synthesize account, loadBalancer, serverNodes, originalServerNodes;
26
27 - (id)initWithAccount:(OpenStackAccount *)a loadBalancer:(LoadBalancer *)lb serverNodes:(NSMutableArray *)sn {
28     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
29         self = [super initWithStyle:UITableViewStyleGrouped];
30     } else {
31         self = [super initWithStyle:UITableViewStylePlain];
32     }
33     if (self) {
34         self.account = a;
35         self.loadBalancer = lb;
36         self.serverNodes = sn;
37         self.originalServerNodes = [[sn copy] autorelease];
38     }
39     return self;
40 }
41
42 - (void)dealloc {
43     [account release];
44     [loadBalancer release];
45     [serverNodes release];
46     [originalServerNodes release];
47     [super dealloc];
48 }
49
50 #pragma mark - View lifecycle
51
52 - (void)viewDidLoad {
53     [super viewDidLoad];
54     self.navigationItem.title = @"Cloud Servers";
55     
56     if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
57         [self addDoneButton];
58     }
59     
60     if ([self.account.servers count] == 0) {
61         // we may not have loaded the servers yet, so load them now
62         
63         NSString *activityMessage = @"Loading...";
64         ActivityIndicatorView *activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
65         [activityIndicatorView addToView:self.view];
66         
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];
73         }];
74         
75     }
76 }
77
78 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
79     return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
80 }
81
82 #pragma mark - Table view data source
83
84 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
85     return 1;
86 }
87
88 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
89     return [self.account.sortedServers count];
90 }
91
92 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
93     static NSString *CellIdentifier = @"Cell";
94     
95     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
96     if (cell == nil) {
97         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
98     }
99     
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];
106         } else {
107             cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-icon.png", [server.image logoPrefix]]];
108         }
109     }
110
111     cell.accessoryType = UITableViewCellAccessoryNone;
112     for (LoadBalancerNode *node in self.serverNodes) {
113         if ([node.server isEqual:server]) {
114             cell.accessoryType = UITableViewCellAccessoryCheckmark;
115         }
116     }
117     
118     return cell;
119 }
120
121 #pragma mark - Table view delegate
122
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]) {
128             nodeToRemove = node;
129         }
130     }
131     
132     if (nodeToRemove) {
133         [self.serverNodes removeObject:nodeToRemove];
134     } else {
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];
141         [node release];
142     }
143     [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
144     [NSTimer scheduledTimerWithTimeInterval:0.35 target:self.tableView selector:@selector(reloadData) userInfo:nil repeats:NO];
145 }
146
147 #pragma mark - Button Handlers
148
149 - (void)doneButtonPressed:(id)sender {
150     
151     // compare original nodes to current nodes and alter the LB
152     NSMutableArray *nodesToAdd = [[NSMutableArray alloc] init];
153     NSMutableArray *nodesToDelete = [[NSMutableArray alloc] init];
154     
155     NSLog(@"original nodes: %@", self.originalServerNodes);
156     NSLog(@"current nodes: %@", self.serverNodes);
157
158     for (LoadBalancerNode *node in self.originalServerNodes) {
159         if (![self.serverNodes containsObject:node]) {
160             [nodesToDelete addObject:node];
161             NSLog(@"going to delete: %@", node);
162         }
163     }
164     
165     for (LoadBalancerNode *node in self.serverNodes) {
166         if (![self.originalServerNodes containsObject:node]) {
167             [nodesToAdd addObject:node];
168             NSLog(@"going to add: %@", node);
169         }
170     }
171     
172     for (LoadBalancerNode *node in nodesToAdd) {
173         [self.loadBalancer.nodes addObject:node];
174     }
175
176     for (LoadBalancerNode *node in nodesToDelete) {
177         [self.loadBalancer.nodes removeObject:node];
178     }
179     
180     [nodesToDelete release];
181     [nodesToAdd release];
182     
183     [self dismissModalViewControllerAnimated:YES];
184 }
185
186 @end