已经正确使用dev_setup安装Cloud Foundry
启动流程
1.流程分析
通过dev_setup安装的Cloud Foundry可以通过以下代码启动
~/cloudfoundry/vcap/dev_setup/bin/vcap_dev start
vcap_dev会从以下代码处获得Cloud Foundry的各个组件和部署信息
vcap_components = JSON.parse(File.read(Deployment.get_vcap_config_file(deployment_config_path)))
deployment_info = JSON.parse(File.read(Deployment.get_deployment_info_file(deployment_config_path)))
具体的文件路径可以从dev_setup/lib下的vcap_defs.rb下查看,其中vcap_components默认的获取文件路径是
~/cloudfoundry/.deployment/devbox/config/vcap_components.json
deployment_info默认的获取文件路径是
~/cloudfoundry/.deployment/devbox/config/deployment_info.json
经过各种处理之后,将信息送入vcap进行处理
exec_cmd("#{ruby_binary} #{vcap_launch} #{command} #{vcap_components["components"].join(" ")} -c #{deployment_config_path} -v #{vcap_path} -l #{deployment_info["deployment_log_path"]}")
vcap在解析上上述输入的信息后将各个component送入Component类中进行启动(dev_setup/lib/vcap_components.rb)
exec("#{component_start_path}")
例如:
启动vblob_gateway时,执行
/root/cloudfoundry/vcap/bin/../services/vblob/bin/vblob_gateway -c /root/cloudfoundry/.deployments/devbox/config/vblob_gateway.yml
添加系统服务
在最近安装的Cloud Foundry中,移除了vcap/bin/services目录(可能是service的借口发生了变化,我不清楚)
原先的文档(参考链接)中所提及的方法已经不可使用(还有值得借鉴的地方)
说先将echo文件夹添加到vcap/services/目录下,并添加执行权限。
根据上文描述,我们可以发现vcap_dev启动时是从下述文件获得的component信息
~/cloudfoundry/.deployment/devbox/config/vcap_components.json
则仍然通过这里添加echo_node,echo_gateway服务,并在config目录下添加配置文件。
在vcap_component.json中添加echo_node和echo_gateway服务
现在启动一下cloud foundry
这里会发现Skipping invalid component: echo_XXXXX
再回头看一下vcap的源码,从以下代码发现”Skipping invalid component”
def self.components(args)
args = Component.getNamedComponents().keys if args.empty?
args = Run.expand_args(args)
components = args.map do |arg|
component = Component.create(arg)
if component.nil?
STDOUT.puts "Skipping invalid component: #{arg}"
else
STDOUT.puts "Skipping excluded component: #{component.name}" if component.is_excluded?
end
component if (component && component.exists? && !component.is_excluded?)
end.compact
STDERR.puts "Don't know how to process '#{args.inspect}' \?\?" if components.empty?
components
end
component变量是由Component.create返回的,再看Component.create函数
def self.create(name, configuration_file=nil)
sub_class = @@named_components[name]
if sub_class
sub_class.new(name, configuration_file)
else
nil
end
end
我们可以发现sub_class是由@@name_components[name]得出的,通过阅读代码可以发现@@name_components是在Component.register函数中定义的
def self.register(name, excluded=nil)
@@named_components[name] = self
default_excluded=/#{DEFAULT_CLOUD_FOUNDRY_EXCLUDED_COMPONENT}/
if excluded == true || (excluded.nil? && name =~ default_excluded)
@@excluded << name
end
end
当vcap中require了vcap_components.rb时,会执行该文件最下端的代码段
# register valid named components
## core
%w(router cloud_controller dea health_manager uaa acm).each do |core|
CoreComponent.register(core)
end
## services: gateways & nodes
%w(redis mysql mongodb rabbitmq postgresql vblob neo4j memcached couchdb elasticsearch filesystem).each do |service|
ServiceComponent.register("#{service}_gateway")
end
%w(redis mysql mongodb rabbitmq postgresql vblob neo4j memcached couchdb elasticsearch).each do |service|
ServiceComponent.register("#{service}_node")
end
## service auxiliary
%w(service_broker).each do |auxiliary|
ServiceAuxiliaryComponent.register(auxiliary)
end
## service tools
%w(backup_manager snapshot_manager).each do |tool|
ServiceToolComponent.register(tool)
end
所以当我们只在vcap_component.json中添加echo_node和echo_gateway时,vcap_dev可以识别出来,但是传入vcap时,会被认为是没有注册的component而不会处理,所以添加系统服务时同样需要修改vcap_components.rb
在vcap_components.rb中注册echo_node和echo_gateway服务
根据之前的文档,还需要向cloudcontroller中添加token配置,并向/cloudfoundry/vcap/services/tools/misc/bin/nuke_service.rb中添加配置文件路径(让cloud foundry知道系统提供了echo服务),最后安装echo的依赖库,具体参考之前的文档。
这次再次运行cloud foundry
终于运行成功了,使用VMC工具看看cloud foundry是否显示了echo服务
至此,echo服务算是添加成功了。