Added feature about clone-dist in build-svr
authorSungmin Kim <dev.sungmin.kim@samsung.com>
Tue, 14 Jan 2014 09:22:46 +0000 (18:22 +0900)
committerSungmin Kim <dev.sungmin.kim@samsung.com>
Tue, 14 Jan 2014 09:22:46 +0000 (18:22 +0900)
build-svr
src/build_server/BuildServerController.rb
src/build_server/BuildServerOptionParser.rb
src/build_server/CommonProject.rb
src/build_server/DistributionManager.rb
src/build_server/GitBuildProject.rb

index db67cbaf8d79890d0d8eb0063eb315ffbae21765..ee95805d39984e7634aa3e475f23f3260471ce56 100755 (executable)
--- 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 " <ip>:<port>"
+                       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] )
 
index e1a132fa8dd7df8ca1b63bfd2e83d3fb49f8c0f9..5c4b5f0de50f48e70a1e9cd443d2273186c1a56c 100644 (file)
@@ -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 )
index da97aa973c9e443db9e215c378745a919c8f9e07..76a44f616db6b808ce9f557207f66bf68b28d3e7 100644 (file)
@@ -42,6 +42,7 @@ class BuildServerUsage
        ADD_OS= "build-svr add-os -n <server name> -o <os>"
        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> [-w <password>]"
+       CLONE_DIST= "build-svr clone-dist -n <server name> -O <origin distribution name> -T <target distribution name> -u <package server url> -d <package server address> [-w <password>]"
        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>"
@@ -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>', 'origin distribution name' ) do |dist|
+                       options[:origin_dist] = dist
+               end
+
+               options[:target_dist] = ""
+               opts.on( '-T', '--target-dist <target distribution name>', 'target distribution name' ) do |dist|
+                       options[:target_dist] = dist
+               end
+
 
                options[:passwd] = ""
                opts.on( '-w', '--passwd <password>', '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
index fabb0c4145ebb5cb4db7705a02503ed001b3eada..6a8df2c77a4368168624aff69b7abd909ff52984 100644 (file)
@@ -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" )
index 3b15bbe375e53c0f0257e141d6abac72fad9c72f..e403586e28fe59408ff14859e73b4057f75b607b 100644 (file)
@@ -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
index 9ced2a72a26f671510e2452f8816f16c27a0b34e..5520a8e7f5352e4b723bdf3bcbb53ec00ca127bb 100644 (file)
@@ -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