1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-06 12:58:18 +03:00

Feature : Implement locks for concurrent driver actions

This commit is contained in:
Jaime Melis 2013-01-22 15:27:01 +01:00
parent 2288a38f54
commit e05e0e725b
6 changed files with 66 additions and 1 deletions

@ -17,14 +17,20 @@
require 'OpenNebulaNetwork' require 'OpenNebulaNetwork'
class OpenNebulaHM < OpenNebulaNetwork class OpenNebulaHM < OpenNebulaNetwork
DRIVER = "802.1Q"
XPATH_FILTER = "TEMPLATE/NIC[VLAN='YES']" XPATH_FILTER = "TEMPLATE/NIC[VLAN='YES']"
def initialize(vm, deploy_id = nil, hypervisor = nil) def initialize(vm, deploy_id = nil, hypervisor = nil)
super(vm,XPATH_FILTER,deploy_id,hypervisor) super(vm,XPATH_FILTER,deploy_id,hypervisor)
@locking = false
@bridges = get_interfaces @bridges = get_interfaces
end end
def activate def activate
lock
vm_id = @vm['ID'] vm_id = @vm['ID']
process do |nic| process do |nic|
bridge = nic[:bridge] bridge = nic[:bridge]
@ -53,6 +59,8 @@ class OpenNebulaHM < OpenNebulaNetwork
end end
end end
unlock
return 0 return 0
end end

@ -15,14 +15,19 @@
#--------------------------------------------------------------------------- # #--------------------------------------------------------------------------- #
class OpenNebulaFirewall < OpenNebulaNetwork class OpenNebulaFirewall < OpenNebulaNetwork
DRIVER = "fw"
XPATH_FILTER = "TEMPLATE/NIC[ICMP|WHITE_PORTS_TCP|WHITE_PORTS_UDP|" << XPATH_FILTER = "TEMPLATE/NIC[ICMP|WHITE_PORTS_TCP|WHITE_PORTS_UDP|" <<
"BLACK_PORTS_TCP|BLACK_PORTS_UDP]" "BLACK_PORTS_TCP|BLACK_PORTS_UDP]"
def initialize(vm, deploy_id = nil, hypervisor = nil) def initialize(vm, deploy_id = nil, hypervisor = nil)
super(vm,XPATH_FILTER,deploy_id,hypervisor) super(vm,XPATH_FILTER,deploy_id,hypervisor)
@locking = true
end end
def activate def activate
lock
vm_id = @vm['ID'] vm_id = @vm['ID']
process do |nic| process do |nic|
#:white_ports_tcp => iptables_range #:white_ports_tcp => iptables_range
@ -66,9 +71,13 @@ class OpenNebulaFirewall < OpenNebulaNetwork
process_chain(chain, tap, nic_rules) process_chain(chain, tap, nic_rules)
end end
end end
unlock
end end
def deactivate def deactivate
lock
vm_id = @vm['ID'] vm_id = @vm['ID']
process do |nic| process do |nic|
chain = "one-#{vm_id}-#{nic[:network_id]}" chain = "one-#{vm_id}-#{nic[:network_id]}"
@ -78,6 +87,8 @@ class OpenNebulaFirewall < OpenNebulaNetwork
purge_chain(chain, rule_num) purge_chain(chain, rule_num)
end end
end end
unlock
end end
def purge_chain(chain, rule_num) def purge_chain(chain, rule_num)

@ -101,6 +101,8 @@ class OpenNebulaNetwork
end end
def initialize(vm_tpl, xpath_filter, deploy_id = nil, hypervisor = nil) def initialize(vm_tpl, xpath_filter, deploy_id = nil, hypervisor = nil)
@locking = false
if !hypervisor if !hypervisor
@hypervisor = detect_hypervisor @hypervisor = detect_hypervisor
else else
@ -110,6 +112,20 @@ class OpenNebulaNetwork
@vm = VM.new(REXML::Document.new(vm_tpl).root, xpath_filter, deploy_id, @hypervisor) @vm = VM.new(REXML::Document.new(vm_tpl).root, xpath_filter, deploy_id, @hypervisor)
end end
def lock
if @locking
driver_name = self.class.name.downcase
@locking_file = File.open("/tmp/onevnm-#{driver_name}-lock","w")
@locking_file.flock(File::LOCK_EX)
end
end
def unlock
if @locking
@locking_file.close
end
end
def process(&block) def process(&block)
@vm.each_nic(block) @vm.each_nic(block)
end end

@ -17,10 +17,13 @@
require 'OpenNebulaNetwork' require 'OpenNebulaNetwork'
class EbtablesVLAN < OpenNebulaNetwork class EbtablesVLAN < OpenNebulaNetwork
DRIVER = "ebtables"
XPATH_FILTER = "TEMPLATE/NIC[VLAN='YES']" XPATH_FILTER = "TEMPLATE/NIC[VLAN='YES']"
def initialize(vm, deploy_id = nil, hypervisor = nil) def initialize(vm, deploy_id = nil, hypervisor = nil)
super(vm,XPATH_FILTER,deploy_id,hypervisor) super(vm,XPATH_FILTER,deploy_id,hypervisor)
@locking = true
end end
def ebtables(rule) def ebtables(rule)
@ -30,6 +33,8 @@ class EbtablesVLAN < OpenNebulaNetwork
# Activates ebtables rules # Activates ebtables rules
# #
def activate def activate
lock
process do |nic| process do |nic|
tap = nic[:tap] tap = nic[:tap]
if tap if tap
@ -49,10 +54,14 @@ class EbtablesVLAN < OpenNebulaNetwork
end end
end end
unlock
return 0 return 0
end end
def deactivate def deactivate
lock
process do |nic| process do |nic|
mac = nic[:mac] mac = nic[:mac]
# remove 0-padding # remove 0-padding
@ -68,6 +77,8 @@ class EbtablesVLAN < OpenNebulaNetwork
remove_rules(tap) remove_rules(tap)
end end
unlock
return 0 return 0
end end

@ -17,6 +17,8 @@
require 'OpenNebulaNetwork' require 'OpenNebulaNetwork'
class OpenvSwitchVLAN < OpenNebulaNetwork class OpenvSwitchVLAN < OpenNebulaNetwork
DRIVER = "ovswitch"
FIREWALL_PARAMS = [:black_ports_tcp, FIREWALL_PARAMS = [:black_ports_tcp,
:black_ports_udp, :black_ports_udp,
:icmp] :icmp]
@ -25,9 +27,12 @@ class OpenvSwitchVLAN < OpenNebulaNetwork
def initialize(vm, deploy_id = nil, hypervisor = nil) def initialize(vm, deploy_id = nil, hypervisor = nil)
super(vm,XPATH_FILTER,deploy_id,hypervisor) super(vm,XPATH_FILTER,deploy_id,hypervisor)
@locking = false
end end
def activate def activate
lock
process do |nic| process do |nic|
@nic = nic @nic = nic
@ -40,16 +45,23 @@ class OpenvSwitchVLAN < OpenNebulaNetwork
# Apply Firewall # Apply Firewall
configure_fw if FIREWALL_PARAMS & @nic.keys != [] configure_fw if FIREWALL_PARAMS & @nic.keys != []
end end
unlock
return 0 return 0
end end
def deactivate def deactivate
lock
process do |nic| process do |nic|
@nic = nic @nic = nic
# Remove flows # Remove flows
del_flows del_flows
end end
unlock
end end
def tag_vlan def tag_vlan

@ -37,11 +37,14 @@ require 'CommandManager'
require 'OpenNebulaNetwork' require 'OpenNebulaNetwork'
class OpenNebulaVMware < OpenNebulaNetwork class OpenNebulaVMware < OpenNebulaNetwork
DRIVER = "vmware"
XPATH_FILTER = "TEMPLATE/NIC" XPATH_FILTER = "TEMPLATE/NIC"
VCLI_PREFIX = "/usr/bin/vicfg" VCLI_PREFIX = "/usr/bin/vicfg"
def initialize(vm, deploy_id = nil, hypervisor = nil) def initialize(vm, deploy_id = nil, hypervisor = nil)
super(vm,XPATH_FILTER,deploy_id,hypervisor) super(vm,XPATH_FILTER,deploy_id,hypervisor)
@locking = false
@config = YAML::load(File.read(CONF_FILE)) @config = YAML::load(File.read(CONF_FILE))
@ -59,6 +62,8 @@ class OpenNebulaVMware < OpenNebulaNetwork
end end
def activate def activate
lock
vm_id = @vm['ID'] vm_id = @vm['ID']
hostname = @vm['HISTORY_RECORDS/HISTORY/HOSTNAME'] hostname = @vm['HISTORY_RECORDS/HISTORY/HOSTNAME']
process do |nic| process do |nic|
@ -79,6 +84,8 @@ class OpenNebulaVMware < OpenNebulaNetwork
add_pg(pg, switch, vlan) if !check_pg(pg, switch) add_pg(pg, switch, vlan) if !check_pg(pg, switch)
end end
unlock
return 0 return 0
end end