require 'yaml' require 'json' require 'time'

require_relative 'console_formatters.rb' require_relative 'configuration.rb' require_relative 'status.rb' require_relative 'check.rb' require_relative 'deploy.rb'

# Configuration file path CONFIGURATION_FILE = 'k8s-deploy.yml'.freeze

# Get start time CURRENT_TIME = Time.now.utc

# Read configuration file begin

CONFIGURATION = YAML.load_file(CONFIGURATION_FILE)

rescue Errno::ENOENT

CONFIGURATION = [].freeze

end

namespace :k8s do

CONFIGURATION.each do |environment, configuration|
  validate_configuration(configuration)

  namespace environment do
    desc "Show #{environment} configuration"
    task :configuration do
      block_output("Configuration for #{environment}") do
        print_configuration(configuration)
      end
    end

    desc "Show #{environment} K8s status"
    task status: ['status:deployment', 'status:pods', 'status:docker_image']

    namespace :status do
      desc "Show #{environment} K8s Pods status"
      task :pods do
        block_output("K8s Pods status for #{environment}") do
          print_pods_status(configuration)
        end
      end

      desc "Show #{environment} K8s Deployment status"
      task :deployment do
        block_output("K8s Deployment status for #{environment}") do
          print_deployment_status(configuration)
        end
      end

      desc "Show #{environment} K8s Deployment status"
      task :docker_image do
        block_output("K8s Docker image status for #{environment}") do
          print_docker_image_status(configuration)
        end
      end
    end

    desc "Check #{environment} ready for deploy"
    task check: ['check:git', 'check:gcloud']

    namespace :check do
      desc "Check #{environment} GIT"
      task :git do
        block_output("Check GIT for #{environment}") do
          print_git_check_branch(configuration)
          print_git_check_uncommitted
          print_git_check_remote_branch(configuration)
        end
      end

      desc "Check #{environment} GCloud"
      task :gcloud do
        block_output("Check GCloud for #{environment}") do
          print_gcloud_check_project(configuration)
          print_gcloud_check_kubectl_context(configuration)
        end
      end
    end

    desc "Deploy to #{environment}"
    task deploy: [:configuration, :check, :status,
                  'deploy:build',
                  'deploy:push',
                  'deploy:deployment_patch']

    namespace :deploy do
      desc "Build container for #{environment}"
      task :build do
        block_output("Build container for #{environment}") do
          print_deploy_build(configuration)
        end
      end

      desc "Push container for #{environment}"
      task :push do
        block_output("Push container for #{environment}") do
          print_deploy_push(configuration)
        end
      end

      desc "Deployment patch for #{environment}"
      task :deployment_patch do
        block_output("Deployment patch for #{environment}") do
          print_deploy_deployment_patch(configuration)
        end
      end

      desc "Rollback last deployment to #{environment}"
      task :rollback do
        block_output("Rollback for #{environment}") do
          print_deploy_rollback(configuration)
        end
      end

      desc "Scale deployment #{environment}"
      task :scale, [:replicas_count] do |_task, args|
        block_output("Scale for #{environment}") do
          print_deploy_scale(configuration, args[:replicas_count])
        end
      end
    end
  end
end

end