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

cloud foundry源码启动(二)

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

上一篇文章主要是写了vcap_dev的执行过程,在其执行完成之后,将会运行vcap文件进行真正的cloud foundry各个模块的启动。

对于真正的源码启动,主要涉及的两个程序文件是vcap和vcap_components文件。。。。

vcap_dev调用vcap文件的时候传进去的命令为:

start cloud_controller health_manager mongodb_node uaa dea mongodb_gateway router stager -c /home/fjs/.......

前面start后面的表示需要启动的模块,-c表示配置文件的目录,还有一些其他的参数就省略了,比较简单,一看就明白了。。。

  def self.start(args)
    self.start_init
    components(args).each(&:start)
  end

上面是真正的启动代码,在vcap文件定义的Run模块中。。首先是调用start_init函数,进行一些初始化,其实主要是启动nats服务器。。。。

接下来就是调用components函数来启动各个模块。。。。接下来分析component函数、、。、、

  def self.components(args)
    args = Component.getNamedComponents().keys if args.empty?  #如果传进来的参数是空的话,那么直接开启所有的模块
    args = Run.expand_args(args)   #这里args保存的是处理后的需要启动的所有东西
    components = args.map do |arg|
      component = Component.create(arg)    #跟路模块的名字,找到相应的子类,然后构造相应的对象
      STDOUT.puts "Skipping invalid component: #{arg}" if component.nil?
      component if (component && component.exists?)
    end.compact
    STDERR.puts "Don't know how to process '#{args.inspect}' \?\?" if components.empty?
    components
  end

其实相对还是很简单的,首先是调用expand_args函数对例如controller,dea等参数进行一些预处理,然后再根据处理完成以后的参数来具体的启动各个模块,这里要生成跟各个模块相关的对象,这些类型的定义都在dev_components文件中完成的。。。将生成的这些对象放入到components序列中,然后在将他们返回。。然后再在start函数中分别调用这些对象的start方法完成模块的启动。。。。

接下来分析dev_components文件。。。
在这个文件中首先定义了基本的模块类型---Component,其中定义了start,stop等方法来进行模块的启动,停止等操作。。。

接下来还定义了许多子类来继承Component类,例如CoreComponent,ServiceComponent等等。。cloud 否的内容与的不同模块对应着不同的具体类型。。例如mongodb_node 就属于ServiceComponent,

在Component类中有一个类变量@@named_components,它是一个哈希结构,key是名字,value是具体的了类型,例如key是mongodb,那么对应的value就是ServiceComponent。。。

这样就建立了名字与类型之间的关系。。。

通过调用create方法,通过不同的名字来建立不同的对象。。。然后再调用对象的start方法来进行模块的启动。。。

  def start
    if !running?
      pid = fork do
        # Capture STDOUT when no log file is configured
        if !log_file?
          stdout = File.open(log_file, 'a')
          stdout.truncate(0)
          STDOUT.reopen(stdout)
          stderr = File.open(log_file, 'a')
          STDERR.reopen(stderr)
        end
        # Make sure db is setup, this is slow and we should make it faster, but
        # should help for now.
        if is_cloud_controller?
          cc_dir = File.expand_path(File.join($vcap_home, 'cloud_controller', 'cloud_controller'))
          Dir.chdir(cc_dir) { `bundle exec rake db:migrate` }
        end
        exec("#{component_start_path}")
      end

      Process.detach(pid)

      start = Time.now
      while ((Time.now - start) < 20)
        break if running?
        sleep (0.25)
      end
    end

    status

    if !running?
      if File.exists?(log_file)
        log = File.read(log_file)
        STDERR.puts "LOG:\n #{log}" if !log.empty?
      end
    end
  end

这个样子,源码的启动过程就差不多弄完了。。

接下来就可以进行各个模块的启动过程了。。。。

抱歉!评论已关闭.