Class: Kdep::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/kdep/validator.rb

Instance Method Summary collapse

Instance Method Details

#validate(yaml_string, resource_name) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/kdep/validator.rb', line 5

def validate(yaml_string, resource_name)
  # Skip validation for empty/nil content (e.g., ingress with no domains)
  if yaml_string.nil? || yaml_string.strip.empty?
    return {"valid" => true, "errors" => []}
  end

  errors = []

  # Parse YAML
  begin
    doc = YAML.safe_load(yaml_string)
  rescue => e
    return {"valid" => false, "errors" => ["YAML parse error: #{e.message}"]}
  end

  unless doc.is_a?(Hash)
    return {"valid" => false, "errors" => ["YAML document is not a mapping"]}
  end

  # Common checks
  errors << "Missing required field: apiVersion" unless doc["apiVersion"]
  errors << "Missing required field: kind" unless doc["kind"]

  if doc["metadata"].is_a?(Hash)
    errors << "Missing required field: metadata.name" unless doc["metadata"]["name"]
    errors << "Missing required field: metadata.namespace" unless doc["metadata"]["namespace"]
  else
    errors << "Missing required field: metadata"
  end

  # Per-kind checks
  case resource_name
  when "deployment"
    if doc["spec"].is_a?(Hash)
      errors << "Missing required field: spec.replicas" unless doc["spec"]["replicas"]
      errors << "Missing required field: spec.template" unless doc["spec"]["template"]
    else
      errors << "Missing required field: spec"
    end
  when "service"
    if doc["spec"].is_a?(Hash)
      errors << "Missing required field: spec.ports" unless doc["spec"]["ports"]
    else
      errors << "Missing required field: spec"
    end
  when "ingress"
    if doc["spec"].is_a?(Hash)
      errors << "Missing required field: spec.rules" unless doc["spec"]["rules"]
    else
      errors << "Missing required field: spec"
    end
  when "job"
    if doc["spec"].is_a?(Hash)
      errors << "Missing required field: spec.template" unless doc["spec"]["template"]
    else
      errors << "Missing required field: spec"
    end
  when "cronjob"
    if doc["spec"].is_a?(Hash)
      errors << "Missing required field: spec.schedule" unless doc["spec"]["schedule"]
    else
      errors << "Missing required field: spec"
    end
  end

  {"valid" => errors.empty?, "errors" => errors}
end