Class: K8s::Resource
- Inherits:
-
RecursiveOpenStruct
- Object
- RecursiveOpenStruct
- K8s::Resource
- Includes:
- Comparable
- Defined in:
- lib/k8s/resource.rb
Overview
generic untyped resource
Direct Known Subclasses
Class Method Summary collapse
- .from_file(filename) ⇒ K8s::Resource
- .from_files(path) ⇒ Array<K8s::Resource>
- .from_json(data) ⇒ self
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #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
- #to_json(**options) ⇒ String
Constructor Details
#initialize(hash, recurse_over_arrays: true, **options) ⇒ Resource
Returns a new instance of Resource.
43 44 45 46 47 48 49 |
# File 'lib/k8s/resource.rb', line 43 def initialize(hash, recurse_over_arrays: true, **) super( hash.is_a?(Hash) ? hash : hash.to_h, recurse_over_arrays: recurse_over_arrays, ** ) end |
Class Method Details
.from_file(filename) ⇒ K8s::Resource
23 24 25 |
# File 'lib/k8s/resource.rb', line 23 def self.from_file(filename) new(YAML.safe_load(File.read(filename), [], [], true, filename)) end |
.from_files(path) ⇒ Array<K8s::Resource>
29 30 31 32 33 34 35 36 37 38 |
# File 'lib/k8s/resource.rb', line 29 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
17 18 19 |
# File 'lib/k8s/resource.rb', line 17 def self.from_json(data) new(K8s::JSONParser.parse(data)) end |
Instance Method Details
#<=>(other) ⇒ Object
51 52 53 |
# File 'lib/k8s/resource.rb', line 51 def <=>(other) to_h <=> (other.is_a?(Hash) ? other : other.to_h) end |
#can_patch?(config_annotation) ⇒ Boolean
100 101 102 |
# File 'lib/k8s/resource.rb', line 100 def can_patch?(config_annotation) !!.annotations&.dig(config_annotation) end |
#checksum ⇒ String
72 73 74 |
# File 'lib/k8s/resource.rb', line 72 def checksum @checksum ||= Digest::MD5.hexdigest(Marshal.dump(to_h)) end |
#current_config(config_annotation) ⇒ Hash
Gets the existing resources (on kube api) configuration, an empty hash if not present
87 88 89 90 91 92 93 94 95 96 |
# File 'lib/k8s/resource.rb', line 87 def current_config(config_annotation) current_cfg = .annotations&.dig(config_annotation) return {} unless current_cfg current_hash = K8s::JSONParser.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
65 66 67 68 69 |
# File 'lib/k8s/resource.rb', line 65 def merge(attrs) self.class.new( Util.deep_merge(to_hash, attrs.to_hash, overwrite_arrays: true, merge_nil_values: true) ) end |
#merge_patch_ops(attrs, config_annotation) ⇒ Hash
79 80 81 |
# File 'lib/k8s/resource.rb', line 79 def merge_patch_ops(attrs, config_annotation) Util.json_patch(current_config(config_annotation), Util.deep_transform_keys(attrs, :to_s)) end |
#to_json(**options) ⇒ String
57 58 59 |
# File 'lib/k8s/resource.rb', line 57 def to_json(**) to_h.to_json(**) end |