iapi-idlc-sdk-pfm 1.0.4

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