dslh 0.2.0 → 0.2.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
  SHA1:
3
- metadata.gz: bf9e9e4937fa96b3e6896e280e24d44b63622287
4
- data.tar.gz: ac2fe663b7d7c66d0a7530d6a77f57019586a525
3
+ metadata.gz: 5d2dfc05d04e7e6e193b066d2ecb8c7cff66c543
4
+ data.tar.gz: 33496a369aa2d80a63a5cf4aeceb3bf2f9141a10
5
5
  SHA512:
6
- metadata.gz: a58ffa0d678c4831fd55c47c27a24dea2b8f28e59aa2b5cb0a0653fe7f7ed1c76b26065f418024dc676e59ef8f3d7a6a3e2e07836b4d2a3514a9e8b5ba07422f
7
- data.tar.gz: 29ab30743682fd4820dc144e5e7b7629dcd2a7bf3586f0b785302b6f8c927933a2b6830cbacb2413fc4f2df78748781d680f438201f38e2f7acd2dbe258b441b
6
+ metadata.gz: 89010f761b726a054d10815815c5971e3dd20937410cd1b533272edbd6cd4b133e18f16021f67c1e7eec125d98ca9c2cf322ae66eadbeda2df8f19a088996ef5
7
+ data.tar.gz: ce5a58b6eff9972b0621e3a62ec2ec42f36a9e677990dfa7028ef2ffef7f4db1128b743cc2c167cbd976fc65db49fb7dcc7339b8c1b60d67c8e5703a963ac7f4
@@ -75,70 +75,20 @@ class Dslh
75
75
 
76
76
  def deval0(hash, depth, buf)
77
77
  indent = (INDENT_SPACES * depth)
78
- next_indent = (INDENT_SPACES * (depth + 1))
79
78
  key_conv = @options[:key_conv]
80
79
  value_conv = @options[:value_conv]
81
- nested = false
82
80
 
83
- if exclude_key?(hash.keys)
81
+ if exclude_keys?(hash.keys)
84
82
  buf.puts('(' + ("\n" + hash.pretty_inspect.strip).gsub("\n", "\n" + indent) + ')')
85
83
  return
86
84
  end
87
85
 
88
86
  hash.each do |key, value|
89
- value_proc = proc do |value_buf|
90
- case value
91
- when Hash
92
- if exclude_key?(value.keys)
93
- value_buf.puts('(' + ("\n" + value.pretty_inspect.strip).gsub("\n", "\n" + next_indent) + ')')
94
- else
95
- nested = true
96
- value_buf.puts(' do')
97
- deval0(value, depth + 1, value_buf)
98
- value_buf.puts(indent + 'end')
99
- end
100
- when Array
101
- if value.any? {|v| [Array, Hash].any? {|c| v.kind_of?(c) }}
102
- nested = true
103
- value_buf.puts(' [')
104
-
105
- value.each_with_index do |v, i|
106
- if v.kind_of?(Hash)
107
- value_buf.puts(next_indent + '_{')
108
- deval0(v, depth + 2, value_buf)
109
- value_buf.print(next_indent + '}')
110
- else
111
- value_buf.print(next_indent + v.pretty_inspect.strip.gsub("\n", "\n" + next_indent))
112
- end
113
-
114
- value_buf.puts(i < (value.length - 1) ? ',' : '')
115
- end
116
-
117
- value_buf.puts(indent + ']')
118
- elsif value.length == 1
119
- value_buf.puts(' ' + value.inspect)
120
- else
121
- value_buf.puts(' ' + value.map {|v|
122
- v = value_conv.call(v) if value_conv
123
-
124
- if v.kind_of?(Hash)
125
- '(' + v.inspect + ')'
126
- else
127
- v.inspect
128
- end
129
- }.join(', '))
130
- end
131
- else
132
- value = value_conv.call(value) if value_conv
133
- value_buf.puts(' ' + value.inspect)
134
- end
135
- end
136
-
137
87
  key = key_conv.call(key) if key_conv
138
88
 
139
89
  if key.kind_of?(Proc)
140
90
  tmp_buf = StringIO.new
141
- value_proc.call(tmp_buf)
91
+ nested = value_proc(value, depth, tmp_buf)
142
92
 
143
93
  key_value = case key.arity
144
94
  when 0
@@ -152,12 +102,67 @@ class Dslh
152
102
  buf.puts(indent + key_value)
153
103
  else
154
104
  buf.print(indent + key)
155
- value_proc.call(buf)
105
+ value_proc(value, depth, buf)
156
106
  end
157
107
  end
158
108
  end
159
109
 
160
- def exclude_key?(keys)
110
+ def value_proc(value, depth, value_buf)
111
+ indent = (INDENT_SPACES * depth)
112
+ next_indent = (INDENT_SPACES * (depth + 1))
113
+ value_conv = @options[:value_conv]
114
+ nested = false
115
+
116
+ case value
117
+ when Hash
118
+ if exclude_keys?(value.keys)
119
+ value_buf.puts('(' + ("\n" + value.pretty_inspect.strip).gsub("\n", "\n" + next_indent) + ')')
120
+ else
121
+ nested = true
122
+ value_buf.puts(' do')
123
+ deval0(value, depth + 1, value_buf)
124
+ value_buf.puts(indent + 'end')
125
+ end
126
+ when Array
127
+ if value.any? {|v| [Array, Hash].any? {|c| v.kind_of?(c) }}
128
+ nested = true
129
+ value_buf.puts(' [')
130
+
131
+ value.each_with_index do |v, i|
132
+ if v.kind_of?(Hash)
133
+ value_buf.puts(next_indent + '_{')
134
+ deval0(v, depth + 2, value_buf)
135
+ value_buf.print(next_indent + '}')
136
+ else
137
+ value_buf.print(next_indent + v.pretty_inspect.strip.gsub("\n", "\n" + next_indent))
138
+ end
139
+
140
+ value_buf.puts(i < (value.length - 1) ? ',' : '')
141
+ end
142
+
143
+ value_buf.puts(indent + ']')
144
+ elsif value.length == 1
145
+ value_buf.puts(' ' + value.inspect)
146
+ else
147
+ value_buf.puts(' ' + value.map {|v|
148
+ v = value_conv.call(v) if value_conv
149
+
150
+ if v.kind_of?(Hash)
151
+ '(' + v.inspect + ')'
152
+ else
153
+ v.inspect
154
+ end
155
+ }.join(', '))
156
+ end
157
+ else
158
+ value = value_conv.call(value) if value_conv
159
+ value_buf.puts(' ' + value.inspect)
160
+ end
161
+
162
+ return nested
163
+ end
164
+
165
+ def exclude_keys?(keys)
161
166
  key_conv = @options[:key_conv]
162
167
 
163
168
  exclude_key = @options[:exclude_key] || proc {|k|
@@ -1,3 +1,3 @@
1
1
  class Dslh
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
@@ -0,0 +1,270 @@
1
+ {
2
+ "AWSTemplateFormatVersion" : "2010-09-09",
3
+
4
+ "Description" : "AWS CloudFormation Sample Template Drupal_Single_Instance. Drupal is an open source content management platform powering millions of websites and applications. This template installs a singe instance deployment with a local MySQL database for storage. It uses the AWS CloudFormation bootstrap scripts to install packages and files at instance launch time. **WARNING** This template creates an Amazon EC2 instance. You will be billed for the AWS resources used if you create a stack from this template.",
5
+
6
+ "Parameters" : {
7
+
8
+ "KeyName": {
9
+ "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances",
10
+ "Type": "String",
11
+ "MinLength": "1",
12
+ "MaxLength": "255",
13
+ "AllowedPattern" : "[\\x20-\\x7E]*",
14
+ "ConstraintDescription" : "can contain only ASCII characters."
15
+ },
16
+
17
+ "InstanceType" : {
18
+ "Description" : "WebServer EC2 instance type",
19
+ "Type" : "String",
20
+ "Default" : "m1.small",
21
+ "AllowedValues" : [ "t1.micro","m1.small","m1.medium","m1.large","m1.xlarge","m2.xlarge","m2.2xlarge","m2.4xlarge","m3.xlarge","m3.2xlarge","c1.medium","c1.xlarge","cc1.4xlarge","cc2.8xlarge","cg1.4xlarge"],
22
+ "ConstraintDescription" : "must be a valid EC2 instance type."
23
+ },
24
+
25
+ "SiteName": {
26
+ "Default": "My Site",
27
+ "Description" : "The name of the Drupal Site",
28
+ "Type": "String"
29
+ },
30
+
31
+ "SiteEMail": {
32
+ "Description" : "EMail for site adminitrator",
33
+ "Type": "String"
34
+ },
35
+
36
+ "SiteAdmin": {
37
+ "Description" : "The Drupal site admin account username",
38
+ "Type": "String",
39
+ "MinLength": "1",
40
+ "MaxLength": "16",
41
+ "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",
42
+ "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."
43
+ },
44
+
45
+ "SitePassword": {
46
+ "NoEcho": "true",
47
+ "Description" : "The Drupal site admin account password",
48
+ "Type": "String",
49
+ "MinLength": "1",
50
+ "MaxLength": "41",
51
+ "AllowedPattern" : "[a-zA-Z0-9]*",
52
+ "ConstraintDescription" : "must contain only alphanumeric characters."
53
+ },
54
+
55
+ "DBName": {
56
+ "Default": "drupaldb",
57
+ "Description" : "The Drupal database name",
58
+ "Type": "String",
59
+ "MinLength": "1",
60
+ "MaxLength": "64",
61
+ "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",
62
+ "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."
63
+ },
64
+
65
+ "DBUsername": {
66
+ "Default": "admin",
67
+ "NoEcho": "true",
68
+ "Description" : "The Drupal database admin account username",
69
+ "Type": "String",
70
+ "MinLength": "1",
71
+ "MaxLength": "16",
72
+ "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",
73
+ "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."
74
+ },
75
+
76
+ "DBPassword": {
77
+ "Default": "admin",
78
+ "NoEcho": "true",
79
+ "Description" : "The Drupal database admin account password",
80
+ "Type": "String",
81
+ "MinLength": "1",
82
+ "MaxLength": "41",
83
+ "AllowedPattern" : "[a-zA-Z0-9]*",
84
+ "ConstraintDescription" : "must contain only alphanumeric characters."
85
+ },
86
+
87
+ "DBRootPassword": {
88
+ "NoEcho": "true",
89
+ "Description" : "Root password for MySQL",
90
+ "Type": "String",
91
+ "MinLength": "1",
92
+ "MaxLength": "41",
93
+ "AllowedPattern" : "[a-zA-Z0-9]*",
94
+ "ConstraintDescription" : "must contain only alphanumeric characters."
95
+ },
96
+ "SSHLocation" : {
97
+ "Description" : "The IP address range that can be used to SSH to the EC2 instances",
98
+ "Type": "String",
99
+ "MinLength": "9",
100
+ "MaxLength": "18",
101
+ "Default": "0.0.0.0/0",
102
+ "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
103
+ "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
104
+ }
105
+ },
106
+
107
+ "Mappings" : {
108
+ "AWSInstanceType2Arch" : {
109
+ "t1.micro" : { "Arch" : "64" },
110
+ "m1.small" : { "Arch" : "64" },
111
+ "m1.medium" : { "Arch" : "64" },
112
+ "m1.large" : { "Arch" : "64" },
113
+ "m1.xlarge" : { "Arch" : "64" },
114
+ "m2.xlarge" : { "Arch" : "64" },
115
+ "m2.2xlarge" : { "Arch" : "64" },
116
+ "m2.4xlarge" : { "Arch" : "64" },
117
+ "m3.xlarge" : { "Arch" : "64" },
118
+ "m3.2xlarge" : { "Arch" : "64" },
119
+ "c1.medium" : { "Arch" : "64" },
120
+ "c1.xlarge" : { "Arch" : "64" },
121
+ "cc1.4xlarge" : { "Arch" : "64HVM" },
122
+ "cc2.8xlarge" : { "Arch" : "64HVM" },
123
+ "cg1.4xlarge" : { "Arch" : "64HVM" }
124
+ },
125
+
126
+ "AWSRegionArch2AMI" : {
127
+ "us-east-1" : { "32" : "ami-a0cd60c9", "64" : "ami-aecd60c7", "64HVM" : "ami-a8cd60c1" },
128
+ "us-west-2" : { "32" : "ami-46da5576", "64" : "ami-48da5578", "64HVM" : "NOT_YET_SUPPORTED" },
129
+ "us-west-1" : { "32" : "ami-7d4c6938", "64" : "ami-734c6936", "64HVM" : "NOT_YET_SUPPORTED" },
130
+ "eu-west-1" : { "32" : "ami-61555115", "64" : "ami-6d555119", "64HVM" : "ami-67555113" },
131
+ "ap-southeast-1" : { "32" : "ami-220b4a70", "64" : "ami-3c0b4a6e", "64HVM" : "NOT_YET_SUPPORTED" },
132
+ "ap-southeast-2" : { "32" : "ami-b3990e89", "64" : "ami-bd990e87", "64HVM" : "NOT_YET_SUPPORTED" },
133
+ "ap-northeast-1" : { "32" : "ami-2a19aa2b", "64" : "ami-2819aa29", "64HVM" : "NOT_YET_SUPPORTED" },
134
+ "sa-east-1" : { "32" : "ami-f836e8e5", "64" : "ami-fe36e8e3", "64HVM" : "NOT_YET_SUPPORTED" }
135
+ }
136
+ },
137
+
138
+ "Resources" : {
139
+
140
+ "WebServer": {
141
+ "Type": "AWS::EC2::Instance",
142
+ "Metadata" : {
143
+ "AWS::CloudFormation::Init" : {
144
+ "config" : {
145
+ "packages" : {
146
+ "yum" : {
147
+ "httpd" : [],
148
+ "php" : [],
149
+ "php-mysql" : [],
150
+ "php-gd" : [],
151
+ "php-xml" : [],
152
+ "php-mbstring" : [],
153
+ "mysql" : [],
154
+ "mysql-server" : [],
155
+ "mysql-devel" : [],
156
+ "mysql-libs" : []
157
+
158
+ }
159
+ },
160
+
161
+ "sources" : {
162
+ "/var/www/html" : "http://ftp.drupal.org/files/projects/drupal-7.8.tar.gz",
163
+ "/home/ec2-user" : "http://ftp.drupal.org/files/projects/drush-7.x-4.5.tar.gz"
164
+ },
165
+
166
+ "files" : {
167
+ "/tmp/setup.mysql" : {
168
+ "content" : { "Fn::Join" : ["", [
169
+ "CREATE DATABASE ", { "Ref" : "DBName" }, ";\n",
170
+ "CREATE USER '", { "Ref" : "DBUsername" }, "'@'localhost' IDENTIFIED BY '", { "Ref" : "DBPassword" }, "';\n",
171
+ "GRANT ALL ON ", { "Ref" : "DBName" }, ".* TO '", { "Ref" : "DBUsername" }, "'@'localhost';\n",
172
+ "FLUSH PRIVILEGES;\n"
173
+ ]]},
174
+ "mode" : "000644",
175
+ "owner" : "root",
176
+ "group" : "root"
177
+ }
178
+ },
179
+
180
+ "services" : {
181
+ "sysvinit" : {
182
+ "httpd" : { "enabled" : "true", "ensureRunning" : "true" },
183
+ "mysqld" : { "enabled" : "true", "ensureRunning" : "true" },
184
+ "sendmail" : { "enabled" : "false", "ensureRunning" : "false" }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ },
190
+ "Properties": {
191
+ "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
192
+ { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] },
193
+ "InstanceType" : { "Ref" : "InstanceType" },
194
+ "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ],
195
+ "KeyName" : { "Ref" : "KeyName" },
196
+ "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
197
+ "#!/bin/bash -v\n",
198
+ "yum update -y aws-cfn-bootstrap\n",
199
+
200
+
201
+ "# Helper function\n",
202
+ "function error_exit\n",
203
+ "{\n",
204
+ " /opt/aws/bin/cfn-signal -e 0 -r \"$1\" '", { "Ref" : "WaitHandle" }, "'\n",
205
+ " exit 1\n",
206
+ "}\n",
207
+
208
+ "# Install Apache Web Server, MySQL, PHP and Drupal\n",
209
+ "/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServer ",
210
+ " --region ", { "Ref" : "AWS::Region" }, " || error_exit 'Failed to run cfn-init'\n",
211
+
212
+ "# Setup MySQL root password and create a user\n",
213
+ "mysqladmin -u root password '", { "Ref" : "DBRootPassword" }, "' || error_exit 'Failed to initialize root password'\n",
214
+ "mysql -u root --password='", { "Ref" : "DBRootPassword" }, "' < /tmp/setup.mysql || error_exit 'Failed to create database user'\n",
215
+
216
+ "# Make changes to Apache Web Server configuration\n",
217
+ "mv /var/www/html/drupal-7.8/* /var/www/html\n",
218
+ "mv /var/www/html/drupal-7.8/.* /var/www/html\n",
219
+ "rmdir /var/www/html/drupal-7.8\n",
220
+ "sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf\n",
221
+ "service httpd restart\n",
222
+
223
+ "# Create the site in Drupal\n",
224
+ "cd /var/www/html\n",
225
+ "~ec2-user/drush/drush site-install standard --yes",
226
+ " --site-name='", { "Ref" : "SiteName" }, "' --site-mail=", { "Ref" : "SiteEMail" },
227
+ " --account-name=", { "Ref" : "SiteAdmin" }, " --account-pass=", { "Ref" : "SitePassword" },
228
+ " --db-url=mysql://", { "Ref" : "DBUsername" }, ":", { "Ref" : "DBPassword" }, "@localhost/", { "Ref" : "DBName" },
229
+ " --db-prefix=drupal_\n",
230
+ "chown apache:apache sites/default/files\n",
231
+
232
+ "# All is well so signal success\n",
233
+ "/opt/aws/bin/cfn-signal -e 0 -r \"Drupal setup complete\" '", { "Ref" : "WaitHandle" }, "'\n"
234
+
235
+ ]]}}
236
+ }
237
+ },
238
+
239
+ "WaitHandle" : {
240
+ "Type" : "AWS::CloudFormation::WaitConditionHandle"
241
+ },
242
+
243
+ "WaitCondition" : {
244
+ "Type" : "AWS::CloudFormation::WaitCondition",
245
+ "DependsOn" : "WebServer",
246
+ "Properties" : {
247
+ "Handle" : {"Ref" : "WaitHandle"},
248
+ "Timeout" : "300"
249
+ }
250
+ },
251
+
252
+ "WebServerSecurityGroup" : {
253
+ "Type" : "AWS::EC2::SecurityGroup",
254
+ "Properties" : {
255
+ "GroupDescription" : "Enable HTTP access via port 80 and SSH access",
256
+ "SecurityGroupIngress" : [
257
+ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"},
258
+ {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}}
259
+ ]
260
+ }
261
+ }
262
+ },
263
+
264
+ "Outputs" : {
265
+ "WebsiteURL" : {
266
+ "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServer", "PublicDnsName" ]}]] },
267
+ "Description" : "Drupal Website"
268
+ }
269
+ }
270
+ }
@@ -3,6 +3,10 @@ describe Dslh do
3
3
  open(File.expand_path('../Drupal_Multi_AZ.template', __FILE__)) {|f| f.read }
4
4
  end
5
5
 
6
+ let(:drupal_single_instance_template) do
7
+ open(File.expand_path('../Drupal_Single_Instance.template', __FILE__)) {|f| f.read }
8
+ end
9
+
6
10
  it 'should be empty hash' do
7
11
  h = Dslh.eval {}
8
12
  expect(h).to eq({})
@@ -1092,13 +1096,13 @@ end
1092
1096
 
1093
1097
  exclude_key = proc do |k|
1094
1098
  k = k.to_s.gsub('::', '__')
1095
- k !~ /\A[_a-z]\w+\Z/i and k !~ %r|(?:/[:graph:]+)+|
1099
+ k !~ /\A[_a-z]\w+\Z/i and k !~ %r|\A/\S*\Z|
1096
1100
  end
1097
1101
 
1098
1102
  key_conv = proc do |k|
1099
1103
  k = k.to_s
1100
1104
 
1101
- if k =~ %r|(?:/[:graph:]+)+|
1105
+ if k =~ %r|\A/\S*\Z|
1102
1106
  proc do |v, nested|
1103
1107
  if nested
1104
1108
  "_path(#{k.inspect}) #{v}"
@@ -1685,6 +1689,369 @@ Outputs do
1685
1689
  Description "Drupal Website"
1686
1690
  end
1687
1691
  end
1688
- EOS
1692
+ EOS
1693
+ end
1694
+
1695
+ it 'should convert json to dsl with key_conf (use drupal_single_instance_template)' do
1696
+ template = JSON.parse(drupal_single_instance_template)
1697
+
1698
+ exclude_key = proc do |k|
1699
+ k = k.to_s.gsub('::', '__')
1700
+ k !~ /\A[_a-z]\w+\Z/i and k !~ %r|\A/\S*\Z|
1701
+ end
1702
+
1703
+ key_conv = proc do |k|
1704
+ k = k.to_s
1705
+
1706
+ if k =~ %r|\A/\S*\Z|
1707
+ proc do |v, nested|
1708
+ if nested
1709
+ "_path(#{k.inspect}) #{v}"
1710
+ else
1711
+ "_path #{k.inspect}, #{v}"
1712
+ end
1713
+ end
1714
+ else
1715
+ k.gsub('::', '__')
1716
+ end
1717
+ end
1718
+
1719
+ dsl = Dslh.deval(template, :key_conv => key_conv, :exclude_key => exclude_key)
1720
+
1721
+ expect(dsl).to eq(<<-'EOS')
1722
+ AWSTemplateFormatVersion "2010-09-09"
1723
+ Description "AWS CloudFormation Sample Template Drupal_Single_Instance. Drupal is an open source content management platform powering millions of websites and applications. This template installs a singe instance deployment with a local MySQL database for storage. It uses the AWS CloudFormation bootstrap scripts to install packages and files at instance launch time. **WARNING** This template creates an Amazon EC2 instance. You will be billed for the AWS resources used if you create a stack from this template."
1724
+ Parameters do
1725
+ KeyName do
1726
+ Description "Name of an existing EC2 KeyPair to enable SSH access to the instances"
1727
+ Type "String"
1728
+ MinLength "1"
1729
+ MaxLength "255"
1730
+ AllowedPattern "[\\x20-\\x7E]*"
1731
+ ConstraintDescription "can contain only ASCII characters."
1732
+ end
1733
+ InstanceType do
1734
+ Description "WebServer EC2 instance type"
1735
+ Type "String"
1736
+ Default "m1.small"
1737
+ AllowedValues "t1.micro", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.xlarge", "m3.2xlarge", "c1.medium", "c1.xlarge", "cc1.4xlarge", "cc2.8xlarge", "cg1.4xlarge"
1738
+ ConstraintDescription "must be a valid EC2 instance type."
1739
+ end
1740
+ SiteName do
1741
+ Default "My Site"
1742
+ Description "The name of the Drupal Site"
1743
+ Type "String"
1744
+ end
1745
+ SiteEMail do
1746
+ Description "EMail for site adminitrator"
1747
+ Type "String"
1748
+ end
1749
+ SiteAdmin do
1750
+ Description "The Drupal site admin account username"
1751
+ Type "String"
1752
+ MinLength "1"
1753
+ MaxLength "16"
1754
+ AllowedPattern "[a-zA-Z][a-zA-Z0-9]*"
1755
+ ConstraintDescription "must begin with a letter and contain only alphanumeric characters."
1756
+ end
1757
+ SitePassword do
1758
+ NoEcho "true"
1759
+ Description "The Drupal site admin account password"
1760
+ Type "String"
1761
+ MinLength "1"
1762
+ MaxLength "41"
1763
+ AllowedPattern "[a-zA-Z0-9]*"
1764
+ ConstraintDescription "must contain only alphanumeric characters."
1765
+ end
1766
+ DBName do
1767
+ Default "drupaldb"
1768
+ Description "The Drupal database name"
1769
+ Type "String"
1770
+ MinLength "1"
1771
+ MaxLength "64"
1772
+ AllowedPattern "[a-zA-Z][a-zA-Z0-9]*"
1773
+ ConstraintDescription "must begin with a letter and contain only alphanumeric characters."
1774
+ end
1775
+ DBUsername do
1776
+ Default "admin"
1777
+ NoEcho "true"
1778
+ Description "The Drupal database admin account username"
1779
+ Type "String"
1780
+ MinLength "1"
1781
+ MaxLength "16"
1782
+ AllowedPattern "[a-zA-Z][a-zA-Z0-9]*"
1783
+ ConstraintDescription "must begin with a letter and contain only alphanumeric characters."
1784
+ end
1785
+ DBPassword do
1786
+ Default "admin"
1787
+ NoEcho "true"
1788
+ Description "The Drupal database admin account password"
1789
+ Type "String"
1790
+ MinLength "1"
1791
+ MaxLength "41"
1792
+ AllowedPattern "[a-zA-Z0-9]*"
1793
+ ConstraintDescription "must contain only alphanumeric characters."
1794
+ end
1795
+ DBRootPassword do
1796
+ NoEcho "true"
1797
+ Description "Root password for MySQL"
1798
+ Type "String"
1799
+ MinLength "1"
1800
+ MaxLength "41"
1801
+ AllowedPattern "[a-zA-Z0-9]*"
1802
+ ConstraintDescription "must contain only alphanumeric characters."
1803
+ end
1804
+ SSHLocation do
1805
+ Description "The IP address range that can be used to SSH to the EC2 instances"
1806
+ Type "String"
1807
+ MinLength "9"
1808
+ MaxLength "18"
1809
+ Default "0.0.0.0/0"
1810
+ AllowedPattern "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
1811
+ ConstraintDescription "must be a valid IP CIDR range of the form x.x.x.x/x."
1812
+ end
1813
+ end
1814
+ Mappings do
1815
+ AWSInstanceType2Arch(
1816
+ {"t1.micro"=>{"Arch"=>"64"},
1817
+ "m1.small"=>{"Arch"=>"64"},
1818
+ "m1.medium"=>{"Arch"=>"64"},
1819
+ "m1.large"=>{"Arch"=>"64"},
1820
+ "m1.xlarge"=>{"Arch"=>"64"},
1821
+ "m2.xlarge"=>{"Arch"=>"64"},
1822
+ "m2.2xlarge"=>{"Arch"=>"64"},
1823
+ "m2.4xlarge"=>{"Arch"=>"64"},
1824
+ "m3.xlarge"=>{"Arch"=>"64"},
1825
+ "m3.2xlarge"=>{"Arch"=>"64"},
1826
+ "c1.medium"=>{"Arch"=>"64"},
1827
+ "c1.xlarge"=>{"Arch"=>"64"},
1828
+ "cc1.4xlarge"=>{"Arch"=>"64HVM"},
1829
+ "cc2.8xlarge"=>{"Arch"=>"64HVM"},
1830
+ "cg1.4xlarge"=>{"Arch"=>"64HVM"}})
1831
+ AWSRegionArch2AMI(
1832
+ {"us-east-1"=>
1833
+ {"32"=>"ami-a0cd60c9", "64"=>"ami-aecd60c7", "64HVM"=>"ami-a8cd60c1"},
1834
+ "us-west-2"=>
1835
+ {"32"=>"ami-46da5576", "64"=>"ami-48da5578", "64HVM"=>"NOT_YET_SUPPORTED"},
1836
+ "us-west-1"=>
1837
+ {"32"=>"ami-7d4c6938", "64"=>"ami-734c6936", "64HVM"=>"NOT_YET_SUPPORTED"},
1838
+ "eu-west-1"=>
1839
+ {"32"=>"ami-61555115", "64"=>"ami-6d555119", "64HVM"=>"ami-67555113"},
1840
+ "ap-southeast-1"=>
1841
+ {"32"=>"ami-220b4a70", "64"=>"ami-3c0b4a6e", "64HVM"=>"NOT_YET_SUPPORTED"},
1842
+ "ap-southeast-2"=>
1843
+ {"32"=>"ami-b3990e89", "64"=>"ami-bd990e87", "64HVM"=>"NOT_YET_SUPPORTED"},
1844
+ "ap-northeast-1"=>
1845
+ {"32"=>"ami-2a19aa2b", "64"=>"ami-2819aa29", "64HVM"=>"NOT_YET_SUPPORTED"},
1846
+ "sa-east-1"=>
1847
+ {"32"=>"ami-f836e8e5", "64"=>"ami-fe36e8e3", "64HVM"=>"NOT_YET_SUPPORTED"}})
1848
+ end
1849
+ Resources do
1850
+ WebServer do
1851
+ Type "AWS::EC2::Instance"
1852
+ Metadata do
1853
+ AWS__CloudFormation__Init do
1854
+ config do
1855
+ packages do
1856
+ yum(
1857
+ {"httpd"=>[],
1858
+ "php"=>[],
1859
+ "php-mysql"=>[],
1860
+ "php-gd"=>[],
1861
+ "php-xml"=>[],
1862
+ "php-mbstring"=>[],
1863
+ "mysql"=>[],
1864
+ "mysql-server"=>[],
1865
+ "mysql-devel"=>[],
1866
+ "mysql-libs"=>[]})
1867
+ end
1868
+ sources do
1869
+ _path "/var/www/html", "http://ftp.drupal.org/files/projects/drupal-7.8.tar.gz"
1870
+ _path "/home/ec2-user", "http://ftp.drupal.org/files/projects/drush-7.x-4.5.tar.gz"
1871
+ end
1872
+ files do
1873
+ _path("/tmp/setup.mysql") do
1874
+ content do
1875
+ Fn__Join [
1876
+ "",
1877
+ ["CREATE DATABASE ",
1878
+ {"Ref"=>"DBName"},
1879
+ ";\n",
1880
+ "CREATE USER '",
1881
+ {"Ref"=>"DBUsername"},
1882
+ "'@'localhost' IDENTIFIED BY '",
1883
+ {"Ref"=>"DBPassword"},
1884
+ "';\n",
1885
+ "GRANT ALL ON ",
1886
+ {"Ref"=>"DBName"},
1887
+ ".* TO '",
1888
+ {"Ref"=>"DBUsername"},
1889
+ "'@'localhost';\n",
1890
+ "FLUSH PRIVILEGES;\n"]
1891
+ ]
1892
+ end
1893
+ mode "000644"
1894
+ owner "root"
1895
+ group "root"
1896
+ end
1897
+ end
1898
+ services do
1899
+ sysvinit do
1900
+ httpd do
1901
+ enabled "true"
1902
+ ensureRunning "true"
1903
+ end
1904
+ mysqld do
1905
+ enabled "true"
1906
+ ensureRunning "true"
1907
+ end
1908
+ sendmail do
1909
+ enabled "false"
1910
+ ensureRunning "false"
1911
+ end
1912
+ end
1913
+ end
1914
+ end
1915
+ end
1916
+ end
1917
+ Properties do
1918
+ ImageId do
1919
+ Fn__FindInMap [
1920
+ "AWSRegionArch2AMI",
1921
+ _{
1922
+ Ref "AWS::Region"
1923
+ },
1924
+ _{
1925
+ Fn__FindInMap [
1926
+ "AWSInstanceType2Arch",
1927
+ _{
1928
+ Ref "InstanceType"
1929
+ },
1930
+ "Arch"
1931
+ ]
1932
+ }
1933
+ ]
1934
+ end
1935
+ InstanceType do
1936
+ Ref "InstanceType"
1937
+ end
1938
+ SecurityGroups [
1939
+ _{
1940
+ Ref "WebServerSecurityGroup"
1941
+ }
1942
+ ]
1943
+ KeyName do
1944
+ Ref "KeyName"
1945
+ end
1946
+ UserData do
1947
+ Fn__Base64 do
1948
+ Fn__Join [
1949
+ "",
1950
+ ["#!/bin/bash -v\n",
1951
+ "yum update -y aws-cfn-bootstrap\n",
1952
+ "# Helper function\n",
1953
+ "function error_exit\n",
1954
+ "{\n",
1955
+ " /opt/aws/bin/cfn-signal -e 0 -r \"$1\" '",
1956
+ {"Ref"=>"WaitHandle"},
1957
+ "'\n",
1958
+ " exit 1\n",
1959
+ "}\n",
1960
+ "# Install Apache Web Server, MySQL, PHP and Drupal\n",
1961
+ "/opt/aws/bin/cfn-init -s ",
1962
+ {"Ref"=>"AWS::StackId"},
1963
+ " -r WebServer ",
1964
+ " --region ",
1965
+ {"Ref"=>"AWS::Region"},
1966
+ " || error_exit 'Failed to run cfn-init'\n",
1967
+ "# Setup MySQL root password and create a user\n",
1968
+ "mysqladmin -u root password '",
1969
+ {"Ref"=>"DBRootPassword"},
1970
+ "' || error_exit 'Failed to initialize root password'\n",
1971
+ "mysql -u root --password='",
1972
+ {"Ref"=>"DBRootPassword"},
1973
+ "' < /tmp/setup.mysql || error_exit 'Failed to create database user'\n",
1974
+ "# Make changes to Apache Web Server configuration\n",
1975
+ "mv /var/www/html/drupal-7.8/* /var/www/html\n",
1976
+ "mv /var/www/html/drupal-7.8/.* /var/www/html\n",
1977
+ "rmdir /var/www/html/drupal-7.8\n",
1978
+ "sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf\n",
1979
+ "service httpd restart\n",
1980
+ "# Create the site in Drupal\n",
1981
+ "cd /var/www/html\n",
1982
+ "~ec2-user/drush/drush site-install standard --yes",
1983
+ " --site-name='",
1984
+ {"Ref"=>"SiteName"},
1985
+ "' --site-mail=",
1986
+ {"Ref"=>"SiteEMail"},
1987
+ " --account-name=",
1988
+ {"Ref"=>"SiteAdmin"},
1989
+ " --account-pass=",
1990
+ {"Ref"=>"SitePassword"},
1991
+ " --db-url=mysql://",
1992
+ {"Ref"=>"DBUsername"},
1993
+ ":",
1994
+ {"Ref"=>"DBPassword"},
1995
+ "@localhost/",
1996
+ {"Ref"=>"DBName"},
1997
+ " --db-prefix=drupal_\n",
1998
+ "chown apache:apache sites/default/files\n",
1999
+ "# All is well so signal success\n",
2000
+ "/opt/aws/bin/cfn-signal -e 0 -r \"Drupal setup complete\" '",
2001
+ {"Ref"=>"WaitHandle"},
2002
+ "'\n"]
2003
+ ]
2004
+ end
2005
+ end
2006
+ end
2007
+ end
2008
+ WaitHandle do
2009
+ Type "AWS::CloudFormation::WaitConditionHandle"
2010
+ end
2011
+ WaitCondition do
2012
+ Type "AWS::CloudFormation::WaitCondition"
2013
+ DependsOn "WebServer"
2014
+ Properties do
2015
+ Handle do
2016
+ Ref "WaitHandle"
2017
+ end
2018
+ Timeout "300"
2019
+ end
2020
+ end
2021
+ WebServerSecurityGroup do
2022
+ Type "AWS::EC2::SecurityGroup"
2023
+ Properties do
2024
+ GroupDescription "Enable HTTP access via port 80 and SSH access"
2025
+ SecurityGroupIngress [
2026
+ _{
2027
+ IpProtocol "tcp"
2028
+ FromPort "80"
2029
+ ToPort "80"
2030
+ CidrIp "0.0.0.0/0"
2031
+ },
2032
+ _{
2033
+ IpProtocol "tcp"
2034
+ FromPort "22"
2035
+ ToPort "22"
2036
+ CidrIp do
2037
+ Ref "SSHLocation"
2038
+ end
2039
+ }
2040
+ ]
2041
+ end
2042
+ end
2043
+ end
2044
+ Outputs do
2045
+ WebsiteURL do
2046
+ Value do
2047
+ Fn__Join [
2048
+ "",
2049
+ ["http://", {"Fn::GetAtt"=>["WebServer", "PublicDnsName"]}]
2050
+ ]
2051
+ end
2052
+ Description "Drupal Website"
2053
+ end
2054
+ end
2055
+ EOS
1689
2056
  end
1690
2057
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dslh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
@@ -69,6 +69,7 @@ files:
69
69
  - lib/dslh.rb
70
70
  - lib/dslh/version.rb
71
71
  - spec/Drupal_Multi_AZ.template
72
+ - spec/Drupal_Single_Instance.template
72
73
  - spec/dslh_spec.rb
73
74
  - spec/spec_helper.rb
74
75
  homepage: https://github.com/winebarrel/dslh
@@ -97,6 +98,7 @@ specification_version: 4
97
98
  summary: It define Hash as a DSL.
98
99
  test_files:
99
100
  - spec/Drupal_Multi_AZ.template
101
+ - spec/Drupal_Single_Instance.template
100
102
  - spec/dslh_spec.rb
101
103
  - spec/spec_helper.rb
102
104
  has_rdoc: