[Title] Added "lock-dist", "unlock-dist" sub-commands in "build-svr"
authordonghee yang <donghee.yang@samsung.com>
Mon, 22 Oct 2012 06:23:05 +0000 (15:23 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Mon, 22 Oct 2012 06:29:14 +0000 (15:29 +0900)
build-svr
src/build_server/BuildServer.rb
src/build_server/BuildServerController.rb
src/build_server/BuildServerOptionParser.rb
src/build_server/DistributionManager.rb
test/build-server.multi_dist1/build-svr2-09.testcase [new file with mode: 0644]
test/build-server.multi_dist1/testsuite
test/build-server.multi_dist2/build-svr3-05.testcase [new file with mode: 0644]
test/build-server.multi_dist2/testsuite

index c839bf1344e407bba137b530db565b7c38b3fee6..5e1bb749de9f7747245ada86097e6956681bddfb 100755 (executable)
--- 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] )
 
index b615dc59636ad6a0d5fcf7894a47d35c494bebe9..7d0ee19987b21f7f270c2d04219a8a25ebdd98eb 100644 (file)
@@ -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
index 033d247d7aba9fffce3b50422c586505d7d6ebab..6fd6e70ea5db23a746ae3091d976805cffb2bca7 100644 (file)
@@ -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)
index 8cdd086ee5c06d1a48180b07ee0c00aaa2508793..83c496d3c775a641b9b3f2cb7c3479982e534870 100644 (file)
@@ -42,6 +42,8 @@ class BuildServerUsage
        REMOVE_OS="build-svr remove-os -n <server name> -o <os>"
        ADD_DIST= "build-svr add-dist -n <server name> -D <distribution name> -u <package server url> -d <package server address>"
        REMOVE_DIST="build-svr remove-dist -n <server name> -D <distribution name>"
+       LOCK_DIST="build-svr lock-dist -n <server name> -D <distribution name>"
+       UNLOCK_DIST="build-svr unlock-dist -n <server name> -D <distribution name>"
        ADD_SYNC="build-svr add-sync -n <server name> -u <remote pkg server url> [--dist <distribution>]"
        REMOVE_SYNC="build-svr remove-sync -n <server name> -u <remote pkg server url> [--dist <distribution>]"
        ADD_PRJ="build-svr add-prj -n <server name> -N <project name> (-g <git repository> -b <git branch>|-P <package name>) [-w <password>] [-o <os list>] [--dist <distribution>]"
@@ -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
index 70cef6f66dadff36d7f2eea2285bd1553af9a797..b364f455498c3b7ccfd16009b69e8fa676b4d49c 100644 (file)
@@ -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 (file)
index 0000000..7c4a92e
--- /dev/null
@@ -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!
index c1e8c24fbd52d435b136886aa832752ecf62e927..3f955a6ccb2a549e5275a85a569de914d8d2f9b1 100644 (file)
@@ -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 (file)
index 0000000..a2b8660
--- /dev/null
@@ -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"
index 0b3f6f2cd5cb613cf1f53f6f7734d7fbb131da9b..9f25506b3235086d40f162d15ad532e9441d731f 100644 (file)
@@ -2,3 +2,4 @@ build-svr3-01.testcase
 build-svr3-02.testcase
 build-svr3-03.testcase
 build-svr3-04.testcase
+build-svr3-05.testcase