как заменить один элемент массива в jsonnet способом смешивания?
У нас есть массив, импортированный из libsonnet
{
"volumes": [
{
"emptyDir": {},
"name": "grafana-storage"
},
{
"configMap": {
"name": "grafana-dashboard-apiserver"
},
"name": " grafana-dashboard-apiserver"
}
]
}
Я хочу заменить этот элемент:
{
"emptyDir": {},
"name": "grafana-storage"
},
с этим (таким же name
):
{
"name": "grafana-storage",
"persistentVolumeClaim": {
"claimName": "product-nfs"
}
ожидаемые результаты:
{
"volumes": [
{
"configMap": {
"name": "grafana-dashboard-apiserver"
},
"name": " grafana-dashboard-apiserver"
},
{
"name": "grafana-storage",
"persistentVolumeClaim": {
"claimName": "product-nfs"
}
}
]
}
"добавить" легко, но как удалить существующий
пример:
local x = {volumes: [
{emptyDir: {}, name: 'grafana-storage' },
{configMap: {name: 'grafana-dashboard-apiserver'
}, name: ' grafana-dashboard-apiserver'},]};
x
+ {volumes+: [{name: 'grafana-storage',persistentVolumeClaim: {claimName:'product-nfs'}}]}
заранее спасибо ~
1 ответ
Решение
Когда дело доходит до получения / перегрузки, jsonnet
намного проще работать с картами (также известными как "объекты", "диктовки", "хеши"), стратегия будет следующая: 1) преобразовать в карту, 2) переопределить, 3) преобразовать обратно в массив.
Нижеприведенный фрагмент реализует это:
local main_obj = {
volumes: [
{
emptyDir: {},
name: "grafana-storage",
},
{
configMap: {
name: "grafana-dashboard-apiserver",
},
name: "grafana-dashboard-apiserver",
},
],
};
local obj_overrides = {
volumes: [
{
name: "grafana-storage",
persistentVolumeClaim: { claimName: "product-nfs" },
},
],
};
// Convert to map for easier overloading, assumes all array elements are maps having "name" field
local toNamedMap(array) = { [x.name]: x for x in array };
// Convert back to array
local toNamedArray(map) = [{ name: x } + map[x] for x in std.objectFields(map)];
toNamedArray(toNamedMap(main_obj.volumes) + toNamedMap(obj_overrides.volumes))