require "DistributionManager.rb"
class BuildServer
- attr_accessor :id, :path, :port, :status, :friend_servers, :host_os, :log
+ attr_accessor :id, :path, :port, :status, :host_os, :log
+ attr_accessor :remote_servers
attr_accessor :git_server_url, :git_bin_path
attr_accessor :job_log_url
attr_accessor :allowed_git_branch
attr_accessor :prjmgr, :distmgr
attr_accessor :transport_path
attr_accessor :cancel_lock
- attr_accessor :supported_os_list
attr_accessor :upgrade
- attr_accessor :remote_pkg_servers
attr_accessor :pkg_sync_period
attr_accessor :changelog_check
+ attr_accessor :db
attr_accessor :db_dsn, :db_user, :db_passwd
CONFIG_ROOT = "#{Utils::HOME}/.build_tools/build_server"
HOST_OS = Utils::HOST_OS
def initialize (id, path, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd)
@id = id
@path = path
- @friend_servers = []
- @remote_pkg_servers = []
+ @remote_servers = []
@req_listener = []
@finish = false
# port number
#
@transport_path = "#{@path}/transport"
@cancel_lock = Mutex.new
- @supported_os_list = []
@pkg_sync_period=600
@upgrade = false
@changelog_check = false
#DB settring
+ @db = nil
@db_dsn = "SQLite3:#{BuildServer::CONFIG_ROOT}/#{@id}/server.db"
@db_user = nil
@db_passwd = nil
@cleaner.start
# set package server synchrontizer
- if not @remote_pkg_servers.empty? then
- @log.info "Setting Package Server Synchronizer..."
- @pkg_sync = PackageServerSynchronizer.new(self)
- @pkg_sync.start
- end
+ @log.info "Setting Package Server Synchronizer..."
+ @pkg_sync = PackageServerSynchronizer.new(self)
+ @pkg_sync.start
# main loop
@log.info "Entering main loop..."
while( not @finish )
# update friend server status
- @friend_servers.each do |server|
+ @remote_servers = get_remote_servers()
+ @remote_servers.each do |server|
# update state
server.update_state
end
end
+ def get_remote_servers()
+ result = []
+ begin
+ db = get_db_connection()
+ rows = db.select_all("SELECT * FROM remote_build_servers")
+ rows.each do |row|
+ svr_ip,svr_port=row['svr_addr'].strip.split(":")
+ result.push RemoteBuildServer.new( svr_ip, svr_port, self )
+ end
+
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+ return []
+ end
+
+ return result
+ end
+
+
# add new remote friend server
def add_remote_server( ip, port )
- # if already exit, return false
- @friend_servers.each do |svr|
- if svr.ip.eql? ip and svr.port == port then
- return false
+ saddr="#{ip}:#{port}"
+ begin
+ db = get_db_connection()
+ db['AutoCommit'] = false
+ db.transaction do |dbh|
+ row = dbh.select_one("SELECT * FROM remote_build_servers WHERE svr_addr='#{saddr}'")
+ if not row.nil? then
+ db['AutoCommit'] = true
+ return false
+ end
+ dbh.do "INSERT INTO remote_build_servers (svr_addr) VALUES ('#{saddr}')"
end
- end
+ db['AutoCommit'] = true
- # create new one, and add it into list
- new_server = RemoteBuildServer.new( ip, port, self )
- @friend_servers.push new_server
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+ return false
+ end
return true
end
# remove remote friend server
def remove_remote_server( ip, port )
- @friend_servers.each do |svr|
- if svr.ip.eql? ip and svr.port == port then
- @friend_servers.delete svr
- return true
+ saddr="#{ip}:#{port}"
+ begin
+ db = get_db_connection()
+ db['AutoCommit'] = false
+ db.transaction do |dbh|
+ row = dbh.select_one("SELECT * FROM remote_build_servers WHERE svr_addr='#{svr_addr}'")
+ if row.nil? then
+ db['AutoCommit'] = true
+ return false
+ end
+ dbh.do("DELETE FROM remote_build_servers WHERE svr_addr='#{svr_addr}'")
end
+ db['AutoCommit'] = true
+
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+
+ return false
end
- # if not exist, return false
- return false
+ return true
+ end
+
+
+ def get_sync_package_servers()
+ result = []
+ begin
+ db = get_db_connection()
+ rows = db.select_all("SELECT * FROM sync_pkg_servers")
+ rows.each do |row|
+ result.push [row['pkgsvr_url'], row['dist_name']]
+ end
+
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+ return []
+ end
+
+ return result
end
# add new remote pkg server
def add_sync_package_server( url, dist )
-
- # if already exit, return false
- @remote_pkg_servers.each do |e|
- if e[0] == url and e[1] == dist then
- return false
+ begin
+ db = get_db_connection()
+ db['AutoCommit'] = false
+ db.transaction do |dbh|
+ row = dbh.select_one("SELECT * FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and dist_name='#{dist}'")
+ if not row.nil? then
+ db['AutoCommit'] = true
+ return false
+ end
+ db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,dist_name) VALUES('#{url}','#{@pkg_sync_period}','#{dist}')"
end
- end
+ db['AutoCommit'] = true
- @remote_pkg_servers.push [url, dist]
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+ return false
+ end
return true
end
# remove remote pkg server
def remove_sync_package_server( url, dist )
+ begin
+ db = get_db_connection()
+ db['AutoCommit'] = false
+ db.transaction do |dbh|
+ row = dbh.select_one("SELECT * FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and dist_name='#{dist}'")
+ if row.nil? then
+ db['AutoCommit'] = true
+ return false
+ end
+ dbh.do("DELETE FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and dist_name='#{dist}'")
+ end
+ db['AutoCommit'] = true
- # if already exit, return false
- @remote_pkg_servers.each do |e|
- if e[0] == url and e[1] == dist then
- @remote_pkg_servers.delete e
- return true
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+
+ return false
+ end
+
+ return true
+ end
+
+
+ def supported_os_list
+ result = []
+ begin
+ db = get_db_connection()
+ rows = db.select_all("SELECT * FROM supported_os")
+ rows.each do |row|
+ result.push row['name']
end
+
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+ return []
end
- return false
+ return result
end
# add new target OS.
# If already exist, return false , otherwise true
- def add_target_os( os_name )
-
- # if already exit, return false
- @supported_os_list.each do |os|
- if os.eql? os_name then
- return false
+ def add_supported_os( os_name )
+ begin
+ db = get_db_connection()
+ db['AutoCommit'] = false
+ db.transaction do |dbh|
+ row = dbh.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'")
+ if not row.nil? then
+ db['AutoCommit'] = true
+ return false
+ end
+ dbh.do "INSERT OR REPLACE INTO supported_os VALUES ('#{os_name}')"
end
- end
+ db['AutoCommit'] = true
- # add it into list
- @supported_os_list.push os_name
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+ return false
+ end
return true
+
end
# remove target OS.
- def remove_target_os( os_name )
- @supported_os_list.each do |os|
- if os.eql? os_name then
- @supported_os_list.delete os
- return true
+ def remove_supported_os( os_name )
+ begin
+ db = get_db_connection()
+ db['AutoCommit'] = false
+ db.transaction do |dbh|
+ row = dbh.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'")
+ if row.nil? then
+ db['AutoCommit'] = true
+ return false
+ end
+ dbh.do("DELETE FROM supported_os WHERE name='#{os_name}'")
end
+ db['AutoCommit'] = true
+
+ rescue DBI::DatabaseError => e
+ @log.error "DB failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
+
+ return false
end
- return false
+ return true
end
+
+
# get remote server
def get_available_server ( job )
candidates = []
# get availables server
# but, job must not be "REGISTER" and "MULTIBUILD" job
if job.type != "REGISTER" and job.type != "MULTIBUILD" then
- @friend_servers.each do |server|
+ @remote_servers.each do |server|
if ( server.status == "RUNNING" and server.can_build?( job ) and
not server.has_waiting_jobs and
server.get_file_transfer_cnt() == 0 and
if can_build? job then return true end
#if not found, check friends
- @friend_servers.each do |server|
+ @remote_servers.each do |server|
if server.status == "RUNNING" and
job.can_be_built_on? server.host_os then
return true
rescue DBI::DatabaseError => e
puts "DB Creation failed!"
puts e.errstr
+ @log.error e.backtrace.inspect
result = false
ensure
db.disconnect if db
end
- # save
- def save_db()
-
- result = true
-
- begin
- # open DB
- db = DBI.connect("DBI:#{@db_dsn}", @db_user ,@db_passwd)
-
- # remote_build_servers
- db.do "DELETE FROM remote_build_servers"
- @friend_servers.each do |svr|
- db.do "INSERT INTO remote_build_servers (svr_addr) VALUES('#{svr.ip}:#{svr.port}')"
- end
-
- # sync_pkg_servers
- db.do "DELETE FROM sync_pkg_servers"
- @remote_pkg_servers.each do |svr|
- db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,dist_name) VALUES('#{svr[0]}','#{@pkg_sync_period}','#{svr[1]}')"
- end
-
- # supported_os
- db.do "DELETE FROM supported_os"
- @supported_os_list.each do |os|
- db.do "INSERT INTO supported_os VALUES('#{os}')"
- end
-
- rescue DBI::DatabaseError => e
- puts "DB update failed!"
- puts e.errstr
- result = false
- ensure
- db.disconnect if db
- end
-
- return result
- end
-
-
- # load
- def load_db()
-
- result = true
+ def get_db_connection()
+ if not @db.nil? and @db.connected? then return @db end
begin
- # open DB
db = DBI.connect("DBI:#{@db_dsn}", @db_user, @db_passwd)
- #db.results_as_hash = true
-
- # remote_build_servers
- @friend_servers = []
- sth = db.execute "SELECT * FROM remote_build_servers"
- sth.fetch_hash do |row|
- add_remote_server(
- row['svr_addr'].split(":")[0],
- row['svr_addr'].split(":")[1].to_i)
- end
- sth.finish
- # sync_package_servers
- @remote_pkg_servers = []
- sth = db.execute "SELECT * FROM sync_pkg_servers"
- sth.fetch_hash do |row|
- add_sync_package_server( row['pkgsvr_url'], row['dist_name'] )
- @pkg_sync_period = row['period'].to_i
- end
- sth.finish
- # supported_os
- @supported_os_list = []
- sth = db.execute "SELECT * FROM supported_os"
- sth.fetch_hash do |row|
- add_target_os( row['name'] )
- end
- sth.finish
rescue DBI::DatabaseError => e
- puts "DB loading failed!"
- puts e.errstr
- result = false
- ensure
- sth.finish if not sth.finished?
+ @log.error "DB loading failed!"
+ @log.error e.errstr
+ @log.error e.backtrace.inspect
db.disconnect if db
+
+ return nil
end
- return result
- end
+ return db
+ end
+
end
# add
if server.add_remote_server( ip, port ) then
- if server.save_db() then
- puts "Friend server is added successfully!"
- return true
- else
- puts "Add friend server to DB is failed!"
- return false
- end
+ puts "Friend server is added successfully!"
+ return true
else
puts "Friend server already exists in list!"
return false
# add
if server.remove_remote_server( ip, port ) then
- if server.save_db() then
- puts "Friend server is removed successfully!"
- return true
- else
- puts "Remove friend server from DB is failed!"
- return false
- end
+ puts "Friend server is removed successfully!"
+ return true
else
puts "Friend server does not exist in list!"
return false
# add supported target os
def self.add_target_os( id, os_name )
- # TODO:check os foramt
- if os_name == "default" then
- puts "Cannot use \"default\" as target OS name!"
- return false
- end
-
# get server
server = get_server(id)
# add
- if server.add_target_os( os_name ) then
- if server.save_db() then
- puts "Target OS is added successfully!"
- return true
- else
- puts "Add target OS to DB is failed!"
- return false
- end
+ if server.add_supported_os( os_name ) then
+ puts "Target OS is added successfully!"
+ return true
else
puts "Target OS already exists in list!"
return false
server = get_server(id)
# add
- if server.remove_target_os( os_name ) then
- if server.save_db() then
- puts "Target OS is removed successfully!"
- return true
- else
- puts "Remove target OS from DB failed!"
- return false
- end
+ if server.remove_supported_os( os_name ) then
+ puts "Target OS is removed successfully!"
+ return true
else
puts "Target OS does not exist in list!"
return false
end
+
+ server.quit
end
# add
if server.add_sync_package_server( url, dist_name ) then
- if server.save_db() then
- puts "Remote package server is added!"
- return true
- else
- puts "Remove package server from DB is failed!"
- return false
- end
+ puts "Remote package server is added!"
+ return true
else
puts "The server already exists in list!"
return false
# remove
if server.remove_sync_package_server( url, dist_name ) then
- if server.save_db() then
- puts "Remote package server is removed!"
- return true
- else
- puts "Remove remote package server from DB is failed!"
- return false
- end
+ puts "Remote package server is removed!"
+ return true
else
puts "The server does not exist in list!"
return false
server.prjmgr.load()
puts "* REMOTE SERVER(S) *"
- server.friend_servers.each do |s|
+ server.get_remote_servers.each do |s|
puts " * #{s.ip}:#{s.port}"
end
puts ""
puts ""
puts "* SYNC PACKAGE SERVER(S) *"
- server.remote_pkg_servers.each do |s|
+ server.get_sync_package_servers.each do |s|
puts " * [#{s[1]}] #{s[0]}"
end
puts ""
if not server.db_exist? then
server.create_db()
end
- server.save_db()
end
# set password
obj.keep_time = keep_time
- # load from DB
- obj.load_db()
-
# change log setting
obj.changelog_check = changelog_check