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

Beefing up SecretScope #101

Merged
merged 44 commits into from
Dec 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
b8b0aab
Record error in object when failed to submit config.
JasonTheDeveloper Oct 29, 2019
61e7310
Check if `acls` is set in config before trying to apply ACL.
JasonTheDeveloper Oct 29, 2019
eaf6498
Check for ACL, scope and secrets before applying.
JasonTheDeveloper Oct 30, 2019
0e2caa8
Refactoring.
JasonTheDeveloper Oct 30, 2019
832e217
Updated secret scope tests.
JasonTheDeveloper Nov 1, 2019
f8aa3d3
Renamed `v1` -> `corev1`.
JasonTheDeveloper Nov 14, 2019
ada034f
Rename `checkCluster` -> `verifyWorkspace`.
JasonTheDeveloper Nov 14, 2019
b610c38
Merge branch 'master' into fix/acl-99
JasonTheDeveloper Nov 24, 2019
c6b0fe0
List secret scope rather than trying to create to see if exists.
JasonTheDeveloper Nov 24, 2019
69b5f5a
Fixed unit tests.
JasonTheDeveloper Nov 25, 2019
8104810
Beefed up tests.
JasonTheDeveloper Nov 25, 2019
c2aaeb1
Print status.
JasonTheDeveloper Nov 25, 2019
5fe40aa
Print IsSubmitted.
JasonTheDeveloper Nov 25, 2019
40fb03d
Print fetch.
JasonTheDeveloper Nov 25, 2019
7c3e2bf
Disabling tests.
JasonTheDeveloper Nov 25, 2019
080e773
Removed delete.
JasonTheDeveloper Nov 25, 2019
f7da132
Renaming ACL Secret Scope.
JasonTheDeveloper Nov 25, 2019
954357f
Adding back in ACLs.
JasonTheDeveloper Nov 25, 2019
4bc6183
ACL name changed.
JasonTheDeveloper Nov 25, 2019
509d813
Disabled ACLs.
JasonTheDeveloper Nov 25, 2019
efe6a86
Debug why my tests aren't working.
JasonTheDeveloper Nov 25, 2019
2bffea5
Removed ACL checks.
JasonTheDeveloper Nov 25, 2019
2d1d846
Prevent SecretScope submit fail from being added to reconcile loop.
JasonTheDeveloper Nov 25, 2019
aa30e8d
Enabling old tests.
JasonTheDeveloper Nov 26, 2019
ee3aaff
Merge branch 'master' into fix/acl-99
JasonTheDeveloper Nov 26, 2019
47777d4
Fixed linting.
JasonTheDeveloper Nov 26, 2019
61e239a
Cleaning up.
JasonTheDeveloper Nov 26, 2019
07d8ac1
Randomise SecretScope name.
JasonTheDeveloper Nov 26, 2019
407e9fc
Removed defer.
JasonTheDeveloper Nov 26, 2019
25be384
Randomise names.
JasonTheDeveloper Nov 26, 2019
525d835
Fixed test.
JasonTheDeveloper Nov 26, 2019
67469e8
Adding back in Databricks.
JasonTheDeveloper Nov 26, 2019
5cd0976
Go fmt.
JasonTheDeveloper Nov 26, 2019
f81c590
Putting back in ACL check.
JasonTheDeveloper Nov 26, 2019
a705c60
Delete secret scope.
JasonTheDeveloper Nov 26, 2019
c0a5ccf
Updated secret scope type.
JasonTheDeveloper Nov 27, 2019
85e7b9b
Added status updates to config to prevent wasted cycles.
JasonTheDeveloper Nov 27, 2019
c13986b
Merge branch 'master' into fix/acl-99
JasonTheDeveloper Nov 27, 2019
42ddde4
Removed duplicate imports.
JasonTheDeveloper Nov 27, 2019
c64b696
Removed randomly generate string from test.
JasonTheDeveloper Nov 28, 2019
44eda83
Merge branch 'master' into fix/acl-99
JasonTheDeveloper Dec 2, 2019
ec20116
Updated SecretScope type.
JasonTheDeveloper Dec 2, 2019
27b9b44
Removed `verifyworkspace`
JasonTheDeveloper Dec 2, 2019
2a87955
gofmt.
JasonTheDeveloper Dec 2, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/v1alpha1/dbfsblock_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ var _ = Describe("DbfsBlock", func() {
It("should create an object successfully", func() {

key = types.NamespacedName{
Name: "foo"+ RandomString(5),
Name: "foo" + RandomString(5),
Namespace: "default",
}
created = &DbfsBlock{
Expand Down
8 changes: 7 additions & 1 deletion api/v1alpha1/secretscope_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ type SecretScopeSpec struct {
type SecretScopeStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
SecretScope *dbmodels.SecretScope `json:"secretscope,omitempty"`
SecretScope *dbmodels.SecretScope `json:"secretscope,omitempty"`
SecretInClusterAvailable bool `json:"secretinclusteravailable,omitempty"`
}

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

// IsSecretAvailable returns true if secret in cluster is available
func (ss *SecretScope) IsSecretAvailable() bool {
return ss.Status.SecretInClusterAvailable
}

// IsSubmitted returns true if the item has been submitted to DataBricks
func (ss *SecretScope) IsSubmitted() bool {
return ss.Status.SecretScope != nil
Expand Down
2 changes: 2 additions & 0 deletions config/crd/bases/databricks.microsoft.com_secretscopes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ spec:
status:
description: SecretScopeStatus defines the observed state of SecretScope
properties:
secretinclusteravailable:
type: boolean
secretscope:
description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
of cluster Important: Run "make" to regenerate code after modifying
Expand Down
24 changes: 19 additions & 5 deletions controllers/secretscope_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ type SecretScopeReconciler struct {

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

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

if !instance.IsSecretAvailable() {
if err = r.checkSecrets(instance); err != nil {
r.Recorder.Event(instance, corev1.EventTypeWarning, "Failed", err.Error())
return ctrl.Result{RequeueAfter: 30 * time.Second}, fmt.Errorf("error when submitting secret scope to the API: %v", err)
}
r.Recorder.Event(instance, corev1.EventTypeNormal, "Passed", "Secrets are available")
return ctrl.Result{}, nil
}

if !instance.IsSubmitted() {
err = r.submit(instance)
var requeue bool
requeue, err = r.submit(instance)
if err != nil {
r.Recorder.Event(instance, corev1.EventTypeWarning, "Submitting object", fmt.Sprintf("Failed to submit object: %s", err))
return ctrl.Result{}, fmt.Errorf("error when submitting secret scope to the API: %v", err)
r.Recorder.Event(instance, corev1.EventTypeWarning, "Failed", fmt.Sprintf("Failed to submit object: %s", err))
if requeue {
return ctrl.Result{RequeueAfter: 30 * time.Second}, fmt.Errorf("error when submitting secret scope to the API: %v", err)
}
return ctrl.Result{}, nil
}
r.Recorder.Event(instance, corev1.EventTypeNormal, "Submitted", "Object is submitted")
return ctrl.Result{}, nil
}

return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
r.Recorder.Event(instance, corev1.EventTypeNormal, "Completed", "Object has completed")
return ctrl.Result{}, nil
}

// SetupWithManager adds the controller manager
Expand Down
41 changes: 32 additions & 9 deletions controllers/secretscope_controller_databricks.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ func (r *SecretScopeReconciler) get(scope string) (*dbmodels.SecretScope, error)
if (dbmodels.SecretScope{}) == matchingScope {
return nil, fmt.Errorf("get for secret scope failed. scope not found: %s", scope)
}

return &matchingScope, nil
}

Expand Down Expand Up @@ -109,6 +110,7 @@ func (r *SecretScopeReconciler) getSecretValueFrom(namespace string, scopeSecret
value := string(secret.Data[scopeSecret.ValueFrom.SecretKeyRef.Key])
return value, nil
}

return "", fmt.Errorf("No ValueFrom present to extract secret")
}

Expand Down Expand Up @@ -150,32 +152,53 @@ func (r *SecretScopeReconciler) submitACLs(instance *databricksv1alpha1.SecretSc
return nil
}

func (r *SecretScopeReconciler) submit(instance *databricksv1alpha1.SecretScope) error {
// checkSecrets checks if referenced secret is present in k8s or not.
func (r *SecretScopeReconciler) checkSecrets(instance *databricksv1alpha1.SecretScope) error {
namespace := instance.Namespace

// if secret in cluster is reference, see if secret exists.
for _, secret := range instance.Spec.SecretScopeSecrets {
if secret.ValueFrom != nil {
if _, err := r.getSecretValueFrom(namespace, secret); err != nil {
return err
}
}
}

instance.Status.SecretInClusterAvailable = true
return r.Update(context.Background(), instance)
}

func (r *SecretScopeReconciler) submit(instance *databricksv1alpha1.SecretScope) (requeue bool, err error) {
scope := instance.ObjectMeta.Name
initialManagePrincipal := instance.Spec.InitialManagePrincipal

err := r.APIClient.Secrets().CreateSecretScope(scope, initialManagePrincipal)
err = r.APIClient.Secrets().CreateSecretScope(scope, initialManagePrincipal)
if err != nil {
return err
return
}

err = r.submitSecrets(instance)
if err != nil {
return err
requeue = true
return
}

err = r.submitACLs(instance)
if err != nil {
return err
if instance.Spec.SecretScopeACLs != nil {
err = r.submitACLs(instance)
if err != nil {
return
}
}

remoteScope, err := r.get(scope)
if err != nil {
return err
requeue = true
return
}

instance.Status.SecretScope = remoteScope
return r.Update(context.Background(), instance)
return true, r.Update(context.Background(), instance)
}

func (r *SecretScopeReconciler) delete(instance *databricksv1alpha1.SecretScope) error {
Expand Down
Loading