class Ogre::OrgCreate

Create organization through Chef::REST with the option to create the Chef policy repository

Public Instance Methods

org_create() click to toggle source

organization create method

# File lib/ogre/org-create.rb, line 22
def org_create
  org_json = { name: org.to_s, full_name: org_desc.to_s }
  response = chef_rest.post('/organizations', org_json)
  puts "'#{org}' org has been created."

  # use chef repo generate to create a chef policy repo
  if options[:create_repo]
    # check for policy repo - order of precedence: cli, config.json, default
    repo_url = Config.options[:repo_url] ? Config.options[:repo_url] : REPO_URL
    repo_url = options[:repo_url] ? options[:repo_url] : repo_url

    # get the repository name -- dependant on short name w/out '.git'
    skeleton_repo_path = "#{OGRE_HOME}/policy_repo/#{repo_url.split('/').last}"

    # get policy repo
    get_chef_policy_repo(repo_url, skeleton_repo_path)

    # create parent dir for chef policy repo
    repo_path = options[:repo_path] ? options[:repo_path] : OGRE_HOME
    Dir.mkdir repo_path unless File.exist?(repo_path)

    # run cookbook generate
    generate_cmd = ChefDK::Command::GeneratorCommands::Repo.new(generate_params(repo_path, skeleton_repo_path))
    generate_cmd.run

    # write out pem file
    File.open("#{repo_path}/#{org}-chef/.chef/#{response['clientname']}.pem", 'w') do |f|
      f.print(response['private_key'])
    end

  else
    puts response['private_key']
  end

rescue Net::HTTPServerException => e
  # already exists -- i will allow it
  if e.response.code == '409'
    puts "#{org} org already exists"
  else
    raise e
  end
end

Private Instance Methods

generate_params(parent_path, skeleton_repo_path) click to toggle source

concatenate parameters into a format ChefDK::Command::GeneratorCommands::Repo will accept

# File lib/ogre/org-create.rb, line 81
def generate_params(parent_path, skeleton_repo_path)
  # chef policy repository parameters
  generate_str = ["#{parent_path}/#{org}-chef"]

  # org name
  generate_str << '-a'
  generate_str << "org=#{org}"

  # chef server url
  generate_str << '-a'
  generate_str << "chef_server_url=#{options[:server_url] || Config.options[:server_url]}"

  # generator skeleton
  generate_str << '-g'
  generate_str << skeleton_repo_path

  # optional license
  if options[:license]
    generate_str << '-I'
    generate_str << options[:license].to_s
  end

  # optional email
  if options[:email]
    generate_str << '-m'
    generate_str << options[:email].to_s
  end

  # optional authors
  if options[:authors]
    generate_str << '-C'
    generate_str << options[:authors].to_s
  end

  generate_str
end
get_chef_policy_repo(repo_url, skeleton_repo_path) click to toggle source

clone policy skeleton, if exists, get latest

# File lib/ogre/org-create.rb, line 68
def get_chef_policy_repo(repo_url, skeleton_repo_path)
  # check for existing
  if File.exist?(skeleton_repo_path)
    # update if exists
    local_repo = Git.open(skeleton_repo_path)
    local_repo.pull
  else
    # get new if doesn't exist
    Git.clone(repo_url, skeleton_repo_path)
  end
end