dh-proteus 0.2.4 → 0.2.5

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: 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