minfra-cli 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 424233e63c75e0e9b9d65bd7dba78a3f3d2132c547f3cf37b7acb3fdb66784c5
4
- data.tar.gz: 0ad7e2960fff01802a047e33e955d0b77e8cf3284c4033a18111ccde42175aec
3
+ metadata.gz: 5429a3e13b8387b6c3e011eaa2513ac5963ef30c4a14f9458e882a7df0507753
4
+ data.tar.gz: 2dbdd6e4e0f4c3cbade95033f52af2480a7a0b421508a68066e1a87ab6049109
5
5
  SHA512:
6
- metadata.gz: c689a675040c603ef5acf7f04a6c147212d40749652536599dee68fe0bd078c3e79b4e3f41aec92c2850f5106c72ccee79ad5f9d31e509a7498f8d1bdf4f5644
7
- data.tar.gz: 93816f96aab379a0bf972808359e7298ae55afea97f204683d07878cb1937689dd2054d3ff3aba5bd3d1a4d49796bf32dc164e8692e3a37f765047331de6d094
6
+ metadata.gz: 188ce70ec6fabf9b6d72ddfc0855ce499e63c92bc079d525e044dec3c21b49d5a6c2aba1576a869c5126ef3a27f14bc7aa1e7222b1deff49e8cc35c645cda621
7
+ data.tar.gz: 877789c92138b28e33314592464fc5650765729a90ea8d84388c9ca10ea4065dd5988fbfbc9b047ebf0604d28552e38243d5407a52ee7cf9ae18f03b075b8e19
data/.gitignore CHANGED
@@ -14,5 +14,6 @@ vendor
14
14
  spec/docker-compose.run.yml
15
15
 
16
16
  minfra-cli-*.gem
17
+ Gemfile.lock
17
18
 
18
19
  .rspec
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 2.1.0
2
+ * add :all hook
3
+ * fixing setup dev
4
+ * colored errors
5
+ * wrapping hiera lookup errors of gpg
6
+ * adding HIERA_DEBUG_LOOKUPS=true
1
7
  # 2.0.1
2
8
  Refactorings
3
9
  * installing into Kernel only when 'exec' not at 'init' time
@@ -17,7 +23,7 @@
17
23
  * new Kernel method: minfra_cli which is the CliStarter Object
18
24
 
19
25
  # 1.13.3
20
- * BUG: fixing 'labelÄ
26
+ * BUG: fixing 'label'
21
27
  # 1.13.2
22
28
  * BUG: fixing 'generic_secret'
23
29
  # 1.13.1
data/README.md CHANGED
@@ -14,7 +14,9 @@ Is a KIND (k8s in docker) based development environment.
14
14
  | | MINFRA_ARGV_FILE | | --minfra_argv_file [PATH TO A CSV FILE FILE] | |
15
15
  | | MINFRA_LOGGING_LEVEL | minfra.logging_level | | |
16
16
  | | | minfra.hiera.env_path | | |
17
- | | | default_stacks | | env.stacks | env.roles |
17
+ | | | default_stacks | | env.stacks or env.roles |
18
+ | | | | | infra::allow_insecure_k8s_connections |
19
+ | when set to 'true' all hiera lookups are logged on debug level | MINFRA_DEBUG_HIERA_LOOKUPS | | | |
18
20
 
19
21
 
20
22
  ## Expected hiera data
@@ -18,6 +18,7 @@ module Minfra
18
18
  end
19
19
 
20
20
  def self.text(question, default = nil)
21
+ answer = nil
21
22
  loop do
22
23
  message = format('%s%s: ', question, default && " (#{default})")
23
24
  $stdout.write message
@@ -31,6 +31,7 @@ module Minfra
31
31
 
32
32
  init_minfrarc
33
33
  init_envs
34
+
34
35
  init_hiera
35
36
  init_plugins
36
37
 
@@ -140,7 +141,7 @@ module Minfra
140
141
  end
141
142
 
142
143
  def init_hiera
143
- @hiera = @env.hiera
144
+ @hiera = @env.hiera
144
145
  end
145
146
 
146
147
  def init_envs
@@ -149,7 +150,7 @@ module Minfra
149
150
  root = base_path.join('hiera')
150
151
  root.join('hieradata',env_path).glob('*.eyaml').sort.each do |path|
151
152
  env_name = path.basename.sub(/(\..+)/,'').to_s
152
- @envs[env_name]=Env.new(hiera_root: root, hiera_env_path: env_path, name: env_name)
153
+ @envs[env_name]=Env.new(hiera_root: root, hiera_env_path: env_path, name: env_name, hiera_debug_lookups: ENV['MINFRA_DEBUG_HIERA_LOOKUPS'] == 'true')
153
154
  end
154
155
  @env = @envs[@env_name] # set the current env
155
156
  end
@@ -18,8 +18,6 @@ module Minfra
18
18
  def setup_config
19
19
  config = Minfra::Cli.config
20
20
  ensure_path_and_template(config.config_path, config.base_path.join('config', 'me_config.json.erb'))
21
- config.init!
22
- config.load('dev')
23
21
  end
24
22
 
25
23
  def ensure_path_and_template(dest_path, template_path, params = {})
@@ -25,14 +25,6 @@ module Minfra
25
25
  end
26
26
  end
27
27
 
28
- def parse_cmd(cmd, silence: false)
29
- reply = JSON.parse(run_cmd(cmd, silence:))
30
- rescue JSON::ParserError, TypeError
31
- error "ERROR: #{$ERROR_INFO.message}"
32
- error reply
33
- error "command was: #{cmd}"
34
- exit 1
35
- end
36
28
  end
37
29
  end
38
30
  end
@@ -2,12 +2,13 @@ module Minfra
2
2
  module Cli
3
3
  class Env
4
4
  attr_reader :name, :hiera
5
- def initialize(name:, hiera_root:, hiera_env_path:)
5
+ def initialize(name:, hiera_root:, hiera_env_path:, hiera_debug_lookups: )
6
6
  @name = name
7
7
  @hiera = HieraLooker.new(
8
8
  root: hiera_root,
9
9
  env_name: name,
10
- env_path: hiera_env_path
10
+ env_path: hiera_env_path,
11
+ debug_lookups: hiera_debug_lookups
11
12
  )
12
13
  end
13
14
 
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'English'
3
4
  module Minfra
4
5
  module Cli
5
6
  class HieraLooker
6
- def initialize(root:, env_name:, env_path:)
7
+ include Logging
8
+ def initialize(root:, env_name:, env_path:, debug_lookups: false)
7
9
  @root = Pathname.new(root)
8
10
  @env_name = env_name
9
11
  @cache = {}
@@ -18,13 +20,15 @@ module Minfra
18
20
  scope = { 'hieraroot' => @root.to_s, 'env' => @env_name }
19
21
 
20
22
  @special_lookups = @hiera.lookup('lookup_options', {}, scope, nil, :priority)
21
-
23
+
22
24
  node_scope = @hiera.lookup('env', {}, scope, nil, :deeper)
23
25
  @scope = scope.merge(node_scope)
26
+ @debug_lookups = debug_lookups
24
27
  end
25
28
 
26
29
  def l(value, default = nil)
27
- # debugger if @env_name == 'production-management' && value == 'env.tags'
30
+ debug "hiera: #{value}" if @debug_lookups
31
+ # debugger if @env_name == 'production-management' && value == 'env.tags'
28
32
  return @cache[value] if @cache.key?(value)
29
33
 
30
34
  values = value.split('.')
@@ -35,7 +39,18 @@ module Minfra
35
39
  else
36
40
  :deep
37
41
  end
38
- result = @hiera.lookup(fst_value, default, @scope, nil, lookup_type)
42
+ begin
43
+ result = @hiera.lookup(fst_value, default, @scope, nil, lookup_type)
44
+ rescue GPGME::Error::NoSecretKey
45
+ error("Have no gpg configuration to decrypt your hiera key: #{value}")
46
+ raise Errors::ExitError
47
+ rescue GPGME::Error::BadPassphrase
48
+ error("Your password was wrong for hiera key: #{value}")
49
+ raise Errors::ExitError
50
+ rescue GPGME::Error
51
+ error("Having decrypt problems for hiera key: #{value}, #{$ERROR_INFO.message}")
52
+ raise Errors::ExitError
53
+ end
39
54
  result = result.dig(*values) if !values.empty? && result.is_a?(Hash) # we return nil or the scalar value and only drill down on hashes
40
55
  result = default if result.nil?
41
56
  result = Hashie::Mash.new(result) if result.is_a?(Hash)
@@ -46,9 +61,9 @@ module Minfra
46
61
  def l!(value, default = nil)
47
62
  v = l(value, default)
48
63
  raise("Value not found! #{value}") if v.nil?
64
+
49
65
  v
50
66
  end
51
-
52
67
  end
53
68
  end
54
69
  end
@@ -12,9 +12,12 @@ class Thor
12
12
  elsif public_method?(instance)
13
13
  hooks = instance.instance_variable_get(:@_invocations).values.flatten
14
14
  arity = instance.method(name).arity
15
+ Minfra::Cli.call_before_hooks(instance, ['all']) if hooks.size == 1
15
16
  Minfra::Cli.call_before_hooks(instance, hooks)
17
+ # debugger
16
18
  instance.__send__(name, *args)
17
19
  Minfra::Cli.call_after_hooks(instance, hooks)
20
+ Minfra::Cli.call_after_hooks(instance, ['all']) if hooks.size == 1
18
21
  elsif local_method?(instance, :method_missing)
19
22
  # Minfra::Cli.call_before_hooks(instance,hooks)
20
23
  instance.__send__(:method_missing, name.to_sym, *args)
@@ -77,6 +80,7 @@ module Minfra
77
80
  end
78
81
 
79
82
  def call_after_hooks(obj, names)
83
+ # debug("Checking after hook #{names}")
80
84
  @hooks.select { |h| h.match?(:after, names) }.each do |h|
81
85
  debug("Hook after: #{names.join(',')}")
82
86
  h.exec(obj)
@@ -4,7 +4,7 @@ module Minfra
4
4
  module Cli
5
5
  module Logging
6
6
  def error(str)
7
- logger.error str
7
+ logger.error(colored(str, :red))
8
8
  end
9
9
 
10
10
  def exit_error(str)
@@ -17,11 +17,11 @@ module Minfra
17
17
  end
18
18
 
19
19
  def warn(str)
20
- logger.warn str
20
+ logger.warn(colored(str, :yellow))
21
21
  end
22
22
 
23
23
  def debug(str)
24
- logger.debug str
24
+ logger.debug(str)
25
25
  end
26
26
 
27
27
  def deprecated(comment)
@@ -33,6 +33,14 @@ module Minfra
33
33
  def logger
34
34
  Minfra::Cli.logger
35
35
  end
36
+ LOGGING_COLORS={ red: '1;31;40', green: '1;32;40' , dark_green: '0;32;40' , yellow: '1;33;40' }
37
+ def colored(str, color)
38
+ if $stdout.isatty
39
+ "\e[#{LOGGING_COLORS[color] || LOGGING_COLORS[:color1]}m#{str}\e[0m"
40
+ else
41
+ str
42
+ end
43
+ end
36
44
  end
37
45
  end
38
46
  end
@@ -13,14 +13,16 @@ module Minfra
13
13
 
14
14
  attr_reader :stdout_lines
15
15
 
16
- def initialize
16
+ def initialize(on_output: nil)
17
17
  @stderr_lines = []
18
18
  @stdout_lines = []
19
19
  @status = nil
20
+ @on_output = on_output
20
21
  end
21
22
 
22
23
  def add(line, stream = :stdout)
23
24
  line.chomp!
25
+ @on_output.call(line, stream) if @on_output
24
26
  if stream == :stdout
25
27
  @stdout_lines << line
26
28
  debug line
@@ -60,23 +62,25 @@ module Minfra
60
62
  new(cmd, **args).run
61
63
  end
62
64
 
63
- attr_reader :exit_on_error, :runner, :cmd
65
+ attr_reader :exit_on_error, :runner, :cmd, :on_output
64
66
 
65
- def initialize(cmd, exit_on_error: true, runner: :popen)
67
+ def initialize(cmd, exit_on_error: true, runner: :popen, on_output: nil)
66
68
  @cmd = cmd
67
69
  @exit_on_error = exit_on_error
68
70
  @runner = runner
71
+ @on_output = on_output
69
72
  end
70
73
 
71
74
  def run
72
75
  debug("running (#{@runner}): #{@cmd}")
73
- res = case @runner
76
+ res = Result.new(on_output:)
77
+ case @runner
74
78
  when :system
75
- run_system(Result.new)
79
+ run_system(res)
76
80
  when :popen
77
- run_threaded(Result.new)
81
+ run_threaded(res)
78
82
  when :exec
79
- run_exec(Result.new)
83
+ run_exec(res)
80
84
  else
81
85
  raise "unknown runner #{@runner}"
82
86
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'erb'
4
-
5
4
  module Minfra
6
5
  module Cli
7
6
  # not threadsafe!
@@ -30,14 +29,15 @@ module Minfra
30
29
 
31
30
  source.glob('**/*') do |filename|
32
31
  rel_path = filename.relative_path_from(source)
33
-
34
32
  if File.directory?(filename) # check if it s file and extension is not .tf
35
33
  FileUtils.mkdir_p("#{destination}/#{rel_path}")
36
34
  elsif extensions.include?(File.extname(filename)) # a file
35
+ # puts("templating: #{filename}")
37
36
  content = File.read(filename)
38
37
  modified_content = Minfra::Cli::Templater.render(content, {})
39
38
  File.write("#{destination}/#{rel_path}", modified_content)
40
39
  else
40
+ # puts("copying : #{filename}")
41
41
  FileUtils.cp(filename, destination.join(rel_path))
42
42
  end
43
43
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Minfra
4
4
  module Cli
5
- VERSION = '2.0.1'
5
+ VERSION = '2.1.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minfra-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Schrammel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-05 00:00:00.000000000 Z
11
+ date: 2024-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -157,7 +157,6 @@ files:
157
157
  - CHANGELOG.md
158
158
  - Dockerfile
159
159
  - Gemfile
160
- - Gemfile.lock
161
160
  - README.md
162
161
  - Rakefile
163
162
  - bin/build
data/Gemfile.lock DELETED
@@ -1,81 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- minfra-cli (2.0.0)
5
- activesupport (= 7.0.7.2)
6
- erubis (~> 2.7)
7
- hashie (~> 3.5)
8
- hiera (= 3.9.0)
9
- hiera-eyaml (= 3.3.0)
10
- hiera-eyaml-gpg (= 0.7.4)
11
- rest-client (~> 2.0)
12
- table_print (= 1.5.6)
13
- thor (~> 1.0, >= 1.0.0)
14
-
15
- GEM
16
- remote: https://rubygems.org/
17
- specs:
18
- activesupport (7.0.7.2)
19
- concurrent-ruby (~> 1.0, >= 1.0.2)
20
- i18n (>= 1.6, < 2)
21
- minitest (>= 5.1)
22
- tzinfo (~> 2.0)
23
- concurrent-ruby (1.2.2)
24
- diff-lcs (1.5.0)
25
- domain_name (0.6.20231109)
26
- erubis (2.7.0)
27
- hashie (3.6.0)
28
- hiera (3.9.0)
29
- hiera-eyaml (3.3.0)
30
- highline
31
- optimist
32
- hiera-eyaml-gpg (0.7.4)
33
- hiera-eyaml (>= 1.3.8)
34
- highline (2.1.0)
35
- http-accept (1.7.0)
36
- http-cookie (1.0.5)
37
- domain_name (~> 0.5)
38
- i18n (1.14.1)
39
- concurrent-ruby (~> 1.0)
40
- mime-types (3.5.1)
41
- mime-types-data (~> 3.2015)
42
- mime-types-data (3.2023.1205)
43
- minitest (5.20.0)
44
- netrc (0.11.0)
45
- optimist (3.1.0)
46
- rake (12.3.3)
47
- rest-client (2.1.0)
48
- http-accept (>= 1.7.0, < 2.0)
49
- http-cookie (>= 1.0.2, < 2.0)
50
- mime-types (>= 1.16, < 4.0)
51
- netrc (~> 0.8)
52
- rspec (3.12.0)
53
- rspec-core (~> 3.12.0)
54
- rspec-expectations (~> 3.12.0)
55
- rspec-mocks (~> 3.12.0)
56
- rspec-core (3.12.2)
57
- rspec-support (~> 3.12.0)
58
- rspec-expectations (3.12.3)
59
- diff-lcs (>= 1.2.0, < 2.0)
60
- rspec-support (~> 3.12.0)
61
- rspec-mocks (3.12.6)
62
- diff-lcs (>= 1.2.0, < 2.0)
63
- rspec-support (~> 3.12.0)
64
- rspec-support (3.12.1)
65
- table_print (1.5.6)
66
- thor (1.3.0)
67
- timecop (0.9.8)
68
- tzinfo (2.0.6)
69
- concurrent-ruby (~> 1.0)
70
-
71
- PLATFORMS
72
- ruby
73
-
74
- DEPENDENCIES
75
- minfra-cli!
76
- rake (~> 12.0)
77
- rspec (~> 3.0)
78
- timecop (~> 0.9.5)
79
-
80
- BUNDLED WITH
81
- 2.1.4