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,49 @@
1
+ module Pfm
2
+ # Module of common functions that are used frequently in every namespace
3
+ module Helpers
4
+ module_function
5
+
6
+ # Runs given commands using mixlib-shellout
7
+ #
8
+ # @param command_args [String] the system command to run
9
+ def system_command(*command_args)
10
+ cmd = Mixlib::ShellOut.new(*command_args)
11
+ cmd.run_command
12
+ err(cmd.stderr)
13
+ msg(cmd.stdout)
14
+ cmd
15
+ end
16
+
17
+ # Print the given string to stderr
18
+ #
19
+ # @param message [String] the string to print
20
+ def err(message)
21
+ stderr.print("#{message}\n")
22
+ end
23
+
24
+ # Print the given string to stdout
25
+ #
26
+ # @param message [String] the string to print
27
+ def msg(message)
28
+ stdout.print("#{message}\n")
29
+ end
30
+
31
+ # Only prints the given string to stdout when the environment variable
32
+ # DEBUG = true
33
+ #
34
+ # @param message [String] the string to print
35
+ def debug(message)
36
+ stdout.print("#{message}\n") if ENV['DEBUG']
37
+ end
38
+
39
+ private
40
+
41
+ def stdout
42
+ $stdout
43
+ end
44
+
45
+ def stderr
46
+ $stderr
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,205 @@
1
+ module Pfm
2
+ # == +PFM+ Settings
3
+ # Top level settings defined and loaded here. This class loads the user config file
4
+ # located at +.pfm/config+
5
+ #
6
+ # +AWS_REGION+ <em>default -> 'us-east-1'</em>
7
+ #
8
+ # * The AWS region to work in. This will eventually become the AWS_REGION environment variable and can be used with other AWS API operations.
9
+ #
10
+ # +RUBOCOP_RULES_FILE+ <em>default -> '.rubocop.yml'</em>
11
+ #
12
+ # * Set the path to the global +.rubocop.yml+ rules file. This file will be used for all server builds when running syntax checks.
13
+ #
14
+ # +FOODCRITIC_RULES_FILE+ <em>default -> '.foodcritic'</em>
15
+ #
16
+ # * Set the path to the global +.foodcritic+ rules file. This file will be used for all server builds when running semantics checks.
17
+ #
18
+ # +BUILD_BASE_DIR+ <em>default -> 'builds'</em>
19
+ #
20
+ # * Set the root path to the builds directory. This should be where top level server builds are located. Ex:
21
+ # .
22
+ # ├── builds
23
+ # │ ├── app-axpdb
24
+ # │ └── app-axpwa
25
+ #
26
+ # +INF_BASE_DIR+ <em>default -> 'inf'</em>
27
+ #
28
+ # * Set the path to the top level infrastructure directory. Ex:
29
+ # .
30
+ # ├── inf
31
+ # │ ├── env
32
+ # │ ├── tasks
33
+ # │ └── tf
34
+ #
35
+ # +PUBLISH_BUCKET+ <em>default -> ''</em>
36
+ #
37
+ # * The top level bucket where deployment packages are stored in S3.
38
+ #
39
+ # +PUBLISH_PREFIX+ <em>default -> ''</em>
40
+ #
41
+ # * The prefix to the deployment package storage location. Ex:
42
+ # +s3://PUBLISH_BUCKET/PUBLISH_PREFIX/package.name+
43
+ #
44
+ # +PACKER_VERSION+ <em>default -> 'default from packer/binary'
45
+ #
46
+ # * The version of Hashicorp Packer to use for builds
47
+ #
48
+ # +TERRAFORM_VERSION+ <em>default -> 'default from terraform/binary'
49
+ #
50
+ # * The version of Hashicorp Terraform to use for deployments
51
+ #
52
+ # Note that if you change these settings from the default, be sure you commit
53
+ # the +.pfm/config+ file.
54
+ #
55
+ # == Example Configuration File
56
+ # An example +.pfm/config+ file might look like this:
57
+ # ---
58
+ # AWS_REGION: 'us-east-1'
59
+ # RUBOCOP_RULES_FILE: '.pfm/.rubocop.yml'
60
+ # FOODCRITIC_RULES_FILE: '.pfm/.foodcritic'
61
+ # BUILD_BASE_DIR: 'builds'
62
+ # INF_BASE_DIR: 'inf'
63
+ # PUBLISH_BUCKET: 'dev-publish'
64
+ # PUBLISH_PREFIX: 'axp'
65
+ # PACKER_VERSION: '1.0.4'
66
+ # TERRAFORM_VERSION: '0.8.7'
67
+ class Settings
68
+ # Defines an individual setting
69
+ class Setting
70
+ attr_reader :value
71
+
72
+ def initialize(value, required = false)
73
+ @value = value
74
+ @required = required
75
+ end
76
+
77
+ def required?
78
+ @required
79
+ end
80
+
81
+ def defined?
82
+ !@value.nil?
83
+ end
84
+
85
+ def to_s
86
+ @value.to_s
87
+ end
88
+ end
89
+
90
+ # @return [Map] returns the map of Pfm::Settings::Setting objects
91
+ attr_reader :settings
92
+ attr_reader :config_directory
93
+ attr_reader :run_dir
94
+
95
+ def initialize(expand = false)
96
+ @run_dir = Dir.pwd
97
+ @config_directory = config_dir
98
+ @expand = expand
99
+
100
+ @settings = {}
101
+
102
+ # Required
103
+ @settings['AWS_REGION'] = Setting.new(ENV['AWS_REGION'], true)
104
+ @settings['RUBOCOP_RULES_FILE'] = Setting.new('.rubocop.yml', true)
105
+ @settings['FOODCRITIC_RULES_FILE'] = Setting.new('.foodcritic', true)
106
+ @settings['BUILD_BASE_DIR'] = Setting.new('builds', true)
107
+ @settings['INF_BASE_DIR'] = Setting.new('inf', true)
108
+ @settings['PACKER_VERSION'] = Setting.new(::Packer::Binary.config.version, true)
109
+ @settings['TERRAFORM_VERSION'] = Setting.new(::Terraform::Binary.config.version, true)
110
+
111
+ # Optional Defaults
112
+ @settings['PUBLISH_BUCKET'] = Setting.new('')
113
+ @settings['PUBLISH_PREFIX'] = Setting.new('')
114
+
115
+ load_config
116
+ end
117
+
118
+ # load the config file and resolve file paths if set
119
+ def load_config
120
+ if config_exists?
121
+ require 'yaml'
122
+ YAML.load_file(config_file).each do |key, value|
123
+ msg("WARNING: unrecognized config key: '#{key}'") unless @settings.key? key
124
+ next unless @settings.key? key
125
+
126
+ required = @settings[key].required?
127
+ @settings[key] = Setting.new(value, required)
128
+ end
129
+
130
+ # Also load each setting into the environment
131
+ @settings.each { |key, setting| ENV[key] = setting.value }
132
+
133
+ # Resolve paths if set
134
+ resolve_paths if @expand
135
+ else
136
+ create_config
137
+ load_config
138
+ end
139
+ end
140
+
141
+ # Saves a new configuration to disk
142
+ # @param settings [Map<Pfm::Settings::Setting>] a new map of Pfm::Settings::Setting objects
143
+ def save_config(settings)
144
+ @settings = settings
145
+
146
+ write_config
147
+ end
148
+
149
+ # returns a simple map of Pfm::Settings.settings[key] => Pfm::Settings.setting[key].to_s
150
+ # @return [Map<String>]
151
+ def settings_strings
152
+ map = {}
153
+ @settings.each do |key, setting|
154
+ map[key] = setting.to_s
155
+ end
156
+
157
+ map
158
+ end
159
+
160
+ private
161
+
162
+ # create the config directory and file if they don't already exist
163
+ def create_config
164
+ return if config_exists?
165
+
166
+ FileUtils.mkdir_p config_dir
167
+ FileUtils.touch config_file
168
+
169
+ write_config
170
+ end
171
+
172
+ # expands variables like '.' and '~' in settings values paths
173
+ def resolve_paths
174
+ @settings.each do |key, setting|
175
+ required = @settings[key].required?
176
+ @settings[key] = Setting.new(File.realpath(setting.value), required) if File.exist? setting.value
177
+ end
178
+ end
179
+
180
+ # writes the @settings attribute to disk
181
+ def write_config
182
+ config_string = '---'
183
+
184
+ @settings.each do |key, setting|
185
+ config_string += "\n#{key}: '#{setting.value}'"
186
+ end
187
+
188
+ config_string += "\n"
189
+
190
+ File.open(config_file, 'w') { |file| file.write(config_string) }
191
+ end
192
+
193
+ def config_exists?
194
+ File.exist? config_file
195
+ end
196
+
197
+ def config_dir
198
+ "#{@run_dir}/.pfm"
199
+ end
200
+
201
+ def config_file
202
+ "#{config_dir}/config"
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,52 @@
1
+ module Pfm
2
+ module Validator
3
+ # This is here to hold attr_accessor data for Validator context variables
4
+ class Context
5
+ def self.add_attr(name)
6
+ @attributes ||= []
7
+
8
+ unless @attributes.include?(name)
9
+ @attributes << name
10
+ attr_accessor(name)
11
+ end
12
+ end
13
+
14
+ def self.reset
15
+ return if @attributes.nil?
16
+
17
+ @attributes.each do |attr|
18
+ remove_method(attr)
19
+ end
20
+
21
+ @attributes = nil
22
+ end
23
+ end
24
+
25
+ def self.reset
26
+ @context = nil
27
+ end
28
+
29
+ def self.context
30
+ @context ||= Context.new
31
+ end
32
+
33
+ def self.add_attr_to_context(name, value = nil)
34
+ sym_name = name.to_sym
35
+ Pfm::Validator::Context.add_attr(sym_name)
36
+ Pfm::Validator::TemplateHelper.delegate_to_app_context(sym_name)
37
+ context.public_send("#{sym_name}=", value)
38
+ end
39
+
40
+ module TemplateHelper
41
+ def self.delegate_to_app_context(name)
42
+ define_method(name) do
43
+ Pfm::Validator.context.public_send(name)
44
+ end
45
+ end
46
+
47
+ def year
48
+ Time.now.year
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,4 @@
1
+ module Pfm
2
+ build_number = ENV.fetch('BUILD_NUMBER', '0')
3
+ VERSION = "1.0.#{build_number}"
4
+ end
@@ -0,0 +1,27 @@
1
+ require 'mixlib/cli'
2
+ require 'mixlib/shellout'
3
+ require 'packer/binary'
4
+ require 'terraform/binary'
5
+
6
+ require 'iapi-idlc-sdk-core'
7
+ require 'iapi-idlc-sdk-build'
8
+ require 'iapi-idlc-sdk-deploy'
9
+
10
+ require 'iapi-idlc-sdk-pfm/version'
11
+ require 'iapi-idlc-sdk-pfm/settings'
12
+ require 'iapi-idlc-sdk-pfm/helpers'
13
+ require 'iapi-idlc-sdk-pfm/cli'
14
+ require 'iapi-idlc-sdk-pfm/commands_map'
15
+ require 'iapi-idlc-sdk-pfm/builtin_commands'
16
+
17
+ # Default region
18
+ ENV['AWS_REGION'] = 'us-east-1' unless ENV['AWS_REGION']
19
+
20
+ # Load config file as mapp of strings ex. SETTINGS[ 'AWS_REGION' ] = 'us-east-1'
21
+ SETTINGS = Pfm::Settings.new(true).settings_strings
22
+
23
+ # Global repository version file
24
+ REPO_VERSION_FILE = 'version'.freeze
25
+
26
+ # Load the current repository version number
27
+ REPO_VERSION = Idlc::Utility.set_global_version(REPO_VERSION_FILE)