#!/usr/bin/env oo-ruby

require 'getoptlong'

def usage
  $stderr.puts <<USAGE
  == Synopsis

#{$0}: Perform action (CRUD) on given gear using named cartridge

== Usage

#{$0} -c <command>

== List of arguments
       -c|--command     One of <show|toggle|v1|v2>
       -h|--help        Print this message
USAGE
  exit 255
end

VERSION_MARKER = '/var/lib/openshift/.settings/v1_cartridge_format'

def check_version
  if File.exists? VERSION_MARKER
    puts 'Node is currently in v1 mode'
    :v1
  else
    puts 'Node is currently in v2 mode'
    :v2
  end
end

def toggle_version
  version = check_version

  puts 'Switching node cartridge version'

  if (version == :v2)
    `mkdir -p /var/lib/openshift/.settings;
     touch #{VERSION_MARKER}`
  else
    `rm #{VERSION_MARKER}`
  end

  # if our node is also a broker, exchange old cartridge cache for new
  if system("rpm -q openshift-origin-broker")
    puts 'Clearing broker cache'
    `oo-admin-broker-cache --clear --console`
    puts 'Restarting broker'
    `service openshift-broker restart`
  elsif system("rpm -q rhc-broker")
    puts 'Clearing broker cache'
    `oo-admin-broker-cache --clear --console`
    puts 'Restarting broker'
    `service rhc-broker restart`
  else
    puts <<-OUT
      You will need to clear the cache on your broker(s) and restart the broker application.
      You can clear the cache on the broker as follows:
        oo-admin-broker-cache --clear --console
    OUT
  end
  # in any case, node needs an mcollective restart
  `service mcollective restart`

   check_version
end

def set_version(version)
  if check_version == version
    puts 'No change necessary'
  else
    toggle_version
  end
end

opts = GetoptLong.new(
    ["--command", "-c", GetoptLong::REQUIRED_ARGUMENT],
    ["--help",             "-h", GetoptLong::NO_ARGUMENT]
)

opts.each do |opt, arg|
  case opt
  when '--help'
    usage
  when '--command'
    case arg
    when 'show'
      check_version
    when 'toggle'
      toggle_version
    when 'v1'
      set_version :v1
    when 'v2'
      set_version :v2
    else
      puts "unknown command #{arg}"
      usage
    end
    exit
  end
end

usage
