Class: K8s::Resource
- Inherits:
-
RecursiveOpenStruct
- Object
- RecursiveOpenStruct
- K8s::Resource
- Extended by:
- Forwardable
- Includes:
- Comparable
- Defined in:
- lib/k8s/resource.rb
Overview
generic untyped resource
Class Method Summary collapse
- .from_file(filename) ⇒ K8s::Resource
- .from_files(path) ⇒ Array<K8s::Resource>
- .from_json(data) ⇒ self
Instance Method Summary collapse
- #<=>(other) ⇒ Boolean
- #can_patch?(config_annotation) ⇒ Boolean
- #checksum ⇒ String
-
#current_config(config_annotation) ⇒ Hash
Gets the existing resources (on kube api) configuration, an empty hash if not present.
-
#initialize(hash, recurse_over_arrays: true, **options) ⇒ Resource
constructor
A new instance of Resource.
-
#merge(attrs) ⇒ K8s::Resource
merge in fields.
- #merge_patch_ops(attrs, config_annotation) ⇒ Hash
- #stringify_hash(hash) ⇒ Hash
- #to_json(**options) ⇒ String
Constructor Details
#initialize(hash, recurse_over_arrays: true, **options) ⇒ Resource
Returns a new instance of Resource.
45 46 47 48 49 50 |
# File 'lib/k8s/resource.rb', line 45 def initialize(hash, recurse_over_arrays: true, **) super(hash, recurse_over_arrays: recurse_over_arrays, ** ) end |
Class Method Details
.from_file(filename) ⇒ K8s::Resource
25 26 27 |
# File 'lib/k8s/resource.rb', line 25 def self.from_file(filename) new(YAML.safe_load(File.read(filename), [], [], true, filename)) end |
.from_files(path) ⇒ Array<K8s::Resource>
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/k8s/resource.rb', line 31 def self.from_files(path) stat = File.stat(path) if stat.directory? # recurse Dir.glob("#{path}/*.{yml,yaml}").sort.map { |dir| from_files(dir) }.flatten else YAML.safe_load_stream(File.read(path), path).map{ |doc| new(doc) } end end |
.from_json(data) ⇒ self
19 20 21 |
# File 'lib/k8s/resource.rb', line 19 def self.from_json(data) new(Yajl::Parser.parse(data)) end |
Instance Method Details
#<=>(other) ⇒ Boolean
60 61 62 |
# File 'lib/k8s/resource.rb', line 60 def <=>(other) to_hash <=> other.to_hash end |
#can_patch?(config_annotation) ⇒ Boolean
107 108 109 |
# File 'lib/k8s/resource.rb', line 107 def can_patch?(config_annotation) !!.annotations&.dig(config_annotation) end |
#checksum ⇒ String
79 80 81 |
# File 'lib/k8s/resource.rb', line 79 def checksum @checksum ||= Digest::MD5.hexdigest(Marshal.dump(to_hash)) end |
#current_config(config_annotation) ⇒ Hash
Gets the existing resources (on kube api) configuration, an empty hash if not present
94 95 96 97 98 99 100 101 102 103 |
# File 'lib/k8s/resource.rb', line 94 def current_config(config_annotation) current_cfg = .annotations&.dig(config_annotation) return {} unless current_cfg current_hash = Yajl::Parser.parse(current_cfg) # kubectl adds empty metadata.namespace, let's fix it current_hash['metadata'].delete('namespace') if current_hash.dig('metadata', 'namespace').to_s.empty? current_hash end |
#merge(attrs) ⇒ K8s::Resource
merge in fields
68 69 70 71 72 73 74 75 76 |
# File 'lib/k8s/resource.rb', line 68 def merge(attrs) # deep clone of attrs h = to_hash # merge in-place h.deep_merge!(attrs.to_hash, overwrite_arrays: true, merge_nil_values: true) self.class.new(h) end |
#merge_patch_ops(attrs, config_annotation) ⇒ Hash
86 87 88 |
# File 'lib/k8s/resource.rb', line 86 def merge_patch_ops(attrs, config_annotation) Util.json_patch(current_config(config_annotation), stringify_hash(attrs)) end |
#stringify_hash(hash) ⇒ Hash
113 114 115 |
# File 'lib/k8s/resource.rb', line 113 def stringify_hash(hash) Yajl::Parser.parse(JSON.dump(hash)) end |
#to_json(**options) ⇒ String
54 55 56 |
# File 'lib/k8s/resource.rb', line 54 def to_json(**) to_hash.to_json(**) end |