namespace :opsmgr do

desc 'Trigger an install on Ops Manager for the specified environment'
task :trigger_install, [:environment, :om_version, :install_timeout, :poll_interval] do |_, args|
  args.with_defaults(poll_interval: '30')
  require 'opsmgr/ui_helpers/ui_spec_runner'

  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).trigger_install(args.install_timeout, args.poll_interval)
end

desc 'Get latest install log from Ops Manager'
task :get_latest_install_log, [:environment, :om_version] do |_, args|
  require 'opsmgr/ui_helpers/ui_spec_runner'

  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).get_latest_install_log
end

desc 'Export installation'
task :export_installation, [:environment, :om_version, :export_destination] do |_, args|
  require 'opsmgr/ui_helpers/ui_spec_runner'

  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).export_installation(args.export_destination)
end

desc 'Import installation'
task :import_installation, [:environment, :om_version, :import_file] do |_, args|
  require 'opsmgr/environments'
  require 'opsmgr/cmd/ops_manager'
  require 'opsmgr/api/client'

  environment_object = Opsmgr::Environments.for(args.environment)
  client = Opsmgr::Api::Client.new(environment_object, args.om_version)
  opsmgr_cmd = Opsmgr::Cmd::OpsManager.new(environment_object)
  opsmgr_cmd.import_installation(client, args.import_file)

  if Gem::Version.new(args.om_version) >= Gem::Version.new('1.7')
    require 'opsmgr/ui_helpers/ui_spec_runner'

    UiSpecRunner.new(
      environment: args.environment,
      om_version: args.om_version
    ).post_import_configuration
  end
end

desc 'Delete installation'
task :delete_installation, [:environment, :om_version] do |_, args|
  require 'opsmgr/ui_helpers/ui_spec_runner'
  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).delete_installation
end

desc 'Add first user'
task :add_first_user, [:environment, :om_version] do |_, args|
  require 'opsmgr/ui_helpers/ui_spec_runner'

  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).add_first_user
end

desc 'Prepare Environment'
task :prepare, [:environment] do |_, args|
  require 'opsmgr/log'
  require 'opsmgr/environments'
  require 'vm_shepherd'

  logger = Opsmgr.logger_for('Rake')
  logger.info "Preparing environment for #{args[:environment]}"

  environment = Opsmgr::Environments.for(args.environment)

  shep = VmShepherd::Shepherd.new(settings: environment.settings)
  shep.prepare_environment
end

desc 'Install Operations Manager .image'
task :install, [:environment, :image] do |_, args|
  require 'timeout'
  require 'opsmgr/log'
  require 'opsmgr/environments'
  require 'vm_shepherd'

  logger = Opsmgr.logger_for('Rake')
  logger.info "installing #{args[:environment]}'s Ops Manager"

  environment = Opsmgr::Environments.for(args.environment)
  image = args[:image]

  shep = VmShepherd::Shepherd.new(settings: environment.settings)
  shep.deploy(paths: [image])
end

desc 'Delete a product'
task :delete_product, [:environment, :om_version, :product_name, :timeout, :poll_interval] do |_, args|
  args.with_defaults(poll_interval: '30')
  require 'opsmgr/ui_helpers/ui_spec_runner'

  DEFAULT_DELETE_TIMEOUT = 25

  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).delete_product(args.product_name, args.timeout || DEFAULT_DELETE_TIMEOUT.to_s, args.poll_interval)
end

desc 'Delete a product if present (will not fail if product is not preset)'
task :delete_product_if_present, [:environment, :om_version, :product_name, :timeout, :poll_interval] do |_, args|
  args.with_defaults(poll_interval: '10')
  require 'opsmgr/ui_helpers/ui_spec_runner'

  DEFAULT_DELETE_TIMEOUT = 25

  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).delete_product_if_present(args.product_name, args.timeout || DEFAULT_DELETE_TIMEOUT.to_s, args.poll_interval)
end

desc 'Delete unused products'
task :delete_unused_products, [:environment, :om_version] do |_, args|
  require 'opsmgr/api/client'
  require 'opsmgr/cmd/ops_manager'
  require 'opsmgr/environments'

  unless args.om_version
    raise "Please provide an Ops Manager version (for example, 1.7)"
  end
  environment = Opsmgr::Environments.for(args.environment)
  client = Opsmgr::Api::Client.new(environment, args.om_version)
  Opsmgr::Cmd::OpsManager.new(environment).delete_unused_products(client)
end

desc 'Saves the private key into the given file'
task :get_private_key, [:environment, :key_file_path] do |_, args|
  require 'opsmgr/environments'
  environment = Opsmgr::Environments.for(args.environment)
  case environment.settings.iaas_type
  when 'aws'
    private_key = environment.settings.ops_manager.aws.ssh_key
  when 'openstack'
    private_key = environment.settings.ops_manager.openstack.ssh_private_key
  else
    raise 'Unsupported IaaS - this task only works for AWS and Openstack'
  end
  File.open(args.key_file_path, 'w+') do |f|
    f << private_key
    f.chmod(0o600)
  end
end

desc 'run an errand'
task :run_errand, [:environment_name, :om_version, :product_name, :errand_name, :download_logs] do |_, args|
  require 'opsmgr/cmd/bosh_command'
  require 'opsmgr/log'
  require 'opsmgr/errand_runner'

  logger = Opsmgr.logger_for('Rake')
  bosh_command = Opsmgr::Cmd::BoshCommand.new(
    env_name: args.environment_name,
    om_version: args.om_version
  )
  Opsmgr::ErrandRunner.new(
    bosh_command: bosh_command,
    environment_name: args.environment_name,
    logger: logger,
    product_name: args.product_name,
    errand_name: args.errand_name,
    download_logs: args.with_defaults(download_logs: false)
  ).run_errand
end

desc 'Revert staged changes'
task :revert_staged_changes, [:environment, :om_version] do |_, args|
  require 'opsmgr/ui_helpers/ui_spec_runner'

  unless args.om_version
    raise "Please provide an Ops Manager version (for example, 1.7)"
  end

  UiSpecRunner.new(
    environment: args.environment,
    om_version: args.om_version
  ).revert_staged_changes
end

end # Copyright © 2014-2015 Pivotal Software, Inc. # All rights reserved. # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE # USE OR OTHER DEALINGS IN THE SOFTWARE.