From 7e0e5cd188da8b636865cff5308f09709d41e2e2 Mon Sep 17 00:00:00 2001
From: Cory O'Daniel <cory@coryodaniel.com>
Date: Tue, 19 Mar 2019 16:21:00 -0700
Subject: [PATCH] DRY up resource names

---
 README.md                    | 43 +++++++++++++++++++++------
 example.jsonnet              | 25 +++++++---------
 manifests/kustomization.yaml | 56 ++++++++++++++++++------------------
 3 files changed, 73 insertions(+), 51 deletions(-)

diff --git a/README.md b/README.md
index bc320b79..64cc805a 100644
--- a/README.md
+++ b/README.md
@@ -157,14 +157,41 @@ local kp =
     },
   };
 
-{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
-{ ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
-{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
-{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
-{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
-{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
-{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
-{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) }
+local manifests =
+  { ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
+  { ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
+  { ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
+  { ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
+  { ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
+  { ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
+  { ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
+  { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) };
+
+// local kustomization = {
+//   apiVersion: 'kustomize.config.k8s.io/v1beta1',
+//   kind: 'Kustomization',
+//   resources:
+//     ['00namespace-' + name + '.yaml' for name in std.objectFields(kp.kubePrometheus)] +
+//     ['0prometheus-operator-' + name + '.yaml' for name in std.objectFields(kp.prometheusOperator)] +
+//     ['node-exporter-' + name + '.yaml' for name in std.objectFields(kp.nodeExporter)] +
+//     ['kube-state-metrics-' + name + '.yaml' for name in std.objectFields(kp.kubeStateMetrics)] +
+//     ['alertmanager-' + name + '.yaml' for name in std.objectFields(kp.alertmanager)] +
+//     ['prometheus-' + name + '.yaml' for name in std.objectFields(kp.prometheus)] +
+//     ['prometheus-adapter-' + name + '.yaml' for name in std.objectFields(kp.prometheusAdapter)] +
+//     ['grafana-' + name + '.yaml' for name in std.objectFields(kp.grafana)],
+// };
+
+local foo = function(name) { name ::+ '.yaml' };
+
+local kustomization = {
+  apiVersion: 'kustomize.config.k8s.io/v1beta1',
+  kind: 'Kustomization',
+  resources: std.map(foo , std.objectFields(manifests))
+};
+
+manifests { 
+  kustomization: kustomization 
+}
 ```
 
 And here's the [build.sh](build.sh) script (which uses `vendor/` to render all manifests in a json structure of `{filename: manifest-content}`):
diff --git a/example.jsonnet b/example.jsonnet
index 17a88429..b5259edd 100644
--- a/example.jsonnet
+++ b/example.jsonnet
@@ -5,20 +5,6 @@ local kp =
     },
   };
 
-local kustomization = {
-  apiVersion: 'kustomize.config.k8s.io/v1beta1',
-  kind: 'Kustomization',
-  resources:
-    ['00namespace-' + name + '.yaml' for name in std.objectFields(kp.kubePrometheus)] +
-    ['0prometheus-operator-' + name + '.yaml' for name in std.objectFields(kp.prometheusOperator)] +
-    ['node-exporter-' + name + '.yaml' for name in std.objectFields(kp.nodeExporter)] +
-    ['kube-state-metrics-' + name + '.yaml' for name in std.objectFields(kp.kubeStateMetrics)] +
-    ['alertmanager-' + name + '.yaml' for name in std.objectFields(kp.alertmanager)] +
-    ['prometheus-' + name + '.yaml' for name in std.objectFields(kp.prometheus)] +
-    ['prometheus-adapter-' + name + '.yaml' for name in std.objectFields(kp.prometheusAdapter)] +
-    ['grafana-' + name + '.yaml' for name in std.objectFields(kp.grafana)],
-};
-
 local manifests =
   { ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
   { ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
@@ -29,4 +15,13 @@ local manifests =
   { ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
   { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) };
 
-manifests { kustomization: kustomization }
+local kustomizationResourceFile(name) = name + ".yaml";
+local kustomization = {
+  apiVersion: 'kustomize.config.k8s.io/v1beta1',
+  kind: 'Kustomization',
+  resources: std.map(kustomizationResourceFile, std.objectFields(manifests))
+};
+
+manifests {
+  kustomization: kustomization,
+}
diff --git a/manifests/kustomization.yaml b/manifests/kustomization.yaml
index 6b4f0518..a74f797f 100644
--- a/manifests/kustomization.yaml
+++ b/manifests/kustomization.yaml
@@ -12,12 +12,18 @@ resources:
 - 0prometheus-operator-service.yaml
 - 0prometheus-operator-serviceAccount.yaml
 - 0prometheus-operator-serviceMonitor.yaml
-- node-exporter-clusterRole.yaml
-- node-exporter-clusterRoleBinding.yaml
-- node-exporter-daemonset.yaml
-- node-exporter-service.yaml
-- node-exporter-serviceAccount.yaml
-- node-exporter-serviceMonitor.yaml
+- alertmanager-alertmanager.yaml
+- alertmanager-secret.yaml
+- alertmanager-service.yaml
+- alertmanager-serviceAccount.yaml
+- alertmanager-serviceMonitor.yaml
+- grafana-dashboardDatasources.yaml
+- grafana-dashboardDefinitions.yaml
+- grafana-dashboardSources.yaml
+- grafana-deployment.yaml
+- grafana-service.yaml
+- grafana-serviceAccount.yaml
+- grafana-serviceMonitor.yaml
 - kube-state-metrics-clusterRole.yaml
 - kube-state-metrics-clusterRoleBinding.yaml
 - kube-state-metrics-deployment.yaml
@@ -26,11 +32,22 @@ resources:
 - kube-state-metrics-service.yaml
 - kube-state-metrics-serviceAccount.yaml
 - kube-state-metrics-serviceMonitor.yaml
-- alertmanager-alertmanager.yaml
-- alertmanager-secret.yaml
-- alertmanager-service.yaml
-- alertmanager-serviceAccount.yaml
-- alertmanager-serviceMonitor.yaml
+- node-exporter-clusterRole.yaml
+- node-exporter-clusterRoleBinding.yaml
+- node-exporter-daemonset.yaml
+- node-exporter-service.yaml
+- node-exporter-serviceAccount.yaml
+- node-exporter-serviceMonitor.yaml
+- prometheus-adapter-apiService.yaml
+- prometheus-adapter-clusterRole.yaml
+- prometheus-adapter-clusterRoleBinding.yaml
+- prometheus-adapter-clusterRoleBindingDelegator.yaml
+- prometheus-adapter-clusterRoleServerResources.yaml
+- prometheus-adapter-configMap.yaml
+- prometheus-adapter-deployment.yaml
+- prometheus-adapter-roleBindingAuthReader.yaml
+- prometheus-adapter-service.yaml
+- prometheus-adapter-serviceAccount.yaml
 - prometheus-clusterRole.yaml
 - prometheus-clusterRoleBinding.yaml
 - prometheus-prometheus.yaml
@@ -47,20 +64,3 @@ resources:
 - prometheus-serviceMonitorKubeControllerManager.yaml
 - prometheus-serviceMonitorKubeScheduler.yaml
 - prometheus-serviceMonitorKubelet.yaml
-- prometheus-adapter-apiService.yaml
-- prometheus-adapter-clusterRole.yaml
-- prometheus-adapter-clusterRoleBinding.yaml
-- prometheus-adapter-clusterRoleBindingDelegator.yaml
-- prometheus-adapter-clusterRoleServerResources.yaml
-- prometheus-adapter-configMap.yaml
-- prometheus-adapter-deployment.yaml
-- prometheus-adapter-roleBindingAuthReader.yaml
-- prometheus-adapter-service.yaml
-- prometheus-adapter-serviceAccount.yaml
-- grafana-dashboardDatasources.yaml
-- grafana-dashboardDefinitions.yaml
-- grafana-dashboardSources.yaml
-- grafana-deployment.yaml
-- grafana-service.yaml
-- grafana-serviceAccount.yaml
-- grafana-serviceMonitor.yaml
-- 
GitLab