Difference between revisions of "Heat Mistral resources usage examples"
Prazumovsky (talk | contribs) |
Prazumovsky (talk | contribs) |
||
Line 1: | Line 1: | ||
− | == | + | == Creating resources using Heat template and check that they are available in Mistral service. == |
− | === | + | This case means creating stack with one Mistral Workflow resource, which allows to create nova server. After creating stack workflow can be executed. Workflow execution in Heat means sending signal to workflow resource with, perhaps, some data. This case checks workflow execution with and without data. |
− | + | ||
+ | === Create Mistral workflow resource using Heat OS::Mistral::Workflow === | ||
heat_template_version: 2013-05-23 | heat_template_version: 2013-05-23 | ||
Line 50: | Line 51: | ||
value: { get_attr: [create_vm, data] } | value: { get_attr: [create_vm, data] } | ||
− | === | + | === Create stack === |
heat stack-create test -f template.yaml -P image=31d8eeaf-686e-4e95-bb27-765014b9f20b | heat stack-create test -f template.yaml -P image=31d8eeaf-686e-4e95-bb27-765014b9f20b | ||
Line 60: | Line 61: | ||
|} | |} | ||
− | === | + | === Execute workflow using command heat resource-signal === |
heat resource-signal test create_vm | heat resource-signal test create_vm | ||
Line 78: | Line 79: | ||
|} | |} | ||
− | === | + | === Execute workflow using resource-signal with non-default workflow input === |
heat resource-signal test create_vm -D '{"input": {"image": "6e8ee0ce-1a53-4dc7-a97e-6332badbb3fa"}}' | heat resource-signal test create_vm -D '{"input": {"image": "6e8ee0ce-1a53-4dc7-a97e-6332badbb3fa"}}' | ||
mistral execution-list | mistral execution-list | ||
Line 90: | Line 91: | ||
|} | |} | ||
− | === | + | === Check stack outputs === |
heat stack-show test | heat stack-show test | ||
Line 144: | Line 145: | ||
− | == | + | == Using Ceilometer Alarm with Mistral workflow in Heat == |
+ | In this case stack creates with Mistral workflow, which allows to create nova server, and Ceilometer alarm, which send signal to execute workflow. After stack creation alarm get state 'alarm' and sends signal to workflow resource. It executed and creates nova server. | ||
− | === | + | === Create Heat template (template.yaml) which uses Mistral workflow and Ceilometer alarm resources === |
heat_template_version: 2013-05-23 | heat_template_version: 2013-05-23 | ||
resources: | resources: | ||
Line 171: | Line 173: | ||
comparison_operator: lt | comparison_operator: lt | ||
− | === | + | === Create Heat stack using template template.yaml === |
heat stack-create test -f heat-templates/mistral-and-ceilometer.yaml | heat stack-create test -f heat-templates/mistral-and-ceilometer.yaml | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 198: | Line 200: | ||
|} | |} | ||
− | === | + | === Wait until Ceilometer alarm get state 'alarm' === |
ceilometer alarm-list | ceilometer alarm-list | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 214: | Line 216: | ||
|} | |} | ||
− | === | + | === Check execution output (it must equals 'alarm!') === |
mistral execution-get-output 85cff77d-3da5-423b-a4ca-fb8be4a9ce2f | mistral execution-get-output 85cff77d-3da5-423b-a4ca-fb8be4a9ce2f | ||
... | ... | ||
Line 224: | Line 226: | ||
− | == | + | == Testing autoscaling using Mistral resources == |
− | === | + | === Create template heat_autoscaling_nova.yaml with Mistral resources, Ceilometer alarms and Heat autoscaling group === |
heat_template_version: 2014-10-16 | heat_template_version: 2014-10-16 | ||
Line 355: | Line 357: | ||
value: {'Fn::Select': ['0', {get_attr: [my_asg, outputs_list, ip]}]} | value: {'Fn::Select': ['0', {get_attr: [my_asg, outputs_list, ip]}]} | ||
− | === | + | === Create template server_with_ip.yaml for nested stack === |
heat_template_version: 2013-05-23 | heat_template_version: 2013-05-23 | ||
parameters: | parameters: | ||
Line 388: | Line 390: | ||
value: {get_resource: server} | value: {get_resource: server} | ||
− | === | + | === Create stack === |
heat stack-create test-asg -f heat_autoscaling_nova.yaml | heat stack-create test-asg -f heat_autoscaling_nova.yaml | ||
− | === | + | === Check that resources were created === |
heat stack-list | heat stack-list | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 438: | Line 440: | ||
|} | |} | ||
− | === | + | === Wait for 10:50 (next execution time of trigger_load_cpu) and check again === |
ceilometer alarm-list | ceilometer alarm-list | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 458: | Line 460: | ||
|} | |} | ||
− | === | + | === Wait for 11:00 (next execution time of trigger_release_cpu) === |
ceilometer alarm-list | ceilometer alarm-list | ||
{| class="wikitable" | {| class="wikitable" |
Revision as of 10:36, 26 February 2015
Contents
- 1 Creating resources using Heat template and check that they are available in Mistral service.
- 2 Using Ceilometer Alarm with Mistral workflow in Heat
- 3 Testing autoscaling using Mistral resources
- 3.1 Create template heat_autoscaling_nova.yaml with Mistral resources, Ceilometer alarms and Heat autoscaling group
- 3.2 Create template server_with_ip.yaml for nested stack
- 3.3 Create stack
- 3.4 Check that resources were created
- 3.5 Wait for 10:50 (next execution time of trigger_load_cpu) and check again
- 3.6 Wait for 11:00 (next execution time of trigger_release_cpu)
Creating resources using Heat template and check that they are available in Mistral service.
This case means creating stack with one Mistral Workflow resource, which allows to create nova server. After creating stack workflow can be executed. Workflow execution in Heat means sending signal to workflow resource with, perhaps, some data. This case checks workflow execution with and without data.
Create Mistral workflow resource using Heat OS::Mistral::Workflow
heat_template_version: 2013-05-23 parameters: image: type: string flavor: type: string default: 2 name: type: string default: mistral-test resources: create_vm: type: OS::Mistral::Workflow properties: type: direct input: name: { get_param: name } image: { get_param: image } flavor: { get_param: flavor } output: vm_id: <% $.vm_id %> tasks: - name: create_server action: nova.servers_create name=<% $.name %> image=<% $.image %> flavor=<% $.flavor %> publish: vm_id: <% $.create_server.id %> on_success: - check_server_exists - name: check_server_exists action: nova.servers_get server=<% $.vm_id %> publish: server_exists: True on_success: - wait_instance - name: wait_instance action: nova.servers_find id=<% $.vm_id %> status='ACTIVE' policies: retry: delay: 5 count: 15 outputs: executions: value: { get_attr: [create_vm, executions] } data: value: { get_attr: [create_vm, data] }
Create stack
heat stack-create test -f template.yaml -P image=31d8eeaf-686e-4e95-bb27-765014b9f20b
id | stack_name | stack_status | creation_time |
---|---|---|---|
45fef0d8-be8f-4d67-a105-aff2707f5ced | test | CREATE_COMPLETE | 2015-02-16T12:58:52Z |
Execute workflow using command heat resource-signal
heat resource-signal test create_vm mistral execution-list
ID | Workflow | State | Created at | Updated at |
---|---|---|---|---|
2cc27206-ee42-44ca-bf30-1907f90709e4 | test-create_vm-6mk5u42i4dqa | SUCCESS | 2015-02-16 13:01:37 | 2015-02-16 13:02:01 |
nova list
ID | Name | Status | Task State | Power State | Networks |
---|---|---|---|---|---|
853d9117-d4e1-4454-a066-ec3dd5863193 | mistral-test | ACTIVE | - | Running | private=10.0.0.39 |
Execute workflow using resource-signal with non-default workflow input
heat resource-signal test create_vm -D '{"input": {"image": "6e8ee0ce-1a53-4dc7-a97e-6332badbb3fa"}}' mistral execution-list
ID | Workflow | State | Created at | Updated at |
---|---|---|---|---|
2cc27206-ee42-44ca-bf30-1907f90709e4 | test-create_vm-6mk5u42i4dqa | SUCCESS | 2015-02-16 13:01:37 | 2015-02-16 13:02:01 |
f67c611c-adf7-4ad6-b5ab-27cc5fe79c34 | test-create_vm-6mk5u42i4dqa | SUCCESS | 2015-02-16 13:08:23 | 2015-02-16 13:08:45 |
Check stack outputs
heat stack-show test
| | { | | "output_value": { | | "input": { | | "image": "31d8eeaf-686e-4e95-bb27-765014b9f20b", | | "name": "mistral-test", | | "flavor": 2 | | }, | | "name": "test-create_vm-6mk5u42i4dqa" | | }, | | "description": "No description given", | | "output_key": "data" | | }, | | { | | "output_value": [ | | { | | "workflow_name": "test-create_vm-6mk5u42i4dqa", | | "created_at": "2015-02-16 13:08:23", | | "updated_at": "2015-02-16 13:08:45", | | "state": "SUCCESS", | | "input": { | | "image": "6e8ee0ce-1a53-4dc7-a97e-6332badbb3fa", | | "name": "mistral-test", | | "flavor": 2 | | }, | | "output": { | | "vm_id": "d7f33c8e-6855-4d17-a39b-325323f6eaee" | | }, | | "id": "f67c611c-adf7-4ad6-b5ab-27cc5fe79c34" | | }, | | { | | "workflow_name": "test-create_vm-6mk5u42i4dqa", | | "created_at": "2015-02-16 13:01:37", | | "updated_at": "2015-02-16 13:02:01", | | "state": "SUCCESS", | | "input": { | | "image": "31d8eeaf-686e-4e95-bb27-765014b9f20b", | | "name": "mistral-test", | | "flavor": 2 | | }, | | "output": { | | "vm_id": "853d9117-d4e1-4454-a066-ec3dd5863193" | | }, | | "id": "2cc27206-ee42-44ca-bf30-1907f90709e4" | | } | | ], | | "description": "No description given", | | "output_key": "executions" | | } | | ]
Using Ceilometer Alarm with Mistral workflow in Heat
In this case stack creates with Mistral workflow, which allows to create nova server, and Ceilometer alarm, which send signal to execute workflow. After stack creation alarm get state 'alarm' and sends signal to workflow resource. It executed and creates nova server.
Create Heat template (template.yaml) which uses Mistral workflow and Ceilometer alarm resources
heat_template_version: 2013-05-23 resources: workflow: type: OS::Mistral::Workflow properties: type: direct tasks: - name: alarm action: std.echo output='alarm!' publish: state: 'alarm!' alarm: type: OS::Ceilometer::Alarm properties: meter_name: instance statistic: count period: 60 evaluation_periods: 1 threshold: 100 alarm_actions: - {get_attr: [workflow, alarm_url] } comparison_operator: lt
Create Heat stack using template template.yaml
heat stack-create test -f heat-templates/mistral-and-ceilometer.yaml
id | stack_name | stack_status | creation_time |
---|---|---|---|
7f59798f-212a-4dd3-b3c8-a85a23cb3101 | test | CREATE_IN_PROGRESS | 2015-02-17T07:23:42Z |
mistral workflow-list
Name | Tags | Input | Created at | Updated at |
---|---|---|---|---|
std.create_instance | <none> | name, image_id, flavor_id... | 2015-02-05 14:35:25 | None |
std.delete_instance | <none> | instance_id | 2015-02-05 14:35:25 | None |
test-workflow-7y5jqbwjksy2 | <none> | None | 2015-02-17 07:23:42 | None |
ceilometer alarm-list
Alarm ID | Name | State | Enabled | Continuous | Alarm condition | Time constraints |
---|---|---|---|---|---|---|
14016498-00c1-4e12-8076-1c4f14f02a67 | test-alarm-v7we7aapuvsn | insufficient data | True | True | instance < 100.0 during 1 x 60s | None |
Wait until Ceilometer alarm get state 'alarm'
ceilometer alarm-list
Alarm ID | Name | State | Enabled | Continuous | Alarm condition | Time constraints |
---|---|---|---|---|---|---|
14016498-00c1-4e12-8076-1c4f14f02a67 | test-alarm-v7we7aapuvsn | alarm | True | True | instance < 100.0 during 1 x 60s | None |
mistral execution-list
ID | Workflow | State | Created at | Updated at |
---|---|---|---|---|
85cff77d-3da5-423b-a4ca-fb8be4a9ce2f | test-workflow-7y5jqbwjksy2 | SUCCESS | 2015-02-17 07:31:35 | 2015-02-17 07:31:35 |
Check execution output (it must equals 'alarm!')
mistral execution-get-output 85cff77d-3da5-423b-a4ca-fb8be4a9ce2f ... "state": "alarm!", "alarm": { "state": "alarm!" }, ...
Testing autoscaling using Mistral resources
Create template heat_autoscaling_nova.yaml with Mistral resources, Ceilometer alarms and Heat autoscaling group
heat_template_version: 2014-10-16 parameters: InstanceType: type: string default: m1.heat ImageId: type: string default: cirros-0.3.2-x86_64-uec User: type: string default: cirros Password: type: string default: 'cubswin:)' Pattern_release: type: string default: "0,20,40 * * * *" description: Time to execute workflow wf_release_cpu Pattern_load: type: string default: "10,30,50 * * * *" description: Time to execute workflow wf_load_cpu resources: my_asg: type: OS::Heat::AutoScalingGroup properties: resource: type: server_with_ip.yaml properties: image: { get_param: ImageId } flavor: { get_param: InstanceType } security_group: {get_resource: security_group} metadata: {"metering.stack": {get_param: "OS::stack_id"}} min_size: 1 max_size: 2 scale_up_policy: type: OS::Heat::ScalingPolicy properties: adjustment_type: change_in_capacity auto_scaling_group_id: {get_resource: my_asg} cooldown: 60 scaling_adjustment: 1 scale_down_policy: type: OS::Heat::ScalingPolicy properties: adjustment_type: change_in_capacity auto_scaling_group_id: {get_resource: my_asg} cooldown: 60 scaling_adjustment: '-1' cpu_alarm_high: type: OS::Ceilometer::Alarm properties: description: Scale-up if the average CPU > 50% for 1 minute meter_name: cpu_util statistic: avg period: 60 evaluation_periods: 1 threshold: 50 alarm_actions: - {get_attr: [scale_up_policy, alarm_url]} matching_metadata: {'metadata.user_metadata.stack': {get_param: "OS::stack_id"}} comparison_operator: gt cpu_alarm_low: type: OS::Ceilometer::Alarm properties: description: Scale-down if the average CPU < 15% for 1 minutes meter_name: cpu_util statistic: avg period: 60 evaluation_periods: 1 threshold: 15 alarm_actions: - {get_attr: [scale_down_policy, alarm_url]} matching_metadata: {'metadata.user_metadata.stack': {get_param: "OS::stack_id"}} comparison_operator: lt security_group: type: AWS::EC2::SecurityGroup properties: GroupDescription: 'Enable SSH access' SecurityGroupIngress: - IpProtocol: 'tcp' FromPort: '22' ToPort : '22' CidrIp : '0.0.0.0/0' wf_load_cpu: type: OS::Mistral::Workflow properties: type: direct tasks: - name: get_output action: heat.stacks_get stack_id=<% $.stack_id %> publish: vm_ip: <% $.get_output._info.outputs[0].output_value %> on_success: - run_ssh - name: run_ssh action: std.ssh cmd='cat /dev/urandom | gzip -9 > /dev/null &' host=<% $.vm_ip %> username=<% $.user %> password=<% $.password %> input: {'user': {get_param: User}, 'password': {get_param: Password}, 'stack_id': {get_param: "OS::stack_id"}} wf_release_cpu: type: OS::Mistral::Workflow properties: type: direct tasks: - name: get_output action: heat.stacks_get stack_id=<% $.stack_id %> publish: vm_ip: <% $.get_output._info.outputs[0].output_value %> on_success: - run_ssh - name: run_ssh action: std.ssh cmd="kill -9 $(ps aux | grep 'cat /dev/urandom' | awk '{print $1}')" host=<% $.vm_ip %> username=<% $.user %> password=<% $.password %> input: {'user': {get_param: User}, 'password': {get_param: Password}, 'stack_id': {get_param: "OS::stack_id"}} trigger_load_cpu: type: OS::Mistral::CronTrigger properties: pattern: {get_param: Pattern_load} workflow: {get_attr: [wf_load_cpu, data]} trigger_release_cpu: type: OS::Mistral::CronTrigger properties: pattern: {get_param: Pattern_release} workflow: {get_attr: [wf_release_cpu, data]} outputs: ip: value: {'Fn::Select': ['0', {get_attr: [my_asg, outputs_list, ip]}]}
Create template server_with_ip.yaml for nested stack
heat_template_version: 2013-05-23 parameters: image: type: string flavor: type: string security_group: type: string metadata: type: json resources: server: type: OS::Nova::Server properties: flavor: {get_param: flavor} image: {get_param: image} metadata: {get_param: metadata} security_groups: - get_param: security_group floating_ip: type: OS::Nova::FloatingIP floating_ip_association: type: OS::Nova::FloatingIPAssociation properties: floating_ip: {get_resource: floating_ip} server_id: {get_resource: server} outputs: ip: value: {get_attr: [floating_ip, ip]} server_id: value: {get_resource: server}
Create stack
heat stack-create test-asg -f heat_autoscaling_nova.yaml
Check that resources were created
heat stack-list
id | stack_name | stack_status | creation_time |
---|---|---|---|
8e1b54a1-eefe-43e1-a316-7397e904e328 | test-asg | CREATE_COMPLETE | 2015-02-10T15:45:29Z |
nova list
ID | Name | Status | Task State | Power State | Networks |
---|---|---|---|---|---|
b2e9edcd-da08-4e02-92b4-79c6f1c87203 | te-fpjq-mgcxiz3lglm4-jza3vpraqlrs-server-y7jdd3voh4no | ACTIVE | - | Running | private=10.0.0.2, 172.24.4.1 |
ceilometer alarm-list
Alarm ID | Name | State | Enabled | Continuous | Alarm condition | Time constraints |
---|---|---|---|---|---|---|
2f338088-d74c-41b6-baf1-185ad3fbe2cc | test-asg-cpu_alarm_high-rh5l5jerjhs6 | ok | True | True | cpu_util > 50.0 during 1 x 60s | None |
5053d1c6-66f0-4a4a-a52a-24d3e8881c4d | test-asg-cpu_alarm_low-n6rvsykaaiba | ok | True | True | cpu_util < 15.0 during 1 x 60s | None |
mistral workflow-list
Name | Tags | Input | Created at | Updated at |
---|---|---|---|---|
std.create_instance | <none> | name, image_id, flavor_id... | 2015-02-05 14:35:25 | None |
std.delete_instance | <none> | instance_id | 2015-02-05 14:35:25 | None |
test-asg.wf_load_cpu.load_vm | <none> | vm_ip, user, password | 2015-02-10 15:45:53 | None |
test-asg.wf_release_cpu.release_vm | <none> | vm_ip, user, password | 2015-02-10 15:45:51 | None |
mistral cron-trigger-list
Name | Pattern | Workflow | Next execution time | Created at | Updated at |
---|---|---|---|---|---|
test-asg-trigger_load_cpu-isepguoldk6y | 10,30,50 * * * * | test-asg.wf_load_cpu.load_vm | 2015-02-10 10:50:00 | 2015-02-10 15:45:59 | None |
test-asg-trigger_release_cpu-nvcj3ycphg4g | 0,20,40 * * * * | test-asg.wf_release_cpu.release_vm | 2015-02-10 11:00:00 | 2015-02-10 15:45:56 | None |
Wait for 10:50 (next execution time of trigger_load_cpu) and check again
ceilometer alarm-list
Alarm ID | Name | State | Enabled | Continuous | Alarm condition | Time constraints |
---|---|---|---|---|---|---|
2f338088-d74c-41b6-baf1-185ad3fbe2cc | test-asg-cpu_alarm_high-rh5l5jerjhs6 | alarm | True | True | cpu_util > 50.0 during 1 x 60s | None |
5053d1c6-66f0-4a4a-a52a-24d3e8881c4d | test-asg-cpu_alarm_low-n6rvsykaaiba | ok | True | True | cpu_util < 15.0 during 1 x 60s | None |
nova list
ID | Name | Status | Task State | Power State | Networks |
---|---|---|---|---|---|
b2e9edcd-da08-4e02-92b4-79c6f1c87203 | te-fpjq-mgcxiz3lglm4-jza3vpraqlrs-server-y7jdd3voh4no | ACTIVE | - | Running | private=10.0.0.2, 172.24.4.1 |
8ffbd4ac-435a-4d9d-80cc-23940302fadd | te-fpjq-oj6r53u24m4g-kdiexra2fs5b-server-mbhtpfvi3nys | ACTIVE | - | Running | private=10.0.0.3, 172.24.4.2 |
Wait for 11:00 (next execution time of trigger_release_cpu)
ceilometer alarm-list
Alarm ID | Name | State | Enabled | Continuous | Alarm condition | Time constraints |
---|---|---|---|---|---|---|
2f338088-d74c-41b6-baf1-185ad3fbe2cc | test-asg-cpu_alarm_high-rh5l5jerjhs6 | ok | True | True | cpu_util > 50.0 during 1 x 60s | None |
5053d1c6-66f0-4a4a-a52a-24d3e8881c4d | test-asg-cpu_alarm_low-n6rvsykaaiba | alarm | True | True | cpu_util < 15.0 during 1 x 60s | None |
nova list
ID | Name | Status | Task State | Power State | Networks |
---|---|---|---|---|---|
8ffbd4ac-435a-4d9d-80cc-23940302fadd | te-fpjq-oj6r53u24m4g-kdiexra2fs5b-server-mbhtpfvi3nys | ACTIVE | - | Running | private=10.0.0.3, 172.24.4.2 |