新学期开始了,又要开始搞cloud foundry了。。。首先从cloud foundry源码的启动过程搞起:
cloud foundry的启动入口文件是vcap_dev文件,它的主要作用的就是初始化一些基本的参数,最后则是由vcap文件来真正的启动cloud foundry的各个部分。
好了,我们就来分析vcap_dev文件的执行过程吧(这里用的各项都是默认的参数):
options["name"], options["home"] = Deployment.get_deployment_target if options.empty? #options['name'] = 'devbox', options['home'] = '/home/fjs/cloudfoundry'
if options["name"]
puts "Targeting deployment \"#{options["name"]}\" with cloudfoundry home \"#{options["home"]}\""
else
options["name"] = DEPLOYMENT_DEFAULT_NAME
puts "Targeting default deployment \"#{options["name"]}\""
end
首先是获取基本的nome和home路径,保存下来。。。
deployment_config_path = Deployment.get_config_path(options["name"], options["home"]) # /home/fjs/cloudfoundry/.deploments/devbox/config
这个参数保存的是配置文件保存的路径
begin
vcap_components = JSON.parse(File.read(Deployment.get_vcap_config_file(deployment_config_path))) #用来保存每个构建的一些信息
# /home/fjs/cloudfoundry/.deploments/devbox/config/vcap_components.json
deployment_info = JSON.parse(File.read(Deployment.get_deployment_info_file(deployment_config_path)))
# /home/fjs/cloudfoundry/.deploments/devbox/config/deployment_info.json
rescue => e
STDERR.puts "#{e.inspect}. Could not parse deployment config files . Please check your deployment."
exit 1
end
上面一段代码是比较重要的,vcap_components参数将会从配置文件中读取当前机器安装有的cloud foundry的所有模块,最后将会按照他们来启动整个cloud foundry
deployment_info保存的是一些基本的部署信息,例如ruby的路径,配置文件的路径等。
ruby_bin_dir = deployment_info["ruby_bin_dir"] #/home/fjs/cloudfoundry/.deploments/devbox/deploy/rubies/ruby-1.9.2-p180/bin
maven_bin_dir = deployment_info["maven_bin_dir"] #/home/fjs/cloudfoundry/.deploments/devbox/deploy/maven/apache-maven-3.0.4/bin
gemdir = `#{File.join(ruby_bin_dir, "gem")} environment gemdir`.split("\n")[0] #gem的路径
ENV["PATH"] = "#{ruby_bin_dir}:#{File.join(gemdir, "bin")}:#{maven_bin_dir}:#{ENV["PATH"]}" #设置环境变量path的值
这部分是代码是获取一些相关的基本参数,例如ruby的路径,gem的路径等。
if vcap_components["components"].include?("services_redis")
vcap_components["components"].unshift(vcap_components["components"].delete("services_redis"))
end
if vcap_components["components"].include?("cloud_controller") #如果存在controller模块
puts "Setting up cloud controller environment"
ENV["CLOUD_CONTROLLER_CONFIG"]=File.join(deployment_config_path, "cloud_controller.yml")
#contorller的配置文件是/home/fjs/cloudfoundry/.deploments/devbox/config/cloud_controller.yml
ENV["RAILS_ENV"]="production" #生产环境
# Start the cloud controller component first as other components like the
# health manager depend on it. Specifically, the health manager uses the same
# database as the one used by the cloud controller.
vcap_components["components"].unshift(vcap_components["components"].delete("cloud_controller"))
end
if vcap_components["components"].include?("stager") #如果存在打包的
ENV["PLATFORM_CONFIG"]=File.join(deployment_config_path, "platform.yml")
#contorller的配置文件是/home/fjs/cloudfoundry/.deploments/devbox/config/platform.yml
end
if vcap_components["components"].include?("uaa") #设置uaa的一些东西
puts "Setting up the uaa environment"
ENV["CLOUD_CONTROLLER_CONFIG_PATH"]=deployment_config_path
ENV["UAA_TOMCAT"]=File.join(deployment_config_path, "../deploy/uaa-tomcat/")
end
上面的代码是用来对一些特殊的cloud foundry模块进行一些配置,设置一些环境变量等等。
def exec_cmd(cmd)
id = fork {
puts "Executing #{cmd}"
exec(cmd)
}
pid, status = Process.waitpid2(id)
status.exitstatus
end
ruby_binary = File.join(ruby_bin_dir, "ruby") #/home/fjs/cloudfoundry/.deploments/devbox/deploy/rubies/ruby-1.9.2-p180/bin/ruby
vcap_home = File.join(deployment_info["cloudfoundry_home"], "vcap") #/home/fjs/cloudfoundry/vcap
vcap_launch = File.join(script_dir, "vcap") #/home/fjs/cloudfoundry/vcap/dev_setup/bin/vcap
puts "Using cloudfoundry config from #{deployment_config_path}"
exec_cmd("#{ruby_binary} #{vcap_launch} #{command} #{vcap_components["components"].join(" ")} -c #{deployment_config_path} -v #{vcap_home} -l #{deployment_info["deployment_log_path"]}")
上面的代码就是调用vcap文件来真正的执行cloud foundry的启动了。。。。
好了,vcap_dev文件的执行基本上就分析完了,下一篇文章写vcap文件的执行。。也就是各个模块的具体启动细节。。。