upstream/openstack/python-heat/python-heat/templates/hot/scenarios/NestedAutoScale.yaml

230 lines
8.3 KiB
YAML

################################################################################
# Copyright (c) 2013-2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
################################################################################
#
# Objective:
# Demonstrates creating:
# An autoscaling stack of nova instances that use cinder volumes
# The default meter used to trigger scaling is: cpu_util
# This template uses another template to show nested scaling
#
# Pre-Reqs:
# Normal lab setup. Capable of launching 3 VMs
# A keypair called: controller-0. (nova keypair-list)
# A flavor called: small (nova flavor-list)
# A glance image called: tis-centos-guest (glance image-list)
# A network called: internal0-net0 (neutron net-list)
# A nested template file NestedStack.yaml in the same folder as this yaml.
#
# Optional Template Parameters:
# KEYPAIR: A keypair setup for the current user (nova keypair-list)
# KEYPAIR_ADMIN_USER: The user to specify for injecting ssh keys from the
# keypair into the VM
# FLAVOR: A nova flavor name or UUID for the VMs (nova flavor-list)
# IMAGE: A glance image name or UUID for launching VMs (glance image-list)
# NETWORK: Name or UUID of the network to use for the VMs (neutron net-list)
# METER_NAME: Name of the gnocchi metric to use to trigger autoscaling
# (gnocchi metric list)
# HIGH_VALUE: Value for the meter to trigger a scale up.
# LOW_VALUE: Value for the meter to trigger a scale down.
#
# Tenant Considerations:
# The tenant must have access to the meter type selected.
#
# Sample CLI syntax:
# heat stack-create -f NestedAutoScale.yaml STACK
#
# Expected Outcome:
# VMs running the guest image (nova list)
# New aodh alarm triggers (aodh alarm list)
# New cinder volumes for each VM (cinder list)
# This template produces an output which shows the CLI syntax to help
# troubleshoot autoscaling
#
################################################################################
heat_template_version: 2015-04-30
description: >
Demonstrates autoscaling of a nested stack
The nested stack creates volumes and VMs
parameters:
KEYPAIR:
description: keypair to use. (nova keypair-list)
type: string
default: controller-0
constraints:
- custom_constraint: nova.keypair
KEYPAIR_ADMIN_USER:
description: Name of user account to inject ssh keys from keypair
type: string
default: 'ec2-user'
FLAVOR:
description: Nova flavor to use. (nova flavor-list)
type: string
default: small
constraints:
- custom_constraint: nova.flavor
IMAGE:
description: Glance image to create a cinder volume(glance image-list)
type: string
default: tis-centos-guest
constraints:
- custom_constraint: glance.image
NETWORK:
description: Name of the network to use (neutron net-list)
type: string
default: internal0-net0
constraints:
- custom_constraint: neutron.network
METER_NAME:
description: Gnocchi metric to query when determining autoscaling
type: string
default: cpu_util
RESOURCE_TYPE:
description: Gnocchi resource type to use to query
type: string
default: instance
HIGH_VALUE:
description: Metric value that will trigger a scale up if exceeded
type: string
default: '80'
LOW_VALUE:
description: Metric value that will trigger a scale down if below
type: string
default: '30'
resources:
ScalingGroup:
type: OS::Heat::AutoScalingGroup
properties:
cooldown: 60
desired_capacity: 1
max_size: 3
min_size: 1
resource:
type: NestedStack.yaml
properties:
NAMING: { get_param: "OS::stack_name"}
FLAVOR: { get_param: FLAVOR }
IMAGE: { get_param: IMAGE }
KEYPAIR: { get_param: KEYPAIR }
KEYPAIR_ADMIN_USER: { get_param: KEYPAIR_ADMIN_USER }
NETWORK: { get_param: NETWORK }
METADATA: {"metering.server_group": {get_param: "OS::stack_id"}}
ScaleUpPolicy:
type: OS::Heat::ScalingPolicy
properties:
adjustment_type: change_in_capacity
auto_scaling_group_id: { get_resource: ScalingGroup }
cooldown: 60
scaling_adjustment: 1
ScaleDownPolicy:
type: OS::Heat::ScalingPolicy
properties:
adjustment_type: change_in_capacity
auto_scaling_group_id: { get_resource: ScalingGroup }
cooldown: 60
scaling_adjustment: -1
AlarmHigh:
type: OS::Aodh::GnocchiAggregationByResourcesAlarm
properties:
description: Scale up if the meter above threshold for 5 minutes
metric: { get_param: METER_NAME }
aggregation_method: mean
granularity: 300
evaluation_periods: 1
threshold: { get_param: HIGH_VALUE }
resource_type: { get_param: RESOURCE_TYPE }
comparison_operator: gt
alarm_actions:
- {get_attr: [ScaleUpPolicy, alarm_url]}
# gnocchi alarm resource will automatically
# prepend to the query based on the meter type
# metadata.metering
# or metadata.user_metadata
query:
str_replace:
template: '{"=": {"server_group": "stack_id"}}'
params:
stack_id: {get_param: "OS::stack_id"}
AlarmLow:
type: OS::Aodh::GnocchiAggregationByResourcesAlarm
properties:
description: Scale down if the meter below threshold for 5 minutes
metric: { get_param: METER_NAME }
aggregation_method: mean
granularity: 300
evaluation_periods: 1
threshold: { get_param: LOW_VALUE }
resource_type: { get_param: RESOURCE_TYPE }
comparison_operator: lt
alarm_actions:
- {get_attr: [ScaleDownPolicy, alarm_url]}
# gnocchi alarm resource will automatically
# prepend to the query based on the meter type
# metadata.metering
# or metadata.user_metadata
query:
str_replace:
template: '{"=": {"server_group": "stack_id"}}'
params:
stack_id: {get_param: "OS::stack_id"}
outputs:
gnocchi_query:
value:
str_replace:
template: >
gnocchi measures aggregation --resource-type resourcetype
--query '"server_group"="stackval"'
--granularity 300 --aggregation mean -m metric
params:
resourcetype: { get_param: RESOURCE_TYPE }
metric: { get_param: METER_NAME }
stackval: { get_param: "OS::stack_id" }
description: >
This is a Gnocchi query for statistics on the cpu_util measurements about
OS::Nova::Server instances in this stack. The --resource-type select the
type of Gnocchi resource. The --query parameter filters resources
according to its attributes. When a VM's metadata includes an item of the
form metering.server_group=X, the corresponding Gnocchi resource has a
attribute named server_group that can queried with 'server_group="X"' In
this case the nested stacks give their VMs metadata that is passed as a
nested stack parameter, and this stack passes a metadata of the form
metering.server_group=X, where X is this stack's ID.
manual_scale_up:
value:
str_replace:
template: >
curl -X POST "scale_up_url"
params:
scale_up_url: {get_attr: [ScaleUpPolicy, alarm_url]}
manual_scale_down:
value:
str_replace:
template: >
curl -X POST "scale_down_url"
params:
scale_down_url: {get_attr: [ScaleDownPolicy, alarm_url]}