module Dapp::Kube::Dapp::Command::MinikubeSetup

Public Instance Methods

_minikube_find_registry_pod() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 245
def _minikube_find_registry_pod
  _minikube_kubernetes.pod_list(labelSelector: "k8s-app=kube-registry")['items'].first
end
_minikube_kubernetes() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 253
def _minikube_kubernetes
  @_minikube_kubernetes ||= Kubernetes::Client.new(
    kubernetes_config,
    kubernetes_config.current_context_name,
    'kube-system',
    timeout: options[:kubernetes_timeout],
  )
end
_minikube_registry_pod_name() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 249
def _minikube_registry_pod_name
  @_minikube_registry_pod_name
end
_minikube_registry_proxy_pod_spec() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 361
def _minikube_registry_proxy_pod_spec
  {
    'metadata' => {
      'name' => 'kube-registry-proxy',
      'namespace' => 'kube-system'
    },
    'spec' => {
      'containers' => [
        {
          'name' => 'kube-registry-proxy',
          'image' => 'gcr.io/google_containers/kube-registry-proxy:0.3',
          'env' => [
            {
              'name' => 'REGISTRY_HOST',
              'value' => 'kube-registry.kube-system.svc.cluster.local'
            },
            {
              'name' => 'REGISTRY_PORT',
              'value' => '5000'
            },
            {
              'name' => 'FORWARD_PORT',
              'value' => '5000'
            }
          ],
          'ports' => [
            {
              'name' => 'registry',
              'containerPort' => 5000,
              'hostPort' => 5000
            }
          ]
        }
      ]
    }
  }
end
_minikube_registry_replicationcontroller_spec() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 262
def _minikube_registry_replicationcontroller_spec
  {
    'metadata' => {
      'name' => 'kube-registry',
      'namespace' => 'kube-system',
      'labels' => {
        'k8s-app' => 'kube-registry',
        'version' => 'v0',
        'kubernetes.io/cluster-service' => 'true'
      }
    },
    'spec' => {
      'replicas' => 1,
      'selector' => {
        'k8s-app' => 'kube-registry',
        'version' => 'v0'
      },
      'template' => {
        'metadata' => {
          'labels' => {
            'k8s-app' => 'kube-registry',
            'version' => 'v0',
            'kubernetes.io/cluster-service' => 'true'
          }
        },
        'spec' => {
          'containers' => [
            {
              'name' => 'registry',
              'image' => 'registry:2',
              'env' => [
                {
                  'name' => 'REGISTRY_HTTP_ADDR',
                  'value' => ':5000'
                },
                {
                  'name' => 'REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY',
                  'value' => '/var/lib/registry'
                },
                {
                  'name' => 'REGISTRY_STORAGE_DELETE_ENABLED',
                  'value' => 'true',
                }
              ],
              'volumeMounts' => [
                {
                  'name' => 'image-store',
                  'mountPath' => '/var/lib/registry'
                }
              ],
              'ports' => [
                {
                  'containerPort' => 5000,
                  'name' => 'registry',
                  'protocol' => 'TCP'
                }
              ]
            }
          ],
          'volumes' => [
            {
              'name' => 'image-store',
              'hostPath' => {
                'path' => '/var/lib/docker/registry_data'
              }
            }
          ]
        }
      }
    }
  }
end
_minikube_registry_service_spec() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 335
def _minikube_registry_service_spec
  {
    'metadata' => {
      'name' => 'kube-registry',
      'namespace' => 'kube-system',
      'labels' => {
        'k8s-app' => 'kube-registry',
        'kubernetes.io/cluster-service' => 'true',
        'kubernetes.io/name' => 'KubeRegistry'
      }
    },
    'spec' => {
      'selector' => {
        'k8s-app' => 'kube-registry'
      },
      'ports' => [
        {
          'name' => 'registry',
          'port' => 5000,
          'protocol' => 'TCP'
        }
      ]
    }
  }
end
_minikube_restart_minikube() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 29
def _minikube_restart_minikube
  log_process("Restart minikube") do
    raise ::Dapp::Error::Command, code: :minikube_not_found if shellout('which minikube').exitstatus == 1

    Process.fork do
      _minikube_set_original_sudo_caller_process_user!

      begin
        if shellout('minikube status').stdout.split("\n").map(&:strip).first =~ /minikube(VM)?: Running/
          shellout! 'minikube stop', verbose: true
        end
        shellout! 'minikube start --insecure-registry localhost:5000', verbose: true
      rescue ::Dapp::Error::Shellout
        exit 1
      end
    end

    _, status = Process.wait2
    raise ::Dapp::Error::Command, code: :cannot_restart_minikube unless status.success?
  end
end
_minikube_run_daemon(name) { || ... } click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 51
def _minikube_run_daemon(name, &blk)
  uid = Process.euid
  if uid != 0 && File.exists?("/run/user/#{uid}")
    pid_file_path = "/run/user/#{uid}/dapp_#{name}_daemon.pid"
  elsif uid != 0
    pid_file_path = "/tmp/dapp_#{name}_daemon.pid"
  else
    pid_file_path = "/run/dapp_#{name}_daemon.pid"
  end

  old_daemon_pid = begin
    File.open(pid_file_path, 'r').read.strip.to_i
  rescue Errno::ENOENT
  end
  if old_daemon_pid
    begin
      if Process.kill(0, old_daemon_pid)
        Process.kill('TERM', old_daemon_pid)
      end
      if Process.kill(0, old_daemon_pid)
        Process.kill('KILL', old_daemon_pid)
      end
    rescue Errno::ESRCH
    end
  end

  daemon_pid = Process.fork do
    File.open(pid_file_path, 'w') {|f| f.write "#{Process.pid}\n"}
    yield
  end
  Process.detach(daemon_pid)

  daemon_ok = true
  begin
    Process.kill(0, daemon_pid)

    5.times do
      sleep 1
      Process.kill(0, daemon_pid)
    end
  rescue Errno::ESRCH
    daemon_ok = false
  end
  raise ::Dapp::Error::Command, code: :"#{name}_daemon_failed" unless daemon_ok
end
_minikube_run_minikube_persisted_storage_daemon() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 97
def _minikube_run_minikube_persisted_storage_daemon
  log_process("Run minikube persisted storage daemon") do
    _minikube_run_daemon(:minikube_persisted_storage) do
      _minikube_set_original_sudo_caller_process_user!

      STDIN.reopen '/dev/null'
      STDOUT.reopen '/dev/null', 'a'

      mountdir = File.join(ENV['HOME'], '.minikube', 'persisted_storage')
      FileUtils.mkdir_p mountdir

      exec "minikube mount #{mountdir}"
    end
  end
end
_minikube_run_registry() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 128
def _minikube_run_registry
  log_process("Run registry") do
    _minikube_kubernetes.with_query(gracePeriodSeconds: 0) do
      if _minikube_kubernetes.replicationcontroller? _minikube_registry_replicationcontroller_spec['metadata']['name']
        _minikube_kubernetes.delete_replicationcontroller! _minikube_registry_replicationcontroller_spec['metadata']['name']

        shutdown_ok = false
        600.times do
          unless _minikube_kubernetes.replicationcontroller? _minikube_registry_replicationcontroller_spec['metadata']['name']
            shutdown_ok = true
            break
          end
          sleep 1
        end
        raise ::Dapp::Error::Command, code: :registry_replicationcontroller_shutdown_failed unless shutdown_ok
      end

      _minikube_kubernetes.delete_pods! labelSelector: 'k8s-app=kube-registry'
      shutdown_ok = false
      600.times do
        unless _minikube_find_registry_pod
          shutdown_ok = true
          break
        end
        sleep 1
      end
      raise ::Dapp::Error::Command, code: :registry_pod_shutdown_failed unless shutdown_ok

      if _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
        _minikube_kubernetes.delete_service! _minikube_registry_service_spec['metadata']['name']

        shutdown_ok = false
        600.times do
          unless _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
            shutdown_ok = true
            break
          end
          sleep 1
        end
        raise ::Dapp::Error::Command, code: :registry_service_shutdown_failed unless shutdown_ok
      end

      if _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
        _minikube_kubernetes.delete_pod! _minikube_registry_proxy_pod_spec['metadata']['name']

        shutdown_ok = false
        600.times do
          unless _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
            shutdown_ok = true
            break
          end
          sleep 1
        end
        raise ::Dapp::Error::Command, code: :registry_proxy_pod_shutdown_failed unless shutdown_ok
      end

      _minikube_kubernetes.create_replicationcontroller!(_minikube_registry_replicationcontroller_spec)
      registry_pod_ok = false
      600.times do
        if registry_pod = _minikube_find_registry_pod
          if registry_pod['status']['phase'] == 'Running'
            registry_pod_ok = true
            @_minikube_registry_pod_name = registry_pod['metadata']['name']
            break
          end
        end
        sleep 1
      end
      raise ::Dapp::Error::Command, code: :registry_pod_not_ok unless registry_pod_ok

      _minikube_kubernetes.create_service!(_minikube_registry_service_spec)
      registry_service_ok = false
      600.times do
        if _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
          registry_service_ok = true
          break
        end
        sleep 1
      end
      raise ::Dapp::Error::Command, code: :registry_service_not_ok unless registry_service_ok

      _minikube_kubernetes.create_pod! _minikube_registry_proxy_pod_spec
      registry_proxy_pod_ok = false
      600.times do
        if _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
          registry_proxy_pod = _minikube_kubernetes.pod(_minikube_registry_proxy_pod_spec['metadata']['name'])
          if registry_proxy_pod['status']['phase'] == 'Running'
            registry_proxy_pod_ok = true
            break
          end
        end
        sleep 1
      end
      raise ::Dapp::Error::Command, code: :registry_proxy_pod_not_ok unless registry_proxy_pod_ok
    end
  end
end
_minikube_run_registry_forwarder_daemon() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 226
def _minikube_run_registry_forwarder_daemon
  log_process("Run registry forwarder daemon") do
    registry_port_in_use = begin
      Socket.tcp('localhost', 5000).close
      true
    rescue Errno::ECONNREFUSED
      false
    end
    raise ::Dapp::Error::Command, code: :registry_port_in_use, data: {host: 'localhost', port: 5000} if registry_port_in_use

    _minikube_run_daemon(:registry_forwarder) do
      STDIN.reopen '/dev/null'
      STDOUT.reopen '/dev/null', 'a'

      exec "kubectl port-forward --namespace kube-system #{_minikube_registry_pod_name} 5000:5000"
    end
  end
end
_minikube_set_original_sudo_caller_process_user!() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 18
def _minikube_set_original_sudo_caller_process_user!
  if ENV['SUDO_UID'] and ENV['SUDO_GID']
    original_uid = ENV['SUDO_UID'].to_i
    original_gid = ENV['SUDO_GID'].to_i
    if original_uid != Process.uid && ENV['HOME'] == Etc.getpwuid(original_uid).dir
      Process::Sys.setgid(original_gid)
      Process::Sys.setuid(original_uid)
    end
  end
end
_minikube_wait_till_ready() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 113
def _minikube_wait_till_ready
  log_process("Wait till minikube ready") do
    600.times do
      begin
        return if _minikube_kubernetes.service?('kube-dns')
      rescue Kubernetes::Client::Error::ConnectionRefused
      end

      sleep 1
    end

    raise ::Dapp::Error::Command, code: :minikube_readiness_timeout
  end
end
kube_minikube_setup() click to toggle source
# File lib/dapp/kube/dapp/command/minikube_setup.rb, line 6
def kube_minikube_setup
  _minikube_restart_minikube

  # NOTICE: На данный момент выключено из-за непригодной
  # NOTICE: для использования медленности 'minikube mount' томов
  # _minikube_run_minikube_persisted_storage_daemon

  _minikube_wait_till_ready
  _minikube_run_registry
  _minikube_run_registry_forwarder_daemon
end