Class: Kube::Schema::Instance

Inherits:
Object
  • Object
show all
Defined in:
lib/kube/schema/instance.rb

Overview

Represents a single Kubernetes version’s OpenAPI schema. Lazily loads the Swagger JSON once per version (shared across instances) and builds resource classes by kind.

instance = Kube::Schema::Instance.new("1.34")
instance["Deployment"]           # => Resource subclass
instance["NetworkPolicy"]        # => Resource subclass
instance.list_resources          # => sorted array of kind strings

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(version) ⇒ Instance

Returns a new instance of Instance.



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/kube/schema/instance.rb', line 28

def initialize(version)
  @resource_classes = {}
  @sub_spec_classes = {}

  unless Gem::Version.correct?(version)
    raise UnknownVersionError,
      "\n#{version} is not a valid version string." \
      "\nUse `Kube::Schema.schema_versions` to get a list."
  end

  @version = version
end

Class Attribute Details

.schemersObject (readonly)

Returns the value of attribute schemers.



25
26
27
# File 'lib/kube/schema/instance.rb', line 25

def schemers
  @schemers
end

Instance Attribute Details

#versionObject (readonly)

Returns the value of attribute version.



18
19
20
# File 'lib/kube/schema/instance.rb', line 18

def version
  @version
end

Instance Method Details

#[](kind) ⇒ Object

Look up a resource by kind (e.g. “Deployment”, “NetworkPolicy”). Returns a class that inherits from Kube::Schema::Resource.

Custom schemas registered via Kube::Schema.register take precedence over built-in definitions, allowing users to override or extend the schema for any kind.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/kube/schema/instance.rb', line 47

def [](kind)
  @resource_classes[kind] ||= begin
    # Custom schemas win over built-in definitions.
    custom = find_custom_entry(kind)
    if custom
      build_resource_class(custom[:schema], custom[:defaults])
    else
      entry = find_gvk_entry(kind)

      if entry.nil?
        raise "No resource schema found for #{kind}!" \
          "\nUse #list_resources to see available kinds for v#{version}."
      end

      ref_schema = schemer.ref("#/definitions/#{entry[:definition_key]}")
      build_resource_class(ref_schema, entry[:defaults].freeze)
    end
  end
end

#list_definitionsArray<String>

All available definition short names for this version.

Returns:

  • (Array<String>)

    sorted, deduplicated short names



102
103
104
105
106
# File 'lib/kube/schema/instance.rb', line 102

def list_definitions
  schemer.value.fetch("definitions", {}).keys
    .map { |k| k.split(".").last }
    .uniq.sort
end

#list_resourcesArray<String>

All available resource kinds for this version, including any custom schemas registered via Kube::Schema.register.

Returns:

  • (Array<String>)

    sorted kind names



71
72
73
# File 'lib/kube/schema/instance.rb', line 71

def list_resources
  (gvk_index.keys + Schema.custom_schemas.keys).uniq.sort
end

#sub_spec(name) ⇒ Object

Look up a sub-spec definition by short name (e.g. “Container”, “ContainerPort”, “Volume”, “Probe”). Returns a class that inherits from Kube::Schema::SubSpec.

Also accepts a full definition key like “io.k8s.api.core.v1.Container” for disambiguation.

instance.sub_spec("Container")     # => SubSpec subclass
instance.sub_spec("ContainerPort") # => SubSpec subclass


85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/kube/schema/instance.rb', line 85

def sub_spec(name)
  @sub_spec_classes[name] ||= begin
    definition_key = find_definition_key(name)

    if definition_key.nil?
      raise "No definition found for #{name}!" \
        "\nUse #list_definitions to see available definitions for v#{version}."
    end

    ref_schema = schemer.ref("#/definitions/#{definition_key}")
    build_sub_spec_class(ref_schema, name)
  end
end