-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.clj
89 lines (75 loc) · 2.41 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
(ns clj-k8s.core
(:require [clojure.string :as str]
[kubernetes.core :as k]
[kubernetes.api.core-v- :as core]))
;;; ==========================================
;;; Batch
;;; ==========================================
(defmacro not-found->nil
[& body]
`(try
~@body
(catch Throwable t#
(if (= 404 (-> t# ex-data :status))
nil
(throw t#)))))
(defn ->label-selector
[labels]
(if (string? labels)
labels
(->> labels
(map (fn [[k v]] (format "%s=%s" (name k) v)))
(str/join ","))))
(defn default-ns
[]
(:namespace k/*api-context*))
(defmacro with-api-context
"A helper macro to wrap *api-context* with default values."
[api-context & body]
`(let [api-context# ~api-context
api-context# (-> k/*api-context*
(merge api-context#)
(assoc :auths (merge (:auths k/*api-context*) (:auths api-context#))))]
(binding [k/*api-context* api-context#]
~@body)))
;; Namespaces
(defn get-namespace
"Fetches the specified namespace or returns nil if not found"
([n] (get-namespace n {}))
([n opts]
(not-found->nil
(core/read-core-v1-namespace n opts))))
(defn create-namespace
"Creates a namespace"
([spec] (create-namespace spec {}))
([spec opts]
(let [spec (if (string? spec) {:metadata {:name spec}} spec)]
(core/create-core-v1-namespace spec opts))))
(defn delete-namespace
"Deletes a namespace"
([n] (delete-namespace n {}))
([n opts]
(not-found->nil
(core/delete-core-v1-namespace n opts))))
;; Pods
(defn list-pods
"List or watch pods"
([] (list-pods {}))
([{:keys [namespace all-namespaces] :or {namespace (default-ns)} :as opts}]
(let [opts (update opts :label-selector ->label-selector)]
(:items
(if all-namespaces
(core/list-core-v1-pod-for-all-namespaces opts)
(core/list-core-v1-namespaced-pod namespace opts))))))
(defn pod-logs
"Reads the logs of a specific pod"
([n] (pod-logs n {}))
([n {:keys [namespace] :or {namespace (default-ns)} :as opts}]
(core/read-core-v1-namespaced-pod-log n namespace opts)))
;; Services
(defn get-endpoints
"Fetches the specified endpoints or returns nil if not found"
([n] (get-endpoints n {}))
([n {:keys [namespace] :or {namespace (default-ns)} :as opts}]
(not-found->nil
(core/read-core-v1-namespaced-endpoints n namespace opts))))