class Kuberun::Commands::RunPod
Constants
- NEW_POD
Public Class Methods
new(deployment_name, options)
click to toggle source
Calls superclass method
Kuberun::Command::new
# File lib/kuberun/commands/run_pod.rb, line 10 def initialize(deployment_name, options) @deployment_name = deployment_name @options = options super(options) end
Public Instance Methods
execute(input: $stdin, output: $stdout)
click to toggle source
# File lib/kuberun/commands/run_pod.rb, line 16 def execute(input: $stdin, output: $stdout) output.puts(Kuberun::Pastel.yellow('Checking access to needed commands...')) Kuberun::Kubectl.auth_check('create', resource: 'pods') Kuberun::Kubectl.auth_check('exec', resource: 'pods') output.puts(Kuberun::Pastel.green('You have all permissions needed.')) output.puts(Kuberun::Pastel.yellow('Searching for existing pods')) existing_pods = Kuberun::Kubectl.get(resource: 'pods', options: "-l kuberun-provisioned=true,kuberun-source=#{@deployment_name}") if existing_pods['items'].size > 0 select = existing_pods['items'].map { |item| item.dig('metadata', 'name') } select << NEW_POD selection = prompt.select('I found some already running pods. Do you want to use one?', select) if selection == NEW_POD create_pod_from_deployment(output) else @generated_pod_name = selection end else create_pod_from_deployment(output) end execute_command(input, output) unless prompt.no?(Kuberun::Pastel.yellow('Should I delete pod?')) Kuberun::Kubectl.delete(resource: 'pod', resource_name: generated_pod_name) Kuberun::Pastel.green("Pod #{generated_pod_name} has been deleted!") end output.puts(Kuberun::Pastel.green('Done!')) end
Private Instance Methods
create_pod_from_deployment(output)
click to toggle source
# File lib/kuberun/commands/run_pod.rb, line 51 def create_pod_from_deployment(output) deployment = Kuberun::Kubectl.get(resource: 'deployment', resource_name: @deployment_name, options: '') pod_template = deployment['spec']['template'] prepare_pod_template(pod_template) Kuberun::Kubectl.create(configuration: pod_template) wait_while do pod = Kuberun::Kubectl.get(resource: 'pod', resource_name: generated_pod_name) pod.dig('status', 'phase') == 'Running' end output.puts(Kuberun::Pastel.green('Pod is running!')) end
execute_command(_input, output)
click to toggle source
# File lib/kuberun/commands/run_pod.rb, line 122 def execute_command(_input, output) output.puts(Kuberun::Pastel.green('Executing command')) Kuberun::Kubectl.exec(pod: generated_pod_name, command: '-it /bin/sh') output.puts(Kuberun::Pastel.green('Kubectl exec exited')) end
generated_pod_name()
click to toggle source
# File lib/kuberun/commands/run_pod.rb, line 118 def generated_pod_name @generated_pod_name ||= "kuberun-#{@deployment_name}-#{Time.now.to_i}" end
prepare_pod_template(pod_template)
click to toggle source
# File lib/kuberun/commands/run_pod.rb, line 65 def prepare_pod_template(pod_template) pod_template['apiVersion'] = 'v1' pod_template['kind'] = 'Pod' pod_template['metadata']['name'] = generated_pod_name pod_template['metadata']['labels'] = { 'kuberun' => Kuberun::VERSION.to_s, 'kuberun-provisioned' => 'true', 'kuberun-source' => @deployment_name, } pod_template['spec']['containers'].each do |container| container.delete('livenessProbe') container.delete('readinessProbe') container['command'] = %w[/bin/sh -c --] container['args'] = ['while true; do sleep 1000; done'] end pod_template['spec'].delete('priority') pod_template['spec']['priorityClassName'] = 'system-cluster-critical' pod_template['spec']['affinity'] = { 'podAntiAffinity' => { 'requiredDuringSchedulingIgnoredDuringExecution' => [ { 'labelSelector' => { 'matchExpressions' => [ { 'key' => 'spot', 'operator' => 'In', 'values' => ['true'] } ] }, 'topologyKey' => 'kubernetes.io/hostname', } ] } } pod_template['spec']['terminationGracePeriodSeconds'] = 0 end
prompt()
click to toggle source
# File lib/kuberun/commands/run_pod.rb, line 130 def prompt TTY::Prompt.new end
wait_while() { || ... }
click to toggle source
# File lib/kuberun/commands/run_pod.rb, line 106 def wait_while loop do begin status = yield raise 'Not ok' unless status break rescue sleep(1) end end end