staypuft介绍

staypuft是一个Openstack Foreman Installer。

它是基于Rails engine来实现的。我们在Rails基础中讲过engine。

foreman

目录结构

首先,它是一个gem,遵循的是gem的基本目录结构,包含最基本的lib和gemspec文件。

其次,它是一个rails engine, 包含了一个Rails项目的app、 config、db、script等文件夹。

app目录

foreman

我们可以看到熟悉的文件夹:assets、controllers、helpers、lib、models、views。

lib为什么放这里,那是因为避免要和gem的lib文件有冲突。

foreman

我们可以看到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