From 05f10db907766c022f6081320616921ebc81259b Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Tue, 17 Apr 2018 08:55:43 -0700 Subject: [PATCH] Raise an error when 'kind' is missing --- lib/kubernetes-deploy/deploy_task.rb | 1 + lib/kubernetes-deploy/errors.rb | 3 ++- lib/kubernetes-deploy/kubernetes_resource.rb | 4 +++- test/fixtures/invalid-resources/missing_kind.yml | 5 +++++ test/integration/kubernetes_deploy_test.rb | 10 ++++++++++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/invalid-resources/missing_kind.yml diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 547ecb337..67fc6e07c 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -253,6 +253,7 @@ def split_templates(filename) yield doc end rescue InvalidTemplateError => e + e.filename ||= filename record_invalid_template(err: e.message, filename: e.filename, content: e.content) raise FatalDeploymentError, "Failed to render and parse template" rescue Psych::SyntaxError => e diff --git a/lib/kubernetes-deploy/errors.rb b/lib/kubernetes-deploy/errors.rb index 9e2b8c160..5709d97b2 100644 --- a/lib/kubernetes-deploy/errors.rb +++ b/lib/kubernetes-deploy/errors.rb @@ -4,7 +4,8 @@ class FatalDeploymentError < StandardError; end class KubectlError < StandardError; end class InvalidTemplateError < FatalDeploymentError - attr_reader :filename, :content + attr_reader :content + attr_accessor :filename def initialize(err, filename:, content: nil) @filename = filename @content = content diff --git a/lib/kubernetes-deploy/kubernetes_resource.rb b/lib/kubernetes-deploy/kubernetes_resource.rb index 6bf52c901..2967bb04c 100644 --- a/lib/kubernetes-deploy/kubernetes_resource.rb +++ b/lib/kubernetes-deploy/kubernetes_resource.rb @@ -31,7 +31,9 @@ class << self def build(namespace:, context:, definition:, logger:, statsd_tags:) opts = { namespace: namespace, context: context, definition: definition, logger: logger, statsd_tags: statsd_tags } - if KubernetesDeploy.const_defined?(definition["kind"]) + if definition["kind"].blank? + raise InvalidTemplateError.new("Template missing 'Kind'", filename: nil, content: definition.to_s) + elsif KubernetesDeploy.const_defined?(definition["kind"]) klass = KubernetesDeploy.const_get(definition["kind"]) klass.new(**opts) else diff --git a/test/fixtures/invalid-resources/missing_kind.yml b/test/fixtures/invalid-resources/missing_kind.yml new file mode 100644 index 000000000..84e69b5b0 --- /dev/null +++ b/test/fixtures/invalid-resources/missing_kind.yml @@ -0,0 +1,5 @@ +apiVersion: v1 +metadata: + name: test +data: + datapoint: value1 diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index 43c0be8cc..cea75046b 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -986,4 +986,14 @@ def test_adds_namespace_labels_to_statsd_tags assert_empty desired_tags - metric.tags end end + + def test_raise_on_yaml_missing_kind + result = deploy_fixtures("invalid-resources", subset: ["missing_kind.yml"]) + assert_deploy_failure(result) + assert_logs_match_all([ + "Invalid template: missing_kind.yml", + "> Error message:", + "Template missing 'Kind'" + ], in_order: true) + end end