genome 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: b6cc6d10ee7b5ba25627f3d129a6743478c18df27f21909a0ca8a753dbc91a94
4
- data.tar.gz: d3254e10ad2679ab940d14a5d03e1644d0fbe2b73b9bfc002e26c6ea817126ad
3
+ metadata.gz: 65776260dc82ffcf09195b7d88e38b9c0c6531e26689140fde6db61041718df4
4
+ data.tar.gz: 7474b6aed06682d8fa85191137b0cccedd91c832fab09a3a11a70d8c2d091e0c
5
5
  SHA512:
6
- metadata.gz: d60d317c8ab65fa464b903ec95ad115825061dbaf341736e9cf096690962a3c30ad79037b6f7454abfcf4dd86580d5bdf75e468e9f08772be85f2c25a20d6df6
7
- data.tar.gz: 5e0078157a938c7e0838a4bf4abe8c41058e2d0d79cdfcff701c4955a32b87dd94173473c314f5b5db8eee0e245eba5b72ea40925323f2cd15379e93b47531ac
6
+ metadata.gz: 4df7c0bb09d173c65ea59be9cd7b5f47bf6eb0a7447eec9322e69f74721421ae2d4c6ab0dca2f02806f130e0a7a3d59cc862ba4ffb2de3bc8ac2cffb44a73010
7
+ data.tar.gz: 54b94dd8b505d0d002fabbfa00f2677b38aa1675be332f48b4a81b8b1446afdbeb36d7eb9c1d4c5d3c961d212eb419b37cda72d9b581d0833c72577b667ebeb8
data/.gitignore CHANGED
@@ -8,7 +8,7 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  /.idea
11
-
11
+ /*.gem
12
12
  /*.env
13
13
 
14
14
  # rspec failure tracking
@@ -9,16 +9,22 @@ module Genome
9
9
  resources = {}
10
10
 
11
11
  resource.templates.each do |template_name, template|
12
- parameters = evaluate_parameters(template[:parameters])
12
+ properties = evaluate_properties(template[:properties])
13
13
 
14
14
  dependencies = template[:dependencies]
15
15
 
16
- resource_template = template[:klass].new(template_name, parameters, dependencies)
16
+ resource_template = template[:klass].new(template_name, properties, dependencies)
17
17
 
18
18
  resources.merge!(resource_template.to_h)
19
19
  end
20
20
 
21
- generate_document(resources: resources, description: resource.description)
21
+ parameters = {}
22
+
23
+ resource.parameters.each do |_parameter_name, parameter|
24
+ parameters.merge!(parameter.to_h)
25
+ end
26
+
27
+ generate_document(resources: resources, parameters: parameters, description: resource.resource_description)
22
28
  end
23
29
 
24
30
  def self.generate_document(metadata: {}, description: nil, resources: {}, parameters: {}, outputs: {})
@@ -32,27 +38,27 @@ module Genome
32
38
  }
33
39
  end
34
40
 
35
- def self.evaluate_parameters(parameters)
36
- # TODO: convert classes and helper functions into appropriate parameters
37
- processed_parameters = {}
41
+ def self.evaluate_properties(properties)
42
+ # TODO: convert classes and helper functions into appropriate properties
43
+ processed_properties = {}
38
44
 
39
- parameters.each do |parameter_name, parameter_value|
40
- processed_parameters[parameter_name] = evaluate_parameter_value(parameter_value)
45
+ properties.each do |properties_name, properties_value|
46
+ processed_properties[properties_name] = evaluate_properties_value(properties_value)
41
47
  end
42
48
 
43
- processed_parameters
49
+ processed_properties
44
50
  end
45
51
 
46
- def self.evaluate_parameter_value(parameter_value)
47
- case parameter_value
52
+ def self.evaluate_properties_value(properties_value)
53
+ case properties_value
48
54
  when Array
49
- parameter_value.map do |single_parameter_value|
50
- evaluate_parameter_value(single_parameter_value)
55
+ properties_value.map do |single_properties_value|
56
+ evaluate_properties_value(single_properties_value)
51
57
  end
52
58
  when Genome::Reference
53
- { Ref: parameter_value.reference_name }
59
+ { Ref: properties_value.reference_name }
54
60
  else
55
- parameter_value
61
+ properties_value
56
62
  end
57
63
  end
58
64
 
data/lib/genome/error.rb CHANGED
@@ -5,5 +5,13 @@ module Genome
5
5
  class DuplicateProperty < Base; end
6
6
 
7
7
  class DuplicateTemplate < Base; end
8
+
9
+ class DuplicateParameter < Base; end
10
+
11
+ class MissingParameterName < Base; end
12
+
13
+ class UnknownParameter < Base; end
14
+
15
+ class InvalidParameterType < Base; end
8
16
  end
9
17
  end
@@ -0,0 +1,71 @@
1
+ require_relative 'error'
2
+
3
+ module Genome
4
+ class Parameter
5
+ PARAMETERS = {
6
+ AllowedPattern: { type: :string },
7
+ AllowedValues: { type: :array },
8
+ ConstraintDescription: { type: :string },
9
+ Default: { type: :any },
10
+ Description: { type: :string },
11
+ MaxLength: { type: :integer },
12
+ MaxValue: { type: :integer },
13
+ MinLength: { type: :integer },
14
+ MinValue: { type: :integer },
15
+ NoEcho: { type: :boolean },
16
+ Type: { type: :string },
17
+ }.freeze
18
+
19
+ attr_reader :parameter_name
20
+ attr_accessor :parameter_options
21
+
22
+ def initialize(parameter_name:, parameter_options: {})
23
+ validate_parameter_options!(parameter_options)
24
+
25
+ @parameter_name = parameter_name
26
+ @parameter_options = parameter_options
27
+ end
28
+
29
+ def validate_parameter_options!(parameter_options)
30
+ parameter_options.each do |parameter_option_name, parameter_option_value|
31
+ parameter_option_rules = PARAMETERS[parameter_option_name]
32
+
33
+ raise Error::UnknownParameter, "Unknown parameter '#{parameter_option_name}'" unless parameter_option_rules
34
+
35
+ allowed_parameter_type = parameter_option_rules[:type]
36
+
37
+ raise Error::InvalidParameterType, "Invalid parameter type #{{
38
+ parameter_value: parameter_value,
39
+ allowed_parameter_type: allowed_parameter_type,
40
+ }}" unless check_parameter_type(parameter_option_value, allowed_parameter_type)
41
+ end
42
+ end
43
+
44
+ def check_parameter_type(parameter_value, allowed_parameter_type)
45
+ case allowed_parameter_type
46
+ when :string
47
+ parameter_value.is_a?(String)
48
+ when :integer
49
+ begin
50
+ Integer(parameter_value)
51
+
52
+ true
53
+ rescue
54
+ false
55
+ end
56
+ when :boolean
57
+ ['true', 'false'].include?(parameter_value.to_s.downcase)
58
+ when :array
59
+ parameter_value.is_a?(Array)
60
+ when :any
61
+ true
62
+ end
63
+ end
64
+
65
+ def to_h
66
+ {
67
+ parameter_name => parameter_options
68
+ }
69
+ end
70
+ end
71
+ end
@@ -3,6 +3,7 @@ require 'active_support/concern'
3
3
  require 'active_support/core_ext'
4
4
 
5
5
  require_relative 'error'
6
+ require_relative 'parameter'
6
7
  require_relative 'reference'
7
8
 
8
9
  module Genome
@@ -11,19 +12,20 @@ module Genome
11
12
 
12
13
  included do
13
14
  class_attribute :templates, default: {}
15
+ class_attribute :parameters, default: {}
14
16
  class_attribute :references, default: []
15
- class_attribute :description
17
+ class_attribute :resource_description
16
18
  end
17
19
 
18
20
  module ClassMethods
19
- def template(template_name, template_klass, template_parameters)
20
- raise Error::DuplicateTemplate, "Duplicate template name defined '#{template_name}'" if self.templates.key?(template_name)
21
+ def template(template_name, template_klass, template_properties)
22
+ raise Error::DuplicateTemplate, "Duplicate template name defined '#{template_name}'" if templates.key?(template_name)
21
23
 
22
- dependencies = template_parameters.delete(:DependsOn)
24
+ dependencies = template_properties.delete(:DependsOn)
23
25
 
24
26
  templates[template_name] = {
25
27
  klass: template_klass,
26
- parameters: template_parameters,
28
+ properties: template_properties,
27
29
  dependencies: dependencies,
28
30
  }
29
31
  end
@@ -33,6 +35,22 @@ module Genome
33
35
  remove_dependencies(template_name)
34
36
  end
35
37
 
38
+ def description(description)
39
+ @resource_description = description
40
+ end
41
+
42
+ def parameter(parameter_name, parameter_options = {})
43
+ raise Error::DuplicateParameter, "Duplicate parameter name defined '#{parameter_name}'" if parameters.key?(parameter_name)
44
+
45
+ parameters[parameter_name] = Parameter.new(parameter_name: parameter_name, parameter_options: parameter_options)
46
+ end
47
+
48
+ def override_parameter(parameter_name, parameter_options = {})
49
+ raise Error::MissingParameterName, "Parameter name not defined '#{parameter_name}'" unless parameters.key?(parameter_name)
50
+
51
+ parameters[parameter_name].parameter_options.merge!(parameter_options)
52
+ end
53
+
36
54
  def remove_dependencies(*dependencies)
37
55
  templates.each do |template_name, template_parameters|
38
56
  dependencies.each do |dependency|
@@ -11,6 +11,62 @@ module Genome
11
11
  class DocumentDB
12
12
  include Resource
13
13
 
14
+ parameter :DocumentDBMasterUsername,
15
+ Default: 'master',
16
+ NoEcho: "true",
17
+ Description: "The database admin account username",
18
+ Type: "String",
19
+ MinLength: "1",
20
+ MaxLength: "16",
21
+ AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*",
22
+ ConstraintDescription: "Must begin with a letter and contain only alphanumeric characters."
23
+
24
+ parameter :DocumentDBMasterPassword,
25
+ Default: 'anotverysecurepassword9876',
26
+ NoEcho: "true",
27
+ Description: "The database admin account password",
28
+ Type: "String",
29
+ MinLength: "1",
30
+ MaxLength: "41",
31
+ AllowedPattern: "[a-zA-Z0-9]+",
32
+ ConstraintDescription: "Must contain only alphanumeric characters."
33
+
34
+ parameter :DocumentDBSubnetGroupName,
35
+ Default: 'documentdb-subnet-group',
36
+ Description: "Subnet group name",
37
+ Type: "String",
38
+ MinLength: "1",
39
+ MaxLength: "64",
40
+ AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*",
41
+ ConstraintDescription: "Must begin with a letter and contain only alphanumeric characters."
42
+
43
+ parameter :DocumentDBParameterGroupName,
44
+ Default: 'documentdb-parameter-group',
45
+ Description: "Parameter group name",
46
+ Type: "String",
47
+ MinLength: "1",
48
+ MaxLength: "64",
49
+ AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*",
50
+ ConstraintDescription: "Must begin with a letter and contain only alphanumeric characters."
51
+
52
+ parameter :DocumentDBClusterIdentifier,
53
+ Default: 'documentdb-cluster',
54
+ Description: "Cluster identifier",
55
+ Type: "String",
56
+ MinLength: "1",
57
+ MaxLength: "64",
58
+ AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*",
59
+ ConstraintDescription: "Must begin with a letter and contain only alphanumeric characters."
60
+
61
+ parameter :DocumentDBInstanceIdentifier,
62
+ Default: 'documentdb-instance',
63
+ Description: "Instance identifier",
64
+ Type: "String",
65
+ MinLength: "1",
66
+ MaxLength: "64",
67
+ AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*",
68
+ ConstraintDescription: "Must begin with a letter and contain only alphanumeric characters."
69
+
14
70
  template :DocumentDBEC2SVPC, Core::Templates::EC2VPC,
15
71
  CidrBlock: '10.50.0.0/16',
16
72
  EnableDnsSupport: true,
@@ -54,7 +110,7 @@ module Genome
54
110
 
55
111
  template :DocumentDBSubnetGroup, Core::Templates::DocumentDBSubnetGroup,
56
112
  DBSubnetGroupDescription: 'Maintained by Genome: Default DocumentDB Subnet Group',
57
- DBSubnetGroupName: 'documentdb-cluster',
113
+ DBSubnetGroupName: reference(:DocumentDBSubnetGroupName),
58
114
  SubnetIds: [
59
115
  reference(:DocumentDBEC2SubnetUSEast1A),
60
116
  reference(:DocumentDBEC2SubnetUSEast1B),
@@ -71,9 +127,9 @@ module Genome
71
127
 
72
128
  template :DocumentDBInstance, Core::Templates::DocumentDBInstance,
73
129
  AutoMinorVersionUpgrade: true,
74
- DBClusterIdentifier: 'documentdb-cluster',
130
+ DBClusterIdentifier: reference(:DocumentDBClusterIdentifier),
75
131
  DBInstanceClass: :'db.r4.large',
76
- DBInstanceIdentifier: 'documentdb-instance',
132
+ DBInstanceIdentifier: reference(:DocumentDBInstanceIdentifier),
77
133
  Tags: [
78
134
  { Key: :Resource, Value: :DocumentDBCluster }
79
135
  ],
@@ -84,7 +140,7 @@ module Genome
84
140
  template :DocumentDBParameterGroup, Core::Templates::DocumentDBParameterGroup,
85
141
  Description: 'Maintained by Genome: Default DocumentDB Parameter Group',
86
142
  Family: 'docdb3.6',
87
- Name: 'documentdb-parameter-group',
143
+ Name: reference(:DocumentDBParameterGroupName),
88
144
  Parameters: {
89
145
  audit_logs: :enabled,
90
146
  tls: :enabled,
@@ -95,11 +151,11 @@ module Genome
95
151
  ]
96
152
 
97
153
  template :DocumentDBCluster, Core::Templates::DocumentDBCluster,
98
- DBClusterIdentifier: 'documentdb-cluster',
99
- DBClusterParameterGroupName: 'documentdb-parameter-group',
100
- DBSubnetGroupName: 'documentdb-cluster',
101
- MasterUsername: 'master',
102
- MasterUserPassword: 'anotverysecurepassword9876',
154
+ DBClusterIdentifier: reference(:DocumentDBClusterIdentifier),
155
+ DBClusterParameterGroupName: reference(:DocumentDBParameterGroupName),
156
+ DBSubnetGroupName: reference(:DocumentDBSubnetGroupName),
157
+ MasterUsername: reference(:DocumentDBMasterUsername),
158
+ MasterUserPassword: reference(:DocumentDBMasterPassword),
103
159
  StorageEncrypted: true,
104
160
  Tags: [
105
161
  { Key: :Resource, Value: :DocumentDBCluster }
@@ -120,19 +176,29 @@ module Genome
120
176
  remove_template(:DocumentDBEC2SubnetUSEast1C)
121
177
  end
122
178
 
179
+ def self.disable_tls
180
+ templates[:DocumentDBParameterGroup][:properties][:Parameters].merge!(
181
+ tls: :disabled
182
+ )
183
+ end
184
+
123
185
  def self.subnet_ids(subnet_ids)
124
- templates[:DocumentDBSubnetGroup][:parameters][:SubnetIds] = subnet_ids
186
+ templates[:DocumentDBSubnetGroup][:properties].merge!(
187
+ SubnetIds: subnet_ids
188
+ )
125
189
  end
126
190
 
127
191
  def self.security_group_ids(security_group_ids)
128
- templates[:DocumentDBCluster][:parameters][:VpcSecurityGroupIds] = security_group_ids
192
+ templates[:DocumentDBCluster][:properties].merge!(
193
+ VpcSecurityGroupIds: security_group_ids
194
+ )
129
195
  end
130
196
 
131
197
  def self.add_cluster_dependencies(*dependencies)
132
- cluster_dependencies = templates[:DocumentDBCluster][:parameters][:DependsOn] || []
198
+ cluster_dependencies = templates[:DocumentDBCluster][:properties][:DependsOn] || []
133
199
  cluster_dependencies += dependencies
134
200
 
135
- templates[:DocumentDBCluster][:parameters][:DependsOn] = cluster_dependencies
201
+ templates[:DocumentDBCluster][:properties][:DependsOn] = cluster_dependencies
136
202
  end
137
203
  end
138
204
  end
@@ -1,3 +1,3 @@
1
1
  module Genome
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: genome
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - hypernova2002
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-01 00:00:00.000000000 Z
11
+ date: 2019-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-cloudformation
@@ -130,6 +130,7 @@ files:
130
130
  - lib/genome/core/templates/ecs_cluster.rb
131
131
  - lib/genome/core/templates/sqs_queue.rb
132
132
  - lib/genome/error.rb
133
+ - lib/genome/parameter.rb
133
134
  - lib/genome/reference.rb
134
135
  - lib/genome/resource.rb
135
136
  - lib/genome/resources/documentdb.rb
@@ -156,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
157
  - !ruby/object:Gem::Version
157
158
  version: '0'
158
159
  requirements: []
159
- rubygems_version: 3.0.1
160
+ rubygems_version: 3.0.2
160
161
  signing_key:
161
162
  specification_version: 4
162
163
  summary: A library for create and maintaining cloud formation stacks