genome 0.1.0 → 0.1.1

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