iapi-idlc-sdk-pfm 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/.yardopts +3 -0
- data/Gemfile +6 -0
- data/Jenkinsfile +21 -0
- data/LICENSE.txt +21 -0
- data/README.md +37 -0
- data/Rakefile +6 -0
- data/bin/pfm +8 -0
- data/docs/GettingStarted.md +299 -0
- data/iapi-idlc-sdk-pfm.gemspec +50 -0
- data/lib/iapi-idlc-sdk-pfm/builtin_commands.rb +12 -0
- data/lib/iapi-idlc-sdk-pfm/cli.rb +150 -0
- data/lib/iapi-idlc-sdk-pfm/command/apply.rb +86 -0
- data/lib/iapi-idlc-sdk-pfm/command/base.rb +255 -0
- data/lib/iapi-idlc-sdk-pfm/command/build.rb +121 -0
- data/lib/iapi-idlc-sdk-pfm/command/configure.rb +41 -0
- data/lib/iapi-idlc-sdk-pfm/command/destroy.rb +77 -0
- data/lib/iapi-idlc-sdk-pfm/command/exec.rb +24 -0
- data/lib/iapi-idlc-sdk-pfm/command/format.rb +64 -0
- data/lib/iapi-idlc-sdk-pfm/command/generate.rb +83 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/base.rb +50 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/server_build.rb +58 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/Berksfile +3 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/chefignore +107 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/delivery-config.json +12 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/delivery-project.toml +36 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/gitignore +21 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/README.md +24 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/policies/README.md +24 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/spec_helper.rb +2 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/metadata.rb +7 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/app.rb +89 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/attribute.rb +12 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/build_cookbook.rb +182 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/cookbook.rb +144 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/cookbook_file.rb +24 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/lwrp.rb +23 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/policyfile.rb +8 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/recipe.rb +51 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/repo.rb +67 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/recipes/template.rb +32 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/README.md.erb +4 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +18 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/provider.rb.erb +0 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/recipe_spec.rb.erb +22 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/resource.rb.erb +0 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands/skeletons/code_generator/templates/default/template.erb +0 -0
- data/lib/iapi-idlc-sdk-pfm/command/generator_commands.rb +34 -0
- data/lib/iapi-idlc-sdk-pfm/command/package.rb +118 -0
- data/lib/iapi-idlc-sdk-pfm/command/plan.rb +96 -0
- data/lib/iapi-idlc-sdk-pfm/command/templates/app/files/config/client.rb.template +9 -0
- data/lib/iapi-idlc-sdk-pfm/command/templates/app/files/config/init.ps1.userdata +16 -0
- data/lib/iapi-idlc-sdk-pfm/command/templates/base/files/config/client.rb.template +9 -0
- data/lib/iapi-idlc-sdk-pfm/command/templates/base/files/config/init.ps1.userdata +219 -0
- data/lib/iapi-idlc-sdk-pfm/command/validate.rb +85 -0
- data/lib/iapi-idlc-sdk-pfm/command/validator_commands/base.rb +65 -0
- data/lib/iapi-idlc-sdk-pfm/command/validator_commands/infrastructure.rb +46 -0
- data/lib/iapi-idlc-sdk-pfm/command/validator_commands/server_build.rb +135 -0
- data/lib/iapi-idlc-sdk-pfm/command/validator_commands.rb +32 -0
- data/lib/iapi-idlc-sdk-pfm/commands_map.rb +61 -0
- data/lib/iapi-idlc-sdk-pfm/generator.rb +52 -0
- data/lib/iapi-idlc-sdk-pfm/helpers.rb +49 -0
- data/lib/iapi-idlc-sdk-pfm/settings.rb +205 -0
- data/lib/iapi-idlc-sdk-pfm/validator.rb +52 -0
- data/lib/iapi-idlc-sdk-pfm/version.rb +4 -0
- data/lib/iapi-idlc-sdk-pfm.rb +27 -0
- 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
|