Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
antonionovaesjr opened this issue Feb 13, 2024 · 1 comment
Open
Labels
pending-review Waiting for a first review

Comments

@antonionovaesjr
Copy link

antonionovaesjr commented Feb 13, 2024

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

To Reproduce
Create variable using configuration in file yaml, and use this value in someone list

Expected behavior
If no problem, my expected was pass value dynamicly to probe and actions

Additional context
none

@antonionovaesjr antonionovaesjr added the pending-review Waiting for a first review label Feb 13, 2024
@cdsre
Copy link
Contributor

cdsre commented Mar 2, 2024

This same question was asked in chaostoolkit-aws (issue 146). I have added a comment that explains this behaviour and what the user needs to do to remediate it but I am also posting it here for completeness


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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
pending-review Waiting for a first review
Projects
None yet
Development

No branches or pull requests

2 participants