From: donghee yang Date: Mon, 22 Oct 2012 06:23:05 +0000 (+0900) Subject: [Title] Added "lock-dist", "unlock-dist" sub-commands in "build-svr" X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=06a003e353b5ffc75da619d0061a43a224df959e;p=sdk%2Ftools%2Fsdk-build.git [Title] Added "lock-dist", "unlock-dist" sub-commands in "build-svr" --- diff --git a/build-svr b/build-svr index c839bf1..5e1bb74 100755 --- a/build-svr +++ b/build-svr @@ -164,6 +164,12 @@ begin when "remove-dist" BuildServerController.remove_distribution( option[:name], option[:dist] ) + when "lock-dist" + BuildServerController.lock_distribution( option[:name], option[:dist] ) + + when "unlock-dist" + BuildServerController.unlock_distribution( option[:name], option[:dist] ) + when "add-sync" BuildServerController.add_sync_package_server( option[:name], option[:url], option[:dist] ) diff --git a/src/build_server/BuildServer.rb b/src/build_server/BuildServer.rb index b615dc5..7d0ee19 100644 --- a/src/build_server/BuildServer.rb +++ b/src/build_server/BuildServer.rb @@ -440,8 +440,6 @@ class BuildServer def save_db() result = true - # distribution - @distmgr.save_db() begin # open DB @@ -481,8 +479,6 @@ class BuildServer def load_db() result = true - # distribution - @distmgr.load_db() begin # open DB diff --git a/src/build_server/BuildServerController.rb b/src/build_server/BuildServerController.rb index 033d247..6fd6e70 100644 --- a/src/build_server/BuildServerController.rb +++ b/src/build_server/BuildServerController.rb @@ -348,13 +348,8 @@ class BuildServerController # add if server.distmgr.add_distribution( dist_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port ) then - if server.save_db() then - puts "Distribution is added successfully!" - return true - else - puts "Add distribution to DB failed!" - return false - end + puts "Distribution is added successfully!" + return true else puts "Distribution already exists in list!" return false @@ -369,13 +364,8 @@ class BuildServerController # remove if server.distmgr.remove_distribution( dist_name ) then - if server.save_db() then - puts "Distribution is removed successfully!" - return true - else - puts "Remove distribution from DB is failed!" - return false - end + puts "Distribution is removed successfully!" + return true else puts "Distribution does not exist in list!" return false @@ -383,6 +373,38 @@ class BuildServerController end + # lock distribution + def self.lock_distribution(id, dist_name) + # get server + server = get_server(id) + + # remove + if server.distmgr.set_distribution_lock(dist_name, true) then + puts "Distribution is locked!" + return true + else + puts "Locking distribution failed!" + return false + end + end + + + # unlock distribution + def self.unlock_distribution(id, dist_name) + # get server + server = get_server(id) + + # remove + if server.distmgr.set_distribution_lock(dist_name, false) then + puts "Distribution is unlocked!" + return true + else + puts "Unlocking distribution failed!" + return false + end + end + + # add remote package server def self.add_sync_package_server(id, url, dist_name) server = get_server(id) diff --git a/src/build_server/BuildServerOptionParser.rb b/src/build_server/BuildServerOptionParser.rb index 8cdd086..83c496d 100644 --- a/src/build_server/BuildServerOptionParser.rb +++ b/src/build_server/BuildServerOptionParser.rb @@ -42,6 +42,8 @@ class BuildServerUsage REMOVE_OS="build-svr remove-os -n -o " ADD_DIST= "build-svr add-dist -n -D -u -d " REMOVE_DIST="build-svr remove-dist -n -D " + LOCK_DIST="build-svr lock-dist -n -D " + UNLOCK_DIST="build-svr unlock-dist -n -D " ADD_SYNC="build-svr add-sync -n -u [--dist ]" REMOVE_SYNC="build-svr remove-sync -n -u [--dist ]" ADD_PRJ="build-svr add-prj -n -N (-g -b |-P ) [-w ] [-o ] [--dist ]" @@ -120,6 +122,18 @@ def option_error_check( options ) raise ArgumentError, "Usage: " + BuildServerUsage::REMOVE_DIST end + when "lock-dist" + if options[:name].nil? or options[:name].empty? or + options[:dist].nil? or options[:dist].empty? then + raise ArgumentError, "Usage: " + BuildServerUsage::LOCK_DIST + end + + when "unlock-dist" + if options[:name].nil? or options[:name].empty? or + options[:dist].nil? or options[:dist].empty? then + raise ArgumentError, "Usage: " + BuildServerUsage::UNLOCK_DIST + end + when "add-sync" if options[:name].nil? or options[:name].empty? or (options[:url].nil? or options[:url].empty?) then @@ -194,6 +208,8 @@ def option_parse + "\t" + "remove-os Remove supported OS." + "\n" \ + "\t" + "add-dist Add distribution." + "\n" \ + "\t" + "remove-dist Remove distribution." + "\n" \ + + "\t" + "lock-dist Lock distribution." + "\n" \ + + "\t" + "unlock-dist Unlock distribution." + "\n" \ + "\t" + "add-sync Add package repository URL to synchronize with." + "\n" \ + "\t" + "remove-sync Remove package repository URL." + "\n" \ + "\t" + "add-prj Add project to build." + "\n" \ @@ -215,6 +231,8 @@ def option_parse + "\t" + BuildServerUsage::REMOVE_OS + "\n" \ + "\t" + BuildServerUsage::ADD_DIST + "\n" \ + "\t" + BuildServerUsage::REMOVE_DIST + "\n" \ + + "\t" + BuildServerUsage::LOCK_DIST + "\n" \ + + "\t" + BuildServerUsage::UNLOCK_DIST + "\n" \ + "\t" + BuildServerUsage::ADD_SYNC + "\n" \ + "\t" + BuildServerUsage::REMOVE_SYNC + "\n" \ + "\t" + BuildServerUsage::ADD_PRJ + "\n" \ @@ -322,6 +340,7 @@ def option_parse cmd.eql? "add-svr" or cmd.eql? "remove-svr" or cmd.eql? "add-os" or cmd.eql? "remove-os" or cmd.eql? "add-dist" or cmd.eql? "remove-dist" or + cmd.eql? "lock-dist" or cmd.eql? "unlock-dist" or cmd.eql? "add-sync" or cmd.eql? "remove-sync" or cmd.eql? "add-prj" or cmd.eql? "remove-prj" or cmd.eql? "fullbuild" or cmd.eql? "register" or diff --git a/src/build_server/DistributionManager.rb b/src/build_server/DistributionManager.rb index 70cef6f..b364f45 100644 --- a/src/build_server/DistributionManager.rb +++ b/src/build_server/DistributionManager.rb @@ -38,52 +38,113 @@ require "packageServer.rb" class PackageDistribution attr_accessor :name, :pkgsvr_url, :pkgsvr_ip, :pkgsvr_port, :status - def initialize( name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, server ) - @server = server + def initialize( name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, status ) @name = name @pkgsvr_url = pkgsvr_url @pkgsvr_ip = pkgsvr_ip @pkgsvr_port = pkgsvr_port - @status = "OPEN" + @status = status + end + + + def self.load(name, db) + row = db.select_one("SELECT * FROM distributions WHERE name='#{name}'") + if not row.nil? then + return load_row(row) + end + + return nil + end + + + def self.unload(name, db) + db.do("DELETE FROM distributions WHERE name='#{name}'") + end + + + def self.load_all(db) + result = [] + rows = db.select_all("SELECT * FROM distributions") + rows.each do |row| + result.push load_row(row) + end + + return result + end + + + def self.load_first(db) + row = db.select_one("SELECT * FROM distributions") + if not row.nil? then + return load_row(row) + end + + return nil + end + + + def self.load_row(row) + pkgsvr_ip = row['pkgsvr_addr'].split(":")[0] + pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i + + return new(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port, row['status']) + end + + + def save(db) + dist_addr = @pkgsvr_ip + ":" + @pkgsvr_port.to_s + db.do "INSERT OR REPLACE INTO distributions VALUES ('#{@name}','#{@pkgsvr_url}','#{dist_addr}','#{@status}')" end end class DistributionManager - attr_accessor :distributions # initialize def initialize( server ) @server = server - @distributions = [] end # get default distribution def get_default_distribution_name() - if @distributions.count > 0 then - return @distributions[0].name + dist = get_first_distribution() + if not dist.nil? then + return dist.name + else + return nil end - - return nil end def get_default_pkgsvr_url() - if @distributions.count > 0 then - return @distributions[0].pkgsvr_url + dist = get_first_distribution() + if not dist.nil? then + return dist.pkgsvr_url + else + return "" end - - return "" end # get distribution def get_distribution(name) - @distributions.each do |d| - if d.name == name then - return d + # conntect DB + begin + db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd) + begin + db.do('ALTER TABLE distributions ADD COLUMN status VARCHAR(32) DEFAULT "OPEN"') + rescue DBI::DatabaseError => e + # do nothing end + + return PackageDistribution.load(name, db) + + rescue DBI::DatabaseError => e + @server.log.error "DB loading failed!" + @server.log.error e.errstr + ensure + db.disconnect if db end return nil @@ -98,15 +159,28 @@ class DistributionManager # add def add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port) - load_db() + # check already exist if distribution_exist?(name) then @server.log.info "The distribution \"#{name}\" already exists on server" @server.log.error "Adding distribution failed!" return false end - add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, "OPEN") - save_db() + begin + # open DB + db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd) + new_dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, "OPEN") + new_dist.save(db) + + rescue DBI::DatabaseError => e + @server.log.error "DB update failed!" + @server.log.error e.errstr + return false + + ensure + db.disconnect if db + end + @server.log.info "Added a new distribution \"#{name}\"" return true end @@ -120,85 +194,99 @@ class DistributionManager return false end - remove_distribution_internal(name) + begin + # open DB + db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd) + PackageDistribution.unload(name, db) + + rescue DBI::DatabaseError => e + @server.log.error "DB update failed!" + @server.log.error e.errstr + return false + + ensure + db.disconnect if db + end + @server.log.info "Removed the distribution \"#{name}\"" return true end - # save - def save_db() - result = true + def get_first_distribution() begin # open DB db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd) - - # distributions - db.do "DELETE FROM distributions" - @distributions.each do |dist| - dist_addr = dist.pkgsvr_ip + ":" + dist.pkgsvr_port.to_s - db.do "INSERT INTO distributions VALUES('#{dist.name}','#{dist.pkgsvr_url}','#{dist_addr}','#{dist.status}')" + begin + db.do('ALTER TABLE distributions ADD COLUMN status VARCHAR(32) DEFAULT "OPEN"') + rescue DBI::DatabaseError => e + # do nothing end + + return PackageDistribution.load_first(db) + rescue DBI::DatabaseError => e - puts "DB update failed!" - puts e.errstr - result = false + @server.log.error "DB loading failed!" + @server.log.error e.errstr ensure db.disconnect if db end - return result - end + return nil + end - # load - def load_db() - result = true - @distributions = [] + def get_all_distributions() begin # open DB db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd) - begin db.do('ALTER TABLE distributions ADD COLUMN status VARCHAR(32) DEFAULT "OPEN"') rescue DBI::DatabaseError => e # do nothing end + return PackageDistribution.load_all(db) - # distributions - rs = db.execute "SELECT * FROM distributions" - rs.fetch_hash do |row| - pkgsvr_ip = row['pkgsvr_addr'].split(":")[0] - pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i - add_distribution_internal(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port,row['status']) - end - rs.finish rescue DBI::DatabaseError => e - puts "DB loading failed!" - puts e.errstr - result = false + @server.log.error "DB loading failed!" + @server.log.error e.errstr ensure - rs.finish if not rs.finished? db.disconnect if db end - return result + + return [] end - def add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, status) - dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, @server) - dist.status = status - @distributions.push dist - end + def set_distribution_lock(name, value=true) + # check already exist + dist = get_distribution(name) + if dist.nil? then + return false + end + begin + # open DB + db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd) + dist.status = value ? "LOCKED" : "OPEN" + dist.save(db) - def remove_distribution_internal(name) - @distributions.delete get_distribution(name) - end + rescue DBI::DatabaseError => e + @server.log.error "DB update failed!" + @server.log.error e.errstr + return false + ensure + db.disconnect if db + end + + if value then + @server.log.info "The distribution \"#{name}\" is locked!" + else + @server.log.info "The distribution \"#{name}\" is unlocked!" + end - def get_all_distributions() - return @distributions + return true end #END diff --git a/test/build-server.multi_dist1/build-svr2-09.testcase b/test/build-server.multi_dist1/build-svr2-09.testcase new file mode 100644 index 0000000..7c4a92e --- /dev/null +++ b/test/build-server.multi_dist1/build-svr2-09.testcase @@ -0,0 +1,12 @@ +#PRE-EXEC +#EXEC +../../build-svr lock-dist -n testserver3 -D unstable +../../build-svr lock-dist -n testserver3 -D unstable2 +../../build-svr unlock-dist -n testserver3 -D unstable +../../build-svr unlock-dist -n testserver3 -D unstable2 +#POST-EXEC +#EXPECT +Distribution is locked! +Locking distribution failed! +Distribution is unlocked! +Unlocking distribution failed! diff --git a/test/build-server.multi_dist1/testsuite b/test/build-server.multi_dist1/testsuite index c1e8c24..3f955a6 100644 --- a/test/build-server.multi_dist1/testsuite +++ b/test/build-server.multi_dist1/testsuite @@ -6,3 +6,4 @@ build-svr2-05.testcase build-svr2-06.testcase build-svr2-07.testcase build-svr2-08.testcase +build-svr2-09.testcase diff --git a/test/build-server.multi_dist2/build-svr3-05.testcase b/test/build-server.multi_dist2/build-svr3-05.testcase new file mode 100644 index 0000000..a2b8660 --- /dev/null +++ b/test/build-server.multi_dist2/build-svr3-05.testcase @@ -0,0 +1,46 @@ +#PRE-EXEC +../../pkg-svr remove-pkg -n pkgsvr01 -d unstable2 -P b +#EXEC +echo "==" +../../build-svr lock-dist -n testserver3 -D unstable2 +echo "==" +../../build-cli build -N testb -d 127.0.0.1:2223 -D unstable2 +echo "==" +../../build-svr unlock-dist -n testserver3 -D unstable2 +echo "==" +../../build-cli build -N testb -d 127.0.0.1:2223 -D unstable2 +#POST-EXEC +#EXPECT +== +Distribution is locked! +== +Error: The distribution "unstable2" is locked! +== +Distribution is unlocked! +== +Info: Added new job +Info: Initializing job... +Info: Checking package version ... +Info: Invoking a thread for building Job +Info: New Job +Info: Checking build dependency ... +Info: Checking install dependency ... +Info: Started to build this job... +Info: JobBuilder +Info: Downloding client is initializing... +Info: Installing dependent packages... +Info: * a +Info: Downloading dependent source packages... +Info: Make clean... +Info: Make build... +Info: Make install... +Info: Generatiing pkginfo.manifest... +Info: Zipping... +Info: Creating package file ... b_0.0.1_ubuntu-32.zip +Info: Checking reverse build dependency ... +Info: Uploading ... +Info: Upload succeeded. Sync local pkg-server again... +Info: Snapshot: +Info: Job is completed! +Info: Job is FINISHED successfully! +Info: Updating the source info for project "testb" diff --git a/test/build-server.multi_dist2/testsuite b/test/build-server.multi_dist2/testsuite index 0b3f6f2..9f25506 100644 --- a/test/build-server.multi_dist2/testsuite +++ b/test/build-server.multi_dist2/testsuite @@ -2,3 +2,4 @@ build-svr3-01.testcase build-svr3-02.testcase build-svr3-03.testcase build-svr3-04.testcase +build-svr3-05.testcase