コード例 #1
0
  @DB
  protected boolean applyLoadBalancerRules(List<LoadBalancerVO> lbs)
      throws ResourceUnavailableException {
    Transaction txn = Transaction.currentTxn();
    List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
    for (LoadBalancerVO lb : lbs) {
      List<LbDestination> dstList = getExistingDestinations(lb.getId());

      LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList);
      rules.add(loadBalancing);
    }

    if (!_networkMgr.applyRules(rules, false)) {
      s_logger.debug("LB rules are not completely applied");
      return false;
    }

    for (LoadBalancerVO lb : lbs) {
      txn.start();
      if (lb.getState() == FirewallRule.State.Revoke) {
        _lbDao.remove(lb.getId());
        s_logger.warn("LB " + lb.getId() + " is successfully removed");
      } else if (lb.getState() == FirewallRule.State.Add) {
        lb.setState(FirewallRule.State.Active);
        s_logger.warn("LB rule " + lb.getId() + " state is set to Active");
        _lbDao.persist(lb);
      }

      // remove LB-Vm mappings that were state to revoke
      List<LoadBalancerVMMapVO> lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lb.getId(), true);
      List<Long> instanceIds = new ArrayList<Long>();

      for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) {
        instanceIds.add(lbVmMap.getInstanceId());
      }

      if (!instanceIds.isEmpty()) {
        _lb2VmMapDao.remove(lb.getId(), instanceIds, null);
        s_logger.debug(
            "Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds);
      }

      if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) {
        lb.setState(FirewallRule.State.Add);
        _lbDao.persist(lb);
        s_logger.debug(
            "LB rule "
                + lb.getId()
                + " state is set to Add as there are no more active LB-VM mappings");
      }

      txn.commit();
    }
    return true;
  }
コード例 #2
0
  @DB
  public boolean deleteLoadBalancerRule(
      long loadBalancerId, boolean apply, Account caller, long callerUserId) {
    LoadBalancerVO lb = _lbDao.findById(loadBalancerId);
    Transaction txn = Transaction.currentTxn();
    boolean generateUsageEvent = false;
    boolean success = true;

    txn.start();
    if (lb.getState() == FirewallRule.State.Staged) {
      if (s_logger.isDebugEnabled()) {
        s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb);
      }
      generateUsageEvent = true;
    } else if (lb.getState() == FirewallRule.State.Add
        || lb.getState() == FirewallRule.State.Active) {
      lb.setState(FirewallRule.State.Revoke);
      _lbDao.persist(lb);
      generateUsageEvent = true;
    }

    List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
    if (maps != null) {
      for (LoadBalancerVMMapVO map : maps) {
        map.setRevoke(true);
        _lb2VmMapDao.persist(map);
        s_logger.debug(
            "Set load balancer rule for revoke: rule id "
                + loadBalancerId
                + ", vmId "
                + map.getInstanceId());
      }
    }

    if (generateUsageEvent) {
      // Generate usage event right after all rules were marked for revoke
      UsageEventVO usageEvent =
          new UsageEventVO(
              EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(), null);
      _usageEventDao.persist(usageEvent);
    }

    txn.commit();

    if (apply) {
      try {
        if (!applyLoadBalancerConfig(loadBalancerId)) {
          s_logger.warn("Unable to apply the load balancer config");
          return false;
        }
      } catch (ResourceUnavailableException e) {
        s_logger.warn(
            "Unable to apply the load balancer config because resource is unavaliable.", e);
        return false;
      }
    }

    FirewallRuleVO relatedRule = _firewallDao.findByRelatedId(lb.getId());
    if (relatedRule != null) {
      s_logger.warn(
          "Unable to remove firewall rule id="
              + lb.getId()
              + " as it has related firewall rule id="
              + relatedRule.getId()
              + "; leaving it in Revoke state");
      success = false;
    } else {
      _firewallDao.remove(lb.getId());
    }

    _elbMgr.handleDeleteLoadBalancerRule(lb, callerUserId, caller);
    if (success) {
      s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully");
    }

    return success;
  }