现在的位置: 首页 > 综合 > 正文

cloud foundry源码启动(1)

2014年07月03日 ⁄ 综合 ⁄ 共 3732字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.