kube-config-parser 0.0.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/extensions/to_os.rb +9 -0
- data/lib/utils/kube_config_parser.rb +13 -158
- data/lib/utils/kube_config_parser/explainer.rb +116 -0
- data/lib/utils/kube_config_parser/expression.rb +69 -0
- data/lib/utils/kube_config_parser/paragraph.rb +35 -0
- data/lib/utils/kube_config_parser/parameter_center.rb +35 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c8dcb06918e59549d84796e1574254de4e0e2cf
|
4
|
+
data.tar.gz: 23649ff20456176905ca92ab0265d603451eb9d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9362cd8199e860c6729f1308560912607abc91ce6cdf450d36b1f512a20bc7d54e01209515e3a5ccb8940eb2c0a53b5afe3a5d5a83ce34609f7e03772810b04b
|
7
|
+
data.tar.gz: 0b1d6b7cadbe0797e447ad3ab762dd9f4431f7408b308a085df8dfc29dddace25171096d415c1bbce50760870e3d34fa8b6e59ad34af68b65f639671c77e5f85
|
@@ -1,168 +1,23 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
|
-
|
4
|
-
def self.kube_load(all_str)
|
5
|
-
all_str.split("---\n").reject(&:empty?).map do |paragraph|
|
6
|
-
YAML.load(paragraph)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
3
|
+
require_relative 'kube_config_parser/paragraph'
|
10
4
|
|
11
5
|
module ParserModule
|
12
|
-
class SimpleHash
|
13
|
-
def initialize(hash)
|
14
|
-
@hash = hash
|
15
|
-
end
|
16
|
-
|
17
|
-
def method_missing(method_name_sym)
|
18
|
-
result = @hash[method_name_sym.to_s] || @hash[method_name_sym]
|
19
|
-
return nil if result.nil?
|
20
|
-
SimpleHash.new(result)
|
21
|
-
end
|
22
|
-
|
23
|
-
def inspect
|
24
|
-
@hash.inspect
|
25
|
-
end
|
26
|
-
|
27
|
-
def to_s
|
28
|
-
@hash.to_s
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class EnvParser
|
33
|
-
|
34
|
-
|
35
|
-
False = false
|
36
|
-
True = true
|
37
|
-
|
38
|
-
def initialize(input_table, ifelse_stack)
|
39
|
-
@input_table = input_table
|
40
|
-
@variable_table = {}
|
41
|
-
@ifelse_stack = ifelse_stack
|
42
|
-
end
|
43
|
-
|
44
|
-
def ifelse_stack
|
45
|
-
@ifelse_stack
|
46
|
-
end
|
47
|
-
|
48
|
-
def update(line)
|
49
|
-
command = line.gsub(/\s?\|\s?/, ' || ').gsub(/set (.*?) =/, 'set[\'\1\'] =')
|
50
|
-
eval(command)
|
51
|
-
end
|
52
|
-
|
53
|
-
def set
|
54
|
-
@variable_table
|
55
|
-
end
|
56
|
-
|
57
|
-
def item
|
58
|
-
return SimpleHash.new(@input_table)
|
59
|
-
end
|
60
|
-
|
61
|
-
def default(value_str)
|
62
|
-
value_str
|
63
|
-
end
|
64
|
-
|
65
|
-
def method_missing(method_name_sym)
|
66
|
-
@variable_table[method_name_sym.to_s] || @variable_table[method_name_sym]
|
67
|
-
end
|
68
|
-
|
69
|
-
def echo(str)
|
70
|
-
command = '"' + str + '"'
|
71
|
-
#puts command
|
72
|
-
eval(command)
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
class IfElseStack
|
78
|
-
def initialize
|
79
|
-
@seq = []
|
80
|
-
end
|
81
|
-
|
82
|
-
def push(condition, str)
|
83
|
-
@seq.push([condition, str])
|
84
|
-
end
|
85
|
-
|
86
|
-
def top
|
87
|
-
condition, str = @seq.delete_at(0)
|
88
|
-
is_ruby_value = str.match(/#\{(.*?)\}/)
|
89
|
-
if is_ruby_value
|
90
|
-
value = @env_parser.instance_eval(is_ruby_value[1])
|
91
|
-
str = str.gsub(/#\{(.*?)\}/, value.to_s)
|
92
|
-
end
|
93
|
-
@env_parser.instance_eval(condition) ? str : nil
|
94
|
-
end
|
95
|
-
|
96
|
-
def set_env_parser(env_parser)
|
97
|
-
@env_parser = env_parser
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
class RubyStrParser
|
103
|
-
def self.parse(str)
|
104
|
-
str.gsub(/\{\{(.*?)\}\}/, '#{\1}').gsub(/\s?\|\s?/, ' || ').gsub('"', '\"')
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
6
|
class KubeConfigParser
|
109
7
|
def self.parse(template_path, variable_path)
|
110
|
-
|
111
|
-
|
112
|
-
yml_content = File.open(template_path).read.each_line.map(&:chomp).to_a
|
113
|
-
env_lines = []
|
114
|
-
normal_lines = []
|
115
|
-
|
116
|
-
in_if_else_block = false
|
117
|
-
if_else_matched_condition = nil
|
118
|
-
if_else_matched_lines = []
|
119
|
-
|
120
|
-
yml_content.each do |line|
|
121
|
-
match_result = line.match(/^\{\% (set (.*?)) \%\}$/)
|
122
|
-
if match_result
|
123
|
-
env_lines << match_result[1]
|
124
|
-
else
|
125
|
-
if in_if_else_block
|
126
|
-
match_if_else_end = line.match(/\{\% endif -?\%\}/)
|
127
|
-
if match_if_else_end
|
128
|
-
ifelse_stack.push(if_else_matched_condition, if_else_matched_lines.join("\n"))
|
129
|
-
normal_lines << '#{ifelse_stack.top}'
|
130
|
-
in_if_else_block = false
|
131
|
-
if_else_matched_condition = nil
|
132
|
-
if_else_matched_lines = []
|
133
|
-
else
|
134
|
-
if line.match(/\{\{.*?\}\}/)
|
135
|
-
if_else_matched_lines << RubyStrParser.parse(line)
|
136
|
-
else
|
137
|
-
if_else_matched_lines << line
|
138
|
-
end
|
139
|
-
end
|
140
|
-
else # not in if else block
|
141
|
-
match_if_else_start = line.match(/\{\% if (.*?) (is defined )?-?\%\}/)
|
142
|
-
if match_if_else_start
|
143
|
-
in_if_else_block = true
|
144
|
-
if_else_matched_condition = match_if_else_start[1]
|
145
|
-
else
|
146
|
-
normal_lines << line
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
8
|
+
variable_hash = YAML.load(File.open(variable_path).read)
|
9
|
+
config_template = File.open(template_path).read
|
151
10
|
|
152
|
-
|
153
|
-
|
154
|
-
normal_yml_content = normal_lines.join("\n")
|
155
|
-
normal_yml_content
|
156
|
-
|
157
|
-
parser = EnvParser.new(var_table, ifelse_stack)
|
158
|
-
ifelse_stack.set_env_parser(parser)
|
159
|
-
|
160
|
-
env_lines.each do |first_line|
|
161
|
-
parser.update(first_line)
|
162
|
-
end
|
163
|
-
|
164
|
-
ruby_style_content = RubyStrParser.parse(normal_yml_content)
|
165
|
-
parser.echo(ruby_style_content)
|
11
|
+
pm = Paragraph.new(config_template, variable_hash)
|
12
|
+
return pm.parse
|
166
13
|
end
|
167
14
|
end
|
168
15
|
end
|
16
|
+
|
17
|
+
|
18
|
+
if __FILE__ == $0
|
19
|
+
template_path = "resource/hdrs/service.yml.j2.old"
|
20
|
+
variable_path = "resource/hdrs/service_test.yml"
|
21
|
+
|
22
|
+
puts ParserModule::KubeConfigParser.parse(template_path, variable_path)
|
23
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require_relative 'expression'
|
2
|
+
|
3
|
+
class Explainer
|
4
|
+
|
5
|
+
@expression_map = {}
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :expression_map
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.inherited(sub_klass)
|
12
|
+
sub_klass.class_eval do
|
13
|
+
def self.register_expression(reg_exp)
|
14
|
+
Explainer.expression_map[reg_exp] = self
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(paragraph)
|
20
|
+
@paragraph = paragraph
|
21
|
+
end
|
22
|
+
|
23
|
+
def explain(lines)
|
24
|
+
new_lines = []
|
25
|
+
|
26
|
+
while not lines.empty?
|
27
|
+
line = lines[0]
|
28
|
+
|
29
|
+
matched_explainer_expression = self.class.expression_map.keys.find do |key|
|
30
|
+
line.match(key)
|
31
|
+
end
|
32
|
+
|
33
|
+
if matched_explainer_expression
|
34
|
+
matched_explainer = self.class.expression_map[matched_explainer_expression]
|
35
|
+
lines = matched_explainer.handle(lines)
|
36
|
+
else
|
37
|
+
new_lines << lines.shift
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
return new_lines
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class GlobalSetter < Explainer
|
46
|
+
START_REG = /^\{% set (.*?) %\}/
|
47
|
+
register_expression START_REG
|
48
|
+
|
49
|
+
def self.handle(paragraph_lines)
|
50
|
+
line = paragraph_lines.shift
|
51
|
+
content = line.match(START_REG)[1].gsub(' ','')
|
52
|
+
target, expression_str = content.split('=')
|
53
|
+
value = ExpressionPipe.handle(expression_str)
|
54
|
+
ParameterCenter.instance.register_item({target.to_sym => value})
|
55
|
+
return paragraph_lines
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class SimpleParser < Explainer
|
60
|
+
START_REG = /\{\{(.*?)\}\}/
|
61
|
+
register_expression START_REG
|
62
|
+
|
63
|
+
def self.handle(paragraph_lines)
|
64
|
+
line = paragraph_lines.shift
|
65
|
+
content = line.match(START_REG)[1]
|
66
|
+
value = ExpressionPipe.handle(content)
|
67
|
+
|
68
|
+
element = '{{' + content + '}}'
|
69
|
+
start_index = line.index(element)
|
70
|
+
end_index = start_index + element.size - 1
|
71
|
+
line[start_index..end_index] = value.to_s
|
72
|
+
paragraph_lines.insert(0, line)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class IfDefinedBlocker < Explainer
|
77
|
+
START_REG = /\{% if (.*?) is defined -%\}/
|
78
|
+
END_REG = /\{% endif -%\}/
|
79
|
+
|
80
|
+
register_expression self::START_REG
|
81
|
+
|
82
|
+
def self.handle(paragraph_lines)
|
83
|
+
|
84
|
+
block_lines = []
|
85
|
+
while not (line = paragraph_lines.shift).match(self::END_REG)
|
86
|
+
block_lines << line
|
87
|
+
end
|
88
|
+
block_lines << line
|
89
|
+
|
90
|
+
condition_line = block_lines[0]
|
91
|
+
content = condition_line.match(self::START_REG)[1]
|
92
|
+
|
93
|
+
begin
|
94
|
+
value = ExpressionPipe.handle(content)
|
95
|
+
raise NoMethodError if value.nil?
|
96
|
+
|
97
|
+
block_inner_lines = block_lines[1..-2]
|
98
|
+
paragraph_lines = block_inner_lines + paragraph_lines
|
99
|
+
rescue NoMethodError
|
100
|
+
# should be but no log currently
|
101
|
+
end
|
102
|
+
|
103
|
+
return paragraph_lines
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
class IfBlocker < IfDefinedBlocker
|
110
|
+
|
111
|
+
START_REG = /\{% if (.*?) %\}/
|
112
|
+
END_REG = /\{% endif %\}/
|
113
|
+
register_expression self::START_REG
|
114
|
+
|
115
|
+
end
|
116
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require_relative 'parameter_center'
|
2
|
+
|
3
|
+
class ExpressionPipe
|
4
|
+
|
5
|
+
def self.handle(expression_str)
|
6
|
+
expressions = expression_str.split('|').map {|expression_str| Expression.generate(expression_str) }
|
7
|
+
result = expressions.inject(nil){ |param, expression| expression.handle(param) }
|
8
|
+
return result
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
class Expression
|
14
|
+
@expression_map ={}
|
15
|
+
|
16
|
+
class << self
|
17
|
+
attr_accessor :expression_map
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.inherited(sub_klass)
|
21
|
+
sub_klass.class_eval do
|
22
|
+
def self.register_method(method_name)
|
23
|
+
Expression.expression_map[method_name] = self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def self.generate(expression_str)
|
30
|
+
result = ParameterCenter.instance.parse(expression_str)
|
31
|
+
result = NormalString.new(result) if not result.is_a? Expression
|
32
|
+
|
33
|
+
return result
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize(*parameters)
|
37
|
+
@parameters = parameters
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def handle(previous_value)
|
42
|
+
raise NotImplementedError
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
class B64encoder < Expression
|
49
|
+
register_method :b64encode
|
50
|
+
|
51
|
+
def handle(_)
|
52
|
+
return @parameters.first
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class DefaultString < Expression
|
58
|
+
register_method :default
|
59
|
+
|
60
|
+
def handle(previous_value)
|
61
|
+
previous_value || @parameters.first
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class NormalString < Expression
|
66
|
+
def handle(_)
|
67
|
+
return @parameters.first
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'extensions/to_os'
|
2
|
+
|
3
|
+
require_relative 'parameter_center'
|
4
|
+
require_relative 'expression'
|
5
|
+
require_relative 'explainer'
|
6
|
+
|
7
|
+
class Paragraph
|
8
|
+
def initialize(paragraph_content, variable_content)
|
9
|
+
@paragraph_lines = paragraph_content.lines.map(&:chomp)
|
10
|
+
@variables = {:item => OpenStruct.to_os(variable_content)}
|
11
|
+
|
12
|
+
ParameterCenter.instance.register_item(@variables)
|
13
|
+
ParameterCenter.instance.register_item(Expression.expression_map)
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse
|
17
|
+
explainer = Explainer.new(self)
|
18
|
+
lines = Marshal.load(Marshal.dump(@paragraph_lines))
|
19
|
+
new_lines = explainer.explain(lines)
|
20
|
+
return new_lines
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
if __FILE__ == $0
|
26
|
+
yaml_file = 'resource/service_master.yml'
|
27
|
+
require 'yaml'
|
28
|
+
variable_hash = YAML.load(File.open(yaml_file).read)
|
29
|
+
|
30
|
+
config_template_file= 'resource/service.yml.j2'
|
31
|
+
config_template = File.open(config_template_file).read
|
32
|
+
|
33
|
+
pm = Paragraph.new(config_template, variable_hash)
|
34
|
+
pm.parse
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
class ParameterCenter
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
False = false
|
7
|
+
True = true
|
8
|
+
|
9
|
+
attr_reader :registered_item_map
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@registered_item_map = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def register_item(item)
|
16
|
+
item.keys.each do |key|
|
17
|
+
@registered_item_map[key] = item[key]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse(str)
|
22
|
+
eval(str)
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing(method_name_sym, *args)
|
26
|
+
target = @registered_item_map[method_name_sym]
|
27
|
+
|
28
|
+
if args.empty?
|
29
|
+
return target
|
30
|
+
else
|
31
|
+
return target.new(*args)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kube-config-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yukai Jin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: a simple kube config parser
|
14
14
|
email: fish1928@outlook.com
|
@@ -16,7 +16,12 @@ executables: []
|
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
|
+
- lib/extensions/to_os.rb
|
19
20
|
- lib/utils/kube_config_parser.rb
|
21
|
+
- lib/utils/kube_config_parser/explainer.rb
|
22
|
+
- lib/utils/kube_config_parser/expression.rb
|
23
|
+
- lib/utils/kube_config_parser/paragraph.rb
|
24
|
+
- lib/utils/kube_config_parser/parameter_center.rb
|
20
25
|
homepage: https://github.com/fish1928/KubeConfigParser
|
21
26
|
licenses:
|
22
27
|
- MIT
|
@@ -40,5 +45,5 @@ rubyforge_project:
|
|
40
45
|
rubygems_version: 2.6.12
|
41
46
|
signing_key:
|
42
47
|
specification_version: 4
|
43
|
-
summary:
|
48
|
+
summary: KubeConfigParser
|
44
49
|
test_files: []
|