dh-proteus 0.2.4 → 0.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd6b4515245645e26975a7d59b4628133a50629ff77df6dea73a0ff2d4782928
4
- data.tar.gz: 2a2091bbd1f869b5ecf5c64d072abe114f2a26c48bf81083153665a166140199
3
+ metadata.gz: b9166f710a73dd5e425c1c57678b074953e822f18373115dab83c2bb69c1a4e1
4
+ data.tar.gz: 536e2c89ea79aeb66cd751d280905bdad818d0f3dde221d8b6a8ed3714a1f16d
5
5
  SHA512:
6
- metadata.gz: e7f4328e37bf2cd6549cd714117d447f4b44fbcb6f146125d58b3a4443c2223f085c9c2f687205a2f3cb7c81cbd2d3dd593ef70577014d9e7f4f3949cc50815b
7
- data.tar.gz: 74c85cc9a5b765c4904acbcab92fd67ebf8575a9957e3d55f12f4e1efb337ccc6afebb4c9ada0e313dd9466aef7f42488fdb2fec787a3df5f055f884e8fd1f00
6
+ metadata.gz: addf02fb05acde3f7fbe087fb969725ea07ff5aa191ddb3a3025dbaf8b8abb6ead4b9a0639151698ae74f758ec05da7777f9d838c4361be933ff18e0fb2a2288
7
+ data.tar.gz: 0fc89209ad85a76df1010b7842b9a6ff427b9171b3e888ad5ff5cb2a4533d755f4d2070a7f6599af991ac20c5dfb9b056d8f1f135818dbfa0a4e655aa0c686ad
@@ -43,7 +43,4 @@ Gem::Specification.new do |spec|
43
43
  spec.add_runtime_dependency 'activesupport', '~> 5.1.1'
44
44
  spec.add_runtime_dependency 'thor', '~> 0.20.0'
45
45
  spec.add_runtime_dependency 'erubis', '~> 2.7.0'
46
- spec.add_runtime_dependency 'aws-sdk-rds', '~> 1.11.0'
47
- spec.add_runtime_dependency 'aws-sdk-route53', '~> 1.7.0'
48
- spec.add_runtime_dependency 'aws-sdk-elasticsearchservice', '~> 1.4.0'
49
46
  end
@@ -7,6 +7,10 @@ require 'proteus/context_management/context'
7
7
  require 'proteus/context_management/helpers'
8
8
  require 'proteus/templates/template_binding'
9
9
  require 'proteus/templates/partial'
10
+ require 'proteus/commands/state/list'
11
+ require 'proteus/commands/state/move'
12
+ require 'proteus/commands/state/remove'
13
+ require 'proteus/commands/state/show'
10
14
 
11
15
  module Proteus
12
16
 
@@ -56,6 +60,33 @@ module Proteus
56
60
  def self.environment
57
61
  @environment
58
62
  end
63
+
64
+ state_class = Class.new(Proteus::Common)
65
+ state_class_name = "#{class_name}State"
66
+ mod_name.const_set(state_class_name, state_class)
67
+
68
+ state_class.class_eval do
69
+ include Config
70
+ include Helpers
71
+ include Proteus::Helpers::PathHelpers
72
+ include Proteus::Commands::StateCommands::List
73
+ include Proteus::Commands::StateCommands::Move
74
+ include Proteus::Commands::StateCommands::Remove
75
+ include Proteus::Commands::StateCommands::Show
76
+
77
+ private
78
+
79
+ define_method :context do
80
+ context.name
81
+ end
82
+
83
+ define_method :environment do
84
+ environment
85
+ end
86
+ end
87
+
88
+ desc 'state', 'This command has subcommands for advanced state management.'
89
+ subcommand('state', state_class)
59
90
  end
60
91
 
61
92
  if context.name == 'default'
@@ -0,0 +1,25 @@
1
+ module Proteus
2
+ module Commands
3
+ module StateCommands
4
+ module List
5
+ def self.included(thor_class)
6
+ thor_class.class_eval do
7
+
8
+ desc "list", "List resources in the state"
9
+ def list
10
+ list_cmd = <<~LIST_CMD
11
+ cd #{context_path(context)} && \
12
+ terraform state list
13
+ LIST_CMD
14
+
15
+ init(verbose: parent_options[:verbose])
16
+
17
+ syscall list_cmd.squeeze(' ')
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ module Proteus
2
+ module Commands
3
+ module StateCommands
4
+ module Move
5
+ def self.included(thor_class)
6
+ thor_class.class_eval do
7
+
8
+ desc "move FROM TO", "Moves an existing resource within the Terraform state"
9
+ def move(from, to)
10
+ init(verbose: parent_options[:verbose])
11
+ confirm question: "Do you really want to move #{from} to #{to} in context '(#{context}, #{environment})'?", color: :on_red, exit_code: 0 do
12
+
13
+ state_move_command = <<~STATE_MOVE_COMMAND
14
+ cd #{context_path(context)} && \
15
+ terraform state mv \
16
+ #{from} \
17
+ #{to}
18
+ STATE_MOVE_COMMAND
19
+ syscall state_move_command.squeeze(' '), dryrun: dryrun
20
+ end
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,71 @@
1
+ module Proteus
2
+ module Commands
3
+ module StateCommands
4
+ module Remove
5
+ def self.included(thor_class)
6
+ thor_class.class_eval do
7
+
8
+ desc "remove", "Remove a resource from the terraform state"
9
+ long_desc <<-LONGDESC
10
+ Remove a resource from the terraform state
11
+ --bulk Enables bulk import mode
12
+
13
+ --resource_address Terraform address of resource to remove from the terraform state
14
+
15
+ --resources_file File containing resource addresses and identifiers
16
+ LONGDESC
17
+ option :bulk, type: :boolean, aliases: "-b", required: false, default: false
18
+ option :resource_address, type: :string, aliases: "-a", required: false, default: nil
19
+ option :resources_file, type: :string, aliases: "-f", required: false, default: nil
20
+ def remove
21
+ if options[:bulk]
22
+ if !options[:resources_file]
23
+ say "Supply a file containing resource identifiers and Terraform addresses for bulk operations", :red
24
+ exit 1
25
+ end
26
+ else
27
+ if !options[:resource_address]
28
+ say "You need to supply a resource address.", :red
29
+ exit 1
30
+ end
31
+ end
32
+
33
+ init(verbose: parent_options[:verbose])
34
+
35
+ confirm question: "Do you really want to run 'terraform state rm' in context '(#{context}, #{environment})'?", color: :on_red, exit_code: 0 do
36
+ state_remove_command = <<~STATE_REMOVE_COMMAND
37
+ cd #{context_path(context)} && \
38
+ terraform state rm \
39
+ %{resource_addresses}
40
+ STATE_REMOVE_COMMAND
41
+
42
+ if options[:bulk]
43
+ if File.file?(options[:resources_file])
44
+ File.open(options[:resources_file], "r") do |file|
45
+ resource_addresses = []
46
+ file.each_line do |line|
47
+ resource = line.chomp.split(" = ")
48
+ resource_addresses << resource[0]
49
+ end
50
+
51
+ resource_addresses.each_slice(500) do |slice|
52
+ syscall (state_remove_command % { resource_addresses: slice.join(' ') }).squeeze(' ')
53
+ end
54
+
55
+ end
56
+ else
57
+ say "File #{options[:resources_file]} does not exist.", :red
58
+ exit 1
59
+ end
60
+ else
61
+ syscall (state_remove_command % { resource_addresses: options[:resource_address] })
62
+ end
63
+ end
64
+ end
65
+
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,25 @@
1
+ module Proteus
2
+ module Commands
3
+ module StateCommands
4
+ module Show
5
+ def self.included(thor_class)
6
+ thor_class.class_eval do
7
+
8
+ desc "show", "Show a resource in the state"
9
+ def show(resource)
10
+ list_cmd = <<~LIST_CMD
11
+ cd #{context_path(context)} && \
12
+ terraform state show #{resource}
13
+ LIST_CMD
14
+
15
+ init(verbose: parent_options[:verbose])
16
+
17
+ syscall list_cmd.squeeze(' ')
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -11,7 +11,6 @@ module Proteus
11
11
  --resource The resource to taint
12
12
  LONGDESC
13
13
  option :resource, type: :string, aliases: "-r", required: true
14
- option :module, type: :string, aliases: "-m", required: false, default: nil
15
14
  def taint
16
15
  init(verbose: parent_options[:verbose])
17
16
  confirm question: "Do you really want to run 'terraform taint' on environment '#{environment}' in context '#{context}'?", color: :on_red, exit_code: 0 do
@@ -19,7 +18,6 @@ module Proteus
19
18
  taint_command = <<~TAINT_COMMAND
20
19
  cd #{context_path(context)} && \
21
20
  terraform taint \
22
- #{options[:module] ? "-module=#{options[:module]}" : ""} \
23
21
  #{options[:resource]}
24
22
  TAINT_COMMAND
25
23
  syscall taint_command.squeeze(' ')
@@ -3,10 +3,8 @@ require 'proteus/commands/clean'
3
3
  require 'proteus/commands/destroy'
4
4
  require 'proteus/commands/graph'
5
5
  require 'proteus/commands/import'
6
- require 'proteus/commands/move'
7
6
  require 'proteus/commands/output'
8
7
  require 'proteus/commands/plan'
9
- require 'proteus/commands/remove'
10
8
  require 'proteus/commands/render'
11
9
  require 'proteus/commands/taint'
12
10
 
@@ -16,7 +14,9 @@ module Proteus
16
14
  include Proteus::Helpers::PathHelpers
17
15
 
18
16
  Proteus::Commands.constants.each do |command|
19
- include const_get("Proteus::Commands::#{command}")
17
+ unless command == :State
18
+ include const_get("Proteus::Commands::#{command}")
19
+ end
20
20
  end
21
21
 
22
22
  private
@@ -56,10 +56,13 @@ module Proteus
56
56
  end
57
57
 
58
58
  def aws_profile
59
- config[:providers].select {|p| p[:name] == 'aws' }.first[:environments].each do |provider|
60
- return "-var 'aws_profile=#{provider[:profile]}'" if environment =~ (/#{provider[:match]}/)
59
+ config[:providers].select {|p| p[:name] == 'aws' }.first[:environments].each do |env|
60
+ env[:match].each do |m|
61
+ return "-var 'aws_profile=#{env[:profile]}'" if environment == m
62
+ end
61
63
  end
62
- return ""
64
+
65
+ raise "No AWS profile found in config."
63
66
  end
64
67
 
65
68
  def dryrun
@@ -20,8 +20,14 @@ module Proteus
20
20
  ensure_data_type Array
21
21
 
22
22
  each do
23
+ ensure_keys :name
24
+
23
25
  within :environments do
24
26
  ensure_uniqueness_across :match
27
+
28
+ each do
29
+ ensure_keys :profile
30
+ end
25
31
  end
26
32
  end
27
33
  end
@@ -1,5 +1,5 @@
1
1
  module Proteus
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
4
4
 
5
5
  if $0 == __FILE__
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dh-proteus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Albrecht
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-17 00:00:00.000000000 Z
11
+ date: 2020-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,48 +108,6 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 2.7.0
111
- - !ruby/object:Gem::Dependency
112
- name: aws-sdk-rds
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: 1.11.0
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: 1.11.0
125
- - !ruby/object:Gem::Dependency
126
- name: aws-sdk-route53
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: 1.7.0
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: 1.7.0
139
- - !ruby/object:Gem::Dependency
140
- name: aws-sdk-elasticsearchservice
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: 1.4.0
146
- type: :runtime
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: 1.4.0
153
111
  description:
154
112
  email:
155
113
  - simon.albrecht@deliveryhero.com
@@ -179,11 +137,13 @@ files:
179
137
  - lib/proteus/commands/destroy.rb
180
138
  - lib/proteus/commands/graph.rb
181
139
  - lib/proteus/commands/import.rb
182
- - lib/proteus/commands/move.rb
183
140
  - lib/proteus/commands/output.rb
184
141
  - lib/proteus/commands/plan.rb
185
- - lib/proteus/commands/remove.rb
186
142
  - lib/proteus/commands/render.rb
143
+ - lib/proteus/commands/state/list.rb
144
+ - lib/proteus/commands/state/move.rb
145
+ - lib/proteus/commands/state/remove.rb
146
+ - lib/proteus/commands/state/show.rb
187
147
  - lib/proteus/commands/taint.rb
188
148
  - lib/proteus/common.rb
189
149
  - lib/proteus/config/config.rb
@@ -1,28 +0,0 @@
1
- module Proteus
2
- module Commands
3
- module Move
4
- def self.included(thor_class)
5
- thor_class.class_eval do
6
-
7
- desc "move FROM TO", "Moves an existing resource within the Terraform state"
8
- def move(from, to)
9
- init(verbose: parent_options[:verbose])
10
- confirm question: "Do you really want to move #{from} to #{to} in context '(#{context}, #{environment})'?", color: :on_red, exit_code: 0 do
11
-
12
- state_move_command = <<~STATE_MOVE_COMMAND
13
- cd #{context_path(context)} && \
14
- terraform state mv \
15
- -var-file=#{var_file(context, environment)} \
16
- #{aws_profile} \
17
- #{from} \
18
- #{to}
19
- STATE_MOVE_COMMAND
20
- syscall state_move_command.squeeze(' '), dryrun: dryrun
21
- end
22
- end
23
-
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,69 +0,0 @@
1
- module Proteus
2
- module Commands
3
- module Remove
4
- def self.included(thor_class)
5
- thor_class.class_eval do
6
-
7
- desc "remove", "Remove a resource from the terraform state"
8
- long_desc <<-LONGDESC
9
- Remove a resource from the terraform state
10
- --bulk Enables bulk import mode
11
-
12
- --resource_address Terraform address of resource to remove from the terraform state
13
-
14
- --resources_file File containing resource addresses and identifiers
15
- LONGDESC
16
- option :bulk, type: :boolean, aliases: "-b", required: false, default: false
17
- option :resource_address, type: :string, aliases: "-a", required: false, default: nil
18
- option :resources_file, type: :string, aliases: "-f", required: false, default: nil
19
- def remove
20
- if options[:bulk]
21
- if !options[:resources_file]
22
- say "Supply a file containing resource identifiers and Terraform addresses for bulk operations", :red
23
- exit 1
24
- end
25
- else
26
- if !options[:resource_address]
27
- say "You need to supply a resource address.", :red
28
- exit 1
29
- end
30
- end
31
-
32
- init(verbose: parent_options[:verbose])
33
-
34
- confirm question: "Do you really want to run 'terraform state rm' in context '(#{context}, #{environment})'?", color: :on_red, exit_code: 0 do
35
- state_remove_command = <<~STATE_REMOVE_COMMAND
36
- cd #{context_path(context)} && \
37
- terraform state rm \
38
- %{resource_addresses}
39
- STATE_REMOVE_COMMAND
40
-
41
- if options[:bulk]
42
- if File.file?(options[:resources_file])
43
- File.open(options[:resources_file], "r") do |file|
44
- resource_addresses = []
45
- file.each_line do |line|
46
- resource = line.chomp.split(" = ")
47
- resource_addresses << resource[0]
48
- end
49
-
50
- resource_addresses.each_slice(500) do |slice|
51
- syscall (state_remove_command % { resource_addresses: slice.join(' ') }).squeeze(' ')
52
- end
53
-
54
- end
55
- else
56
- say "File #{options[:resources_file]} does not exist.", :red
57
- exit 1
58
- end
59
- else
60
- syscall (state_remove_command % { resource_addresses: options[:resource_address] })
61
- end
62
- end
63
- end
64
-
65
- end
66
- end
67
- end
68
- end
69
- end