From 30cf08fc4542010bcdf92b41d02f81a0af66a29e Mon Sep 17 00:00:00 2001 From: Sungmin Kim Date: Tue, 14 Jan 2014 18:22:46 +0900 Subject: [PATCH] Added feature about clone-dist in build-svr --- build-svr | 13 +++++ src/build_server/BuildServerController.rb | 21 ++++++++ src/build_server/BuildServerOptionParser.rb | 25 +++++++++- src/build_server/CommonProject.rb | 2 +- src/build_server/DistributionManager.rb | 54 +++++++++++++++++++++ src/build_server/GitBuildProject.rb | 11 +++-- 6 files changed, 121 insertions(+), 5 deletions(-) diff --git a/build-svr b/build-svr index db67cba..ee95805 100755 --- a/build-svr +++ b/build-svr @@ -178,6 +178,19 @@ begin pkgsvr_port = svr_result[1] BuildServerController.add_distribution( option[:name], option[:dist], pkgsvr_url, pkgsvr_addr, pkgsvr_port, option[:passwd] ) + when "clone-dist" + svr_result = Utils.parse_server_addr(option[:domain]) + if svr_result.nil? or svr_result.length != 2 then + puts "Server address is incorrect. (#{option[:domain]})" + puts "Tune as following format." + puts " :" + exit 1 + end + pkgsvr_url = option[:url] + pkgsvr_addr = svr_result[0] + pkgsvr_port = svr_result[1] + BuildServerController.clone_distribution( option[:name], option[:origin_dist], option[:target_dist], pkgsvr_url, pkgsvr_addr, pkgsvr_port, option[:passwd] ) + when "remove-dist" BuildServerController.remove_distribution( option[:name], option[:dist] ) diff --git a/src/build_server/BuildServerController.rb b/src/build_server/BuildServerController.rb index e1a132f..5c4b5f0 100644 --- a/src/build_server/BuildServerController.rb +++ b/src/build_server/BuildServerController.rb @@ -380,6 +380,27 @@ class BuildServerController end end + # clone distribution + def self.clone_distribution( id, origin_dist_name, target_dist_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password ) + server = get_server(id) + + if not server.has_db? then + puts BuildServerException.get_message("ERR021") + return false + end + migrate_db(server) + + # add + if server.distmgr.clone_distribution( origin_dist_name, target_dist_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password ) then + puts "Distribution is cloned successfully!" + return true + else + puts "Check distribution (Not found origin distribution or Target distribution is already exists) " + return false + end + end + + # remove distribution def self.remove_distribution( id, dist_name ) diff --git a/src/build_server/BuildServerOptionParser.rb b/src/build_server/BuildServerOptionParser.rb index da97aa9..76a44f6 100644 --- a/src/build_server/BuildServerOptionParser.rb +++ b/src/build_server/BuildServerOptionParser.rb @@ -42,6 +42,7 @@ class BuildServerUsage ADD_OS= "build-svr add-os -n -o " REMOVE_OS="build-svr remove-os -n -o " ADD_DIST= "build-svr add-dist -n -D -u -d [-w ]" + CLONE_DIST= "build-svr clone-dist -n -O -T -u -d [-w ]" REMOVE_DIST="build-svr remove-dist -n -D " LOCK_DIST="build-svr lock-dist -n -D " UNLOCK_DIST="build-svr unlock-dist -n -D " @@ -120,6 +121,15 @@ def option_error_check( options ) raise ArgumentError, "Usage: " + BuildServerUsage::ADD_DIST end + when "clone-dist" + if options[:name].nil? or options[:name].empty? or + options[:origin_dist].nil? or options[:origin_dist].empty? or + options[:target_dist].nil? or options[:target_dist].empty? or + options[:url].nil? or options[:url].empty? or + options[:domain].nil? or options[:domain].empty? then + raise ArgumentError, "Usage: " + BuildServerUsage::ADD_DIST + end + when "remove-dist" if options[:name].nil? or options[:name].empty? or options[:dist].nil? or options[:dist].empty? then @@ -207,6 +217,7 @@ def option_parse + "\t" + "add-os Add supported OS." + "\n" \ + "\t" + "remove-os Remove supported OS." + "\n" \ + "\t" + "add-dist Add distribution." + "\n" \ + + "\t" + "clone-dist Clone distribution." + "\n" \ + "\t" + "remove-dist Remove distribution." + "\n" \ + "\t" + "lock-dist Lock distribution." + "\n" \ + "\t" + "unlock-dist Unlock distribution." + "\n" \ @@ -230,6 +241,7 @@ def option_parse + "\t" + BuildServerUsage::ADD_OS + "\n" \ + "\t" + BuildServerUsage::REMOVE_OS + "\n" \ + "\t" + BuildServerUsage::ADD_DIST + "\n" \ + + "\t" + BuildServerUsage::CLONE_DIST + "\n" \ + "\t" + BuildServerUsage::REMOVE_DIST + "\n" \ + "\t" + BuildServerUsage::LOCK_DIST + "\n" \ + "\t" + BuildServerUsage::UNLOCK_DIST + "\n" \ @@ -298,6 +310,16 @@ def option_parse options[:dist] = dist end + options[:origin_dist] = "" + opts.on( '-O', '--origin-dist ', 'origin distribution name' ) do |dist| + options[:origin_dist] = dist + end + + options[:target_dist] = "" + opts.on( '-T', '--target-dist ', 'target distribution name' ) do |dist| + options[:target_dist] = dist + end + options[:passwd] = "" opts.on( '-w', '--passwd ', 'password for managing project' ) do|passwd| @@ -354,7 +376,8 @@ def option_parse cmd.eql? "stop" or cmd.eql? "migrate" or 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? "add-dist" or cmd.eql? "clone-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 diff --git a/src/build_server/CommonProject.rb b/src/build_server/CommonProject.rb index fabb0c4..6a8df2c 100644 --- a/src/build_server/CommonProject.rb +++ b/src/build_server/CommonProject.rb @@ -31,7 +31,7 @@ $LOAD_PATH.unshift File.dirname(__FILE__) $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/common" class CommonProject - attr_accessor :name, :type, :os_list, :dist_name, :path, :status, :prj_id + attr_accessor :prj_id, :name, :type, :os_list, :dist_name, :path, :status # initialize def initialize( name, type, server, os_list, dist_name="BASE", status="OPEN" ) diff --git a/src/build_server/DistributionManager.rb b/src/build_server/DistributionManager.rb index 3b15bbe..e403586 100644 --- a/src/build_server/DistributionManager.rb +++ b/src/build_server/DistributionManager.rb @@ -200,6 +200,60 @@ class DistributionManager end + # clone + #name clone_distribution(origin_name, target_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 clone_distribution(origin_name, target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password) + result = false + begin + @server.get_db_connection() do |db| + if get_distribution_internal(origin_name, db).nil? then + @server.log.info "The distribution \"#{origin_name}\" is not exists on server" + @server.log.error "Clone distribution failed!" + elsif not get_distribution_internal(target_name, db).nil? then + @server.log.info "The distribution \"#{target_name}\" already exists on server" + @server.log.error "Clone distribution failed!" + else + new_dist = PackageDistribution.new(target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, "OPEN") + new_dist.save(db) + @server.log.info "Added a new distribution \"#{target_name}\"" + + #Get project list + projects = @server.prjmgr.get_all_projects() + + #Add project + projects.each do |prj| + if prj.type.eql? "GIT" then + @server.prjmgr.add_git_project(prj.name, prj.repository, prj.branch, prj.os_list, target_name) + + source = prj.get_latest_source_info(db) + if not source.nil? then + new_prj = @server.prjmgr.get_project(prj.name, target_name) + db.do "INSERT INTO sources(project_id, pkg_ver,location) + VALUES(#{new_prj.prj_id},'#{source["pkg_ver"]}','#{source["location"]}')" + end + elsif prj.type.eql? "BINARY" then + @server.prjmgr.add_binary_project(prj.name, prj.pkg_name, prj.os_list, target_name) + end + end + + 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 + return result + end + + # remove #name remove_distribution(name) #return ture when remove distribution successed diff --git a/src/build_server/GitBuildProject.rb b/src/build_server/GitBuildProject.rb index 9ced2a7..5520a8e 100644 --- a/src/build_server/GitBuildProject.rb +++ b/src/build_server/GitBuildProject.rb @@ -151,8 +151,13 @@ class GitBuildProject < CommonProject end end - def get_latest_commit_id(db) - source_info = db.select_one("SELECT * FROM sources WHERE project_id =#{@prj_id} ORDER BY id DESC") - return source_info.location + def get_latest_source_info(db) + source_info = nil + data = db.select_one("SELECT * FROM sources WHERE project_id =#{@prj_id} ORDER BY id DESC") + if not data.nil? then + source_info = {"pkg_ver" => data[2], "location" => data[3]} + end + return source_info end + end -- 2.34.1