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.
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!