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