Skip to content

Commit 6707a99

Browse files
authored
Add fields to header (#3992)
* Crunchy Bridge clusters managed * Features gates enabled * Registration token * Build metadata Issues: [PGO-1610, PGO-1616, PGO-1618]
1 parent 66174ec commit 6707a99

File tree

14 files changed

+274
-132
lines changed

14 files changed

+274
-132
lines changed

Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ deploy-dev: createnamespaces
136136
CHECK_FOR_UPGRADES='$(if $(CHECK_FOR_UPGRADES),$(CHECK_FOR_UPGRADES),false)' \
137137
KUBECONFIG=hack/.kube/postgres-operator/pgo \
138138
PGO_NAMESPACE='postgres-operator' \
139+
PGO_INSTALLER='deploy-dev' \
140+
PGO_INSTALLER_ORIGIN='postgres-operator-repo' \
141+
BUILD_SOURCE='build-postgres-operator' \
139142
$(shell kubectl kustomize ./config/dev | \
140143
sed -ne '/^kind: Deployment/,/^---/ { \
141144
/RELATED_IMAGE_/ { N; s,.*\(RELATED_[^[:space:]]*\).*value:[[:space:]]*\([^[:space:]]*\),\1="\2",; p; }; \

cmd/postgres-operator/main.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func main() {
168168
registrar, err := registration.NewRunner(os.Getenv("RSA_KEY"), os.Getenv("TOKEN_PATH"), shutdown)
169169
assertNoError(err)
170170
assertNoError(mgr.Add(registrar))
171-
_ = registrar.CheckToken()
171+
token, _ := registrar.CheckToken()
172172

173173
// add all PostgreSQL Operator controllers to the runtime manager
174174
addControllersToManager(mgr, openshift, log, registrar)
@@ -188,8 +188,14 @@ func main() {
188188
if !upgradeCheckingDisabled {
189189
log.Info("upgrade checking enabled")
190190
// get the URL for the check for upgrades endpoint if set in the env
191-
assertNoError(upgradecheck.ManagedScheduler(mgr,
192-
openshift, os.Getenv("CHECK_FOR_UPGRADES_URL"), versionString))
191+
assertNoError(
192+
upgradecheck.ManagedScheduler(
193+
mgr,
194+
openshift,
195+
os.Getenv("CHECK_FOR_UPGRADES_URL"),
196+
versionString,
197+
token,
198+
))
193199
} else {
194200
log.Info("upgrade checking disabled")
195201
}

config/manager/manager.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ spec:
1212
- name: operator
1313
image: postgres-operator
1414
env:
15+
- name: PGO_INSTALLER
16+
value: kustomize
17+
- name: PGO_INSTALLER_ORIGIN
18+
value: postgres-operator-repo
1519
- name: PGO_NAMESPACE
1620
valueFrom:
1721
fieldRef:

internal/config/config_test.go

+28-44
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,6 @@ import (
1414
"github.com/crunchydata/postgres-operator/pkg/apis/postgres-operator.crunchydata.com/v1beta1"
1515
)
1616

17-
func saveEnv(t testing.TB, key string) {
18-
t.Helper()
19-
previous, ok := os.LookupEnv(key)
20-
t.Cleanup(func() {
21-
if ok {
22-
os.Setenv(key, previous)
23-
} else {
24-
os.Unsetenv(key)
25-
}
26-
})
27-
}
28-
29-
func setEnv(t testing.TB, key, value string) {
30-
t.Helper()
31-
saveEnv(t, key)
32-
assert.NilError(t, os.Setenv(key, value))
33-
}
34-
35-
func unsetEnv(t testing.TB, key string) {
36-
t.Helper()
37-
saveEnv(t, key)
38-
assert.NilError(t, os.Unsetenv(key))
39-
}
40-
4117
func TestFetchKeyCommand(t *testing.T) {
4218

4319
spec1 := v1beta1.PostgresClusterSpec{}
@@ -106,13 +82,14 @@ func TestFetchKeyCommand(t *testing.T) {
10682
func TestPGAdminContainerImage(t *testing.T) {
10783
cluster := &v1beta1.PostgresCluster{}
10884

109-
unsetEnv(t, "RELATED_IMAGE_PGADMIN")
85+
t.Setenv("RELATED_IMAGE_PGADMIN", "")
86+
os.Unsetenv("RELATED_IMAGE_PGADMIN")
11087
assert.Equal(t, PGAdminContainerImage(cluster), "")
11188

112-
setEnv(t, "RELATED_IMAGE_PGADMIN", "")
89+
t.Setenv("RELATED_IMAGE_PGADMIN", "")
11390
assert.Equal(t, PGAdminContainerImage(cluster), "")
11491

115-
setEnv(t, "RELATED_IMAGE_PGADMIN", "env-var-pgadmin")
92+
t.Setenv("RELATED_IMAGE_PGADMIN", "env-var-pgadmin")
11693
assert.Equal(t, PGAdminContainerImage(cluster), "env-var-pgadmin")
11794

11895
assert.NilError(t, yaml.Unmarshal([]byte(`{
@@ -124,13 +101,14 @@ func TestPGAdminContainerImage(t *testing.T) {
124101
func TestPGBackRestContainerImage(t *testing.T) {
125102
cluster := &v1beta1.PostgresCluster{}
126103

127-
unsetEnv(t, "RELATED_IMAGE_PGBACKREST")
104+
t.Setenv("RELATED_IMAGE_PGBACKREST", "")
105+
os.Unsetenv("RELATED_IMAGE_PGBACKREST")
128106
assert.Equal(t, PGBackRestContainerImage(cluster), "")
129107

130-
setEnv(t, "RELATED_IMAGE_PGBACKREST", "")
108+
t.Setenv("RELATED_IMAGE_PGBACKREST", "")
131109
assert.Equal(t, PGBackRestContainerImage(cluster), "")
132110

133-
setEnv(t, "RELATED_IMAGE_PGBACKREST", "env-var-pgbackrest")
111+
t.Setenv("RELATED_IMAGE_PGBACKREST", "env-var-pgbackrest")
134112
assert.Equal(t, PGBackRestContainerImage(cluster), "env-var-pgbackrest")
135113

136114
assert.NilError(t, yaml.Unmarshal([]byte(`{
@@ -142,13 +120,14 @@ func TestPGBackRestContainerImage(t *testing.T) {
142120
func TestPGBouncerContainerImage(t *testing.T) {
143121
cluster := &v1beta1.PostgresCluster{}
144122

145-
unsetEnv(t, "RELATED_IMAGE_PGBOUNCER")
123+
t.Setenv("RELATED_IMAGE_PGBOUNCER", "")
124+
os.Unsetenv("RELATED_IMAGE_PGBOUNCER")
146125
assert.Equal(t, PGBouncerContainerImage(cluster), "")
147126

148-
setEnv(t, "RELATED_IMAGE_PGBOUNCER", "")
127+
t.Setenv("RELATED_IMAGE_PGBOUNCER", "")
149128
assert.Equal(t, PGBouncerContainerImage(cluster), "")
150129

151-
setEnv(t, "RELATED_IMAGE_PGBOUNCER", "env-var-pgbouncer")
130+
t.Setenv("RELATED_IMAGE_PGBOUNCER", "env-var-pgbouncer")
152131
assert.Equal(t, PGBouncerContainerImage(cluster), "env-var-pgbouncer")
153132

154133
assert.NilError(t, yaml.Unmarshal([]byte(`{
@@ -160,13 +139,14 @@ func TestPGBouncerContainerImage(t *testing.T) {
160139
func TestPGExporterContainerImage(t *testing.T) {
161140
cluster := &v1beta1.PostgresCluster{}
162141

163-
unsetEnv(t, "RELATED_IMAGE_PGEXPORTER")
142+
t.Setenv("RELATED_IMAGE_PGEXPORTER", "")
143+
os.Unsetenv("RELATED_IMAGE_PGEXPORTER")
164144
assert.Equal(t, PGExporterContainerImage(cluster), "")
165145

166-
setEnv(t, "RELATED_IMAGE_PGEXPORTER", "")
146+
t.Setenv("RELATED_IMAGE_PGEXPORTER", "")
167147
assert.Equal(t, PGExporterContainerImage(cluster), "")
168148

169-
setEnv(t, "RELATED_IMAGE_PGEXPORTER", "env-var-pgexporter")
149+
t.Setenv("RELATED_IMAGE_PGEXPORTER", "env-var-pgexporter")
170150
assert.Equal(t, PGExporterContainerImage(cluster), "env-var-pgexporter")
171151

172152
assert.NilError(t, yaml.Unmarshal([]byte(`{
@@ -178,13 +158,14 @@ func TestPGExporterContainerImage(t *testing.T) {
178158
func TestStandalonePGAdminContainerImage(t *testing.T) {
179159
pgadmin := &v1beta1.PGAdmin{}
180160

181-
unsetEnv(t, "RELATED_IMAGE_STANDALONE_PGADMIN")
161+
t.Setenv("RELATED_IMAGE_STANDALONE_PGADMIN", "")
162+
os.Unsetenv("RELATED_IMAGE_STANDALONE_PGADMIN")
182163
assert.Equal(t, StandalonePGAdminContainerImage(pgadmin), "")
183164

184-
setEnv(t, "RELATED_IMAGE_STANDALONE_PGADMIN", "")
165+
t.Setenv("RELATED_IMAGE_STANDALONE_PGADMIN", "")
185166
assert.Equal(t, StandalonePGAdminContainerImage(pgadmin), "")
186167

187-
setEnv(t, "RELATED_IMAGE_STANDALONE_PGADMIN", "env-var-pgadmin")
168+
t.Setenv("RELATED_IMAGE_STANDALONE_PGADMIN", "env-var-pgadmin")
188169
assert.Equal(t, StandalonePGAdminContainerImage(pgadmin), "env-var-pgadmin")
189170

190171
assert.NilError(t, yaml.Unmarshal([]byte(`{
@@ -197,21 +178,22 @@ func TestPostgresContainerImage(t *testing.T) {
197178
cluster := &v1beta1.PostgresCluster{}
198179
cluster.Spec.PostgresVersion = 12
199180

200-
unsetEnv(t, "RELATED_IMAGE_POSTGRES_12")
181+
t.Setenv("RELATED_IMAGE_POSTGRES_12", "")
182+
os.Unsetenv("RELATED_IMAGE_POSTGRES_12")
201183
assert.Equal(t, PostgresContainerImage(cluster), "")
202184

203-
setEnv(t, "RELATED_IMAGE_POSTGRES_12", "")
185+
t.Setenv("RELATED_IMAGE_POSTGRES_12", "")
204186
assert.Equal(t, PostgresContainerImage(cluster), "")
205187

206-
setEnv(t, "RELATED_IMAGE_POSTGRES_12", "env-var-postgres")
188+
t.Setenv("RELATED_IMAGE_POSTGRES_12", "env-var-postgres")
207189
assert.Equal(t, PostgresContainerImage(cluster), "env-var-postgres")
208190

209191
cluster.Spec.Image = "spec-image"
210192
assert.Equal(t, PostgresContainerImage(cluster), "spec-image")
211193

212194
cluster.Spec.Image = ""
213195
cluster.Spec.PostGISVersion = "3.0"
214-
setEnv(t, "RELATED_IMAGE_POSTGRES_12_GIS_3.0", "env-var-postgis")
196+
t.Setenv("RELATED_IMAGE_POSTGRES_12_GIS_3.0", "env-var-postgis")
215197
assert.Equal(t, PostgresContainerImage(cluster), "env-var-postgis")
216198

217199
cluster.Spec.Image = "spec-image"
@@ -222,7 +204,9 @@ func TestVerifyImageValues(t *testing.T) {
222204
cluster := &v1beta1.PostgresCluster{}
223205

224206
verifyImageCheck := func(t *testing.T, envVar, errString string, cluster *v1beta1.PostgresCluster) {
225-
unsetEnv(t, envVar)
207+
208+
t.Setenv(envVar, "")
209+
os.Unsetenv(envVar)
226210
err := VerifyImageValues(cluster)
227211
assert.ErrorContains(t, err, errString)
228212
}

internal/controller/pgupgrade/jobs_test.go

+6-30
Original file line numberDiff line numberDiff line change
@@ -252,42 +252,17 @@ status: {}
252252
`))
253253
}
254254

255-
// saveEnv preserves environment variables so that any modifications needed for
256-
// the tests can be undone once completed.
257-
func saveEnv(t testing.TB, key string) {
258-
t.Helper()
259-
previous, ok := os.LookupEnv(key)
260-
t.Cleanup(func() {
261-
if ok {
262-
os.Setenv(key, previous)
263-
} else {
264-
os.Unsetenv(key)
265-
}
266-
})
267-
}
268-
269-
func setEnv(t testing.TB, key, value string) {
270-
t.Helper()
271-
saveEnv(t, key)
272-
assert.NilError(t, os.Setenv(key, value))
273-
}
274-
275-
func unsetEnv(t testing.TB, key string) {
276-
t.Helper()
277-
saveEnv(t, key)
278-
assert.NilError(t, os.Unsetenv(key))
279-
}
280-
281255
func TestPGUpgradeContainerImage(t *testing.T) {
282256
upgrade := &v1beta1.PGUpgrade{}
283257

284-
unsetEnv(t, "RELATED_IMAGE_PGUPGRADE")
258+
t.Setenv("RELATED_IMAGE_PGUPGRADE", "")
259+
os.Unsetenv("RELATED_IMAGE_PGUPGRADE")
285260
assert.Equal(t, pgUpgradeContainerImage(upgrade), "")
286261

287-
setEnv(t, "RELATED_IMAGE_PGUPGRADE", "")
262+
t.Setenv("RELATED_IMAGE_PGUPGRADE", "")
288263
assert.Equal(t, pgUpgradeContainerImage(upgrade), "")
289264

290-
setEnv(t, "RELATED_IMAGE_PGUPGRADE", "env-var-pgbackrest")
265+
t.Setenv("RELATED_IMAGE_PGUPGRADE", "env-var-pgbackrest")
291266
assert.Equal(t, pgUpgradeContainerImage(upgrade), "env-var-pgbackrest")
292267

293268
assert.NilError(t, yaml.Unmarshal(
@@ -299,7 +274,8 @@ func TestVerifyUpgradeImageValue(t *testing.T) {
299274
upgrade := &v1beta1.PGUpgrade{}
300275

301276
t.Run("crunchy-postgres", func(t *testing.T) {
302-
unsetEnv(t, "RELATED_IMAGE_PGUPGRADE")
277+
t.Setenv("RELATED_IMAGE_PGUPGRADE", "")
278+
os.Unsetenv("RELATED_IMAGE_PGUPGRADE")
303279
err := verifyUpgradeImageValue(upgrade)
304280
assert.ErrorContains(t, err, "crunchy-upgrade")
305281
})

internal/feature/features.go

+9
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,12 @@ func Enabled(ctx context.Context, f Feature) bool {
121121
func NewContext(ctx context.Context, gate Gate) context.Context {
122122
return context.WithValue(ctx, contextKey{}, gate)
123123
}
124+
125+
func ShowGates(ctx context.Context) string {
126+
featuresEnabled := ""
127+
gate, ok := ctx.Value(contextKey{}).(Gate)
128+
if ok {
129+
featuresEnabled = gate.String()
130+
}
131+
return featuresEnabled
132+
}

internal/feature/features_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,13 @@ func TestContext(t *testing.T) {
5353
t.Parallel()
5454
gate := NewGate()
5555
ctx := NewContext(context.Background(), gate)
56+
assert.Equal(t, ShowGates(ctx), "")
5657

5758
assert.NilError(t, gate.Set("TablespaceVolumes=true"))
5859
assert.Assert(t, true == Enabled(ctx, TablespaceVolumes))
60+
assert.Equal(t, ShowGates(ctx), "TablespaceVolumes=true")
5961

6062
assert.NilError(t, gate.SetFromMap(map[string]bool{TablespaceVolumes: false}))
6163
assert.Assert(t, false == Enabled(ctx, TablespaceVolumes))
64+
assert.Equal(t, ShowGates(ctx), "TablespaceVolumes=false")
6265
}

internal/registration/runner.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,14 @@ func NewRunner(publicKey, tokenPath string, changed func()) (*Runner, error) {
7676
}
7777

7878
// CheckToken loads and verifies the configured token, returning an error when
79-
// the file exists but cannot be verified.
80-
func (r *Runner) CheckToken() error {
79+
// the file exists but cannot be verified, and
80+
// returning the token if it can be verified.
81+
// NOTE(upgradecheck): return the token/nil so that we can use the token
82+
// in upgradecheck; currently a refresh of the token will cause a restart of the pod
83+
// meaning that the token used in upgradecheck is always the current token.
84+
// But if the restart behavior changes, we might drop the token return in main.go
85+
// and change upgradecheck to retrieve the token itself
86+
func (r *Runner) CheckToken() (*jwt.Token, error) {
8187
data, errFile := os.ReadFile(r.tokenPath)
8288
key := func(*jwt.Token) (any, error) { return r.publicKey, nil }
8389

@@ -86,7 +92,7 @@ func (r *Runner) CheckToken() error {
8692
r.token.Lock()
8793
defer r.token.Unlock()
8894

89-
_, errToken := jwt.ParseWithClaims(string(data), &r.token, key,
95+
token, errToken := jwt.ParseWithClaims(string(data), &r.token, key,
9096
jwt.WithExpirationRequired(),
9197
jwt.WithValidMethods([]string{"RS256"}),
9298
)
@@ -102,11 +108,11 @@ func (r *Runner) CheckToken() error {
102108

103109
switch {
104110
case !r.enabled || !r.token.Exists:
105-
return nil
111+
return nil, nil
106112
case errFile != nil:
107-
return errFile
113+
return nil, errFile
108114
default:
109-
return errToken
115+
return token, errToken
110116
}
111117
}
112118

@@ -168,7 +174,7 @@ func (r *Runner) Start(ctx context.Context) error {
168174
select {
169175
case <-ticks:
170176
_, before := r.state()
171-
if err := r.CheckToken(); err != nil {
177+
if _, err := r.CheckToken(); err != nil {
172178
log.Error(err, "Unable to validate token")
173179
}
174180
if _, after := r.state(); before != after && r.changed != nil {

0 commit comments

Comments
 (0)