181181import com .cloud .network .ovs .OvsDestroyTunnelCommand ;
182182import com .cloud .network .ovs .OvsSetTagAndFlowAnswer ;
183183import com .cloud .network .ovs .OvsSetTagAndFlowCommand ;
184+ import com .cloud .network .ovs .OvsSetupBridgeCommand ;
184185import com .cloud .resource .ServerResource ;
185186import com .cloud .resource .hypervisor .HypervisorResource ;
186187import com .cloud .storage .Storage ;
@@ -617,7 +618,7 @@ private synchronized Network setupvSwitchNetwork(Connection conn) {
617618 /**
618619 * This method just creates a XenServer network following the tunnel network naming convention
619620 */
620- private synchronized Network createTunnelNetwork (Connection conn , long networkId ) {
621+ private synchronized Network findOrCreateTunnelNetwork (Connection conn , long networkId ) {
621622 try {
622623 String nwName = "OVSTunnel" + networkId ;
623624 Network nw = null ;
@@ -632,11 +633,13 @@ private synchronized Network createTunnelNetwork(Connection conn, long networkId
632633 otherConfig .put ("ovs-host-setup" , "" );
633634 rec .otherConfig = otherConfig ;
634635 nw = Network .create (conn , rec );
636+ // Plug dom0 vif only when creating network
637+ enableXenServerNetwork (conn , nw , nwName , "tunnel network for account " + networkId );
638+ s_logger .debug ("### Xen Server network for tunnels created:" + nwName );
635639 } else {
636640 nw = networks .iterator ().next ();
641+ s_logger .debug ("### Xen Server network for tunnels found:" + nwName );
637642 }
638- enableXenServerNetwork (conn , nw , nwName , "tunnel network for account " + networkId );
639- s_logger .debug ("### Xen Server network for tunnels created:" + nwName );
640643 return nw ;
641644 } catch (Exception e ) {
642645 s_logger .warn ("createTunnelNetwork failed" , e );
@@ -647,9 +650,9 @@ private synchronized Network createTunnelNetwork(Connection conn, long networkId
647650 /**
648651 * This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
649652 */
650- private synchronized Network createAndConfigureTunnelNetwork (Connection conn , long networkId , long hostId ) {
653+ private synchronized Network configureTunnelNetwork (Connection conn , long networkId , long hostId , int key ) {
651654 try {
652- Network nw = createTunnelNetwork (conn , networkId );
655+ Network nw = findOrCreateTunnelNetwork (conn , networkId );
653656 //Invoke plugin to setup the bridge which will be used by this network
654657 String bridge = nw .getBridge (conn );
655658 Map <String ,String > nwOtherConfig = nw .getOtherConfig (conn );
@@ -666,7 +669,7 @@ private synchronized Network createAndConfigureTunnelNetwork(Connection conn, lo
666669 }
667670 if (!configured ) {
668671 String result = callHostPlugin (conn , "ovstunnel" , "setup_ovs_bridge" , "bridge" , bridge ,
669- "key" , String .valueOf (networkId ),
672+ "key" , String .valueOf (key ),
670673 "xs_nw_uuid" , nw .getUuid (conn ),
671674 "cs_host_id" , ((Long )hostId ).toString ());
672675 //Note down the fact that the ovs bridge has been setup
@@ -684,29 +687,9 @@ private synchronized Network createAndConfigureTunnelNetwork(Connection conn, lo
684687 }
685688 }
686689
687- private synchronized Network findTunnelNetwork (Connection conn , long networkId ) {
688- try {
689- String nwName = "OVSTunnel" + networkId ;
690- Network nw = null ;
691- Set <Network > networks = Network .getByNameLabel (conn , nwName );
692- if (networks .size () == 0 ) {
693- String errorMessage = "Unable to find OVS bridge for network:" + networkId ;
694- s_logger .error (errorMessage );
695- throw new CloudRuntimeException (errorMessage );
696- } else {
697- nw = networks .iterator ().next ();
698- }
699- s_logger .debug ("### Xen Server network for tunnels found:" + nwName );
700- return nw ;
701- } catch (Exception e ) {
702- s_logger .warn ("findTunnelNetwork failed:" , e );
703- return null ;
704- }
705- }
706-
707690 private synchronized void destroyTunnelNetwork (Connection conn , long networkId ) {
708691 try {
709- Network nw = findTunnelNetwork (conn , networkId );
692+ Network nw = findOrCreateTunnelNetwork (conn , networkId );
710693 String bridge = nw .getBridge (conn );
711694 String result = callHostPlugin (conn , "ovstunnel" , "destroy_ovs_bridge" , "bridge" , bridge );
712695 String [] res = result .split (":" );
@@ -747,7 +730,7 @@ protected Network getNetwork(Connection conn, NicTO nic) throws XenAPIException,
747730 return setupvSwitchNetwork (conn );
748731 } else {
749732 long networkId = Long .parseLong (nic .getBroadcastUri ().getHost ());
750- return createTunnelNetwork (conn , networkId );
733+ return findOrCreateTunnelNetwork (conn , networkId );
751734 }
752735 } else if (nic .getBroadcastType () == BroadcastDomainType .Storage ) {
753736 URI broadcastUri = nic .getBroadcastUri ();
@@ -4802,6 +4785,16 @@ protected boolean can_bridge_firewall(Connection conn) {
48024785 return Boolean .valueOf (callHostPlugin (conn , "vmops" , "can_bridge_firewall" , "host_uuid" , _host .uuid , "instance" , _instance ));
48034786 }
48044787
4788+
4789+ private Answer execute (OvsSetupBridgeCommand cmd ) {
4790+ Connection conn = getConnection ();
4791+ s_logger .debug ("### About to configure OVS bridge" );
4792+ Network nw =findOrCreateTunnelNetwork (conn , cmd .getNetworkId ());
4793+ this .configureTunnelNetwork (conn , cmd .getNetworkId (), cmd .getHostId (), cmd .getKey ());
4794+ s_logger .debug ("### Bridge configured" );
4795+ return new Answer (cmd , true , null );
4796+ }
4797+
48054798 private Answer execute (OvsDestroyBridgeCommand cmd ) {
48064799 Connection conn = getConnection ();
48074800 s_logger .debug ("### About to destroy OVS bridge" );
@@ -4814,7 +4807,7 @@ private Answer execute(OvsDestroyTunnelCommand cmd) {
48144807 Connection conn = getConnection ();
48154808 s_logger .debug ("### About to destroy tunnel network" );
48164809 try {
4817- Network nw = findTunnelNetwork (conn , cmd .getNetworkId ());
4810+ Network nw = findOrCreateTunnelNetwork (conn , cmd .getNetworkId ());
48184811 if (nw == null ) {
48194812 s_logger .warn ("### Unable to find tunnel network" );
48204813 return new Answer (cmd , false , "No network found" );
@@ -4846,16 +4839,17 @@ private OvsCreateTunnelAnswer execute(OvsCreateTunnelCommand cmd) {
48464839 String bridge = "unknown" ;
48474840 try {
48484841 s_logger .debug ("### About to create tunnel network" );
4849- Network nw = createAndConfigureTunnelNetwork (conn , cmd .getNetworkId (), cmd . getFrom ());
4842+ Network nw = findOrCreateTunnelNetwork (conn , cmd .getNetworkId ());
48504843 if (nw == null ) {
48514844 s_logger .debug ("### SOMETHING WENT WRONG DURING NETWORK SETUP" );
48524845 return new OvsCreateTunnelAnswer (cmd , false , "Cannot create network" , bridge );
48534846 }
4854-
4847+
4848+ configureTunnelNetwork (conn , cmd .getNetworkId (), cmd .getFrom (), cmd .getKey ());
48554849 bridge = nw .getBridge (conn );
48564850 s_logger .debug ("### The bridge is:" + bridge );
4857- String result = callHostPlugin (conn , "ovstunnel" , "create_tunnel" , "bridge" , bridge , "remote_ip" , cmd .getRemoteIp (), "key" , cmd . getKey (), "from" , cmd . getFrom (). toString (), "to" , cmd
4858- .getTo ().toString ());
4851+ String result = callHostPlugin (conn , "ovstunnel" , "create_tunnel" , "bridge" , bridge , "remote_ip" , cmd .getRemoteIp (),
4852+ "key" , cmd . getKey (). toString (), "from" , cmd . getFrom (). toString (), "to" , cmd .getTo ().toString ());
48594853 s_logger .debug ("### Result from create tunnel operation:" + result );
48604854 String [] res = result .split (":" );
48614855 if (res .length == 2 && res [0 ].equalsIgnoreCase ("SUCCESS" )) {
0 commit comments