Search in sources :

Example 1 with OvsTunnelNetworkVO

use of com.cloud.network.ovs.dao.OvsTunnelNetworkVO in project cloudstack by apache.

the class OvsTunnelManagerImpl method handleDestroyTunnelAnswer.

@DB
private void handleDestroyTunnelAnswer(Answer ans, long from, long to, long networkId) {
    if (ans.getResult()) {
        OvsTunnelNetworkVO lock = _tunnelNetworkDao.acquireInLockTable(Long.valueOf(1));
        if (lock == null) {
            s_logger.warn(String.format("failed to lock" + "ovs_tunnel_account, remove record of " + "tunnel(from=%1$s, to=%2$s account=%3$s) failed", from, to, networkId));
            return;
        }
        _tunnelNetworkDao.removeByFromToNetwork(from, to, networkId);
        _tunnelNetworkDao.releaseFromLockTable(lock.getId());
        s_logger.debug(String.format("Destroy tunnel(account:%1$s," + "from:%2$s, to:%3$s) successful", networkId, from, to));
    } else {
        s_logger.debug(String.format("Destroy tunnel(account:%1$s," + "from:%2$s, to:%3$s) failed", networkId, from, to));
    }
}
Also used : OvsTunnelNetworkVO(com.cloud.network.ovs.dao.OvsTunnelNetworkVO) DB(com.cloud.utils.db.DB)

Example 2 with OvsTunnelNetworkVO

use of com.cloud.network.ovs.dao.OvsTunnelNetworkVO in project cloudstack by apache.

the class OvsTunnelManagerImpl method checkAndCreateTunnel.

@DB
protected void checkAndCreateTunnel(Network nw, Host host) {
    s_logger.debug("Creating tunnels with OVS tunnel manager");
    long hostId = host.getId();
    int key = getGreKey(nw);
    String bridgeName = generateBridgeName(nw, key);
    List<Long> toHostIds = new ArrayList<Long>();
    List<Long> fromHostIds = new ArrayList<Long>();
    List<Long> networkSpannedHosts = _ovsNetworkToplogyGuru.getNetworkSpanedHosts(nw.getId());
    for (Long rh : networkSpannedHosts) {
        if (rh == hostId) {
            continue;
        }
        OvsTunnelNetworkVO ta = _tunnelNetworkDao.getByFromToNetwork(hostId, rh.longValue(), nw.getId());
        // Try and create the tunnel even if a previous attempt failed
        if (ta == null || ta.getState().equals(OvsTunnel.State.Failed.name())) {
            s_logger.debug("Attempting to create tunnel from:" + hostId + " to:" + rh.longValue());
            if (ta == null) {
                createTunnelRecord(hostId, rh.longValue(), nw.getId(), key);
            }
            if (!toHostIds.contains(rh)) {
                toHostIds.add(rh);
            }
        }
        ta = _tunnelNetworkDao.getByFromToNetwork(rh.longValue(), hostId, nw.getId());
        // Try and create the tunnel even if a previous attempt failed
        if (ta == null || ta.getState().equals(OvsTunnel.State.Failed.name())) {
            s_logger.debug("Attempting to create tunnel from:" + rh.longValue() + " to:" + hostId);
            if (ta == null) {
                createTunnelRecord(rh.longValue(), hostId, nw.getId(), key);
            }
            if (!fromHostIds.contains(rh)) {
                fromHostIds.add(rh);
            }
        }
    }
    //TODO: Should we propagate the exception here?
    try {
        String myIp = getGreEndpointIP(host, nw);
        if (myIp == null)
            throw new GreTunnelException("Unable to retrieve the source " + "endpoint for the GRE tunnel." + "Failure is on host:" + host.getId());
        boolean noHost = true;
        for (Long i : toHostIds) {
            HostVO rHost = _hostDao.findById(i);
            String otherIp = getGreEndpointIP(rHost, nw);
            if (otherIp == null)
                throw new GreTunnelException("Unable to retrieve the remote " + "endpoint for the GRE tunnel." + "Failure is on host:" + rHost.getId());
            Commands cmds = new Commands(new OvsCreateTunnelCommand(otherIp, key, Long.valueOf(hostId), i, nw.getId(), myIp, bridgeName, nw.getUuid()));
            s_logger.debug("Attempting to create tunnel from:" + hostId + " to:" + i + " for the network " + nw.getId());
            s_logger.debug("Ask host " + hostId + " to create gre tunnel to " + i);
            Answer[] answers = _agentMgr.send(hostId, cmds);
            handleCreateTunnelAnswer(answers);
            noHost = false;
        }
        for (Long i : fromHostIds) {
            HostVO rHost = _hostDao.findById(i);
            String otherIp = getGreEndpointIP(rHost, nw);
            Commands cmds = new Commands(new OvsCreateTunnelCommand(myIp, key, i, Long.valueOf(hostId), nw.getId(), otherIp, bridgeName, nw.getUuid()));
            s_logger.debug("Ask host " + i + " to create gre tunnel to " + hostId);
            Answer[] answers = _agentMgr.send(i, cmds);
            handleCreateTunnelAnswer(answers);
            noHost = false;
        }
        // anyway. This will ensure VIF rules will be triggered
        if (noHost) {
            Commands cmds = new Commands(new OvsSetupBridgeCommand(bridgeName, hostId, nw.getId()));
            s_logger.debug("Ask host " + hostId + " to configure bridge for network:" + nw.getId());
            Answer[] answers = _agentMgr.send(hostId, cmds);
            handleSetupBridgeAnswer(answers);
        }
    } catch (GreTunnelException | OperationTimedoutException | AgentUnavailableException e) {
        // I really thing we should do a better handling of these exceptions
        s_logger.warn("Ovs Tunnel network created tunnel failed", e);
    }
}
Also used : OvsTunnelNetworkVO(com.cloud.network.ovs.dao.OvsTunnelNetworkVO) OperationTimedoutException(com.cloud.exception.OperationTimedoutException) OvsCreateTunnelCommand(com.cloud.agent.api.OvsCreateTunnelCommand) ArrayList(java.util.ArrayList) HostVO(com.cloud.host.HostVO) OvsFetchInterfaceAnswer(com.cloud.agent.api.OvsFetchInterfaceAnswer) Answer(com.cloud.agent.api.Answer) OvsCreateTunnelAnswer(com.cloud.agent.api.OvsCreateTunnelAnswer) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) Commands(com.cloud.agent.manager.Commands) OvsSetupBridgeCommand(com.cloud.agent.api.OvsSetupBridgeCommand) DB(com.cloud.utils.db.DB)

Example 3 with OvsTunnelNetworkVO

use of com.cloud.network.ovs.dao.OvsTunnelNetworkVO in project cloudstack by apache.

the class OvsTunnelManagerImpl method checkAndRemoveHostFromTunnelNetwork.

@Override
public void checkAndRemoveHostFromTunnelNetwork(Network nw, Host host) {
    if (nw.getVpcId() != null && isVpcEnabledForDistributedRouter(nw.getVpcId())) {
        List<Long> vmIds = _ovsNetworkToplogyGuru.getActiveVmsInVpcOnHost(nw.getVpcId(), host.getId());
        if (vmIds != null && !vmIds.isEmpty()) {
            return;
        }
        // there are not active VM's on this host belonging to any of the tiers in the VPC, so remove
        // the host from the tunnel mesh network and destroy the bridge
        List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(nw.getVpcId());
        try {
            for (Network network : vpcNetworks) {
                int key = getGreKey(nw);
                String bridgeName = generateBridgeName(nw, key);
                /* Then ask hosts have peer tunnel with me to destroy them */
                List<OvsTunnelNetworkVO> peers = _tunnelNetworkDao.listByToNetwork(host.getId(), nw.getId());
                for (OvsTunnelNetworkVO p : peers) {
                    // If the tunnel was not successfully created don't bother to remove it
                    if (p.getState().equals(OvsTunnel.State.Established.name())) {
                        Command cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName, p.getPortName());
                        s_logger.debug("Destroying tunnel to " + host.getId() + " from " + p.getFrom());
                        Answer ans = _agentMgr.send(p.getFrom(), cmd);
                        handleDestroyTunnelAnswer(ans, p.getFrom(), p.getTo(), p.getNetworkId());
                    }
                }
            }
            Command cmd = new OvsDestroyBridgeCommand(nw.getId(), generateBridgeNameForVpc(nw.getVpcId()), host.getId());
            s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
            Answer ans = _agentMgr.send(host.getId(), cmd);
            handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
        } catch (Exception e) {
            s_logger.info("[ignored]" + "exception while removing host from networks: " + e.getLocalizedMessage());
        }
    } else {
        List<Long> vmIds = _ovsNetworkToplogyGuru.getActiveVmsInNetworkOnHost(nw.getId(), host.getId(), true);
        if (vmIds != null && !vmIds.isEmpty()) {
            return;
        }
        try {
            /* Now we are last one on host, destroy the bridge with all
                * the tunnels for this network  */
            int key = getGreKey(nw);
            String bridgeName = generateBridgeName(nw, key);
            Command cmd = new OvsDestroyBridgeCommand(nw.getId(), bridgeName, host.getId());
            s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
            Answer ans = _agentMgr.send(host.getId(), cmd);
            handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
            /* Then ask hosts have peer tunnel with me to destroy them */
            List<OvsTunnelNetworkVO> peers = _tunnelNetworkDao.listByToNetwork(host.getId(), nw.getId());
            for (OvsTunnelNetworkVO p : peers) {
                // If the tunnel was not successfully created don't bother to remove it
                if (p.getState().equals(OvsTunnel.State.Established.name())) {
                    cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName, p.getPortName());
                    s_logger.debug("Destroying tunnel to " + host.getId() + " from " + p.getFrom());
                    ans = _agentMgr.send(p.getFrom(), cmd);
                    handleDestroyTunnelAnswer(ans, p.getFrom(), p.getTo(), p.getNetworkId());
                }
            }
        } catch (Exception e) {
            s_logger.warn("Destroy tunnel failed", e);
        }
    }
}
Also used : OvsTunnelNetworkVO(com.cloud.network.ovs.dao.OvsTunnelNetworkVO) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) EntityExistsException(javax.persistence.EntityExistsException) OperationTimedoutException(com.cloud.exception.OperationTimedoutException) ConfigurationException(javax.naming.ConfigurationException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) OvsFetchInterfaceAnswer(com.cloud.agent.api.OvsFetchInterfaceAnswer) Answer(com.cloud.agent.api.Answer) OvsCreateTunnelAnswer(com.cloud.agent.api.OvsCreateTunnelAnswer) OvsCreateTunnelCommand(com.cloud.agent.api.OvsCreateTunnelCommand) OvsSetupBridgeCommand(com.cloud.agent.api.OvsSetupBridgeCommand) OvsDestroyBridgeCommand(com.cloud.agent.api.OvsDestroyBridgeCommand) OvsDestroyTunnelCommand(com.cloud.agent.api.OvsDestroyTunnelCommand) OvsFetchInterfaceCommand(com.cloud.agent.api.OvsFetchInterfaceCommand) OvsVpcPhysicalTopologyConfigCommand(com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand) Command(com.cloud.agent.api.Command) OvsVpcRoutingPolicyConfigCommand(com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand) Network(com.cloud.network.Network) OvsDestroyBridgeCommand(com.cloud.agent.api.OvsDestroyBridgeCommand) OvsDestroyTunnelCommand(com.cloud.agent.api.OvsDestroyTunnelCommand)

Example 4 with OvsTunnelNetworkVO

use of com.cloud.network.ovs.dao.OvsTunnelNetworkVO in project cloudstack by apache.

the class OvsTunnelManagerImpl method createTunnelRecord.

@DB
protected OvsTunnelNetworkVO createTunnelRecord(long from, long to, long networkId, int key) {
    OvsTunnelNetworkVO ta = null;
    try {
        ta = new OvsTunnelNetworkVO(from, to, key, networkId);
        OvsTunnelNetworkVO lock = _tunnelNetworkDao.acquireInLockTable(Long.valueOf(1));
        if (lock == null) {
            s_logger.warn("Cannot lock table ovs_tunnel_account");
            return null;
        }
        _tunnelNetworkDao.persist(ta);
        _tunnelNetworkDao.releaseFromLockTable(lock.getId());
    } catch (EntityExistsException e) {
        s_logger.debug("A record for the tunnel from " + from + " to " + to + " already exists");
    }
    return ta;
}
Also used : OvsTunnelNetworkVO(com.cloud.network.ovs.dao.OvsTunnelNetworkVO) EntityExistsException(javax.persistence.EntityExistsException) DB(com.cloud.utils.db.DB)

Example 5 with OvsTunnelNetworkVO

use of com.cloud.network.ovs.dao.OvsTunnelNetworkVO in project cloudstack by apache.

the class OvsTunnelManagerImpl method handleDestroyBridgeAnswer.

@DB
private void handleDestroyBridgeAnswer(Answer ans, long hostId, long networkId) {
    if (ans.getResult()) {
        OvsTunnelNetworkVO lock = _tunnelNetworkDao.acquireInLockTable(Long.valueOf(1));
        if (lock == null) {
            s_logger.warn("failed to lock ovs_tunnel_network," + "remove record");
            return;
        }
        _tunnelNetworkDao.removeByFromNetwork(hostId, networkId);
        _tunnelNetworkDao.releaseFromLockTable(lock.getId());
        s_logger.debug(String.format("Destroy bridge for" + "network %1$s successful", networkId));
    } else {
        s_logger.debug(String.format("Destroy bridge for" + "network %1$s failed", networkId));
    }
}
Also used : OvsTunnelNetworkVO(com.cloud.network.ovs.dao.OvsTunnelNetworkVO) DB(com.cloud.utils.db.DB)

Aggregations

OvsTunnelNetworkVO (com.cloud.network.ovs.dao.OvsTunnelNetworkVO)7 DB (com.cloud.utils.db.DB)5 OvsCreateTunnelAnswer (com.cloud.agent.api.OvsCreateTunnelAnswer)4 Answer (com.cloud.agent.api.Answer)3 OvsCreateTunnelCommand (com.cloud.agent.api.OvsCreateTunnelCommand)3 OvsFetchInterfaceAnswer (com.cloud.agent.api.OvsFetchInterfaceAnswer)3 OvsSetupBridgeCommand (com.cloud.agent.api.OvsSetupBridgeCommand)3 AgentUnavailableException (com.cloud.exception.AgentUnavailableException)3 OperationTimedoutException (com.cloud.exception.OperationTimedoutException)3 OvsVpcRoutingPolicyConfigCommand (com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand)2 Commands (com.cloud.agent.manager.Commands)2 HostVO (com.cloud.host.HostVO)2 Network (com.cloud.network.Network)2 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)2 ArrayList (java.util.ArrayList)2 EntityExistsException (javax.persistence.EntityExistsException)2 Command (com.cloud.agent.api.Command)1 OvsDestroyBridgeCommand (com.cloud.agent.api.OvsDestroyBridgeCommand)1 OvsDestroyTunnelCommand (com.cloud.agent.api.OvsDestroyTunnelCommand)1 OvsFetchInterfaceCommand (com.cloud.agent.api.OvsFetchInterfaceCommand)1