Getting Openshift ConfigMap data with python

101 Views Asked by At

I am trying to get data of a ConfigMap in a project using openshift python library. I managed to get the name of the configmap but I can find the function or example in the documentation to extract the data. Has anyone faced this or knows a way to do that?

This is the code I used to get the CM's name (returns a dict with it):

import openshift as oc

if __name__ == '__main__':
    project_selector = oc.selector('projects')
    projects = project_selector.objects()
    number_of_projects = len(projects)
    for project in projects:
        name = project.model.metadata.name
        oc.invoke('project', name)
        tokens = oc.invoke('get', ['configmaps']).actions()[0].as_dict()['out'].replace('\n', ' ').split(' ')
        configmap_data = [x for x in tokens if len(x) > 0 and not x.isupper()]
        print(configmap_data)

I did try to use oc.selector and using with oc.selector(project_name): to try and get some data but couldnt find a way to get it.

Please note that I don't need to use oc cmd commands and I have to use python for it. Currently I just need the data, and later see how to change it.

Thank you.

1

There are 1 best solutions below

1
larsks On BEST ANSWER

If you're using oc.invoke, you need to pass the appropriate command line arguments. Consider what happens if you run the same command manually:

$ oc get configmaps
NAME                                                   DATA   AGE
coredns                                                1      54d
extension-apiserver-authentication                     6      54d
kube-apiserver-legacy-service-account-token-tracking   1      54d
kube-proxy                                             2      54d
kube-root-ca.crt                                       1      54d
kubeadm-config                                         1      54d
kubelet-config                                         1      54d

You get the names, but not the content. If you want the content, you would need to select a more appropriate output format, such as -o json:

$ oc get configmaps kubelet-config -o json
{
    "apiVersion": "v1",
    "data": {
        ...
    },
    "kind": "ConfigMap",
    "metadata": {
        "name": "kubelet-config",
        "namespace": "kube-system",
    }
}

You need to include the same arguments in your call to oc.invoke. Something like this demonstrates how things would work:

import openshift as oc
import json

project_selector = oc.selector('projects')
projects = project_selector.objects()
for project in projects:
    # get a list of configmap names
    configmaps = oc.invoke('get', ['-n', project.name(), '-o', 'name', 'configmaps'])

    # for each configmap, get the content
    for cm in configmaps.out().splitlines():
        out = oc.invoke('get', ['-n', project.name(), '-o', 'json', cm])
        manifest = json.loads(out.out())
        data = manifest['data']
        print(data)

That works, but don't do that.

It's obvious you already know how to use selectors, since that's how you're iterating over projects. You should be using the same technique to iterate over configmaps:

import openshift as oc

projects = oc.selector('projects')
for project in projects.objects():
    with oc.project(project.name()):
        configmaps = oc.selector('configmaps')
        for cm in configmaps.objects():
            data = cm.as_dict()['data']
            print(data)

This is based pretty much on examples straight from the documentation. Iterating over configmaps.objects() gets you an API object for each ConfigMap. You have access to the name and the content.