update comment in the template
[heat-templates.git] / dev / kitchen_sink.template
bloba74f4d7211a5c1da3424b9366f5f50452f24a472
1 heat_template_version: 2013-05-23
3 description: |
4   Test template using all resources supported on the Rackspace Public Cloud
6 parameters:
8   db_pass:
9     type: string
10     hidden: true
11     description: Database access password
12     default: secrete
14   devops_flavor:
15     type: string
16     description: Flavor name for the devops server
17     default: 4 GB Performance
18     constraints:
19     - allowed_values:
20       - 4 GB Performance
21       - 4GB Standard Instance
23   api_flavor_ref:
24     type: string
25     description: API Servers flavor id
26     default: performance1-1
27     constraints:
28     - allowed_values:
29       - performance1-1
30       - "3" # 1GB Standard Instance
32 resources:
34   random_key_name:
35     type: OS::Heat::RandomString
36     properties:
37       length: 8
39   access_key:
40     type: OS::Nova::KeyPair
41     properties:
42       name: { get_resource: random_key_name }
43       save_private_key: true
45   domain_name:
46     type: OS::Heat::RandomString
48   priv_network:
49     type: Rackspace::Cloud::Network
50     properties:
51       label: kitchen_sink
52       cidr: 192.168.0.0/24
53   
54   boot_from_vol_vol:
55     type: OS::Cinder::Volume
56     properties:
57       name: ks-BFV-vol
58       size: 100
59       volume_type: SSD
60       image: CentOS 7 (PVHVM)
61   
62   boot_from_vol_server:
63     type: OS::Nova::Server
64     properties:
65       name: ksink-BFV-server
66       flavor: 2 GB Performance
67       block_device_mapping: [{volume_id: {get_resource: boot_from_vol_vol}, device_name: vda, delete_on_termination: false}]
68   
69 #  neutron_network:
70 #    type: OS::Neutron::Net
71 #    properties:
72 #      name: ksink-neutron-net
73   
74 #  neutron_subnet:
75 #    type: OS::Neutron::Subnet
76 #    properties:
77 #      name: ksink-subnet-1
78 #      network: { get_resource: neutron_network }
79 #      cidr: 192.168.0.0/24
80 #      ip_version: 4
81   
82 #  neutron_port:
83 #    type: OS::Neutron::Port
84 #    properties:
85 #      name: ksink-port-1
86 #      network: { get_resource: neutron_network }
88   gentoo_server:  # Should create as long as there's no user_data
89     type: Rackspace::Cloud::Server
90     properties:
91       flavor: 1 GB Performance
92       image: 26c630fe-ba65-4cd2-ad69-1d808766a54b  # Gentoo 14.4
94   devops_server:
95     type: OS::Nova::Server
96     properties:
97       name: kitchen_sink_ops01
98       metadata:
99         rax-heat: { get_param: "OS::stack_id" }
100       image: 042395fc-728c-4763-86f9-9b0cacb00701 #CentOS 6.5
101       flavor: { get_param: devops_flavor }
102       key_name: { get_resource: access_key }
103       networks:
104       - uuid: "00000000-0000-0000-0000-000000000000"
105       - uuid: "11111111-1111-1111-1111-111111111111"
106       - uuid: { get_resource: priv_network }
108 ################################################################
109 #### THIS IS BROKEN ATM: https://jira.rax.io/browse/HEAT-789 ###
110 ################################################################
111 #  devops_chefsolo_berkshelf:
112 #     type: "OS::Heat::ChefSolo"
113 #     depends_on: devops_chefsolo_kitchen_centos
114 #     properties:
115 #         private_key: {get_attr: [access_key, private_key]}
116 #         host: {get_attr: [devops_server, accessIPv4]}
117 #         chef_version: "11.12.0"
118 #         Berksfile: |
119 #            site :opscode
120 #            cookbook 'apt'
122 #         Berksfile.lock: |
123 #            {
124 #              "sources": {
125 #                "apt": {
126 #                  "locked_version": "2.3.8"
127 #                }
128 #              }
129 #            }
131 #         node:
132 #            hello: "hi"
134   devops_chefsolo_kitchen_centos:
135     type: "OS::Heat::ChefSolo"
136     properties:
137        private_key: {get_attr: [access_key, private_key]}
138        host: {get_attr: [devops_server, accessIPv4]}
139        kitchen: "https://github.com/heat-ci/heat-templates.git"
140        node:
141          hello: "hi"
143   devops_volume:
144     type: OS::Cinder::Volume
145     properties:
146       name: kitchen_sink_devops_vol
147       metadata:
148         rax-heat: { get_param: "OS::stack_id" }
149       size: 100
150       description: Created from the kitchen_sink test Heat template
152   attach_devops_vol:
153     type: OS::Cinder::VolumeAttachment
154     properties:
155       instance_uuid: { get_resource: devops_server }
156       volume_id: { get_resource: devops_volume }
158   api_servers:
159     type: Rackspace::AutoScale::Group
160     properties:
161       groupConfiguration:
162         name: kitchen_sink_api_asgroup
163         metadata:
164           rax-heat: { get_param: "OS::stack_id" }
165         maxEntities: 8
166         minEntities: 2
167         cooldown: 120
168       launchConfiguration:
169         type: launch_server
170         args:
171           loadBalancers:
172           - loadBalancerId: { get_resource: api_loadbalancer }
173             port: 80
174           server:
175             name: kitchen_sink_api
176             flavorRef: { get_param: api_flavor_ref }
177             imageRef: ffd597d6-2cc4-4b43-b8f4-b1006715b84e
178             key_name: { get_resource: access_key }
179             personality:
180                 /tmp/testfile: "testfile"
181             networks:
182             - uuid: "11111111-1111-1111-1111-111111111111"
183             - uuid: { get_resource: priv_network }
185   api_servers_no_personality:
186     type: Rackspace::AutoScale::Group
187     properties:
188       groupConfiguration:
189         name: kitchen_sink_api_asgroup_no_personality
190         metadata:
191           rax-heat: { get_param: "OS::stack_id" }
192         maxEntities: 8
193         minEntities: 2
194         cooldown: 120
195       launchConfiguration:
196         type: launch_server
197         args:
198           loadBalancers:
199           - loadBalancerId: { get_resource: api_loadbalancer }
200             port: 80
201           server:
202             name: kitchen_sink_api
203             flavorRef: { get_param: api_flavor_ref }
204             imageRef: df27d481-63a5-40ca-8920-3d132ed643d9
205             key_name: { get_resource: access_key }
206             networks:
207             - uuid: "11111111-1111-1111-1111-111111111111"
208             - uuid: { get_resource: priv_network }
210   api_scale_up_policy:
211     type: Rackspace::AutoScale::ScalingPolicy
212     properties:
213       group: { get_resource: api_servers }
214       name: Scale up api servers
215       change: 1
216       cooldown: 600
217       type: webhook
219   api_scale_up_webhook:
220     type: Rackspace::AutoScale::WebHook
221     properties:
222       name: triggerApiScaleUp
223       metadata:
224         rax-heat: { get_param: "OS::stack_id" }
225       policy: { get_resource: api_scale_up_policy }
227   api_scale_down_policy:
228     type: Rackspace::AutoScale::ScalingPolicy
229     properties:
230       group: { get_resource: api_servers }
231       name: Scale down api servers
232       change: -1
233       cooldown: 600
234       type: webhook
236   api_scale_down_webhook:
237     type: Rackspace::AutoScale::WebHook
238     properties:
239       name: triggerApiScaleUp
240       metadata:
241         rax-heat: { get_param: "OS::stack_id" }
242       policy: { get_resource: api_scale_down_policy }
244   api_loadbalancer:
245     type: Rackspace::Cloud::LoadBalancer
246     properties:
247       name: kitchen_sink_api_lb
248       metadata:
249         rax-heat: { get_param: "OS::stack_id" }
250       protocol: HTTPS
251       port: 80
252       algorithm: ROUND_ROBIN
253       nodes: []
254       virtualIps:
255       - type: PUBLIC
256         ipVersion: IPV4
258   lb_shared_vip:
259     type: Rackspace::Cloud::LoadBalancer
260     properties:
261       name: ksink_shared_vip_https
262       metadata:
263         rax-heat: { get_param: "OS::stack_id" }
264       protocol: HTTPS
265       port: 443
266       algorithm: ROUND_ROBIN
267       nodes: []
268       virtualIps:
269       - id: { get_attr: [ api_loadbalancer, virtualIps, 0, id ] }
271   http_redir_lb:
272     type: Rackspace::Cloud::LoadBalancer
273     properties:
274       name:
275         str_replace:
276           template: "stack-redir-lb"
277           params:
278             stack: { get_param: "OS::stack_name" }
279       metadata:
280         rax-heat: { get_param: "OS::stack_id" }
281       protocol: HTTPS
282       port: 443
283       httpsRedirect: true
284       algorithm: ROUND_ROBIN
285       nodes: []
286       virtualIps:
287       - type: PUBLIC
288         ipVersion: IPV4
289   
290   wait_on_server:
291     type: OS::Heat::SwiftSignal
292     properties:
293       handle: {get_resource: wait_handle}
294       count: 5
295       timeout: 600
297   wait_handle:
298     type: OS::Heat::SwiftSignalHandle
300   instance1:
301     type: OS::Nova::Server
302     properties:
303       image: 4b14a92e-84c8-4770-9245-91ecb8501cc2  # CentOS
304       flavor: 1 GB Performance
305       key_name: { get_resource: access_key }
306       metadata:
307         rax-heat: { get_param: "OS::stack_id" }
308         heat-stack-name: { get_param: "OS::stack_name" }
309       config_drive: True
310 #      networks:
311 #      - uuid: "11111111-1111-1111-1111-111111111111"
312 #      - uuid: { get_resource: neutron_network } 
313       user_data_format: RAW
314       user_data:
315         str_replace:
316           template: |
317             #!/bin/bash -x
318             # Below are some examples of the various ways signals
319             # can be sent to the Handle resource
321             # Simple success signal
322             wc_notify --data-binary '{"status": "SUCCESS"}'
324             # Or you optionally can specify any of the additional fields
325             wc_notify --data-binary '{"status": "SUCCESS", "reason": "signal2"}'
326             wc_notify --data-binary '{"status": "SUCCESS", "reason": "signal3", "data": "data3"}'
327             wc_notify --data-binary '{"status": "SUCCESS", "reason": "signal4", "data": "data4"}'
329             # If you require control of the ID, you can pass it.
330             # The ID should be unique, unless you intend for duplicate
331             # signals to overrite each other.  The following two calls
332             # do the exact same thing, and will be treated as one signal
333             # (You can prove this by changing count above to 7)
334             wc_notify --data-binary '{"status": "SUCCESS", "id": "5"}'
335             wc_notify --data-binary '{"status": "SUCCESS", "id": "5"}'
337             # Example of sending a failure signal, optionally
338             # reason, id, and data can be specified as above
339             # wc_notify --data-binary '{"status": "FAILURE"}'
341           params:
342             wc_notify: { get_attr: ['wait_handle', 'curl_cli'] }
344   service_domain:
345     type: Rackspace::Cloud::DNS
346     depends_on: wait_on_server
347     properties:
348       name:
349         str_replace:
350           template: "a%domain%.com"
351           params:
352             "%domain%": { get_resource: domain_name }
353       emailAddress:
354         str_replace:
355           template: "admin@{domain}"
356           params:
357             "{domain}":
358               str_replace:
359                 template: "a%domain%.com"
360                 params:
361                   "%domain%": { get_resource: domain_name }
362       records:
363       - name:
364           str_replace:
365             template: "a%domain%.com"
366             params:
367               "%domain%": { get_resource: domain_name }
368         type: A
369         data: { get_attr: [api_loadbalancer, PublicIp] }
371   engine_nodes:
372     type: OS::Heat::ResourceGroup
373     depends_on: service_db
374     properties:
375       count: 2
376       resource_def:
377         type: Rackspace::Cloud::Server
378         properties:
379           name: "kitchen_sink_engine_%index%"
380           image: 6f29d6a6-9972-4ae0-aa80-040fa2d6a9cf # Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
381           flavor: { get_param: devops_flavor }
382           key_name: { get_resource: access_key }
383           networks:
384           - uuid: { get_resource: priv_network }
385           - uuid: "00000000-0000-0000-0000-000000000000"
386           - uuid: "11111111-1111-1111-1111-111111111111"
387           user_data: |
388             #!/bin/bash -x
389             echo "hello world" > /root/hello-world.txt
391   rs_windows_server:
392     type: "Rackspace::Cloud::WinServer"
393     properties:
394       name: wordpress_windows_server
395       flavor: 4GB Standard Instance
396       image: Windows Server 2012
397       user_data: |
398         $source = "http://download.microsoft.com/download/7/0/4/704CEB4C-9F42-4962-A2B0-5C84B0682C7A/WebPlatformInstaller_amd64_en-US.msi"
399         $destination = "webpi.msi"
400         $wc = New-Object System.Net.WebClient
401         $wc.DownloadFile($source, $destination)
403   service_db:
404     type: OS::Trove::Instance
405     properties:
406       name: kitchen_sink_db
407       flavor: 1GB Instance
408       size: 10
409       databases:
410       - name: kitchen_sink_data
411       users:
412       - name: kitchen_sink
413         password: { get_param: db_pass }
414         databases: [ kitchen_sink_data ]
416   # This needs an image with heat_cfntools on it to use Metadata; basic
417   # test here to make sure we can actually pop the server and do simple
418   # user data and a signal
419   aws_server:
420     type: AWS::EC2::Instance
421     properties:
422       ImageId: 753a7703-4960-488b-aab4-a3cdd4b276dc # Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
423       InstanceType: { get_param: devops_flavor }
424       KeyName: { get_resource: access_key }
425       UserData:
426         str_replace:
427           template: |
428             #!/bin/bash
429             apt-get update
430             apt-get -y install curl
431             sleep 2
432             curl -i -X PUT --data-binary '{"status": "SUCCESS", "reason": "AWS Signal"}' "wc_notify"
433           params:
434             wc_notify: { get_resource: aws_handle }
435   
436   aws_handle:
437     type: AWS::CloudFormation::WaitConditionHandle
438   
439   aws_wait_condition:
440     type: AWS::CloudFormation::WaitCondition
441     properties:
442       Handle: { get_resource: aws_handle }
443       Timeout: 600
445   object_store:
446     type: OS::Swift::Container
447     properties:
448       name: { get_resource: random_key_name }
450   ElasticLoadBalancer:
451         type: AWS::ElasticLoadBalancing::LoadBalancer
452         properties:
453             AvailabilityZones: []
454             Instances:
455             - "192.168.6.100"
456             - "192.168.6.101"
457             Listeners: [{
458                 LoadBalancerPort: 8945,
459                 InstancePort: 80,
460                 Protocol: "HTTP"
461             }]
462             HealthCheck:
463                 Target: "HTTP:80/"
464                 HealthyThreshold: 3
465                 UnhealthyThreshold: 10
466                 Interval: 10
467                 Timeout: 60
469   provider_resource:
470     type: https://raw.githubusercontent.com/heat-ci/heat-templates/master/dev/provider_resource.template
471     properties:
472       flavor: { get_param: devops_flavor }
473       image: 753a7703-4960-488b-aab4-a3cdd4b276dc # Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
474       key_name: { get_resource: access_key }
476 outputs:
478   "Private Network ID":
479     value: { get_resource: priv_network }
480     description: Private Network ID
481   
482   "Neutron Network":
483     value: { get_resource: neutron_network }
484   
485   "Wait Condition data":
486      value: { get_attr: [ wait_on_server, data ] }
488   "Random String":
489     value: { get_attr: [ random_key_name, value ] }
490     description: Random String
492   "Swift Container ID":
493     value: { get_resource: object_store }
494     description: Swift Container ID
496   "Dev Ops Server ID":
497     value: { get_resource: devops_server }
498     description: Dev Ops Server ID
500   "Dev Ops Volume ID":
501     value: { get_resource: devops_volume }
502     description: Dev Ops Volume ID
504   "API servers auto scale group ID":
505     value: { get_resource: api_servers }
506     description: API servers auto scale group ID
508   "API servers auto scale group ID":
509     value: { get_resource: api_servers_no_personality }
510     description: API servers auto scale group ID
512   "Scale UP API servers webhook":
513     value: { get_attr: [ api_scale_up_webhook, executeUrl ] }
514     description: Scale UP API servers webhook
516   "Scale DOWN API servers webhook":
517     value: { get_attr: [ api_scale_down_webhook, executeUrl ] }
518     description: Scale DOWN API servers webhook
520   "Load Balancer ID":
521     value: { get_resource: api_loadbalancer }
522     description: Load Balancer ID
524   "Load Balancer IP":
525     value: { get_attr: [ api_loadbalancer, PublicIp ] }
526     description: Load Balancer IP
528   "DNS Domain ID":
529     value: { get_resource: service_domain }
530     description: DNS Domain ID
532   "Engine Node IDs":
533     value: { get_attr: [ engine_nodes, refs ] }
534     description: Engine Node IDs
536   "DB ID":
537     value: { get_resource: service_db }
538     description: Database instance ID
540   "Access Private Key":
541     value: { get_attr: [ access_key, private_key ] }
542     description: SSH access private key
544   "AWS Server ID":
545     value: { get_resource: aws_server }
546     description: ID of the AWS::EC2::Instance resource
548   "Windows Server IP":
549     value: { get_attr: [ rs_windows_server, accessIPv4 ] }
550     description: Windows Server IP