staypuft介绍
staypuft是一个Openstack Foreman Installer。
它是基于Rails engine来实现的。我们在Rails基础中讲过engine。
目录结构
首先,它是一个gem,遵循的是gem的基本目录结构,包含最基本的lib和gemspec文件。
其次,它是一个rails engine, 包含了一个Rails项目的app、 config、db、script等文件夹。
app目录
我们可以看到熟悉的文件夹:assets、controllers、helpers、lib、models、views。
lib为什么放这里,那是因为避免要和gem的lib文件有冲突。
我们可以看到controller文件中也是熟悉的命名格式: xxxx_controller.rb
这里放在了staypuft目录,是避免冲突,包含了一个命名空间,这也是一种最佳实践。
其他的目录也是类似。
gemspec文件
我们可以在gemspec文件中看看此gem依赖什么文件:
...
s.add_dependency 'foreman-tasks', '~> 0.6.4'
s.add_dependency 'dynflow', '~> 0.7.0'
s.add_dependency 'wicked'
s.add_dependency 'deface'
s.add_dependency 'foreman_discovery'
s.add_dependency 'ipaddress'
这里主要依赖了foreman-tasks和foreman-discovery这两个foreman的gem,以及wicked,此gem用来做多步表单,比如foreman中多步配置的表单,可以用它来实现。
lib文件
lib下面的文件,重点是lib/staypuft/engine.rb文件:
require 'deface'
module Staypuft
ENGINE_NAME = "staypuft"
class Engine < ::Rails::Engine
engine_name Staypuft::ENGINE_NAME
config.autoload_paths += Dir["#{config.root}/app/lib"]
# Add any db migrations
initializer "staypuft.load_app_instance_data" do |app|
app.config.paths['db/migrate'] += Staypuft::Engine.paths['db/migrate'].existent
end
...
config.to_prepare do
# Model concerns
::Host::Base.send :include, Staypuft::Concerns::HostInterfaceManagement
::Host::Managed.send :include, Staypuft::Concerns::HostOrchestrationBuildHook
...
# preload all the Foreman's lib files but only in production
if Rails.env.production?
Dir.glob(File.join(Rails.root, 'lib', '**', '*.rb')).
map { |p| p.to_s.gsub "#{Rails.root}/lib/", '' }.
map { |v| v.gsub /\.rb$/, '' }.
sort_by { |v| v.scan('/').size }. # ordered by the directory depth
map { |v| require_dependency v }
end
end
rake_tasks do
Rake::Task['db:seed'].enhance do
Staypuft::Engine.load_seed
end
end
...
end
end
这个文件是作为一个Rails engine实现,必须要有的。
这里是为了staypuft做一些启动配置。
小结
staypuft是一个Rails engine的实现,可以参考它来为foreman编写插件。
具体如何使用插件,可以参考: http://theforeman.org/manuals/1.6/index.html#6.1InstallaPlugin