require 'subspace/commands/ansible' module Subspace module Commands class Base < Commander::Command include Subspace::Commands::Ansible def require_configuration load "config/provision.rb" end def playbook_dir File.join(gem_path, 'ansible', 'playbooks') end def template_dir File.join(gem_path, 'template', 'subspace') end def gem_path File.expand_path '../../../..', __FILE__ end def project_path unless File.exist?(File.join(Dir.pwd, "config", "subspace")) say "Subspace must be run from the project root" exit end Dir.pwd # TODO make sure this is correct if they for whatever reason aren't running subspace from the project root?? end def project_name File.basename(project_path) # TODO see above, this should probably be in a configuration somewhere end def dest_dir "config/subspace" end def template(src, dest = nil, render_binding = nil) return unless confirm_overwrite File.join(dest_dir, dest || src) template! src, dest, render_binding say "Wrote #{dest || src}" end def template!(src, dest = nil, render_binding = nil) dest ||= src template = ERB.new File.read(File.join(template_dir, "#{src}.erb")), trim_mode: '-' result = template.result(render_binding || binding) File.write File.join(dest_dir, dest), result end def copy(src, dest = nil) dest ||= src return unless confirm_overwrite File.join(dest_dir, dest) FileUtils.cp File.join(template_dir, src), File.join(dest_dir, dest) say "Wrote #{dest}" end def confirm_overwrite(file_path) return true unless File.exist? file_path answer = ask "#{file_path} already exists. Reply 'y' to overwrite: [no] " return answer.downcase.start_with? "y" end def pass_through_params ansible_options = [] self.class::PASS_THROUGH_PARAMS.each do |param_name| x = param_name.split('-')[1..-1].map(&:upcase).join('_') hash_key = (param_name.gsub('-', '_') + (x == '' ? '' : "_#{x}")).to_sym value = @options.__hash__[hash_key] if value if param_name.length > 1 ansible_options += ["--#{param_name}", value] else ansible_options += ["-#{param_name}", value] end end end ansible_options end def set_subspace_version ENV['SUBSPACE_VERSION'] = Subspace::VERSION end def inventory @inventory ||= Subspace::Inventory.read("config/subspace/inventory.yml") end end end end