From ef200ee3a74666a5b1f0c2264a918b49693729b2 Mon Sep 17 00:00:00 2001 From: Alex Fattouche Date: Tue, 16 Jan 2018 16:47:01 -0500 Subject: [PATCH] Warn about kubernetes minimum version (#237) *Warning if attempting to deploy to a cluster with kubectl version less than 1.6 --- lib/kubernetes-deploy.rb | 1 + lib/kubernetes-deploy/deploy_task.rb | 3 +++ lib/kubernetes-deploy/errors.rb | 7 +++++++ lib/kubernetes-deploy/restart_task.rb | 9 ++++++++- lib/kubernetes-deploy/runner_task.rb | 9 +++++++-- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/kubernetes-deploy.rb b/lib/kubernetes-deploy.rb index 31918d791..b7bed0188 100644 --- a/lib/kubernetes-deploy.rb +++ b/lib/kubernetes-deploy.rb @@ -21,5 +21,6 @@ require 'kubernetes-deploy/duration_parser' module KubernetesDeploy + MIN_KUBE_VERSION = '1.6.0' KubernetesDeploy::StatsD.build end diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 2dacd69db..e15507cb7 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -441,6 +441,9 @@ def confirm_cluster_reachable end end raise FatalDeploymentError, "Failed to reach server for #{@context}" unless success + if kubectl.server_version < Gem::Version.new(MIN_KUBE_VERSION) + @logger.warn(KubernetesDeploy::Errors.server_version_warning(server_version)) + end end def confirm_namespace_exists diff --git a/lib/kubernetes-deploy/errors.rb b/lib/kubernetes-deploy/errors.rb index a90803c38..35ef999d7 100644 --- a/lib/kubernetes-deploy/errors.rb +++ b/lib/kubernetes-deploy/errors.rb @@ -8,4 +8,11 @@ def initialize(name, context) super("Namespace `#{name}` not found in context `#{context}`") end end + module Errors + extend self + def server_version_warning(server_version) + "Minimum cluster version requirement of #{MIN_KUBE_VERSION} not met. "\ + "Using #{server_version} could result in unexpected behavior as it is no longer tested against" + end + end end diff --git a/lib/kubernetes-deploy/restart_task.rb b/lib/kubernetes-deploy/restart_task.rb index 544a23062..b438abdbd 100644 --- a/lib/kubernetes-deploy/restart_task.rb +++ b/lib/kubernetes-deploy/restart_task.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'kubernetes-deploy/kubeclient_builder' require 'kubernetes-deploy/resource_watcher' +require 'kubernetes-deploy/kubectl' module KubernetesDeploy class RestartTask @@ -32,7 +33,9 @@ def perform(deployments_names = nil) @logger.phase_heading("Initializing restart") verify_namespace deployments = identify_target_deployments(deployments_names) - + if kubectl.server_version < Gem::Version.new(MIN_KUBE_VERSION) + @logger.warn(KubernetesDeploy::Errors.server_version_warning(kubectl.server_version)) + end @logger.phase_heading("Triggering restart by touching ENV[RESTARTED_AT]") patch_kubeclient_deployments(deployments) @@ -153,6 +156,10 @@ def kubeclient @kubeclient ||= build_v1_kubeclient(@context) end + def kubectl + @kubectl ||= Kubectl.new(namespace: @namespace, context: @context, logger: @logger, log_failure_by_default: true) + end + def v1beta1_kubeclient @v1beta1_kubeclient ||= build_v1beta1_kubeclient(@context) end diff --git a/lib/kubernetes-deploy/runner_task.rb b/lib/kubernetes-deploy/runner_task.rb index 0ce43a14e..0fc59920a 100644 --- a/lib/kubernetes-deploy/runner_task.rb +++ b/lib/kubernetes-deploy/runner_task.rb @@ -34,7 +34,9 @@ def run!(task_template:, entrypoint:, args:, env_vars: []) @logger.reset @logger.phase_heading("Validating configuration") validate_configuration(task_template, args) - + if kubectl.server_version < Gem::Version.new(MIN_KUBE_VERSION) + @logger.warn(KubernetesDeploy::Errors.server_version_warning(kubectl.server_version)) + end @logger.phase_heading("Fetching task template") raw_template = get_template(task_template) @@ -127,7 +129,6 @@ def validate_pod_spec(pod) f.write recursive_to_h(pod).to_json f.close - kubectl = Kubectl.new(namespace: @namespace, context: @context, logger: @logger, log_failure_by_default: true) _out, err, status = kubectl.run("apply", "--dry-run", "-f", f.path) unless status.success? @@ -135,6 +136,10 @@ def validate_pod_spec(pod) end end + def kubectl + @kubectl ||= Kubectl.new(namespace: @namespace, context: @context, logger: @logger, log_failure_by_default: true) + end + def recursive_to_h(struct) if struct.is_a?(Array) return struct.map { |v| v.is_a?(OpenStruct) || v.is_a?(Array) || v.is_a?(Hash) ? recursive_to_h(v) : v }