[Title] Build server project lock
authorhataejun <taejun.ha@samsung.com>
Tue, 26 Mar 2013 11:09:12 +0000 (20:09 +0900)
committerhataejun <taejun.ha@samsung.com>
Tue, 26 Mar 2013 11:09:12 +0000 (20:09 +0900)
[Type]
[Module]
[Priority]
[Jira#]
[Redmine#] 8869
[Problem]
[Cause]
[Solution]
[TestCase]

src/build_server/BinaryUploadProject.rb
src/build_server/BuildServer.rb
src/build_server/BuildServerException.rb
src/build_server/CommonProject.rb
src/build_server/GitBuildProject.rb
src/build_server/SocketJobRequestListener.rb

index f653b80dbb1e655af7fb79eedec9b992d8402237..44d123964e512b39a59d94ea5fb6ad40e363d46e 100644 (file)
@@ -40,7 +40,7 @@ class BinaryUploadProject < CommonProject
 
        # initialize
        def initialize( name, server, os_list, dist_name, pkg_name = nil )
-               super(name, "BINARY", server, os_list, dist_name)
+               super(name, "BINARY", server, os_list, dist_name, "OPEN")
                @pkg_name = pkg_name
        end
 
@@ -140,12 +140,14 @@ class BinaryUploadProject < CommonProject
                prj_id = row['id']
                prj_name = row['name']
                prj_passwd = row['password']
+               prj_status = row['status']
 
                new_project = BinaryUploadProject.new(prj_name, server, prj_os_list, dist_name)
                if not prj_passwd.empty? then new_project.passwd = prj_passwd end
                new_project.set_project_id( prj_id )
                new_project.set_source_info( source_info )
                new_project.set_package_info( package_info )
+               new_project.set_project_status( prj_status )
 
                row=db.select_one("SELECT * FROM project_bins WHERE project_id=#{prj_id}")
                if row.nil? then return nil end
index 56e926f2b3236b59def5654365f1f39ff639574c..3d3235a5ef0d9ce117292627232cfd1b0d071109 100644 (file)
@@ -106,7 +106,7 @@ class BuildServer
                @db_dsn = "SQLite3:#{BuildServer::CONFIG_ROOT}/#{@id}/server.db"
                @db_user = nil
                @db_passwd = nil
-               @db_version = 2
+               @db_version = 3
                @sqlite3_db_mutex = Mutex.new
 
                #DB upgrade SQL command
@@ -585,8 +585,10 @@ class BuildServer
                if @db_dsn =~ /^Mysql/i then
                        @db_migrate[1]=["ALTER TABLE jobs CHANGE COLUMN id  id INTEGER AUTO_INCREMENT NOT NULL", 
                                                        "ALTER TABLE distributions ADD pkgsvr_password VARCHAR(64)"]
+                       @db_migrate[2]=["ALTER TABLE projects ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT 'OPEN'"]
                else
                        @db_migrate[1]=["ALTER TABLE distributions ADD pkgsvr_password VARCHAR(64)"]
+                       @db_migrate[2]=["ALTER TABLE projects ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT 'OPEN'"]
                end
        end
 
index 03d2548f6dc5a43113184b019bf3f5222348664d..8ab47e4405fb59dc8d5e4c586c5451371e0f4a48 100644 (file)
@@ -18,6 +18,7 @@ class BuildServerException < Exception
                "ERR014" => "Job cancel failed!",
                "ERR015" => "Server password not matched!",
                "ERR016" => "Can't received register file!",
+               "ERR017" => "Project locked!",
 
                "ERR900" => "Cancel event received!",
                "ERR901" => "Job already upload status. Cancel failed!"
index 9d896452efd51c07559bdef25613e4f5de25b02b..b6a28417c231f290461eec3db384e8b65c478a00 100644 (file)
@@ -31,10 +31,10 @@ $LOAD_PATH.unshift File.dirname(__FILE__)
 $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/common"
 
 class CommonProject
-       attr_accessor :name, :type, :passwd, :os_list, :dist_name, :path
+       attr_accessor :name, :type, :passwd, :os_list, :dist_name, :path, :status
 
        # initialize
-       def initialize( name, type, server, os_list, dist_name="BASE" )
+       def initialize( name, type, server, os_list, dist_name="BASE", status="OPEN" )
                @prj_id = -1
                @name = name
                @type = type
@@ -42,6 +42,7 @@ class CommonProject
                @os_list = os_list
                @server = server
                @dist_name = dist_name
+               @status = status
                @source_info = {}
                @package_info = {}
                if @dist_name == "BASE" then
@@ -165,6 +166,14 @@ class CommonProject
                return @prj_id
        end
 
+       def set_project_status(status)
+               @status = status
+       end
+
+       def get_project_status()
+               return @status
+       end
+
        def self.create_table(db, inc, post_fix) 
                db.do "CREATE TABLE projects ( 
                        id INTEGER PRIMARY KEY #{inc}, 
@@ -173,6 +182,7 @@ class CommonProject
                        name VARCHAR(32) NOT NULL, 
                        ptype VARCHAR(32) NOT NULL, 
                        password VARCHAR(32),
+                       status VARCHAR(32) NOT NULL DEFAULT 'OPEN',
                        CONSTRAINT fk_projects_users1 FOREIGN KEY ( user_id ) REFERENCES users ( id ),
                        CONSTRAINT fk_projects_distributions1 FOREIGN KEY ( distribution_id ) REFERENCES distributions ( id ) )#{post_fix}"
 
@@ -242,8 +252,8 @@ class CommonProject
                if @prj_id == -1 then
                        row = db.select_one("SELECT * FROM distributions WHERE name='#{@dist_name}'")
                        dist_id = row['id']
-                       db.do "INSERT INTO projects (distribution_id,name,ptype,password) 
-                               VALUES (#{dist_id},'#{@name}','#{@type}','#{@passwd}')"
+                       db.do "INSERT INTO projects (distribution_id,name,ptype,password,status
+                               VALUES (#{dist_id},'#{@name}','#{@type}','#{@passwd}','#{@status}')"
                        case @server.db_dsn
                        when /^SQLite3:/ then @prj_id = db.select_one("select last_insert_rowid()")[0]
                        when /^Mysql:/ then @prj_id = db.func(:insert_id)
@@ -259,7 +269,7 @@ class CommonProject
                else
                        row = db.select_one("SELECT * FROM distributions WHERE name='#{@dist_name}'")
                        dist_id = row['id']
-                       db.do "UPDATE projects SET ptype='#{@type}',password='#{@passwd}' WHERE name='#{@name}' and distribution_id=#{dist_id})"
+                       db.do "UPDATE projects SET ptype='#{@type}',password='#{@passwd}',status='#{@status}' WHERE name='#{@name}' and distribution_id=#{dist_id})"
                        db.do "DELETE FROM project_os WHERE project_id=#{@prj_id}"
                        @os_list.each do |os|
                                row = db.select_one("SELECT * FROM supported_os WHERE name='#{os}'")
index 589651b79f58e1d2be50540222ba5e2b12b839ea..dffd40d7b2fc10c84748578d223bcfdb44d9da81 100644 (file)
@@ -42,7 +42,7 @@ class GitBuildProject < CommonProject
 
        # initialize
        def initialize( name, server, os_list, dist_name, repos = nil, branch = nil )
-               super(name, "GIT", server, os_list, dist_name)
+               super(name, "GIT", server, os_list, dist_name, "OPEN")
                @repository = repos
                @branch = branch
        end
@@ -115,12 +115,14 @@ class GitBuildProject < CommonProject
                prj_id = row['id']
                prj_name = row['name']
                prj_passwd = row['password']
+               prj_status = row['status']
 
                new_project = GitBuildProject.new(prj_name, server, prj_os_list, dist_name)
                if not prj_passwd.empty? then new_project.passwd = prj_passwd end
                new_project.set_project_id( prj_id )
                new_project.set_source_info( source_info )
                new_project.set_package_info( package_info )
+               new_project.set_project_status( prj_status )
 
                row=db.select_one("SELECT * FROM project_gits WHERE project_id=#{prj_id}")
                if row.nil? then return nil end
index 4dac6f1389396afdefceed702254b12a34fe06a3..767d8192b29a498fa922d570032099a17661db49 100644 (file)
@@ -347,6 +347,11 @@ class SocketJobRequestListener
                # check project
                prj = check_project_exist(prj_name, dist_name, req)
 
+               # check project status
+               if prj.status != "OPEN" then
+                       raise BuildServerException.new("ERR017"), "#{project_name} on #{dist_name}. project is [[#{project.status}]]"
+               end
+               
                # check passwd
                check_project_password(prj, passwd, req)
 
@@ -720,6 +725,14 @@ class SocketJobRequestListener
                        # check distribution
                        check_distribution(dist_name, req)
 
+                       # check project
+                       prj = check_project_for_package_file_name(filename, dist_name, req)
+
+                       # check project status
+                       if prj.status != "OPEN" then
+                               raise BuildServerException.new("ERR017"), "#{prj.name} on #{dist_name}. project is [[#{prj.status}]]"
+                       end
+
                        new_job = @parent_server.jobmgr.create_new_register_job( file_path, dist_name )
                        new_job.create_logger( req ) 
 
@@ -746,6 +759,11 @@ class SocketJobRequestListener
                        # check project
                        prj = check_project_for_package_file_name(filename, dist_name, req)
 
+                       # check project status
+                       if prj.status != "OPEN" then
+                               raise BuildServerException.new("ERR017"), "#{prj.name} on #{dist_name}. project is [[#{prj.status}]]"
+                       end
+
                        # check user email
                        user_id = @parent_server.check_user_id_from_email( user_email )
                        if user_id == -1 then
@@ -978,7 +996,6 @@ class SocketJobRequestListener
                end
        end
 
-
        private
        def check_supported_os(os_list, req)