chaostoolkit-incubator / chaostoolkit-aws

Chaos Toolkit Extension for AWS
https://chaostoolkit.org/drivers/aws/
Apache License 2.0
109 stars 52 forks source link

Failed parsing YAML experiment: while parsing a flow sequence #146

Open antonionovaesjr opened 9 months ago

antonionovaesjr commented 9 months ago

Description: When I use configuration values ​​inside a list, such as tags or subnets_ids from the chasaws addon, json parse error occurs

python -V: Python 3.11.7

chaos.exe info core: NAME VERSION CLI 1.18.0 Core library 1.41.0

chaos info extensions NAME VERSION LICENSE DESCRIPTION chaostoolkit-aws 0.31.1 Apache License Version 2.0 AWS chaostoolkit-kubernetes 0.34.1 Apache License Version 2.0 Kubernetes chaostoolkit-reporting 0.17.1 Apache License Version 2.0 Chaos engineering toolkit reporting library

Experiment 01:

version: 1.0.0
title: aws-01 Minha aplcicação com 3 replicas e hpa no eks é resiliente a término inesperado de 1 instância
description: Validar o conceito de que 3 replicas com hpa suporta bem o fim de 1 instância
contributions:
  availability: high
  reliability: high
  security: none
  scalability: medium
tags:
- eks
- aws
configuration:
  nodegroup-name: 'app-20240213133021650200000017'
  #  vault_addr:
  #    type: env
  #    key: VAULT_ADDR
steady-state-hypothesis:
  title: Services are all available and healthy
  probes:
  - type: probe
    name: application-must-respond-normally
    tolerance: [200]
    provider:
      type: http
      url: http://cloud.xpto.com.br/python
      timeout: 5
method:
- type: action
  name: terminate-random-instances
  provider:
    func: terminate_random_instances
    module: chaosaws.asg.actions
    type: python
    arguments:
       tags:
        - Key: 'eks:nodegroup-name'
          Value: ${nodegroup-name}
       instance_count: 1

Experiment 02:

---
version: 1.0.0
title: My application is resilient to fail 1 zones
description: Can my application maintain its minimum resources?
contributions:
  availability: high
  reliability: high
  security: none
  scalability: medium
tags:
- eks
- aws
configuration:
  http_endpoint_check: http://cloud.xpto.com.br/python/health
  subnet01 : subnet-27b4b111
  subnet02: subnet-3d69a712
  subnet03: subnet-7d778713
  nodegroup_infra: eks-infra-20240213133021650200000019-28c6d154-a654-37e1-826c-75cd21af88c1
  nodegroup_app: eks-app-20240213133021650200000017-c0c6d154-a653-153c-30c0-aa783937441c
steady-state-hypothesis:
  title: Services are all available and healthy
  probes:
  - type: probe
    name: application-must-respond-normally
    tolerance: [200]
    provider:
      type: http
      url: ${http_endpoint_check}
      timeout: 5
method:
- type: action
  name: change-subnets-asg
  provider:
    arguments:
      subnets: [ ${subnet01} , ${subnet02} ]
      asg_names: [${nodegroup_infra},${ nodegroup_app}]
    func: change_subnets
    module: chaosaws.asg.actions
    type: python
- type: action
  name: change-subnets-elb
  provider:
    arguments:
      load_balancer_names: [eks-public-lb]
      subnet_ids: [${subnet01},${subnet02}]
    func: set_subnets
    module: chaosaws.elbv2.actions
    type: python
  pauses:
    before: 0
    after: 30
rollbacks:
- type: action
  name: rollback-change-subnets-asg
  provider:
    arguments:
      subnets:
      - ${subnet01}
      - ${subnet02}
      - ${subnet03}
      asg_names: [${nodegroup_infra},${ nodegroup_app}]
    func: change_subnets
    module: chaosaws.asg.actions
    type: python
  pauses:
    before: 180
    after: 0
- type: action
  name: rollback-set-subnets-elb
  provider:
    arguments:
      load_balancer_names: [eks-public-lb]
      subnet_ids: [${subnet01},${subnet02},${subnet03}]
    func: set_subnets
    module: chaosaws.elbv2.actions
    type: python
  pauses:
    before: 180
    after: 0

Error msg:

$ chaos.exe validate experiments/expermiment-aws-02.yaml
[2024-02-13 14:15:38 ERROR] Failed parsing YAML experiment: while parsing a flow sequence
      in "experiments/expermiment-aws-02.yaml", line 30, column 16
    expected ',' or ']', but got '{'
      in "experiments/expermiment-aws-02.yaml", line 30, column 19
Lawouach commented 9 months ago

Hello @antonionovaesjr

Thanks for the report. I don't use YAML as an input that often so I'll have to look into it. Hard to say if the issue is with the parser or the yaml itself indeed.

cdsre commented 9 months ago

The issue here is with the syntax of the yaml. In most cases you can leave strings unquoted and yaml will just consider them as strings. however in some cases you need to use quotes so yaml doesn't interprete a specific char as a yaml token, which is the case here. Using your experiment2.yaml we can replicate this issue outside of chaostoolkit

import yaml

with open("experiment2.yaml") as exp:
    yaml.safe_load(exp)

OUTPUT

line 483, in parse_flow_sequence_entry
    raise ParserError("while parsing a flow sequence", self.marks[-1],
yaml.parser.ParserError: while parsing a flow sequence
  in "experiment2.yaml", line 35, column 16
expected ',' or ']', but got '{'
  in "experiment2.yaml", line 35, column 19

Also you seem to be mixing the block style and flow style with your sequences and mappings. While these yield the same result in most cases, flow style is what's causing your issue here and how it is handled by the parser.

There are two way to resolve this. Either quote your values in the flow sequence and mappings for example

method:
- type: action
  name: change-subnets-asg
  provider:
    arguments:
      subnets: [ "${subnet01}" , "${subnet02}" ]
      asg_names: ["${nodegroup_infra}","${ nodegroup_app}"]
    func: change_subnets
    module: chaosaws.asg.actions
    type: python

Or switch these to block style, this would be my prefered choice as its the more common style used and what the majority of your experiment already uses for its style

method:
- type: action
  name: change-subnets-asg
  provider:
    arguments:
      subnets:
      - ${subnet01}
      - ${subnet02}
      asg_names:
      - ${nodegroup_infra}
      - ${ nodegroup_app}
    func: change_subnets
    module: chaosaws.asg.actions
    type: python

using either method to correct the file i can successfully run

 chaos validate .\experiment2.yaml
[2024-03-02 09:14:19 INFO] Validating the experiment's syntax
[2024-03-02 09:14:19 INFO] Experiment looks valid
[2024-03-02 09:14:19 INFO] experiment syntax and semantic look valid

Where are before with your original file I got

chaos validate .\experiment2.yaml
[2024-03-02 09:16:32 ERROR] Failed parsing YAML experiment: while parsing a flow sequence
      in ".\experiment2.yaml", line 35, column 16
    expected ',' or ']', but got '{'
      in ".\experiment2.yaml", line 35, column 19