Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 8th, 2012  |  syntax: None  |  size: 4.38 KB  |  hits: 10  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. - (void)deleteNodes:(NSArray *)nodesToDelete withProgress:(ASIBasicBlock)progressBlock {
  2.    
  3.     NSString *endpoint = [self.account loadBalancerEndpointForRegion:self.loadBalancer.region];    
  4.     __block int deleteIndex = 0;
  5.    
  6.     void (^deleteNodeBlock)(LoadBalancerNode *node) = ^(LoadBalancerNode *node) {
  7.         APICallback *callback = [self.account.manager deleteLBNode:node loadBalancer:self.loadBalancer endpoint:endpoint];
  8.         [callback success:^(OpenStackRequest *request) {
  9.             deleteIndex++;
  10.             progressBlock();
  11.             if (deleteIndex < [nodesToDelete count]) {
  12.                 [self.loadBalancer pollUntilActive:self.account complete:^{
  13.                     deleteNodeBlock([nodesToDelete objectAtIndex:deleteIndex]);
  14.                 }];
  15.             }
  16.         } failure:^(OpenStackRequest *request) {
  17.             deleteIndex++;
  18.             progressBlock();
  19.             if (deleteIndex < [nodesToDelete count]) {
  20.                 [self.loadBalancer pollUntilActive:self.account complete:^{
  21.                     deleteNodeBlock([nodesToDelete objectAtIndex:deleteIndex]);
  22.                 }];
  23.             }
  24.             [self alert:@"There was a problem deleting a node." request:request];
  25.         }];
  26.     };
  27.    
  28.     LoadBalancerNode *node = [nodesToDelete objectAtIndex:deleteIndex];
  29.     deleteNodeBlock(node);
  30.  
  31. }
  32.  
  33. - (void)addNodes:(NSArray *)nodesToAdd andDeleteNodes:(NSArray *)nodesToDelete withProgress:(ASIBasicBlock)progressBlock failure:(APIResponseBlock)failureBlock {
  34.  
  35.     NSString *endpoint = [self.account loadBalancerEndpointForRegion:self.loadBalancer.region];    
  36.    
  37.     if ([nodesToAdd count] > 0) {
  38.         // we want to add before doing any deletes to avoid attempting an invalid delete
  39.         APICallback *callback = [self.account.manager addLBNodes:nodesToAdd loadBalancer:self.loadBalancer endpoint:endpoint];
  40.         [callback success:^(OpenStackRequest *request) {
  41.             progressBlock();
  42.            
  43.             // if it's a successful add, the status will be PENDING_UPDATE.  cheaper
  44.             // to just set it than hit the API again since we're already going to hit it
  45.             // n times for the deletes
  46.             self.loadBalancer.status = @"PENDING_UPDATE";
  47.            
  48.             // before you delete, you need to poll the LB until it hits active status
  49.             [self.loadBalancer pollUntilActive:self.account complete:^{
  50.                 [self deleteNodes:nodesToDelete withProgress:progressBlock];
  51.             }];
  52.            
  53.         } failure:^(OpenStackRequest *request) {
  54.             failureBlock(request);
  55.         }];
  56.     } else {
  57.         [self deleteNodes:nodesToDelete withProgress:progressBlock];
  58.     }
  59.    
  60. }
  61.  
  62. - (void)saveButtonPressed:(id)sender {
  63.     // we need to compare the previousNodoes list to the current nodes list so we
  64.     // can know which nodes to add and which ones to delete
  65.     NSMutableArray *nodesToAdd = [[NSMutableArray alloc] init];
  66.     NSMutableArray *nodesToDelete = [[NSMutableArray alloc] init];
  67.    
  68.     NSLog(@"previous nodes: %@", previousNodes);
  69.     NSLog(@"lb nodes: %@", self.loadBalancer.nodes);
  70.    
  71.     for (LoadBalancerNode *node in previousNodes) {
  72.         if (![self.loadBalancer.nodes containsObject:node]) {
  73.             [nodesToDelete addObject:node];
  74.             NSLog(@"going to delete node: %@", node);
  75.         }
  76.     }
  77.    
  78.     for (LoadBalancerNode *node in self.loadBalancer.nodes) {
  79.         if (![previousNodes containsObject:node]) {
  80.             [nodesToAdd addObject:node];
  81.             NSLog(@"going to add node: %@", node);
  82.         }
  83.     }
  84.    
  85.     ActivityIndicatorView *spinner = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:@"Saving..." withProgress:YES] text:@"Saving..." withProgress:YES];
  86.     [spinner addToView:self.view];
  87.  
  88.     __block NSInteger currentAPICalls = 0;
  89.     NSInteger totalAPICalls = [nodesToDelete count] + ([nodesToAdd count] > 0 ? 1 : 0);
  90.    
  91.     // make the API calls
  92.     [self addNodes:nodesToAdd andDeleteNodes:nodesToDelete withProgress:^{
  93.         currentAPICalls++;
  94.         // TODO: update progress view on spinner
  95.         if (currentAPICalls == totalAPICalls) {
  96.             [spinner removeFromSuperviewAndRelease];
  97.         }
  98.     } failure:^(OpenStackRequest *request) {
  99.         [self alert:@"There was a problem adding nodes." request:request];
  100.         [spinner removeFromSuperviewAndRelease];
  101.     }];
  102.    
  103.     [nodesToAdd release];
  104.     [nodesToDelete release];
  105. }