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