Merge "integration: add some new tests"
diff --git a/ceilometer/tests/integration/gabbi/gabbits-live/autoscaling.yaml b/ceilometer/tests/integration/gabbi/gabbits-live/autoscaling.yaml
index e263d5c..202fe74 100644
--- a/ceilometer/tests/integration/gabbi/gabbits-live/autoscaling.yaml
+++ b/ceilometer/tests/integration/gabbi/gabbits-live/autoscaling.yaml
@@ -23,59 +23,7 @@
       method: POST
       request_headers:
           content-type: application/json
-      data:
-          stack_name: integration_test
-          template:
-              heat_template_version: "2013-05-23"
-              description: Integration Test AutoScaling with heat+ceilometer+gnocchi+aodh
-              resources:
-                asg:
-                  type: OS::Heat::AutoScalingGroup
-                  properties:
-                    min_size: 1
-                    max_size: 3
-                    resource:
-                      type: OS::Nova::Server
-                      properties:
-                        networks:
-                          - network: "private"
-                        flavor: m1.tiny
-                        image: $ENVIRON['GLANCE_IMAGE_NAME']
-                        metadata:
-                          "metering.server_group": {get_param: "OS::stack_id"}
-                        user_data_format: RAW
-                        user_data: |
-                          #!/bin/sh
-                          echo "Loading CPU"
-                          set -v
-                          cat /dev/urandom > /dev/null
-                web_server_scaleup_policy:
-                  type: OS::Heat::ScalingPolicy
-                  properties:
-                    adjustment_type: change_in_capacity
-                    auto_scaling_group_id: {get_resource: asg}
-                    cooldown: 2
-                    scaling_adjustment: 1
-                cpu_alarm_high:
-                  type: OS::Ceilometer::GnocchiAggregationByResourcesAlarm
-                  properties:
-                    description: Scale-up if the mean CPU > 10% on 1 minute
-                    metric: cpu_util
-                    aggregation_method: mean
-                    granularity: 60.0
-                    evaluation_periods: 1
-                    threshold: 10
-                    comparison_operator: gt
-                    alarm_actions:
-                      - {get_attr: [web_server_scaleup_policy, alarm_url]}
-                    resource_type: instance
-                    query:
-                      str_replace:
-                        template: '{"=": {"server_group": "stack_id"}}'
-                        params:
-                           stack_id: {get_param: "OS::stack_id"}
-                # TODO(sileht): create some other kind of kind alarm just to ensure
-                # heat and aodh API are in sync
+      data: <@create_stack.json
       status: 201
 
     - name: waiting for stack creation
@@ -112,10 +60,9 @@
       response_json_paths:
           $.servers[0].metadata.'metering.server_group': $RESPONSE['$.stack.id']
           $.servers[1].metadata.'metering.server_group': $RESPONSE['$.stack.id']
-          $.servers[2].metadata.'metering.server_group': $RESPONSE['$.stack.id']
           $.servers[0].status: ACTIVE
           $.servers[1].status: ACTIVE
-          $.servers[2].status: ACTIVE
+          $.servers.`len`: 2
 
     - name: check gnocchi resources
       desc: Check the gnocchi resources for this three servers exists
@@ -127,17 +74,70 @@
       response_strings:
           - '"id": "$RESPONSE["$.servers[0].id"]"'
           - '"id": "$RESPONSE["$.servers[1].id"]"'
-          - '"id": "$RESPONSE["$.servers[2].id"]"'
 
     - name: check alarm
       desc: Check the aodh alarm and its state
       url: $ENVIRON['AODH_SERVICE_URL']/v2/alarms
       method: GET
+      poll:
+          count: 30
+          delay: 1
       response_strings:
           - "integration_test-cpu_alarm_high-"
       response_json_paths:
           $[0].state: alarm
 
+    - name: get stack location for update
+      desc: Get the stack location
+      url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test
+      method: GET
+      status: 302
+
+    - name: update stack
+      desc: Update an autoscaling stack
+      url: $LOCATION
+      method: PUT
+      request_headers:
+          content-type: application/json
+      data: <@update_stack.json
+      status: 202
+
+    - name: waiting for stack update
+      desc: Wait for the third event on the stack resource, it can be a success or failure
+      url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test/events?resource_name=integration_test
+      redirects: true
+      method: GET
+      status: 200
+      poll:
+          count: 300
+          delay: 1
+      response_json_paths:
+          $.events[3].resource_name: integration_test
+
+    - name: control stack status
+      desc: Checks the stack have been created successfully
+      url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test
+      redirects: true
+      method: GET
+      status: 200
+      poll:
+          count: 5
+          delay: 1
+      response_json_paths:
+          $.stack.stack_status: "UPDATE_COMPLETE"
+
+    - name: list servers
+      desc: Wait the autoscaling stack grow to three servers
+      url: $ENVIRON['NOVA_SERVICE_URL']/servers/detail
+      method: GET
+      poll:
+          count: 600
+          delay: 1
+      response_json_paths:
+          $.servers[0].metadata.'metering.server_group': $RESPONSE['$.stack.id']
+          $.servers[0].status: ACTIVE
+          $.servers.`len`: 1
+
     - name: get stack location
       desc: Get the stack location
       url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test
diff --git a/ceilometer/tests/integration/gabbi/gabbits-live/create_stack.json b/ceilometer/tests/integration/gabbi/gabbits-live/create_stack.json
new file mode 100644
index 0000000..7b3d3b4
--- /dev/null
+++ b/ceilometer/tests/integration/gabbi/gabbits-live/create_stack.json
@@ -0,0 +1,67 @@
+{
+    "stack_name": "integration_test",
+    "template": {
+        "heat_template_version": "2013-05-23",
+        "description": "Integration Test AutoScaling with heat+ceilometer+gnocchi+aodh",
+        "resources": {
+            "asg": {
+                "type": "OS::Heat::AutoScalingGroup",
+                "properties": {
+                    "min_size": 1,
+                    "max_size": 2,
+                    "resource": {
+                        "type": "OS::Nova::Server",
+                        "properties": {
+                            "networks": [{ "network": "private" }],
+                            "flavor": "m1.tiny",
+                            "image": "$ENVIRON['GLANCE_IMAGE_NAME']",
+                            "metadata": {
+                                "metering.server_group": { "get_param": "OS::stack_id" }
+                            },
+                            "user_data_format": "RAW",
+                            "user_data": {"Fn::Join": ["", [
+                                "#!/bin/sh\n",
+                                "echo 'Loading CPU'\n",
+                                "set -v\n",
+                                "cat /dev/urandom > /dev/null\n"
+                            ]]}
+                        }
+                    }
+                }
+            },
+            "web_server_scaleup_policy": {
+                "type": "OS::Heat::ScalingPolicy",
+                "properties": {
+                    "adjustment_type": "change_in_capacity",
+                    "auto_scaling_group_id": { "get_resource": "asg" },
+                    "cooldown": 2,
+                    "scaling_adjustment": 1
+                }
+            },
+            "cpu_alarm_high": {
+                "type": "OS::Ceilometer::GnocchiAggregationByResourcesAlarm",
+                "properties": {
+                    "description": "Scale-up if the mean CPU > 10% on 1 minute",
+                    "metric": "cpu_util",
+                    "aggregation_method": "mean",
+                    "granularity": 60,
+                    "evaluation_periods": 1,
+                    "threshold": 10,
+                    "comparison_operator": "gt",
+                    "alarm_actions": [
+                        { "get_attr": [ "web_server_scaleup_policy", "alarm_url" ] }
+                    ],
+                    "resource_type": "instance",
+                    "query": {
+                        "str_replace": {
+                            "template": "{\"and\": [{\"=\": {\"server_group\": \"stack_id\"}}, {\"=\": {\"ended_at\": null}}]}",
+                            "params": {
+                                "stack_id": { "get_param": "OS::stack_id" }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/ceilometer/tests/integration/gabbi/gabbits-live/update_stack.json b/ceilometer/tests/integration/gabbi/gabbits-live/update_stack.json
new file mode 100644
index 0000000..8897d39
--- /dev/null
+++ b/ceilometer/tests/integration/gabbi/gabbits-live/update_stack.json
@@ -0,0 +1,66 @@
+{
+    "template": {
+        "heat_template_version": "2013-05-23",
+        "description": "Integration Test AutoScaling with heat+ceilometer+gnocchi+aodh",
+        "resources": {
+            "asg": {
+                "type": "OS::Heat::AutoScalingGroup",
+                "properties": {
+                    "min_size": 1,
+                    "max_size": 2,
+                    "resource": {
+                        "type": "OS::Nova::Server",
+                        "properties": {
+                            "networks": [{ "network": "private" }],
+                            "flavor": "m1.tiny",
+                            "image": "$ENVIRON['GLANCE_IMAGE_NAME']",
+                            "metadata": {
+                                "metering.server_group": { "get_param": "OS::stack_id" }
+                            },
+                            "user_data_format": "RAW",
+                            "user_data": {"Fn::Join": ["", [
+                                "#!/bin/sh\n",
+                                "echo 'Loading CPU'\n",
+                                "set -v\n",
+                                "cat /dev/urandom > /dev/null\n"
+                            ]]}
+                        }
+                    }
+                }
+            },
+            "web_server_scaledown_policy": {
+                "type": "OS::Heat::ScalingPolicy",
+                "properties": {
+                    "adjustment_type": "change_in_capacity",
+                    "auto_scaling_group_id": { "get_resource": "asg" },
+                    "cooldown": 2,
+                    "scaling_adjustment": -1
+                }
+            },
+            "cpu_alarm_high": {
+                "type": "OS::Ceilometer::GnocchiAggregationByResourcesAlarm",
+                "properties": {
+                    "description": "Scale-down if the mean CPU > 10% on 1 minute",
+                    "metric": "cpu_util",
+                    "aggregation_method": "mean",
+                    "granularity": 60,
+                    "evaluation_periods": 1,
+                    "threshold": 10,
+                    "comparison_operator": "gt",
+                    "alarm_actions": [
+                        { "get_attr": [ "web_server_scaledown_policy", "alarm_url" ] }
+                    ],
+                    "resource_type": "instance",
+                    "query": {
+                        "str_replace": {
+                            "template": "{\"and\": [{\"=\": {\"server_group\": \"stack_id\"}}, {\"=\": {\"ended_at\": null}}]}",
+                            "params": {
+                                "stack_id": { "get_param": "OS::stack_id" }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}