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 +4 -4
- data/.gitignore +1 -1
- data/lib/genome/builder.rb +21 -15
- data/lib/genome/error.rb +8 -0
- data/lib/genome/parameter.rb +71 -0
- data/lib/genome/resource.rb +23 -5
- data/lib/genome/resources/documentdb.rb +79 -13
- data/lib/genome/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65776260dc82ffcf09195b7d88e38b9c0c6531e26689140fde6db61041718df4
|
4
|
+
data.tar.gz: 7474b6aed06682d8fa85191137b0cccedd91c832fab09a3a11a70d8c2d091e0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4df7c0bb09d173c65ea59be9cd7b5f47bf6eb0a7447eec9322e69f74721421ae2d4c6ab0dca2f02806f130e0a7a3d59cc862ba4ffb2de3bc8ac2cffb44a73010
|
7
|
+
data.tar.gz: 54b94dd8b505d0d002fabbfa00f2677b38aa1675be332f48b4a81b8b1446afdbeb36d7eb9c1d4c5d3c961d212eb419b37cda72d9b581d0833c72577b667ebeb8
|
data/.gitignore
CHANGED
data/lib/genome/builder.rb
CHANGED
@@ -9,16 +9,22 @@ module Genome
|
|
9
9
|
resources = {}
|
10
10
|
|
11
11
|
resource.templates.each do |template_name, template|
|
12
|
-
|
12
|
+
properties = evaluate_properties(template[:properties])
|
13
13
|
|
14
14
|
dependencies = template[:dependencies]
|
15
15
|
|
16
|
-
resource_template = template[:klass].new(template_name,
|
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
|
-
|
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.
|
36
|
-
# TODO: convert classes and helper functions into appropriate
|
37
|
-
|
41
|
+
def self.evaluate_properties(properties)
|
42
|
+
# TODO: convert classes and helper functions into appropriate properties
|
43
|
+
processed_properties = {}
|
38
44
|
|
39
|
-
|
40
|
-
|
45
|
+
properties.each do |properties_name, properties_value|
|
46
|
+
processed_properties[properties_name] = evaluate_properties_value(properties_value)
|
41
47
|
end
|
42
48
|
|
43
|
-
|
49
|
+
processed_properties
|
44
50
|
end
|
45
51
|
|
46
|
-
def self.
|
47
|
-
case
|
52
|
+
def self.evaluate_properties_value(properties_value)
|
53
|
+
case properties_value
|
48
54
|
when Array
|
49
|
-
|
50
|
-
|
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:
|
59
|
+
{ Ref: properties_value.reference_name }
|
54
60
|
else
|
55
|
-
|
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
|
data/lib/genome/resource.rb
CHANGED
@@ -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 :
|
17
|
+
class_attribute :resource_description
|
16
18
|
end
|
17
19
|
|
18
20
|
module ClassMethods
|
19
|
-
def template(template_name, template_klass,
|
20
|
-
raise Error::DuplicateTemplate, "Duplicate template name defined '#{template_name}'" if
|
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 =
|
24
|
+
dependencies = template_properties.delete(:DependsOn)
|
23
25
|
|
24
26
|
templates[template_name] = {
|
25
27
|
klass: template_klass,
|
26
|
-
|
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:
|
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:
|
130
|
+
DBClusterIdentifier: reference(:DocumentDBClusterIdentifier),
|
75
131
|
DBInstanceClass: :'db.r4.large',
|
76
|
-
DBInstanceIdentifier:
|
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:
|
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:
|
99
|
-
DBClusterParameterGroupName:
|
100
|
-
DBSubnetGroupName:
|
101
|
-
MasterUsername:
|
102
|
-
MasterUserPassword:
|
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][:
|
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][:
|
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][:
|
198
|
+
cluster_dependencies = templates[:DocumentDBCluster][:properties][:DependsOn] || []
|
133
199
|
cluster_dependencies += dependencies
|
134
200
|
|
135
|
-
templates[:DocumentDBCluster][:
|
201
|
+
templates[:DocumentDBCluster][:properties][:DependsOn] = cluster_dependencies
|
136
202
|
end
|
137
203
|
end
|
138
204
|
end
|
data/lib/genome/version.rb
CHANGED
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.
|
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-
|
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.
|
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
|