iapi-idlc-sdk-pfm 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/.yardopts +3 -0
  6. data/Gemfile +6 -0
  7. data/Jenkinsfile +21 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +37 -0
  10. data/Rakefile +6 -0
  11. data/bin/pfm +8 -0
  12. data/docs/GettingStarted.md +299 -0
  13. data/iapi-idlc-sdk-pfm.gemspec +50 -0
  14. data/lib/iapi-idlc-sdk-pfm/builtin_commands.rb +12 -0
  15. data/lib/iapi-idlc-sdk-pfm/cli.rb +150 -0
  16. data/lib/iapi-idlc-sdk-pfm/command/apply.rb +86 -0
  17. data/lib/iapi-idlc-sdk-pfm/command/base.rb +255 -0
  18. data/lib/iapi-idlc-sdk-pfm/command/build.rb +121 -0
  19. data/lib/iapi-idlc-sdk-pfm/command/configure.rb +41 -0
  20. data/lib/iapi-idlc-sdk-pfm/command/destroy.rb +77 -0
  21. data/lib/iapi-idlc-sdk-pfm/command/exec.rb +24 -0
  22. data/lib/iapi-idlc-sdk-pfm/command/format.rb +64 -0
  23. data/lib/iapi-idlc-sdk-pfm/command/generate.rb +83 -0
  24. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/base.rb +50 -0
  25. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/server_build.rb +58 -0
  26. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/Berksfile +3 -0
  27. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -0
  28. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
  29. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
  30. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/chefignore +107 -0
  31. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
  32. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -0
  33. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/delivery-config.json +12 -0
  34. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/delivery-project.toml +36 -0
  35. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/gitignore +21 -0
  36. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/README.md +24 -0
  37. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
  38. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
  39. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
  40. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
  41. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
  42. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
  43. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
  44. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
  45. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
  46. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/policies/README.md +24 -0
  47. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
  48. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
  49. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/spec_helper.rb +2 -0
  50. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
  51. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/metadata.rb +7 -0
  52. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/app.rb +89 -0
  53. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/attribute.rb +12 -0
  54. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/build_cookbook.rb +182 -0
  55. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/cookbook.rb +144 -0
  56. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/cookbook_file.rb +24 -0
  57. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/lwrp.rb +23 -0
  58. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/policyfile.rb +8 -0
  59. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/recipe.rb +51 -0
  60. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/repo.rb +67 -0
  61. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/template.rb +32 -0
  62. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
  63. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
  64. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
  65. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
  66. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
  67. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
  68. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/README.md.erb +4 -0
  69. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  70. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
  71. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
  72. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -0
  73. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  74. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +18 -0
  75. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -0
  76. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -0
  77. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
  78. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/provider.rb.erb +0 -0
  79. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
  80. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/recipe_spec.rb.erb +22 -0
  81. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
  82. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/resource.rb.erb +0 -0
  83. data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/template.erb +0 -0
  84. data/lib/iapi-idlc-sdk-pfm/command/generator_commands.rb +34 -0
  85. data/lib/iapi-idlc-sdk-pfm/command/package.rb +118 -0
  86. data/lib/iapi-idlc-sdk-pfm/command/plan.rb +96 -0
  87. data/lib/iapi-idlc-sdk-pfm/command/templates/app/files/config/client.rb.template +9 -0
  88. data/lib/iapi-idlc-sdk-pfm/command/templates/app/files/config/init.ps1.userdata +16 -0
  89. data/lib/iapi-idlc-sdk-pfm/command/templates/base/files/config/client.rb.template +9 -0
  90. data/lib/iapi-idlc-sdk-pfm/command/templates/base/files/config/init.ps1.userdata +219 -0
  91. data/lib/iapi-idlc-sdk-pfm/command/validate.rb +85 -0
  92. data/lib/iapi-idlc-sdk-pfm/command/validator_commands/base.rb +65 -0
  93. data/lib/iapi-idlc-sdk-pfm/command/validator_commands/infrastructure.rb +46 -0
  94. data/lib/iapi-idlc-sdk-pfm/command/validator_commands/server_build.rb +135 -0
  95. data/lib/iapi-idlc-sdk-pfm/command/validator_commands.rb +32 -0
  96. data/lib/iapi-idlc-sdk-pfm/commands_map.rb +61 -0
  97. data/lib/iapi-idlc-sdk-pfm/generator.rb +52 -0
  98. data/lib/iapi-idlc-sdk-pfm/helpers.rb +49 -0
  99. data/lib/iapi-idlc-sdk-pfm/settings.rb +205 -0
  100. data/lib/iapi-idlc-sdk-pfm/validator.rb +52 -0
  101. data/lib/iapi-idlc-sdk-pfm/version.rb +4 -0
  102. data/lib/iapi-idlc-sdk-pfm.rb +27 -0
  103. metadata +442 -0
@@ -0,0 +1,86 @@
1
+ require 'iapi-idlc-sdk-pfm/command/base'
2
+ require 'mixlib/shellout'
3
+
4
+ module Pfm
5
+ module Command
6
+ class Apply < Base
7
+ banner 'Usage: pfm apply [options]'
8
+
9
+ option :app_release,
10
+ short: '-a VERSION',
11
+ long: '--app-release VERSION',
12
+ description: 'Application Version Number to Deploy',
13
+ default: ''
14
+
15
+ option :server_build,
16
+ short: '-b NUMBER',
17
+ long: '--server-build NUMBER',
18
+ description: 'Server Build Number to Deploy',
19
+ default: ENV['SERVER_BUILD']
20
+
21
+ option :config_file,
22
+ short: '-c FILE',
23
+ long: '--config-file FILE',
24
+ description: 'Optional environment metadata file',
25
+ default: nil
26
+
27
+ option :working_dir,
28
+ short: '-d DIR',
29
+ long: '--dir DIR',
30
+ description: 'Optional directory of infrastructure configuration to use',
31
+ default: ''
32
+
33
+ def initialize
34
+ super
35
+ @params_valid = true
36
+ @errors = []
37
+ end
38
+
39
+ def run(params)
40
+ @params = params
41
+ read_and_validate_params
42
+
43
+ if params_valid?
44
+ if (@config[:config_file])
45
+ deploy_setupv2
46
+ apply(@config[:working_dir])
47
+ else
48
+ deploy_setup
49
+ apply(@workspace.tmp_dir)
50
+ end
51
+ # @workspace.cleanup causing bundler issues
52
+ 0
53
+ else
54
+ @errors.each { |error| err("Error: #{error}") }
55
+ parse_options(params)
56
+ msg(opt_parser)
57
+ 1
58
+ end
59
+ rescue DeploymentFailure => e
60
+ err("ERROR: #{e.message}\n")
61
+ 1
62
+ end
63
+
64
+ def apply(dir)
65
+ Terraform::Binary.apply(dir.to_s) || raise
66
+ rescue
67
+ raise DeploymentFailure, 'Finished with errors'
68
+ end
69
+
70
+ def read_and_validate_params
71
+ arguments = parse_options(@params)
72
+
73
+ @params_valid = case arguments.size
74
+ when 0
75
+ true
76
+ else
77
+ false
78
+ end
79
+ end
80
+
81
+ def params_valid?
82
+ @params_valid
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,255 @@
1
+ require 'mixlib/cli'
2
+ require 'iapi-idlc-sdk-pfm/helpers'
3
+ require 'securerandom'
4
+ require 'json'
5
+
6
+ module Pfm
7
+ module Command
8
+ class Base
9
+ include Mixlib::CLI
10
+ include Pfm::Helpers
11
+
12
+ class InvalidRepository < StandardError; end
13
+ class BuildFailure < StandardError; end
14
+ class DeploymentFailure < StandardError; end
15
+
16
+ option :help,
17
+ short: '-h',
18
+ long: '--help',
19
+ description: 'Show this message',
20
+ boolean: true
21
+
22
+ option :version,
23
+ short: '-v',
24
+ long: '--version',
25
+ description: 'Show pfm version',
26
+ boolean: true
27
+
28
+ option :verbose,
29
+ short: '-V',
30
+ long: '--verbose',
31
+ description: 'Show detailed output',
32
+ boolean: true,
33
+ default: false
34
+
35
+ def initialize
36
+ super
37
+
38
+ @workspace = Idlc::Workspace.new
39
+ end
40
+
41
+ #
42
+ # optparser overwrites -h / --help options with its own.
43
+ # In order to control this behavior, make sure the default options are
44
+ # handled here.
45
+ #
46
+ def run_with_default_options(params = [])
47
+ if needs_help?(params)
48
+ msg(opt_parser.to_s)
49
+ 0
50
+ elsif needs_version?(params)
51
+ msg("Pfm Version: #{Pfm::VERSION}")
52
+ 0
53
+ else
54
+ ENV['DEBUG'] = 'true' if verbose?(params)
55
+ run(params)
56
+ end
57
+ rescue NameError => e
58
+ err("ERROR: #{e.message}\n")
59
+ 1
60
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
61
+ err("ERROR: #{e.message}\n")
62
+ msg(opt_parser)
63
+ 1
64
+ rescue Idlc::Build::MissingMetadataFile, Idlc::Build::MissingRequiredMetadataAttribute, InvalidRepository => e
65
+ err("ERROR: #{e.message}\n")
66
+ 1
67
+ ensure
68
+ @workspace.cleanup unless @workspace.empty?
69
+ end
70
+
71
+ def build_setup
72
+ Packer::Binary.configure do |config|
73
+ config.version = SETTINGS['PACKER_VERSION']
74
+ config.download_path = "/tmp/#{SecureRandom.uuid}"
75
+ end
76
+
77
+ @build_config = Idlc::Build::Config.new(SETTINGS['AWS_REGION'])
78
+ @workspace.add(build_base_dir)
79
+
80
+ build_dir = "#{@workspace.tmp_dir}/#{build_base_dir}".freeze
81
+
82
+ msg("Using build template: Build::#{@params.first}::#{@config[:build_template]}::#{@config[:build_metadata]}")
83
+
84
+ # Include build metadata
85
+ @build_metadata = Idlc::Build::Metadata.new(@params.first, @config[:build_metadata])
86
+
87
+ # load the rest of the metadata
88
+ @build_metadata.load
89
+
90
+ # load version from command line if specified
91
+ @build_metadata.attributes['version'] = Idlc::Build::Metadata::MetadataAttribute.new(@config[:build_version], true) unless @config[:build_version].nil?
92
+
93
+ # check metadata requirements
94
+ @build_metadata.requirements_satisfied?
95
+
96
+ msg("Template Version: #{@build_metadata.attributes['version'].value}")
97
+
98
+ @build_metadata.attributes.each do |key, att|
99
+ # load metadata file as packer user vars
100
+ @build_config.add_build_var_v2(key, att.value)
101
+ end
102
+
103
+ # Copy over the base template and auxillary files for Packer
104
+ tpl = Idlc::Build::Template.new(
105
+ @build_metadata.attributes,
106
+ "#{build_dir}/build.json"
107
+ )
108
+ tpl.write
109
+
110
+ # copy auxiliary files
111
+ system("cp -a #{templates_dir}/files #{build_dir}")
112
+
113
+ Dir.chdir(build_dir)
114
+ end
115
+
116
+ def deploy_setup
117
+ Terraform::Binary.configure do |config|
118
+ config.version = SETTINGS['TERRAFORM_VERSION']
119
+ config.download_path = "/tmp/#{SecureRandom.uuid}"
120
+ end
121
+
122
+ raise InvalidRepository, 'This doesn\'t look like a valid infrastructure repository' unless File.directory? "#{inf_base_dir}/tf"
123
+ config = Idlc::Deploy::Config.new(SETTINGS['AWS_REGION'])
124
+
125
+ config.parse("#{inf_base_dir}/env/config/default.yml") if File.exist? "#{inf_base_dir}/env/config/default.yml"
126
+
127
+ if ENV['PROD'] == 'true' || ENV['PROD'] == '1'
128
+ config.parse("#{inf_base_dir}/env/config/prod.yml")
129
+ else
130
+ config.parse("#{inf_base_dir}/env/config/devtest.yml")
131
+ end
132
+
133
+ config.parse("#{inf_base_dir}/env/size/#{ENV['SIZE']}.yml") if File.exist? "#{inf_base_dir}/env/size/#{ENV['SIZE']}.yml"
134
+
135
+ inf_conf_file = 'inf.config.yml'
136
+
137
+ # For unit tests
138
+ inf_conf_file = 'inf.config.example.yml' unless File.exist? inf_conf_file
139
+ config.parse(inf_conf_file)
140
+
141
+ bucket_name = Idlc::Deploy::Config.get_deployment_var('tfstate_bucket')
142
+ sub_bucket = "#{Idlc::Deploy::Config.get_deployment_var('job_code')}"\
143
+ "#{Idlc::Deploy::Config.get_deployment_var('job')}"\
144
+ "-#{Idlc::Deploy::Config.get_deployment_var('env')}".freeze
145
+
146
+ # Pass some ENV vars for Terraform
147
+ Idlc::Deploy::Config.add_deployment_var('environment_key', sub_bucket)
148
+ Idlc::Deploy::Config.add_deployment_var('version', REPO_VERSION)
149
+ Idlc::Deploy::Config.add_deployment_var('major_minor', Idlc::Utility.major_minor(REPO_VERSION))
150
+ Idlc::Deploy::Config.add_deployment_var('major_minor_patch', Idlc::Utility.major_minor_patch(REPO_VERSION))
151
+ Idlc::Deploy::Config.add_deployment_var('build', @config[:server_build])
152
+ Idlc::Deploy::Config.add_deployment_var('app_release', @config[:app_release])
153
+
154
+ Idlc::Deploy::Keypair.generate("#{inf_base_dir}/env/kp")
155
+ @workspace.flatten("#{inf_base_dir}/tf", 'tf')
156
+ @workspace.add("#{inf_base_dir}/env/kp")
157
+ @workspace.add('lib/tf/modules')
158
+
159
+ config.configure_state(bucket_name, sub_bucket, @workspace.tmp_dir)
160
+ end
161
+
162
+ def deploy_setupv2
163
+ Terraform::Binary.configure do |config|
164
+ config.version = SETTINGS['TERRAFORM_VERSION']
165
+ config.download_path = "/tmp/#{SecureRandom.uuid}"
166
+ end
167
+
168
+ # Create dynamic variables file for terraform based on config
169
+ keys = {}
170
+ vars_file = ''
171
+
172
+ env_metadata = JSON.parse(open(@config[:config_file]).read)
173
+ ['account', 'environment', 'ec2', 'application'].each do |section|
174
+ env_metadata[section].each do |key, value|
175
+ # skip dups
176
+ next unless keys[key].nil?
177
+
178
+ # replace null with empty string
179
+ value = '' if value.nil?
180
+
181
+ # skip lists and maps
182
+ next unless (value.instance_of? String)
183
+
184
+ # add to vars file and record key for dups
185
+ keys[key] = 'parsed'
186
+ vars_file += <<~EOH
187
+ variable "#{key}" {}
188
+
189
+ EOH
190
+
191
+ # load value into envrionment
192
+ Idlc::Deploy::Config.add_deployment_var(key, value)
193
+ end
194
+ end
195
+
196
+ # write vars file
197
+ File.open("#{config[:working_dir]}/#{env_metadata['environment_key']}-tfvars.tf", 'w') { |file| file.write(vars_file) }
198
+
199
+ # Pass some extra vars for Terraform
200
+ Idlc::Deploy::Config.add_deployment_var('aws_region', SETTINGS['AWS_REGION'])
201
+ Idlc::Deploy::Config.add_deployment_var('environment_key', env_metadata['environment_key'])
202
+ Idlc::Deploy::Config.add_deployment_var('version', env_metadata['environment']['inf_version'])
203
+ Idlc::Deploy::Config.add_deployment_var('app_release', @config[:app_release])
204
+ Idlc::Deploy::Config.add_deployment_var('encrypted_svc_pass', env_metadata['environment']['encrypted']['svc_pass'])
205
+ ENV['APP_RELEASE'] = @config[:app_release]
206
+
207
+ FileUtils.mkdir_p "inf/env/kp"
208
+ Idlc::Deploy::Keypair.generate("inf/env/kp")
209
+
210
+ config = Idlc::Deploy::Config.new(SETTINGS['AWS_REGION'])
211
+ config.configure_state(
212
+ env_metadata['account']['tfstate_bucket'],
213
+ env_metadata['environment_key'],
214
+ @config[:working_dir]
215
+ )
216
+ end
217
+
218
+ def templates_dir
219
+ "#{__dir__}/templates/#{@build_metadata.attributes['build_stage'].value}"
220
+ end
221
+
222
+ def build_base_dir
223
+ "#{SETTINGS['BUILD_BASE_DIR']}/#{@params.first}"
224
+ end
225
+
226
+ def inf_base_dir
227
+ SETTINGS['INF_BASE_DIR']
228
+ end
229
+
230
+ def build_dir
231
+ "#{@workspace.tmp_dir}/#{build_base_dir}".freeze
232
+ end
233
+
234
+ def build_exists?
235
+ return true if Dir.exist? build_base_dir
236
+
237
+ # doesn't exist
238
+ @errors.push("Build::#{@params.first} doesnt exist")
239
+ false
240
+ end
241
+
242
+ def needs_help?(params)
243
+ params.include?('-h') || params.include?('--help')
244
+ end
245
+
246
+ def needs_version?(params)
247
+ params.include?('-v') || params.include?('--version')
248
+ end
249
+
250
+ def verbose?(params)
251
+ params.include?('-V') || params.include?('--verbose')
252
+ end
253
+ end
254
+ end
255
+ end
@@ -0,0 +1,121 @@
1
+ require 'iapi-idlc-sdk-pfm/command/base'
2
+ require 'mixlib/shellout'
3
+
4
+ module Pfm
5
+ module Command
6
+ class Build < Base
7
+ banner 'Usage: pfm build BUILD_NAME [options]'
8
+
9
+ option :app_release,
10
+ short: '-a VERSION',
11
+ long: '--app-release VERSION',
12
+ description: 'Application Version Number to build',
13
+ default: ''
14
+
15
+ option :build_version,
16
+ short: '-b VERSION',
17
+ long: '--build-version VERSION',
18
+ description: 'override version number of build',
19
+ default: nil
20
+
21
+ option :build_template,
22
+ short: '-t TEMPLATE',
23
+ long: '--build-template TEMPLATE',
24
+ description: 'The Build Template to use. Defaults to build.json',
25
+ default: 'build.json'
26
+
27
+ option :build_metadata,
28
+ short: '-m METADATA_FILE',
29
+ long: '--build-metadata METADATA_FILE',
30
+ description: 'The build metadata file to use. Defaults to \'metadata\'',
31
+ default: 'metadata'
32
+
33
+ option :build_number,
34
+ short: '-n NUMBER',
35
+ long: '--build-number NUMBER',
36
+ description: 'Override the build number. Default is ENV::BUILD_NUMBER',
37
+ default: ENV['BUILD_NUMBER']
38
+
39
+ def initialize
40
+ super
41
+ @params_valid = true
42
+ @errors = []
43
+ end
44
+
45
+ def run(params)
46
+ @params = params
47
+ read_and_validate_params
48
+
49
+ if params_valid?
50
+ build_setup
51
+ build
52
+ # @workspace.cleanup causing bundler issues
53
+ 0
54
+ else
55
+ @errors.each { |error| err("Error: #{error}") }
56
+ parse_options(params)
57
+ msg(opt_parser)
58
+ 1
59
+ end
60
+ rescue BuildFailure => e
61
+ err("ERROR: #{e.message}\n")
62
+ 1
63
+ end
64
+
65
+ def build
66
+ # Zip the cookbooks for transfer
67
+ Idlc::Workspace.zip_folder('./chef', "#{@workspace.tmp_dir}/cookbooks.zip")
68
+
69
+ # Start the HTTP server to facilitate file transfers. This is to replace
70
+ # WINRM for file transfers in Packer due to slowness. This function returns
71
+ # the process id of the server instance.
72
+ pid = Idlc::Build::Httpd.start(@workspace.tmp_dir)
73
+
74
+ # #start will return twice when forking the HTTP server off, once for the
75
+ # parent and once for the child. When the child return, the pid is nil. We want
76
+ # to skip that run.
77
+ unless pid.nil?
78
+ # Pass some ENV vars for Packer
79
+ @build_config.add_build_var_v2('aws_region', SETTINGS['AWS_REGION'])
80
+ @build_config.add_build_var_v2('app_release', @config[:app_release])
81
+ @build_config.add_build_var_v2('build_uuid', SecureRandom.uuid.to_s)
82
+ @build_config.add_build_var_v2('build_number', @config[:build_number])
83
+ @build_config.add_build_var_v2('httpd_server', Idlc::Build::Httpd.private_ip.to_s)
84
+ @build_config.add_build_var_v2('httpd_port', ENV['HTTPD_PORT'])
85
+ @build_config.add_build_var_v2('cookbooks_zip', "#{@workspace.tmp_dir}/cookbooks.zip")
86
+
87
+ begin
88
+ Packer::Binary.build("#{@build_config.dump_build_vars} #{@config[:build_template]}")
89
+ Idlc::Build::Httpd.stop(pid)
90
+ Dir.chdir(build_base_dir)
91
+ rescue
92
+ Idlc::Build::Httpd.stop(pid)
93
+ Dir.chdir(build_base_dir)
94
+ raise BuildFailure, 'The build finished with errors'
95
+ end
96
+
97
+ end
98
+
99
+ Dir.chdir(build_base_dir)
100
+ end
101
+
102
+ def read_and_validate_params
103
+ arguments = parse_options(@params)
104
+
105
+ case arguments.size
106
+ when 1
107
+ @params_valid = build_exists?
108
+
109
+ when 2
110
+
111
+ else
112
+ @params_valid = false
113
+ end
114
+ end
115
+
116
+ def params_valid?
117
+ @params_valid
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,41 @@
1
+ require 'iapi-idlc-sdk-pfm/command/base'
2
+ require 'mixlib/shellout'
3
+
4
+ module Pfm
5
+ module Command
6
+ class Configure < Pfm::Command::Base
7
+ banner 'Usage: pfm configure SYSTEM_COMMAND'
8
+
9
+ def run(params)
10
+ current_set = Pfm::Settings.new
11
+ new_settings = {}
12
+
13
+ current_set.settings.each do |key, setting|
14
+ print("#{key} [#{setting.value}]: ")
15
+ stdin = STDIN.gets.chomp.strip
16
+
17
+ required = setting.required?
18
+ new_value = setting.value
19
+ new_value = stdin unless null?(stdin)
20
+
21
+ new_settings[key] = Pfm::Settings::Setting.new(new_value, required)
22
+ end
23
+
24
+ current_set.save_config(new_settings)
25
+ end
26
+
27
+ def needs_version?(_params)
28
+ # Force version to get passed down to command
29
+ false
30
+ end
31
+
32
+ def null?(value)
33
+ value.nil? || value == ''
34
+ end
35
+
36
+ def needs_help?(params)
37
+ ['-h', '--help'].include? params[0]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,77 @@
1
+ require 'iapi-idlc-sdk-pfm/command/base'
2
+ require 'mixlib/shellout'
3
+
4
+ module Pfm
5
+ module Command
6
+ class Destroy < Base
7
+ banner 'Usage: pfm destroy [options]'
8
+
9
+ option :config_file,
10
+ short: '-c FILE',
11
+ long: '--config-file FILE',
12
+ description: 'Optional environment metadata file',
13
+ default: nil
14
+
15
+ option :working_dir,
16
+ short: '-d DIR',
17
+ long: '--dir DIR',
18
+ description: 'Optional directory of infrastructure configuration to use',
19
+ default: ''
20
+
21
+ def initialize
22
+ super
23
+ @params_valid = true
24
+ @errors = []
25
+ end
26
+
27
+ def run(params)
28
+ @params = params
29
+ read_and_validate_params
30
+
31
+ if params_valid?
32
+ if (@config[:config_file])
33
+ deploy_setupv2
34
+ destroy(@config[:working_dir])
35
+ else
36
+ deploy_setup
37
+ destroy(@workspace.tmp_dir)
38
+ end
39
+ # @workspace.cleanup causing bundler issues
40
+ 0
41
+ else
42
+ @errors.each { |error| err("Error: #{error}") }
43
+ parse_options(params)
44
+ msg(opt_parser)
45
+ 1
46
+ end
47
+ rescue DeploymentFailure => e
48
+ err("ERROR: #{e.message}\n")
49
+ 1
50
+ end
51
+
52
+ def destroy(dir)
53
+ Idlc::Deploy::Config.add_deployment_var('build', ENV['SERVER_BUILD'])
54
+ Idlc::Deploy::Config.add_deployment_var('app_release', 'null')
55
+
56
+ Terraform::Binary.destroy("#{dir}")
57
+ rescue
58
+ raise DeploymentFailure, 'Finished with errors'
59
+ end
60
+
61
+ def read_and_validate_params
62
+ arguments = parse_options(@params)
63
+
64
+ @params_valid = case arguments.size
65
+ when 0
66
+ true
67
+ else
68
+ false
69
+ end
70
+ end
71
+
72
+ def params_valid?
73
+ @params_valid
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,24 @@
1
+ require 'iapi-idlc-sdk-pfm/command/base'
2
+ require 'mixlib/shellout'
3
+
4
+ module Pfm
5
+ module Command
6
+ class Exec < Pfm::Command::Base
7
+ banner 'Usage: pfm exec SYSTEM_COMMAND'
8
+
9
+ def run(params)
10
+ exec(*params)
11
+ raise 'Exec failed without an exception, your ruby is buggy' # should never get here
12
+ end
13
+
14
+ def needs_version?(_params)
15
+ # Force version to get passed down to command
16
+ false
17
+ end
18
+
19
+ def needs_help?(params)
20
+ ['-h', '--help'].include? params[0]
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,64 @@
1
+ require 'iapi-idlc-sdk-pfm/command/base'
2
+ require 'mixlib/shellout'
3
+
4
+ module Pfm
5
+ module Command
6
+ class Format < Base
7
+ banner 'Usage: pfm format [options]'
8
+
9
+ def initialize
10
+ super
11
+ @params_valid = true
12
+ @errors = []
13
+ end
14
+
15
+ def run(params)
16
+ @params = params
17
+ read_and_validate_params
18
+
19
+ if params_valid?
20
+ fmt
21
+ # @workspace.cleanup causing bundler issues
22
+ 0
23
+ else
24
+ @errors.each { |error| err("Error: #{error}") }
25
+ parse_options(params)
26
+ msg(opt_parser)
27
+ 1
28
+ end
29
+ rescue DeploymentFailure => e
30
+ err("ERROR: #{e.message}\n")
31
+ 1
32
+ end
33
+
34
+ def fmt
35
+ raise InvalidRepository, 'This doesn\'t look like a valid infrastructure repository' unless File.directory? "#{inf_base_dir}/tf"
36
+ tf_paths = %W[#{inf_base_dir}/tf lib/tf/modules]
37
+
38
+ begin
39
+ tf_paths.each do |path|
40
+ # Format the file to a canonical syntax
41
+ Terraform::Binary.fmt(path)
42
+ end
43
+ rescue
44
+ raise DeploymentFailure, 'Finished with errors'
45
+ end
46
+ end
47
+
48
+ def read_and_validate_params
49
+ arguments = parse_options(@params)
50
+
51
+ case arguments.size
52
+ when 0
53
+ @params_valid = true
54
+ else
55
+ @params_valid = false
56
+ end
57
+ end
58
+
59
+ def params_valid?
60
+ @params_valid
61
+ end
62
+ end
63
+ end
64
+ end