Skip to content

Commit 77b6cbc

Browse files
authored
Merge pull request #318 from arangodb/feature/jwt-keyfile
Use jwt-keyfile option if available.
2 parents 11ed832 + fd28f2c commit 77b6cbc

File tree

10 files changed

+151
-100
lines changed

10 files changed

+151
-100
lines changed

dashboard/assets.go

Lines changed: 65 additions & 65 deletions
Large diffs are not rendered by default.

pkg/deployment/images.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ func (ib *imagesBuilder) fetchArangoDBImageIDAndVersion(ctx context.Context, ima
198198
}
199199
}
200200
if err := k8sutil.CreateArangodPod(ib.KubeCli, true, ib.APIObject, role, id, podName, "", image, "", "", ib.Spec.GetImagePullPolicy(), "", false, terminationGracePeriod, args, env, nil, nil, nil,
201-
tolerations, serviceAccountName, "", "", nil); err != nil {
201+
tolerations, serviceAccountName, "", "", "", nil); err != nil {
202202
log.Debug().Err(err).Msg("Failed to create image ID pod")
203203
return true, maskAny(err)
204204
}

pkg/deployment/members.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ func createMember(log zerolog.Logger, status *api.DeploymentStatus, group api.Se
9090
case api.ServerGroupSingle:
9191
log.Debug().Str("id", id).Msg("Adding single server")
9292
if err := status.Members.Add(api.MemberStatus{
93-
ID: id,
94-
CreatedAt: metav1.Now(),
95-
Phase: api.MemberPhaseNone,
93+
ID: id,
94+
CreatedAt: metav1.Now(),
95+
Phase: api.MemberPhaseNone,
9696
PersistentVolumeClaimName: k8sutil.CreatePersistentVolumeClaimName(deploymentName, role, id),
9797
PodName: "",
9898
}, group); err != nil {
@@ -101,9 +101,9 @@ func createMember(log zerolog.Logger, status *api.DeploymentStatus, group api.Se
101101
case api.ServerGroupAgents:
102102
log.Debug().Str("id", id).Msg("Adding agent")
103103
if err := status.Members.Add(api.MemberStatus{
104-
ID: id,
105-
CreatedAt: metav1.Now(),
106-
Phase: api.MemberPhaseNone,
104+
ID: id,
105+
CreatedAt: metav1.Now(),
106+
Phase: api.MemberPhaseNone,
107107
PersistentVolumeClaimName: k8sutil.CreatePersistentVolumeClaimName(deploymentName, role, id),
108108
PodName: "",
109109
}, group); err != nil {
@@ -112,9 +112,9 @@ func createMember(log zerolog.Logger, status *api.DeploymentStatus, group api.Se
112112
case api.ServerGroupDBServers:
113113
log.Debug().Str("id", id).Msg("Adding dbserver")
114114
if err := status.Members.Add(api.MemberStatus{
115-
ID: id,
116-
CreatedAt: metav1.Now(),
117-
Phase: api.MemberPhaseNone,
115+
ID: id,
116+
CreatedAt: metav1.Now(),
117+
Phase: api.MemberPhaseNone,
118118
PersistentVolumeClaimName: k8sutil.CreatePersistentVolumeClaimName(deploymentName, role, id),
119119
PodName: "",
120120
}, group); err != nil {
@@ -123,9 +123,9 @@ func createMember(log zerolog.Logger, status *api.DeploymentStatus, group api.Se
123123
case api.ServerGroupCoordinators:
124124
log.Debug().Str("id", id).Msg("Adding coordinator")
125125
if err := status.Members.Add(api.MemberStatus{
126-
ID: id,
127-
CreatedAt: metav1.Now(),
128-
Phase: api.MemberPhaseNone,
126+
ID: id,
127+
CreatedAt: metav1.Now(),
128+
Phase: api.MemberPhaseNone,
129129
PersistentVolumeClaimName: "",
130130
PodName: "",
131131
}, group); err != nil {
@@ -134,9 +134,9 @@ func createMember(log zerolog.Logger, status *api.DeploymentStatus, group api.Se
134134
case api.ServerGroupSyncMasters:
135135
log.Debug().Str("id", id).Msg("Adding syncmaster")
136136
if err := status.Members.Add(api.MemberStatus{
137-
ID: id,
138-
CreatedAt: metav1.Now(),
139-
Phase: api.MemberPhaseNone,
137+
ID: id,
138+
CreatedAt: metav1.Now(),
139+
Phase: api.MemberPhaseNone,
140140
PersistentVolumeClaimName: "",
141141
PodName: "",
142142
}, group); err != nil {
@@ -145,9 +145,9 @@ func createMember(log zerolog.Logger, status *api.DeploymentStatus, group api.Se
145145
case api.ServerGroupSyncWorkers:
146146
log.Debug().Str("id", id).Msg("Adding syncworker")
147147
if err := status.Members.Add(api.MemberStatus{
148-
ID: id,
149-
CreatedAt: metav1.Now(),
150-
Phase: api.MemberPhaseNone,
148+
ID: id,
149+
CreatedAt: metav1.Now(),
150+
Phase: api.MemberPhaseNone,
151151
PersistentVolumeClaimName: "",
152152
PodName: "",
153153
}, group); err != nil {

pkg/deployment/resources/pod_creator.go

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,20 @@ func versionHasAdvertisedEndpoint(v driver.Version) bool {
6565
return v.CompareTo("3.4.0") >= 0
6666
}
6767

68+
// versionHasJWTSecretKeyfile derives from the version number of arangod has
69+
// the option --auth.jwt-secret-keyfile which can take the JWT secret from
70+
// a file in the file system.
71+
func versionHasJWTSecretKeyfile(v driver.Version) bool {
72+
if v.CompareTo("3.3.22") >= 0 && v.CompareTo("3.4.0") < 0 {
73+
return true
74+
}
75+
if v.CompareTo("3.4.2") >= 0 {
76+
return true
77+
}
78+
79+
return false
80+
}
81+
6882
// createArangodArgs creates command line arguments for an arangod server in the given group.
6983
func createArangodArgs(apiObject metav1.Object, deplSpec api.DeploymentSpec, group api.ServerGroup,
7084
agents api.MemberStatusList, id string, version driver.Version, autoUpgrade bool) []string {
@@ -85,8 +99,17 @@ func createArangodArgs(apiObject metav1.Object, deplSpec api.DeploymentSpec, gro
8599
// With authentication
86100
options = append(options,
87101
optionPair{"--server.authentication", "true"},
88-
optionPair{"--server.jwt-secret", "$(" + constants.EnvArangodJWTSecret + ")"},
89102
)
103+
if versionHasJWTSecretKeyfile(version) {
104+
keyPath := filepath.Join(k8sutil.ClusterJWTSecretVolumeMountDir, constants.SecretKeyToken)
105+
options = append(options,
106+
optionPair{"--server.jwt-secret-keyfile", keyPath},
107+
)
108+
} else {
109+
options = append(options,
110+
optionPair{"--server.jwt-secret", "$(" + constants.EnvArangodJWTSecret + ")"},
111+
)
112+
}
90113
} else {
91114
// Without authentication
92115
options = append(options,
@@ -499,17 +522,18 @@ func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string,
499522
// Create pod
500523
if group.IsArangod() {
501524
// Prepare arguments
525+
version := imageInfo.ArangoDBVersion
502526
autoUpgrade := m.Conditions.IsTrue(api.ConditionTypeAutoUpgrade)
503527
if autoUpgrade {
504528
newPhase = api.MemberPhaseUpgrading
505529
}
506-
args := createArangodArgs(apiObject, spec, group, status.Members.Agents, m.ID, imageInfo.ArangoDBVersion, autoUpgrade)
530+
args := createArangodArgs(apiObject, spec, group, status.Members.Agents, m.ID, version, autoUpgrade)
507531
env := make(map[string]k8sutil.EnvValue)
508532
livenessProbe, err := r.createLivenessProbe(spec, group)
509533
if err != nil {
510534
return maskAny(err)
511535
}
512-
readinessProbe, err := r.createReadinessProbe(spec, group, imageInfo.ArangoDBVersion)
536+
readinessProbe, err := r.createReadinessProbe(spec, group, version)
513537
if err != nil {
514538
return maskAny(err)
515539
}
@@ -535,11 +559,21 @@ func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string,
535559
return maskAny(errors.Wrapf(err, "RocksDB encryption key secret validation failed"))
536560
}
537561
}
562+
// Check cluster JWT secret
563+
var clusterJWTSecretName string
538564
if spec.IsAuthenticated() {
539-
env[constants.EnvArangodJWTSecret] = k8sutil.EnvValue{
540-
SecretName: spec.Authentication.GetJWTSecretName(),
541-
SecretKey: constants.SecretKeyToken,
565+
if versionHasJWTSecretKeyfile(version) {
566+
clusterJWTSecretName = spec.Authentication.GetJWTSecretName()
567+
if err := k8sutil.ValidateTokenSecret(secrets, clusterJWTSecretName); err != nil {
568+
return maskAny(errors.Wrapf(err, "Cluster JWT secret validation failed"))
569+
}
570+
} else {
571+
env[constants.EnvArangodJWTSecret] = k8sutil.EnvValue{
572+
SecretName: spec.Authentication.GetJWTSecretName(),
573+
SecretKey: constants.SecretKeyToken,
574+
}
542575
}
576+
543577
}
544578

545579
if spec.License.HasSecretName() {
@@ -554,7 +588,7 @@ func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string,
554588
finalizers := r.createPodFinalizers(group)
555589
if err := k8sutil.CreateArangodPod(kubecli, spec.IsDevelopment(), apiObject, role, m.ID, m.PodName, m.PersistentVolumeClaimName, imageInfo.ImageID, lifecycleImage, alpineImage, spec.GetImagePullPolicy(),
556590
engine, requireUUID, terminationGracePeriod, args, env, finalizers, livenessProbe, readinessProbe, tolerations, serviceAccountName, tlsKeyfileSecretName, rocksdbEncryptionSecretName,
557-
groupSpec.GetNodeSelector()); err != nil {
591+
clusterJWTSecretName, groupSpec.GetNodeSelector()); err != nil {
558592
return maskAny(err)
559593
}
560594
log.Debug().Str("pod-name", m.PodName).Msg("Created pod")

pkg/logging/logger.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ var (
3636
// The defaultLevels list is used during development to increase the
3737
// default level for components that we care a little less about.
3838
defaultLevels = map[string]string{
39-
//"operator": "info",
40-
//"something.status": "info",
39+
//"operator": "info",
40+
//"something.status": "info",
4141
}
4242
)
4343

pkg/operator/operator_deployment_relication.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func (o *Operator) onDeleteArangoDeploymentReplication(obj interface{}) {
109109
Str("name", apiObject.GetObjectMeta().GetName()).
110110
Msg("ArangoDeploymentReplication deleted")
111111
ev := &Event{
112-
Type: kwatch.Deleted,
112+
Type: kwatch.Deleted,
113113
DeploymentReplication: apiObject,
114114
}
115115

@@ -124,7 +124,7 @@ func (o *Operator) onDeleteArangoDeploymentReplication(obj interface{}) {
124124
// syncArangoDeploymentReplication synchronized the given deployment replication.
125125
func (o *Operator) syncArangoDeploymentReplication(apiObject *api.ArangoDeploymentReplication) {
126126
ev := &Event{
127-
Type: kwatch.Added,
127+
Type: kwatch.Added,
128128
DeploymentReplication: apiObject,
129129
}
130130
// re-watch or restart could give ADD event.

pkg/replication/deployment_replication.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func New(config Config, deps Dependencies, apiObject *api.ArangoDeploymentReplic
112112
// This sends an update event in the event queue.
113113
func (dr *DeploymentReplication) Update(apiObject *api.ArangoDeploymentReplication) {
114114
dr.send(&deploymentReplicationEvent{
115-
Type: eventArangoDeploymentReplicationUpdated,
115+
Type: eventArangoDeploymentReplicationUpdated,
116116
DeploymentReplication: apiObject,
117117
})
118118
}

pkg/storage/pv_creator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func TestGetDeploymentInfo(t *testing.T) {
135135
ExpectedEnforceAntiAffinity bool
136136
}{
137137
{
138-
Input: v1.PersistentVolumeClaim{},
138+
Input: v1.PersistentVolumeClaim{},
139139
ExpectedDeploymentName: "",
140140
ExpectedRole: "",
141141
ExpectedEnforceAntiAffinity: false,

pkg/storage/pvc_informer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ func (ls *LocalStorage) listenForPvcEvents() {
5454
AddFunc: func(obj interface{}) {
5555
if pvc, ok := getPvc(obj); ok {
5656
ls.send(&localStorageEvent{
57-
Type: eventPVCAdded,
57+
Type: eventPVCAdded,
5858
PersistentVolumeClaim: pvc,
5959
})
6060
}
6161
},
6262
UpdateFunc: func(oldObj, newObj interface{}) {
6363
if pvc, ok := getPvc(newObj); ok {
6464
ls.send(&localStorageEvent{
65-
Type: eventPVCUpdated,
65+
Type: eventPVCUpdated,
6666
PersistentVolumeClaim: pvc,
6767
})
6868
}

pkg/util/k8sutil/pods.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const (
4949
rocksdbEncryptionVolumeName = "rocksdb-encryption"
5050
ArangodVolumeMountDir = "/data"
5151
RocksDBEncryptionVolumeMountDir = "/secrets/rocksdb/encryption"
52+
JWTSecretFileVolumeMountDir = "/secrets/jwt"
5253
TLSKeyfileVolumeMountDir = "/secrets/tls"
5354
LifecycleVolumeMountDir = "/lifecycle/tools"
5455
ClientAuthCAVolumeMountDir = "/secrets/client-auth/ca"
@@ -417,7 +418,7 @@ func CreateArangodPod(kubecli kubernetes.Interface, developmentMode bool, deploy
417418
engine string, requireUUID bool, terminationGracePeriod time.Duration,
418419
args []string, env map[string]EnvValue, finalizers []string,
419420
livenessProbe *HTTPProbeConfig, readinessProbe *HTTPProbeConfig, tolerations []v1.Toleration, serviceAccountName string,
420-
tlsKeyfileSecretName, rocksdbEncryptionSecretName string, nodeSelector map[string]string) error {
421+
tlsKeyfileSecretName, rocksdbEncryptionSecretName string, clusterJWTSecretName string, nodeSelector map[string]string) error {
421422
// Prepare basic pod
422423
p := newPod(deployment.GetName(), deployment.GetNamespace(), role, id, podName, finalizers, tolerations, serviceAccountName, nodeSelector)
423424
terminationGracePeriodSeconds := int64(math.Ceil(terminationGracePeriod.Seconds()))
@@ -447,6 +448,9 @@ func CreateArangodPod(kubecli kubernetes.Interface, developmentMode bool, deploy
447448
if rocksdbEncryptionSecretName != "" {
448449
c.VolumeMounts = append(c.VolumeMounts, rocksdbEncryptionVolumeMounts()...)
449450
}
451+
if clusterJWTSecretName != "" {
452+
c.VolumeMounts = append(c.VolumeMounts, clusterJWTVolumeMounts()...)
453+
}
450454
p.Spec.Containers = append(p.Spec.Containers, c)
451455

452456
// Add UUID init container
@@ -503,6 +507,19 @@ func CreateArangodPod(kubecli kubernetes.Interface, developmentMode bool, deploy
503507
p.Spec.Volumes = append(p.Spec.Volumes, vol)
504508
}
505509

510+
// Cluster JWT secret mount (if any)
511+
if clusterJWTSecretName != "" {
512+
vol := v1.Volume{
513+
Name: clusterJWTSecretVolumeName,
514+
VolumeSource: v1.VolumeSource{
515+
Secret: &v1.SecretVolumeSource{
516+
SecretName: clusterJWTSecretName,
517+
},
518+
},
519+
}
520+
p.Spec.Volumes = append(p.Spec.Volumes, vol)
521+
}
522+
506523
// Lifecycle volumes (if any)
507524
p.Spec.Volumes = append(p.Spec.Volumes, lifecycleVolumes...)
508525

0 commit comments

Comments
 (0)