Skip to content

Commit 8b61faa

Browse files
committed
re-think packages and directories in cluster_codegen.sh
kcp uses an entirely different concept of placing the packages. Whereas the examples in this repo follow a / <singlecluster> <-- all single-cluster code / <base outputdir> +-- clientset/versioned/ <-- cluster-aware clientset +-- informers/ +-- listers/ structure, but in kcp it's / <singlecluster> +-- clientset/ | +-- versioned/ <-- single-cluster clientset | +-- cluster/ <-- cluster-ware clientset +-- listers +-- informers Placing the cluster clientset right into the singlecluster clientset, but keeping the listers and informers standalone (since there are no single-cluster listers and informers in the kcp SDK). Making both structures possible would either require a bunch of magic, or some explicit, IMHO easier to understand CLI flags to control exactly what you want to have happen. I have sacrified to a degree the concept of "naming" a clientset and the "versioned" subdirectory, also because in kcp the cluster-aware clientset doesn't itself contain a clientset/versioned/ subdirectory. On-behalf-of: @SAP christoph.mewes@sap.com
1 parent fbe4b39 commit 8b61faa

9 files changed

Lines changed: 158 additions & 156 deletions

File tree

cluster_codegen.sh

Lines changed: 128 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -61,23 +61,42 @@ function cluster::codegen::internal::grep() {
6161
# client. If this is not set, clients for all APIs under the input-dir
6262
# will be generated (under the --output-pkg).
6363
#
64+
# --boilerplate <string = path_to_kube_codegen_boilerplate>
65+
# An optional override for the header file to insert into generated files.
66+
#
6467
# --output-dir <string>
6568
# The root directory under which to emit code. Each aspect of client
66-
# generation will make one or more subdirectories.
69+
# generation will make one or more subdirectories unless an explicit
70+
# directory for that aspect is configured also.
6771
#
6872
# --output-pkg <string>
6973
# The Go package path (import path) of the --output-dir. Each aspect of
70-
# client generation will make one or more sub-packages.
74+
# client generation will make one or more sub-packages unless an explicit
75+
# package for that aspect is configured also.
7176
#
72-
# --boilerplate <string = path_to_kube_codegen_boilerplate>
73-
# An optional override for the header file to insert into generated files.
77+
# --versioned-clientset-dir <string>
78+
# The root directory under which to emit the generated cluster-aware clientset.
79+
# Overwrites the automatic detection based on --output-dir.
7480
#
75-
# --clientset-name <string = "clientset">
76-
# An optional override for the leaf name of the generated "clientset" directory.
81+
# --versioned-clientset-pkg <string>
82+
# The Go package path (import path) of the --versioned-clientset-dir.
83+
# Overwrites the automatic detection based on --output-dir.
7784
#
78-
# --versioned-name <string = "versioned">
79-
# An optional override for the leaf name of the generated
80-
# "<clientset>/versioned" directory.
85+
# --informers-dir <string>
86+
# The root directory under which to emit the generated cluster-aware informers.
87+
# Overwrites the automatic detection based on --output-dir.
88+
#
89+
# --informers-pkg <string>
90+
# The Go package path (import path) of the --informers-dir.
91+
# Overwrites the automatic detection based on --output-dir.
92+
#
93+
# --listers-dir <string>
94+
# The root directory under which to emit the generated cluster-aware listers.
95+
# Overwrites the automatic detection based on --output-dir.
96+
#
97+
# --listers-pkg <string>
98+
# The Go package path (import path) of the --listers-dir.
99+
# Overwrites the automatic detection based on --output-dir.
81100
#
82101
# --single-cluster-versioned-clientset-pkg
83102
# The package name of the generated versioned Kubernetes clientset, e.g.
@@ -89,55 +108,54 @@ function cluster::codegen::internal::grep() {
89108
# "acme.corp/sdk/generated/applyconfigurations". This has to have already been
90109
# generated by k8s.io/code-generator.
91110
#
92-
# --single-cluster-listers-pkg
93-
# The optional name of the generated Kubernetes listers package, e.g.
94-
# "acme.corp/sdk/generated/listers". This has to have already been
95-
# generated by k8s.io/code-generator. If not specified, the generated cluster
96-
# listers will include the necessary interfaces themselves.
97-
#
98111
# --single-cluster-informers-pkg
99112
# The optional name of the generated Kubernetes informers package, e.g.
100113
# "acme.corp/sdk/generated/informers". This has to have already been
101114
# generated by k8s.io/code-generator. If not specified, the generated cluster
102115
# informers will include the necessary interfaces themselves.
103116
#
117+
# --single-cluster-listers-pkg
118+
# The optional name of the generated Kubernetes listers package, e.g.
119+
# "acme.corp/sdk/generated/listers". This has to have already been
120+
# generated by k8s.io/code-generator. If not specified, the generated cluster
121+
# listers will include the necessary interfaces themselves.
122+
#
104123
# --with-watch
105124
# Enables generation of listers and informers for APIs which support WATCH.
106125
#
107-
# --listers-name <string = "listers">
108-
# An optional override for the leaf name of the generated "listers" directory.
109-
#
110-
# --informers-name <string = "informers">
111-
# An optional override for the leaf name of the generated "informers" directory.
112-
#
113126
# --plural-exceptions <string = "">
114127
# An optional list of comma separated plural exception definitions in Type:PluralizedType form.
115128
#
116129
function cluster::codegen::gen_client() {
117130
local in_dir=""
118131
local one_input_api=""
132+
local boilerplate="${CLUSTER_CODEGEN_ROOT}/hack/boilerplate.go.txt"
119133
local out_dir=""
120134
local out_pkg=""
121-
local clientset_subdir="clientset"
122-
local clientset_versioned_name="versioned"
123-
local watchable="false"
124-
local listers_subdir="listers"
125-
local informers_subdir="informers"
126-
local boilerplate="${CLUSTER_CODEGEN_ROOT}/hack/boilerplate.go.txt"
127-
local plural_exceptions=""
128-
local v="${KUBE_VERBOSE:-0}"
129-
local prefers_protobuf="false"
135+
local versioned_clientset_dir=""
136+
local versioned_clientset_pkg=""
137+
local informers_dir=""
138+
local informers_pkg=""
139+
local listers_dir=""
140+
local listers_pkg=""
130141
local single_cluster_versioned_clientset_pkg=""
131142
local single_cluster_applyconfigurations_pkg=""
132-
local single_cluster_listers_pkg=""
133143
local single_cluster_informers_pkg=""
144+
local single_cluster_listers_pkg=""
145+
local watchable="false"
146+
local plural_exceptions=""
147+
local v="${KUBE_VERBOSE:-0}"
134148

135149
while [ "$#" -gt 0 ]; do
136150
case "$1" in
137151
"--one-input-api")
138152
one_input_api="/$2"
139153
shift 2
140154
;;
155+
"--boilerplate")
156+
boilerplate="$2"
157+
shift 2
158+
;;
141159
"--output-dir")
142160
out_dir="$2"
143161
shift 2
@@ -146,28 +164,28 @@ function cluster::codegen::gen_client() {
146164
out_pkg="$2"
147165
shift 2
148166
;;
149-
"--boilerplate")
150-
boilerplate="$2"
167+
"--versioned-clientset-dir")
168+
versioned_clientset_dir="$2"
151169
shift 2
152170
;;
153-
"--clientset-name")
154-
clientset_subdir="$2"
171+
"--versioned-clientset-pkg")
172+
versioned_clientset_pkg="$2"
155173
shift 2
156174
;;
157-
"--versioned-name")
158-
clientset_versioned_name="$2"
175+
"--informers-dir")
176+
informers_dir="$2"
159177
shift 2
160178
;;
161-
"--with-watch")
162-
watchable="true"
163-
shift
179+
"--informers-pkg")
180+
informers_pkg="$2"
181+
shift 2
164182
;;
165-
"--listers-name")
166-
listers_subdir="$2"
183+
"--listers-dir")
184+
listers_dir="$2"
167185
shift 2
168186
;;
169-
"--informers-name")
170-
informers_subdir="$2"
187+
"--listers-pkg")
188+
listers_pkg="$2"
171189
shift 2
172190
;;
173191
"--single-cluster-versioned-clientset-pkg")
@@ -178,13 +196,17 @@ function cluster::codegen::gen_client() {
178196
single_cluster_applyconfigurations_pkg="$2"
179197
shift 2
180198
;;
199+
"--single-cluster-informers-pkg")
200+
single_cluster_informers_pkg="$2"
201+
shift 2
202+
;;
181203
"--single-cluster-listers-pkg")
182204
single_cluster_listers_pkg="$2"
183205
shift 2
184206
;;
185-
"--single-cluster-informers-pkg")
186-
single_cluster_informers_pkg="$2"
187-
shift 2
207+
"--with-watch")
208+
watchable="true"
209+
shift
188210
;;
189211
"--plural-exceptions")
190212
plural_exceptions="$2"
@@ -209,14 +231,6 @@ function cluster::codegen::gen_client() {
209231
echo "input-dir argument is required" >&2
210232
return 1
211233
fi
212-
if [ -z "${out_dir}" ]; then
213-
echo "--output-dir is required" >&2
214-
return 1
215-
fi
216-
if [ -z "${out_pkg}" ]; then
217-
echo "--output-pkg is required" >&2
218-
return 1
219-
fi
220234
if [ -z "${single_cluster_versioned_clientset_pkg}" ]; then
221235
echo "--single-cluster-versioned-clientset-pkg is required" >&2
222236
return 1
@@ -226,8 +240,6 @@ function cluster::codegen::gen_client() {
226240
return 1
227241
fi
228242

229-
mkdir -p "${out_dir}"
230-
231243
(
232244
# To support running this from anywhere, first cd into this directory,
233245
# and then install with forced module mode on and fully qualified name.
@@ -271,9 +283,25 @@ function cluster::codegen::gen_client() {
271283

272284
echo "Generating cluster client code for ${#group_versions[@]} targets"
273285

286+
if [[ -z "${versioned_clientset_dir}" ]]; then
287+
if [ -z "${out_dir}" ]; then
288+
echo "--output-dir is required when no --versioned-clientset-dir is provided" >&2
289+
return 1
290+
fi
291+
versioned_clientset_dir="${out_dir}/clientset/versioned"
292+
fi
293+
294+
if [[ -z "${versioned_clientset_pkg}" ]]; then
295+
if [ -z "${out_pkg}" ]; then
296+
echo "--output-pkg is required when no --versioned-clientset-pkg is provided" >&2
297+
return 1
298+
fi
299+
versioned_clientset_pkg="${out_pkg}/clientset/versioned"
300+
fi
301+
274302
( cluster::codegen::internal::grep -l --null \
275303
-e '^// Code generated by cluster-client-gen. DO NOT EDIT.$' \
276-
-r "${out_dir}/${clientset_subdir}" \
304+
-r "${versioned_clientset_dir}" \
277305
--include '*.go' \
278306
|| true \
279307
) | xargs -0 rm -f
@@ -285,9 +313,8 @@ function cluster::codegen::gen_client() {
285313
"${gobin}/cluster-client-gen" \
286314
-v "${v}" \
287315
--go-header-file "${boilerplate}" \
288-
--output-dir "${out_dir}/${clientset_subdir}" \
289-
--output-pkg "${out_pkg}/${clientset_subdir}" \
290-
--clientset-name "${clientset_versioned_name}" \
316+
--output-dir "${versioned_clientset_dir}" \
317+
--output-pkg "${versioned_clientset_pkg}" \
291318
--input-base "$(cd "${in_dir}" && pwd -P)" `# must be absolute path or Go import path"` \
292319
--single-cluster-versioned-clientset-pkg "${single_cluster_versioned_clientset_pkg}" \
293320
--single-cluster-applyconfigurations-pkg "${single_cluster_applyconfigurations_pkg}" \
@@ -297,38 +324,70 @@ function cluster::codegen::gen_client() {
297324
if [ "${watchable}" == "true" ]; then
298325
echo "Generating cluster lister code for ${#input_pkgs[@]} targets"
299326

327+
if [[ -z "${listers_dir}" ]]; then
328+
if [ -z "${out_dir}" ]; then
329+
echo "--output-dir is required when no --listers-dir is provided" >&2
330+
return 1
331+
fi
332+
listers_dir="${out_dir}/listers"
333+
fi
334+
335+
if [[ -z "${listers_pkg}" ]]; then
336+
if [ -z "${out_pkg}" ]; then
337+
echo "--output-pkg is required when no --listers-pkg is provided" >&2
338+
return 1
339+
fi
340+
listers_pkg="${out_pkg}/listers"
341+
fi
342+
300343
( cluster::codegen::internal::grep -l --null \
301344
-e '^// Code generated by cluster-lister-gen. DO NOT EDIT.$' \
302-
-r "${out_dir}/${listers_subdir}" \
345+
-r "${listers_dir}" \
303346
--include '*.go' \
304347
|| true \
305348
) | xargs -0 rm -f
306349

307350
"${gobin}/cluster-lister-gen" \
308351
-v "${v}" \
309352
--go-header-file "${boilerplate}" \
310-
--output-dir "${out_dir}/${listers_subdir}" \
311-
--output-pkg "${out_pkg}/${listers_subdir}" \
353+
--output-dir "${listers_dir}" \
354+
--output-pkg "${listers_pkg}" \
312355
--single-cluster-listers-pkg "${single_cluster_listers_pkg}" \
313356
--plural-exceptions "${plural_exceptions}" \
314357
"${input_pkgs[@]}"
315358

316359
echo "Generating cluster informer code for ${#input_pkgs[@]} targets"
317360

361+
if [[ -z "${informers_dir}" ]]; then
362+
if [ -z "${out_dir}" ]; then
363+
echo "--output-dir is required when no --informers-dir is provided" >&2
364+
return 1
365+
fi
366+
informers_dir="${out_dir}/informers"
367+
fi
368+
369+
if [[ -z "${informers_pkg}" ]]; then
370+
if [ -z "${out_pkg}" ]; then
371+
echo "--output-pkg is required when no --informers-pkg is provided" >&2
372+
return 1
373+
fi
374+
informers_pkg="${out_pkg}/informers"
375+
fi
376+
318377
( cluster::codegen::internal::grep -l --null \
319378
-e '^// Code generated by cluster-informer-gen. DO NOT EDIT.$' \
320-
-r "${out_dir}/${informers_subdir}" \
379+
-r "${informers_dir}" \
321380
--include '*.go' \
322381
|| true \
323382
) | xargs -0 rm -f
324383

325384
"${gobin}/cluster-informer-gen" \
326385
-v "${v}" \
327386
--go-header-file "${boilerplate}" \
328-
--output-dir "${out_dir}/${informers_subdir}" \
329-
--output-pkg "${out_pkg}/${informers_subdir}" \
330-
--versioned-clientset-pkg "${out_pkg}/${clientset_subdir}/${clientset_versioned_name}" \
331-
--listers-pkg "${out_pkg}/${listers_subdir}" \
387+
--output-dir "${informers_dir}" \
388+
--output-pkg "${informers_pkg}" \
389+
--versioned-clientset-pkg "${versioned_clientset_pkg}" \
390+
--listers-pkg "${listers_pkg}" \
332391
--single-cluster-listers-pkg "${single_cluster_listers_pkg}" \
333392
--single-cluster-informers-pkg "${single_cluster_informers_pkg}" \
334393
--single-cluster-versioned-clientset-pkg "${single_cluster_versioned_clientset_pkg}" \

0 commit comments

Comments
 (0)