Home  >  Article  >  Backend Development  >  Get Openshift ConfigMap data using python

Get Openshift ConfigMap data using python

王林
王林forward
2024-02-22 12:31:11497browse

使用 python 获取 Openshift ConfigMap 数据

Question content

I am trying to use the openshift python library to get the data of the configmap in the project. I managed to get the name of the configmap but I can find functions or examples in the documentation for extracting the data. Has anyone encountered this problem or knows how to do this?

This is the code I use to get the cm name (returns a dictionary):

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 using oc.selector and using with oc.selector(project_name): to try and get some data, but couldn't find a way to get it.

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

Thanks.


Correct answer


If you use oc.invoke, you need to pass the appropriate command line arguments. Consider what would happen if you ran 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 name, but not the content. If you want content, you need to choose 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 parameters in the call to oc.invoke. Something like this demonstrates how things 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)

This works, but don't do it.

Obviously you already know how to use selectors, since that's how you iterate over items. You should use the same technique to iterate over the configuration map:

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 heavily based on examples straight from the documentation. Iterate configmaps.objects() to get an api object for each configmap. You can access the name and content.

The above is the detailed content of Get Openshift ConfigMap data using python. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete