From: Hyoun Jiil Date: Wed, 14 Aug 2013 08:02:08 +0000 (+0900) Subject: [Title] check all db connection error X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=10cb28388312893447ccf2a4b506325f8c4c19e3;p=sdk%2Ftools%2Fsdk-build.git [Title] check all db connection error [Type] Enhancement [Module] Toolchain / [Priority] Minor [Jira#] [Redmine#] [Problem] [Cause] [Solution] [TestCase] Change-Id: Iebf66713e1d53f27925b00c43f85412bb7e7df03 --- diff --git a/src/build_server/BuildServer.rb b/src/build_server/BuildServer.rb index d7b30bb..e0da5b4 100644 --- a/src/build_server/BuildServer.rb +++ b/src/build_server/BuildServer.rb @@ -122,74 +122,189 @@ class BuildServer @job_id_mutex = Mutex.new end + #name send_mail + #return "YES" when send_mail setted + #return "NO" (default or DB conncetion error) def send_mail result = nil - get_db_connection() do |db| - result = db.select_one("SELECT value FROM server_configs WHERE property = 'send_mail'")[0] + begin + get_db_connection() do |db| + result = db.select_one("SELECT value FROM server_configs WHERE property = 'send_mail'")[0] + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end return (result.nil?) ? "NO" : result end def send_mail=(mail) - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{mail.strip}' WHERE property = 'send_mail'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{mail.strip}' WHERE property = 'send_mail'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end + #name keep_time + #return keep_time + #return 86400 (default or DB conncetion error) def keep_time result = nil - get_db_connection() do |db| - result = db.select_one("SELECT value FROM server_configs WHERE property = 'keep_time'")[0] + begin + get_db_connection() do |db| + result = db.select_one("SELECT value FROM server_configs WHERE property = 'keep_time'")[0] + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end return (result.nil?) ? 86400 : result.to_i end def keep_time=(second) - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{second}' WHERE property = 'keep_time'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{second}' WHERE property = 'keep_time'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end + #name pkg_sync_period + #return pkg_sync_period + #return 600 (default or DB conncetion error) def pkg_sync_period result = nil - get_db_connection() do |db| - result = db.select_one("SELECT value FROM server_configs WHERE property = 'pkg_sync_period'")[0] + begin + get_db_connection() do |db| + result = db.select_one("SELECT value FROM server_configs WHERE property = 'pkg_sync_period'")[0] + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end return (result.nil?) ? 600 : result.to_i end def pkg_sync_period=(second) - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{second}' WHERE property = 'pkg_sync_period'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{second}' WHERE property = 'pkg_sync_period'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end + #name changelog_check + #return chengelog_check flag + #return false (default or DB conncetion error) def changelog_check result = nil - get_db_connection() do |db| - result = db.select_one("SELECT value FROM server_configs WHERE property = 'changelog_check'")[0] + begin + get_db_connection() do |db| + result = db.select_one("SELECT value FROM server_configs WHERE property = 'changelog_check'")[0] + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end return (result.nil?) ? false : result =~ /true/i end def changelog_check=(check) t = check =~ /true/i - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{t.to_s}' WHERE property = 'changelog_check'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{t.to_s}' WHERE property = 'changelog_check'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end + #name job_log_url + #return job_log_url + #return "" (default or DB conncetion error) def job_log_url result = nil - get_db_connection() do |db| - result = db.select_one("SELECT value FROM server_configs WHERE property = 'job_log_url'")[0] + begin + get_db_connection() do |db| + result = db.select_one("SELECT value FROM server_configs WHERE property = 'job_log_url'")[0] + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end return (result.nil?) ? "" : result end def job_log_url=(url) - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{url.strip}' WHERE property = 'job_log_url'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{url.strip}' WHERE property = 'job_log_url'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end @@ -202,21 +317,51 @@ class BuildServer def port=(svr_port) @running_port = svr_port if has_db? then - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{svr_port}' WHERE property = 'port'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{svr_port}' WHERE property = 'port'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end end def save_id_to_db(id) - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{id.strip}' WHERE property = 'id'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{id.strip}' WHERE property = 'id'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end def save_path_to_db(path) - get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{path.strip}' WHERE property = 'path'" + begin + get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{path.strip}' WHERE property = 'path'" + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end end @@ -366,49 +511,109 @@ class BuildServer end + # name get_remote_servers + # return RemoteBuildServer array + # return [] (default or DB conncetion error) def get_remote_servers() - get_db_connection() do |db| - return RemoteBuildServer.load_all(db, self) + result = [] + begin + get_db_connection() do |db| + result = RemoteBuildServer.load_all(db, self) + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - return [] + return result end # add new remote friend server + # name add_remote_server + # return true when remote server add success + # return false when remote server already exist or build server is running or DB conncetion error def add_remote_server( ip, port ) + result = false if @status == "RUNNING" then return false end newsvr = nil - get_db_connection() do |db| - rs = RemoteBuildServer.load(ip, port, db, self) - if not rs.nil? then return false end - newsvr = RemoteBuildServer.new(ip, port, "", self) - newsvr.save(db) + + begin + get_db_connection() do |db| + rs = RemoteBuildServer.load(ip, port, db, self) + if rs.nil? then + newsvr = RemoteBuildServer.new(ip, port, "", self) + newsvr.save(db) + @remote_servers.push newsvr + result = true + end + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - @remote_servers.push newsvr - return true + return result end # remove remote friend server + # name remove_remote_server + # return true when remote server remove success + # return false when remote server not exist or build server is running or DB connection error def remove_remote_server( ip, port ) + result = false if @status == "RUNNING" then return false end - get_db_connection() do |db| - rs = RemoteBuildServer.load(ip, port, db) - if rs.nil? then return false end - rs.unload(db) + begin + get_db_connection() do |db| + rs = RemoteBuildServer.load(ip, port, db) + if not rs.nil? then + rs.unload(db) + result = true + end + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - return true + return result end + # name get_sync_package_servers + # return array of {pkgsvr_url => , name => } + # return [] when package server not exist or DB error occurred def get_sync_package_servers() result = [] - get_db_connection() do |db| - db.select_all("SELECT sync_pkg_servers.pkgsvr_url, distributions.name FROM sync_pkg_servers,distributions WHERE sync_pkg_servers.distribution_id = distributions.id") do |row | - result.push [row['pkgsvr_url'], row['name']] + begin + get_db_connection() do |db| + db.select_all("SELECT sync_pkg_servers.pkgsvr_url, distributions.name FROM sync_pkg_servers,distributions WHERE sync_pkg_servers.distribution_id = distributions.id") do |row | + result.push [row['pkgsvr_url'], row['name']] + end + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr end end @@ -417,37 +622,80 @@ class BuildServer # add new remote pkg server + # name add_sync_package_server + # return true when add sync package server successed + # return false when sync package server already exist or distribution name not matched or DB conncetion error def add_sync_package_server( url, dist ) - get_db_connection() do |db| - row = db.select_one("SELECT distributions.id FROM sync_pkg_servers,distributions WHERE sync_pkg_servers.pkgsvr_url='#{url}' and distributions.name='#{dist}' and sync_pkg_servers.distribution_id = distributions.id") - if not row.nil? then return false end - row = db.select_one("SELECT id FROM distributions WHERE name='#{dist}'") - dist_id = row['id'] - db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,distribution_id) VALUES('#{url}',600,#{dist_id})" + result = false + begin + get_db_connection() do |db| + row = db.select_one("SELECT distributions.id FROM sync_pkg_servers,distributions WHERE sync_pkg_servers.pkgsvr_url='#{url}' and distributions.name='#{dist}' and sync_pkg_servers.distribution_id = distributions.id") + if not row.nil? then return false end + row = db.select_one("SELECT id FROM distributions WHERE name='#{dist}'") + dist_id = row['id'] + db.do "INSERT INTO sync_pkg_servers (pkgsvr_url,period,distribution_id) VALUES('#{url}',600,#{dist_id})" + end + result = true + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - return true + return result end # remove remote pkg server + # name remove_sync_package_server + # return true when remove sync package server successed + # return false when sync package server not exist when DB conncetion error def remove_sync_package_server( url, dist ) - get_db_connection() do |db| - row = db.select_one("SELECT distributions.id FROM sync_pkg_servers,distributions WHERE sync_pkg_servers.pkgsvr_url='#{url}' and distributions.name='#{dist}' and sync_pkg_servers.distribution_id = distributions.id") - if row.nil? then return false end - dist_id = row['id'] - db.do("DELETE FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and distribution_id=#{dist_id}") + result = false + begin + get_db_connection() do |db| + row = db.select_one("SELECT distributions.id FROM sync_pkg_servers,distributions WHERE sync_pkg_servers.pkgsvr_url='#{url}' and distributions.name='#{dist}' and sync_pkg_servers.distribution_id = distributions.id") + if row.nil? then return false end + dist_id = row['id'] + db.do("DELETE FROM sync_pkg_servers WHERE pkgsvr_url='#{url}' and distribution_id=#{dist_id}") + end + result = true + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - return true + return result end + # name supported_os_list + # return array of os name [, ... ] + # return [] when DB error occurred def supported_os_list result = [] - get_db_connection() do |db| - db.select_all("SELECT * FROM supported_os") do |row | - result.push row['name'] + begin + get_db_connection() do |db| + db.select_all("SELECT * FROM supported_os") do |row | + result.push row['name'] + end + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr end end @@ -456,31 +704,59 @@ class BuildServer # add new target OS. - # If already exist, return false , otherwise true + # name add_supported_os + # return true when add supported os successed + # return false when supported os already exist or DB connection error def add_supported_os( os_name ) + result = false os_category = Utils.get_os_category( os_name ) if os_category.nil? then return false end - get_db_connection() do |db| - row = db.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'") - if not row.nil? then return false end - db.do "INSERT INTO supported_os(os_category_id, name) SELECT os_category.id, '#{os_name}' FROM os_category WHERE os_category.name='#{os_category}'" + begin + get_db_connection() do |db| + row = db.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'") + if not row.nil? then return false end + db.do "INSERT INTO supported_os(os_category_id, name) SELECT os_category.id, '#{os_name}' FROM os_category WHERE os_category.name='#{os_category}'" + end + result = true + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - return true - + return result end # remove target OS. + #name remove_supported_os( os_name ) + #return true when supported_os removed + #return false when supported_os not exist or DB connection error def remove_supported_os( os_name ) - get_db_connection() do |db| - row = db.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'") - if row.nil? then return false end - db.do("DELETE FROM supported_os WHERE name='#{os_name}'") + result = false + begin + get_db_connection() do |db| + row = db.select_one("SELECT * FROM supported_os WHERE name='#{os_name}'") + if row.nil? then return false end + db.do("DELETE FROM supported_os WHERE name='#{os_name}'") + end + result = true + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - return true + return result end @@ -618,7 +894,7 @@ class BuildServer end db.do("UPDATE server_configs SET value = '#{@db_version}' WHERE property = 'db_version'") end - rescue DBI::DatabaseError => e + rescue => e puts e.errstr result = false ensure @@ -678,86 +954,97 @@ class BuildServer def create_db() gen_db() - result = get_db_connection() do |db| - inc = db_inc - post_fix = db_post_fix - now = db_now - - # remove table - db.tables.each do |table| - db.do "DROP TABLE #{table}" - end - - # create table - db.do "CREATE TABLE server_configs ( id INTEGER PRIMARY KEY #{inc}, property VARCHAR(64) NOT NULL, value VARCHAR(256) )#{post_fix}" - db.do "INSERT INTO server_configs (property,value) VALUES ('id','#{@id}')" - db.do "INSERT INTO server_configs (property,value) VALUES ('path','#{@path}')" - db.do "INSERT INTO server_configs (property,value) VALUES ('db_version','#{@db_version}')" - db.do "INSERT INTO server_configs (property,value) VALUES ('port','2222')" - db.do "INSERT INTO server_configs (property,value) VALUES ('max_working_jobs','2')" - db.do "INSERT INTO server_configs (property,value) VALUES ('max_jobs','4')" - db.do "INSERT INTO server_configs (property,value) VALUES ('send_mail','NO')" - db.do "INSERT INTO server_configs (property,value) VALUES ('keep_time','86400')" - db.do "INSERT INTO server_configs (property,value) VALUES ('pkg_sync_period','600')" - db.do "INSERT INTO server_configs (property,value) VALUES ('changelog_check','false')" - db.do "INSERT INTO server_configs (property,value) VALUES ('job_log_url','')" - db.do "CREATE TABLE os_category ( id INTEGER PRIMARY KEY #{inc}, name VARCHAR(32) NOT NULL UNIQUE ) #{post_fix}" - db.do "INSERT INTO os_category (name) VALUES ( 'linux' )" - db.do "INSERT INTO os_category (name) VALUES ( 'windows' )" - db.do "INSERT INTO os_category (name) VALUES ( 'macos' )" - - PackageDistribution.create_table(db, inc, post_fix) - - # sync package server - db.do "CREATE TABLE sync_pkg_servers ( - id INTEGER PRIMARY KEY #{inc}, - distribution_id INTEGER NOT NULL, - pkgsvr_url VARCHAR(256), - period INTEGER, - description VARCHAR(255), - CONSTRAINT fk_sync_pkg_servers_distributions1 FOREIGN KEY ( distribution_id ) REFERENCES distributions ( id ) ) #{post_fix}" - - db.do "CREATE TABLE supported_os ( - id INTEGER PRIMARY KEY #{inc}, - os_category_id INTEGER NOT NULL, - name VARCHAR(32) NOT NULL UNIQUE, - CONSTRAINT fk_supported_os_os_category1 FOREIGN KEY ( os_category_id ) REFERENCES os_category ( id ) ) #{post_fix}" - - RemoteBuildServer.create_table(db, inc, post_fix) - - # USERS/GROUPS - # users - db.do "CREATE TABLE users ( id INTEGER PRIMARY KEY #{inc}, name VARCHAR(32) NOT NULL UNIQUE, email VARCHAR(256), password_hash VARCHAR(256), password_salt VARCHAR(256) ) #{post_fix}" - # groups - db.do "CREATE TABLE groups ( id INTEGER PRIMARY KEY #{inc}, name VARCHAR(32) NOT NULL UNIQUE, admin VARCHAR(32) NOT NULL DEFAULT 'FALSE', description VARCHAR(256) )#{post_fix}" - # user groups (users -- groups) - db.do "CREATE TABLE user_groups ( user_id INTEGER NOT NULL, group_id INTEGER NOT NULL, status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', PRIMARY KEY ( user_id, group_id ), - CONSTRAINT fk_users_has_groups_users1 FOREIGN KEY ( user_id ) REFERENCES users ( id ), - CONSTRAINT fk_users_has_groups_groups1 FOREIGN KEY ( group_id ) REFERENCES groups ( id )) #{post_fix}" - - db.do "INSERT INTO users (name,email,password_hash,password_salt) VALUES ('administrators','admin@user','$2a$10$H.w3ssI9KfuvNEXXp1qxD.b3Wm8alJG.HXviUofe4nErDn.TKUAka','$2a$10$H.w3ssI9KfuvNEXXp1qxD.')" - db.do "INSERT INTO users (name,email,password_hash,password_salt) VALUES ('sync-mananger','sync-manager@user','$2a$10$H.w3ssI9KfuvNEXXp1qxD.b3Wm8alJG.HXviUofe4nErDn.TKUAka','$2a$10$H.w3ssI9KfuvNEXXp1qxD.')" - db.do "INSERT INTO groups (name, admin, description) VALUES ('admin','TRUE','')" - db.do "INSERT INTO user_groups (user_id, group_id) SELECT users.id,groups.id FROM users,groups WHERE users.email = 'admin@user' and groups.name = 'admin'" - db.do "INSERT INTO user_groups (user_id, group_id) SELECT users.id,groups.id FROM users,groups WHERE users.email = 'sync-manager@user' and groups.name = 'admin'" - - # PROJECTS - CommonProject.create_table(db, inc, post_fix) - GitBuildProject.create_table(db, post_fix) - BinaryUploadProject.create_table(db, post_fix) - db.do "CREATE TABLE group_project_accesses( - group_id INTEGER NOT NULL, - project_id INTEGER NOT NULL, - build VARCHAR(32) NOT NULL DEFAULT 'TRUE', - PRIMARY KEY ( group_id,project_id ), - CONSTRAINT fk_groups_has_projects_groups1 FOREIGN KEY ( group_id ) REFERENCES groups ( id ), - CONSTRAINT fk_groups_has_projects_projects1 FOREIGN KEY ( project_id ) REFERENCES projects ( id ) )#{post_fix}" - - # JOBS - CommonJob.create_table(db, inc, post_fix) + begin + get_db_connection() do |db| + inc = db_inc + post_fix = db_post_fix + now = db_now + + # remove table + db.tables.each do |table| + db.do "DROP TABLE #{table}" + end + + # create table + db.do "CREATE TABLE server_configs ( id INTEGER PRIMARY KEY #{inc}, property VARCHAR(64) NOT NULL, value VARCHAR(256) )#{post_fix}" + db.do "INSERT INTO server_configs (property,value) VALUES ('id','#{@id}')" + db.do "INSERT INTO server_configs (property,value) VALUES ('path','#{@path}')" + db.do "INSERT INTO server_configs (property,value) VALUES ('db_version','#{@db_version}')" + db.do "INSERT INTO server_configs (property,value) VALUES ('port','2222')" + db.do "INSERT INTO server_configs (property,value) VALUES ('max_working_jobs','2')" + db.do "INSERT INTO server_configs (property,value) VALUES ('max_jobs','4')" + db.do "INSERT INTO server_configs (property,value) VALUES ('send_mail','NO')" + db.do "INSERT INTO server_configs (property,value) VALUES ('keep_time','86400')" + db.do "INSERT INTO server_configs (property,value) VALUES ('pkg_sync_period','600')" + db.do "INSERT INTO server_configs (property,value) VALUES ('changelog_check','false')" + db.do "INSERT INTO server_configs (property,value) VALUES ('job_log_url','')" + db.do "CREATE TABLE os_category ( id INTEGER PRIMARY KEY #{inc}, name VARCHAR(32) NOT NULL UNIQUE ) #{post_fix}" + db.do "INSERT INTO os_category (name) VALUES ( 'linux' )" + db.do "INSERT INTO os_category (name) VALUES ( 'windows' )" + db.do "INSERT INTO os_category (name) VALUES ( 'macos' )" + + PackageDistribution.create_table(db, inc, post_fix) + + # sync package server + db.do "CREATE TABLE sync_pkg_servers ( + id INTEGER PRIMARY KEY #{inc}, + distribution_id INTEGER NOT NULL, + pkgsvr_url VARCHAR(256), + period INTEGER, + description VARCHAR(255), + CONSTRAINT fk_sync_pkg_servers_distributions1 FOREIGN KEY ( distribution_id ) REFERENCES distributions ( id ) ) #{post_fix}" + + db.do "CREATE TABLE supported_os ( + id INTEGER PRIMARY KEY #{inc}, + os_category_id INTEGER NOT NULL, + name VARCHAR(32) NOT NULL UNIQUE, + CONSTRAINT fk_supported_os_os_category1 FOREIGN KEY ( os_category_id ) REFERENCES os_category ( id ) ) #{post_fix}" + + RemoteBuildServer.create_table(db, inc, post_fix) + + # USERS/GROUPS + # users + db.do "CREATE TABLE users ( id INTEGER PRIMARY KEY #{inc}, name VARCHAR(32) NOT NULL UNIQUE, email VARCHAR(256), password_hash VARCHAR(256), password_salt VARCHAR(256) ) #{post_fix}" + # groups + db.do "CREATE TABLE groups ( id INTEGER PRIMARY KEY #{inc}, name VARCHAR(32) NOT NULL UNIQUE, admin VARCHAR(32) NOT NULL DEFAULT 'FALSE', description VARCHAR(256) )#{post_fix}" + # user groups (users -- groups) + db.do "CREATE TABLE user_groups ( user_id INTEGER NOT NULL, group_id INTEGER NOT NULL, status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', PRIMARY KEY ( user_id, group_id ), + CONSTRAINT fk_users_has_groups_users1 FOREIGN KEY ( user_id ) REFERENCES users ( id ), + CONSTRAINT fk_users_has_groups_groups1 FOREIGN KEY ( group_id ) REFERENCES groups ( id )) #{post_fix}" + + db.do "INSERT INTO users (name,email,password_hash,password_salt) VALUES ('administrators','admin@user','$2a$10$H.w3ssI9KfuvNEXXp1qxD.b3Wm8alJG.HXviUofe4nErDn.TKUAka','$2a$10$H.w3ssI9KfuvNEXXp1qxD.')" + db.do "INSERT INTO users (name,email,password_hash,password_salt) VALUES ('sync-mananger','sync-manager@user','$2a$10$H.w3ssI9KfuvNEXXp1qxD.b3Wm8alJG.HXviUofe4nErDn.TKUAka','$2a$10$H.w3ssI9KfuvNEXXp1qxD.')" + db.do "INSERT INTO groups (name, admin, description) VALUES ('admin','TRUE','')" + db.do "INSERT INTO user_groups (user_id, group_id) SELECT users.id,groups.id FROM users,groups WHERE users.email = 'admin@user' and groups.name = 'admin'" + db.do "INSERT INTO user_groups (user_id, group_id) SELECT users.id,groups.id FROM users,groups WHERE users.email = 'sync-manager@user' and groups.name = 'admin'" + + # PROJECTS + CommonProject.create_table(db, inc, post_fix) + GitBuildProject.create_table(db, post_fix) + BinaryUploadProject.create_table(db, post_fix) + db.do "CREATE TABLE group_project_accesses( + group_id INTEGER NOT NULL, + project_id INTEGER NOT NULL, + build VARCHAR(32) NOT NULL DEFAULT 'TRUE', + PRIMARY KEY ( group_id,project_id ), + CONSTRAINT fk_groups_has_projects_groups1 FOREIGN KEY ( group_id ) REFERENCES groups ( id ), + CONSTRAINT fk_groups_has_projects_projects1 FOREIGN KEY ( project_id ) REFERENCES projects ( id ) )#{post_fix}" + + # JOBS + CommonJob.create_table(db, inc, post_fix) + end + return true + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end - return result + return false end @@ -779,10 +1066,9 @@ class BuildServer return true rescue DBI::DatabaseError => e - @log.error "DB loading failed!" if not @log.nil? - @log.error e.errstr if not @log.nil? - @log.error e.backtrace.inspect if not @log.nil? - + raise BuildServerException.new("ERR950"), e.errstr + rescue DBI::InterfaceError => e + raise BuildServerException.new("ERR950"), e.errstr rescue => e @log.error e.errstr if not @log.nil? @log.error e.backtrace.inspect if not @log.nil? @@ -791,49 +1077,85 @@ class BuildServer return false end - + # name check_user_id_from_email( user_email ) + # return id string + # return -1 when id of email is not exist or DB conncetion error def check_user_id_from_email(user_email) - get_db_connection() do |db| - row = db.select_one("SELECT * FROM users WHERE email='#{user_email}'") - if not row.nil? then - return row['id'] - else - return -1 + result = -1 + begin + get_db_connection() do |db| + row = db.select_one("SELECT * FROM users WHERE email='#{user_email}'") + if not row.nil? then + result = row['id'] + end + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr end end - return -1 + return result end + # name get_email_using_user_id( user_id ) + # return email string + # return -1 when email of id is not exist or DB connection error def get_email_using_user_id(user_id) - get_db_connection() do |db| - row = db.select_one("SELECT * FROM users WHERE id='#{user_id}'") - if not row.nil? then - return row['email'] - else - return -1 + result = -1 + begin + get_db_connection() do |db| + row = db.select_one("SELECT * FROM users WHERE id='#{user_id}'") + if not row.nil? then + result = row['email'] + end + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr end end - return -1 + return result end + #name check_user_password( user_id , passwd ) + #return 1 when passwd matched + #return -1 when passwd unmatched or DB conncetion error def check_user_password(user_id, passwd) - get_db_connection() do |db| - row = db.select_one("SELECT * FROM users WHERE id='#{user_id}'") - if not row.nil? then - if row['password_hash'].eql? passwd - # if passwd is encript and that value equal password_hash then return true - return 1 - else - return row['password_hash'] == BCrypt::Engine.hash_secret(passwd, row['password_salt']) - end - else - return -1 + row = nil + begin + get_db_connection() do |db| + row = db.select_one("SELECT * FROM users WHERE id='#{user_id}'") + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr end end - return -1 + if not row.nil? then + if row['password_hash'].eql? passwd + # if passwd is encript and that value equal password_hash then return true + return 1 + else + return row['password_hash'] == BCrypt::Engine.hash_secret(passwd, row['password_salt']) + end + else + return -1 + end end @@ -919,8 +1241,18 @@ class BuildServer end if job.nil? then - get_db_connection() do |db| - job_status = db.select_one("SELECT status FROM jobs WHERE id = #{job_number}")[0] + begin + get_db_connection() do |db| + job_status = db.select_one("SELECT status FROM jobs WHERE id = #{job_number}")[0] + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end end BuildCommServer.send(conn, "=JOB_STATUS,#{job_status}") end @@ -942,32 +1274,45 @@ class BuildServer return @latest_job_id end end - - #If the 'run' file is already locked, server is already running. - #in this case return false - private - def lockServer - return FileUtil.exclusiveLock(@run_file_path) - end - - private - def printErrorMessage(errMsg) - @log.info "Server creation failed" - @log.error errMsg - - puts "Server creation failed" - puts errMsg - end + + #If the 'run' file is already locked, server is already running. + #in this case return false + private + def lockServer + return FileUtil.exclusiveLock(@run_file_path) + end + + private + def printErrorMessage(errMsg) + @log.info "Server creation failed" + @log.error errMsg + + puts "Server creation failed" + puts errMsg + end # get latest id from DB + # name get_latest_job_id_from_db + # return max id string + # return 0 when job id is not exist or DB connection error private def get_latest_job_id_from_db() job_id = nil - get_db_connection() do |db| - row = db.select_one("SELECT MAX(id) as id FROM jobs") - job_id = row['id'] - end + begin + get_db_connection() do |db| + row = db.select_one("SELECT MAX(id) as id FROM jobs") + job_id = row['id'] + end + rescue BuildServerException => e + if not @log.nil? then + @log.error e.message + end + rescue => e + if not @log.nil? then + @log.error e.errstr + end + end if not job_id.nil? then return job_id.to_s diff --git a/src/build_server/BuildServerController.rb b/src/build_server/BuildServerController.rb index 488487d..e1a132f 100644 --- a/src/build_server/BuildServerController.rb +++ b/src/build_server/BuildServerController.rb @@ -517,19 +517,20 @@ class BuildServerController end migrate_db(server) + supported_os_list = server.supported_os_list # get supported os for project. # if not specified, all supported os of the server will be used if os_string.nil? or os_string.empty? then - os_list = server.supported_os_list + os_list = supported_os_list else os_list = os_string.strip.split(",") # check OS name os_list.each do |os| - if not server.supported_os_list.include? os then + if not supported_os_list.include? os then puts "Unsupported OS name \"#{os}\" is used!" puts "Check the following supported OS list:" - server.supported_os_list.each do |s_os| + supported_os_list.each do |s_os| puts " * #{s_os}" end @@ -569,18 +570,19 @@ class BuildServerController end migrate_db(server) + supported_os_list = server.supported_os_list # get supported os for project. # if not specified, all supported os of the server will be used if os_string.nil? or os_string == "default" then - os_list = server.supported_os_list + os_list = supported_os_list else os_list = os_string.strip.split(",") # check OS name os_list.each do |os| - if not server.supported_os_list.include? os then + if not supported_os_list.include? os then puts "Unsupported OS name \"#{os}\" is used!" puts "Check the following supported OS list:" - server.supported_os_list.each do |s_os| + supported_os_list.each do |s_os| puts " * #{s_os}" end diff --git a/src/build_server/BuildServerException.rb b/src/build_server/BuildServerException.rb index 2433e92..d18143f 100644 --- a/src/build_server/BuildServerException.rb +++ b/src/build_server/BuildServerException.rb @@ -50,7 +50,9 @@ class BuildServerException < Exception "ERR205" => "Job stopped by failure of its sub job!", "ERR900" => "Cancel event received!", - "ERR901" => "Job already upload status. Cancel failed!" + "ERR901" => "Job already upload status. Cancel failed!", + + "ERR950" => "DB connection failed!!!" } def initialize(code) diff --git a/src/build_server/CommonJob.rb b/src/build_server/CommonJob.rb index 7d6376e..1fde13f 100644 --- a/src/build_server/CommonJob.rb +++ b/src/build_server/CommonJob.rb @@ -324,9 +324,20 @@ class CommonJob if not @server.has_db? then return end now = @server.db_now() - @server.get_db_connection() do |db| - db.do "INSERT INTO job_timestamps(job_id,stamp_name,stamp_time) + begin + @server.get_db_connection() do |db| + db.do "INSERT INTO job_timestamps(job_id,stamp_name,stamp_time) VALUES (#{@id},'#{name}',#{now})" + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end + end end diff --git a/src/build_server/CommonProject.rb b/src/build_server/CommonProject.rb index 12a6b0b..f8928df 100644 --- a/src/build_server/CommonProject.rb +++ b/src/build_server/CommonProject.rb @@ -81,8 +81,18 @@ class CommonProject @source_info[ver] = info # save to db - @server.get_db_connection() do |db| - save_source_info_internal(ver, info, db) + begin + @server.get_db_connection() do |db| + save_source_info_internal(ver, info, db) + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end end @@ -104,8 +114,18 @@ class CommonProject @package_info[ver].push [pkg_name, pkg_os] # save to db - @server.get_db_connection() do |db| - save_package_info_internal(ver, pkg_name, pkg_os, db) + begin + @server.get_db_connection() do |db| + save_package_info_internal(ver, pkg_name, pkg_os, db) + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end end diff --git a/src/build_server/DistributionManager.rb b/src/build_server/DistributionManager.rb index a4ed3e8..3b15bbe 100644 --- a/src/build_server/DistributionManager.rb +++ b/src/build_server/DistributionManager.rb @@ -141,12 +141,26 @@ class DistributionManager # get distribution + #name get_distribution(name) + #return PackageDistribution + #return nil when package distribution not exit or DB connection error def get_distribution(name) # conntect DB - @server.get_db_connection() do |db| - return get_distribution_internal(name, db) + result = nil + begin + @server.get_db_connection() do |db| + result = get_distribution_internal(name, db) + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - return nil + return result end @@ -156,74 +170,144 @@ class DistributionManager # add + #name add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password) + #return true when add distribution successed + #return false when distribution already exist or DB connection error def add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password) - @server.get_db_connection() do |db| - if not get_distribution_internal(name, db).nil? then - @server.log.info "The distribution \"#{name}\" already exists on server" - @server.log.error "Adding distribution failed!" - return false - end - new_dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, "OPEN") - new_dist.save(db) + result = false + begin + @server.get_db_connection() do |db| + if not get_distribution_internal(name, db).nil? then + @server.log.info "The distribution \"#{name}\" already exists on server" + @server.log.error "Adding distribution failed!" + else + new_dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, "OPEN") + new_dist.save(db) + result = true + @server.log.info "Added a new distribution \"#{name}\"" + end + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - @server.log.info "Added a new distribution \"#{name}\"" - return true + return result end # remove + #name remove_distribution(name) + #return ture when remove distribution successed + #return false when distribution not exist or DB connection error or DB conncetion error def remove_distribution(name) - - result = @server.get_db_connection() do |db| - dist = get_distribution_internal(name, db) - if dist.nil? then - @server.log.error "The distribution \"#{name}\" does not exists on server" - @server.log.error "Removing distribution failed!" - return false + result = false + begin + @server.get_db_connection() do |db| + dist = get_distribution_internal(name, db) + if dist.nil? then + @server.log.error "The distribution \"#{name}\" does not exists on server" + @server.log.error "Removing distribution failed!" + else + dist.unload(db) + result = true + @server.log.info "Removed the distribution \"#{name}\"" + end + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr end - dist.unload(db) end - @server.log.info "Removed the distribution \"#{name}\"" return result end + #name get_first_distribution() + #return PackageDistribution + #return nil when no distribution exist or DB connection error def get_first_distribution() - @server.get_db_connection() do |db| - return PackageDistribution.load_first(db) + result = nil + begin + @server.get_db_connection() do |db| + result = PackageDistribution.load_first(db) + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - return nil + return result end + #name get_all_distributions() + #return PackageDistribution list + #return [] when no PackageDistribution exist or DB connection error def get_all_distributions() - @server.get_db_connection() do |db| - return PackageDistribution.load_all(db) + result = [] + begin + @server.get_db_connection() do |db| + result = PackageDistribution.load_all(db) + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - return [] + return result end + #name set_distribution_lock(name, value=true) + #return true when distribution lock setted + #return false when distribution lock not exist or DB connection error def set_distribution_lock(name, value=true) - result = @server.get_db_connection() do |db| - # check already exist - dist = get_distribution_internal(name, db) - if dist.nil? then return false end - - dist.status = (value)? "CLOSE" : "OPEN" - dist.save(db) - end - if result then + result = false + begin + @server.get_db_connection() do |db| + # check already exist + dist = get_distribution_internal(name, db) + if dist.nil? then return false end + + dist.status = (value)? "CLOSE" : "OPEN" + dist.save(db) + end if value then @server.log.info "The distribution \"#{name}\" is locked!" else @server.log.info "The distribution \"#{name}\" is unlocked!" end + result = true + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - + return result end diff --git a/src/build_server/JobManager.rb b/src/build_server/JobManager.rb index cc21616..a134040 100644 --- a/src/build_server/JobManager.rb +++ b/src/build_server/JobManager.rb @@ -53,16 +53,37 @@ class JobManager end def cancel_broken_status - @server.get_db_connection() do |db| - db.do "UPDATE jobs SET status = 'CANCELED' WHERE status != 'FINISHED' and status != 'ERROR' and status != 'CANCELED'" + begin + @server.get_db_connection() do |db| + db.do "UPDATE jobs SET status = 'CANCELED' WHERE status != 'FINISHED' and status != 'ERROR' and status != 'CANCELED'" + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end end def max_working_jobs + result = nil if @server.has_db? then result = nil - @server.get_db_connection() do |db| - result = db.select_one("SELECT value FROM server_configs WHERE property = 'max_working_jobs'")[0] + begin + @server.get_db_connection() do |db| + result = db.select_one("SELECT value FROM server_configs WHERE property = 'max_working_jobs'")[0] + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end @max_build_jobs = result.to_i if not result.nil? end @@ -77,9 +98,19 @@ class JobManager end if @server.has_db? then - @server.get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{@max_build_jobs}' WHERE property = 'max_working_jobs'" - db.do "UPDATE server_configs SET value = '#{@max_jobs}' WHERE property = 'max_jobs'" + begin + @server.get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{@max_build_jobs}' WHERE property = 'max_working_jobs'" + db.do "UPDATE server_configs SET value = '#{@max_jobs}' WHERE property = 'max_jobs'" + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end end end @@ -88,8 +119,18 @@ class JobManager def get_max_jobs() if @server.has_db? then result = nil - @server.get_db_connection() do |db| - result = db.select_one("SELECT value FROM server_configs WHERE property = 'max_jobs'")[0] + begin + @server.get_db_connection() do |db| + result = db.select_one("SELECT value FROM server_configs WHERE property = 'max_jobs'")[0] + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end @max_jobs = result.to_i if not result.nil? end @@ -110,8 +151,18 @@ class JobManager end if @server.has_db? then - @server.get_db_connection() do |db| - db.do "UPDATE server_configs SET value = '#{@max_jobs}' WHERE property = 'max_jobs'" + begin + @server.get_db_connection() do |db| + db.do "UPDATE server_configs SET value = '#{@max_jobs}' WHERE property = 'max_jobs'" + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end end end @@ -137,6 +188,9 @@ class JobManager end + #name is_user_accessable(job,user_id) + #return true when all including job is accessable + #return false when denyed or DB connection error def is_user_accessable(job,user_id) if job.type == "MULTIBUILD" then job.get_sub_jobs().each do |subjob| @@ -146,11 +200,21 @@ class JobManager end else result = nil - @server.get_db_connection() do |db| - result = db.select_one "SELECT user_groups.group_id FROM user_groups,group_project_accesses + begin + @server.get_db_connection() do |db| + result = db.select_one "SELECT user_groups.group_id FROM user_groups,group_project_accesses WHERE user_groups.group_id = group_project_accesses.group_id and group_project_accesses.project_id = #{job.get_project.get_project_id} and user_groups.user_id = #{user_id}" + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end return (not result.nil?) end @@ -163,8 +227,18 @@ class JobManager def set_remote(job, rserver) job.set_remote_job(rserver) - @server.get_db_connection() do |db| - db.do "UPDATE jobs SET remote_build_server_id = '#{rserver.id}' WHERE id = '#{job.id}'" + begin + @server.get_db_connection() do |db| + db.do "UPDATE jobs SET remote_build_server_id = '#{rserver.id}' WHERE id = '#{job.id}'" + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end end @@ -566,14 +640,29 @@ class JobManager end + #name save_job_status(job) + #return true when save successed or transferred + #return false when DB error occurred def save_job_status(job) # if transferred job, no need to save if job.is_transferred? then return true end - result = @server.get_db_connection() do |db| - job.save(db) - job.sub_jobs.each do |j| - j.save(db) + result = false + begin + @server.get_db_connection() do |db| + job.save(db) + job.sub_jobs.each do |j| + j.save(db) + end + end + result = true + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr end end @@ -585,9 +674,9 @@ class JobManager if job.id == job_id then return job end - job.sub_jobs.each do |job| - if job.id == job_id then - return job + job.sub_jobs.each do |sjob| + if sjob.id == job_id then + return sjob end end end diff --git a/src/build_server/MultiBuildJob.rb b/src/build_server/MultiBuildJob.rb index da32078..44a8bba 100644 --- a/src/build_server/MultiBuildJob.rb +++ b/src/build_server/MultiBuildJob.rb @@ -175,10 +175,11 @@ class MultiBuildJob < CommonJob # set up pkgsvr_client first_project = @sub_jobs[0].get_project() - @pkgsvr_url = @server.distmgr.get_distribution(first_project.dist_name).pkgsvr_url - @pkgsvr_ip = @server.distmgr.get_distribution(first_project.dist_name).pkgsvr_ip - @pkgsvr_port = @server.distmgr.get_distribution(first_project.dist_name).pkgsvr_port - @pkgsvr_password = @server.distmgr.get_distribution(first_project.dist_name).pkgsvr_password + dist = @server.distmgr.get_distribution(first_project.dist_name) + @pkgsvr_url = dist.pkgsvr_url + @pkgsvr_ip = dist.pkgsvr_ip + @pkgsvr_port = dist.pkgsvr_port + @pkgsvr_password = dist.pkgsvr_password @pkgsvr_client = Client.create(@pkgsvr_url, @job_working_dir, @log) if @pkgsvr_client.nil? then raise BuildServerException.new("ERR023") diff --git a/src/build_server/ProjectManager.rb b/src/build_server/ProjectManager.rb index 27fbb85..aab83f4 100644 --- a/src/build_server/ProjectManager.rb +++ b/src/build_server/ProjectManager.rb @@ -54,144 +54,248 @@ class ProjectManager # get_project of the name + # return GitBuildProject or BinaryUploadProject + # return nil when project not exist or DB connection error def get_project(name, dist_name) + begin @server.get_db_connection() do |db| return get_project_internal(name, dist_name, db) end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end + end return nil end + #name get_all_projects_summary + #return project hash list + #return [] when project not exists or DB connection error def get_all_projects_summary() - @server.get_db_connection() do |db| - return CommonProject.get_all_project_rows(db) + result = [] + begin + @server.get_db_connection() do |db| + result = CommonProject.get_all_project_rows(db) + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - return [] + return result end + #name get_all_project + #return project list + #return [] when DB error occurred def get_all_projects() result = [] - - @server.get_db_connection() do |db| - rows = CommonProject.get_all_project_rows(db) - rows.each do |row| - if row['ptype'] == "GIT" then - prj = GitBuildProject.load(row['name'], row['dist_name'], @server, db) - else - prj = BinaryUploadProject.load(row['name'], row['dist_name'], @server, db) + begin + @server.get_db_connection() do |db| + rows = CommonProject.get_all_project_rows(db) + rows.each do |row| + if row['ptype'] == "GIT" then + prj = GitBuildProject.load(row['name'], row['dist_name'], @server, db) + else + prj = BinaryUploadProject.load(row['name'], row['dist_name'], @server, db) + end + if not prj.nil? then result.push prj end end - if not prj.nil? then result.push prj end end - return result + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end return result end + # name add_git_project( name, repos, branch, os_list, dist_name) + # return true when add git project successed + # return false when git project already exist or DB connection error def add_git_project(name, repos, branch, os_list, dist_name) new_prj = nil - result = @server.get_db_connection() do |db| - prj = get_project_internal(name, dist_name, db) - if not prj.nil? then - @server.log.error "Adding project failed!: the project \"#{name}\"(#{dist_name}) already exists" - return false + result = false + begin + @server.get_db_connection() do |db| + prj = get_project_internal(name, dist_name, db) + if prj.nil? then + # create new object + new_prj = GitBuildProject.new(name, @server, os_list, dist_name, repos, branch) + + # save to db + new_prj.save(db) + result = true + + # authorize admin to access + @server.qualify_admin_to_access(new_prj.get_project_id()) + @server.log.info "Added new GIT project \"#{name}\"(#{dist_name})" + else + @server.log.error "Adding project failed!: the project \"#{name}\"(#{dist_name}) already exists" + end + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr end - - # create new object - new_prj = GitBuildProject.new(name, @server, os_list, dist_name, repos, branch) - - # save to db - new_prj.save(db) - end - - if result then - # authorize admin to access - @server.qualify_admin_to_access(new_prj.get_project_id()) - @server.log.info "Added new GIT project \"#{name}\"(#{dist_name})" end return result end + #name add_binary_project(name, pkg_name, os_list, dist_name) + #return true when add binary project successed + #return false when project already exist ro DB connection error def add_binary_project(name, pkg_name, os_list, dist_name) new_prj = nil - result = @server.get_db_connection() do |db| - prj = get_project_internal(name, dist_name, db) - if not prj.nil? then - @server.log.error "Adding project failed!: the project \"#{name}\"(#{dist_name}) already exists" - return false + result = false + begin + result = @server.get_db_connection() do |db| + prj = get_project_internal(name, dist_name, db) + if prj.nil? then + # create new object + new_prj = BinaryUploadProject.new(name, @server, os_list, dist_name, pkg_name) + + # save to db + new_prj.save(db) + + # init + new_prj.init() + + # authorize admin to access + @server.qualify_admin_to_access(new_prj.get_project_id()) + @server.log.info "Added new BINARY project \"#{name}\"(#{dist_name})" + result = true + else + @server.log.error "Adding project failed!: the project \"#{name}\"(#{dist_name}) already exists" + end + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr end - - # create new object - new_prj = BinaryUploadProject.new(name, @server, os_list, dist_name, pkg_name) - - # save to db - new_prj.save(db) - - # init - new_prj.init() - end - - if result then - # authorize admin to access - @server.qualify_admin_to_access(new_prj.get_project_id()) - @server.log.info "Added new BINARY project \"#{name}\"(#{dist_name})" end return result end + #name remove_project( name, dist_name ) + #return true when add binary project successed + #return false when project not exist or DB connection error def remove_project( name, dist_name ) + result = false + begin + @server.get_db_connection() do |db| + prj = get_project_internal(name, dist_name, db) + if prj.nil? then + @server.log.error "The project \"#{name}\"(#{dist_name}) does not exists on server" + @server.log.error "Removing project failed!" + else + # unload from DB + prj.unload(db) - result = @server.get_db_connection() do |db| - prj = get_project_internal(name, dist_name, db) - if prj.nil? then - @server.log.error "The project \"#{name}\"(#{dist_name}) does not exists on server" - @server.log.error "Removing project failed!" - return false - end - # unload from DB - prj.unload(db) + # remove project directory + FileUtils.rm_rf prj.path - # remove project directory - FileUtils.rm_rf prj.path + @server.log.info "Removed the project \"#{name}\"(#{dist_name})" + result = true + end + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - if result then - @server.log.info "Removed the project \"#{name}\"(#{dist_name})" - end return result end public + #name get_project_accessable(project_name, dist_name, user_id) + #return true when project accessable + #return false when project not accessable or DB connection error def get_project_accessable(project_name, dist_name, user_id) prj = get_project(project_name, dist_name) - result = nil - @server.get_db_connection() do |db| - result = db.select_one "SELECT user_groups.group_id FROM user_groups,group_project_accesses + result = false + begin + data = nil + @server.get_db_connection() do |db| + data = db.select_one "SELECT user_groups.group_id FROM user_groups,group_project_accesses WHERE user_groups.user_id = #{user_id} and user_groups.group_id = group_project_accesses.group_id and group_project_accesses.project_id = #{prj.get_project_id} and group_project_accesses.build = 'TRUE'" + end + result = (not data.nil?) + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - return (not result.nil?) + return result end + #name get_project_pkg_name_accessable(pkg_name, dist_name, user_id) + #return true when project accessable + #return false when project not accessable or DB connection error def get_project_pkg_name_accessable(pkg_name, dist_name, user_id) - result = nil + result = false prj = get_project_from_package_name(pkg_name, dist_name) - @server.get_db_connection() do |db| - result = db.select_one "SELECT user_groups.group_id FROM user_groups,group_project_accesses + begin + data = nil + @server.get_db_connection() do |db| + data = db.select_one "SELECT user_groups.group_id FROM user_groups,group_project_accesses WHERE user_groups.user_id = #{user_id} and user_groups.group_id = group_project_accesses.group_id and group_project_accesses.project_id = #{prj.get_project_id} and group_project_accesses.build = 'TRUE'" + end + result = (not data.nil?) + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - return (not result.nil?) + return result end # create new job for project @@ -243,11 +347,26 @@ class ProjectManager end + #name get_project_from_package_name(pkg_name, dist_name) + #result project + #result nil when project not exist or DB connection error def get_project_from_package_name(pkg_name, dist_name) - @server.get_db_connection() do |db| - return get_project_from_pkg_name_internal(pkg_name,dist_name,db) + result = nil + begin + @server.get_db_connection() do |db| + result = get_project_from_pkg_name_internal(pkg_name,dist_name,db) + end + rescue BuildServerException => e + if not @server.log.nil? then + @server.log.error e.message + end + rescue => e + if not @server.log.nil? then + @server.log.error e.errstr + end end - return nil + + return result end diff --git a/src/build_server/RegisterPackageJob.rb b/src/build_server/RegisterPackageJob.rb index 77ac1aa..e0b0a41 100644 --- a/src/build_server/RegisterPackageJob.rb +++ b/src/build_server/RegisterPackageJob.rb @@ -58,16 +58,14 @@ class RegisterPackageJob < CommonJob @host_os = Utils::HOST_OS if not project.nil? then - @pkgsvr_url = @server.distmgr.get_distribution(project.dist_name).pkgsvr_url - @pkgsvr_ip = @server.distmgr.get_distribution(project.dist_name).pkgsvr_ip - @pkgsvr_port = @server.distmgr.get_distribution(project.dist_name).pkgsvr_port - @pkgsvr_password = @server.distmgr.get_distribution(project.dist_name).pkgsvr_password + dist = @server.distmgr.get_distribution(project.dist_name) else - @pkgsvr_url = @server.distmgr.get_distribution(dist_name).pkgsvr_url - @pkgsvr_ip = @server.distmgr.get_distribution(dist_name).pkgsvr_ip - @pkgsvr_port = @server.distmgr.get_distribution(dist_name).pkgsvr_port - @pkgsvr_password = @server.distmgr.get_distribution(dist_name).pkgsvr_password + dist = @server.distmgr.get_distribution(dist_name) end + @pkgsvr_url = dist.pkgsvr_url + @pkgsvr_ip = dist.pkgsvr_ip + @pkgsvr_port = dist.pkgsvr_port + @pkgsvr_password = dist.pkgsvr_password @local_path=local_path @file_path = nil diff --git a/src/build_server/RemoteBuildServer.rb b/src/build_server/RemoteBuildServer.rb index df8ccbb..908ec6e 100644 --- a/src/build_server/RemoteBuildServer.rb +++ b/src/build_server/RemoteBuildServer.rb @@ -110,16 +110,25 @@ class RemoteBuildServer def update_db() - @parent.get_db_connection() do |db| - working_job_count = @working_jobs.count - waiting_job_count = @waiting_jobs.count - - db.do "UPDATE remote_build_servers SET + working_job_count = @working_jobs.count + waiting_job_count = @waiting_jobs.count + begin + @parent.get_db_connection() do |db| + db.do "UPDATE remote_build_servers SET status = '#{@status}', supported_os_id = (SELECT supported_os.id FROM supported_os WHERE supported_os.name = '#{@host_os}'), max_job_count = #{@max_working_jobs}, working_job_count = #{working_job_count}, waiting_job_count = #{waiting_job_count} WHERE id = #{@id}" + end + rescue BuildServerException => e + if not @parent.log.nil? then + @parent.log.error e.message + end + rescue => e + if not @parent.log.nil? then + @parent.log.error e.errstr + end end end diff --git a/src/build_server/SocketJobRequestListener.rb b/src/build_server/SocketJobRequestListener.rb index 11bcfa4..7622c45 100644 --- a/src/build_server/SocketJobRequestListener.rb +++ b/src/build_server/SocketJobRequestListener.rb @@ -409,16 +409,6 @@ class SocketJobRequestListener case job.type when "BUILD" - #if status == "PENDING" then - # if job.pending_ancestor.nil? then - # ids = "/" - # else - # ids = job.pending_ancestor.id - # end - # BuildCommServer.send(req,"#{status}:#{ids},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}") - #else - # BuildCommServer.send(req,"#{status},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}") - #end BuildCommServer.send(req,"#{status},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}") when "REGISTER" if job.pkg_type == "BINARY" and not job.get_project().nil? then @@ -953,34 +943,35 @@ class SocketJobRequestListener def check_supported_os(os_list, req) # check if supported os list contain at least one OS - if @parent_server.supported_os_list.empty? then + host_supported_os_list = @parent_server.supported_os_list + if host_supported_os_list.empty? then raise BuildServerException.new("ERR007"), "" end result = [] os_list.each do |os| if os == "all" or os == "*" then - result = result + @parent_server.supported_os_list + result = result + host_supported_os_list elsif os == "default" then - os = @parent_server.supported_os_list[0] + os = host_supported_os_list[0] result.push os @log.info "The default OS \"#{os}\" is used as target OS" elsif os.include? "*" then reg_os = os.gsub("*","[a-zA-Z0-9.]*") - @parent_server.supported_os_list.each do |svr_os| + host_supported_os_list.each do |svr_os| matches = svr_os.match("#{reg_os}") if not matches.nil? and matches.size == 1 and matches[0] == svr_os then result.push svr_os end end - elsif @parent_server.supported_os_list.include?(os) then + elsif host_supported_os_list.include?(os) then result.push os else msgs = "#{os}... Use a name in (" + - @parent_server.supported_os_list.join("|") + ")" + host_supported_os_list.join("|") + ")" raise BuildServerException.new("ERR003"),msgs end end diff --git a/test/upgrade/buildsvr1.init b/test/upgrade/buildsvr1.init index 0578b61..289efef 100755 --- a/test/upgrade/buildsvr1.init +++ b/test/upgrade/buildsvr1.init @@ -22,7 +22,9 @@ dibs1/build-svr remove -n testserver3 mkdir buildsvr01 cd buildsvr01 ${RUBY} ../dibs1/build-svr create -n testserver3 -${RUBY} ../dibs1/build-svr migrate -n testserver3 +echo "DROP DATABASE testserver3;" > a +mysql -u root -p --password=$DB_PASSWD -h localhost < a +${RUBY} ../dibs1/build-svr migrate -n testserver3 --dsn Mysql:testserver3:localhost --dbuser root --dbpassword $DB_PASSWD cd .. ${RUBY} dibs1/build-svr add-dist -n testserver3 -D unstable -u $CURDIR/pkgsvr01/unstable -d 127.0.0.1:3333 diff --git a/test/upgrade/buildsvr2.init b/test/upgrade/buildsvr2.init index ac5ccf7..a573822 100755 --- a/test/upgrade/buildsvr2.init +++ b/test/upgrade/buildsvr2.init @@ -15,7 +15,9 @@ cp -r ../../upgrade dibs2/ mkdir buildsvr02 cd buildsvr02 ${RUBY} ../dibs2/build-svr create -n testserver4 -${RUBY} ../dibs2/build-svr migrate -n testserver4 +echo "DROP DATABASE testserver4;" > a +mysql -u root -p --password=$DB_PASSWD -h localhost < a +${RUBY} ../dibs2/build-svr migrate -n testserver4 --dsn Mysql:testserverr4:localhost --dbuser root --dbpassword $DB_PASSWD cd .. ${RUBY} dibs2/build-svr add-dist -n testserver4 -D unstable -u `pwd`/pkgsvr01/unstable -d 127.0.0.1:3333