cps-property-generator 0.1.3 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9fce8ef7e8df921058c7b72092dc89348196599b
4
- data.tar.gz: 157741d0aad0f3c2899c00eaedcf2bd6de191a80
3
+ metadata.gz: 3c31e3fada8f2c72f084530355f4e90890603365
4
+ data.tar.gz: 552763cf891e7aabfb280c7e43cb95b0ef0fe8ec
5
5
  SHA512:
6
- metadata.gz: fa0ec62cb6bbc64ce80a9d19def8851d6e8587b6e7ccf17d455e95577d9daab69285c5cd1e2883c5cb25cb52a11c647b275f62ccfd9bf385ef4366a2760550ae
7
- data.tar.gz: 225a82358e08c2df7136def8ac3a8fefaacc1260b97ec1a1c74c2f90323f3e06adfaa6d6dfeb16f7a36afe2a782f5896ed5e93dcdf47317746e2a5801bfaaf67
6
+ metadata.gz: 588cc805729bbd8968579b8324aaaf33987ef3e19c0ed9bfb220d1892cfdf5b116aa04c244a2aa92d8d0475907725c5ad68526f2e8400257c42801680bf1b3a6
7
+ data.tar.gz: 6a2cabd3dcdce3ceac2a88f4f6bf5829946509a9804cb85a4142b8d0cecdb663b4a885d73970516d9143cb297d9f96ebbddd587e8cb805042d3353c4303582b3
data/README.md CHANGED
@@ -24,6 +24,7 @@ In the config.yml file we need three keys set to explain our project to the gene
24
24
  * The one to one mapping or aws regions to environments.
25
25
  * The account a environment lives in.
26
26
  * Interpolations for a given environment. Interpolations will be explained in a separate section.
27
+ 4. The `vpc` key can be added under the environment name in the environment configs if you would like to run multiple environments in the same region. If you specify a VPC in one environment then a VPC must be specified in all environments. You can only specify one VPC per environment.
27
28
 
28
29
  Here is a example config.yml
29
30
  ```yaml
@@ -108,8 +109,10 @@ encrypted:
108
109
  ###### Adding interpolations
109
110
  An interpolation is a value that will be dynamically substituted during generation with the correct value for the environment being generated. Interpolations are declared in the config for a given environment. Once declared an interpolation can be used in a property definition by referencing it in braces. If we were to reference the domain interpolation from the example config above we would use `{domain}`.
110
111
 
112
+ Note: values that start with an interpolation must be placed in quotes (ex. "{xxx}.xxx.xxx.{xxx}").
113
+
111
114
  ##### Step 4: Generating Your Properties (Using the CLI)
112
115
  The bin directory contains the generator.rb cli. An example of running the cli is below. The `project_path` argument specifies the path to the properties repo we are generating a uploading properties from. You must be able to create a session with s3 to upload.
113
116
  ```sh
114
117
  ./generator.rb generate --project_path "~/projects/project-properties" --upload true --upload_account "123456789012" --upload_region "us-east-1" --upload_bucket "propertiesbucket.my-cloud.com"
115
- ```
118
+ ```
@@ -24,6 +24,7 @@ module PropertyGenerator
24
24
  def generate
25
25
  output = []
26
26
  @service_list.each do | service, path|
27
+ PropertyGenerator.config_enforcer(@configs.environment_configs)
27
28
  service_instance = PropertyGenerator::Service.new(YAML.load_file(path), @configs, @globals)
28
29
  service_instance.service
29
30
  service_instance.interpolate
@@ -26,19 +26,20 @@ module PropertyGenerator
26
26
  #get the map of config for a env
27
27
  interpolations = @environment_configs[env]['interpolations']
28
28
 
29
- #interate through the properties for an environment and gsub the config
30
- @service[env].each do | property_key, property_value|
31
- property_value_dup = property_value.dup
32
- interpolations.each do |matcher_key, matcher_value|
33
- if property_value.class == String && property_value_dup.include?("{#{matcher_key}}")
34
- @service[env][property_key] = property_value_dup.gsub!("{#{matcher_key}}", matcher_value)
35
- end
36
- end
37
- end
29
+ # Recursively interate through the properties for an environment and gsub the config
30
+ # with defined interpolations.
31
+ interpolate_nested_properties(@service[env], interpolations)
38
32
  end
39
33
  service
40
34
  end
41
35
 
36
+ def interpolate_nested_properties(service_env, interpolations)
37
+ interpolations.each do |matcher_key, matcher_value|
38
+ service_env.each { |k,v| service_env[k] = v.gsub("{#{matcher_key}}", matcher_value) if v.class == String && v.include?("{#{matcher_key}}")}
39
+ service_env.values.each { |v| interpolate_nested_properties(v, interpolations) if v.class == Hash }
40
+ end
41
+ end
42
+
42
43
  def merge_env_default(data, environments)
43
44
  #creates a hash of the enviornments merged with the defaults
44
45
  # {service => {env1 => {properties},
@@ -62,9 +62,17 @@ module PropertyGenerator
62
62
  account = environmental_configs[env]["account"]
63
63
  region = environmental_configs[env]["region"]
64
64
  json = JSON.pretty_generate({"properties" => finalized[env]})
65
- FileUtils.mkdir_p("#{output_path}/#{account}/#{region}/") unless Dir.exist?("#{output_path}/#{account}/#{region}/")
66
- File.write("#{output_path}/#{account}/#{region}/#{service_name}.json", json)
67
- output << "#{output_path}/#{account}/#{region}/#{service_name}.json"
65
+ #IF users are specifing a vpc then we will drop property files under the dir that corresponds to the vpc
66
+ if environmental_configs[env].key?("vpc") && !environmental_configs[env]["vpc"].nil?
67
+ vpc_dir = "#{output_path}/#{account}/#{region}/#{environmental_configs[env]["vpc"]}"
68
+ FileUtils.mkdir_p("#{vpc_dir}/") unless Dir.exist?(vpc_dir)
69
+ File.write("#{output_path}/#{account}/#{region}/#{environmental_configs[env]["vpc"]}/#{service_name}.json", json)
70
+ output << "#{output_path}/#{account}/#{region}/#{environmental_configs[env]["vpc"]}/#{service_name}.json"
71
+ else
72
+ FileUtils.mkdir_p("#{output_path}/#{account}/#{region}/") unless Dir.exist?("#{output_path}/#{account}/#{region}/")
73
+ File.write("#{output_path}/#{account}/#{region}/#{service_name}.json", json)
74
+ output << "#{output_path}/#{account}/#{region}/#{service_name}.json"
75
+ end
68
76
  end
69
77
  output
70
78
  end
@@ -78,5 +86,17 @@ module PropertyGenerator
78
86
  obj.upload_file(file)
79
87
  end
80
88
 
89
+ #Force users to specify VPCs for all environments if specified for one environment.
90
+ #This allows us to skip having conditional logic downstream in CPS requests
91
+ def config_enforcer(environment_configs)
92
+ a_vpc_exists = false
93
+ environment_configs.each do |environment, config|
94
+ if config.key?("vpc")
95
+ a_vpc_exists = true
96
+ elsif a_vpc_exists
97
+ raise("If you are using VPCs then a VPC must be specified for all environments in the environment_configs")
98
+ end
99
+ end
100
+ end
81
101
  end
82
102
  end
@@ -41,6 +41,9 @@ module PropertyGenerator
41
41
  end
42
42
  table = Terminal::Table.new :headings => ['Files'], :title => 'Files Failing to Load', :rows => rows, :style => {:width => 200}
43
43
  puts table
44
+ puts "*****************"
45
+ puts "Check for property values that start with an interpolated value \nIf the first character of the value is a bracket yaml will fail to load \nPlace the value in quotes"
46
+ puts "*****************"
44
47
  end
45
48
 
46
49
  def make_pass_table
@@ -13,17 +13,39 @@ module PropertyGenerator
13
13
  end
14
14
 
15
15
  def run_services_tests
16
- tests = ['services_have_accepted_keys',
17
- 'service_defaults_have_no_hashes_as_values',
18
- 'service_environments_match_config_environments',
19
- 'service_environments_have_no_hashes_as_values',
20
- 'service_encrypted_environments_match_config_environments',
21
- 'service_encrypted_fields_are_correct',
22
- 'service_encrypted_region_field_is_accepted']
16
+ tests = [
17
+ 'services_have_accepted_keys',
18
+ 'service_environments_are_not_empty',
19
+ 'service_defaults_have_no_hashes_as_values',
20
+ 'service_environments_match_config_environments',
21
+ 'service_environments_have_no_hashes_as_values',
22
+ 'service_encrypted_environments_match_config_environments',
23
+ 'service_encrypted_fields_are_correct',
24
+ 'service_encrypted_region_field_is_accepted'
25
+ ]
23
26
  results = PropertyGenerator.test_runner(self, tests)
24
27
  results
25
28
  end
26
29
 
30
+ def service_environments_are_not_empty
31
+ status = {status: 'pass', error: ''}
32
+ services_empty_environments = []
33
+ @services.each do |path, loaded|
34
+ unless loaded['environments'] == nil
35
+ loaded['environments'].each do |environments, properties|
36
+ if properties == nil
37
+ services_empty_environments << {path => environments}
38
+ end
39
+ end
40
+ end
41
+ end
42
+ if services_empty_environments != []
43
+ status[:status] = 'fail'
44
+ status[:error] = "Service files #{services_empty_environments} have empty environments, these should be omitted."
45
+ end
46
+ status
47
+ end
48
+
27
49
  def services_have_accepted_keys
28
50
  status = {status: 'pass', error: ''}
29
51
  accepted_keys = ['default', 'environments', 'encrypted']
@@ -91,9 +113,11 @@ module PropertyGenerator
91
113
  @services.each do |path, loaded|
92
114
  unless loaded['environments'] == nil
93
115
  loaded['environments'].each do |environments, properties|
94
- properties.each do |key, value|
95
- if value.class == Hash
96
- services_with_hashes_in_environments << {path => {environments => key}}
116
+ unless properties == nil
117
+ properties.each do |key, value|
118
+ if value.class == Hash
119
+ services_with_hashes_in_environments << {path => {environments => key}}
120
+ end
97
121
  end
98
122
  end
99
123
  end
@@ -132,15 +156,23 @@ module PropertyGenerator
132
156
 
133
157
  def service_encrypted_fields_are_correct
134
158
  status = {status: 'pass', error: ''}
135
- accepted_keys = ['region', 'encrypted']
159
+ accepted_keys = ['region', 'encrypted', 'service']
136
160
  services_with_unacceptable_keys = []
137
161
  @services.each do |path, loaded|
138
162
  if loaded['encrypted'] != nil
139
- loaded['encrypted'].each do |environment, property|
140
- if loaded['encrypted'][environment][property] != nil
141
- loaded['encrypted'][environment][property].each do |ssm, keys|
142
- unless loaded['encrypted'][environment][property]['$ssm'][keys].keys == accepted_keys
143
- services_with_unacceptable_keys << {path => {environment => property}}
163
+ loaded['encrypted'].each do |environment, properties|
164
+ properties.each do |property, value|
165
+ if value == nil
166
+ services_with_unacceptable_keys << {path => {environment => property}}
167
+ elsif value['$ssm'] == nil
168
+ services_with_unacceptable_keys << {path => {environment => property}}
169
+ else
170
+ if value['$ssm'] != nil
171
+ value['$ssm'].keys.each do |key|
172
+ unless accepted_keys.include?(key)
173
+ services_with_unacceptable_keys << {path => {environment => property}}
174
+ end
175
+ end
144
176
  end
145
177
  end
146
178
  end
@@ -149,7 +181,7 @@ module PropertyGenerator
149
181
  end
150
182
  if services_with_unacceptable_keys != []
151
183
  status[:status] = 'fail'
152
- status[:error] = "Service files: #{services_with_unacceptable_keys} have encrypted properties with keys other than 'region' and 'encrypted'."
184
+ status[:error] = "Service files: #{services_with_unacceptable_keys} have encrypted properties with bad indentation or keys other than 'region' and 'encrypted'."
153
185
  end
154
186
  status
155
187
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cps-property-generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Call