0

hi i'm trying to read a insert a item in a yaml file, which contains yaml in yaml as string following is the yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: conf
  labels:
    name: conf
  namespace: conf
data:
  blackbox.yml: |
    - labels:
        module: http_2xx_get
      targets:
      - https://xxx.asd.com/pa

i want to insert a new url in targets like this

apiVersion: v1
kind: ConfigMap
metadata:
  name: conf
  labels:
    name: conf
  namespace: conf
data:
  blackbox.yml: |
    - labels:
        module: http_2xx_get
      targets:
      - https://xxx.asd.com/pa
      - https://xxx1.asd.com/pa

following is my code to insert. it considers as string and doesn't work properly.

import yaml

probes = {"app": "/Users/asd/prometheus-configmap.yml"}

with open(probes['app'], 'r') as file:
    app_list = yaml.load(file, Loader=yaml.FullLoader)

    probes = yaml.safe_load(app_list['data']['blackbox.yml'])
    probes[0]['targets'].append("https://xxx1.asd.com/pa")
    with open("test.yml", "w") as yaml_file:
        yaml.dump(app_list, yaml_file)

output of the yaml file:

apiVersion: v1
data:
  blackbox-flights.yml: "- labels:\n    module: http_2xx_get\n  targets:\n  - https://xxx.asd.com/pa\n\
    \  - https://xxx1.asd.com/pa\n"
kind: ConfigMap
metadata:
  labels:
    name: conf
  name: conf
  namespace: conf

Amjad Hussain Syed
  • 994
  • 2
  • 11
  • 23
  • 1
    You should outdent the four lines starting with `probes =`. `file` is a built-in (for Python2) so that might not be a good variable name. The recommended extension for YAML files has been `.yaml` since 2006. – Anthon Jan 16 '20 at 07:37

1 Answers1

0

I've used the following solution from here and its working fine.

Thanks to @Gary van der Merwe

here's my code:

class literal_unicode(str):
    pass


def literal_unicode_representer(dumper, data):
    return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')

import yaml

probes = {"app": "/Users/asd/prometheus-configmap.yml"}

with open(probes['app'], 'r') as file:
    app_list = yaml.load(file, Loader=yaml.FullLoader)

    probes = yaml.safe_load(app_list['data']['blackbox.yml'])
    probes[0]['targets'].append("https://xxx1.asd.com/pa")
    yaml.add_representer(literal_unicode, literal_unicode_representer)
    data = {
        'blackbox.yml': literal_unicode(yaml.dump(probes))}
    app_list['data'] = data
    with open("test.yml", "w") as yaml_file:
        yaml.dump(app_list, yaml_file)

Amjad Hussain Syed
  • 994
  • 2
  • 11
  • 23