Skip to content
This repository was archived by the owner on Jan 28, 2022. It is now read-only.

Commit ef5fe9c

Browse files
Merge pull request #101 from JasonTheDeveloper/fix/acl-99
Beefing up SecretScope
2 parents 8a81450 + 2a87955 commit ef5fe9c

File tree

6 files changed

+270
-18
lines changed

6 files changed

+270
-18
lines changed

api/v1alpha1/dbfsblock_types_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ var _ = Describe("DbfsBlock", func() {
5454
It("should create an object successfully", func() {
5555

5656
key = types.NamespacedName{
57-
Name: "foo"+ RandomString(5),
57+
Name: "foo" + RandomString(5),
5858
Namespace: "default",
5959
}
6060
created = &DbfsBlock{

api/v1alpha1/secretscope_types.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ type SecretScopeSpec struct {
3737
type SecretScopeStatus struct {
3838
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
3939
// Important: Run "make" to regenerate code after modifying this file
40-
SecretScope *dbmodels.SecretScope `json:"secretscope,omitempty"`
40+
SecretScope *dbmodels.SecretScope `json:"secretscope,omitempty"`
41+
SecretInClusterAvailable bool `json:"secretinclusteravailable,omitempty"`
4142
}
4243

4344
// +kubebuilder:object:root=true
@@ -51,6 +52,11 @@ type SecretScope struct {
5152
Status SecretScopeStatus `json:"status,omitempty"`
5253
}
5354

55+
// IsSecretAvailable returns true if secret in cluster is available
56+
func (ss *SecretScope) IsSecretAvailable() bool {
57+
return ss.Status.SecretInClusterAvailable
58+
}
59+
5460
// IsSubmitted returns true if the item has been submitted to DataBricks
5561
func (ss *SecretScope) IsSubmitted() bool {
5662
return ss.Status.SecretScope != nil

config/crd/bases/databricks.microsoft.com_secretscopes.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ spec:
7272
status:
7373
description: SecretScopeStatus defines the observed state of SecretScope
7474
properties:
75+
secretinclusteravailable:
76+
type: boolean
7577
secretscope:
7678
description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
7779
of cluster Important: Run "make" to regenerate code after modifying

controllers/secretscope_controller.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ type SecretScopeReconciler struct {
4747

4848
// Reconcile implements the reconciliation loop for the operator
4949
func (r *SecretScopeReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
50-
_ = context.Background()
5150
_ = r.Log.WithValues("secretscope", req.NamespacedName)
5251

5352
// your logic here
@@ -84,16 +83,31 @@ func (r *SecretScopeReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error)
8483
return ctrl.Result{}, nil
8584
}
8685

86+
if !instance.IsSecretAvailable() {
87+
if err = r.checkSecrets(instance); err != nil {
88+
r.Recorder.Event(instance, corev1.EventTypeWarning, "Failed", err.Error())
89+
return ctrl.Result{RequeueAfter: 30 * time.Second}, fmt.Errorf("error when submitting secret scope to the API: %v", err)
90+
}
91+
r.Recorder.Event(instance, corev1.EventTypeNormal, "Passed", "Secrets are available")
92+
return ctrl.Result{}, nil
93+
}
94+
8795
if !instance.IsSubmitted() {
88-
err = r.submit(instance)
96+
var requeue bool
97+
requeue, err = r.submit(instance)
8998
if err != nil {
90-
r.Recorder.Event(instance, corev1.EventTypeWarning, "Submitting object", fmt.Sprintf("Failed to submit object: %s", err))
91-
return ctrl.Result{}, fmt.Errorf("error when submitting secret scope to the API: %v", err)
99+
r.Recorder.Event(instance, corev1.EventTypeWarning, "Failed", fmt.Sprintf("Failed to submit object: %s", err))
100+
if requeue {
101+
return ctrl.Result{RequeueAfter: 30 * time.Second}, fmt.Errorf("error when submitting secret scope to the API: %v", err)
102+
}
103+
return ctrl.Result{}, nil
92104
}
93105
r.Recorder.Event(instance, corev1.EventTypeNormal, "Submitted", "Object is submitted")
106+
return ctrl.Result{}, nil
94107
}
95108

96-
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
109+
r.Recorder.Event(instance, corev1.EventTypeNormal, "Completed", "Object has completed")
110+
return ctrl.Result{}, nil
97111
}
98112

99113
// SetupWithManager adds the controller manager

controllers/secretscope_controller_databricks.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func (r *SecretScopeReconciler) get(scope string) (*dbmodels.SecretScope, error)
4444
if (dbmodels.SecretScope{}) == matchingScope {
4545
return nil, fmt.Errorf("get for secret scope failed. scope not found: %s", scope)
4646
}
47+
4748
return &matchingScope, nil
4849
}
4950

@@ -109,6 +110,7 @@ func (r *SecretScopeReconciler) getSecretValueFrom(namespace string, scopeSecret
109110
value := string(secret.Data[scopeSecret.ValueFrom.SecretKeyRef.Key])
110111
return value, nil
111112
}
113+
112114
return "", fmt.Errorf("No ValueFrom present to extract secret")
113115
}
114116

@@ -150,32 +152,53 @@ func (r *SecretScopeReconciler) submitACLs(instance *databricksv1alpha1.SecretSc
150152
return nil
151153
}
152154

153-
func (r *SecretScopeReconciler) submit(instance *databricksv1alpha1.SecretScope) error {
155+
// checkSecrets checks if referenced secret is present in k8s or not.
156+
func (r *SecretScopeReconciler) checkSecrets(instance *databricksv1alpha1.SecretScope) error {
157+
namespace := instance.Namespace
158+
159+
// if secret in cluster is reference, see if secret exists.
160+
for _, secret := range instance.Spec.SecretScopeSecrets {
161+
if secret.ValueFrom != nil {
162+
if _, err := r.getSecretValueFrom(namespace, secret); err != nil {
163+
return err
164+
}
165+
}
166+
}
167+
168+
instance.Status.SecretInClusterAvailable = true
169+
return r.Update(context.Background(), instance)
170+
}
171+
172+
func (r *SecretScopeReconciler) submit(instance *databricksv1alpha1.SecretScope) (requeue bool, err error) {
154173
scope := instance.ObjectMeta.Name
155174
initialManagePrincipal := instance.Spec.InitialManagePrincipal
156175

157-
err := r.APIClient.Secrets().CreateSecretScope(scope, initialManagePrincipal)
176+
err = r.APIClient.Secrets().CreateSecretScope(scope, initialManagePrincipal)
158177
if err != nil {
159-
return err
178+
return
160179
}
161180

162181
err = r.submitSecrets(instance)
163182
if err != nil {
164-
return err
183+
requeue = true
184+
return
165185
}
166186

167-
err = r.submitACLs(instance)
168-
if err != nil {
169-
return err
187+
if instance.Spec.SecretScopeACLs != nil {
188+
err = r.submitACLs(instance)
189+
if err != nil {
190+
return
191+
}
170192
}
171193

172194
remoteScope, err := r.get(scope)
173195
if err != nil {
174-
return err
196+
requeue = true
197+
return
175198
}
176199

177200
instance.Status.SecretScope = remoteScope
178-
return r.Update(context.Background(), instance)
201+
return true, r.Update(context.Background(), instance)
179202
}
180203

181204
func (r *SecretScopeReconciler) delete(instance *databricksv1alpha1.SecretScope) error {

0 commit comments

Comments
 (0)