@@ -25,11 +25,11 @@ SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}")
2525. " ${SCRIPT_DIR} /../lib.sh"
2626
2727function usage() {
28- echo " usage: $0 [repo...]" > /dev/stderr
29- echo " example:" > /dev/stderr
30- echo " $0 # do all projects" > /dev/stderr
31- echo " $0 k8s-infra-node-e2e-project # just do one" > /dev/stderr
32- echo > /dev/stderr
28+ echo " usage: $0 [repo...]" > /dev/stderr
29+ echo " example:" > /dev/stderr
30+ echo " $0 # do all projects" > /dev/stderr
31+ echo " $0 k8s-infra-node-e2e-project # just do one" > /dev/stderr
32+ echo > /dev/stderr
3333}
3434
3535# # projects hosting prow build clusters managed by sig-k8s-infra
@@ -47,170 +47,171 @@ mapfile -t E2E_PROJECTS < <(k8s_infra_projects "e2e")
4747readonly E2E_PROJECTS
4848
4949function ensure_e2e_project() {
50- if [ $# != 1 ] || [ -z " $1 " ]; then
51- echo " ${FUNCNAME[0]} (project) requires 1 argument" >&2
52- return 1
53- fi
54- local prj=" ${1} "
55-
56- ensure_project " ${prj} "
57-
58- local project_number
59- project_number=$( gcloud projects describe " ${prj} " --format=' value(projectNumber)' )
60-
61- color 6 " Ensure stale role bindings have been removed from e2e project: ${prj} "
62- (
63- echo " no stale bindings slated for removal"
64- ) 2>&1 | indent
65-
66- color 6 " Ensuring only APIs necessary for kubernetes e2e jobs to use e2e project: ${prj} "
67- ensure_only_services " ${prj} " \
68- cloudkms.googleapis.com \
69- compute.googleapis.com \
70- container.googleapis.com \
71- containerregistry.googleapis.com \
72- file.googleapis.com \
73- logging.googleapis.com \
74- monitoring.googleapis.com \
75- storage-component.googleapis.com
76-
77- # TODO: this is what prow.k8s.io uses today, but seems overprivileged, we
78- # could consider using a more limited custom IAM role instead
79- color 6 " Empower prow-build service account to edit e2e project: ${prj} "
80- ensure_project_role_binding " ${prj} " \
81- " serviceAccount:${PROW_BUILD_SVCACCT} " \
82- " roles/editor"
83-
84- # TODO: Remove this binding and clean up permissions in projects
85- # This permission is superseded by roles/cloudkms.admin below
86- # Ensure GCP CSI driver tests can manage KMS keys
87- ensure_project_role_binding " ${prj} " \
88- " serviceAccount:${PROW_BUILD_SVCACCT} " \
89- " roles/cloudkms.cryptoKeyEncrypterDecrypter"
90-
91- # Ensure GCP Default Compute Service Account can administer KMS keys
92- ensure_project_role_binding " ${prj} " \
93- " serviceAccount:${PROW_BUILD_SVCACCT} " \
94- " roles/cloudkms.admin"
95-
96- # TODO: Remove this binding and clean up permissions in projects
97- # Ensure GCP Default Compute Service Account can manage KMS keys
98- ensure_project_role_binding " ${prj} " \
99- " serviceAccount:${project_number} [email protected] " \
100- " roles/cloudkms.cryptoKeyEncrypterDecrypter"
101-
102- # Ensure GCP Default Compute Engine Service Agent Account can manage KMS
103- # keys
104- ensure_project_role_binding " ${prj} " \
105- " serviceAccount:service-${project_number} @compute-system.iam.gserviceaccount.com" \
106- " roles/cloudkms.cryptoKeyEncrypterDecrypter"
107-
108- # TODO: Remove this binding and clean up permissions in projects
109- # Ensure GCP CSI driver tests can use prow-build service account to
110- # act as all other service accounts (eg: Compute Engine default service account)
111- ensure_project_role_binding " ${prj} " \
112- " serviceAccount:${PROW_BUILD_SVCACCT} " \
113- " roles/iam.serviceAccountUser"
114-
115- # TODO: this is what prow.k8s.io uses today, but seems overprivileged, we
116- # could consider using a more limited custom IAM role instead
117- color 6 " Empower boskos-janitor service account to clean e2e project: ${prj} "
118- ensure_project_role_binding " ${prj} " \
119- " serviceAccount:${BOSKOS_JANITOR_SVCACCT} " \
120- " roles/editor"
121-
122- color 6
" Empower [email protected] to admin e2e project: ${prj} " 50+ if [ $# != 1 ] || [ -z " $1 " ]; then
51+ echo " ${FUNCNAME[0]} (project) requires 1 argument" >&2
52+ return 1
53+ fi
54+ local prj=" ${1} "
55+
56+ ensure_project " ${prj} "
57+
58+ local project_number
59+ project_number=$( gcloud projects describe " ${prj} " --format=' value(projectNumber)' )
60+
61+ color 6 " Ensure stale role bindings have been removed from e2e project: ${prj} "
62+ (
63+ echo " no stale bindings slated for removal"
64+ ) 2>&1 | indent
65+
66+ color 6 " Ensuring only APIs necessary for kubernetes e2e jobs to use e2e project: ${prj} "
67+ ensure_only_services " ${prj} " \
68+ artifactregistry.googleapis.com \
69+ cloudkms.googleapis.com \
70+ compute.googleapis.com \
71+ container.googleapis.com \
72+ containerregistry.googleapis.com \
73+ file.googleapis.com \
74+ logging.googleapis.com \
75+ monitoring.googleapis.com \
76+ storage-component.googleapis.com
77+
78+ # TODO: this is what prow.k8s.io uses today, but seems overprivileged, we
79+ # could consider using a more limited custom IAM role instead
80+ color 6 " Empower prow-build service account to edit e2e project: ${prj} "
81+ ensure_project_role_binding " ${prj} " \
82+ " serviceAccount:${PROW_BUILD_SVCACCT} " \
83+ " roles/editor"
84+
85+ # TODO: Remove this binding and clean up permissions in projects
86+ # This permission is superseded by roles/cloudkms.admin below
87+ # Ensure GCP CSI driver tests can manage KMS keys
88+ ensure_project_role_binding " ${prj} " \
89+ " serviceAccount:${PROW_BUILD_SVCACCT} " \
90+ " roles/cloudkms.cryptoKeyEncrypterDecrypter"
91+
92+ # Ensure GCP Default Compute Service Account can administer KMS keys
93+ ensure_project_role_binding " ${prj} " \
94+ " serviceAccount:${PROW_BUILD_SVCACCT} " \
95+ " roles/cloudkms.admin"
96+
97+ # TODO: Remove this binding and clean up permissions in projects
98+ # Ensure GCP Default Compute Service Account can manage KMS keys
99+ ensure_project_role_binding " ${prj} " \
100+ " serviceAccount:${project_number} [email protected] " \
101+ " roles/cloudkms.cryptoKeyEncrypterDecrypter"
102+
103+ # Ensure GCP Default Compute Engine Service Agent Account can manage KMS
104+ # keys
105+ ensure_project_role_binding " ${prj} " \
106+ " serviceAccount:service-${project_number} @compute-system.iam.gserviceaccount.com" \
107+ " roles/cloudkms.cryptoKeyEncrypterDecrypter"
108+
109+ # TODO: Remove this binding and clean up permissions in projects
110+ # Ensure GCP CSI driver tests can use prow-build service account to
111+ # act as all other service accounts (eg: Compute Engine default service account)
112+ ensure_project_role_binding " ${prj} " \
113+ " serviceAccount:${PROW_BUILD_SVCACCT} " \
114+ " roles/iam.serviceAccountUser"
115+
116+ # TODO: this is what prow.k8s.io uses today, but seems overprivileged, we
117+ # could consider using a more limited custom IAM role instead
118+ color 6 " Empower boskos-janitor service account to clean e2e project: ${prj} "
119+ ensure_project_role_binding " ${prj} " \
120+ " serviceAccount:${BOSKOS_JANITOR_SVCACCT} " \
121+ " roles/editor"
122+
123+ color 6
" Empower [email protected] to admin e2e project: ${prj} " 124+ ensure_project_role_binding " ${prj} " \
125+ 126+ " roles/owner"
127+
128+ # NB: prow.viewer role is defined in ensure-organization.sh, that needs to have been run first
129+ color 6
" Empower [email protected] to view specific resources in e2e project: ${prj} " 130+ ensure_project_role_binding " ${prj} " \
131+ 132+ " $( custom_org_role_name " prow.viewer" ) "
133+
134+ if [[ " ${prj} " =~ k8s-infra-e2e.* scale ]]; then
135+ color 6
" Empower [email protected] to admin e2e project: ${prj} " 123136 ensure_project_role_binding " ${prj} " \
124- " group:k8s-infra-prow [email protected] " \
137+ " group:k8s-infra-sig-scalability [email protected] " \
125138 " roles/owner"
139+ fi
140+
141+ color 6 " Ensure prow-build prowjobs are able to ssh to instances in e2e project: ${prj} "
142+ prow_build_ssh_pubkey=" prow:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCmYxHh/wwcV0P1aChuFLpl28w6DFyc7G5Xrw1F8wH1Re9AdxyemM2bTZ/PhsP3u9VDnNbyOw3UN00VFdumkFLjLf1WQ7Q6rZDlPjlw7urBIvAMqUecY6ae1znqsZ0dMBxOuPXHznlnjLjM5b7O7q5WsQMCA9Szbmz6DsuSyCuX0It2osBTN+8P/Fa6BNh3W8AF60M7L8/aUzLfbXVS2LIQKAHHD8CWqvXhLPuTJ03iSwFvgtAK1/J2XJwUP+OzAFrxj6A9LW5ZZgk3R3kRKr0xT/L7hga41rB1qy8Uz+Xr/PTVMNGW+nmU4bPgFchCK0JBK7B12ZcdVVFUEdpaAiKZ prow"
143+ k8s_prow_builds_ssh_pubkey=" prow:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+/ZdafYYrJknk08g98sYS1Nr+aVdAnhHpQyXBx7EAT9pazCGaoiYnXgC82FAfTVMqdsqnIiP+7FgQTFLNYvBt8KsBd9qCkuMh/Q1QYVh4kfjjuGUrjfo020pxGSvp+67kbxm6lubaio9AgJ9XXE+SP1AYbyKTvXEzk5Tu7gGnRt3OrjVB+9eqTnVJOjS/BAOTJV5DWQ7xMubHlT9NmQ/S2hotMoiJJybYGUalOfcf8ZkyspU2oR+x13DCfjvFdzF4U0fb/uvTJZeu22w887M5y0YQulFY2LIeoAUE4XwoOv0nxzwbtZpqPHwtfLgq3G906KHW5e6slXu8kGda656n prow"
144+ ssh_keys_expected=(
145+ " ${k8s_prow_builds_ssh_pubkey} "
146+ " ${prow_build_ssh_pubkey} "
147+ # TODO(amwat,spiffxp): something is adding an extra prow: prefix, it is
148+ # unclear where in prow->kubetest2->cluster/log-dump.sh->`gcloud ssh`
149+ # this is happening
150+ " prow:${k8s_prow_builds_ssh_pubkey} "
151+ " prow:${prow_build_ssh_pubkey} "
152+ )
153+
154+ # append to project-wide ssh-keys metadata if not present
155+ ssh_keys_before=" ${TMPDIR} /ssh-keys.before.txt"
156+ ssh_keys_after=" ${TMPDIR} /ssh-keys.after.txt"
157+ gcloud compute project-info describe --project=" ${prj} " \
158+ --format=' value(commonInstanceMetadata.items.filter(key:ssh-keys).extract(value).flatten())' |
159+ sed -e ' /^$/d' > " ${ssh_keys_before} "
160+
161+ cp " ${ssh_keys_before} " " ${ssh_keys_after} "
162+
163+ if [ " ${K8S_INFRA_ENSURE_E2E_PROJECTS_RESETS_SSH_KEYS:- " false" } " == " true" ]; then
164+ printf ' %s\n' " ${ssh_keys_expected[@]} " > " ${ssh_keys_after} "
165+ else
166+ for ssh_key in " ${ssh_keys_expected[@]} " ; do
167+ if ! grep -q " ${ssh_key} " " ${ssh_keys_before} " ; then
168+ echo " ${ssh_key} " >> " ${ssh_keys_after} "
169+ fi
170+ done
171+ fi
126172
127- # NB: prow.viewer role is defined in ensure-organization.sh, that needs to have been run first
128- color 6
" Empower [email protected] to view specific resources in e2e project: ${prj} " 129- ensure_project_role_binding " ${prj} " \
130- 131- " $( custom_org_role_name " prow.viewer" ) "
132-
133- if [[ " ${prj} " =~ k8s-infra-e2e.* scale ]]; then
134- color 6
" Empower [email protected] to admin e2e project: ${prj} " 135- ensure_project_role_binding " ${prj} " \
136- 137- " roles/owner"
138- fi
139-
140- color 6 " Ensure prow-build prowjobs are able to ssh to instances in e2e project: ${prj} "
141- prow_build_ssh_pubkey=" prow:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCmYxHh/wwcV0P1aChuFLpl28w6DFyc7G5Xrw1F8wH1Re9AdxyemM2bTZ/PhsP3u9VDnNbyOw3UN00VFdumkFLjLf1WQ7Q6rZDlPjlw7urBIvAMqUecY6ae1znqsZ0dMBxOuPXHznlnjLjM5b7O7q5WsQMCA9Szbmz6DsuSyCuX0It2osBTN+8P/Fa6BNh3W8AF60M7L8/aUzLfbXVS2LIQKAHHD8CWqvXhLPuTJ03iSwFvgtAK1/J2XJwUP+OzAFrxj6A9LW5ZZgk3R3kRKr0xT/L7hga41rB1qy8Uz+Xr/PTVMNGW+nmU4bPgFchCK0JBK7B12ZcdVVFUEdpaAiKZ prow"
142- k8s_prow_builds_ssh_pubkey=" prow:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+/ZdafYYrJknk08g98sYS1Nr+aVdAnhHpQyXBx7EAT9pazCGaoiYnXgC82FAfTVMqdsqnIiP+7FgQTFLNYvBt8KsBd9qCkuMh/Q1QYVh4kfjjuGUrjfo020pxGSvp+67kbxm6lubaio9AgJ9XXE+SP1AYbyKTvXEzk5Tu7gGnRt3OrjVB+9eqTnVJOjS/BAOTJV5DWQ7xMubHlT9NmQ/S2hotMoiJJybYGUalOfcf8ZkyspU2oR+x13DCfjvFdzF4U0fb/uvTJZeu22w887M5y0YQulFY2LIeoAUE4XwoOv0nxzwbtZpqPHwtfLgq3G906KHW5e6slXu8kGda656n prow"
143- ssh_keys_expected=(
144- " ${k8s_prow_builds_ssh_pubkey} "
145- " ${prow_build_ssh_pubkey} "
146- # TODO(amwat,spiffxp): something is adding an extra prow: prefix, it is
147- # unclear where in prow->kubetest2->cluster/log-dump.sh->`gcloud ssh`
148- # this is happening
149- " prow:${k8s_prow_builds_ssh_pubkey} "
150- " prow:${prow_build_ssh_pubkey} "
151- )
152-
153- # append to project-wide ssh-keys metadata if not present
154- ssh_keys_before=" ${TMPDIR} /ssh-keys.before.txt"
155- ssh_keys_after=" ${TMPDIR} /ssh-keys.after.txt"
156- gcloud compute project-info describe --project=" ${prj} " \
157- --format=' value(commonInstanceMetadata.items.filter(key:ssh-keys).extract(value).flatten())' \
158- | sed -e ' /^$/d' > " ${ssh_keys_before} "
159-
160- cp " ${ssh_keys_before} " " ${ssh_keys_after} "
161-
162- if [ " ${K8S_INFRA_ENSURE_E2E_PROJECTS_RESETS_SSH_KEYS:- " false" } " == " true" ]; then
163- printf ' %s\n' " ${ssh_keys_expected[@]} " > " ${ssh_keys_after} "
164- else
165- for ssh_key in " ${ssh_keys_expected[@]} " ; do
166- if ! grep -q " ${ssh_key} " " ${ssh_keys_before} " ; then
167- echo " ${ssh_key} " >> " ${ssh_keys_after} "
168- fi
169- done
170- fi
171-
172- if ! diff " ${ssh_keys_before} " " ${ssh_keys_after} " > /dev/null; then
173- gcloud compute project-info add-metadata --project=" ${prj} " \
174- --metadata-from-file ssh-keys=" ${ssh_keys_after} "
175- diff_colorized " ${ssh_keys_before} " " ${ssh_keys_after} "
176- fi
173+ if ! diff " ${ssh_keys_before} " " ${ssh_keys_after} " > /dev/null; then
174+ gcloud compute project-info add-metadata --project=" ${prj} " \
175+ --metadata-from-file ssh-keys=" ${ssh_keys_after} "
176+ diff_colorized " ${ssh_keys_before} " " ${ssh_keys_after} "
177+ fi
177178}
178179
179180# Disable OS Login at the project level
180181# $1 The GCP Project
181182function disable_project_oslogin() {
182- if [ $# != 1 ] || [ -z " $1 " ]; then
183- echo " ${FUNCNAME[0]} (project) requires 1 argument" >&2
184- return 1
185- fi
186-
187- local prj=" ${1} "
188-
189- enabled=$( gcloud compute project-info describe --project=" ${prj} " \
190- --format=' value(commonInstanceMetadata.items[enable-oslogin])' )
191- if [ " ${enabled} " == " TRUE" ]; then
192- gcloud compute project-info --project=" ${prj} " remove-metadata --keys " enable-oslogin"
193- fi
183+ if [ $# != 1 ] || [ -z " $1 " ]; then
184+ echo " ${FUNCNAME[0]} (project) requires 1 argument" >&2
185+ return 1
186+ fi
187+
188+ local prj=" ${1} "
189+
190+ enabled=$( gcloud compute project-info describe --project=" ${prj} " \
191+ --format=' value(commonInstanceMetadata.items[enable-oslogin])' )
192+ if [ " ${enabled} " == " TRUE" ]; then
193+ gcloud compute project-info --project=" ${prj} " remove-metadata --keys " enable-oslogin"
194+ fi
194195}
195196
196197function ensure_e2e_projects() {
197- # default to all staging projects
198- if [ $# = 0 ]; then
199- set -- " ${E2E_PROJECTS[@]} "
198+ # default to all staging projects
199+ if [ $# = 0 ]; then
200+ set -- " ${E2E_PROJECTS[@]} "
201+ fi
202+
203+ for project in " ${@ } " ; do
204+ if ! (printf ' %s\n' " ${E2E_PROJECTS[@]} " | grep -q " ^${project} $" ); then
205+ color 2 " Skipping unrecognized e2e project name: ${project} "
206+ continue
200207 fi
201208
202- for project in " ${@ } " ; do
203- if ! (printf ' %s\n' " ${E2E_PROJECTS[@]} " | grep -q " ^${project} $" ); then
204- color 2 " Skipping unrecognized e2e project name: ${project} "
205- continue
206- fi
207-
208- color 3 " Configuring e2e project: ${project} "
209- ensure_e2e_project " ${project} " 2>&1 | indent
209+ color 3 " Configuring e2e project: ${project} "
210+ ensure_e2e_project " ${project} " 2>&1 | indent
210211
211- # color 3 "Ensuring OS Login is disabled for $project"
212- # disable_project_oslogin "${project}" 2>&1 | indent
213- done
212+ # color 3 "Ensuring OS Login is disabled for $project"
213+ # disable_project_oslogin "${project}" 2>&1 | indent
214+ done
214215}
215216
216217#
0 commit comments