- - (void)deleteNodes:(NSArray *)nodesToDelete withProgress:(ASIBasicBlock)progressBlock {
- NSString *endpoint = [self.account loadBalancerEndpointForRegion:self.loadBalancer.region];
- __block int deleteIndex = 0;
- void (^deleteNodeBlock)(LoadBalancerNode *node) = ^(LoadBalancerNode *node) {
- APICallback *callback = [self.account.manager deleteLBNode:node loadBalancer:self.loadBalancer endpoint:endpoint];
- [callback success:^(OpenStackRequest *request) {
- deleteIndex++;
- progressBlock();
- if (deleteIndex < [nodesToDelete count]) {
- [self.loadBalancer pollUntilActive:self.account complete:^{
- deleteNodeBlock([nodesToDelete objectAtIndex:deleteIndex]);
- }];
- }
- } failure:^(OpenStackRequest *request) {
- deleteIndex++;
- progressBlock();
- if (deleteIndex < [nodesToDelete count]) {
- [self.loadBalancer pollUntilActive:self.account complete:^{
- deleteNodeBlock([nodesToDelete objectAtIndex:deleteIndex]);
- }];
- }
- [self alert:@"There was a problem deleting a node." request:request];
- }];
- };
- LoadBalancerNode *node = [nodesToDelete objectAtIndex:deleteIndex];
- deleteNodeBlock(node);
- }
- - (void)addNodes:(NSArray *)nodesToAdd andDeleteNodes:(NSArray *)nodesToDelete withProgress:(ASIBasicBlock)progressBlock failure:(APIResponseBlock)failureBlock {
- NSString *endpoint = [self.account loadBalancerEndpointForRegion:self.loadBalancer.region];
- if ([nodesToAdd count] > 0) {
- // we want to add before doing any deletes to avoid attempting an invalid delete
- APICallback *callback = [self.account.manager addLBNodes:nodesToAdd loadBalancer:self.loadBalancer endpoint:endpoint];
- [callback success:^(OpenStackRequest *request) {
- progressBlock();
- // if it's a successful add, the status will be PENDING_UPDATE. cheaper
- // to just set it than hit the API again since we're already going to hit it
- // n times for the deletes
- self.loadBalancer.status = @"PENDING_UPDATE";
- // before you delete, you need to poll the LB until it hits active status
- [self.loadBalancer pollUntilActive:self.account complete:^{
- [self deleteNodes:nodesToDelete withProgress:progressBlock];
- }];
- } failure:^(OpenStackRequest *request) {
- failureBlock(request);
- }];
- } else {
- [self deleteNodes:nodesToDelete withProgress:progressBlock];
- }
- }
- - (void)saveButtonPressed:(id)sender {
- // we need to compare the previousNodoes list to the current nodes list so we
- // can know which nodes to add and which ones to delete
- NSMutableArray *nodesToAdd = [[NSMutableArray alloc] init];
- NSMutableArray *nodesToDelete = [[NSMutableArray alloc] init];
- NSLog(@"previous nodes: %@", previousNodes);
- NSLog(@"lb nodes: %@", self.loadBalancer.nodes);
- for (LoadBalancerNode *node in previousNodes) {
- if (![self.loadBalancer.nodes containsObject:node]) {
- [nodesToDelete addObject:node];
- NSLog(@"going to delete node: %@", node);
- }
- }
- for (LoadBalancerNode *node in self.loadBalancer.nodes) {
- if (![previousNodes containsObject:node]) {
- [nodesToAdd addObject:node];
- NSLog(@"going to add node: %@", node);
- }
- }
- ActivityIndicatorView *spinner = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:@"Saving..." withProgress:YES] text:@"Saving..." withProgress:YES];
- [spinner addToView:self.view];
- __block NSInteger currentAPICalls = 0;
- NSInteger totalAPICalls = [nodesToDelete count] + ([nodesToAdd count] > 0 ? 1 : 0);
- // make the API calls
- [self addNodes:nodesToAdd andDeleteNodes:nodesToDelete withProgress:^{
- currentAPICalls++;
- // TODO: update progress view on spinner
- if (currentAPICalls == totalAPICalls) {
- [spinner removeFromSuperviewAndRelease];
- }
- } failure:^(OpenStackRequest *request) {
- [self alert:@"There was a problem adding nodes." request:request];
- [spinner removeFromSuperviewAndRelease];
- }];
- [nodesToAdd release];
- [nodesToDelete release];
- }