ops_team 0.14.3 → 0.15.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/app_config.rb +9 -9
- data/lib/builtin.rb +2 -0
- data/lib/builtins/envdiff.rb +117 -0
- data/lib/environment.rb +9 -7
- data/lib/ops.rb +4 -0
- data/lib/secrets.rb +17 -13
- data/ops_team.gemspec +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3beee0325741d140b711ee3f939306452b176b9be9f7d9094c1e578ed780373
|
4
|
+
data.tar.gz: 33aef85445dd2494967e246c1b4ebfe7433d76b9b09512756cb2a086321438cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0d69fca7b243d34d4c14cf53d8b10942b212cd53fd897c136079d9883e939670f3b74c3383df547d6c2f9a7c1d25f0ce4ba11e3337e566cdab010a6ebe81ef9
|
7
|
+
data.tar.gz: 96e25352e3b8b337a53632e560e1f494c38d2fc09b0b314c4a4e6e07aec92324b52051ac0c5235a4ab8d394247683890230dd5b29fe86b8ec26102af0482c559
|
data/lib/app_config.rb
CHANGED
@@ -8,6 +8,14 @@ class AppConfig
|
|
8
8
|
new(app_config_path).load
|
9
9
|
end
|
10
10
|
|
11
|
+
def default_filename
|
12
|
+
config_path_for(Environment.environment)
|
13
|
+
end
|
14
|
+
|
15
|
+
def config_path_for(env)
|
16
|
+
"config/#{env}/config.json"
|
17
|
+
end
|
18
|
+
|
11
19
|
private
|
12
20
|
|
13
21
|
def app_config_path
|
@@ -20,7 +28,7 @@ class AppConfig
|
|
20
28
|
end
|
21
29
|
|
22
30
|
def initialize(filename = "")
|
23
|
-
@filename = filename.empty? ? default_filename : filename
|
31
|
+
@filename = filename.empty? ? AppConfig.default_filename : filename
|
24
32
|
end
|
25
33
|
|
26
34
|
def load
|
@@ -31,10 +39,6 @@ class AppConfig
|
|
31
39
|
|
32
40
|
private
|
33
41
|
|
34
|
-
def default_filename
|
35
|
-
"config/#{environment}/config.json"
|
36
|
-
end
|
37
|
-
|
38
42
|
def config
|
39
43
|
@config ||= file_contents ? YAML.safe_load(file_contents) : {}
|
40
44
|
rescue YAML::SyntaxError => e
|
@@ -48,8 +52,4 @@ class AppConfig
|
|
48
52
|
nil
|
49
53
|
end
|
50
54
|
end
|
51
|
-
|
52
|
-
def environment
|
53
|
-
ENV['environment']
|
54
|
-
end
|
55
55
|
end
|
data/lib/builtin.rb
CHANGED
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'builtin'
|
4
|
+
|
5
|
+
module Builtins
|
6
|
+
class EnvDiff < Builtin
|
7
|
+
class << self
|
8
|
+
def description
|
9
|
+
"compares keys present in config and secrets between different environments"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
check_args
|
15
|
+
|
16
|
+
if source_only_keys.empty? && dest_only_keys.empty?
|
17
|
+
Output.out("Environments '#{source_env}' and '#{dest_env}' define the same #{source_keys.length} key(s).")
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
output_key_summary(source_only_keys, source_env, dest_env) if source_only_keys.any?
|
22
|
+
output_key_summary(dest_only_keys, dest_env, source_env) if dest_only_keys.any?
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def output_key_summary(keys, in_env, not_in_env)
|
28
|
+
Output.warn("Environment '#{in_env}' defines keys that '#{not_in_env}' does not:\n")
|
29
|
+
keys.each do |key|
|
30
|
+
Output.warn(" - #{key}")
|
31
|
+
end
|
32
|
+
Output.out("")
|
33
|
+
end
|
34
|
+
|
35
|
+
def source_only_keys
|
36
|
+
@source_only_keys ||= source_keys - dest_keys
|
37
|
+
end
|
38
|
+
|
39
|
+
def dest_only_keys
|
40
|
+
@dest_only_keys ||= dest_keys - source_keys
|
41
|
+
end
|
42
|
+
|
43
|
+
def source_keys
|
44
|
+
@source_keys ||= keys_for(source_env)
|
45
|
+
end
|
46
|
+
|
47
|
+
def dest_keys
|
48
|
+
@dest_keys ||= keys_for(dest_env)
|
49
|
+
end
|
50
|
+
|
51
|
+
def keys_for(env)
|
52
|
+
config_keys_for(env) | secrets_keys_for(env)
|
53
|
+
end
|
54
|
+
|
55
|
+
def config_keys_for(env)
|
56
|
+
(config_for(env)["environment"]&.keys || []).map do |key|
|
57
|
+
"[CONFIG] #{key}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def secrets_keys_for(env)
|
62
|
+
(secrets_for(env)["environment"]&.keys || []).map do |key|
|
63
|
+
"[SECRET] #{key}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def config_for(env)
|
68
|
+
YAML.load_file(config_path_for(env))
|
69
|
+
end
|
70
|
+
|
71
|
+
def secrets_for(env)
|
72
|
+
YAML.load_file(secrets_path_for(env))
|
73
|
+
end
|
74
|
+
|
75
|
+
def check_args
|
76
|
+
raise Builtin::ArgumentError, "Usage: ops envdiff <env_one> <env_two>" unless args.length == 2
|
77
|
+
|
78
|
+
check_environment(source_env)
|
79
|
+
check_environment(dest_env)
|
80
|
+
end
|
81
|
+
|
82
|
+
def source_env
|
83
|
+
args[0]
|
84
|
+
end
|
85
|
+
|
86
|
+
def dest_env
|
87
|
+
args[1]
|
88
|
+
end
|
89
|
+
|
90
|
+
def check_environment(name)
|
91
|
+
raise_missing_file_error(config_path_for(name)) unless config_file_exists?(name)
|
92
|
+
raise_missing_file_error(secrets_path_for(name)) unless secrets_file_exists?(name)
|
93
|
+
end
|
94
|
+
|
95
|
+
def raise_missing_file_error(path)
|
96
|
+
raise Builtin::ArgumentError, "File '#{path}' does not exist."
|
97
|
+
end
|
98
|
+
|
99
|
+
def config_file_exists?(env)
|
100
|
+
File.exist?(config_path_for(env))
|
101
|
+
end
|
102
|
+
|
103
|
+
def secrets_file_exists?(env)
|
104
|
+
File.exist?(secrets_path_for(env))
|
105
|
+
end
|
106
|
+
|
107
|
+
def config_path_for(env)
|
108
|
+
AppConfig.config_path_for(env)
|
109
|
+
end
|
110
|
+
|
111
|
+
def secrets_path_for(env)
|
112
|
+
Secrets.config_path_for(env)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
Envdiff = EnvDiff
|
117
|
+
end
|
data/lib/environment.rb
CHANGED
@@ -3,6 +3,14 @@
|
|
3
3
|
require 'version'
|
4
4
|
|
5
5
|
class Environment
|
6
|
+
class << self
|
7
|
+
def environment
|
8
|
+
return 'dev' if ENV['environment'].nil? || ENV['environment'].empty?
|
9
|
+
|
10
|
+
ENV['environment']
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
6
14
|
def initialize(env_hash)
|
7
15
|
@env_hash = env_hash
|
8
16
|
end
|
@@ -13,12 +21,6 @@ class Environment
|
|
13
21
|
set_configured_variables
|
14
22
|
end
|
15
23
|
|
16
|
-
def environment
|
17
|
-
return 'dev' if ENV['environment'].nil? || ENV['environment'].empty?
|
18
|
-
|
19
|
-
ENV['environment']
|
20
|
-
end
|
21
|
-
|
22
24
|
private
|
23
25
|
|
24
26
|
def set_ops_variables
|
@@ -28,7 +30,7 @@ class Environment
|
|
28
30
|
|
29
31
|
def set_environment_aliases
|
30
32
|
environment_aliases.each do |alias_name|
|
31
|
-
ENV[alias_name] = environment
|
33
|
+
ENV[alias_name] = Environment.environment
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
data/lib/ops.rb
CHANGED
@@ -28,6 +28,7 @@ class Ops
|
|
28
28
|
ERROR_LOADING_APP_CONFIG_EXIT_CODE = 66
|
29
29
|
MIN_VERSION_NOT_MET_EXIT_CODE = 67
|
30
30
|
ACTION_CONFIG_ERROR_EXIT_CODE = 68
|
31
|
+
BUILTIN_SYNTAX_ERROR_EXIT_CODE = 69
|
31
32
|
|
32
33
|
RECOMMEND_HELP_TEXT = "Run 'ops help' for a list of builtins and actions."
|
33
34
|
|
@@ -108,6 +109,9 @@ class Ops
|
|
108
109
|
do_before_action
|
109
110
|
Output.notice("Running '#{action}' from #{CONFIG_FILE} in environment '#{ENV['environment']}'...")
|
110
111
|
action.run
|
112
|
+
rescue Builtin::ArgumentError => e
|
113
|
+
Output.error("Error running builtin '#{@action_name}': #{e}")
|
114
|
+
exit(BUILTIN_SYNTAX_ERROR_EXIT_CODE)
|
111
115
|
rescue AppConfig::ParsingError => e
|
112
116
|
Output.error("Error parsing app config: #{e}")
|
113
117
|
exit(ERROR_LOADING_APP_CONFIG_EXIT_CODE)
|
data/lib/secrets.rb
CHANGED
@@ -9,31 +9,35 @@ require 'options'
|
|
9
9
|
|
10
10
|
class Secrets < AppConfig
|
11
11
|
class << self
|
12
|
+
def default_filename
|
13
|
+
config_path_for(Environment.environment)
|
14
|
+
end
|
15
|
+
|
16
|
+
def config_path_for(env)
|
17
|
+
File.exist?(ejson_path_for(env)) ? ejson_path_for(env) : json_path_for(env)
|
18
|
+
end
|
19
|
+
|
12
20
|
private
|
13
21
|
|
22
|
+
def ejson_path_for(env)
|
23
|
+
"config/#{env}/secrets.ejson"
|
24
|
+
end
|
25
|
+
|
26
|
+
def json_path_for(env)
|
27
|
+
"config/#{env}/secrets.json"
|
28
|
+
end
|
29
|
+
|
14
30
|
def app_config_path
|
15
31
|
expand_path(Options.get("secrets.path"))
|
16
32
|
end
|
17
33
|
end
|
18
34
|
|
19
35
|
def initialize(filename = "")
|
20
|
-
@filename = filename.empty? ? default_filename : actual_filename_for(filename)
|
36
|
+
@filename = filename.empty? ? Secrets.default_filename : actual_filename_for(filename)
|
21
37
|
end
|
22
38
|
|
23
39
|
private
|
24
40
|
|
25
|
-
def default_filename
|
26
|
-
File.exist?(default_ejson_filename) ? default_ejson_filename : default_json_filename
|
27
|
-
end
|
28
|
-
|
29
|
-
def default_ejson_filename
|
30
|
-
"config/#{environment}/secrets.ejson"
|
31
|
-
end
|
32
|
-
|
33
|
-
def default_json_filename
|
34
|
-
"config/#{environment}/secrets.json"
|
35
|
-
end
|
36
|
-
|
37
41
|
def actual_filename_for(filename)
|
38
42
|
File.exist?(filename) ? filename : filename.sub(".ejson", ".json")
|
39
43
|
end
|
data/ops_team.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ops_team
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nickthecook@gmail.com
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/builtins/background_log.rb
|
155
155
|
- lib/builtins/down.rb
|
156
156
|
- lib/builtins/env.rb
|
157
|
+
- lib/builtins/envdiff.rb
|
157
158
|
- lib/builtins/exec.rb
|
158
159
|
- lib/builtins/help.rb
|
159
160
|
- lib/builtins/helpers/dependency_handler.rb
|