新学期开始了,又要开始搞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文件的执行。。也就是各个模块的具体启动细节。。。